Initial xentral_oss_20.3.c9ffacf

This commit is contained in:
Alex
2021-05-21 08:49:41 +02:00
parent 5406e4a551
commit 34e5ac43d9
18884 changed files with 2109867 additions and 0 deletions
@@ -0,0 +1,70 @@
<?php
namespace Xentral\Modules\Report;
use Xentral\Components\Database\Database;
use Xentral\Components\Util\StringUtil;
use Xentral\Modules\Report\Data\ReportData;
abstract class AbstractReportExportService
{
/** @var string $fileExtension */
protected $fileExtension = '';
/** @var Database $db */
protected $db;
/** @var ReportService $service */
protected $service;
/** @var ReportGateway $gateway */
protected $gateway;
/** @var string */
protected $tempDir;
/**
* @param Database $db
* @param ReportGateway $gateway
* @param ReportService $service
* @param string $tempDir
*/
public function __construct(Database $db, ReportGateway $gateway, ReportService $service, $tempDir)
{
$this->db = $db;
$this->gateway = $gateway;
$this->service = $service;
$this->tempDir = $tempDir;
}
/**
* @param ReportData $report
* @param string $filename
*
* @return string
*/
public function generateFileName(ReportData $report, $filename = '')
{
if($filename === ''){
$filename = sprintf('Report_{BERICHTNAME}_{TIMESTAMP}.%s', $this->fileExtension);
}
$variables = ['{TIMESTAMP}', '{DATUM}', '{BERICHTNAME}'];
$values = [time(), date('Y-m-d_H-i-s'), $report->getName()];
$filename = str_replace($variables, $values, $filename);
if (substr(strtolower($filename), -strlen($this->fileExtension)) !== strtolower($this->fileExtension)) {
$filename = "{$filename}.{$this->fileExtension}";
}
return StringUtil::toFilename($filename);
}
/**
* @param string $fileName
*
* @return string
*/
public function genereateFilePath($fileName)
{
return sprintf('%s%s', $this->tempDir, $fileName);
}
}
+177
View File
@@ -0,0 +1,177 @@
<?php
namespace Xentral\Modules\Report;
use ApplicationCore;
use Xentral\Core\DependencyInjection\ContainerInterface;
use Xentral\Modules\Report\Service\ReportColumnFormatter;
final class Bootstrap
{
/**
* @return array
*/
public static function registerServices()
{
return [
'ReportGateway' => 'onInitReportGateway',
'ReportService' => 'onInitReportService',
'ReportCsvExportService' => 'onInitReportCsvExportService',
'ReportPdfExportService' => 'onInitReportPdfExportService',
'ReportJsonExportService' => 'onInitReportJsonExportService',
'ReportJsonImportService' => 'onInitReportJsonImportService',
'ReportLegacyConverterService' => 'onInitReportLegacyConverterService',
'ReportResolveParameterService' => 'onInitReportResolveParameterService',
'ReportChartService' => 'onInitReportChartService',
'ReportColumnFormatter' => 'onInitReportColumnFormatter',
];
}
/**
* @param ContainerInterface $container
*
* @return ReportGateway
*/
public static function onInitReportGateway(ContainerInterface $container)
{
return new ReportGateway($container->get('Database'));
}
/**
* @param ContainerInterface $container
*
* @return ReportService
*/
public static function onInitReportService(ContainerInterface $container)
{
return new ReportService(
$container->get('Database'),
$container->get('ReportGateway'),
$container->get('ReportResolveParameterService')
);
}
/**
* @param ContainerInterface $container
*
* @return ReportCsvExportService
*/
public static function onInitReportCsvExportService(ContainerInterface $container)
{
/** @var ApplicationCore $app */
$app = $container->get('LegacyApplication');
return new ReportCsvExportService(
$container->get('Database'),
$container->get('ReportGateway'),
$container->get('ReportService'),
$app->erp->GetTMP()
);
}
/**
* @param ContainerInterface $container
*
* @return ReportPdfExportService
*/
public static function onInitReportPdfExportService(ContainerInterface $container)
{
/** @var ApplicationCore $app */
$app = $container->get('LegacyApplication');
return new ReportPdfExportService(
$container->get('Database'),
$container->get('ReportGateway'),
$container->get('ReportService'),
$app->erp->GetTMP()
);
}
/**
* @param ContainerInterface $container
*
* @return ReportJsonExportService
*/
public static function onInitReportJsonExportService(ContainerInterface $container)
{
/** @var ApplicationCore $app */
$app = $container->get('LegacyApplication');
return new ReportJsonExportService(
$container->get('Database'),
$container->get('ReportGateway'),
$container->get('ReportService'),
$app->erp->GetTMP()
);
}
/**
* @param ContainerInterface $container
*
* @return ReportJsonImportService
*/
public static function onInitReportJsonImportService(ContainerInterface $container)
{
return new ReportJsonImportService(
$container->get('ReportGateway'),
$container->get('ReportService')
);
}
/**
* @param ContainerInterface $container
*
* @return ReportLegacyConverterService
*/
public static function onInitReportLegacyConverterService(ContainerInterface $container)
{
return new ReportLegacyConverterService(
$container->get('Database'),
$container->get('ReportService')
);
}
/**
* @param ContainerInterface $container
*
* @return ReportResolveParameterService
*/
public static function onInitReportResolveParameterService(ContainerInterface $container)
{
/** @var ApplicationCore $app */
$app = $container->get('LegacyApplication');
$userId = (int)$app->User->GetID();
$userProjects = $app->User->getUserProjects();
$userAdmin = $app->User->GetType() === 'admin';
return new ReportResolveParameterService(
$userId,
$userProjects,
$userAdmin
);
}
/**
* @param ContainerInterface $container
*
* @return ReportChartService
*/
public function onInitReportChartService(ContainerInterface $container)
{
return new ReportChartService(
$container->get('Database'),
$container->get('ReportService'),
$container->get('ReportGateway')
);
}
/**
* @param ContainerInterface $container
*
* @return ReportColumnFormatter
*/
public function onInitReportColumnFormatter(ContainerInterface $container): ReportColumnFormatter
{
return new ReportColumnFormatter();
}
}
@@ -0,0 +1,302 @@
<?php
namespace Xentral\Modules\Report\Data;
use JsonSerializable;
class ReportColumn implements JsonSerializable
{
/** @var string ALIGN_LEFT */
public const ALIGN_LEFT = 'left';
/** @var string ALIGN_RIGHT */
public const ALIGN_RIGHT = 'right';
/** @var string ALIGN_CENTER */
public const ALIGN_CENTER = 'center';
/** @var string ALIGN_JUSTIFY */
public const ALIGN_JUSTIFY = 'justify';
/** @var string SORT_NUMERIC */
public const SORT_NUMERIC = 'numeric';
/** @var string SORT_ALPHABETIC */
public const SORT_ALPHABETIC = 'alphabetic';
/** @var string FORMAT_SUM_MONEY_DE */
public const FORMAT_SUM_MONEY_DE = 'sum_money_de';
/** @var string FORMAT_SUM_MONEY_EN */
public const FORMAT_SUM_MONEY_EN = 'sum_money_en';
/** @var string FORMAT_DATE_DMY */
public const FORMAT_DATE_DMY = 'date_dmy';
/** @var string FORMAT_DATE_YMD */
public const FORMAT_DATE_YMD = 'date_ymd';
/** @var string FORMAT_DATE_DMYHIS */
public const FORMAT_DATE_DMYHIS = 'date_dmyhis';
/** @var string FORMAT_DATE_YMDHIS */
public const FORMAT_DATE_YMDHIS = 'date_ymdhis';
/** @var string FORMAT_CUSTOM */
public const FORMAT_CUSTOM = 'custom';
/** @var string $key */
private $key;
/** @var string $title */
private $title;
/** @var string size */
private $width;
/** @var string $alignment */
private $alignment;
/** @var bool $isSumColumn */
private $isSumColumn;
/** @var int $id */
private $id;
/** @var int $sequence */
private $sequence;
/** @var string $sorting */
private $sorting;
/** @var string|null $formatType */
private $formatType;
/** @var string|null $formatStatement */
private $formatStatement;
/**
* @param string $key
* @param string $title
* @param string $width
* @param string $alignment
* @param bool $isSumColumn
* @param int $id
* @param int $sequence
* @param string $sorting
* @param string|null $formatType
* @param null $formatStatement
*/
public function __construct(
$key,
$title,
$width = '30',
$alignment = self::ALIGN_LEFT,
$isSumColumn = false,
$id = 0,
$sequence = 0,
$sorting = 'numeric',
$formatType = null,
$formatStatement = null
) {
$this->key = $key;
$this->title = $title;
$this->width = $width;
$this->alignment = $alignment;
$this->isSumColumn = $isSumColumn;
$this->id = $id;
$this->sequence = $sequence;
$this->sorting = $sorting;
$this->formatType = $formatType;
$this->formatStatement = $formatStatement;
}
/**
* @param $data
*
* @return ReportColumn|null
*/
public static function fromDbState($data)
{
if (!isset($data['key_name'])) {
return null;
}
if (!isset($data['title'])) {
return null;
}
$key = (string)$data['key_name'];
$title = (string)$data['title'];
$width = '';
if (isset($data['width'])) {
$width = $data['width'];
}
$alignment = '';
if (isset($data['alignment'])) {
$alignment = $data['alignment'];
}
$sorting = 'numeric';
if (isset($data['sorting'])) {
$sorting = $data['sorting'];
}
$sequence = 0;
if (isset($data['sequence'])) {
$sequence = $data['sequence'];
}
$format = null;
if (array_key_exists('format_type', $data)) {
$format = $data['format_type'];
}
$formatStatement = null;
if (array_key_exists('format_statement', $data)) {
$formatStatement = $data['format_statement'];
}
$sum = false;
if (isset($data['sum']) && $data['sum'] === 1) {
$sum = true;
}
$id = 0;
if (isset($data['id'])) {
$id = $data['id'];
}
return new self(
$key,
$title,
$width,
$alignment,
$sum,
$id,
$sequence,
$sorting,
$format,
$formatStatement
);
}
/**
* @return array
*/
public function toArray(): array
{
return [
'key_name' => $this->getKey(),
'title' => $this->getTitle(),
'width' => $this->getWidth(),
'alignment' => $this->getAlignment(),
'sorting' => $this->getSorting(),
'sum' => $this->isSumColumn(),
'id' => $this->getId(),
'sequence' => $this->getSequence(),
'format_type' => $this->getFormatType(),
'format_statement' => $this->getFormatStatement(),
];
}
/**
* Specify data which should be serialized to JSON
*
* @return mixed data which can be serialized by <b>json_encode</b>,
*/
public function jsonSerialize()
{
$data = $this->toArray();
unset($data['id'], $data['sequence']);
return $data;
}
/**
* @return string
*/
public function getKey()
{
return $this->key;
}
/**
* @return string
*/
public function getTitle()
{
return $this->title;
}
/**
* @return string
*/
public function getWidth()
{
return $this->width;
}
/**
* @return string
*/
public function getAlignment()
{
return $this->alignment;
}
/**
* @return bool
*/
public function isSumColumn()
{
return $this->isSumColumn;
}
/**
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* @return int
*/
public function getSequence()
{
return $this->sequence;
}
/**
* @return string
*/
public function getSorting()
{
return $this->sorting;
}
/**
* Changes sequence number and returns old sequence number.
*
* @param int $sequence
*
* @return int previous sequence number
*/
public function changeSequence($sequence)
{
$oldSequence = $this->getSequence();
$this->sequence = $sequence;
return $oldSequence;
}
/**
* @return string|null
*/
public function getFormatType(): ?string
{
return $this->formatType;
}
/**
* @return string|null
*/
public function getFormatStatement(): ?string
{
return $this->formatStatement;
}
}
@@ -0,0 +1,123 @@
<?php
namespace Xentral\Modules\Report\Data;
use ArrayIterator;
use Iterator;
use JsonSerializable;
use Xentral\Modules\Report\Exception\FormDataException;
class ReportColumnCollection implements JsonSerializable, Iterator
{
/** @var ArrayIterator $columnIterator */
private $columnIterator;
/**
* @param ReportColumn[] $columns
*/
public function __construct($columns = [])
{
$this->columnIterator = new ArrayIterator($columns);
}
/**
* @param array $formData
*
* @return ReportColumnCollection
*/
public static function fromFormData($formData)
{
$columns = [];
foreach ($formData as $item) {
if (!is_array($item)) {
throw new FormDataException('Columns form is wrong format. Array of arrays expected.');
}
$col = new ReportColumn(
$item['key_name'],
$item['title'],
$item['width'],
$item['alignment'],
(int)$item['sum'] === 1,
(int)$item['id'],
(int)$item['sequence'],
$item['sorting']
);
$columns[] = $col;
}
return new self($columns);
}
/**
* Specify data which should be serialized to JSON
*
* @return array
*/
public function jsonSerialize()
{
return $this->columnIterator->getArrayCopy();
}
/**
* @return array
*/
public function toArray()
{
$array = [];
foreach ($this->columnIterator as $column) {
$array[] = $column->toArray();
}
return $array;
}
/**
* Return the current element
*
* @return ReportColumn
*/
public function current()
{
return $this->columnIterator->current();
}
/**
* Move forward to next element
*
* @return void
*/
public function next()
{
$this->columnIterator->next();
}
/**
* Return the key of the current element
*
* @return int|null
*/
public function key()
{
return $this->columnIterator->key();
}
/**
* Checks if current position is valid
*
* @return bool
*/
public function valid()
{
return $this->columnIterator->valid();
}
/**
* Rewind the Iterator to the first element
*
* @return void
*/
public function rewind()
{
$this->columnIterator->rewind();
}
}
+353
View File
@@ -0,0 +1,353 @@
<?php
namespace Xentral\Modules\Report\Data;
use JsonSerializable;
use Xentral\Modules\Report\Exception\FormDataException;
class ReportData implements JsonSerializable
{
/**@var string $name */
private $name;
/** @var string $description */
private $description;
/** @var int $projectId */
private $projectId;
/**@var string $sqlQuery */
private $sqlQuery;
/**@var ReportColumnCollection|null $columns */
private $columns;
/** @var ReportParameterCollection|null $parameters */
private $parameters;
/** @var int $id */
private $id;
/** @var string $remark */
private $remark;
/** @var string $category */
private $category;
/** @var bool $readonly */
private $readonly;
/** @var bool $isFavorite */
private $isFavorite;
/** @var string $csvDelimiter */
private $csvDelimiter;
/** @var string $csvEnclosure */
private $csvEnclosure;
/**
* @param string $name
* @param string $description
* @param int $projectId
* @param string $sqlQuery
* @param ReportColumnCollection $columns
* @param ReportParameterCollection $parameters
* @param int $id
* @param string $remark
* @param string $category
* @param bool $readonly
* @param null $csvDelimiter
* @param null $csvEnclosure
*/
public function __construct(
$name,
$description = '',
$projectId = 0,
$sqlQuery = '',
$columns = null,
$parameters = null,
$id = 0,
$remark = '',
$category = '',
$readonly = false,
$csvDelimiter = ',',
$csvEnclosure = ''
) {
$this->name = $name;
$this->description = $description;
$this->projectId = $projectId;
$this->sqlQuery = $sqlQuery;
$this->columns = $columns;
$this->parameters = $parameters;
$this->id = $id;
$this->remark = $remark;
$this->category = $category;
$this->readonly = $readonly;
$this->csvDelimiter = $csvDelimiter;
$this->csvEnclosure = $csvEnclosure;
}
/**
* @param array $formData
*
* @return ReportData
*/
public static function fromFormData($formData)
{
if (!isset($formData['name'])) {
throw new FormDataException('name is required');
}
$name = $formData['name'];
$category = '';
if (isset($formData['category'])) {
$category = $formData['category'];
}
$description = '';
if (isset($formData['description'])) {
$description = $formData['description'];
}
$project = 0;
if (isset($formData['project'])) {
$project = (int)$formData['project'];
}
$query = '';
if (isset($formData['sql_query'])) {
$query = $formData['sql_query'];
}
$id = 0;
if (isset($formData['id'])) {
$id = $formData['id'];
}
$remarks = '';
if (isset($formData['remark'])) {
$remarks = $formData['remark'];
}
$readonly = false;
if (isset($formData['readonly']) && $formData['readonly'] === 1) {
$readonly = true;
}
$delimiter = ',';
if (isset($formData['csv_delimiter'])) {
$delimiter = $formData['csv_delimiter'];
}
$quote = '';
if (isset($formData['csv_enclosure'])) {
$quote = $formData['csv_enclosure'];
}
$instance = new self(
$name,
$description,
$project,
$query,
null,
null,
$id,
$remarks,
$category,
$readonly,
$delimiter,
$quote
);
if (isset($formData['is_favorite']) && $formData['is_favorite'] === 1) {
$instance->isFavorite = true;
}
return $instance;
}
/**
* @return array
*/
public function getFormData()
{
$data = [
'name' => $this->getName(),
'description' => $this->getDescription(),
'project' => $this->getProjectId(),
'sql_query' => $this->getSqlQuery(),
'id' => $this->getId(),
'remark' => $this->getRemark(),
'category' => $this->getCategory(),
'csv_delimiter' => $this->getCsvDelimiter(),
'csv_enclosure' => $this->getCsvEnclosure(),
];
if ($this->isFavorite === true) {
$data['is_favorite'] = 1;
}
return $data;
}
/**
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* @return string
*/
public function getDescription()
{
return $this->description;
}
/**
* @return int
*/
public function getProjectId()
{
return $this->projectId;
}
/**
* @return string
*/
public function getSqlQuery()
{
return $this->sqlQuery;
}
/**
* @return ReportColumnCollection|null
*/
public function getColumns()
{
return $this->columns;
}
/**
* @return ReportParameterCollection|null
*/
public function getParameters()
{
return $this->parameters;
}
/**
* @return string
*/
public function getRemark()
{
return $this->remark;
}
/**
* @return string
*/
public function getCategory()
{
return $this->category;
}
/**
* @param bool $readonly
*
* @return void
*/
public function setReadonly($readonly)
{
$this->readonly = $readonly;
}
/**
* @return bool
*/
public function isReadonly()
{
return $this->readonly;
}
/**
* @return bool
*/
public function isFavorite()
{
return $this->isFavorite;
}
/**
* @return string
*/
public function getCsvDelimiter()
{
return $this->csvDelimiter;
}
/**
* @return string
*/
public function getCsvEnclosure()
{
return $this->csvEnclosure;
}
/**
* @param bool $isFavorite
*/
public function setIsFavorite($isFavorite)
{
$this->isFavorite = $isFavorite;
}
/**
* @param ReportColumnCollection $columns
*
* @return ReportData
*/
public function setColumns($columns)
{
$this->columns = $columns;
return $this;
}
/**
* @param ReportParameterCollection $parameters
*
* @return ReportData
*/
public function setParameters($parameters)
{
$this->parameters = $parameters;
return $this;
}
/**
* Specify data which should be serialized to JSON
*
* @return mixed data which can be serialized by <b>json_encode</b>,
*/
public function jsonSerialize()
{
$data = [
'name' => $this->getName(),
'description' => $this->getDescription(),
'project' => $this->getProjectId(),
'sql_query' => $this->getSqlQuery(),
'columns' => $this->getColumns(),
'parameters' => $this->getParameters(),
'remark' => $this->getRemark(),
'category' => $this->getCategory(),
'csv_delimiter' => $this->getCsvDelimiter(),
'csv_enclosure' => $this->getCsvEnclosure(),
];
if ($this->isReadonly()) {
$data['readonly'] = true;
}
return $data;
}
}
@@ -0,0 +1,305 @@
<?php
namespace Xentral\Modules\Report\Data;
use JsonSerializable;
use Xentral\Modules\Report\Exception\OptionParseException;
use Xentral\Modules\Report\Exception\ParameterNameException;
class ReportParameter implements JsonSerializable
{
/** @var string $varname */
private $varname;
/** @var string $displayname */
private $displayname;
/** @var string $defaultValue */
private $defaultValue;
/** @var ReportParameterOptionValue[] $options */
private $options;
/** @var string $description */
private $description;
/** @var bool $editable */
private $editable;
/** @var int $id */
private $id;
/** @var mixed|null */
private $temporaryValue;
/** @var string $controlType */
private $controlType;
/**
* @param string $varname
* @param string $defaultValue
* @param string $displayname
* @param ReportParameterOptionValue[] $options
* @param string $description
* @param bool $editable
* @param int $id
* @param string $controlType
*/
public function __construct(
$varname,
$defaultValue,
$displayname = '',
$options = [],
$description = '',
$editable = true,
$id = 0,
$controlType = ''
) {
$this->setVarName($varname);
$this->displayname = $displayname;
$this->defaultValue = $defaultValue;
$this->options = $options;
$this->description = $description;
$this->editable = $editable;
$this->id = $id;
$this->controlType = $controlType;
}
/**
* @param array $data
*
* @return ReportParameter|null
*/
public static function fromDbState($data)
{
if (!isset($data['varname'])) {
return null;
}
if (!isset($data['default_value'])) {
return null;
}
$varname = (string)$data['varname'];
$default = (string)$data['default_value'];
$displayname = '';
if (isset($data['displayname'])) {
$displayname = $data['displayname'];
}
$options = [];
if (isset($data['options'])) {
if (is_string($data['options'])) {
$options = self::parseOptions($data['options']);
}
if (is_array($data['options'])) {
foreach ($data['options'] as $option) {
$key = array_keys($option)[0];
$options[] = new ReportParameterOptionValue($option[$key], $key);
}
}
}
$description = '';
if (isset($data['description'])) {
$description = $data['description'];
}
$editable = true;
if (isset($data['editable']) && ($data['editable'] === 0 || $data['editable'] === false)) {
$editable = false;
}
$id = 0;
if (isset($data['id'])) {
$id = $data['id'];
}
$controlType = '';
if (isset($data['control_type'])) {
$controlType = $data['control_type'];
}
return new self($varname, $default, $displayname, $options, $description, $editable, $id, $controlType);
}
/**
* @param string $optionsLine
*
* @return ReportParameterOptionValue[]
*/
public static function parseOptions($optionsLine)
{
if (empty($optionsLine)) {
return [];
}
$optionObjects = [];
$options = explode(',', $optionsLine);
foreach ($options as $option) {
$option = trim($option);
if (empty($option)) {
throw new OptionParseException('Invalid Options Format. Unable to parse.');
}
$value = explode(':', $option);
if (count($value) === 2) {
if (empty(trim($value[0])) || empty(trim($value[1]))) {
throw new OptionParseException('Invalid Options Format. Unable to parse.');
}
$optionObjects[] = new ReportParameterOptionValue(trim($value[1]), trim($value[0]));
} else {
$optionObjects[] = new ReportParameterOptionValue(trim($value[0]));
}
}
return $optionObjects;
}
/**
* @return array
*/
public function toArray()
{
return [
'varname' => $this->getVarname(),
'default_value' => $this->getDefaultValue(),
'displayname' => $this->getDisplayname(),
'options' => $this->getOptionsAsString(),
'description' => $this->getDescription(),
'editable' => $this->isEditable(),
'id' => $this->getId(),
'control_type' => $this->getControlType(),
];
}
/**
* Specify data which should be serialized to JSON
*
* @return mixed data which can be serialized by <b>json_encode</b>,
*/
public function jsonSerialize()
{
return [
'varname' => $this->varname,
'default_value' => $this->defaultValue,
'displayname' => $this->displayname,
'options' => $this->options,
'description' => $this->description,
'editable' => $this->editable,
'control_type' => $this->controlType,
];
}
/**
* @param mixed|null $value
*/
public function setTemporaryValue($value)
{
$this->temporaryValue = $value;
}
/**
* @return mixed
*/
public function getValue()
{
if ($this->temporaryValue !== null) {
return $this->temporaryValue;
}
return $this->getDefaultValue();
}
/**
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* @return string
*/
public function getVarname()
{
return $this->varname;
}
/**
* @return string
*/
public function getDisplayname()
{
return $this->displayname;
}
/**
* @return string
*/
public function getDefaultValue()
{
return $this->defaultValue;
}
/**
* @return ReportParameterOptionValue[]
*/
public function getOptions()
{
return $this->options;
}
/**
* @param ReportParameterOptionValue[] $options
*/
public function setOptions($options)
{
$this->options = $options;
}
/**
* @return string
*/
public function getOptionsAsString()
{
$optionstrings = [];
foreach ($this->options as $option) {
$optionstrings[] = (string)$option;
}
return implode(',', $optionstrings);
}
/**
* @return string
*/
public function getDescription()
{
return $this->description;
}
/**
* @return string
*/
public function getControlType()
{
return $this->controlType;
}
/**
* @return bool
*/
public function isEditable()
{
return $this->editable;
}
/**
* @param string $varname
*/
private function setVarName($varname)
{
if (!preg_match('/^[a-zA-Z]\w*$/', $varname)) {
throw new ParameterNameException(sprintf('Invalid parameter name "%s"', 'name'));
}
$this->varname = $varname;
}
}
@@ -0,0 +1,135 @@
<?php
namespace Xentral\Modules\Report\Data;
use ArrayIterator;
use Countable;
use Iterator;
use JsonSerializable;
use Xentral\Modules\Report\Exception\FormDataException;
class ReportParameterCollection implements JsonSerializable, Iterator, Countable
{
/** @var ArrayIterator $paramIterator */
private $paramIterator;
/**
* @param ReportParameter[] $parameters
*/
public function __construct($parameters = [])
{
$this->paramIterator = new ArrayIterator($parameters);
}
/**
* @param array $formData
*
* @return ReportParameterCollection
*/
public static function fromFormData($formData)
{
/** @var ReportParameter[] $parameters */
$parameters = [];
foreach ($formData as $item) {
if (!is_array($item)) {
throw new FormDataException('Parameter form is wrong format. Array of arrays expected.');
}
$param = new ReportParameter(
$item['varname'],
$item['default_value'],
$item['displayname'],
ReportParameter::parseOptions($item['options']),
$item['description'],
($item['editable'] === 1),
$item['id'],
$item['control_type']
);
$parameters[] = $param;
}
return new self($parameters);
}
/**
* @return array
*/
public function toArray()
{
$array = [];
foreach ($this->paramIterator as $param) {
$array[] = $param->toArray();
}
return $array;
}
/**
* Specify data which should be serialized to JSON
*
* @return mixed data which can be serialized by <b>json_encode</b>,
*/
public function jsonSerialize()
{
return $this->paramIterator->getArrayCopy();
}
/**
* Return the current element
*
* @return ReportParameter
*/
public function current()
{
return $this->paramIterator->current();
}
/**
* Move forward to next element
*
* @return void
*/
public function next()
{
$this->paramIterator->next();
}
/**
* Return the key of the current element
*
* @return mixed scalar on success, or null on failure.
*/
public function key()
{
return $this->paramIterator->key();
}
/**
* Checks if current position is valid
*
* @return bool
*/
public function valid()
{
return $this->paramIterator->valid();
}
/**
* Rewind the Iterator to the first element
*
* @return void Any returned value is ignored.
*/
public function rewind()
{
$this->paramIterator->rewind();
}
/**
* Count elements of an object
*
* The return value is cast to an integer.
*/
public function count()
{
return $this->paramIterator->count();
}
}
@@ -0,0 +1,62 @@
<?php
namespace Xentral\Modules\Report\Data;
use JsonSerializable;
class ReportParameterOptionValue implements JsonSerializable
{
/** @var string $value */
private $value;
/** @var string $description */
private $description;
/**
* @param string $value
* @param string $description
*/
public function __construct($value, $description = null)
{
$this->value = $value;
if (empty($description)) {
$this->description = $this->value;
} else {
$this->description = $description;
}
}
/**
* @return string
*/
public function getValue()
{
return $this->value;
}
/**
* @return string
*/
public function getDescription()
{
return $this->description;
}
/**
* @return string
*/
public function __toString()
{
return sprintf('%s:%s', $this->getDescription(), $this->getValue());
}
/**
* Specify data which should be serialized to JSON
*
* @return mixed data which can be serialized by <b>json_encode</b>,
*/
public function jsonSerialize()
{
return [$this->getDescription() => $this->getValue()];
}
}
@@ -0,0 +1,9 @@
<?php
namespace Xentral\Modules\Report\Exception;
use RuntimeException as SplRuntimeException;
class ColumnDefinitionException extends SplRuntimeException implements ReportExceptionInterface
{
}
@@ -0,0 +1,9 @@
<?php
namespace Xentral\Modules\Report\Exception;
use RuntimeException as SplRuntimeException;
class ColumnFormatException extends SplRuntimeException implements ReportExceptionInterface
{
}
@@ -0,0 +1,9 @@
<?php
namespace Xentral\Modules\Report\Exception;
use RuntimeException as SplRuntimeException;
class DatabaseTransactionException extends SplRuntimeException implements ReportExceptionInterface
{
}
@@ -0,0 +1,9 @@
<?php
namespace Xentral\Modules\Report\Exception;
use RuntimeException as SplRuntimeException;
class EmptyQueryException extends SplRuntimeException implements ReportExceptionInterface
{
}
@@ -0,0 +1,9 @@
<?php
namespace Xentral\Modules\Report\Exception;
use RuntimeException as SplRuntimeException;
class FileNotFoundException extends SplRuntimeException implements ReportExceptionInterface
{
}
@@ -0,0 +1,9 @@
<?php
namespace Xentral\Modules\Report\Exception;
use RuntimeException as SplRuntimeException;
class FormDataException extends SplRuntimeException implements ReportExceptionInterface
{
}
@@ -0,0 +1,9 @@
<?php
namespace Xentral\Modules\Report\Exception;
use InvalidArgumentException as SplInvalidArgumentException;
class InvalidArgumentException extends SplInvalidArgumentException implements ReportExceptionInterface
{
}
@@ -0,0 +1,9 @@
<?php
namespace Xentral\Modules\Report\Exception;
use RuntimeException as SplRuntimeException;
class JsonExportException extends SplRuntimeException implements ReportExceptionInterface
{
}
@@ -0,0 +1,9 @@
<?php
namespace Xentral\Modules\Report\Exception;
use RuntimeException as SplRuntimeException;
class JsonParseException extends SplRuntimeException implements ReportExceptionInterface
{
}
@@ -0,0 +1,9 @@
<?php
namespace Xentral\Modules\Report\Exception;
use RuntimeException as SplRuntimeException;
class OptionParseException extends SplRuntimeException implements ReportExceptionInterface
{
}
@@ -0,0 +1,9 @@
<?php
namespace Xentral\Modules\Report\Exception;
use RuntimeException as SplRuntimeException;
class ParameterNameException extends SplRuntimeException implements ReportExceptionInterface
{
}
@@ -0,0 +1,9 @@
<?php
namespace Xentral\Modules\Report\Exception;
use Xentral\Core\Exception\ModuleExceptionInterface;
interface ReportExceptionInterface extends ModuleExceptionInterface
{
}
@@ -0,0 +1,9 @@
<?php
namespace Xentral\Modules\Report\Exception;
use RuntimeException as SplRuntimeException;
class ReportNoDataException extends SplRuntimeException implements ReportExceptionInterface
{
}
@@ -0,0 +1,9 @@
<?php
namespace Xentral\Modules\Report\Exception;
use RuntimeException as SplRuntimeException;
class ReportReadonlyException extends SplRuntimeException implements ReportExceptionInterface
{
}
@@ -0,0 +1,9 @@
<?php
namespace Xentral\Modules\Report\Exception;
use RuntimeException as SplRuntimeException;
class ReportSqlQueryException extends SplRuntimeException implements ReportExceptionInterface
{
}
@@ -0,0 +1,9 @@
<?php
namespace Xentral\Modules\Report\Exception;
use RuntimeException as SplRuntimeException;
class ReportUserAccessException extends SplRuntimeException implements ReportExceptionInterface
{
}
@@ -0,0 +1,9 @@
<?php
namespace Xentral\Modules\Report\Exception;
use RuntimeException as SplRuntimeException;
class UnresolvedParameterException extends SplRuntimeException implements ReportExceptionInterface
{
}
@@ -0,0 +1,213 @@
<?php
namespace Xentral\Modules\Report;
use Xentral\Components\Database\Database;
use Xentral\Modules\Report\Data\ReportData;
use Xentral\Modules\Report\Exception\InvalidArgumentException;
use Xentral\Modules\Report\Exception\EmptyQueryException;
use Xentral\Widgets\Chart\Chart;
use Xentral\Widgets\Chart\Dataset;
use Xentral\Widgets\Chart\HtmlRenderer;
class ReportChartService
{
/** @var Database $db */
private $db;
/** @var ReportService $service */
protected $service;
/** @var ReportGateway $gateway */
protected $gateway;
/**
* @param Database $db
*/
public function __construct(Database $db, ReportService $service, ReportGateway $gateway)
{
$this->db = $db;
$this->service = $service;
$this->gateway = $gateway;
}
/**
* @param array $data
* @param string $groupColumn
* @param string $valueCol
*
* @return array[]
*/
private function groupDataByColumn($data, $groupColumn, $axesCol, $valueCol)
{
$groupedData = [];
$groupValues = [];
foreach($data as $row) {
if(!isset($row[$groupColumn])) {
continue;
}
if(isset($row[$axesCol]) && isset($row[$valueCol])) {
$groupedData[$row[$axesCol]][$row[$groupColumn]] = $row;
}
if(!in_array($row[$groupColumn], $groupValues)) {
$groupValues[] = $row[$groupColumn];
}
}
if(empty($groupValues) || empty($groupedData)) {
return [$data, $groupValues];
}
sort($groupValues);
$data = [];
foreach($groupedData as $axeValue => $groupedRows) {
$firstRow = reset($groupedRows);
unset($firstRow[$valueCol]);
unset($firstRow[$groupColumn]);
foreach($groupValues as $groupValue) {
if(isset($groupedRows[$groupValue])) {
$firstRow[$groupValue] = $groupedRows[$groupValue][$valueCol];
}
else {
$firstRow[$groupValue] = 0;
}
}
$data[] = $firstRow;
}
return [$data, $groupValues];
}
/**
* @param ReportData $report
*
* @return Chart
*/
private function getChartFromReport(ReportData $report, $parameterValues = [])
{
$struktur = $this->service->resolveParameters($report, $parameterValues);
if(!$this->service->isSqlStatementAllowed($struktur))
{
throw new InvalidArgumentException('Resolved Query not executable.');
}
$arr = $this->db->fetchAll($struktur);
if(empty($arr)) {
throw new EmptyQueryException('Result empty');
}
$share = $this->gateway->findShareArrayByReportId($report->getId());
if(empty($share)) {
throw new EmptyQueryException('Share Object empty');
}
$chartType = $share['chart_type'];
if(empty($chartType)) {
$chartType = 'line';
}
$yAxis = $share['chart_axislabel'];
$groupColumn = $share['chart_group_column'];
$firstColumn = $share['chart_x_column'];
$dataColumns = trim($share['data_columns'],';');
$dataColumnsArr = explode(';', $dataColumns);
$dataColumnsArr = array_map('trim', $dataColumnsArr);
$firstName = $yAxis;
$secondColumn = $dataColumns;
$groupValues = [];
$isLineOrBar = in_array($chartType, ['line','bar']);
if(!empty($groupColumn) && !empty($firstColumn) && !empty($dataColumns) && $isLineOrBar) {
list($arr, $groupValues) = $this->groupDataByColumn($arr, $groupColumn, $firstColumn, $dataColumns);
if(!empty($groupValues)) {
$secondColumn = reset($groupValues);
$firstName = $secondColumn;
}
}
elseif($isLineOrBar && count($dataColumnsArr) > 1) {
$groupValues = $dataColumnsArr;
}
foreach ($report->getColumns() as $column) {
if(empty($firstColumn)) {
$firstColumn = $column->getKey();
if(empty($firstName)) {
$firstName = $column->getTitle();
}
continue;
}
if($column->getKey() === $firstColumn) {
continue;
}
if(empty($secondColumn)) {
$secondColumn = $column->getKey();
break;
}
}
$data = array_column($arr, $secondColumn);
$data = array_map('floatVal', str_replace(',','.', $data));
$labels = array_column($arr, $firstColumn);
$dataset = new Dataset($firstName, $data);
$chart = new Chart($chartType, $labels, [$dataset]);
if(!empty($groupValues) && count($groupValues) > 1) {
foreach($groupValues as $groupValue) {
if($groupValue === $secondColumn) {
continue;
}
$chart->addDataset(
new Dataset(
$groupValue,
array_map(
'floatVal',
str_replace(',','.',
array_column(
$arr,
$groupValue
)
)
)
)
);
}
}
return $chart;
}
/**
* @param Chart $chart
* @param string $title
* @param int $width
* @param int $height
*
* @return HtmlRenderer
*/
private function getChartRenderer(Chart $chart, $title, $width = 400, $height = 150)
{
return new HtmlRenderer($chart, $title, $width, $height);
}
/**
* @param HtmlRenderer $render
*
* @return string
*/
private function getChartString(HtmlRenderer $render)
{
return $render->render();
}
/**
* @param ReportData $report
* @param int $width
* @param int $height
*
* @return string
*/
public function renderChartByReport(ReportData $report, $width = 400, $height = 150)
{
$chart = $this->getChartFromReport($report);
$renderer = $this->getChartRenderer($chart, $report->getName(), $width, $height);
return $this->getChartString($renderer);
}
}
@@ -0,0 +1,80 @@
<?php
declare(strict_types=1);
namespace Xentral\Modules\Report;
use Xentral\Components\Exporter\Csv\CsvConfig;
use Xentral\Components\Exporter\Csv\CsvExporter;
use Xentral\Components\Exporter\Csv\CsvWriter;
use Xentral\Modules\Report\Data\ReportData;
class ReportCsvExportService extends AbstractReportExportService
{
/** @var string $fileExtension */
protected $fileExtension = 'csv';
/**
* @param ReportData $report
* @param array $parameterValues
* @param string $filename
*
* @return string
*/
public function createCsvFileFromReport(ReportData $report, $parameterValues = [], $filename = '')
{
$filename = $this->generateFileName($report, $filename);
$defaultHeaders = [];
$headersKeyMap = [];
foreach ($report->getColumns() as $column) {
$defaultHeaders[] = $column->getTitle();
$headersKeyMap[$column->getKey()] = $column->getTitle();
}
$delimiter = $report->getCsvDelimiter();
if ($delimiter === '') {
$delimiter = null;
}
$enclosure = $report->getCsvEnclosure();
if ($enclosure === '') {
$enclosure = null;
}
$csvConfig = new CsvConfig(
$delimiter,
$enclosure,
null,
null,
null,
true
);
$filePath = $this->genereateFilePath($filename);
$resource = @fopen($filePath, 'x+b');
$writer = new CsvWriter($resource,$csvConfig);
$prepareHeaderLine = true;
foreach ($this->db->yieldAll($this->service->resolveParameters($report, $parameterValues), []) as $row) {
if($prepareHeaderLine){
$this->writeHeaderLine($writer, $row, $defaultHeaders ,$headersKeyMap);
$prepareHeaderLine = false;
}
$writer->writeLine($row);
}
fclose($resource);
return $filePath;
}
/**
* @param CsvWriter $writer
* @param array $row
* @param array $headers
* @param array $headersKeyMap
*/
protected function writeHeaderLine(CsvWriter $writer, array $row, array $headers, array $headersKeyMap): void
{
if (count($row) > 0) {
$headers = [];
foreach ($row as $columnName => $value) {
$headers[] = $headersKeyMap[$columnName];
}
}
$writer->writeLine($headers);
}
}
+588
View File
@@ -0,0 +1,588 @@
<?php
namespace Xentral\Modules\Report;
use PHPUnit\Runner\Exception;
use Xentral\Components\Database\Database;
use Xentral\Modules\Report\Data\ReportColumn;
use Xentral\Modules\Report\Data\ReportColumnCollection;
use Xentral\Modules\Report\Data\ReportData;
use Xentral\Modules\Report\Data\ReportParameter;
use Xentral\Modules\Report\Data\ReportParameterCollection;
final class ReportGateway
{
/** @var Database $db */
private $db;
/**
* @param Database $database
*/
public function __construct(Database $database)
{
$this->db = $database;
}
/**
* @param string $category
* @param string $searchTerm
* @param int $userId
* @param bool $onlyOwn
* @param bool $onlyFavorites
*
* @return array
*/
public function getReportList($category = '', $searchTerm = '', $userId = 0, $onlyOwn = false, $onlyFavorites = false)
{
$result = [];
$select = $this->db->select();
$select->cols([
'r.id',
'r.name',
'r.description',
'r.project',
'r.category',
'IF(rs.file_public = 1 OR ru.file_enabled = 1 OR u.type = \'admin\', 1, 0) as allow_download',
'IF(rs.file_csv_enabled = 1 OR u.type = \'admin\', 1, 0) as allow_csv',
'IF(rs.file_pdf_enabled = 1 OR u.type = \'admin\', 1, 0) as allow_pdf',
'IF(rs.menu_public = 1 OR ru.menu_enabled = 1 OR u.type = \'admin\', 1, 0) as allow_menu',
'IF(rs.tab_public = 1 OR ru.tab_enabled = 1 OR u.type = \'admin\', 1, 0) as allow_tab',
'IF( (rs.chart_public = 1 OR ru.chart_enabled = 1 OR u.type = \'admin\') AND rs.chart_x_column <> \'\', 1, 0) as allow_chart',
'IF(rf.id IS NULL, 0, 1) as is_favorite',
'r.readonly'
]);
$select->from('report AS r');
try {
$select->leftJoin('report_share AS rs', 'r.id = rs.report_id')
->leftJoin('report_favorite AS rf', '(r.id = rf.report_id AND rf.user_id = :userId)')
->leftJoin('report_user AS ru', '(r.id = ru.report_id AND ru.user_id = :userId)')
->leftJoin('user AS u', 'u.id = :userId');
} catch (\Aura\SqlQuery\Exception $e) {
return [];
}
if ($userId > 0) {
$select->where(
'(
(
ru.id IS NOT NULL
OR rs.file_public = 1
OR rs.menu_public = 1
OR rs.chart_public = 1
OR rs.tab_public = 1
)
AND
(r.project = 0 OR r.project IN (SELECT ar.projekt
FROM adresse_rolle AS ar
LEFT JOIN user as u ON ar.adresse = u.adresse
WHERE u.id = :userId)
)
OR :userId IN (SELECT u.id as `c` FROM `user` AS u WHERE u.id = :userId AND u.type = \'admin\')
)
'
);
}
if ($category !== '') {
$select->Where('r.category LIKE :filterCategory');
}
if ($searchTerm !== '') {
$select->Where('(r.name LIKE :searchTerm OR r.description LIKE :searchTerm)');
}
if ($userId > 0 && $onlyFavorites === true) {
$select->Where('rf.user_id IS NOT NULL');
}
if ($onlyOwn === true) {
$select->Where('r.readonly = 0');
}
$select->orderBy(['rf.user_id DESC', 'r.readonly ASC', 'r.name']);
$sql = $select->getStatement();
$values = [
'filterCategory' => $category,
'searchTerm' => sprintf('%%%s%%', $searchTerm),
'userId' => $userId
];
$list = $this->db->fetchAll($sql, $values);
if (is_array($list) && count($list) > 0) {
$result = $list;
}
return $result;
}
/**
* @param int $id
*
* @return ReportData|null
*/
public function getReportById($id)
{
$report = $this->getOnlyReportById($id);
if ($report === null) {
return null;
}
$columns = $this->getColumnsByReportId($id);
$report->setColumns($columns);
$params = $this->getParametersByReportId($id);
$report->setParameters($params);
return $report;
}
/**
* @param string $name
*
* @return ReportData|null
*/
public function findReportByName($name)
{
$sql = 'SELECT r.id FROM `report` AS `r` WHERE r.name=:name ORDER BY r.id LIMIT 1';
$row = $this->db->fetchRow($sql, ['name' => $name]);
if (!is_array($row) || count($row) < 1) {
return null;
}
return $this->getReportById($row['id']);
}
/**
* @param int $id
*
* @return ReportData|null
*/
public function getOnlyReportById($id)
{
$sql = 'SELECT r.id, r.name, r.description, r.project, r.sql_query, r.remark, r.category, r.readonly,
r.csv_delimiter, r.csv_enclosure
FROM `report` AS `r`
WHERE r.id=:idvalue';
$values = ['idvalue' => $id];
$row = $this->db->fetchRow($sql, $values);
if ($row === null || count($row) === 0) {
return null;
}
return ReportData::fromFormData($row);
}
/**
* @param int $id
*
* @return ReportColumnCollection
*/
public function getColumnsByReportId($id)
{
$sql = 'SELECT c.id, c.key_name, c.title, c.width, c.alignment, c.sorting, c.sum, c.sequence, c.format_type,
c.format_statement
FROM `report_column` AS `c`
WHERE c.report_id=:idvalue
ORDER BY c.sequence';
$values = ['idvalue' => $id];
$rows = $this->db->fetchAll($sql, $values);
$objects = [];
foreach ($rows as $row) {
$objects[] = new ReportColumn(
$row['key_name'],
$row['title'],
$row['width'],
$row['alignment'],
$row['sum'],
$row['id'],
$row['sequence'],
$row['sorting'],
$row['format_type'],
$row['format_statement']
);
}
return new ReportColumnCollection($objects);
}
/**
* @param int $id
*
* @return ReportParameterCollection
*/
public function getParametersByReportId($id)
{
$sql = 'SELECT p.id, p.varname, p.displayname, p.default_value, p.options, p.description,
p.editable, p.control_type
FROM `report_parameter` AS `p`
WHERE p.report_id = :idvalue';
$values = ['idvalue' => $id];
$rows = $this->db->fetchAll($sql, $values);
return ReportParameterCollection::fromFormData($rows);
}
/**
* @param int $id
*
* @return bool
*/
public function reportExists($id)
{
if ((int)$id < 1) {
return false;
}
$sql = 'SELECT r.id FROM `report` AS `r` WHERE r.id = :idvalue';
$values = ['idvalue' => (int)$id];
$idResult = $this->db->fetchRow($sql, $values);
return (isset($idResult['id']) && $idResult['id'] === $id);
}
/**
* @param $id
*
* @return bool
*/
public function isReportReadonly($id)
{
if ((int)$id < 1) {
return false;
}
$sql = 'SELECT r.readonly FROM `report` AS `r` WHERE r.id = :idvalue';
$values = ['idvalue' => (int)$id];
$result = $this->db->fetchRow($sql, $values);
return (isset($result['readonly']) && $result['readonly'] === 1);
}
/**
* @param int $id
*
* @return bool
*/
public function columnExists($id)
{
if ((int)$id < 1) {
return false;
}
$sql = 'SELECT c.id FROM `report_column` AS `c` WHERE c.id = :idvalue';
$values = ['idvalue' => (int)$id];
$idResult = $this->db->fetchRow($sql, $values);
return (isset($idResult['id']) && $idResult['id'] === $id);
}
/**
* @param int $columnId
*
* @return int
*/
public function getReportIdByColumn($columnId)
{
$sql = 'SELECT r.id
FROM `report` AS `r`
JOIN `report_column` AS `rc` ON r.id = rc.report_id
WHERE rc.id = :idValue';
$values = ['idValue' => $columnId];
return (int)$this->db->fetchValue($sql, $values);
}
/**
* @param int $id
*
* @return bool
*/
public function parameterExists($id)
{
if ((int)$id < 1) {
return false;
}
$sql = 'SELECT p.id FROM `report_parameter` AS `p` WHERE p.id = :idvalue';
$values = ['idvalue' => (int)$id];
$idResult = $this->db->fetchRow($sql, $values);
return (isset($idResult['id']) && $idResult['id'] === $id);
}
/**
* @param int $parameterId
*
* @return int
*/
public function getReportIdByParameter($parameterId)
{
$sql = 'SELECT r.id
FROM `report` AS `r`
JOIN `report_parameter` AS `rp` ON r.id = rp.report_id
WHERE rp.id = :idValue';
$values = ['idValue' => $parameterId];
return (int)$this->db->fetchValue($sql, $values);
}
/**
* @param int $id
*
* @return ReportParameter
*/
public function getParameterById($id)
{
$sql = 'SELECT p.id, p.varname, p.displayname, p.default_value, p.options, p.editable, p.description,
p.control_type
FROM `report_parameter` AS `p`
WHERE id = :idValue';
$values = ['idValue' => $id];
$data = $this->db->fetchRow($sql, $values);
return ReportParameter::fromDbState($data);
}
/**
* @param int $id
*
* @return ReportColumn
*/
public function getColumnById($id)
{
$sql = 'SELECT c.id, c.key_name, c.title, c.width, c.alignment, c.sorting, c.sum, c.sequence, c.format_type,
c.format_statement
FROM `report_column` AS `c`
WHERE c.id = :idValue';
$values = ['idValue' => $id];
$data = $this->db->fetchRow($sql, $values);
return ReportColumn::fromDbState($data);
}
/**
* @param int $id
*
* @return array
*/
public function findTransferArrayByReportId($id)
{
$sql = 'SELECT id, report_id, ftp_active, ftp_passive, ftp_type, ftp_host, ftp_port, ftp_user, ftp_password,
ftp_interval_mode, ftp_interval_value, ftp_daytime, ftp_format, ftp_filename, ftp_last_transfer,
email_active, email_recipient, email_subject, email_interval_mode, email_interval_value,
email_daytime, email_format, email_filename, email_last_transfer, url_format, url_begin,
url_end, url_address, api_active, api_account_id, api_format
FROM `report_transfer` AS `t`
WHERE report_id=:idValue';
$array = $this->db->fetchRow($sql, ['idValue' => $id]);
if ($array === null || empty($array)) {
return [];
}
return $array;
}
/**
* @param int $userId
* @param string $module
* @param string $action
*
* @return array
*/
public function findShareByModuleAction($userId, $module, $action)
{
$sql = "SELECT s.id, s.report_id, s.chart_public, s.chart_axislabel, s.chart_dateformat, s.chart_interval_value,
s.chart_interval_mode, s.file_public, s.file_pdf_enabled, s.file_csv_enabled,
s.file_xls_enabled, s.menu_public, s.menu_doctype, s.menu_label, s.menu_format, s.tab_public,
s.tab_module, s.tab_action, IF(s.tab_label <> '', s.tab_label, r.name) as `tab_label`,
s.tab_position, s.chart_type, s.chart_x_column, s.data_columns, s.chart_group_column
FROM `report_share` AS `s`
JOIN `report` AS `r` on s.report_id = r.id
LEFT JOIN `report_user` AS `ru` ON r.id = ru.report_id AND ru.user_id = :userid
WHERE (s.tab_public = 1 OR NOT ISNULL(ru.id)) AND s.tab_module = :module
AND (s.tab_action = '' OR s.tab_action = :action)";
$array = $this->db->fetchAll(
$sql,
[
'userid' => (int)$userId,
'module' => (string)$module,
'action' => (string)$action
]
);
if ($array === null || empty($array)) {
return [];
}
return $array;
}
/**
* @param int $id
*
* @return array
*/
public function findShareArrayByReportId($id)
{
$sql = 'SELECT s.id,s.report_id, s.chart_public, s.chart_axislabel, s.chart_dateformat, s.chart_interval_value,
s.chart_interval_mode, s.file_public, s.file_pdf_enabled, s.file_csv_enabled,
s.file_xls_enabled, s.menu_public, s.menu_doctype, s.menu_label, s.menu_format, s.tab_public,
s.tab_module, s.tab_action, s.tab_label, s.tab_position, s.chart_type,
s.chart_x_column, s.data_columns, s.chart_group_column
FROM `report_share` AS `s`
WHERE s.report_id=:idValue';
$array = $this->db->fetchRow($sql, ['idValue' => $id]);
if ($array === null || empty($array)) {
return [];
}
return $array;
}
/**
* @param int $id
*
* @return array
*/
public function findSharedUserById($id)
{
$sql = 'SELECT ru.id, ru.report_id, ru.user_id, ru.name, ru.chart_enabled, ru.file_enabled,
ru.menu_enabled, ru.tab_enabled
FROM `report_user` AS `ru`
WHERE ru.id=:idValue';
$array = $this->db->fetchRow($sql, ['idValue' => $id]);
if ($array === null || empty($array)) {
return [];
}
return $array;
}
/**
* @param int $userId
* @param int $reportId
*
* @return bool
*/
public function isSharedUserOfReport($userId, $reportId)
{
$sql = 'SELECT ru.id FROM `report_user` AS `ru` WHERE ru.user_id = :userId AND ru.report_id = :reportId';
$values = ['userId' => $userId, 'reportId' => $reportId];
$id = $this->db->fetchValue($sql, $values);
return !empty($id);
}
/**
* @param string $doctype
* @param int $userId
*
* @return array
*/
public function getDocumentAddActionMenuData($doctype, $userId = 0)
{
$sql = 'SELECT r.id, r.name, s.menu_doctype, s.menu_format, s.menu_label
FROM `report` as `r`
JOIN `report_share` as `s` ON r.id = s.report_id
LEFT JOIN `report_user` as `u` ON r.id = u.report_id
WHERE (s.menu_doctype = :docType AND (s.menu_public = 1 OR (u.user_id = :userId AND u.menu_enabled = 1))
AND
(r.project = 0 OR r.project IN (SELECT ar.projekt
FROM `adresse_rolle` AS `ar`
LEFT JOIN `user` as `u` ON ar.adresse = u.adresse
WHERE u.id = :userId)
OR :userId IN (SELECT u.id as `c` FROM `user` AS `u`
WHERE u.id = :userId AND u.type = \'admin\'))
)';
$data = $this->db->fetchAll($sql, ['docType' => strtolower($doctype), 'userId' => $userId]);
if (empty($data)) {
return [];
}
return $data;
}
/**
* @param int $reportId
* @param int $userId
*
* @return bool
*/
public function isFavoriteReportOfUser($reportId, $userId)
{
if ($reportId < 1 || $userId < 0){
return false;
}
$sql = 'SELECT rf.id
FROM `report_favorite` AS `rf`
WHERE rf.report_id = :reportID AND rf.user_id = :userId
LIMIT 1';
$id = $this->db->fetchValue($sql, ['reportID' => $reportId, 'userId' => $userId]);
return !empty($id);
}
/**
* @param $reportId
* @param $userId
*
* @return bool
*/
public function userCanDownloadCsv($reportId, $userId)
{
return $this->userCanDownload($reportId, $userId, 'csv');
}
/**
* @param $reportId
* @param $userId
*
* @return bool
*/
public function userCanDownloadPdf($reportId, $userId)
{
return $this->userCanDownload($reportId, $userId, 'pdf');
}
/**
* @todo: implement when xls exporter is ready
*
* @param $reportId
* @param $userId
*
* @return bool
*/
public function userCanDownloadXls($reportId, $userId)
{
//return $this->userCanDownload($reportId, $userId, 'xls');
return false;
}
/**
* @param $reportId
* @param $userId
*
* @param $filetype 'csv', 'pdf' or 'xls'
*
* @return bool
*/
private function userCanDownload($reportId, $userId, $filetype)
{
try {
$sql = sprintf(
'SELECT r.id
FROM `report` AS `r`
LEFT JOIN `report_share` AS `s` ON r.id = s.report_id
LEFT JOIN `report_user` AS `u` ON r.id = u.report_id
WHERE r.id = :reportId AND (
:userId IN (SELECT `u`.`id` AS `c` FROM `user` AS `u` WHERE `u`.`id` = :userId AND `u`.`type` = \'admin\')
OR
(s.file_%s_enabled = 1 AND (s.file_public = 1 OR (u.user_id = :userId AND u.file_enabled = 1)))
)',
$filetype
);
$data = $this->db->fetchAll($sql, ['reportId' => $reportId, 'userId' => $userId]);
return !empty($data);
} catch (Exception $e) {
return false;
}
}
}
@@ -0,0 +1,64 @@
<?php
namespace Xentral\Modules\Report;
use Exception;
use Xentral\Modules\Report\Data\ReportData;
use Xentral\Modules\Report\Exception\JsonExportException;
final class ReportJsonExportService extends AbstractReportExportService
{
/** @var string $fileExtension */
protected $fileExtension = 'json';
/**
* @param ReportData $report
* @param string $filename
*
* @return string
*/
public function createJsonFileFromReport(ReportData $report, $filename = '')
{
$filename = $this->generateFileName($report, $filename);
$filePath = $this->genereateFilePath($filename);
$data = $this->generateJsonStructure($report);
$jsonString = json_encode($data, JSON_PRETTY_PRINT);
try {
$resource = fopen($filePath, 'x+b');
fwrite($resource, $jsonString);
fclose($resource);
} catch (Exception $e) {
throw new JsonExportException(sprintf('JSON export failed: %s', $e->getMessage()), $e->getCode(), $e);
}
return $filePath;
}
/**
* @param ReportData $report
*
* @return array
*/
public function generateJsonStructure(ReportData $report)
{
$id = $report->getId();
$data = $report->jsonSerialize();
$share = $this->gateway->findShareArrayByReportId($id);
$data['share'] = null;
if ($share === null || count($share) === 0) {
return $data;
}
$share['chart_public'] = ($share['chart_public'] === 1);
$share['file_public'] = ($share['file_public'] === 1);
$share['file_pdf_enabled'] = ($share['file_pdf_enabled'] === 1);
$share['file_csv_enabled'] = ($share['file_csv_enabled'] === 1);
$share['file_xls_enabled'] = ($share['file_xls_enabled'] === 1);
$share['menu_public'] = ($share['menu_public'] === 1);
$share['tab_public'] = ($share['tab_public'] === 1);
unset($share['id'], $share['report_id']);
$data['share'] = $share;
return $data;
}
}
@@ -0,0 +1,351 @@
<?php
namespace Xentral\Modules\Report;
use Exception;
use Xentral\Components\Http\File\FileUpload;
use Xentral\Modules\Report\Data\ReportColumn;
use Xentral\Modules\Report\Data\ReportColumnCollection;
use Xentral\Modules\Report\Data\ReportData;
use Xentral\Modules\Report\Data\ReportParameter;
use Xentral\Modules\Report\Data\ReportParameterCollection;
use Xentral\Modules\Report\Exception\InvalidArgumentException;
use Xentral\Modules\Report\Exception\JsonParseException;
use Xentral\Modules\Report\Exception\ReportReadonlyException;
final class ReportJsonImportService
{
/** @var ReportGateway $gateway */
private $gateway;
/** @var ReportService $service */
private $service;
/**
* @param ReportGateway $gateway
* @param ReportService $service
*/
public function __construct(ReportGateway $gateway, ReportService $service)
{
$this->gateway = $gateway;
$this->service = $service;
}
/**
* @param array $jsonData
*
* @return int database entry id
*/
public function importReport($jsonData)
{
if (!is_array($jsonData)) {
throw new JsonParseException('Json data must be associative array.');
}
if (!isset($jsonData['name']) || $jsonData['name'] === '') {
throw new JsonParseException('Name of the report is required.');
}
$existing = $this->gateway->findReportByName($jsonData['name']);
$existingShare = [];
if ($existing !== null) {
$jsonData['id'] = $existing->getId();
$report = $this->parseReport($jsonData);
$columns = $this->gateway->getColumnsByReportId($existing->getId());
$params = $this->gateway->getParametersByReportId($existing->getId());
$areColumnsEqual = $this->areArraysEqual(
$columns->toArray(),
$report->getColumns() === null ? [] : $report->getColumns()
->toArray()
);
$areParamsEqual = $this->areArraysEqual(
$params->toArray(),
$report->getParameters() === null ? [] : $report->getParameters()
->toArray()
);
if ($areColumnsEqual && $areParamsEqual) {
$report->setColumns(new ReportColumnCollection());
$report->setParameters(new ReportParameterCollection());
} else {
foreach ($columns as $column) {
$this->service->deleteColumnById($column->getId());
}
foreach ($params as $param) {
$this->service->deleteParamById($param->getId());
}
}
$existingShare = $this->gateway->findShareArrayByReportId($existing->getId());
} else {
$report = $this->parseReport($jsonData);
}
$insertReportId = $this->service->saveReport($report);
if (array_key_exists('share', $jsonData) && $jsonData['share'] !== null) {
$share = $this->parseShare($jsonData['share'], $existingShare);
$share['id'] = 0;
$share['report_id'] = $insertReportId;
if ($existingShare !== null && count($existingShare) > 0) {
$share['id'] = $existingShare['id'];
}
$this->service->saveShareArray($share);
}
return $insertReportId;
}
/**
* @param array $jsonArray
*
* @return array errors
*/
public function findJsonStructureErrors($jsonArray)
{
$errors = [];
$required = ['name', 'sql_query', 'columns'];
$requiredInColumn = ['key_name', 'title'];
$requiredInParam = ['varname', 'default_value'];
foreach ($required as $key) {
if (!isset($jsonArray[$key]) || empty($jsonArray[$key])) {
$errors[] = sprintf('Field %s is required.', $key);
}
}
if (isset($jsonArray['columns']) && is_array($jsonArray['columns'])) {
foreach ($jsonArray['columns'] as $column) {
foreach ($requiredInColumn as $key) {
if (!isset($column[$key]) || $column[$key] === '') {
$errors[] = sprintf('Field column>%s is required.', $key);
}
}
}
}
if (isset($jsonArray['parameters']) && is_array($jsonArray['parameters'])) {
foreach ($jsonArray['parameters'] as $param) {
foreach ($requiredInParam as $key) {
if (!isset($param[$key]) || $param[$key] === '') {
$errors[] = sprintf('Field column>%s is required.', $key);
}
}
}
}
return $errors;
}
/**
* @param FileUpload $upload
* @param int $currentId
*
* @return int
*/
public function importJsonUpload(FileUpload $upload, $currentId = 0)
{
if ($currentId > 0 && $this->gateway->isReportReadonly($currentId)) {
throw new ReportReadonlyException('Cannot overwrite report by JSON import');
}
if ($upload === null || !$upload->isValid() || $upload->getClientMimeType() !== 'application/json') {
throw new InvalidArgumentException('uploaded file is invalid');
}
if ($upload->hasError()) {
throw new InvalidArgumentException($upload->getErrorMessage(), $upload->getErrorCode());
}
$stringContent = $upload->getContent();
$dataArray = json_decode($stringContent, true);
if (empty($dataArray)) {
throw new JsonParseException('Error parsing JSON structure');
}
if (isset($dataArray['name'])) {
$dataArray['name'] = $this->service->generateIncrementedReportName($dataArray['name'], $currentId);
}
return $this->importReport($dataArray);
}
/**
* @param array $reportData
*
* @throws JsonParseException
*
* @return ReportData
*/
private function parseReport($reportData)
{
try {
$report = ReportData::fromFormData($reportData);
} catch (Exception $e) {
throw new JsonParseException($e->getMessage(), $e->getCode(), $e);
}
if (isset($reportData['readonly']) && $reportData['readonly'] === true) {
$report->setReadonly(true);
}
$columnObjects = [];
if (isset($reportData['columns']) && is_array($reportData['columns'])) {
$sequence = 1;
foreach ($reportData['columns'] as $columnData) {
$parsedCol = $this->parseColumn($columnData);
if ($parsedCol->getSequence() === 0) {
$parsedCol = new ReportColumn(
$parsedCol->getKey(),
$parsedCol->getTitle(),
$parsedCol->getWidth(),
$parsedCol->getAlignment(),
$parsedCol->isSumColumn(),
$parsedCol->getId(),
$sequence,
$parsedCol->getSorting(),
$parsedCol->getFormatType(),
$parsedCol->getFormatStatement()
);
}
$columnObjects[] = $parsedCol;
$sequence++;
}
}
$colCollection = new ReportColumnCollection($columnObjects);
$report->setColumns($colCollection);
$paramObjects = [];
if (isset($reportData['parameters']) && is_array($reportData['parameters'])) {
foreach ($reportData['parameters'] as $paramData) {
$paramObjects[] = $this->parseParam($paramData);
}
}
$paramCollection = new ReportParameterCollection($paramObjects);
$report->setParameters($paramCollection);
return $report;
}
/**
* @param array $colData
*
* @throws JsonParseException
*
* @return ReportColumn
*/
private function parseColumn($colData)
{
try {
$column = ReportColumn::fromDbState($colData);
} catch (Exception $e) {
throw new JsonParseException($e->getMessage(), $e->getCode(), $e);
}
if ($column === null) {
throw new JsonParseException('Error while parsing Column.');
}
return $column;
}
/**
* @param array $paramData
*
* @throws JsonParseException
*
* @return ReportParameter
*/
private function parseParam($paramData)
{
try {
$parameter = ReportParameter::fromDbState($paramData);
} catch (Exception $e) {
throw new JsonParseException($e->getMessage(), $e->getCode(), $e);
}
if ($parameter === null) {
throw new JsonParseException('Error while parsing Column.');
}
return $parameter;
}
/**
* @param array $share
* @param array $existingShare
*
* @return array
*/
private function parseShare($share, $existingShare = [])
{
$data = [
'chart_public' => 0,
'chart_axislabel' => '',
'chart_dateformat' => 'Y-m-d H:i:s',
'chart_type' => 'line',
'chart_x_column' => '',
'data_columns' => '',
'chart_group_column' => '',
'chart_interval_value' => 0,
'chart_interval_mode' => 'day',
'file_public' => 0,
'file_pdf_enabled' => 0,
'file_csv_enabled' => 0,
'file_xls_enabled' => 0,
'menu_public' => 0,
'menu_doctype' => '',
'menu_label' => '',
'menu_format' => 'csv',
'tab_public' => 0,
'tab_module' => '',
'tab_action' => '',
'tab_label' => '',
'tab_position' => 'nach_freifeld',
];
$data = array_merge($data, $existingShare);
$data = array_merge($data, $share);
$boolkeys = [
'chart_public',
'file_public',
'file_pdf_enabled',
'file_csv_enabled',
'file_xls_enabled',
'menu_public',
'tab_public',
];
foreach ($boolkeys as $booleanKey) {
if (array_key_exists($booleanKey, $share) && $share[$booleanKey] === true) {
$data[$booleanKey] = 1;
} else {
$data[$booleanKey] = 0;
}
}
return $data;
}
/**
* @param array $collection
* @param array $collectionToTest
*
* @return bool
*/
private function areArraysEqual(array $collection, array $collectionToTest): bool
{
$collectionWithOutIds = array_map(
static function (array $array) {
unset($array['id']);
if(isset($array['sum'])) {
$array['sum'] = (int)$array['sum'];
}
return $array;
},
$collection
);
$collectionToTestWithOutIds = array_map(
static function (array $array) {
unset($array['id']);
if(isset($array['sum'])) {
$array['sum'] = (int)$array['sum'];
}
return $array;
},
$collectionToTest
);
return json_encode($collectionToTestWithOutIds) === json_encode($collectionWithOutIds);
}
}
@@ -0,0 +1,298 @@
<?php
declare(strict_types=1);
namespace Xentral\Modules\Report;
use Xentral\Components\Database\Database;
use Xentral\Components\Database\Exception\DatabaseExceptionInterface;
use Xentral\Components\Util\StringUtil;
use Xentral\Modules\Report\Data\ReportColumn;
use Xentral\Modules\Report\Data\ReportColumnCollection;
use Xentral\Modules\Report\Data\ReportData;
use Xentral\Modules\Report\Data\ReportParameter;
use Xentral\Modules\Report\Data\ReportParameterCollection;
class ReportLegacyConverterService
{
/** @var Database $db */
private $db;
/** @var ReportService $service */
private $service;
/**
* @param Database $db
* @param ReportService $service
*/
public function __construct(Database $db, ReportService $service)
{
$this->db = $db;
$this->service = $service;
}
/**
* @param int $legacyReportId
*
* @return int id of the new report
*/
public function convertLegacyReport(int $legacyReportId): int
{
$sql = 'SELECT * FROM `berichte` AS `b` WHERE id=:idValue';
$legacyData = $this->db->fetchRow($sql, ['idValue' => $legacyReportId]);
if ($legacyData === null || empty($legacyData)) {
return 0;
}
$reportArray = [
'name' => $this->service->generateIncrementedReportName($legacyData['name']),
'description' => $legacyData['beschreibung'],
'remark' => $legacyData['internebemerkung'],
'sql_query' => $legacyData['struktur'],
'project' => $legacyData['project'],
'csv_delimiter' => ';',
'csv_enclosure' => '"',
];
$newReport = ReportData::fromFormData($reportArray);
$parameters = $this->parseParameters($legacyData['variablen']);
$newReport->setParameters($parameters);
$preQuery = $this->service->resolveParameters($newReport);
try {
$queryResult = $this->db->fetchRow($preQuery);
} catch (DatabaseExceptionInterface $e) {
$queryResult = [];
}
$columns = $this->parseColumns(
$legacyData['spaltennamen'],
$legacyData['spaltenbreite'],
$legacyData['spaltenausrichtung'],
$legacyData['sumcols'],
$queryResult
);
$newReport->setColumns($columns);
$newReportId = $this->service->saveReport($newReport);
$transferArray = $this->getTransferArray($legacyData, $newReportId);
$this->service->saveTransferArray($transferArray);
$shareArray = $this->getShareArray($legacyData, $newReportId);
$this->service->saveShareArray($shareArray);
return $newReportId;
}
/**
* @param string $colNameString
* @param string $colWidthString
* @param string $colAlignString
* @param string $sumColString
* @param array $sampleRow
*
* @return null|ReportColumnCollection
*/
private function parseColumns(
?string $colNameString,
?string $colWidthString,
?string $colAlignString,
?string $sumColString,
array $sampleRow
): ?ReportColumnCollection
{
$colNames = [];
if ($colNameString !== null) {
$colNames = explode(';',$colNameString);
}
$colWidths = [];
if ($colWidthString !== null) {
$colWidths = explode(';', $colWidthString);
}
$colAligns = [];
if ($colAlignString !== null) {
$colAligns = explode(';', $colAlignString);
}
$sumCols = [];
if ($sumColString !== null) {
$sumCols = explode(';', $sumColString);
}
$refcount = count($colNames);
if (count($colWidths) !== $refcount || count($colAligns) !== $refcount) {
return null;
}
$sortedColumns = [];
if (empty($sampleRow)) {
foreach ($colNames as $name) {
$key = strtolower(StringUtil::toAscii(trim($name)));
$sortedColumns[$key] = trim($name);
}
} else {
$i = 0;
foreach ($sampleRow as $key => $value) {
if (array_key_exists($i, $colNames)) {
$sortedColumns[$key] = $colNames[$i];
}
$i++;
}
}
$newColumnsArray = [];
$i = 0;
foreach ($sortedColumns as $key => $name) {
$title = trim($name);
$width = trim($colWidths[$i]);
$align = strtoupper(trim($colAligns[$i]));
switch ($align) {
case 'L':
$align = 'left';
break;
case 'R':
$align = 'right';
break;
default:
$align = 'center';
}
$isSumCol = (in_array(($i + 1), $sumCols, false));
$columnObject = new ReportColumn($key, $title, $width, $align, $isSumCol);
$newColumnsArray[] = $columnObject;
$i++;
}
if (count($newColumnsArray) === 0) {
return null;
}
return new ReportColumnCollection($newColumnsArray);
}
/**
* @param $parametersString
*
* @return ReportParameterCollection|null
*/
public function parseParameters(?string $parametersString): ?ReportParameterCollection
{
if ($parametersString === null){
return null;
}
$singleParamStrings = explode(';', $parametersString);
if (count($singleParamStrings) === 0) {
return null;
}
$newParamArray = [];
foreach ($singleParamStrings as $param) {
$parts = [];
if (
preg_match('/.*{(\w+)}\s*=\s*(\S+)/', $param, $parts)
&& count($parts) === 3
) {
$paramObject = new ReportParameter($parts[1], $parts[2], $parts[1], [], '', false);
$newParamArray[] = $paramObject;
}
}
if (count($newParamArray) === 0) {
return null;
}
return new ReportParameterCollection($newParamArray);
}
/**
* @param array $legacyData
* @param int $repotId
*
* @return array
*/
private function getTransferArray(array $legacyData, int $repotId): array
{
return [
'id' => 0,
'report_id' => $repotId,
'ftp_active' => $legacyData['ftpuebertragung'],
'ftp_type' => $legacyData['typ'],
'ftp_host' => $this->getArrayValue('ftphost', $legacyData, ''),
'ftp_port' => $this->getArrayValue('ftpport', $legacyData, 0),
'ftp_user' => $this->getArrayValue('ftpuser', $legacyData, ''),
'ftp_password' => $this->getArrayValue('ftppassword', $legacyData, ''),
'ftp_interval_mode' => 'day',
'ftp_interval_value' => 1,
'ftp_daytime' => $legacyData['ftpuhrzeit'],
'ftp_format' => 'csv',
'ftp_filename' => $legacyData['ftpnamealternativ'],
'email_active' => $legacyData['emailuebertragung'],
'email_recipient' => $this->getArrayValue('emailempfaenger', $legacyData, ''),
'email_subject' => $this->getArrayValue('emailbetreff', $legacyData, ''),
'email_interval_mode' => 'day',
'email_interval_value' => 1,
'email_daytime' => $legacyData['emailuhrzeit'],
'email_format' => 'csv',
'email_filename' => 'emailnamealternativ',
'url_format' => 'csv',
'url_begin' => null,
'url_end' => null,
'url_address' => '',
'api_active' => 0,
'api_account_id' => 0,
'api_format' => 'csv',
];
}
/**
* @param array $legacyData
* @param int $reportId
*
* @return array
*/
private function getShareArray(array $legacyData, int $reportId): array
{
return [
'id' => 0,
'report_id' => $reportId,
'chart_public' => 0,
'chart_axislabel' => '',
'chart_type' => 'line',
'chart_dateformat' => 'Y-m-d H:i:s',
'chart_interval_value' => 0,
'chart_interval_mode' => '',
'chart_x_column' => '',
'data_columns' => '',
'chart_group_column' => '',
'file_public' => 0,
'file_pdf_enabled' => 0,
'file_csv_enabled' => 0,
'file_xls_enabled' => 0,
'menu_public' => $this->getArrayValue('doctype_actionmenu', $legacyData, 0),
'menu_doctype' => $this->getArrayValue('doctype', $legacyData, ''),
'menu_label' => $legacyData['doctype_actionmenuname'],
'menu_format' => $legacyData['doctype_actionmenufiletype'],
'tab_public' => 0,
'tab_action' => '',
'tab_module' => '',
'tab_label' => '',
'tab_position' => '',
];
}
/**
* @param string $key
* @param $data
* @param mixed $default
*
* @return mixed|null
*/
private function getArrayValue(string $key, array &$data, $default = null)
{
if (!isset($data[$key]) || $data[$key] === null) {
return $default;
}
return $data[$key];
}
}
@@ -0,0 +1,184 @@
<?php
namespace Xentral\Modules\Report;
use SuperFPDF;
use Xentral\Modules\Report\Data\ReportData;
use Xentral\Modules\Report\Exception\InvalidArgumentException;
class ReportPdfExportService extends AbstractReportExportService
{
/** @var string $fileExtension */
protected $fileExtension = 'pdf';
/**
* @param ReportData $report
* @param array $parameterValues
* @param string $filename
*
* @return string
*/
public function createPdfFileFromReport(ReportData $report, $parameterValues = [], $filename = '')
{
$filename = $this->generateFileName($report, $filename);
$id = $report->getId();
$struktur = $this->service->resolveParameters($report, $parameterValues);
if(!$this->service->isSqlStatementAllowed($struktur))
{
throw new InvalidArgumentException('Resolved Query not executable.');
}
$colKeyMap = [];
$colWidths = [];
$colNames = [];
$colAligns = [];
$counter = 0;
foreach ($report->getColumns() as $column) {
$colKeyMap[$column->getKey()] = $column->getTitle();
$colWidths[] = $column->getWidth();
$colAligns[] = $column->getAlignment();
if ($column->isSumColumn()) {
$sumcolsa[] = $counter;
}
$counter++;
}
$nameaufpdf = $this->stringReadyForPdf($report->getName());
foreach($sumcolsa as $k => $v)
{
$v = (int)$v;
if($v <= 0)
{
unset($sumcolsa[$k]);
}else{
$sumcolsa[$k] = $v;
}
}
define('FPDF_FONTPATH2','/../../../www/lib/pdf/font2');
//require dirname(__DIR__).'/lib/pdf/fpdf_org.php';
$pdfOrgPath = __DIR__.'/../../../www/lib/pdf/fpdf_org.php';
require $pdfOrgPath;
$pdf=new SuperFPDF();
$pdf->AddPage();
$pdf->SetFillColor(255,255,255);
$pdf->SetTextColor(0);
$pdf->SetDrawColor(0,0,0);
$pdf->SetLineWidth(.3);
$pdf->SetFont('Arial','B',10);
$pdf->Cell(array_sum($colWidths),7,"Bericht: $nameaufpdf (Ausdruck vom ".date("d.m.Y").")",1,0,'L',true);
$pdf->Ln();
$pdf->SetFont('Arial','',8);
$sums = [];
$prepareHeaderLine = true;
$cw = count($colWidths);
foreach ($this->db->yieldAll($this->service->resolveParameters($report, $parameterValues), []) as $row) {
if($prepareHeaderLine){
$header = [];
foreach ($row as $columnName => $columnValue) {
$header[] = $colKeyMap[$columnName];
}
for($i=0;$i<$cw;$i++) {
$pdf->Cell($colWidths[$i], 7, $header[$i], 1, 0, $colAligns[$i], true);
}
$pdf->Ln();
$prepareHeaderLine = false;
}
$columnCounter = 0;
foreach($row as $columnKey=>$columnValue){
$pdf->Cell($colWidths[$columnCounter],6,$this->stringReadyForPdf($columnValue),'LRTB',0,$colAligns[$columnCounter],true);
if(!empty($sumcolsa) && in_array($columnKey+1,$sumcolsa, false))
{
if(empty($sums[$columnKey])){
$sums[$columnKey] = 0;
}
$sums[$columnKey] += $this->sanitizeBetrag(1, $columnValue);
}
$columnCounter++;
}
for($columnCounter; $columnCounter < $cw; $columnCounter++) {
$pdf->Cell($colWidths[$columnCounter], 6, '', 'LRTB', 0, $colAligns[$columnCounter], true);
}
$pdf->Ln();
}
if(!empty($sums)) {
$pdf->Ln();
for($columnCounter = 0;$columnCounter<$cw;$columnCounter++) {
$pdf->Cell(
$colWidths[$columnCounter],
6,
isset($sums[$columnCounter])?$this->stringReadyForPdf(number_format($sums[$columnCounter],
2,
',',
'.')):'',
'LRTB',
0,
$colAligns[$columnCounter],
true
);
}
}
//$pdf->Cell($w[1],6,$this->app->erp->LimitChar($name_de,30),'LRTB',0,'L',$fill);
$pdf->SetFont('Arial','',8);
$filePath = $this->genereateFilePath($filename);//sprintf('%s/%s', sys_get_temp_dir(), $filename);
$pdf->Output($filePath, 'F');
return $filePath;
}
/**
* kopiert aus erpapi
* @todo: prüfen ob gebraucht und ggf. auflösen
*
* @param $db
* @param $value
* @param null $fromform
*
* @return string|string[]
*/
private function sanitizeBetrag($db,$value,$fromform = null)
{
// wenn . und , vorhanden dann entferne punkt
$pos_punkt = strrpos($value, '.');
$pos_komma = strrpos($value, ',');
if (($pos_punkt !== false) && ($pos_komma !== false)) {
if ($pos_punkt < $pos_komma) {
$value = str_replace('.', '', $value);
} else {
$value = str_replace(',', '', $value);
}
}
return str_replace(',', '.', $value);
}
/**
* @param $string
*
* @return string
*/
private function stringReadyForPdf($string)
{
return trim(
html_entity_decode(
str_replace(
['“', '„', '', '&rsquo;', '&apos;', 'NONBLOCKINGZERO'],
['"','','-',"'","'",''],
$string
),
ENT_QUOTES,
'UTF-8'
)
);
}
}
@@ -0,0 +1,268 @@
<?php
namespace Xentral\Modules\Report;
use Xentral\Modules\Report\Data\ReportData;
use Xentral\Modules\Report\Data\ReportParameter;
use Xentral\Modules\Report\Data\ReportParameterCollection;
use Xentral\Modules\Report\Exception\UnresolvedParameterException;
class ReportResolveParameterService
{
/** @var string CONTROL_TYPE_DATE */
const CONTROL_TYPE_DATE = 'date';
/** @var string CONTROL_TYPE_TEXT */
const CONTROL_TYPE_TEXT = 'text';
/** @var string CONTROL_TYPE_COMBOBOX */
const CONTROL_TYPE_COMBOBOX = 'combobox';
/** @var string CONTROL_TYPE_PROJECT */
const CONTROL_TYPE_PROJECT = 'autocomplete_project';
/** @var string CONTROL_TYPE_GROUP */
const CONTROL_TYPE_GROUP = 'autocomplete_group';
/** @var string CONTROL_TYPE_ADDRESS */
const CONTROL_TYPE_ADDRESS = 'autocomplete_address';
/** @var string CONTROL_TYPE_ARTICLE */
const CONTROL_TYPE_ARTICLE = 'autocomplete_article';
/** @var int $userId */
private $userId;
/** @var array $userProjects */
private $userProjects;
/** @var bool $userIsAdmin */
private $userIsAdmin;
/**
* @param int $userId
* @param array $userProjects
* @param bool $userIsAdmin
*/
public function __construct($userId, $userProjects, $userIsAdmin)
{
$this->userId = $userId;
$this->userProjects = $userProjects;
$this->userIsAdmin = $userIsAdmin;
}
/**
* @param ReportData $report
* @param array $parameterValues
*
* @return string compiled sql query
*/
public function resolveParameters(ReportData $report, $parameterValues = [])
{
$compiledQuery = $this->resolveEnvironmentVariables($report);
$resolvedReport = $this->resolveInputParameters($report, $parameterValues);
$parameters = $resolvedReport->getParameters();
if ($parameters !== null) {
foreach ($parameters as $param) {
$value = $param->getValue();
$pattern = sprintf('/\{%s\}/', mb_strtoupper($param->getVarname()));
$compiledQuery = preg_replace($pattern, $value, $compiledQuery);
}
}
preg_match_all('/{([^{}]+)}/', $compiledQuery, $matches);
if (!empty($matches[1])) {
throw new UnresolvedParameterException(sprintf('unresolved Variable "%s"', $matches[1][0]));
}
return $compiledQuery;
}
/**
* @param ReportData $report
* @param array $parameterValues
*
* @return ReportData
*/
public function resolveInputParameters(ReportData $report, $parameterValues = [])
{
$params = $report->getParameters();
if ($params === null || count($params) < 1) {
return $report;
}
$resolvedParams = [];
foreach ($params as $param) {
$varname = strtolower($param->getVarname());
foreach ($parameterValues as $varkey => $varvalue) {
if ($varname === strtolower($varkey)) {
$resolvedValue = $this->resolveParameterValue($param, $varvalue);
$param->setTemporaryValue($resolvedValue);
}
}
$resolvedParams[] = $param;
}
$report->setParameters(new ReportParameterCollection($resolvedParams));
return $report;
}
/**
* @param ReportData $report
*
* @return string
*/
public function resolveEnvironmentVariables(ReportData $report)
{
$variables = $this->getEnvironMentVariables($report);
$compiledQuery = $report->getSqlQuery();
foreach ($variables as $key => $value) {
$pattern = sprintf('/\{%s\}/', $key);
$compiledQuery = preg_replace($pattern, $value, $compiledQuery);
}
return $compiledQuery;
}
/**
* @param ReportData $report
*
* @return array
*/
public function getEnvironmentVariables(ReportData $report)
{
$variables = [];
if ($this->userId > 0) {
$variables['USER_ID'] = $this->userId;
$variables['USER_PROJECTS'] = sprintf('(%s)', implode(', ', $this->userProjects));
$variables['USER_ADMIN'] = 0;
if ($this->userIsAdmin === true) {
$variables['USER_ADMIN'] = 1;
}
}
$variables['REPORT_PROJECT'] = $report->getProjectId();
return $variables;
}
/**
* @param $sql
*
* @return string[]
*/
public function findInvalidVariableNames($sqlStatement)
{
if (
!preg_match_all('/{([^{}]+)}/', $sqlStatement, $matches)
|| count($matches) < 2
) {
return [];
}
$errors = [];
foreach ($matches[1] as $varname) {
if(!preg_match('/^[A-Z_0-9]+$/', $varname)) {
$errors[] = $varname;
}
}
return $errors;
}
/**
* @param ReportParameter $parameter
* @param mixed $value
*
* @throws UnresolvedParameterException
*
* @return mixed
*/
private function resolveParameterValue(ReportParameter $parameter, $value)
{
$control_type = $parameter->getControlType();
if ($value === null) {
return null;
}
switch ($control_type) {
case self::CONTROL_TYPE_PROJECT:
return $this->resolveProject($value);
break;
case self::CONTROL_TYPE_GROUP:
return $this->resolveGroup($value);
break;
case self::CONTROL_TYPE_ADDRESS:
return $this->resolveAddress($value);
break;
case self::CONTROL_TYPE_ARTICLE:
return $this->resolveArticle($value);
break;
}
return $value;
}
/**
* @param string $input
*
* @return string
*/
private function resolveProject($input)
{
$split = explode(' ', $input);
if (count($split) < 1) {
throw new UnresolvedParameterException('project parameter format incorrect');
}
return $split[0];
}
/**
* @param string $input
*
* @return string
*/
private function resolveGroup($input)
{
$split = explode(' ', $input);
if (count($split) < 2) {
throw new UnresolvedParameterException('group parameter format incorrect');
}
return $split[count($split)-1];
}
/**
* @param string $input
*
* @return string
*/
private function resolveAddress($input)
{
$split = explode(' ', $input);
if (count($split) < 1) {
throw new UnresolvedParameterException('address parameter format incorrect');
}
return $split[0];
}
/**
* @param string $input
*
* @return string
*/
private function resolveArticle($input)
{
$split = explode(' ', $input);
if (count($split) < 2) {
throw new UnresolvedParameterException('article parameter format incorrect');
}
return $split[0];
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,76 @@
<?php
declare(strict_types=1);
namespace Xentral\Modules\Report\Service;
use Xentral\Components\Util\StringUtil;
use Xentral\Modules\Report\Data\ReportColumn;
class ReportColumnFormatter
{
/**
* @param ReportColumn $column
* @param string $targetColumn
*
* @return string
*/
public function formatColumnExpression(ReportColumn $column, string $targetColumn): string
{
switch ($column->getFormatType()) {
case ReportColumn::FORMAT_SUM_MONEY_DE:
$template = 'FORMAT(`%1$s`, 2, \'de_DE\') AS `%1$s`';
break;
case ReportColumn::FORMAT_SUM_MONEY_EN:
$template = 'FORMAT(`%1$s`, 2, \'en_EN\') AS `%1$s`';
break;
case ReportColumn::FORMAT_DATE_DMY:
$template = 'DATE_FORMAT(`%1$s`, \'%%d.%%m.%%Y\') AS `%1$s`';
break;
case ReportColumn::FORMAT_DATE_YMD:
$template = 'DATE_FORMAT(`%1$s`, \'%%Y.%%m.%%d\') AS `%1$s`';
break;
case ReportColumn::FORMAT_DATE_DMYHIS:
$template = 'DATE_FORMAT(`%1$s`, \'%%d.%%m.%%Y %%H:%%i:%%s\') AS `%1$s`';
break;
case ReportColumn::FORMAT_DATE_YMDHIS:
$template = 'DATE_FORMAT(`%1$s`, \'%%Y.%%m.%%d %%H:%%i:%%s\') AS `%1$s`';
break;
case ReportColumn::FORMAT_CUSTOM:
return $this->resolveCustomFormat($column->getFormatStatement(), $targetColumn);
default:
$template = '`%1$s`';
}
return sprintf($template, $targetColumn);
}
/**
* @param string $formatStatement
* @param string $targetColumn
*
* @return string
*/
private function resolveCustomFormat(string $formatStatement, string $targetColumn): string
{
$customFormat = $formatStatement;
if (preg_match('/(.*)\s?as\s?.+$/i', $formatStatement, $matches)) {
$customFormat = rtrim($matches[1]);
}
$statement = preg_replace('/{VALUE}/i', sprintf('`%s`', $targetColumn), $customFormat);
$statement .= sprintf(' AS `%s`', $targetColumn);
if (StringUtil::startsWith($statement, ' AS ')) {
return sprintf('`%s`', $targetColumn);
}
return $statement;
}
}
@@ -0,0 +1,153 @@
{
"name": "002 - Adressen einer Gruppe",
"description": "Gibt alle Adressen die keine Marketingsperre haben und sich aktuell in einer bestimmten Gruppe befinden, zur\u00fcck.",
"project": 0,
"sql_query": "SELECT\r\n a.`kundennummer`,\r\n CONCAT(UCASE(LEFT(a.`typ`, 1)), SUBSTRING(a.`typ`, 2)) AS `typ`,\r\n a.`name`,\r\n a.`ansprechpartner`,\r\n a.`strasse`,\r\n a.`plz`,\r\n a.`ort`,\r\n a.`email`,\r\n IF(a.`geburtstag` = '0000-00-00' OR ISNULL(a.`geburtstag`), NULL, a.`geburtstag`) AS geburtstag,\r\n IF(a.`lead` = 1, 'ja', 'nein') AS `lead`\r\nFROM adresse a\r\n LEFT JOIN adresse_rolle ar ON a.`id` = ar.`adresse`\r\n LEFT JOIN gruppen g ON ar.`parameter` = g.`id`\r\nWHERE ar.`subjekt` = 'Mitglied' AND ar.`objekt` = 'Gruppe' AND ar.`von` <= CURDATE() AND (ar.`bis` >= CURDATE() OR ar.`bis` = '0000-00-00') AND a.`geloescht` = 0\r\n AND IF('{MARKETINGSPERRE}'='Ja',a.`marketingsperre` != '1',1)\r\n AND IF('{GRUPPE}'<>'0',g.`kennziffer` = '{GRUPPE}',1)",
"columns": [
{
"key_name": "kundennummer",
"title": "Kundennummer",
"width": "19",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "typ",
"title": "Typ",
"width": "19",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "name",
"title": "Name",
"width": "19",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "ansprechpartner",
"title": "Ansprechpartner",
"width": "19",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "strasse",
"title": "Strasse",
"width": "19",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "plz",
"title": "Plz",
"width": "19",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "ort",
"title": "Ort",
"width": "19",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "email",
"title": "Email",
"width": "19",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "geburtstag",
"title": "Geburtstag",
"width": "19",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "lead",
"title": "Lead",
"width": "19",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Marketingsperre",
"default_value": "nein",
"displayname": "Mit Marketingsperre ausschlie\u00dfen",
"options": [
{
"Ja": "ja"
},
{
"Nein": "nein"
}
],
"description": "Schlie\u00dft Adressen mit Marketingsperre von der Ausgabe aus",
"editable": true,
"control_type": "combobox"
},
{
"varname": "Gruppe",
"default_value": "0",
"displayname": "Ausgabe auf Gruppe einschr\u00e4nken",
"options": [],
"description": "Kennziffer der Gruppe auf die die Ausgabe eingeschr\u00e4nkt werden soll",
"editable": true,
"control_type": "autocomplete_group"
}
],
"remark": "",
"category": "CRM & Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,83 @@
{
"name": "038 - Neu erstellte Adressen mit Vertrieb innerhalb eines Zeitraums",
"description": "Gibt alle neu erstellten Adressen innerhalb eines bestimmten Zeitraums mit zugeh\u00f6rigem Vertriebsmitarbeiter aus.",
"project": 0,
"sql_query": "SELECT op.zeitstempel AS angelegt_am, a.name AS adresse, v.name AS vertrieb \r\nFROM objekt_protokoll op \r\nLEFT JOIN adresse a ON op.objektid = a.id \r\nLEFT JOIN adresse v ON a.vertrieb = v.id \r\nWHERE op.objekt = 'adresse' AND op.action_long = 'adresse_create' \r\nAND IF('{VON}'=0,1,op.zeitstempel>='{VON}') AND IF('{BIS}'=0,1,op.zeitstempel<='{BIS}')",
"columns": [
{
"key_name": "angelegt_am",
"title": "Angelegt am",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmyhis"
},
{
"key_name": "adresse",
"title": "Adressname",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "vertrieb",
"title": "Vertriebsmitarbeiter",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "CRM & Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,83 @@
{
"name": "039 - Neu erstellte Kunden mit Vertrieb innerhalb eines Zeitraums",
"description": "Gibt alle Neukunden (erste Vergabe der Rolle Kunde) innerhalb eines bestimmten Zeitraums aus.",
"project": 0,
"sql_query": "SELECT ar.von AS angelegt_am, a.name AS adresse, v.name AS vertrieb\r\nFROM adresse_rolle ar \r\nLEFT JOIN adresse a ON ar.adresse = a.id\r\nLEFT JOIN adresse v ON a.vertrieb = v.id\r\nWHERE ar.subjekt LIKE 'Kunde' \r\nGROUP BY ar.adresse\r\nHAVING IF('{VON}'=0,1,MIN(ar.von)>='{VON}') AND IF('{BIS}'=0,1,MIN(ar.von)<='{BIS}')",
"columns": [
{
"key_name": "angelegt_am",
"title": "Angelegt am",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "adresse",
"title": "Adressname",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "vertrieb",
"title": "Vertriebsmitarbeiter",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "CRM & Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,75 @@
{
"name": "042 - Lager-Inhalt nach Projekt des Lagers",
"description": "",
"project": 0,
"sql_query": "SELECT\r\nlp.kurzbezeichnung AS kurzbezeichnung,\r\nIFNULL(plp.abkuerzung,'') AS projektlager,\r\nIFNULL(pa.abkuerzung,'') AS projektartikel,\r\na.name_de AS artikelname,\r\na.nummer AS artikelnummer,\r\nROUND(lpi.menge,1) AS menge\r\nFROM lager_platz_inhalt AS lpi\r\nJOIN lager_platz lp on lpi.lager_platz = lp.id\r\nLEFT JOIN projekt plp ON lp.projekt = plp.id\r\nJOIN artikel a ON lpi.artikel = a.id\r\nLEFT JOIN projekt pa ON a.projekt = pa.id\r\nWHERE IF('{PROJEKT}'='0',1,'{PROJEKT}'=plp.abkuerzung)",
"columns": [
{
"key_name": "kurzbezeichnung",
"title": "Lagerplatz",
"width": "31",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic"
},
{
"key_name": "projektlager",
"title": "Projektlager",
"width": "31",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic"
},
{
"key_name": "artikelname",
"title": "Artikelname",
"width": "31",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic"
},
{
"key_name": "artikelnummer",
"title": "Artikelnummer",
"width": "31",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic"
},
{
"key_name": "projektartikel",
"title": "Projektartikel",
"width": "31",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic"
},
{
"key_name": "menge",
"title": "Menge",
"width": "31",
"alignment": "right",
"sum": 1,
"sorting": "numeric"
}
],
"parameters": [
{
"varname": "Projekt",
"default_value": "0",
"displayname": "(optional) Projekt zur Eingrenzung",
"options": [],
"description": "Grenzt das Ergebnis auf Lagerpl\u00e4tze ein die zum Projekt geh\u00f6ren",
"editable": true,
"control_type": "autocomplete_project"
}
],
"remark": "",
"category": "Lager \u0026 Logistik",
"share": {
"file_public": true,
"file_pdf_enabled" :true,
"file_csv_enabled" :true,
"file_xls_enabled" :true
}
}
@@ -0,0 +1,75 @@
{
"name": "043 - Lager-Inhalt nach Projekt des Lagers",
"description": "",
"project": 0,
"sql_query": "SELECT\r\nlp.kurzbezeichnung AS kurzbezeichnung,\r\nIFNULL(plp.abkuerzung,'') AS projektlager,\r\nIFNULL(pa.abkuerzung,'') AS projektartikel,\r\na.name_de AS artikelname,\r\na.nummer AS artikelnummer,\r\nROUND(lpi.menge,1) AS menge\r\nFROM lager_platz_inhalt AS lpi\r\nJOIN lager_platz lp on lpi.lager_platz = lp.id\r\nLEFT JOIN projekt plp ON lp.projekt = plp.id\r\nJOIN artikel a ON lpi.artikel = a.id\r\nLEFT JOIN projekt pa ON a.projekt = pa.id\r\nWHERE IF('{PROJEKT}'='0',1,'{PROJEKT}'=pa.abkuerzung)",
"columns": [
{
"key_name": "kurzbezeichnung",
"title": "Kurzbezeichnung",
"width": "31",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic"
},
{
"key_name": "projektlager",
"title": "Projektlager",
"width": "31",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic"
},
{
"key_name": "projektartikel",
"title": "Projektartikel",
"width": "31",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic"
},
{
"key_name": "artikelname",
"title": "Artikelname",
"width": "31",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic"
},
{
"key_name": "artikelnummer",
"title": "Artikelnummer",
"width": "31",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic"
},
{
"key_name": "menge",
"title": "Menge",
"width": "31",
"alignment": "right",
"sum": 1,
"sorting": "numeric"
}
],
"parameters": [
{
"varname": "Projekt",
"default_value": "0",
"displayname": "(optional) Projekt zur Eingrenzung",
"options": [],
"description": "Grenzt das Ergebnis auf Artikel ein die zum Projekt geh\u00f6ren",
"editable": true,
"control_type": "autocomplete_project"
}
],
"remark": "",
"category": "Lager \u0026 Logistik",
"share": {
"file_public": true,
"file_pdf_enabled" :true,
"file_csv_enabled" :true,
"file_xls_enabled" :true
}
}
@@ -0,0 +1,121 @@
{
"name": "047 - Funnel: Notizen pro Mitarbeiter",
"description": "Summiert innerhalb eines bestimmten Zeitraums die Anzahl der Nachrichten im Verlauf einer Wiedervorlage je Mitarbeiter auf.",
"project": 0,
"sql_query": "SELECT\r\n CASE\r\n WHEN '{GRUPPIERUNG}'='tag' THEN w.time\r\n WHEN '{GRUPPIERUNG}'='woche' THEN date_add(w.time, interval-WEEKDAY(w.time) day)\r\n WHEN '{GRUPPIERUNG}'='monat' THEN ADDDATE(LAST_DAY(SUBDATE(w.time, INTERVAL 1 MONTH)), 1)\r\n WHEN '{GRUPPIERUNG}'='quartal' THEN MAKEDATE(YEAR(w.time), 1) + INTERVAL QUARTER(w.time) QUARTER - INTERVAL 1 QUARTER\r\n ELSE MAKEDATE(YEAR(w.time), 1)\r\n END AS von,\r\n CASE\r\n WHEN '{GRUPPIERUNG}'='tag' THEN w.time\r\n WHEN '{GRUPPIERUNG}'='woche' THEN date_add(date_add(w.time, interval -WEEKDAY(w.time) day), interval 6 day)\r\n WHEN '{GRUPPIERUNG}'='monat' THEN LAST_DAY(w.time)\r\n WHEN '{GRUPPIERUNG}'='quartal' THEN MAKEDATE(YEAR(w.time), 1) + INTERVAL QUARTER(w.time) QUARTER - INTERVAL 1 DAY\r\n ELSE LAST_DAY(DATE_ADD(w.time, INTERVAL 12-MONTH(w.time) MONTH))\r\n END AS bis,\r\n a.name,\r\n COUNT(w.id) AS anzahl\r\nFROM wiedervorlage_timeline w\r\nLEFT JOIN adresse a ON w.adresse_mitarbeiter = a.id\r\nWHERE w.fix = 0 AND IF('{VON}'=0,1,w.time>='{VON}') AND IF('{BIS}'=0,1,w.time<='{BIS}')\r\nGROUP BY\r\n CASE\r\n WHEN '{GRUPPIERUNG}'='tag' THEN w.time\r\n WHEN '{GRUPPIERUNG}'='woche' THEN WEEK(w.time)\r\n WHEN '{GRUPPIERUNG}'='monat' THEN MONTH(w.time)\r\n WHEN '{GRUPPIERUNG}'='quartal' THEN QUARTER(w.time)\r\n ELSE YEAR(w.time)\r\n END,\r\n w.adresse_mitarbeiter",
"columns": [
{
"key_name": "name",
"title": "Name",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "anzahl",
"title": "Anzahl",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "von",
"title": "Von",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy",
"format_statement": null
},
{
"key_name": "bis",
"title": "Bis",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy",
"format_statement": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Gruppierung",
"default_value": "tag",
"displayname": "Gruppierungszeitraum",
"options": [
{
"Tag": "tag"
},
{
"Woche": "woche"
},
{
"Monat": "monat"
},
{
"Quartal": "quartal"
},
{
"Jahr": "jahr"
}
],
"description": "Auswahl des Zeitraums \u00fcber den gruppiert werden soll",
"editable": true,
"control_type": "combobox"
}
],
"remark": "",
"category": "Team & Projektmanagement",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,131 @@
{
"name": "048 - Funnel: Termine pro Mitarbeiter",
"description": "",
"project": 0,
"sql_query": "SELECT\r\nCASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN w.datum_erinnerung\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(w.datum_erinnerung - INTERVAL (WEEKDAY(w.datum_erinnerung)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN (w.datum_erinnerung - INTERVAL (DAYOFMONTH(w.datum_erinnerung) - 1) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(w.datum_erinnerung), 1) + INTERVAL QUARTER(w.datum_erinnerung) QUARTER - INTERVAL 1 QUARTER\r\n ELSE MAKEDATE(YEAR(w.datum_erinnerung), 1)\r\n END AS von,\r\nCASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN w.datum_erinnerung\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(w.datum_erinnerung + INTERVAL (6 - WEEKDAY(w.datum_erinnerung)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN LAST_DAY(w.datum_erinnerung)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(w.datum_erinnerung), 1) + INTERVAL QUARTER(w.datum_erinnerung) QUARTER - INTERVAL 1 DAY\r\n ELSE LAST_DAY(DATE_ADD(CURDATE(), INTERVAL 12-MONTH(CURDATE()) MONTH))\r\n END AS bis,\r\nCASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN WEEK(w.datum_erinnerung) + 1\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(w.datum_erinnerung) + 1\r\n ELSE ''\r\n END AS kw,\r\n a.name,\r\n COUNT(w.id) AS anzahl\r\nFROM wiedervorlage w \r\nLEFT JOIN adresse a ON w.bearbeiter = a.id \r\nWHERE w.abgeschlossen = 0 AND IF('{VON}'=0,1,w.datum_erinnerung>='{VON}') AND IF('{BIS}'=0,1,w.datum_erinnerung<='{BIS}')\r\nGROUP BY w.bearbeiter, \r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN w.datum_erinnerung\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(w.datum_erinnerung)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN MONTH(w.datum_erinnerung)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN QUARTER(w.datum_erinnerung)\r\n ELSE YEAR(w.datum_erinnerung)\r\n END",
"columns": [
{
"key_name": "von",
"title": "Von",
"width": "20",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy",
"format_statement": null
},
{
"key_name": "bis",
"title": "Bis",
"width": "20",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy",
"format_statement": null
},
{
"key_name": "kw",
"title": "Kw",
"width": "10",
"alignment": "center",
"sorting": "numeric",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "name",
"title": "Name",
"width": "30",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "anzahl",
"title": "Anzahl",
"width": "30",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null,
"format_statement": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Gruppierung",
"default_value": "tag",
"displayname": "Gruppierungszeitraum",
"options": [
{
"Tag": "tag"
},
{
"Woche": "woche"
},
{
"Monat": "monat"
},
{
"Quartal": "quartal"
},
{
"Jahr": "jahr"
}
],
"description": "Auswahl des Zeitraums \u00fcber den gruppiert werden soll",
"editable": true,
"control_type": "combobox"
}
],
"remark": "",
"category": "Team & Projektmanagement",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,117 @@
{
"name": "049 - Funnel: Cards mit Prio pro Mitarbeiter",
"description": "Alle nicht abgeschlossenen Wiedervorlagen mit Prio je Verantwortlicher aufsummiert.",
"project": 0,
"sql_query": "SELECT CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN DATE_FORMAT(w.datum_erinnerung, '%d.%m.%Y')\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE_FORMAT(\r\n date_add(w.datum_erinnerung, interval -WEEKDAY(w.datum_erinnerung) day), '%d.%m.%Y')\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN DATE_FORMAT(\r\n ADDDATE(LAST_DAY(SUBDATE(w.datum_erinnerung, INTERVAL 1 MONTH)), 1), '%d.%m.%Y')\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN DATE_FORMAT(\r\n MAKEDATE(YEAR(w.datum_erinnerung), 1) + INTERVAL QUARTER(w.datum_erinnerung) QUARTER -\r\n INTERVAL 1 QUARTER, '%d.%m.%Y')\r\n ELSE DATE_FORMAT(w.datum_erinnerung, '01.01.%Y')\r\n END AS von,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN DATE_FORMAT(w.datum_erinnerung, '%d.%m.%Y')\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE_FORMAT(\r\n date_add(date_add(w.datum_erinnerung, interval -WEEKDAY(w.datum_erinnerung) day), interval 6 day),\r\n '%d.%m.%Y')\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN DATE_FORMAT(LAST_DAY(w.datum_erinnerung), '%d.%m.%Y')\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN DATE_FORMAT(\r\n MAKEDATE(YEAR(w.datum_erinnerung), 1) + INTERVAL QUARTER(w.datum_erinnerung) QUARTER -\r\n INTERVAL 1 DAY, '%d.%m.%Y')\r\n ELSE DATE_FORMAT(w.datum_erinnerung, '31.12.%Y')\r\n END AS bis,\r\n a.name,\r\n COUNT(w.id) AS anzahl\r\nFROM wiedervorlage w\r\n LEFT JOIN adresse a ON w.bearbeiter = a.id\r\nWHERE w.prio = 1\r\n AND w.abgeschlossen = 0\r\n AND IF('{VON}' = 0, 1, w.datum_erinnerung >= '{VON}')\r\n AND IF('{BIS}' = 0, 1, w.datum_erinnerung <= '{BIS}')\r\nGROUP BY CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN w.datum_erinnerung\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(w.datum_erinnerung)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN MONTH(w.datum_erinnerung)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN QUARTER(w.datum_erinnerung)\r\n ELSE YEAR(w.datum_erinnerung)\r\n END,\r\n w.bearbeiter",
"columns": [
{
"key_name": "name",
"title": "Name",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "anzahl",
"title": "Anzahl",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "von",
"title": "Von",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "bis",
"title": "Bis",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Gruppierung",
"default_value": "tag",
"displayname": "Gruppierungszeitraum",
"options": [
{
"Tag": "tag"
},
{
"Woche": "woche"
},
{
"Monat": "monat"
},
{
"Quartal": "quartal"
},
{
"Jahr": "jahr"
}
],
"description": "Auswahl des Zeitraums \u00fcber den gruppiert werden soll",
"editable": true,
"control_type": "combobox"
}
],
"remark": "",
"category": "Team & Projektmanagement",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,117 @@
{
"name": "050 - Funnel: Cards pro Mitarbeiter",
"description": "Alle nicht abgeschlossenen Wiedervorlagen je Verantwortlicher aufsummiert, unabh\u00e4ngig ob mit Prio oder nicht.",
"project": 0,
"sql_query": "SELECT \r\nCASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN w.datum_erinnerung\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(w.datum_erinnerung - INTERVAL (WEEKDAY(w.datum_erinnerung)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN (w.datum_erinnerung - INTERVAL (DAYOFMONTH(w.datum_erinnerung) - 1) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(w.datum_erinnerung), 1) + INTERVAL QUARTER(w.datum_erinnerung) QUARTER - INTERVAL 1 QUARTER\r\n ELSE MAKEDATE(YEAR(w.datum_erinnerung), 1)\r\n END AS von,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN w.datum_erinnerung\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(w.datum_erinnerung + INTERVAL (6 - WEEKDAY(w.datum_erinnerung)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN LAST_DAY(w.datum_erinnerung)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(w.datum_erinnerung), 1) + INTERVAL QUARTER(w.datum_erinnerung) QUARTER - INTERVAL 1 DAY\r\n ELSE LAST_DAY(DATE_ADD(w.datum_erinnerung, INTERVAL 12-MONTH(w.datum_erinnerung) MONTH))\r\n END AS bis,\r\na.name, \r\nCOUNT(w.id) AS anzahl\r\nFROM wiedervorlage w \r\nLEFT JOIN adresse a ON w.bearbeiter = a.id\r\nWHERE w.abgeschlossen = 0\r\nGROUP BY w.bearbeiter,\r\nCASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN w.datum_erinnerung\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(w.datum_erinnerung)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN MONTH(w.datum_erinnerung)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN QUARTER(w.datum_erinnerung)\r\n ELSE YEAR(w.datum_erinnerung)\r\n END",
"columns": [
{
"key_name": "name",
"title": "Name",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "anzahl",
"title": "Anzahl",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "von",
"title": "Von",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "bis",
"title": "Bis",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Gruppierung",
"default_value": "tag",
"displayname": "Gruppierungszeitraum",
"options": [
{
"Tag": "tag"
},
{
"Woche": "woche"
},
{
"Monat": "monat"
},
{
"Quartal": "quartal"
},
{
"Jahr": "jahr"
}
],
"description": "Auswahl des Zeitraums \u00fcber den gruppiert werden soll",
"editable": true,
"control_type": "combobox"
}
],
"remark": "",
"category": "Team & Projektmanagement",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,117 @@
{
"name": "051 - Funnel: Neue Cards pro Mitarbeiter (letzte KW)",
"description": "Alle (offenen und abgeschlossenen) Wiedervorlagen die in Zeitraum X angelegt wurden, je Verantwortlicher aufsummiert.",
"project": 0,
"sql_query": "SELECT CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN w.datum_angelegt\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(w.datum_angelegt - INTERVAL (WEEKDAY(w.datum_angelegt)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN (w.datum_angelegt - INTERVAL (DAYOFMONTH(w.datum_angelegt) - 1) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(w.datum_angelegt), 1) + INTERVAL QUARTER(w.datum_angelegt) QUARTER - INTERVAL 1 QUARTER\r\n ELSE MAKEDATE(YEAR(w.datum_angelegt), 1)\r\n END AS von,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN w.datum_angelegt\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(w.datum_angelegt + INTERVAL (6 - WEEKDAY(w.datum_angelegt)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN LAST_DAY(w.datum_angelegt)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(w.datum_angelegt), 1) + INTERVAL QUARTER(w.datum_angelegt) QUARTER - INTERVAL 1 DAY\r\n ELSE LAST_DAY(DATE_ADD(w.datum_angelegt, INTERVAL 12-MONTH(w.datum_angelegt) MONTH))\r\n END AS bis,\r\n a.name,\r\n COUNT(w.id) AS anzahl\r\nFROM wiedervorlage w\r\n LEFT JOIN adresse a ON w.bearbeiter = a.id\r\nWHERE IF('{VON}' = 0, 1, w.datum_angelegt >= '{VON}')\r\n AND IF('{BIS}' = 0, 1, w.datum_angelegt <= '{BIS}')\r\nGROUP BY CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN w.datum_angelegt\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(w.datum_angelegt)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN MONTH(w.datum_angelegt)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN QUARTER(w.datum_angelegt)\r\n ELSE YEAR(w.datum_angelegt)\r\n END, w.bearbeiter",
"columns": [
{
"key_name": "name",
"title": "Name",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "anzahl",
"title": "Anzahl",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "von",
"title": "Von",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "bis",
"title": "Bis",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Gruppierung",
"default_value": "tag",
"displayname": "Gruppierungszeitraum",
"options": [
{
"Tag": "tag"
},
{
"Woche": "woche"
},
{
"Monat": "monat"
},
{
"Quartal": "quartal"
},
{
"Jahr": "jahr"
}
],
"description": "Auswahl des Zeitraums \u00fcber den gruppiert werden soll",
"editable": true,
"control_type": "combobox"
}
],
"remark": "",
"category": "Team & Projektmanagement",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,101 @@
{
"name": "052 - Auflistung offene Angebote \u00fcber Betrag X",
"description": "Alle freigegebenen Angebote mit einem h\u00f6heren Nettoumsatz als X Euro.",
"project": 0,
"sql_query": "SELECT \r\na.datum AS datum, \r\na.belegnr, \r\na.kundennummer, \r\na.name,\r\na.umsatz_netto AS summe,\r\na.waehrung AS waehrung\r\nFROM angebot a \r\nWHERE a.status = 'freigegeben' AND a.umsatz_netto > {UMSATZ}",
"columns": [
{
"key_name": "summe",
"title": "Summe",
"width": "47",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "waehrung",
"title": "W\u00e4hrung",
"width": "47",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "datum",
"title": "Datum",
"width": "47",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "belegnr",
"title": "Belegnr",
"width": "47",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "kundennummer",
"title": "Kundennummer",
"width": "47",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "name",
"title": "Name",
"width": "47",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Umsatz",
"default_value": "0",
"displayname": "Angebote mit h\u00f6herer Summe als",
"options": [],
"description": "Gibt die Nettosumme an ab der Angebote angezeigt werden sollen",
"editable": true,
"control_type": ""
}
],
"remark": "",
"category": "Angebots \u0026 Auftragsmanagement",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,115 @@
{
"name": "053 - Auflistung Auftr\u00e4ge pro Mitarbeiter",
"description": "Gibt die Anzahl der freigegebenen Auftr\u00e4ge je Bearbeiter innerhalb eines bestimmten Zeitraums aus.",
"project": 0,
"sql_query": "SELECT \r\nIF('{GRUPPIERUNG}'='tag', DATE_FORMAT(auf.datum,'%d.%m.%Y'),\r\n IF('{GRUPPIERUNG}'='woche', DATE_FORMAT(date_add(auf.datum, interval-WEEKDAY(auf.datum) day),'%d.%m.%Y'),\r\n IF('{GRUPPIERUNG}'='monat', DATE_FORMAT(ADDDATE(LAST_DAY(SUBDATE(auf.datum, INTERVAL 1 MONTH)), 1),'%d.%m.%Y'),\r\n IF('{GRUPPIERUNG}'='quartal', DATE_FORMAT(MAKEDATE(YEAR(auf.datum), 1) + INTERVAL QUARTER(auf.datum) QUARTER - INTERVAL 1 QUARTER ,'%d.%m.%Y'),\r\n DATE_FORMAT(auf.datum,'01.01.%Y'))))) AS von,\r\n IF('{GRUPPIERUNG}'='tag', DATE_FORMAT(auf.datum,'%d.%m.%Y'),\r\n IF('{GRUPPIERUNG}'='woche', DATE_FORMAT(date_add(date_add(auf.datum, interval -WEEKDAY(auf.datum) day), interval 6 day),'%d.%m.%Y'),\r\n IF('{GRUPPIERUNG}'='monat', DATE_FORMAT(LAST_DAY(auf.datum),'%d.%m.%Y'),\r\n IF('{GRUPPIERUNG}'='quartal', DATE_FORMAT(MAKEDATE(YEAR(auf.datum), 1) + INTERVAL QUARTER(auf.datum) QUARTER - INTERVAL 1 DAY,'%d.%m.%Y'),\r\n DATE_FORMAT(auf.datum,'31.12.%Y')))))AS bis, \r\n a.mitarbeiternummer, \r\n a.name as bearbeiter,\r\n COUNT(auf.id) AS anzahl, \r\n SUM(auf.umsatz_netto) AS umsatznetto\r\nFROM adresse a \r\nLEFT JOIN auftrag auf ON a.id = auf.bearbeiterid\r\nWHERE auf.status='freigegeben' AND a.mitarbeiternummer<>'' AND IF('{VON}'=0,1,auf.datum>='{VON}') AND IF('{BIS}'=0,1,auf.datum<='{BIS}')\r\nGROUP BY \r\n IF('{GRUPPIERUNG}'='tag',auf.datum, \r\n IF('{GRUPPIERUNG}'='woche',WEEK(auf.datum),\r\n IF('{GRUPPIERUNG}'='monat',MONTH(auf.datum),\r\n IF('{GRUPPIERUNG}'='quartal',QUARTER(auf.datum),\r\n YEAR(auf.datum))))),\r\na.id",
"columns": [
{
"key_name": "mitarbeiternummer",
"title": "Mitarbeiternummer",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "bearbeiter",
"title": "Bearbeiter",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "anzahl",
"title": "Anzahl Auftr\u00e4ge",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "umsatznetto",
"title": "Umsatz (netto)",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de"
},
{
"key_name": "von",
"title": "Von",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "bis",
"title": "Bis",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Gruppierung",
"default_value": "tag",
"displayname": "Gruppierungszeitraum",
"options": [
{
"Tag": "tag"
},
{
"Woche": "woche"
},
{
"Monat": "monat"
},
{
"Quartal": "quartal"
},
{
"Jahr": "jahr"
}
],
"description": "Auswahl des Zeitraums \u00fcber den gruppiert werden soll",
"editable": true,
"control_type": "combobox"
}
],
"remark": "",
"category": "Angebots \u0026 Auftragsmanagement",
"share": {
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true
}
}
@@ -0,0 +1,108 @@
{
"name": "054 - Jahres-Bestseller",
"description": "",
"project": 0,
"sql_query": "SELECT\r\n x.abkuerzung AS projekt,\r\n x.name_de AS artikel,\r\n x.nummer AS artikelnummer,\r\n x.menge AS menge,\r\n x.einzeln AS einzelpreis,\r\n x.gesamt AS gesamt,\r\n x.dbp AS dbprozent,\r\n x.dbv AS dbeuro\r\nFROM \r\n (SELECT\r\n SUM(ap.menge) as menge,\r\n art.nummer,\r\n art.name_de,\r\n p.abkuerzung,\r\n SUM(ap.preis*ap.menge)\/SUM(ap.menge)as einzeln,\r\n SUM(ap.preis*ap.menge) as gesamt,\r\n AVG(ap.deckungsbeitrag)*100 as dbp,\r\n AVG(ap.preis-ap.einkaufspreis) as dbv\r\n FROM auftrag_position AS ap\r\n INNER JOIN auftrag AS a ON ap.auftrag = a.id\r\n INNER JOIN artikel AS art ON ap.artikel = art.id\r\n LEFT JOIN projekt p ON p.id=art.projekt\r\n WHERE art.porto != 1 AND art.rabatt != 1 AND a.status <> 'storniert' AND IF('{VON}'=0,1,a.datum>='{VON}') AND IF('{BIS}'=0,1,a.datum<='{BIS}') GROUP BY art.id) AS x",
"columns": [
{
"key_name": "menge",
"title": "Menge",
"width": "23",
"alignment": "right",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "artikelnummer",
"title": "Artikelnummer",
"width": "23",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "artikel",
"title": "Artikel",
"width": "23",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "projekt",
"title": "Projekt",
"width": "23",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "einzelpreis",
"title": "Einzelpreis",
"width": "23",
"alignment": "right",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de"
},
{
"key_name": "gesamt",
"title": "Gesamt",
"width": "23",
"alignment": "right",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de"
},
{
"key_name": "dbprozent",
"title": "DB in %",
"width": "23",
"alignment": "right",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de"
},
{
"key_name": "dbeuro",
"title": "DB in Euro",
"width": "23",
"alignment": "right",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de"
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "CRM \u0026 Vertrieb",
"share": {
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true
}
}
@@ -0,0 +1,110 @@
{
"name": "055 - Paketmarken (DPD) mit Tracking innerhalb eines Zeitraums",
"description": "Erzeugte Paketmarken mit Trackingnummer von DPD innerhalb eines bestimmten Zeitraums.",
"project": 0,
"sql_query": "SELECT v.versendet_am AS versendet_am, l.belegnr, l.kundennummer, l.name, l.land, v.tracking\r\nFROM versand v \r\nLEFT JOIN lieferschein l ON v.lieferschein = l.id\r\nWHERE v.abgeschlossen = 1 AND IF('{VON}'=0,1,v.versendet_am>='{VON}') AND IF('{BIS}'=0,1,v.versendet_am<='{BIS}') AND v.versandart LIKE 'dpdapi'",
"columns": [
{
"key_name": "land",
"title": "Land",
"width": "",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic",
"format_type": null
},
{
"key_name": "tracking",
"title": "Tracking",
"width": "",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic",
"format_type": null
},
{
"key_name": "versendet_am",
"title": "Versendet am",
"width": "",
"alignment": "left",
"sum": 0,
"sorting": "numeric",
"format_type": "date_dmy"
},
{
"key_name": "belegnr",
"title": "Belegnr.",
"width": "",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic",
"format_type": null
},
{
"key_name": "kundennummer",
"title": "Kundennr.",
"width": "",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic",
"format_type": null
},
{
"key_name": "name",
"title": "Name",
"width": "",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic",
"format_type": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "Lager \u0026 Logistik",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,110 @@
{
"name": "056 - Paketmarken (DHL) mit Tracking innerhalb eines Zeitraums",
"description": "Erzeugte Paketmarken mit Trackingnummer von DHL innerhalb eines bestimmten Zeitraums.",
"project": 0,
"sql_query": "SELECT v.versendet_am, l.belegnr, l.kundennummer, l.name, l.land, v.tracking\r\nFROM versand v \r\nLEFT JOIN lieferschein l ON v.lieferschein = l.id\r\nWHERE v.abgeschlossen = 1 AND IF('{VON}'=0,1,v.versendet_am>='{VON}') AND IF('{BIS}'=0,1,v.versendet_am<='{BIS}') AND v.versandart LIKE 'dhlversenden'",
"columns": [
{
"key_name": "versendet_am",
"title": "Versendet am",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "belegnr",
"title": "Belegnr.",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "kundennummer",
"title": "Kundennr.",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "name",
"title": "Name",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "land",
"title": "Land",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "tracking",
"title": "Tracking",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "Lager & Logistik",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,173 @@
{
"name": "057 - Zeiterfassung: Projektzeiten und T\u00e4tigkeiten",
"description": "",
"project": 0,
"sql_query": "SELECT\r\nz.von AS datum,\r\nz.von AS von,\r\nz.bis AS bis,\r\nROUND(TIMESTAMPDIFF(MINUTE,z.von, z.bis)\/60,2) AS dauer,\r\na.mitarbeiternummer AS mitarbeiternummer,\r\na.name AS mitarbeiter,\r\nz.aufgabe AS aufgabe,\r\nz.beschreibung AS beschreibung,\r\nIFNULL(p.abkuerzung,'') AS projekt,\r\nIF(z.abrechnen=1,'Ja','Nein') AS abrechnen,\r\nIF(z.abgerechnet=1,'Ja','Nein') AS abgerechnet\r\nFROM zeiterfassung AS z\r\nJOIN adresse AS a ON z.adresse = a.id\r\nLEFT JOIN projekt p ON z.projekt = p.id\r\nWHERE \r\nIF('{VON}'=0,1,z.von>='{VON}') AND \r\nIF('{BIS}'=0,1,z.bis<='{BIS}') AND \r\nIF('{PROJEKT}'='0',1,'{PROJEKT}'=p.abkuerzung) AND\r\nIF('{MITARBEITERNUMMER}'='0',1,'{MITARBEITERNUMMER}'=a.mitarbeiternummer)",
"columns": [
{
"key_name": "datum",
"title": "Datum",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "von",
"title": "Von",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "bis",
"title": "Bis",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "dauer",
"title": "Dauer",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 1,
"format_type": null
},
{
"key_name": "mitarbeiter",
"title": "Mitarbeiter",
"width": "17",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "mitarbeiternummer",
"title": "Mitarbeiternummer",
"width": "17",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "aufgabe",
"title": "Aufgabe",
"width": "17",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "beschreibung",
"title": "Beschreibung",
"width": "17",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "projekt",
"title": "Projekt",
"width": "17",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "abrechnen",
"title": "Abrechnen",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "abgerechnet",
"title": "Abgerechnet",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Projekt",
"default_value": "0",
"displayname": "(optional)Projekt zur Eingrenzung",
"options": [],
"description": "Grenzt die Aufgabe auf ein spezifisches Projekt ein",
"editable": true,
"control_type": "autocomplete_project"
},
{
"varname": "Mitarbeiternummer",
"default_value": "0",
"displayname": "Mitarbeiternummer",
"options": [],
"description": "(Optional) Ausgabe eingrenzen auf spezifische Mitarbeiternummer",
"editable": true,
"control_type": ""
}
],
"remark": "",
"category": "Team & Projektmanagement",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,71 @@
{
"name": "065 - Artikel mit knappem MHD",
"description": "Artikel mit knappem MHD. Wenn kein Wert angegen wird, werden alle Artikel angezeigt die in den n\u00e4chsten 30 Tagen ablaufen.",
"project": 0,
"sql_query": "SELECT a.name_de AS artikelname,\r\n a.nummer AS artikelnummer,\r\n ml.bestand AS bestand,\r\n DATEDIFF(ml.mhddatum, NOW()) tagebisablauf,\r\n ml.mhddatum AS ablaufdatum\r\nFROM artikel AS a\r\nJOIN mhd_log ml on a.id = ml.artikel\r\nJOIN (SELECT MAX(id) AS id FROM mhd_log GROUP BY artikel, mhddatum) AS mlid ON mlid.id = ml.id\r\nWHERE a.mindesthaltbarkeitsdatum=1 AND a.geloescht=0 AND a.intern_gesperrt=0 AND a.nummer <>'DEL' AND ml.bestand > 0\r\nAND ml.mhddatum < DATE_ADD(NOW(), INTERVAL {BIS} DAY)",
"columns": [
{
"key_name": "artikelname",
"title": "Artikelname",
"width": "20",
"alignment": "left",
"sum": 0,
"format_type": null,
"sorting": "alphabetic"
},
{
"key_name": "artikelnummer",
"title": "Artikelnummer",
"width": "20",
"alignment": "left",
"sum": 0,
"format_type": null,
"sorting": "alphabetic"
},
{
"key_name": "ablaufdatum",
"title": "Ablaufdatum",
"width": "20",
"alignment": "left",
"sum": 0,
"format_type": "date_dmy",
"sorting": "numeric"
},
{
"key_name": "bestand",
"title": "Bestand",
"width": "20",
"alignment": "right",
"sum": 1,
"format_type": "sum_money_de",
"sorting": "numeric"
},
{
"key_name": "tagebisablauf",
"title": "Tage bis Ablauf",
"width": "20",
"alignment": "right",
"sum": 0,
"format_type": null,
"sorting": "numeric"
}
],
"parameters": [
{
"varname": "Bis",
"default_value": "30",
"displayname": "Tage bis Ablauf",
"options": [],
"description": "Filtert nach den Best\u00e4nden bei denen das Ablaufdatum vor dem eingegeben Wert liegt",
"editable": true
}
],
"remark": "",
"category": "Einkauf \u0026 Artikelverwaltung \u0028PIM\u0029",
"share": {
"file_public": true,
"file_pdf_enabled" :true,
"file_csv_enabled" :true,
"file_xls_enabled" :true
}
}
@@ -0,0 +1,192 @@
{
"name": "074 - Auswertung der Kostenstelle",
"description": "",
"project": 0,
"sql_query": "SELECT\r\nif('{TYP}'='ja',CONCAT(UPPER(LEFT(k.typ, 1)), \r\n LOWER(SUBSTRING(k.typ, 2))) ,'') AS typ,\r\nCASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN k.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(k.datum - INTERVAL (WEEKDAY(k.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN (k.datum - INTERVAL (DAYOFMONTH(k.datum) - 1) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(k.datum), 1) + INTERVAL QUARTER(k.datum) QUARTER - INTERVAL 1 QUARTER\r\n ELSE MAKEDATE(YEAR(k.datum), 1)\r\n END AS von,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN k.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(k.datum + INTERVAL (6 - WEEKDAY(k.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN LAST_DAY(k.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(k.datum), 1) + INTERVAL QUARTER(k.datum) QUARTER - INTERVAL 1 DAY\r\n ELSE LAST_DAY(DATE_ADD(k.datum, INTERVAL 12-MONTH(k.datum) MONTH))\r\n END AS bis,\r\nk.kostenstelle AS kostenstelle,\r\nSUM(k.eingang) AS eingang,\r\nSUM(k.ausgang) AS ausgang,\r\nSUM(k.eingang-k.ausgang) AS ergebnis\r\n FROM\r\n(SELECT '{EINGANGSBASIS}' AS typ, b.datum,b.kostenstelle, SUM(b.summe) AS eingang, 0 AS ausgang FROM (\r\n SELECT\r\n b.datum,\r\n IF(bp.kostenstelle<>'',bp.kostenstelle,b.kostenstelle) As kostenstelle,\r\n bp.umsatz_netto_gesamt AS summe\r\n FROM {EINGANGSBASIS} b\r\n JOIN {EINGANGSBASIS}_position bp ON b.id = bp.{EINGANGSBASIS}\r\n WHERE (b.kostenstelle<>'' OR bp.kostenstelle<>'') AND b.status<>'angelegt' AND b.status<>'storniert' AND IF('{VON}'=0,1,b.datum>='{VON}') AND IF('{BIS}'=0,1,b.datum<='{BIS}')\r\n ) AS b\r\nGROUP BY b.datum, b.kostenstelle\r\nUNION ALL\r\nSELECT '{AUSGANGSBASIS}' AS typ, b.datum, b.kostenstelle, 0 AS eingang, SUM(b.summe) AS ausgang FROM (\r\nSELECT\r\n b.datum,\r\n IF(bp.kostenstelle<>'',bp.kostenstelle,b.kostenstelle) As kostenstelle,\r\n bp.preis AS summe\r\n FROM bestellung b\r\n JOIN bestellung_position bp ON b.id = bp.bestellung\r\n WHERE (b.kostenstelle<>'' OR bp.kostenstelle<>'') AND b.status<>'angelegt' AND b.status<>'storniert' AND IF('{VON}'=0,1,b.datum>='{VON}') AND IF('{BIS}'=0,1,b.datum<='{BIS}') AND '{AUSGANGSBASIS}'='bestellung'\r\n) AS b\r\nGROUP BY b.datum, b.kostenstelle\r\nUNION ALL\r\nSELECT\r\n'kontoauszug' AS typ, k.originalbuchung AS datum, k.kostenstelle AS kostenstelle, SUM(haben) AS eingang, SUM(soll) AS ausgang\r\nFROM kontoauszuege AS k\r\nWHERE k.datev_abgeschlossen=1 AND k.kostenstelle<>'' AND IF('{VON}'=0,1,k.originalbuchung>='{VON}') AND IF('{BIS}'=0,1,k.originalbuchung<='{BIS}')\r\nGROUP BY k.kostenstelle, k.originalbuchung\r\nUNION ALL\r\nSELECT 'Verbindlichkeit' AS typ, v.datum,v.kostenstelle, 0 AS eingang, SUM(IF(v.betrag<>'',v.betrag,v.summe)) AS ausgang FROM (\r\nSELECT\r\n b.rechnungsdatum AS datum,\r\n b.kostenstelle AS kostenstelle,\r\n b.betrag AS betrag,\r\n bp.preis AS summe\r\n FROM verbindlichkeit b\r\n LEFT JOIN verbindlichkeit_position bp ON b.id = bp.bestellung\r\n WHERE b.kostenstelle<>'' AND b.status<>'angelegt' AND b.status<>'storniert' AND IF('{VON}'=0,1,b.rechnungsdatum>='{VON}') AND IF('{BIS}'=0,1,b.rechnungsdatum<='{BIS}') AND '{AUSGANGSBASIS}'='verbindlichkeit'\r\n) AS v\r\nGROUP BY v.datum, v.kostenstelle) AS k\r\nGROUP BY k.kostenstelle,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN k.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(k.datum)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN MONTH(k.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN QUARTER(k.datum)\r\n ELSE YEAR(k.datum)\r\n END,\r\nIF('{TYP}'='ja',k.typ,1)",
"columns": [
{
"key_name": "von",
"title": "Von",
"width": "38",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "bis",
"title": "Bis",
"width": "38",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "kostenstelle",
"title": "Kostenstelle",
"width": "38",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "eingang",
"title": "Eingang",
"width": "38",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "ausgang",
"title": "Ausgang",
"width": "38",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "typ",
"title": "Typ",
"width": "38",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "ergebnis",
"title": "Ergebnis",
"width": "38",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Eingangsbasis",
"default_value": "rechnung",
"displayname": "Basis f\u00fcr Eingangsberechnung",
"options": [
{
"Rechnung": "rechnung"
},
{
"Auftrag": "auftrag"
}
],
"description": "Basis f\u00fcr die Berechnung der eingehenden Werte",
"editable": true,
"control_type": "combobox"
},
{
"varname": "Ausgangsbasis",
"default_value": "verbindlichkeit",
"displayname": "Basis f\u00fcr Ausgangsberechnung",
"options": [
{
"Bestellung": "bestellung"
},
{
"Verbindlichkeit": "verbindlichkeit"
}
],
"description": "Basis f\u00fcr die Berechnung der ausgehenden Werte",
"editable": true,
"control_type": "combobox"
},
{
"varname": "Gruppierung",
"default_value": "tag",
"displayname": "Gruppierungszeitraum",
"options": [
{
"Tag": "tag"
},
{
"Woche": "woche"
},
{
"Monat": "monat"
},
{
"Quartal": "quartal"
},
{
"Jahr": "jahr"
}
],
"description": "Auswahl des Zeitraums \u00fcber den gruppiert werden soll",
"editable": true,
"control_type": "combobox"
},
{
"varname": "Typ",
"default_value": "nein",
"displayname": "Nach Typ gruppieren",
"options": [
{
"Ja": "ja"
},
{
"Nein": "nein"
}
],
"description": "Soll nach dem Typ der Buchung gruppiert werden",
"editable": true,
"control_type": "combobox"
}
],
"remark": "",
"category": "Buchhaltung & Finanzen",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,85 @@
{
"name": "080 - Umsatz pro Artikel (einfach)",
"description": "Umsatz pro Artikel.",
"project": 0,
"sql_query": "SELECT\r\n ar.name_de AS name_de,\r\n ar.nummer AS nummer,\r\n ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))),2) AS umsatz,\r\n ROUND(SUM(rp.menge-IFNULL(gp.menge,0)),0) AS menge,\r\n CONCAT(MONTH(r.datum),'.',YEAR(r.datum)) AS datum,\r\n r.waehrung AS waehrung\r\nFROM rechnung r\r\nJOIN rechnung_position rp on r.id = rp.rechnung\r\nJOIN artikel ar ON ar.id = rp.artikel\r\nLEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE r.status<>'angelegt' AND r.status<>'storniert' AND IF('{VON}'=0,1,r.datum>='{VON}') AND IF('{BIS}'=0,1,r.datum<='{BIS}')\r\nGROUP BY ar.id, CONCAT(MONTH(r.datum),'.',YEAR(r.datum)),r.waehrung",
"columns": [
{
"key_name": "name_de",
"title": "Artikelname",
"width": "19",
"alignment": "left",
"sum": 0
},
{
"key_name": "nummer",
"title": "Artikelnummer",
"width": "19",
"alignment": "left",
"sum": 0
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "19",
"alignment": "left",
"sum": 1
},
{
"key_name": "menge",
"title": "Menge",
"width": "19",
"alignment": "left",
"sum": 1
},
{
"key_name": "datum",
"title": "Datum",
"width": "19",
"alignment": "left",
"sum": 0
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "19",
"alignment": "left",
"sum": 0
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datrum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "Xentral Report",
"share": {
"chart_public": true,
"chart_axislabel": "Umsatz",
"chart_dateformat": "Y-m-d H:i:s",
"chart_type": "line",
"chart_x_column": "nummer",
"data_columns": "umsatz",
"chart_group_column": "",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true
}
}
@@ -0,0 +1,117 @@
{
"name": "083 - Liste Kunden, die seit X Tagen nichts mehr bestellt haben",
"description": "Gibt alle Kunden aus f\u00fcr die seit einem bestimmten Zeitpunkt kein Auftrag mehr erstellt wurde. Kunden die noch keine Auftr\u00e4ge haben werden nicht beachtet, stornierte und noch nicht freigegebene Auftr\u00e4ge werden ignoriert.",
"project": 0,
"sql_query": "SELECT \r\na.kundennummer, \r\na.name, \r\na.ansprechpartner, \r\na.email,\r\na.telefon, \r\nmax(auf.datum) AS datum, \r\nIF(a.marketingsperre = '1', 'ja', 'nein') AS marketingsperre \r\nFROM adresse a \r\nLEFT JOIN auftrag auf ON a.id = auf.adresse \r\nWHERE auf.status != 'angelegt' AND auf.status != 'storniert' AND DATE_SUB(CURDATE(), INTERVAL {TAGE} DAY) >= auf.datum AND a.geloescht = 0 \r\nGROUP BY a.id",
"columns": [
{
"key_name": "kundennummer",
"title": "Kundennummer",
"width": "27",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "name",
"title": "Name",
"width": "27",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "ansprechpartner",
"title": "Ansprechpartner",
"width": "27",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "telefon",
"title": "Telefon",
"width": "27",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "email",
"title": "Email",
"width": "27",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "datum",
"title": "Zeitpunkt letzten Auftrags",
"width": "27",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy",
"format_statement": null
},
{
"key_name": "marketingsperre",
"title": "Marketingsperre",
"width": "27",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
}
],
"parameters": [
{
"varname": "Tage",
"default_value": "30",
"displayname": "Tage seit denen nichts mehr bestellt wurde",
"options": [],
"description": "Erlaubt genauere Steuerung der zu beachtenden Kunden",
"editable": true,
"control_type": ""
}
],
"remark": "",
"category": "CRM & Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,31 @@
{
"name": "085 - Welcher Artikel ist NICHT mit dem Online - Shop verkn\u00fcpft",
"description": "Gibt alle Artikel aus die nicht, oder nicht aktiv in einem Online Shop sind.",
"project": 0,
"sql_query": "SELECT a.nummer, a.name_de \r\nFROM artikel a \r\nWHERE a.geloescht = 0 AND a.id NOT IN (SELECT ao.artikel FROM artikel_onlineshops ao WHERE aktiv = 1)",
"columns": [
{
"key_name": "nummer",
"title": "Artikel-Nr.",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "name_de",
"title": "Artikelname",
"width": "",
"alignment": "left",
"sum": 0
}
],
"parameters": [],
"remark": "",
"category": "Einkauf \u0026 Artikelverwaltung \u0028PIM\u0029",
"share": {
"file_public": true,
"file_pdf_enabled" :true,
"file_csv_enabled" :true,
"file_xls_enabled" :true
}
}
@@ -0,0 +1,73 @@
{
"name": "086 - Alle VKs + EKs \u00fcber alle Artikel exportieren",
"description": "Gibt alle Einkaufs- und Verkaufspreise von allen Artikeln aus.",
"project": 0,
"sql_query": "SELECT \r\np.name_de, \r\np.nummer,\r\np.gueltig_ab, \r\np.gueltig_bis,\r\np.ab_menge, \r\np.preis, \r\np.waehrung,\r\np.art\r\nFROM (\r\n(SELECT 'EK' as art, a.nummer, a.name_de, ek.preis, ek.waehrung, ek.ab_menge, '' as gueltig_ab, IF(ek.gueltig_bis = '0000-00-00', 'unbegrenzt', DATE_FORMAT(ek.gueltig_bis, '%d.%m.%Y')) AS gueltig_bis\r\nFROM einkaufspreise ek \r\nLEFT JOIN artikel a ON ek.artikel = a.id\r\nWHERE a.geloescht = 0)\r\nUNION ALL\r\n(SELECT 'VK' as art, a.nummer, a.name_de, vk.preis, vk.waehrung, vk.ab_menge, IF(vk.gueltig_ab = '0000-00-00', 'aktuell', DATE_FORMAT(vk.gueltig_ab, '%d.%m.%Y')) AS gueltig_ab, IF(vk.gueltig_bis = '0000-00-00', 'unbegrenzt', DATE_FORMAT(vk.gueltig_bis, '%d.%m.%Y')) AS gueltig_bis FROM verkaufspreise vk LEFT JOIN artikel a ON vk.artikel = a.id WHERE a.geloescht = 0) \r\n) p\r\nORDER BY p.nummer",
"columns": [
{
"key_name": "art",
"title": "Art",
"width": "23",
"alignment": "left",
"sum": 0
},
{
"key_name": "name_de",
"title": "Name",
"width": "23",
"alignment": "left",
"sum": 0
},
{
"key_name": "nummer",
"title": "Nummer",
"width": "23",
"alignment": "left",
"sum": 0
},
{
"key_name": "preis",
"title": "Preis",
"width": "23",
"alignment": "right",
"sum": 0
},
{
"key_name": "ab_menge",
"title": "Ab Menge",
"width": "23",
"alignment": "right",
"sum": 0
},
{
"key_name": "gueltig_ab",
"title": "G\u00fcltig ab",
"width": "23",
"alignment": "left",
"sum": 0
},
{
"key_name": "gueltig_bis",
"title": "G\u00fcltig bis",
"width": "23",
"alignment": "left",
"sum": 0
},
{
"key_name": "waehrung",
"title": "W\u00e4hrung",
"width": "23",
"alignment": "left",
"sum": 0
}
],
"parameters": [],
"remark": "",
"category": "Einkauf \u0026 Artikelverwaltung \u0028PIM\u0029",
"share": {
"file_public": true,
"file_pdf_enabled" :true,
"file_csv_enabled" :true,
"file_xls_enabled" :true
}
}
@@ -0,0 +1,57 @@
{
"name": "097 - Verkaufszahlen Artikel pro Kunde",
"description": "Aufsummierte Menge aller gekauften Artikel je Kunde, basierend auf Rechnungen mit dem Status versendet innerhalb eines bestimmten Zeitraums.",
"project": 0,
"sql_query": "SELECT \r\nr.kundennummer, \r\nr.name, \r\nSUM(rp.menge) AS menge \r\nFROM rechnung r \r\nLEFT JOIN rechnung_position rp ON r.id = rp.rechnung \r\nWHERE r.status = 'versendet' AND IF('{VON}'=0,1,r.datum>='{VON}') AND IF('{BIS}'=0,1,r.datum<='{BIS}')\r\nGROUP BY r.adresse",
"columns": [
{
"key_name": "r.kundennummer",
"title": "Kundennummer",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "r.name",
"title": "Name",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "menge",
"title": "Menge",
"width": "",
"alignment": "right",
"sum": 0
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "Einkauf \u0026 Artikelverwaltung \u0028PIM\u0029",
"share": {
"file_public": true,
"file_pdf_enabled" :true,
"file_csv_enabled" :true,
"file_xls_enabled" :true
}
}
@@ -0,0 +1,62 @@
{
"name": "100 - \u00dcbersicht aktiver Projekte f\u00fcr Projektverantwortlichen idealerweise mit offenen Teilaufgaben",
"description": "Gibt alle Projekte mit dem Status gestartet aus, bei gesetzter Variable werden auch Teilprojekte mit Status offen ausgegeben.",
"project": 0,
"sql_query": "SELECT \r\np.name AS bezeichnung, \r\np.abkuerzung AS kennung, \r\nIFNULL(a.name,'') AS verantwortlicher, \r\nIF('{TEILPROJEKT}'='ja', IFNULL(ap.aufgabe,''), '') AS aufgabe\r\nFROM projekt p \r\nLEFT JOIN (SELECT ap.id, ap.aufgabe, ap.projekt FROM arbeitspaket ap WHERE ap.status = 'offen') ap ON p.id = ap.projekt \r\nLEFT JOIN adresse a ON p.verantwortlicher = a.id \r\nWHERE p.status = 'gestartet' \r\nGROUP BY p.id, IF('{TEILPROJEKT}'='ja', ap.id, 1)",
"columns": [
{
"key_name": "bezeichnung",
"title": "Bezeichnung",
"width": "47",
"alignment": "left",
"sum": 0
},
{
"key_name": "kennung",
"title": "Kennung",
"width": "47",
"alignment": "left",
"sum": 0
},
{
"key_name": "verantwortlicher",
"title": "Verantwortlicher",
"width": "47",
"alignment": "left",
"sum": 0
},
{
"key_name": "aufgabe",
"title": "Teilprojekt (falls gew\u00e4hlt)",
"width": "47",
"alignment": "left",
"sum": 0
}
],
"parameters": [
{
"varname": "Teilprojekt",
"default_value": "nein",
"displayname": "Aufgaben anzeigen",
"options": [
{
"Ja": "ja"
},
{
"Nein": "nein"
}
],
"description": "Zeigt Teilprojekte zu zugeh\u00f6rigen Projekten an",
"editable": true,
"control_type": "combobox"
}
],
"remark": "",
"category": "Team \u0026 Projektmanagement",
"share": {
"file_public": true,
"file_pdf_enabled" :true,
"file_csv_enabled" :true,
"file_xls_enabled" :true
}
}
@@ -0,0 +1,153 @@
{
"name": "117 - Verkaufszahlen Artikel pro Kundengruppe",
"description": "Verkaufszahlen Artikel pro Kundengruppe",
"project": 0,
"sql_query": "SELECT \r\nLPAD(t.rank,3,'0') AS rank, \r\nt.gruppe AS gruppe, \r\nt.von AS von,\r\nt.bis AS bis,\r\nt.artikel AS artikel,\r\nt.artikelnummer AS artikelnummer,\r\nt.menge AS menge \r\nFROM\r\n(SELECT IF(@last=r.gruppe,@rank:=@rank+1,@rank:=1) AS rank, r.von, r.bis, @last:=r.gruppe AS gruppe, r.artikel, r.artikelnummer, r.menge FROM\r\n(SELECT\r\nCASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN a.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(a.datum - INTERVAL (WEEKDAY(a.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN (a.datum - INTERVAL (DAYOFMONTH(a.datum) - 1) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(a.datum), 1) + INTERVAL QUARTER(a.datum) QUARTER - INTERVAL 1 QUARTER\r\n ELSE MAKEDATE(YEAR(a.datum), 1)\r\n END AS von,\r\nCASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN a.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(a.datum + INTERVAL (6 - WEEKDAY(a.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN LAST_DAY(a.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(a.datum), 1) + INTERVAL QUARTER(a.datum) QUARTER - INTERVAL 1 DAY\r\n ELSE LAST_DAY(DATE_ADD(a.datum, INTERVAL 12-MONTH(a.datum) MONTH))\r\n END AS bis, \r\ng.name AS gruppe,\r\nar.name_de AS artikel,\r\nar.nummer AS artikelnummer,\r\nROUND(SUM(ap.menge),0) AS menge\r\nFROM auftrag a\r\nJOIN auftrag_position ap ON a.id = ap.auftrag\r\nJOIN artikel ar ON ap.artikel = ar.id\r\nJOIN (SELECT g.name, ar.adresse\r\n FROM gruppen g\r\n JOIN adresse_rolle AS ar ON ar.parameter=g.id\r\n WHERE subjekt='Mitglied' AND objekt='Gruppe') AS g ON g.adresse = a.adresse\r\nWHERE a.status<>'angelegt' AND a.status<>'storniert' AND IF('{VON}'=0,1,a.datum>='{VON}') AND IF('{BIS}'=0,1,a.datum<='{BIS}')\r\nGROUP BY \r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN a.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(a.datum)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN MONTH(a.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN QUARTER(a.datum)\r\n ELSE YEAR(a.datum)\r\n END,\r\ng.name, ap.artikel\r\nORDER BY g.name,SUM(ap.menge) DESC) AS r\r\nJOIN (SELECT @rank:=0,@last:=0) AS rank) AS t\r\nWHERE t.rank < {LIMIT}",
"columns": [
{
"key_name": "von",
"title": "Von",
"width": "31",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "bis",
"title": "Bis",
"width": "31",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "gruppe",
"title": "Gruppe",
"width": "31",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "artikel",
"title": "Artikel",
"width": "31",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "artikelnummer",
"title": "Artikelnummer",
"width": "31",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "menge",
"title": "Menge",
"width": "31",
"alignment": "right",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "rank",
"title": "Rang",
"width": "31",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Gruppierung",
"default_value": "tag",
"displayname": "Gruppierungszeitraum",
"options": [
{
"Tag": "tag"
},
{
"Woche": "woche"
},
{
"Monat": "monat"
},
{
"Quartal": "quartal"
},
{
"Jahr": "jahr"
}
],
"description": "Auswahl des Zeitraums \u00fcber den gruppiert werden soll",
"editable": true,
"control_type": "combobox"
},
{
"varname": "Limit",
"default_value": "100",
"displayname": "Zeige Top x an",
"options": [],
"description": "Auswahl der x besten Pl\u00e4tze die pro Gruppe angezeigt werden sollen",
"editable": true,
"control_type": ""
}
],
"remark": "",
"category": "CRM & Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,121 @@
{
"name": "118 - Unvollst\u00e4ndige Adressen",
"description": "Adressen mit fehlenden Werten in bestimmten Feldern.",
"project": 0,
"sql_query": "SELECT\r\na.id AS id,\r\n a.name AS name,\r\n'{TYP}' AS typ,\r\n IF('{TYP}'='Kunde',a.kundennummer,\r\n IF('{TYP}'='Lieferant', a.lieferantennummer,\r\n a.mitarbeiternummer)) AS nummer,\r\n'{FELD}' AS fehlt\r\nFROM adresse AS a\r\nWHERE a.geloescht=0 AND (a.{FELD}='' OR a.{FELD}='0000-00-00' OR a.{FELD} IS NULL) AND \r\n IF('{TYP}'='Kunde',a.kundennummer<>'',\r\n IF('{TYP}'='Lieferant',a.lieferantennummer<>'',\r\n a.mitarbeiternummer<>''))",
"columns": [
{
"key_name": "name",
"title": "Name",
"width": "20",
"alignment": "left",
"sum": 0
},
{
"key_name": "typ",
"title": "Typ",
"width": "20",
"alignment": "left",
"sum": 0
},
{
"key_name": "nummer",
"title": "Nummer",
"width": "20",
"alignment": "left",
"sum": 0
},
{
"key_name": "fehlt",
"title": "Fehlendes Feld",
"width": "20",
"alignment": "left",
"sum": 0
},
{
"key_name": "id",
"title": "ID",
"width": "20",
"alignment": "left",
"sum": 0
}
],
"parameters": [
{
"varname": "Typ",
"default_value": "kunde",
"displayname": "Eingrenzen auf Typ",
"options": [
{
"Kunde": "Kunde"
},
{
"Lieferant": "Lieferant"
},
{
"Mitarbeiter": "Mitarbeiter"
}
],
"description": "Adresstyp auf den die Suche eingegrenzt werden soll",
"editable": true,
"control_type": "combobox"
},
{
"varname": "Feld",
"default_value": "email",
"displayname": "Gesuchtes Feld",
"options": [
{
"abteilung": "abteilung"
},
{
"unterabteilung": "unterabteilung"
},
{
"ansprechpartner": "ansprechpartner"
},
{
"strasse": "strasse"
},
{
"ort": "ort"
},
{
"plz": "plz"
},
{
"telefon": "telefon"
},
{
"telefax": "telefax"
},
{
"email": "email"
},
{
"ustid": "ustid"
},
{
"adresszusatz": "adresszusatz"
},
{
"iban": "iban"
},
{
"geburtstag": "geburtstag"
}
],
"description": "Feld nach dem gesucht werden soll",
"editable": true,
"control_type": "combobox"
}
],
"remark": "",
"category": "CRM \u0026 Vertrieb",
"share": {
"file_public": true,
"file_pdf_enabled" :true,
"file_csv_enabled" :true,
"file_xls_enabled" :true
}
}
@@ -0,0 +1,105 @@
{
"name": "119 - Unvollst\u00e4ndige Artikel",
"description": "Artikel mit fehlenden Werten in bestimmten Feldern.",
"project": 0,
"sql_query": "SELECT \r\na.id AS id,\r\na.nummer AS nummer,\r\na.name_de AS name_de,\r\n'{FELD}' as feld\r\nFROM artikel AS a\r\nWHERE a.nummer <> 'DEL' AND a.geloescht=0 AND ({FELD} IS NULL OR {FELD}='')\r\nAND IF('{GESPERRT}'='Ja',a.intern_gesperrt=0,1)",
"columns": [
{
"key_name": "id",
"title": "Artikel ID",
"width": "25",
"alignment": "left",
"sum": 0
},
{
"key_name": "nummer",
"title": "Artikelnummer",
"width": "25",
"alignment": "left",
"sum": 0
},
{
"key_name": "name_de",
"title": "Artikelname",
"width": "25",
"alignment": "left",
"sum": 0
},
{
"key_name": "feld",
"title": "Leeres Feld",
"width": "25",
"alignment": "left",
"sum": 0
}
],
"parameters": [
{
"varname": "Feld",
"default_value": "ean",
"displayname": "Gesuchtes Feld",
"options": [
{
"name_de": "name_de"
},
{
"kurztext_de": "kurztext_de"
},
{
"beschreibung_de": "beschreibung_de"
},
{
"uebersicht_de": "uebersicht_de"
},
{
"hersteller": "hersteller"
},
{
"herstellernummer": "herstellernummer"
},
{
"gewicht": "gewicht"
},
{
"ean": "ean"
},
{
"zolltarifnummer": "zolltarifnummer"
},
{
"metatitle_de": "metatitle_de"
},
{
"metadescription_d": "metadescription_d"
}
],
"description": "Feld nach dem gesucht werden soll",
"editable": true,
"control_type": "combobox"
},
{
"varname": "Gesperrt",
"default_value": "1",
"displayname": "Gesperrte Artikel ausblenden",
"options": [
{
"Ja": "Ja"
},
{
"Nein": "Nein"
}
],
"description": "Gesperrte Artikel ausblenden",
"editable": true,
"control_type": "combobox"
}
],
"remark": "",
"category": "Einkauf \u0026 Artikelverwaltung \u0028PIM\u0029",
"share": {
"file_public": true,
"file_pdf_enabled" :true,
"file_csv_enabled" :true,
"file_xls_enabled" :true
}
}
@@ -0,0 +1,106 @@
{
"name": "121 - Umsatz pro Vertriebsmitarbeiter (einfach)",
"description": "Umsatz pro Vertriebsmitarbeiter.\r\n\r\nGruppiert nach Mitarbeiter, Monat und W\u00e4hrung. Das auszugebende Jahr kann durch den zu beachtenden Zeitraum eingeschr\u00e4nkt werden.",
"project": 0,
"sql_query": "SELECT\r\n DATE_ADD(MAKEDATE(YEAR(r.datum), 1), INTERVAL MONTH(r.datum)-1 MONTH) AS datum,\r\n a.name AS name,\r\n ROUND(SUM(rp.menge-IFNULL(gp.menge,0)),0) AS menge,\r\n ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))),2) AS umsatz,\r\n r.waehrung AS waehrung\r\nFROM rechnung AS r\r\n JOIN rechnung_position rp on r.id = rp.rechnung\r\n JOIN adresse AS a ON r.vertriebid = a.id\r\n LEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE r.status <>'angelegt' AND r.status<>'storniert' AND IF('{VON}'=0,1,r.datum>='{VON}') AND IF('{BIS}'=0,1,r.datum<='{BIS}')\r\nGROUP BY a.id, DATE_ADD(MAKEDATE(YEAR(r.datum), 1), INTERVAL MONTH(r.datum)-1 MONTH), r.waehrung",
"columns": [
{
"key_name": "name",
"title": "Vertrieb",
"width": "38",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "38",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "menge",
"title": "Menge",
"width": "38",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "datum",
"title": "Datum",
"width": "38",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "custom",
"format_statement": "DATE_FORMAT({VALUE}, '%m.%Y')"
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "38",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Rechnungen beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Rechnungen beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "Controlling",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,191 @@
{
"name": "122 - Umsatz pro Vertriebsmitarbeiter (erweitert)",
"description": "Umsatz pro Vertriebsmitarbeiter.\r\n\r\nGruppierungsoptionen:\r\n- Datum: Tag\/Woche\/Monat\/Quartal\/Jahr\r\nFilteroptionen:\r\n- Jahr (optional): Jahr f\u00fcr das Belege angezeigt werden sollen",
"project": 0,
"sql_query": "SELECT\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(r.datum - INTERVAL (WEEKDAY(r.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN (r.datum - INTERVAL (DAYOFMONTH(r.datum) - 1) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(r.datum), 1) + INTERVAL QUARTER(r.datum) QUARTER - INTERVAL 1 QUARTER\r\n ELSE MAKEDATE(YEAR(r.datum), 1)\r\n END AS von,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(r.datum + INTERVAL (6 - WEEKDAY(r.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN LAST_DAY(r.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(r.datum), 1) + INTERVAL QUARTER(r.datum) QUARTER - INTERVAL 1 DAY\r\n ELSE LAST_DAY(DATE_ADD(CURDATE(), INTERVAL 12-MONTH(CURDATE()) MONTH))\r\n END AS bis,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN WEEK(r.datum) + 1\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(r.datum) + 1\r\n ELSE ''\r\n END AS kw,\r\n a.name AS name,\r\n ROUND(SUM(rp.menge-IFNULL(gp.menge,0)),0) AS menge,\r\n ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))),2)AS umsatz,\r\n ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((100+rp.rabatt)\/100)),2) AS umsatzohnerabatt,\r\n ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((rp.rabatt)\/100)),2) AS gesamtrabatt,\r\n ROUND(SUM(rp.deckungsbeitrag),2) AS deckungsbeitrag,\r\n ROUND(SUM(rp.einkaufspreis*(rp.menge-IFNULL(gp.menge,0))),2) AS ek,\r\n r.waehrung AS waehrung\r\nFROM rechnung AS r\r\n JOIN rechnung_position rp on r.id = rp.rechnung\r\n JOIN adresse AS a ON r.vertriebid = a.id\r\n LEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE r.status <>'angelegt' AND r.status<>'storniert' AND IF('{VON}'=0,1,r.datum>='{VON}') AND IF('{BIS}'=0,1,r.datum<='{BIS}')\r\nGROUP BY a.id, r.waehrung,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(r.datum)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN MONTH(r.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN QUARTER(r.datum)\r\n ELSE YEAR(r.datum)\r\n END",
"columns": [
{
"key_name": "name",
"title": "Name",
"width": "17",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "von",
"title": "Von",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy",
"format_statement": null
},
{
"key_name": "bis",
"title": "Bis",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy",
"format_statement": null
},
{
"key_name": "kw",
"title": "KW",
"width": "10",
"alignment": "center",
"sorting": "numeric",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "17",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "umsatzohnerabatt",
"title": "Umsatz ohne Rabatt",
"width": "17",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "gesamtrabatt",
"title": "Gesamtrabatt",
"width": "17",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "deckungsbeitrag",
"title": "Deckungsbeitrag",
"width": "17",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type":"sum_money_de",
"format_statement": null
},
{
"key_name": "ek",
"title": "EK",
"width": "17",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "menge",
"title": "Menge",
"width": "17",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null,
"format_statement": null
},
{
"key_name": "waehrung",
"title": "W\u00e4hrung",
"width": "17",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Rechnungen beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Rechnungen beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Gruppierung",
"default_value": "tag",
"displayname": "Gruppierungszeitraum",
"options": [
{
"Tag": "tag"
},
{
"Woche": "woche"
},
{
"Monat": "monat"
},
{
"Quartal": "quartal"
},
{
"Jahr": "jahr"
}
],
"description": "Auswahl des Zeitraums \u00fcber den gruppiert werden soll",
"editable": true,
"control_type": "combobox"
}
],
"remark": "",
"category": "Controlling",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,182 @@
{
"name": "123 - Umsatz pro Vertriebsmitarbeiter (BI)",
"description": "Umsatz pro Vertriebsmitarbeiter.\n\nDas zu beachtende Datum kann bei Bedarf eingeschr\u00e4nkt werden.",
"project": 0,
"sql_query": "SELECT\r\n r.datum AS datum,\r\n r.belegnr AS belegnummer,\r\n r.ort AS ort,\r\n r.plz AS plz,\r\n a.name AS name,\r\n ROUND(rp.menge-IFNULL(gp.menge,0),0) AS menge,\r\n ROUND(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0)),2) AS umsatz,\r\n ROUND(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((100+rp.rabatt)\/100),2) AS umsatzohnerabatt,\r\n ROUND(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((rp.rabatt)\/100),2) AS gesamtrabatt,\r\n ROUND(rp.deckungsbeitrag,2) AS deckungsbeitrag,\r\n ROUND(rp.einkaufspreis*(rp.menge-IFNULL(gp.menge,0)),2) AS ek,\r\n r.waehrung AS waehrung,\r\n r.id AS rechnungid,\r\n a.id AS adressid\r\nFROM rechnung AS r\r\nJOIN rechnung_position rp on r.id = rp.rechnung\r\nJOIN adresse AS a ON r.vertriebid = a.id\r\nLEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE r.status <>'angelegt' AND r.status<>'storniert' AND IF('{VON}'=0,1,r.datum>='{VON}') AND IF('{BIS}'=0,1,r.datum<='{BIS}')",
"columns": [
{
"key_name": "belegnummer",
"title": "Belegnummer",
"width": "21",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "ort",
"title": "Ort",
"width": "21",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "plz",
"title": "PLZ",
"width": "21",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "rechnungid",
"title": "ID Rechnungsdatensatz",
"width": "21",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "adressid",
"title": "ID Adressdatensatz",
"width": "21",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "name",
"title": "Name",
"width": "21",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "21",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "umsatzohnerabatt",
"title": "Umsatz ohne Rabatt",
"width": "21",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "gesamtrabatt",
"title": "Gesamtrabatt",
"width": "21",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null
},
{
"key_name": "deckungsbeitrag",
"title": "Deckungsbeitrag",
"width": "21",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "ek",
"title": "EK",
"width": "21",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null
},
{
"key_name": "menge",
"title": "Menge",
"width": "21",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null
},
{
"key_name": "datum",
"title": "Datum",
"width": "21",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "waehrung",
"title": "W\u00e4hrung",
"width": "21",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Rechnungen beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Rechnungen beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "Controlling",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,116 @@
{
"name": "124 - Umsatz pro Artikel (einfach)",
"description": "Umsatz pro Artikel.\r\n\r\nGruppiert nach Artikel, Monat und W\u00e4hrung. Der Datumszeitraum kann bei Bedarf eingeschr\u00e4nkt werden.",
"project": 0,
"sql_query": "SELECT\r\n DATE_ADD(MAKEDATE(YEAR(r.datum), 1), INTERVAL MONTH(r.datum)-1 MONTH) AS datum,\r\n ar.name_de AS name_de,\r\n ar.nummer AS nummer,\r\n ROUND(SUM(rp.menge-IFNULL(gp.menge,0)),0) AS menge,\r\n ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))),2) AS umsatz,\r\n r.waehrung AS waehrung\r\nFROM rechnung r\r\n JOIN rechnung_position rp on r.id = rp.rechnung\r\n JOIN artikel ar ON ar.id = rp.artikel\r\n LEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE r.status<>'angelegt' AND r.status<>'storniert' AND IF('{VON}'=0,1,r.datum>='{VON}') AND IF('{BIS}'=0,1,r.datum<='{BIS}')\r\nGROUP BY ar.id, DATE_ADD(MAKEDATE(YEAR(r.datum), 1), INTERVAL MONTH(r.datum)-1 MONTH),r.waehrung",
"columns": [
{
"key_name": "datum",
"title": "Datum",
"width": "31",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "custom",
"format_statement": "DATE_FORMAT({VALUE}, '%m.%Y')"
},
{
"key_name": "name_de",
"title": "Name_de",
"width": "31",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "nummer",
"title": "Nummer",
"width": "31",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "31",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "menge",
"title": "Menge",
"width": "31",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null,
"format_statement": null
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "31",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "CRM & Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,171 @@
{
"name": "125 - Umsatz pro Artikel (erweitert)",
"description": "Umsatz pro Artikel.\n\nGruppierungsoptionen:\n- Datum: Tag\/Woche\/Monat\/Quartal\/Jahr\nFilteroptionen:\n- Von\/Bis: Das Datum f\u00fcr das die Suche eingegrenzt werden soll",
"project": 0,
"sql_query": "SELECT \r\nCASE WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(r.datum - INTERVAL (WEEKDAY(r.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN (r.datum - INTERVAL (DAYOFMONTH(r.datum) - 1) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(r.datum), 1) + INTERVAL QUARTER(r.datum) QUARTER - INTERVAL 1 QUARTER\r\n ELSE MAKEDATE(YEAR(r.datum), 1)\r\n END AS datum,\r\n ar.name_de AS name_de,\r\n ar.nummer AS nummer,\r\n ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))),2) AS umsatz,\r\n ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((100+rp.rabatt)\/100)),2) AS umsatzohnerabatt,\r\n ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((rp.rabatt)\/100)),2) AS gesamtrabatt,\r\n ROUND(SUM(rp.deckungsbeitrag),2) AS deckungsbeitrag,\r\n ROUND(SUM(rp.einkaufspreis*(rp.menge-IFNULL(gp.menge,0))),2) AS ek,\r\n ROUND(SUM(rp.menge-IFNULL(gp.menge,0)),0) AS menge,\r\n r.waehrung AS waehrung\r\nFROM rechnung r\r\n JOIN rechnung_position rp on r.id = rp.rechnung\r\n JOIN artikel ar ON ar.id = rp.artikel\r\n LEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE r.status<>'angelegt' AND r.status<>'storniert' AND IF('{VON}'=0,1,r.datum>='{VON}') AND IF('{BIS}'=0,1,r.datum<='{BIS}')\r\nGROUP BY ar.id, r.waehrung, CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(r.datum - INTERVAL (WEEKDAY(r.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN (r.datum - INTERVAL (DAYOFMONTH(r.datum) - 1) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(r.datum), 1) + INTERVAL QUARTER(r.datum) QUARTER - INTERVAL 1 QUARTER\r\n ELSE MAKEDATE(YEAR(r.datum), 1)\r\n END",
"columns": [
{
"key_name": "name_de",
"title": "Artikelname",
"width": "19",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic",
"format_type": null
},
{
"key_name": "nummer",
"title": "Nummer",
"width": "19",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic",
"format_type": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "19",
"alignment": "right",
"sum": 1,
"sorting": "numeric",
"format_type": "sum_money_de"
},
{
"key_name": "umsatzohnerabatt",
"title": "Umsatz ohne Rabatt",
"width": "19",
"alignment": "right",
"sum": 1,
"sorting": "numeric",
"format_type": "sum_money_de"
},
{
"key_name": "gesamtrabatt",
"title": "Gesamtrabatt",
"width": "19",
"alignment": "right",
"sum": 1,
"sorting": "numeric",
"format_type": "sum_money_de"
},
{
"key_name": "deckungsbeitrag",
"title": "Deckungsbeitrag",
"width": "19",
"alignment": "right",
"sum": 1,
"sorting": "numeric",
"format_type": "sum_money_de"
},
{
"key_name": "ek",
"title": "EK",
"width": "19",
"alignment": "right",
"sum": 1,
"sorting": "numeric",
"format_type": "sum_money_de"
},
{
"key_name": "menge",
"title": "Menge",
"width": "19",
"alignment": "right",
"sum": 1,
"sorting": "numeric",
"format_type": null
},
{
"key_name": "datum",
"title": "Datum",
"width": "19",
"alignment": "left",
"sum": 0,
"sorting": "numeric",
"format_type": "date_dmy"
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "19",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic",
"format_type": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "GRUPPIERUNG",
"default_value": "tag",
"displayname": "Gruppierungszeitraum",
"options": [
{
"Tag": "tag"
},
{
"Woche": "woche"
},
{
"Monat": "monat"
},
{
"Quartal": "quartal"
},
{
"Jahr": "jahr"
}
],
"description": "Auswahl des Zeitraums \u00fcber den gruppiert werden soll",
"editable": true,
"control_type": "combobox"
}
],
"remark": "",
"category": "CRM \u0026 Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,173 @@
{
"name": "126 - Umsatz pro Artikel (BI)",
"description": "Umsatz pro Artikel.\n\nDas auszugebende Datum kann bei Bedarf eingeschr\u00e4nkt werden.",
"project": 0,
"sql_query": "SELECT\r\n r.datum AS datum,\r\n r.belegnr AS belegnummer,\r\n r.ort AS ort,\r\n r.plz AS plz,\r\n ar.name_de AS name_de,\r\n ar.nummer AS nummer,\r\n ROUND(rp.menge-IFNULL(gp.menge,0),0) AS menge,\r\n ROUND(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0)),2) AS umsatz,\r\n ROUND(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((100+rp.rabatt)\/100),2) AS umsatzohnerabatt,\r\n ROUND(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((rp.rabatt)\/100),2) AS gesamtrabatt,\r\n ROUND(rp.deckungsbeitrag,2) AS deckungsbeitrag,\r\n ROUND(rp.einkaufspreis*(rp.menge-IFNULL(gp.menge,0)),2) AS ek,\r\n r.waehrung AS waehrung\r\nFROM rechnung r\r\nJOIN rechnung_position rp on r.id = rp.rechnung\r\nJOIN artikel ar ON ar.id = rp.artikel\r\nLEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE r.status<>'angelegt' AND r.status<>'storniert' AND IF('{VON}'=0,1,r.datum>='{VON}') AND IF('{BIS}'=0,1,r.datum<='{BIS}')",
"columns": [
{
"key_name": "belegnummer",
"title": "Belegnummer",
"width": "19",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "ort",
"title": "Ort",
"width": "19",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "plz",
"title": "PLZ",
"width": "19",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "name_de",
"title": "Artikelname",
"width": "19",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "nummer",
"title": "Nummer",
"width": "19",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "19",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "umsatzohnerabatt",
"title": "Umsatz ohne Rabatt",
"width": "19",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "gesamtrabatt",
"title": "Gesamtrabatt",
"width": "19",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "deckungsbeitrag",
"title": "Deckungsbeitrag",
"width": "19",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "ek",
"title": "EK",
"width": "19",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "menge",
"title": "Menge",
"width": "19",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null
},
{
"key_name": "datum",
"title": "Datum",
"width": "19",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "19",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "CRM & Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,107 @@
{
"name": "127 - Umsatz pro Kunde nach Auftrag (einfach)",
"description": "Umsatz pro Kunde nach Auftrag.\r\n\r\nGruppiert nach Kunde, Monat und W\u00e4hrung. Das auszugebende Jahr kann bei Bedarf eingeschr\u00e4nkt werden.",
"project": 0,
"sql_query": "SELECT\r\na.name AS name,\r\na.kundennummer AS kundennummer,\r\nROUND(SUM(rp.menge),0) AS menge,\r\nROUND(SUM(rp.umsatz_netto_einzeln*rp.menge),2) AS umsatz,\r\nr.waehrung,\r\nDATE_ADD(MAKEDATE(YEAR(r.datum), 1), INTERVAL MONTH(r.datum)-1 MONTH) AS datum\r\nFROM adresse a\r\nJOIN auftrag r ON a.id = r.adresse\r\nJOIN auftrag_position rp on r.id = rp.auftrag\r\nWHERE r.status<>'angelegt' AND r.status<>'storniert' AND IF({JAHR}=0,1,YEAR(r.datum)={JAHR})\r\nGROUP BY a.id, DATE_ADD(MAKEDATE(YEAR(r.datum), 1), INTERVAL MONTH(r.datum)-1 MONTH),r.waehrung",
"columns": [
{
"key_name": "name",
"title": "Kunde",
"width": "31",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "kundennummer",
"title": "Kundennummer",
"width": "31",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "menge",
"title": "Menge",
"width": "31",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null,
"format_statement": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "31",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "31",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "datum",
"title": "Datum",
"width": "31",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "custom",
"format_statement": "DATE_FORMAT({VALUE}, '%m.%Y')"
}
],
"parameters": [
{
"varname": "Jahr",
"default_value": "0",
"displayname": "(optional) Eingrenzen auf Jahr",
"options": [],
"description": "Grenzt die zu suchenden Ums\u00e4tze auf ein bestimmtes Jahr ein",
"editable": true,
"control_type": ""
}
],
"remark": "",
"category": "CRM & Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,180 @@
{
"name": "128 - Umsatz pro Kunde nach Auftrag (erweitert)",
"description": "Umsatz pro Kunde nach Rechnung.\r\n\r\nGruppierungsoptionen:\r\n- Datum: Tag\/Woche\/Monat\/Quartal\/Jahr\r\nFilteroptionen:\r\n- Jahr (optional): Jahr f\u00fcr das Belege angezeigt werden sollen",
"project": 0,
"sql_query": "SELECT CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(r.datum - INTERVAL (WEEKDAY(r.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN (r.datum - INTERVAL (DAYOFMONTH(r.datum) - 1) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(r.datum), 1) + INTERVAL QUARTER(r.datum) QUARTER - INTERVAL 1 QUARTER\r\n ELSE MAKEDATE(YEAR(r.datum), 1)\r\n END AS von,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(r.datum + INTERVAL (6 - WEEKDAY(r.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN LAST_DAY(r.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(r.datum), 1) + INTERVAL QUARTER(r.datum) QUARTER - INTERVAL 1 DAY\r\n ELSE LAST_DAY(DATE_ADD(r.datum, INTERVAL 12-MONTH(r.datum) MONTH))\r\n END AS bis,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN WEEK(r.datum) + 1\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(r.datum) + 1\r\n ELSE ''\r\n END AS kw,\r\n r.name AS name,\r\n r.kundennummer AS kundennummer,\r\n ROUND(SUM(rp.menge), 0) AS menge,\r\n ROUND(AVG(rp.umsatz_netto_einzeln) * (SUM(rp.menge)), 2) AS umsatz,\r\n ROUND(SUM(rp.umsatz_netto_einzeln * rp.menge * ((100 + rp.rabatt) \/ 100)), 2) AS umsatzohnerabatt,\r\n ROUND(SUM(rp.umsatz_netto_einzeln * rp.menge * ((rp.rabatt) \/ 100)), 2) AS gesamtrabatt,\r\n ROUND(SUM(rp.deckungsbeitrag), 2) AS deckungsbeitrag,\r\n ROUND(SUM(rp.einkaufspreis * rp.menge), 2) AS ek,\r\n r.waehrung AS waehrung\r\nFROM adresse a\r\n JOIN auftrag r ON a.id = r.adresse\r\n JOIN auftrag_position rp on r.id = rp.auftrag\r\nWHERE r.status <> 'angelegt'\r\n AND r.status <> 'storniert'\r\n AND IF({JAHR} = 0, 1, YEAR(r.datum) = {JAHR})\r\nGROUP BY a.id, r.waehrung,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(r.datum)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN MONTH(r.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN QUARTER(r.datum)\r\n ELSE YEAR(r.datum)\r\n END",
"columns": [
{
"key_name": "von",
"title": "Von",
"width": "15",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "bis",
"title": "Bis",
"width": "15",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "kw",
"title": "KW",
"width": "10",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "name",
"title": "Kunde",
"width": "15",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "kundennummer",
"title": "Kundennummer",
"width": "15",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "menge",
"title": "Menge",
"width": "15",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "15",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de"
},
{
"key_name": "umsatzohnerabatt",
"title": "Umsatz ohne Rabatt",
"width": "15",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de"
},
{
"key_name": "gesamtrabatt",
"title": "Gesamtrabatt",
"width": "15",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de"
},
{
"key_name": "deckungsbeitrag",
"title": "Deckungsbeitrag",
"width": "15",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de"
},
{
"key_name": "ek",
"title": "EK",
"width": "15",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de"
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "15",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Jahr",
"default_value": "0",
"displayname": "(optional) Eingrenzen auf Jahr",
"options": [],
"description": "Grenzt die zu suchenden Ums\u00e4tze auf ein bestimmtes Jahr ein",
"editable": true,
"control_type": ""
},
{
"varname": "Gruppierung",
"default_value": "tag",
"displayname": "Gruppierungszeitraum",
"options": [
{
"Tag": "tag"
},
{
"Woche": "woche"
},
{
"Monat": "monat"
},
{
"Quartal": "quartal"
},
{
"Jahr": "jahr"
}
],
"description": "Auswahl des Zeitraums \u00fcber den gruppiert werden soll",
"editable": true,
"control_type": "combobox"
}
],
"remark": "",
"category": "CRM & Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,145 @@
{
"name": "129 - Umsatz pro Kunde nach Auftrag (BI)",
"description": "Umsatz pro Kunde nach Auftrag.",
"project": 0,
"sql_query": "SELECT\r\nr.datum AS datum, \r\n a.name AS name,\r\n r.belegnr AS belegnummer,\r\n a.kundennummer AS kundennummer,\r\n ROUND((rp.menge),0) AS menge,\r\n ROUND((rp.umsatz_netto_einzeln)*((rp.menge)),2) AS umsatz,\r\n ROUND((rp.umsatz_netto_einzeln*rp.menge*((100+rp.rabatt)\/100)),2) AS umsatzohnerabatt,\r\n ROUND((rp.umsatz_netto_einzeln*rp.menge*((rp.rabatt)\/100)),2) AS gesamtrabatt,\r\n ROUND((rp.deckungsbeitrag),2) AS deckungsbeitrag,\r\n ROUND((rp.einkaufspreis*rp.menge),2) AS ek,\r\n r.waehrung AS waehrung\r\nFROM adresse a\r\nJOIN auftrag r ON a.id = r.adresse\r\nJOIN auftrag_position rp on r.id = rp.auftrag\r\nWHERE r.status<>'angelegt' AND r.status<>'storniert' AND IF({JAHR}=0,1,YEAR(r.datum)={JAHR})",
"columns": [
{
"key_name": "datum",
"title": "Datum",
"width": "19",
"alignment": "left",
"sum": 0,
"sorting": "numeric",
"format_type": null
},
{
"key_name": "name",
"title": "Name",
"width": "19",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic",
"format_type": null
},
{
"key_name": "kundennummer",
"title": "Kundennummer",
"width": "19",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic",
"format_type": null
},
{
"key_name": "menge",
"title": "Menge",
"width": "19",
"alignment": "left",
"sum": 0,
"sorting": "numeric",
"format_type": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "19",
"alignment": "left",
"sum": 0,
"sorting": "numeric",
"format_type": null
},
{
"key_name": "umsatzohnerabatt",
"title": "Umsatzohnerabatt",
"width": "19",
"alignment": "left",
"sum": 0,
"sorting": "numeric",
"format_type": null
},
{
"key_name": "gesamtrabatt",
"title": "Gesamtrabatt",
"width": "19",
"alignment": "left",
"sum": 0,
"sorting": "numeric",
"format_type": null
},
{
"key_name": "deckungsbeitrag",
"title": "Deckungsbeitrag",
"width": "19",
"alignment": "left",
"sum": 0,
"sorting": "numeric",
"format_type": null
},
{
"key_name": "ek",
"title": "Ek",
"width": "19",
"alignment": "left",
"sum": 0,
"sorting": "numeric",
"format_type": null
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "19",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic",
"format_type": null
},
{
"key_name": "belegnummer",
"title": "Belegnummer",
"width": "19",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic",
"format_type": null
}
],
"parameters": [
{
"varname": "Jahr",
"default_value": "0",
"displayname": "(optional) Eingrenzen auf Jahr",
"options": [],
"description": "Grenzt die zu suchenden Ums\u00e4tze auf ein bestimmtes Jahr ein",
"editable": true
}
],
"remark": "",
"category": "CRM \u0026 Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,101 @@
{
"name": "130 - Umsatz pro Kunde nach Rechnung (einfach)",
"description": "Umsatz pro Kunde nach Rechnung.\r\n\r\nGruppiert nach Kunde, Monat und W\u00e4hrung. Das auszugebende Jahr kann bei Bedarf eingeschr\u00e4nkt werden.",
"project": 0,
"sql_query": "SELECT\r\na.name AS name,\r\na.kundennummer AS kundennummer,\r\nROUND(SUM(rp.menge-IFNULL(gp.menge,0)),0) AS menge,\r\nROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))),2) AS umsatz,\r\nr.waehrung,\r\nCONCAT(MONTH(r.datum),'.',YEAR(r.datum)) AS datum\r\nFROM adresse a\r\nJOIN rechnung r ON a.id = r.adresse\r\nJOIN rechnung_position rp on r.id = rp.rechnung\r\nLEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE r.status<>'angelegt' AND r.status<>'storniert' AND IF({JAHR}=0,1,YEAR(r.datum)={JAHR})\r\nGROUP BY a.id, CONCAT(MONTH(r.datum),'.',YEAR(r.datum)),r.waehrung",
"columns": [
{
"key_name": "name",
"title": "Name",
"width": "20",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "20",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null
},
{
"key_name": "menge",
"title": "Summe Artikel",
"width": "20",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null
},
{
"key_name": "datum",
"title": "Datum",
"width": "20",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "kundennummer",
"title": "Kundennummer",
"width": "20",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "waehrung",
"title": "W\u00e4hrung",
"width": "20",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Jahr",
"default_value": "0",
"displayname": "(optional) Eingrenzen auf Jahr",
"options": [],
"description": "Grenzt die zu suchenden Ums\u00e4tze auf ein bestimmtes Jahr ein",
"editable": true,
"control_type": ""
}
],
"remark": "",
"category": "CRM & Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,152 @@
{
"name": "131 - Umsatz pro Kunde nach Rechnung (erweitert)",
"description": "Umsatz pro Kunde nach Rechnung.\r\n\r\nGruppierungsoptionen:\r\n- Datum: Tag\/Woche\/Monat\/Quartal\/Jahr\r\nFilteroptionen:\r\n- Jahr (optional): Jahr f\u00fcr das Belege angezeigt werden sollen",
"project": 0,
"sql_query": "SELECT\r\nCASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(r.datum - INTERVAL (WEEKDAY(r.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN (r.datum - INTERVAL (DAYOFMONTH(r.datum) - 1) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(r.datum), 1) + INTERVAL QUARTER(r.datum) QUARTER - INTERVAL 1 QUARTER\r\n ELSE MAKEDATE(YEAR(r.datum), 1)\r\nEND AS von,\r\nCASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(r.datum + INTERVAL (6 - WEEKDAY(r.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN LAST_DAY(r.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(r.datum), 1) + INTERVAL QUARTER(r.datum) QUARTER - INTERVAL 1 DAY\r\n ELSE LAST_DAY(DATE_ADD(r.datum, INTERVAL 12-MONTH(r.datum) MONTH))\r\n END AS bis,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN WEEK(r.datum) + 1\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(r.datum) + 1\r\n ELSE ''\r\n END AS kw, \r\n a.name AS name,\r\n a.kundennummer AS kundennummer,\r\nROUND(SUM(rp.menge)-IFNULL(SUM(gp.menge),0),0) AS menge,\r\nROUND(AVG(rp.umsatz_netto_einzeln)*(SUM(rp.menge)-IFNULL(SUM(gp.menge),0)),2) AS umsatz,\r\n r.waehrung AS waehrung\r\nFROM adresse a\r\nJOIN rechnung r ON a.id = r.adresse\r\nJOIN rechnung_position rp on r.id = rp.rechnung\r\nLEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE r.status<>'angelegt' AND r.status<>'storniert' AND IF({JAHR}=0,1,YEAR(r.datum)={JAHR})\r\nGROUP BY a.id, r.waehrung,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(r.datum)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN MONTH(r.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN QUARTER(r.datum)\r\n ELSE YEAR(r.datum)\r\n END",
"columns": [
{
"key_name": "von",
"title": "Von",
"width": "24",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy",
"format_statement": null
},
{
"key_name": "bis",
"title": "Bis",
"width": "24",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy",
"format_statement": null
},
{
"key_name": "kw",
"title": "KW",
"width": "10",
"alignment": "center",
"sorting": "numeric",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "name",
"title": "Name",
"width": "24",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "kundennummer",
"title": "Kundennummer",
"width": "24",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "menge",
"title": "Menge",
"width": "24",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "24",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "24",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
}
],
"parameters": [
{
"varname": "Jahr",
"default_value": "0",
"displayname": "(optional) Eingrenzen auf Jahr",
"options": [],
"description": "Grenzt die zu suchenden Ums\u00e4tze auf ein bestimmtes Jahr ein",
"editable": true,
"control_type": ""
},
{
"varname": "Gruppierung",
"default_value": "tag",
"displayname": "Gruppierungszeitraum",
"options": [
{
"Tag": "tag"
},
{
"Woche": "woche"
},
{
"Monat": "monat"
},
{
"Quartal": "quartal"
},
{
"Jahr": "jahr"
}
],
"description": "Auswahl des Zeitraums \u00fcber den gruppiert werden soll",
"editable": true,
"control_type": "combobox"
}
],
"remark": "",
"category": "CRM & Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,177 @@
{
"name": "132 - Umsatz pro Kunde nach Rechnung (BI)",
"description": "Umsatz pro Kunde nach Rechnung.\r\n\r\nDas auszugebende Jahr kann bei Bedarf eingeschr\u00e4nkt werden.",
"project": 0,
"sql_query": "SELECT\r\n r.datum AS datum,\r\n a.name AS name,\r\n a.kundennummer AS kundennummer,\r\n ROUND(rp.menge-IFNULL(gp.menge,0),0) AS menge,\r\n ROUND(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0)),2) AS umsatz,\r\n r.waehrung,\r\n r.belegnr,\r\n r.vertrieb,\r\n r.ort,\r\n r.plz,\r\n a.id AS adressid,\r\n r.id AS rechnungid,\r\n r.vertriebid\r\nFROM adresse a\r\nJOIN rechnung r ON a.id = r.adresse\r\nJOIN rechnung_position rp on r.id = rp.rechnung\r\nLEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE r.status<>'angelegt' AND r.status<>'storniert' AND IF({JAHR}=0,1,YEAR(r.datum)={JAHR})",
"columns": [
{
"key_name": "vertrieb",
"title": "Vertrieb",
"width": "14",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "ort",
"title": "Ort",
"width": "14",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "plz",
"title": "Plz",
"width": "14",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "adressid",
"title": "ID Adressdatensatz",
"width": "14",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "rechnungid",
"title": "ID Rechnung",
"width": "14",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "vertriebid",
"title": "ID Vertreibsmitarbeiter",
"width": "14",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "datum",
"title": "Datum",
"width": "14",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "name",
"title": "Name",
"width": "14",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "kundennummer",
"title": "Kundennummer",
"width": "14",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "menge",
"title": "Summe Artikel",
"width": "14",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null,
"format_statement": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "14",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null,
"format_statement": null
},
{
"key_name": "waehrung",
"title": "W\u00e4hrung",
"width": "14",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "belegnr",
"title": "Belegnummer",
"width": "14",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null,
"format_statement": null
}
],
"parameters": [
{
"varname": "JAHR",
"default_value": "0",
"displayname": "(optional) Eingrenzen auf Jahr",
"options": [],
"description": "Grenzt die zu suchenden Ums\u00e4tze auf ein bestimmtes Jahr ein",
"editable": true,
"control_type": "text"
}
],
"remark": "",
"category": "CRM & Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,127 @@
{
"name": "133 - Umsatz pro Kunde pro Artikel (einfach)",
"description": "Umsatz pro Kunde pro Artikel.\r\n\r\nGruppiert nach Kunde, Artikel, W\u00e4hrung und Monat. Kann bei Bedarf nach Jahr gefiltert werden.",
"project": 0,
"sql_query": "SELECT\r\nDATE_ADD(MAKEDATE(YEAR(r.datum), 1), INTERVAL MONTH(r.datum)-1 MONTH) AS datum,\r\na.name AS name,\r\na.kundennummer AS kundennummer,\r\nar.name_de AS name_de,\r\nar.nummer AS nummer,\r\nROUND(SUM(rp.menge-IFNULL(gp.menge,0)),0) AS menge,\r\nROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))),2) AS umsatz,\r\nr.waehrung\r\nFROM adresse a\r\nJOIN rechnung r ON a.id = r.adresse\r\nJOIN rechnung_position rp on r.id = rp.rechnung\r\nJOIN artikel ar ON ar.id = rp.artikel\r\nLEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE r.status<>'angelegt' AND r.status<>'storniert' AND IF({JAHR}=0,1,YEAR(r.datum)={JAHR})\r\nGROUP BY a.id, CONCAT(MONTH(r.datum),'.',YEAR(r.datum)),r.waehrung, rp.artikel",
"columns": [
{
"key_name": "datum",
"title": "Datum",
"width": "23",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "custom",
"format_statement": "DATE_FORMAT({VALUE}, '%m.%Y')"
},
{
"key_name": "name",
"title": "Kunde",
"width": "23",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "kundennummer",
"title": "Kundennummer",
"width": "23",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "name_de",
"title": "Artikel",
"width": "23",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "nummer",
"title": "Artikelnummer",
"width": "23",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "menge",
"title": "Menge",
"width": "23",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null,
"format_statement": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "23",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null,
"format_statement": null
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "23",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
}
],
"parameters": [
{
"varname": "Jahr",
"default_value": "0",
"displayname": "(optional) Eingrenzen auf Jahr",
"options": [],
"description": "Grenzt die zu suchenden Ums\u00e4tze auf ein bestimmtes Jahr ein",
"editable": true,
"control_type": ""
}
],
"remark": "",
"category": "CRM & Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,207 @@
{
"name": "134 - Umsatz pro Kunde pro Artikel (erweitert)",
"description": "Umsatz pro Kunde pro Artikel. Gruppiert nach Kunde und Artikel.\r\n\r\nGruppierungsoptionen:\r\n- Datum: Tag\/Woche\/Monat\/Quartal\/Jahr\r\nFilteroptionen:\r\n- Von\/Bis (optional): Datumsbereich f\u00fcr den eingegrenzt werden soll",
"project": 0,
"sql_query": "SELECT\r\nCASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(r.datum - INTERVAL (WEEKDAY(r.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN (r.datum - INTERVAL (DAYOFMONTH(r.datum) - 1) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(r.datum), 1) + INTERVAL QUARTER(r.datum) QUARTER - INTERVAL 1 QUARTER\r\n ELSE MAKEDATE(YEAR(r.datum), 1)\r\n END AS von,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(r.datum + INTERVAL (6 - WEEKDAY(r.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN LAST_DAY(r.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(r.datum), 1) + INTERVAL QUARTER(r.datum) QUARTER - INTERVAL 1 DAY\r\n ELSE LAST_DAY(DATE_ADD(r.datum, INTERVAL 12-MONTH(r.datum) MONTH))\r\n END AS bis, \r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN WEEK(r.datum) + 1\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(r.datum) + 1\r\n ELSE ''\r\n END AS kw,\r\na.name AS name,\r\na.kundennummer AS kundennummer,\r\nar.name_de AS name_de,\r\nar.nummer AS nummer,\r\nROUND(SUM(rp.menge-IFNULL(gp.menge,0)),0) AS menge,\r\nROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))),2) AS umsatz,\r\nROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((100+rp.rabatt)\/100)),2) AS umsatzohnerabatt,\r\nROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((rp.rabatt)\/100)),2) AS gesamtrabatt,\r\nROUND(SUM(rp.deckungsbeitrag),2) AS deckungsbeitrag,\r\nROUND(SUM(rp.einkaufspreis*(rp.menge-IFNULL(gp.menge,0))),2) AS ek,\r\nr.waehrung\r\nFROM adresse a\r\nJOIN rechnung r ON a.id = r.adresse\r\nJOIN rechnung_position rp on r.id = rp.rechnung\r\nJOIN artikel ar ON ar.id = rp.artikel\r\nLEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE r.status<>'angelegt' AND r.status<>'storniert' AND IF('{VON}'=0,1,r.datum>='{VON}') AND IF('{BIS}'=0,1,r.datum<='{BIS}')\r\nGROUP BY a.id, r.waehrung, rp.artikel,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(r.datum)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN MONTH(r.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN QUARTER(r.datum)\r\n ELSE YEAR(r.datum)\r\n END",
"columns": [
{
"key_name": "von",
"title": "Von",
"width": "14",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "bis",
"title": "Bis",
"width": "14",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "kw",
"title": "KW",
"width": "10",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "name",
"title": "Kunde",
"width": "14",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "kundennummer",
"title": "Kundennummer",
"width": "14",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "name_de",
"title": "Artikel",
"width": "14",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "nummer",
"title": "Artikelnummer",
"width": "14",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "menge",
"title": "Menge",
"width": "14",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "14",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "umsatzohnerabatt",
"title": "Umsatz ohne Rabatt",
"width": "14",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "gesamtrabatt",
"title": "Gesamtrabatt",
"width": "14",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "deckungsbeitrag",
"title": "Deckungsbeitrag",
"width": "14",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "ek",
"title": "EK",
"width": "14",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "waehrung",
"title": "W\u00e4hrung",
"width": "14",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Gruppierung",
"default_value": "tag",
"displayname": "Gruppierungszeitraum",
"options": [
{
"Tag": "tag"
},
{
"Woche": "woche"
},
{
"Monat": "monat"
},
{
"Quartal": "quartal"
},
{
"Jahr": "jahr"
}
],
"description": "Auswahl des Zeitraums \u00fcber den gruppiert werden soll",
"editable": true,
"control_type": "combobox"
},
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "CRM & Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,176 @@
{
"name": "135 - Umsatz pro Kunde pro Artikel (BI)",
"description": "Umsatz pro Kunde pro Artikel",
"project": 0,
"sql_query": "SELECT\r\nr.datum AS datum,\r\na.name AS name,\r\na.kundennummer AS kundennummer,\r\nar.name_de AS name_de,\r\nar.nummer AS nummer,\r\nROUND(rp.menge-IFNULL(gp.menge,0),0) AS menge,\r\nROUND(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0)),2) AS umsatz,\r\nROUND(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((100+rp.rabatt)\/100),2) AS umsatzohnerabatt,\r\nROUND(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((rp.rabatt)\/100),2) AS gesamtrabatt,\r\nROUND(rp.deckungsbeitrag,2) AS deckungsbeitrag,\r\nROUND(rp.einkaufspreis*(rp.menge-IFNULL(gp.menge,0)),2) AS ek,\r\nr.waehrung\r\nFROM adresse a\r\nJOIN rechnung r ON a.id = r.adresse\r\nJOIN rechnung_position rp on r.id = rp.rechnung\r\nJOIN artikel ar ON ar.id = rp.artikel\r\nLEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE r.status<>'angelegt' AND r.status<>'storniert' AND IF('{VON}'=0,1,r.datum>='{VON}') AND IF('{BIS}'=0,1,r.datum<='{BIS}')",
"columns": [
{
"key_name": "datum",
"title": "Datum",
"width": "15",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "name",
"title": "Kunde",
"width": "15",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "kundennummer",
"title": "Kundennummer",
"width": "15",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "name_de",
"title": "Artikel",
"width": "15",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "nummer",
"title": "Artikelnummer",
"width": "15",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "menge",
"title": "Menge",
"width": "15",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null,
"format_statement": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "15",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null,
"format_statement": null
},
{
"key_name": "umsatzohnerabatt",
"title": "Umsatz ohne Rabatt",
"width": "15",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null,
"format_statement": null
},
{
"key_name": "gesamtrabatt",
"title": "Gesamtrabatt",
"width": "15",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null,
"format_statement": null
},
{
"key_name": "deckungsbeitrag",
"title": "Deckungsbeitrag",
"width": "15",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null,
"format_statement": null
},
{
"key_name": "ek",
"title": "EK",
"width": "15",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null,
"format_statement": null
},
{
"key_name": "waehrung",
"title": "W\u00e4hrung",
"width": "15",
"alignment": "left",
"sorting": "numeric",
"sum": 1,
"format_type": null,
"format_statement": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "CRM & Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,107 @@
{
"name": "136 - Offene Bestellungen mit Lieferterminen (sortiert)",
"description": "Alle freigegebenen Bestellungen deren best\u00e4tigtes Lieferdatum nicht leer ist, absteigend sortiert nach dem best\u00e4tigten Lieferdatum.",
"project": 0,
"sql_query": "SELECT \r\nbes.datum AS datum, \r\nIF(bes.bestaetigteslieferdatum = '0000-00-00' OR bes.bestaetigteslieferdatum IS NULL, NULL, bes.bestaetigteslieferdatum) AS lieferdatum,\r\nbes.belegnr, \r\nbes.lieferantennummer, \r\nbes.name, \r\nROUND(bes.gesamtsumme,2) AS gesamtsumme, \r\nbes.waehrung AS waehrung\r\nFROM bestellung bes \r\nWHERE bes.status = 'freigegeben' AND bes.bestaetigteslieferdatum != '0000-00-00' AND bes.bestaetigteslieferdatum IS NOT NULL\r\nORDER BY IF(bes.bestaetigteslieferdatum = '0000-00-00' OR bes.bestaetigteslieferdatum IS NULL,'', bes.bestaetigteslieferdatum) DESC",
"columns": [
{
"key_name": "datum",
"title": "Datum",
"width": "31",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy",
"format_statement": null
},
{
"key_name": "belegnr",
"title": "Belegnr",
"width": "31",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "lieferantennummer",
"title": "Lieferantennummer",
"width": "31",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "name",
"title": "Name",
"width": "31",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "gesamtsumme",
"title": "Gesamtsumme",
"width": "31",
"alignment": "right",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "lieferdatum",
"title": "Best\u00e4tigtes Lieferdatum",
"width": "31",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy",
"format_statement": null
},
{
"key_name": "waehrung",
"title": "W\u00e4hrung",
"width": "31",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
}
],
"parameters": [],
"remark": "",
"category": "Einkauf & Artikelverwaltung (PIM)",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,90 @@
{
"name": "137 - Umsatz pro Projekt (einfach)",
"description": "Umsatzreport auf Projektbasis.\n\nGruppiert nach Projekt, Monat und W\u00e4hrung. Bei Bedarf kann nach Datumsbereich und Projekt gefiltert werden.",
"project": 0,
"sql_query": "SELECT\r\n DATE_FORMAT(r.datum,'%m.%Y') AS datum,\r\n p.name AS projekt,\r\n ROUND(SUM(rp.menge-IFNULL(gp.menge,0)),0) AS menge,\r\n ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))),2) AS umsatz,\r\n r.waehrung AS waehrung\r\nFROM projekt p\r\nJOIN rechnung r ON r.projekt = p.id\r\nJOIN rechnung_position rp on r.id = rp.rechnung\r\nLEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE r.status<>'angelegt' AND r.status<>'storniert' AND IF('{VON}'=0,1,r.datum>='{VON}') AND IF('{BIS}'=0,1,r.datum<='{BIS}') AND IF('{PROJEKT}'='-',1,'{PROJEKT}'=p.abkuerzung)\r\nGROUP BY p.id, DATE_FORMAT(r.datum,'%m.%Y'),r.waehrung",
"columns": [
{
"key_name": "projekt",
"title": "Projekt",
"width": "38",
"alignment": "left",
"sum": 0,
"format_type": null,
"sorting": "alphabetic"
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "38",
"alignment": "right",
"sum": 1,
"format_type": "sum_money_de",
"sorting": "numeric"
},
{
"key_name": "menge",
"title": "Anzahl Artikel",
"width": "38",
"alignment": "right",
"sum": 1,
"format_type": "sum_money_de",
"sorting": "numeric"
},
{
"key_name": "datum",
"title": "Datum",
"width": "38",
"alignment": "left",
"sum": 0,
"format_type": null,
"sorting": "alphabetic"
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "38",
"alignment": "left",
"sum": 0,
"format_type": null,
"sorting": "alphabetic"
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Projekt",
"default_value": "-",
"displayname": "Projekt zur Eingrenzung",
"options": [],
"description": "Kennung des Projekts auf das die Auswahl eingegrenzt werden soll",
"editable": true,
"control_type": "autocomplete_project"
}
],
"remark": "",
"category": "Controlling",
"share": {
"file_public": true,
"file_pdf_enabled" :true,
"file_csv_enabled" :true,
"file_xls_enabled" :true
}
}
@@ -0,0 +1,200 @@
{
"name": "138 - Umsatz pro Projekt (erweitert)",
"description": "Umsatzreport auf Projektbasis.\r\n\r\nGruppierungsoptionen:\r\n- Datum: Tag\/Woche\/Monat\/Quartal\/Jahr\r\nFilteroptionen:\r\n- Von\/Bis (optional): Jahr f\u00fcr das Belege angezeigt werden sollen\r\n- Projekt (optional): Kennung des Projekts das ausgegeben werden soll",
"project": 0,
"sql_query": "SELECT\r\nCASE\r\nWHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\nWHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(r.datum - INTERVAL (WEEKDAY(r.datum)) DAY)\r\nWHEN '{GRUPPIERUNG}' = 'monat' THEN (r.datum - INTERVAL (DAYOFMONTH(r.datum) - 1) DAY)\r\nWHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(r.datum), 1) + INTERVAL QUARTER(r.datum) QUARTER - INTERVAL 1 QUARTER\r\nELSE MAKEDATE(YEAR(r.datum), 1)\r\nEND AS von,\r\nCASE \r\nWHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\nWHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(r.datum + INTERVAL (6 - WEEKDAY(r.datum)) DAY)\r\nWHEN '{GRUPPIERUNG}' = 'monat' THEN LAST_DAY(r.datum)\r\nWHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(r.datum), 1) + INTERVAL QUARTER(r.datum) QUARTER - INTERVAL 1 DAY\r\nELSE LAST_DAY(DATE_ADD(r.datum, INTERVAL 12-MONTH(r.datum) MONTH))\r\nEND AS bis,\r\nCASE\r\nWHEN '{GRUPPIERUNG}' = 'tag' THEN WEEK(r.datum) + 1\r\nWHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(r.datum) + 1\r\nELSE ''\r\nEND as kw,\r\np.name AS projekt,\r\nROUND(SUM(rp.menge-IFNULL(gp.menge,0)),0) AS menge,\r\nROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))),2) AS umsatz,\r\nROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((100+rp.rabatt)\/100)),2) AS umsatzohnerabatt,\r\nROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((rp.rabatt)\/100)),2) AS gesamtrabatt,\r\nROUND(SUM(rp.deckungsbeitrag),2) AS deckungsbeitrag,\r\nROUND(SUM(rp.einkaufspreis*(rp.menge-IFNULL(gp.menge,0))),2) AS ek,\r\nr.waehrung AS waehrung\r\nFROM projekt p\r\nJOIN rechnung r ON r.projekt = p.id\r\nJOIN rechnung_position rp on r.id = rp.rechnung\r\nLEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE r.status<>'angelegt' AND r.status<>'storniert' AND IF('{VON}'=0,1,r.datum>='{VON}') AND IF('{BIS}'=0,1,r.datum<='{BIS}') AND IF('{PROJEKT}'='-',1,'{PROJEKT}'=p.abkuerzung)\r\nGROUP BY p.id,r.waehrung,\r\nCASE\r\nWHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\nWHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(r.datum)\r\nWHEN '{GRUPPIERUNG}' = 'monat' THEN MONTH(r.datum)\r\nWHEN '{GRUPPIERUNG}' = 'quartal' THEN QUARTER(r.datum)\r\nELSE YEAR(r.datum)\r\nEND",
"columns": [
{
"key_name": "von",
"title": "Von",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy",
"format_statement": null
},
{
"key_name": "bis",
"title": "Bis",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy",
"format_statement": null
},
{
"key_name": "kw",
"title": "Kw",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "projekt",
"title": "Projekt",
"width": "17",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "menge",
"title": "Menge",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "umsatzohnerabatt",
"title": "Umsatzohnerabatt",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "gesamtrabatt",
"title": "Gesamtrabatt",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "deckungsbeitrag",
"title": "Deckungsbeitrag",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "ek",
"title": "Ek",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "17",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Projekt",
"default_value": "-",
"displayname": "Projekt zur Eingrenzung",
"options": [],
"description": "Kennung des Projekts auf das die Auswahl eingegrenzt werden soll",
"editable": true,
"control_type": "autocomplete_project"
},
{
"varname": "Gruppierung",
"default_value": "tag",
"displayname": "Grupperierung",
"options": [
{
"Tag": "tag"
},
{
"Woche": "woche"
},
{
"Monat": "monat"
},
{
"Quartal": "quartal"
},
{
"Jahr": "jahr"
}
],
"description": "Auswahl des Zeitraums \u00fcber den gruppiert werden soll",
"editable": true,
"control_type": "combobox"
}
],
"remark": "",
"category": "Controlling",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,144 @@
{
"name": "139 - Umsatz pro Projekt (BI)",
"description": "Umsatzreport auf Projektbasis.\n\nBei Bedarf kann nach Datumsbereich und Projekt gefiltert werden.",
"project": 0,
"sql_query": "SELECT\r\n r.datum AS datum,\r\n p.name AS projekt,\r\n ar.name_de,\r\n ar.nummer,\r\n ROUND(rp.menge-IFNULL(gp.menge,0),0) AS menge,\r\n ROUND(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0)),2) AS umsatz,\r\n ROUND(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((100+rp.rabatt)\/100),2) AS umsatzohnerabatt,\r\n ROUND(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((rp.rabatt)\/100),2) AS gesamtrabatt,\r\n ROUND(rp.deckungsbeitrag,2) AS deckungsbeitrag,\r\n ROUND(rp.einkaufspreis*(rp.menge-IFNULL(gp.menge,0)),2) AS ek,\r\n r.waehrung AS waehrung\r\nFROM projekt p\r\nJOIN rechnung r ON r.projekt = p.id\r\nJOIN rechnung_position rp on r.id = rp.rechnung\r\nJOIN artikel ar ON rp.artikel = ar.id\r\nLEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE r.status<>'angelegt' AND r.status<>'storniert' AND IF('{VON}'=0,1,r.datum>='{VON}') AND IF('{BIS}'=0,1,r.datum<='{BIS}') AND IF('{PROJEKT}'='-',1,'{PROJEKT}'=p.abkuerzung)",
"columns": [
{
"key_name": "projekt",
"title": "Projekt",
"width": "17",
"alignment": "left",
"sum": 0,
"format_type": null,
"sorting": "alphabetic"
},
{
"key_name": "name_de",
"title": "Artikelname",
"width": "17",
"alignment": "left",
"sum": 0,
"format_type": null,
"sorting": "alphabetic"
},
{
"key_name": "nummer",
"title": "Artikelnummer",
"width": "17",
"alignment": "left",
"sum": 0,
"format_type": null,
"sorting": "alphabetic"
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "17",
"alignment": "right",
"sum": 1,
"format_type": "sum_money_de",
"sorting": "numeric"
},
{
"key_name": "umsatzohnerabatt",
"title": "Umsatz ohne Rabatt",
"width": "17",
"alignment": "right",
"sum": 1,
"format_type": "sum_money_de",
"sorting": "numeric"
},
{
"key_name": "gesamtrabatt",
"title": "Gesamtrabatt",
"width": "17",
"alignment": "right",
"sum": 1,
"format_type": "sum_money_de",
"sorting": "numeric"
},
{
"key_name": "deckungsbeitrag",
"title": "Deckungsbeitrag",
"width": "17",
"alignment": "right",
"sum": 1,
"format_type": "sum_money_de",
"sorting": "numeric"
},
{
"key_name": "ek",
"title": "EK",
"width": "17",
"alignment": "right",
"sum": 1,
"format_type": "sum_money_de",
"sorting": "numeric"
},
{
"key_name": "menge",
"title": "Menge",
"width": "17",
"alignment": "right",
"sum": 1,
"format_type": "sum_money_de",
"sorting": "numeric"
},
{
"key_name": "datum",
"title": "Datum",
"width": "17",
"alignment": "left",
"sum": 0,
"format_type": "date_dmy",
"sorting": "numeric"
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "17",
"alignment": "right",
"sum": 0,
"format_type": null,
"sorting": "alphabetic"
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Projekt",
"default_value": "-",
"displayname": "Projekt zur Eingrenzung",
"options": [],
"description": "Kennung des Projekts auf das die Auswahl eingegrenzt werden soll",
"editable": true,
"control_type": "autocomplete_project"
}
],
"remark": "",
"category": "Controlling",
"share": {
"file_public": true,
"file_pdf_enabled" :true,
"file_csv_enabled" :true,
"file_xls_enabled" :true
}
}
@@ -0,0 +1,92 @@
{
"name": "140 - Umsatz pro Shop \/ Kanal (einfach)",
"description": "Ums\u00e4tze die Pro Shop\/Kanal gemacht worden sind.\r\n\r\nGruppiert nach Monat. Bei Bedarf kann nach Jahr gefiltert werden.",
"project": 0,
"sql_query": "SELECT \r\nDATE_ADD(MAKEDATE(YEAR(r.datum), 1), INTERVAL MONTH(r.datum)-1 MONTH) AS datum,\r\n s.bezeichnung AS kanal, \r\n ROUND(SUM(rp.menge-IFNULL(gp.menge,0)),0) AS menge,\r\n ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))),2) AS umsatz,\r\n r.waehrung AS waehrung \r\nFROM auftrag AS a\r\nJOIN shopexport s ON s.id = a.shop\r\nJOIN rechnung r ON r.auftragid = a.id\r\nJOIN rechnung_position rp on r.id = rp.rechnung\r\nLEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE s.aktiv=1 AND a.status <>'angelegt' AND a.status <>'storniert' AND r.status<>'angelegt' AND r.status<>'storniert' AND IF({JAHR}=0,1,YEAR(r.datum)={JAHR})\r\nGROUP BY DATE_ADD(MAKEDATE(YEAR(r.datum), 1), INTERVAL MONTH(r.datum)-1 MONTH),s.id, r.waehrung",
"columns": [
{
"key_name": "kanal",
"title": "Kanal",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "umsatz",
"title": "Summe Umsatz",
"width": "",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "menge",
"title": "Menge Artikel",
"width": "",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null
},
{
"key_name": "waehrung",
"title": "W\u00e4hrung",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "datum",
"title": "Datum",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
}
],
"parameters": [
{
"varname": "Jahr",
"default_value": "0",
"displayname": "(optional) Eingrenzen auf Jahr",
"options": [],
"description": "Grenzt die zu suchenden Ums\u00e4tze auf ein bestimmtes Jahr ein",
"editable": false,
"control_type": ""
}
],
"remark": "",
"category": "Controlling",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,180 @@
{
"name": "141 - Umsatz pro Shop \/ Kanal (erweitert)",
"description": "Ums\u00e4tze die Pro Shop\/Kanal gemacht worden sind.\r\n\r\nGruppierungsoptionen:\r\n- Datum: Tag\/Woche\/Monat\/Quartal\/Jahr\r\nFilteroptionen:\r\n- Von\/Bis (optional): Datumsbereich f\u00fcr den eingegrenzt werden soll",
"project": 0,
"sql_query": "SELECT \r\nCASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN a.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(a.datum - INTERVAL (WEEKDAY(a.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN (a.datum - INTERVAL (DAYOFMONTH(a.datum) - 1) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(a.datum), 1) + INTERVAL QUARTER(a.datum) QUARTER - INTERVAL 1 QUARTER\r\n ELSE MAKEDATE(YEAR(a.datum), 1)\r\n END AS von,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN a.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(a.datum + INTERVAL (6 - WEEKDAY(a.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN LAST_DAY(a.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(a.datum), 1) + INTERVAL QUARTER(a.datum) QUARTER - INTERVAL 1 DAY\r\n ELSE LAST_DAY(DATE_ADD(a.datum, INTERVAL 12-MONTH(a.datum) MONTH))\r\n END AS bis,\r\nCASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN WEEK(a.datum) + 1\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(a.datum) + 1\r\n ELSE ''\r\n END AS kw,\r\n s.bezeichnung AS kanal, \r\n ROUND(SUM(rp.menge-IFNULL(gp.menge,0)),0) AS menge,\r\n ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))),2) AS umsatz,\r\n ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((100+rp.rabatt)\/100)),2) AS umsatzohnerabatt,\r\n ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((rp.rabatt)\/100)),2) AS gesamtrabatt,\r\n ROUND(SUM(rp.deckungsbeitrag),2) AS deckungsbeitrag,\r\n ROUND(SUM(rp.einkaufspreis*(rp.menge-IFNULL(gp.menge,0))),2) AS ek,\r\n r.waehrung AS waehrung \r\nFROM auftrag AS a\r\nJOIN shopexport s ON s.id = a.shop\r\nJOIN rechnung r ON r.auftragid = a.id\r\nJOIN rechnung_position rp on r.id = rp.rechnung\r\nLEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE s.aktiv=1 AND a.status <>'angelegt' AND a.status <>'storniert' AND r.status<>'angelegt' AND r.status<>'storniert' AND IF('{VON}'=0,1,a.datum>='{VON}') AND IF('{BIS}'=0,1,a.datum<='{BIS}')\r\nGROUP BY \r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN a.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(a.datum)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN MONTH(a.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN QUARTER(a.datum)\r\n ELSE YEAR(a.datum)\r\n END,\r\ns.id, r.waehrung",
"columns": [
{
"key_name": "von",
"title": "Von",
"width": "19",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "bis",
"title": "Bis",
"width": "19",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "kw",
"title": "KW",
"width": "19",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "kanal",
"title": "Kanal",
"width": "19",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "menge",
"title": "Menge Artikel",
"width": "19",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "19",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "umsatzohnerabatt",
"title": "Umsatz ohne Rabatt",
"width": "19",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "gesamtrabatt",
"title": "Gesamtrabatt",
"width": "19",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "deckungsbeitrag",
"title": "Deckungsbeitrag",
"width": "19",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "ek",
"title": "EK",
"width": "19",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "19",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Gruppierung",
"default_value": "tag",
"displayname": "Gruppierungszeitraum",
"options": [
{
"Tag": "tag"
},
{
"Woche": "woche"
},
{
"Monat": "monat"
},
{
"Quartal": "quartal"
},
{
"Jahr": "jahr"
}
],
"description": "Auswahl des Zeitraums \u00fcber den gruppiert werden soll",
"editable": true,
"control_type": "combobox"
},
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "Controlling",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,164 @@
{
"name": "142 - Umsatz pro Shop \/ Kanal (BI)",
"description": "Ums\u00e4tze die pro Shop\/Kanal je Artikel gemacht worden sind.\r\n\r\nBei Bedarf kann der betreffende Datumsbereich eingegrenzt werden.",
"project": 0,
"sql_query": "SELECT \r\n a.datum AS datum,\r\n r.belegnr AS belegnummer,\r\n s.bezeichnung AS kanal, \r\n ar.name_de,\r\n ar.nummer,\r\n ROUND(rp.menge-IFNULL(gp.menge,0),0) AS menge,\r\n ROUND(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0)),2) AS umsatz,\r\n ROUND(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((100+rp.rabatt)\/100),2) AS umsatzohnerabatt,\r\n ROUND(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((rp.rabatt)\/100),2) AS gesamtrabatt,\r\n ROUND(rp.deckungsbeitrag,2) AS deckungsbeitrag,\r\n ROUND(rp.einkaufspreis*(rp.menge-IFNULL(gp.menge,0)),2) AS ek,\r\n r.waehrung AS waehrung \r\nFROM auftrag AS a\r\nJOIN shopexport s ON s.id = a.shop\r\nJOIN rechnung r ON r.auftragid = a.id\r\nJOIN rechnung_position rp on r.id = rp.rechnung\r\nJOIN artikel ar ON rp.artikel = ar.id\r\nLEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE s.aktiv=1 AND a.status <>'angelegt' AND a.status <>'storniert' AND r.status<>'angelegt' AND r.status<>'storniert' AND IF('{VON}'=0,1,a.datum>='{VON}') AND IF('{BIS}'=0,1,a.datum<='{BIS}')",
"columns": [
{
"key_name": "belegnummer",
"title": "Belegnummer",
"width": "19",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "kanal",
"title": "Kanal",
"width": "15",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "name_de",
"title": "Artikelname",
"width": "15",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "nummer",
"title": "Artikelnummer",
"width": "15",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "15",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null
},
{
"key_name": "umsatzohnerabatt",
"title": "Umsatz ohne Rabatt",
"width": "15",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null
},
{
"key_name": "gesamtrabatt",
"title": "Gesamtrabatt",
"width": "15",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null
},
{
"key_name": "deckungsbeitrag",
"title": "Deckungsbeitrag",
"width": "15",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null
},
{
"key_name": "ek",
"title": "EK",
"width": "15",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null
},
{
"key_name": "menge",
"title": "Menge",
"width": "15",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null
},
{
"key_name": "datum",
"title": "Datum",
"width": "15",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "15",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "Controlling",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,108 @@
{
"name": "145 - Versandanalyse Sendungen",
"description": "\u00dcbersicht \u00fcber die Anzahl versendeter Lieferungen.\r\n\r\nGruppierungsoptionen:\r\n- Datum: Tag\/Woche\/Monat\/Quartal\/Jahr\r\nFilteroptionen:\r\n- Jahr (optional): Jahr f\u00fcr das Belege angezeigt werden sollen",
"project": 0,
"sql_query": "SELECT\r\n COUNT(id) anzahl,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN v.versendet_am\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(v.versendet_am - INTERVAL (WEEKDAY(v.versendet_am)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN (v.versendet_am - INTERVAL (DAYOFMONTH(v.versendet_am) - 1) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(v.versendet_am), 1) + INTERVAL QUARTER(v.versendet_am) QUARTER - INTERVAL 1 QUARTER\r\n ELSE MAKEDATE(YEAR(v.versendet_am), 1)\r\n END AS von,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN v.versendet_am\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(v.versendet_am + INTERVAL (6 - WEEKDAY(v.versendet_am)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN LAST_DAY(v.versendet_am)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(v.versendet_am), 1) + INTERVAL QUARTER(v.versendet_am) QUARTER - INTERVAL 1 DAY\r\n ELSE LAST_DAY(DATE_ADD(v.versendet_am, INTERVAL 12-MONTH(v.versendet_am) MONTH))\r\n END AS bis,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN WEEK(v.versendet_am) + 1\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(v.versendet_am) + 1\r\n ELSE ''\r\n END AS kw\r\nFROM versand AS v\r\nWHERE IF({JAHR}=0,1,YEAR(versendet_am)={JAHR})\r\nGROUP BY\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN v.versendet_am\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(v.versendet_am)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN MONTH(v.versendet_am)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN QUARTER(v.versendet_am)\r\n ELSE YEAR(v.versendet_am)\r\n END",
"columns": [
{
"key_name": "anzahl",
"title": "Anzahl",
"width": "47",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "von",
"title": "Von",
"width": "47",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "bis",
"title": "Bis",
"width": "47",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "kw",
"title": "KW",
"width": "47",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Gruppierung",
"default_value": "tag",
"displayname": "Gruppierungszeitraum",
"options": [
{
"Tag": "tag"
},
{
"Woche": "woche"
},
{
"Monat": "monat"
},
{
"Quartal": "quartal"
},
{
"Jahr": "jahr"
}
],
"description": "Auswahl des Zeitraums \u00fcber den gruppiert werden soll",
"editable": true,
"control_type": "combobox"
},
{
"varname": "Jahr",
"default_value": "0",
"displayname": "(Optional) Eingrenzen auf Jahr",
"options": [],
"description": "Jahr f\u00fcr das die Ausgabe eingegrenz werden soll",
"editable": true,
"control_type": ""
}
],
"remark": "",
"category": "Lager & Logistik",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,135 @@
{
"name": "146 - Versandanalyse Warenwert",
"description": "\u00dcbersicht \u00fcber den Wert versendeter Artikel. Berechnung basiert auf zugeordneter Rechnung.\r\n\r\nGruppierungsoptionen:\r\n- Datum: Tag\/Woche\/Monat\/Quartal\/Jahr\r\nFilteroptionen:\r\n- Jahr (optional): Jahr f\u00fcr das Belege angezeigt werden sollen",
"project": 0,
"sql_query": "SELECT CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(r.datum - INTERVAL (WEEKDAY(r.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN (r.datum - INTERVAL (DAYOFMONTH(r.datum) - 1) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(r.datum), 1) + INTERVAL QUARTER(r.datum) QUARTER - INTERVAL 1 QUARTER\r\n ELSE MAKEDATE(YEAR(r.datum), 1)\r\n END AS von,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(r.datum + INTERVAL (6 - WEEKDAY(r.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN LAST_DAY(r.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(r.datum), 1) + INTERVAL QUARTER(r.datum) QUARTER - INTERVAL 1 DAY\r\n ELSE LAST_DAY(DATE_ADD(r.datum, INTERVAL 12-MONTH(r.datum) MONTH))\r\n END AS bis,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN WEEK(r.datum) + 1\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(r.datum) + 1\r\n ELSE ''\r\n END AS kw,\r\n REPLACE(ROUND(SUM(r.soll),2),'.',',') AS wert,\r\n REPLACE(ROUND(MIN(r.soll),2),'.',',') AS minwert,\r\n REPLACE(ROUND(MAX(r.soll),2),'.',',') AS maxwert,\r\n REPLACE(ROUND(AVG(r.soll),2),'.',',') AS avgwert\r\nFROM versand AS v\r\n JOIN rechnung r ON v.lieferschein = r.lieferschein\r\nWHERE IF({JAHR}=0,1,YEAR(v.versendet_am)={JAHR})\r\nGROUP BY\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(r.datum)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN MONTH(r.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN QUARTER(r.datum)\r\n ELSE YEAR(r.datum)\r\n END",
"columns": [
{
"key_name": "von",
"title": "Von",
"width": "27",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "bis",
"title": "Bis",
"width": "27",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "kw",
"title": "KW",
"width": "27",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "wert",
"title": "Gesamtwert",
"width": "27",
"alignment": "left",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "minwert",
"title": "Mindestwert",
"width": "27",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de"
},
{
"key_name": "maxwert",
"title": "Maximalwert",
"width": "27",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de"
},
{
"key_name": "avgwert",
"title": "Durchschnittswert",
"width": "27",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de"
}
],
"parameters": [
{
"varname": "Gruppierung",
"default_value": "tag",
"displayname": "Gruppierungszeitraum",
"options": [
{
"Tag": "tag"
},
{
"Woche": "woche"
},
{
"Monat": "monat"
},
{
"Quartal": "quartal"
},
{
"Jahr": "jahr"
}
],
"description": "Zeitraum \u00fcber den der Warenwert gruppiert werden soll",
"editable": true,
"control_type": "combobox"
},
{
"varname": "Jahr",
"default_value": "0",
"displayname": "(Optional) Eingrenzen auf Jahr",
"options": [],
"description": "Jahr f\u00fcr das die Ausgabe eingegrenz werden soll",
"editable": true,
"control_type": ""
}
],
"remark": "",
"category": "Lager & Logistik",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,110 @@
{
"name": "148 - Offene Auftr\u00e4ge mit Lieferterminen (sortiert)",
"description": "Alle freigegebenen Auftr\u00e4ge deren Lieferdatum ( = Wunschliefertermin) nicht leer ist, absteigend sortiert nach dem Lieferdatum ( = Wunschliefertermin).",
"project": 0,
"sql_query": "SELECT \r\nauf.datum AS datum,\r\nauf.belegnr AS belegnr, \r\nauf.name AS name, \r\nauf.kundennummer AS kundennummer, \r\nauf.umsatz_netto AS umsatz_netto, \r\nIF(auf.lieferdatum = '0000-00-00' OR auf.lieferdatum IS NULL, '', auf.lieferdatum) AS lieferdatum\r\nFROM auftrag auf \r\nWHERE auf.status = 'freigegeben' AND auf.lieferdatum != '0000-00-00' AND auf.lieferdatum IS NOT NULL\r\nAND IF('{VON}'=0,1,auf.datum>='{VON}') AND IF('{BIS}'=0,1,auf.datum<='{BIS}')\r\nORDER BY IF(auf.lieferdatum = '0000-00-00' OR auf.lieferdatum IS NULL,'', auf.lieferdatum) DESC",
"columns": [
{
"key_name": "datum",
"title": "Datum",
"width": "31",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "belegnr",
"title": "Belegnummer",
"width": "31",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "kundennummer",
"title": "Kundennummer",
"width": "31",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "name",
"title": "Name",
"width": "31",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "umsatz_netto",
"title": "Umsatz_netto",
"width": "31",
"alignment": "right",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de"
},
{
"key_name": "lieferdatum",
"title": "Lieferdatum",
"width": "31",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "Lager & Logistik",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,92 @@
{
"name": "152 - Umsatz pro Kundengruppe nach Rechnung (einfach)",
"description": "Umsatz pro Kundengruppe.\n\nGruppiert nach Kundengruppe, Monat und W\u00e4hrung. Bei Bedarf kann nach einem spezifischen Jahr gefiltert werden.",
"project": 0,
"sql_query": "SELECT\r\n CONCAT(MONTH(r.datum),'.',YEAR(r.datum)) AS datum,\r\n g.name,\r\n ROUND(SUM(rp.menge-IFNULL(gp.menge,0)),0) AS menge,\r\n ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))),2) AS umsatz,\r\n r.waehrung AS waehrung\r\nFROM rechnung r\r\nJOIN rechnung_position rp on r.id = rp.rechnung\r\nJOIN adresse_rolle ar ON ar.adresse = r.adresse AND subjekt='Mitglied' AND objekt='Gruppe'\r\nJOIN gruppen g ON ar.parameter =g.id\r\nLEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE r.status<>'angelegt' AND r.status<>'storniert' AND g.art='gruppe' AND IF({JAHR}=0,1,YEAR(r.datum)={JAHR})\r\nGROUP BY g.id, CONCAT(MONTH(r.datum),'.',YEAR(r.datum)),r.waehrung",
"columns": [
{
"key_name": "datum",
"title": "Datum",
"width": "38",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "name",
"title": "Gruppenname",
"width": "38",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "menge",
"title": "Menge",
"width": "38",
"alignment": "right",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "38",
"alignment": "right",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de"
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "38",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Jahr",
"default_value": "0",
"displayname": "(optional) Eingrenzen auf Jahr",
"options": [],
"description": "Grenzt die zu suchenden Ums\u00e4tze auf ein bestimmtes Jahr ein",
"editable": true,
"control_type": ""
}
],
"remark": "",
"category": "Controlling",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,191 @@
{
"name": "153 - Umsatz pro Kundengruppe nach Rechnung (erweitert)",
"description": "Umsatz pro Kundengruppe\r\n\r\nGruppierungsoptionen:\r\n- Datum: Tag\/Woche\/Monat\/Quartal\/Jahr\r\nFilteroptionen:\r\n- Jahr (optional): Jahr f\u00fcr das Belege angezeigt werden sollen",
"project": 0,
"sql_query": "SELECT CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(r.datum - INTERVAL (WEEKDAY(r.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN (r.datum - INTERVAL (DAYOFMONTH(r.datum) - 1) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(r.datum), 1) + INTERVAL QUARTER(r.datum) QUARTER - INTERVAL 1 QUARTER\r\n ELSE MAKEDATE(YEAR(r.datum), 1)\r\n END AS von,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(r.datum + INTERVAL (6 - WEEKDAY(r.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN LAST_DAY(r.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(r.datum), 1) + INTERVAL QUARTER(r.datum) QUARTER - INTERVAL 1 DAY\r\n ELSE LAST_DAY(DATE_ADD(r.datum, INTERVAL 12-MONTH(r.datum) MONTH))\r\n END AS bis,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN WEEK(r.datum) + 1\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(r.datum) + 1\r\n ELSE ''\r\n END AS kw,\r\n g.name,\r\n ROUND(SUM(rp.menge-IFNULL(gp.menge,0)),0) AS menge,\r\n ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))),2) AS umsatz,\r\n ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((100+rp.rabatt)\/100)),2) AS umsatzohnerabatt,\r\n ROUND(SUM(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((rp.rabatt)\/100)),2) AS gesamtrabatt,\r\n ROUND(SUM(rp.deckungsbeitrag),2) AS deckungsbeitrag,\r\n ROUND(SUM(rp.einkaufspreis*(rp.menge-IFNULL(gp.menge,0))),2) AS ek,\r\n r.waehrung AS waehrung\r\nFROM rechnung r\r\n JOIN rechnung_position rp on r.id = rp.rechnung\r\n JOIN adresse_rolle ar ON ar.adresse = r.adresse AND subjekt='Mitglied' AND objekt='Gruppe'\r\n JOIN gruppen g ON ar.parameter =g.id\r\n LEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE 1\r\nGROUP BY\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN r.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(r.datum)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN MONTH(r.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN QUARTER(r.datum)\r\n ELSE YEAR(r.datum)\r\n END,\r\n g.id, r.waehrung",
"columns": [
{
"key_name": "von",
"title": "Von",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy",
"format_statement": null
},
{
"key_name": "bis",
"title": "Bis",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy",
"format_statement": null
},
{
"key_name": "kw",
"title": "KW",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "name",
"title": "Name",
"width": "17",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
},
{
"key_name": "menge",
"title": "Menge",
"width": "17",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null,
"format_statement": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "17",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "umsatzohnerabatt",
"title": "Umsatzohnerabatt",
"width": "17",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "gesamtrabatt",
"title": "Gesamtrabatt",
"width": "17",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "deckungsbeitrag",
"title": "Deckungsbeitrag",
"width": "17",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "ek",
"title": "EK",
"width": "17",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de",
"format_statement": null
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "17",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null,
"format_statement": null
}
],
"parameters": [
{
"varname": "Gruppierung",
"default_value": "tag",
"displayname": "Gruppierung",
"options": [
{
"Tag": "tag"
},
{
"Woche": "woche"
},
{
"Monat": "monat"
},
{
"Quartal": "quartal"
},
{
"Jahr": "jahr"
}
],
"description": "Auswahl des Zeitraums \u00fcber den gruppiert werden soll",
"editable": true,
"control_type": "combobox"
},
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "Controlling",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,137 @@
{
"name": "154 - Umsatz pro Kundengruppe nach Rechnung (BI)",
"description": "Ums\u00e4tze mit Kundengruppen.\n\nDer auszugebende Datumsbereich kann bei Bedarf eingegrenzt werden.",
"project": 0,
"sql_query": "SELECT\r\n r.datum AS datum,\r\n g.name,\r\n ROUND(rp.menge-IFNULL(gp.menge,0),0) AS menge,\r\n ROUND(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0)),2) AS umsatz,\r\n ROUND(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((100+rp.rabatt)\/100),2) AS umsatzohnerabatt,\r\n ROUND(rp.umsatz_netto_einzeln*(rp.menge-IFNULL(gp.menge,0))*((rp.rabatt)\/100),2) AS gesamtrabatt,\r\n ROUND(rp.deckungsbeitrag,2) AS deckungsbeitrag,\r\n ROUND(rp.einkaufspreis*(rp.menge-IFNULL(gp.menge,0)),2) AS ek,\r\n r.waehrung AS waehrung\r\nFROM rechnung r\r\nJOIN rechnung_position rp on r.id = rp.rechnung\r\nJOIN adresse_rolle ar ON ar.adresse = r.adresse AND subjekt='Mitglied' AND objekt='Gruppe'\r\nJOIN gruppen g ON ar.parameter =g.id\r\nLEFT JOIN (SELECT gp.auftrag_position_id, SUM(gp.menge) AS menge FROM gutschrift_position AS gp JOIN gutschrift g ON gp.gutschrift = g.id WHERE gp.auftrag_position_id<>0 AND g.status <>'angelegt' AND g.status <> 'storniert' GROUP BY auftrag_position_id) AS gp on rp.auftrag_position_id = gp.auftrag_position_id\r\nWHERE r.status<>'angelegt' AND r.status<>'storniert' AND g.art='gruppe' AND IF('{VON}'=0,1,r.datum>='{VON}') AND IF('{BIS}'=0,1,r.datum<='{BIS}')",
"columns": [
{
"key_name": "datum",
"title": "Datum",
"width": "21",
"alignment": "left",
"sum": 0,
"sorting": "numeric",
"format_type": null
},
{
"key_name": "name",
"title": "Gruppenname",
"width": "21",
"alignment": "left",
"sum": 0,
"sorting": "alphabetic",
"format_type": null
},
{
"key_name": "menge",
"title": "Menge",
"width": "21",
"alignment": "right",
"sum": 1,
"sorting": "numeric",
"format_type": null
},
{
"key_name": "umsatz",
"title": "Umsatz",
"width": "21",
"alignment": "right",
"sum": 1,
"sorting": "numeric",
"format_type": null
},
{
"key_name": "umsatzohnerabatt",
"title": "Umsatz ohne Rabatt",
"width": "21",
"alignment": "right",
"sum": 1,
"sorting": "numeric",
"format_type": null
},
{
"key_name": "gesamtrabatt",
"title": "Gesamtrabatt",
"width": "21",
"alignment": "right",
"sum": 1,
"sorting": "numeric",
"format_type": null
},
{
"key_name": "deckungsbeitrag",
"title": "Deckungsbeitrag",
"width": "21",
"alignment": "right",
"sum": 1,
"sorting": "numeric",
"format_type": null
},
{
"key_name": "ek",
"title": "EK",
"width": "21",
"alignment": "right",
"sum": 1,
"sorting": "numeric",
"format_type": null
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "21",
"alignment": "left",
"sum": 1,
"sorting": "alphabetic",
"format_type": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "Controlling",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,119 @@
{
"name": "155 - Auflistung Auftr\u00e4ge pro Mitarbeiter (sortiert)",
"description": "Ausgabe aller freigegebenen Auftr\u00e4ge innerhalb eines bestimmten Zeitraums mit zugeh\u00f6rigem Bearbeiter, sortiert nach Bearbeiter.",
"project": 0,
"sql_query": "SELECT \r\nauf.datum, \r\nauf.belegnr, \r\nauf.kundennummer, \r\nauf.name, \r\na.name AS bearbeiter, \r\nROUND(auf.umsatz_netto,2) AS umsatz_netto,\r\nauf.waehrung AS waehrung\r\nFROM auftrag auf\r\nLEFT JOIN adresse a ON auf.bearbeiterid = a.id\r\nWHERE auf.status = 'freigegeben' AND IF('{VON}'=0,1,auf.datum>='{VON}') AND IF('{BIS}'=0,1,auf.datum<='{BIS}')\r\nORDER BY a.name",
"columns": [
{
"key_name": "datum",
"title": "Datum",
"width": "",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "belegnr",
"title": "Belegnummer",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "kundennummer",
"title": "Kundennr.",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "name",
"title": "Kunde",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "bearbeiter",
"title": "Bearbeiter",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "umsatz_netto",
"title": "Umsatz (netto)",
"width": "",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "waehrung",
"title": "W\u00e4hrung",
"width": "",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "CRM & Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,155 @@
{
"name": "156 - Umsatz pro Kunde nach Lieferadresse (einfach)",
"description": "Umsatz pro Kunde nach Lieferadresse",
"project": 0,
"sql_query": "SELECT \r\n MIN(x.datum) AS vondatum, \r\n MAX(x.datum)AS bisdatum, \r\n a.name AS kundename, \r\n a.kundennummer AS kundennummer, \r\n x.name AS liefername,\r\n x.strasse AS lieferstrasse,\r\n x.ort AS lieferort,\r\n x.plz AS lieferplz, \r\n x.land AS lieferland, \r\n ROUND(SUM(x.umsatz_netto),2) AS summe, \r\n x.waehrung AS waehrung\r\nFROM adresse a\r\nJOIN\r\n (SELECT l.adresse,r.umsatz_netto,l.name,l.strasse,l.ort,l.plz,l.land,r.waehrung,r.datum FROM rechnung r JOIN lieferschein l ON r.id = l.rechnungid\r\n WHERE r.status<>'angelegt' AND r.status<>'storniert' AND l.status <> 'angelegt' AND l.status <> 'storniert' AND IF('{VON}'=0,1,r.datum>='{VON}') AND IF('{BIS}'=0,1,r.datum<='{BIS}')\r\n UNION ALL\r\n SELECT l.adresse,-g.umsatz_netto,l.name,l.strasse,l.ort,l.plz,l.land,g.waehrung,g.datum FROM gutschrift g JOIN rechnung r ON g.rechnungid = r.id JOIN lieferschein l ON r.id = l.rechnungid\r\n WHERE g.status<>'angelegt' AND g.status<>'storniert' AND IF('{VON}'=0,1,g.datum>='{VON}') AND IF('{BIS}'=0,1,g.datum<='{BIS}')) AS x on x.adresse = a.id\r\nGROUP BY\r\n a.id, x.name,x.strasse,x.ort, x.plz, x.land, x.waehrung",
"columns": [
{
"key_name": "vondatum",
"title": "Vondatum",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "bisdatum",
"title": "Bisdatum",
"width": "17",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "kundename",
"title": "Kundename",
"width": "17",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "kundennummer",
"title": "Kundennummer",
"width": "17",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "liefername",
"title": "Liefername",
"width": "17",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "lieferstrasse",
"title": "Lieferstrasse",
"width": "17",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "lieferort",
"title": "Lieferort",
"width": "17",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "lieferplz",
"title": "Lieferplz",
"width": "17",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "lieferland",
"title": "Lieferland",
"width": "17",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "summe",
"title": "Summe",
"width": "17",
"alignment": "right",
"sorting": "numeric",
"sum": 0,
"format_type": "sum_money_de"
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "17",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "CRM & Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,189 @@
{
"name": "157 - Umsatz pro Kunde nach Lieferadresse (erweitert)",
"description": "Umsatz pro Kunde nach Lieferadresse",
"project": 0,
"sql_query": "SELECT CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN x.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(x.datum - INTERVAL (WEEKDAY(x.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN (x.datum - INTERVAL (DAYOFMONTH(x.datum) - 1) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(x.datum), 1) + INTERVAL QUARTER(x.datum) QUARTER -\r\n INTERVAL 1 QUARTER\r\n ELSE MAKEDATE(YEAR(x.datum), 1)\r\n END AS von,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN x.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN DATE(x.datum + INTERVAL (6 - WEEKDAY(x.datum)) DAY)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN LAST_DAY(x.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN MAKEDATE(YEAR(x.datum), 1) + INTERVAL QUARTER(x.datum) QUARTER -\r\n INTERVAL 1 DAY\r\n ELSE LAST_DAY(DATE_ADD(x.datum, INTERVAL 12 - MONTH(x.datum) MONTH))\r\n END AS bis,\r\n a.name AS kundename,\r\n a.kundennummer AS kundennummer,\r\n x.name AS liefername,\r\n x.strasse AS lieferstrasse,\r\n x.ort AS lieferort,\r\n x.plz AS lieferplz,\r\n x.land AS lieferland,\r\n ROUND(SUM(x.menge), 0) AS menge,\r\n ROUND(SUM(x.umsatz_netto), 2) AS summe,\r\n x.waehrung AS waehrung\r\nFROM adresse a\r\n JOIN\r\n (SELECT l.adresse,\r\n r.umsatz_netto,\r\n l.name,\r\n l.strasse,\r\n l.ort,\r\n l.plz,\r\n l.land,\r\n r.waehrung,\r\n r.datum,\r\n SUM(rp.menge) AS menge\r\n FROM rechnung AS r\r\n JOIN lieferschein l ON r.id = l.rechnungid\r\n JOIN rechnung_position AS rp ON r.id = rp.rechnung\r\n WHERE r.status <> 'angelegt'\r\n AND r.status <> 'storniert'\r\n AND l.status <> 'angelegt'\r\n AND l.status <> 'storniert'\r\n AND IF('{VON}' = 0, 1, r.datum >= '{VON}')\r\n AND IF('{BIS}' = 0, 1, r.datum <= '{BIS}')\r\n GROUP BY r.id\r\n UNION ALL\r\n SELECT l.adresse,\r\n -g.umsatz_netto,\r\n l.name,\r\n l.strasse,\r\n l.ort,\r\n l.plz,\r\n l.land,\r\n g.waehrung,\r\n g.datum,\r\n -SUM(gp.menge) AS menge\r\n FROM gutschrift AS g\r\n JOIN rechnung r ON g.rechnungid = r.id\r\n JOIN lieferschein l ON r.id = l.rechnungid\r\n JOIN gutschrift_position AS gp ON g.id = gp.gutschrift\r\n WHERE g.status <> 'angelegt'\r\n AND g.status <> 'storniert'\r\n AND IF('{VON}' = 0, 1, g.datum >= '{VON}')\r\n AND IF('{BIS}' = 0, 1, g.datum <= '{BIS}')\r\n GROUP BY g.id) AS x on x.adresse = a.id\r\nGROUP BY a.id, x.name, x.strasse, x.ort, x.plz, x.land, x.waehrung,\r\n CASE\r\n WHEN '{GRUPPIERUNG}' = 'tag' THEN x.datum\r\n WHEN '{GRUPPIERUNG}' = 'woche' THEN WEEK(x.datum)\r\n WHEN '{GRUPPIERUNG}' = 'monat' THEN MONTH(x.datum)\r\n WHEN '{GRUPPIERUNG}' = 'quartal' THEN QUARTER(x.datum)\r\n ELSE YEAR(x.datum)\r\n END",
"columns": [
{
"key_name": "von",
"title": "Von",
"width": "15",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "bis",
"title": "Bis",
"width": "15",
"alignment": "left",
"sorting": "numeric",
"sum": 0,
"format_type": "date_dmy"
},
{
"key_name": "kundename",
"title": "Kundename",
"width": "15",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "kundennummer",
"title": "Kundennummer",
"width": "15",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "liefername",
"title": "Liefername",
"width": "15",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "lieferstrasse",
"title": "Lieferstrasse",
"width": "15",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "lieferort",
"title": "Lieferort",
"width": "15",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "lieferplz",
"title": "Lieferplz",
"width": "15",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "lieferland",
"title": "Lieferland",
"width": "15",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "menge",
"title": "Menge",
"width": "15",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": null
},
{
"key_name": "summe",
"title": "Summe",
"width": "15",
"alignment": "right",
"sorting": "numeric",
"sum": 1,
"format_type": "sum_money_de"
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "15",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Gruppierung",
"default_value": "tag",
"displayname": "Gruppierungszeitraum",
"options": [
{
"Tag": "tag"
},
{
"Woche": "woche"
},
{
"Monat": "monat"
},
{
"Quartal": "quartal"
},
{
"Jahr": "jahr"
}
],
"description": "Auswahl des Zeitraums \u00fcber den gruppiert werden soll",
"editable": true,
"control_type": "combobox"
}
],
"remark": "",
"category": "CRM & Vertrieb",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,120 @@
{
"name": "158 - Umsatz pro Kunde nach Lieferadresse (BI)",
"description": "Umsatz pro Kunde nach Lieferadresse",
"project": 0,
"sql_query": "SELECT \r\n x.datum AS datum,\r\n a.name AS kundename, \r\n a.kundennummer AS kundennummer, \r\n x.name AS liefername,\r\n x.strasse AS lieferstrasse,\r\n x.ort AS lieferort,\r\n x.plz AS lieferplz, \r\n x.land AS lieferland, \r\n x.menge AS menge,\r\n x.umsatz_netto AS summe,\r\n x.waehrung AS waehrung,\r\n x.typ AS typ\r\nFROM adresse a\r\nJOIN\r\n (SELECT l.adresse,r.umsatz_netto,l.name,l.strasse,l.ort,l.plz,l.land,r.waehrung,r.datum, SUM(rp.menge) AS menge, 'Rechnung' AS typ FROM rechnung AS r JOIN lieferschein l ON r.id = l.rechnungid\r\n JOIN rechnung_position AS rp ON r.id = rp.rechnung\r\n WHERE r.status<>'angelegt' AND r.status<>'storniert' AND l.status <> 'angelegt' AND l.status <> 'storniert' AND IF('{VON}'=0,1,r.datum>='{VON}') AND IF('{BIS}'=0,1,r.datum<='{BIS}')\r\n GROUP BY r.id\r\n UNION ALL\r\n SELECT l.adresse,-g.umsatz_netto,l.name,l.strasse,l.ort,l.plz,l.land,g.waehrung,g.datum, -SUM(gp.menge) AS menge, 'Gutschrift' AS typ FROM gutschrift AS g JOIN rechnung r ON g.rechnungid = r.id JOIN lieferschein l ON r.id = l.rechnungid\r\n JOIN gutschrift_position AS gp ON g.id = gp.gutschrift\r\n WHERE g.status<>'angelegt' AND g.status<>'storniert' AND IF('{VON}'=0,1,g.datum>='{VON}') AND IF('{BIS}'=0,1,g.datum<='{BIS}')\r\n GROUP BY g.id) AS x on x.adresse = a.id",
"columns": [
{
"key_name": "datum",
"title": "Datum",
"width": "15",
"alignment": "left",
"sum": 0
},
{
"key_name": "kundename",
"title": "Kundename",
"width": "15",
"alignment": "left",
"sum": 0
},
{
"key_name": "kundennummer",
"title": "Kundennummer",
"width": "15",
"alignment": "left",
"sum": 0
},
{
"key_name": "liefername",
"title": "Liefername",
"width": "15",
"alignment": "left",
"sum": 0
},
{
"key_name": "lieferstrasse",
"title": "Lieferstrasse",
"width": "15",
"alignment": "left",
"sum": 0
},
{
"key_name": "lieferort",
"title": "Lieferort",
"width": "15",
"alignment": "left",
"sum": 0
},
{
"key_name": "lieferplz",
"title": "Lieferplz",
"width": "15",
"alignment": "left",
"sum": 0
},
{
"key_name": "lieferland",
"title": "Lieferland",
"width": "15",
"alignment": "left",
"sum": 0
},
{
"key_name": "menge",
"title": "Menge",
"width": "15",
"alignment": "right",
"sum": 1
},
{
"key_name": "summe",
"title": "Summe",
"width": "15",
"alignment": "right",
"sum": 1
},
{
"key_name": "waehrung",
"title": "Waehrung",
"width": "15",
"alignment": "left",
"sum": 0
},
{
"key_name": "typ",
"title": "Typ",
"width": "15",
"alignment": "left",
"sum": 0
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "CRM \u0026 Vertrieb",
"share": {
"file_public": true,
"file_pdf_enabled" :true,
"file_csv_enabled" :true,
"file_xls_enabled" :true
}
}
@@ -0,0 +1,204 @@
{
"name": "159 - Meldebestand Lager auf Basis eines Freifeldes",
"description": "Zeigt alle Artikel an, deren Lagerbestand den in einem Freifeld gef\u00fchrten Meldebestand unterschreitet.",
"project": 0,
"sql_query": "SELECT \r\na.name_de AS artikel, \r\na.nummer AS artikelnummer, \r\na.freifeld{FREIFELD} AS meldebestand, \r\nSUM(lpi.menge) AS lagerbestand\r\nFROM lager_platz_inhalt AS lpi\r\nJOIN artikel a ON lpi.artikel = a.id\r\nWHERE a.freifeld{FREIFELD}<>'' AND a.geloescht=0 AND a.nummer<>'DEL'\r\nGROUP BY lpi.artikel\r\nHAVING a.freifeld{FREIFELD} > SUM(lpi.menge)",
"columns": [
{
"key_name": "artikel",
"title": "Artikel",
"width": "47",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "artikelnummer",
"title": "Artikelnummer",
"width": "47",
"alignment": "left",
"sorting": "alphabetic",
"sum": 0,
"format_type": null
},
{
"key_name": "meldebestand",
"title": "Meldebestand",
"width": "47",
"alignment": "right",
"sorting": "numeric",
"sum": 0,
"format_type": null
},
{
"key_name": "lagerbestand",
"title": "Lagerbestand",
"width": "47",
"alignment": "right",
"sorting": "numeric",
"sum": 0,
"format_type": null
}
],
"parameters": [
{
"varname": "Freifeld",
"default_value": "40",
"displayname": "Freifeld",
"options": [
{
"1": "1"
},
{
"2": "2"
},
{
"3": "3"
},
{
"4": "4"
},
{
"5": "5"
},
{
"6": "6"
},
{
"7": "7"
},
{
"8": "8"
},
{
"9": "9"
},
{
"10": "10"
},
{
"11": "11"
},
{
"12": "12"
},
{
"13": "13"
},
{
"14": "14"
},
{
"15": "15"
},
{
"16": "16"
},
{
"17": "17"
},
{
"18": "18"
},
{
"19": "19"
},
{
"20": "20"
},
{
"21": "21"
},
{
"22": "22"
},
{
"23": "23"
},
{
"24": "24"
},
{
"25": "25"
},
{
"26": "26"
},
{
"27": "27"
},
{
"28": "28"
},
{
"29": "29"
},
{
"30": "30"
},
{
"31": "31"
},
{
"32": "32"
},
{
"33": "33"
},
{
"34": "34"
},
{
"35": "35"
},
{
"36": "36"
},
{
"37": "37"
},
{
"38": "38"
},
{
"39": "39"
},
{
"40": "40"
}
],
"description": "Nummer des Freifeldes in der der Meldebestand steht",
"editable": true,
"control_type": "combobox"
}
],
"remark": "",
"category": "Lager & Logistik",
"csv_delimiter": ",",
"csv_enclosure": "",
"share": {
"chart_public": false,
"chart_axislabel": "",
"chart_dateformat": "Y-m-d H:i:s",
"chart_interval_value": 0,
"chart_interval_mode": "day",
"file_public": true,
"file_pdf_enabled": true,
"file_csv_enabled": true,
"file_xls_enabled": true,
"menu_public": false,
"menu_doctype": "",
"menu_label": "",
"menu_format": "csv",
"tab_public": false,
"tab_module": "",
"tab_action": "",
"tab_label": "",
"tab_position": "nach_freifeld",
"chart_type": "line",
"chart_x_column": "",
"data_columns": "",
"chart_group_column": ""
}
}
@@ -0,0 +1,63 @@
{
"name": "160 - Neu erstellte Adressen mit Leadmarkierung und Vertrieb innerhalb eines Zeitraums",
"description": "Gibt alle neu erstellten Adressen mit Leadmarkierung innerhalb eines bestimmten Zeitraums mit zugeh\u00f6rigem Vertriebsmitarbeiter aus.",
"project": 0,
"sql_query": "SELECT \r\n op.zeitstempel AS angelegt_am, \r\n a.name AS adresse, \r\n v.name AS vertrieb \r\nFROM objekt_protokoll op \r\nLEFT JOIN adresse a ON op.objektid = a.id \r\nLEFT JOIN adresse v ON a.vertrieb = v.id \r\nWHERE a.`lead` = 1 AND op.objekt = 'adresse' AND op.action_long = 'adresse_create' AND IF('{VON}'=0,1,op.zeitstempel>='{VON}') AND IF('{BIS}'=0,1,op.zeitstempel<='{BIS}')",
"columns": [
{
"key_name": "angelegt_am",
"title": "Angelegt am",
"width": "",
"alignment": "left",
"sum": 0,
"format_type": "date_dmy",
"sorting": "numeric"
},
{
"key_name": "adresse",
"title": "Adressname",
"width": "",
"alignment": "left",
"sum": 0,
"format_type": null,
"sorting": "alphabetic"
},
{
"key_name": "vertrieb",
"title": "Vertriebsmitarbeiter",
"width": "",
"alignment": "left",
"sum": 0,
"format_type": null,
"sorting": "alphabetic"
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "CRM \u0026 Vertrieb",
"share": {
"file_public": true,
"file_pdf_enabled" :true,
"file_csv_enabled" :true,
"file_xls_enabled" :true
}
}
@@ -0,0 +1,98 @@
{
"name": "161 - Paketmarken mit Tracking innerhalb eines Zeitraums",
"description": "Erzeugte Paketmarken mit Trackingnummer von beliebiger Versandart (Modul) innerhalb eines bestimmten Zeitraums.",
"project": 0,
"sql_query": "SELECT \r\n v.versendet_am AS versendet_am, \r\n l.belegnr, \r\n l.kundennummer, \r\n l.name, \r\n l.land, \r\n v.tracking\r\nFROM versand v \r\nLEFT JOIN lieferschein l ON v.lieferschein = l.id\r\nWHERE v.abgeschlossen = 1 \r\nAND IF('{VON}'=0,1,v.versendet_am>='{VON}') AND IF('{BIS}'=0,1,v.versendet_am<='{BIS}') \r\nAND IF('{VERSANDART}'='0', 1, LOWER(v.versandart) LIKE LOWER('%{VERSANDART}%'))",
"columns": [
{
"key_name": "versendet_am",
"title": "Versendet am",
"width": "",
"alignment": "left",
"sum": 0,
"format_type": "date_dmy",
"sorting": "numeric"
},
{
"key_name": "belegnr",
"title": "Belegnr.",
"width": "",
"alignment": "left",
"sum": 0,
"format_type": null,
"sorting": "alphabetic"
},
{
"key_name": "kundennummer",
"title": "Kundennr.",
"width": "",
"alignment": "left",
"sum": 0,
"format_type": null,
"sorting": "alphabetic"
},
{
"key_name": "name",
"title": "Name",
"width": "",
"alignment": "left",
"sum": 0,
"format_type": null,
"sorting": "alphabetic"
},
{
"key_name": "land",
"title": "Land",
"width": "",
"alignment": "left",
"sum": 0,
"format_type": null,
"sorting": "alphabetic"
},
{
"key_name": "tracking",
"title": "Tracking",
"width": "",
"alignment": "left",
"sum": 0,
"format_type": null,
"sorting": "alphabetic"
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Versandart",
"default_value": "0",
"displayname": "Eingrenzen auf Versandart",
"options": [],
"description": "Versandart auf die eingegrenzt werden soll",
"editable": true
}
],
"remark": "",
"category": "Lager \u0026 Logistik",
"share": {
"file_public": true,
"file_pdf_enabled" :true,
"file_csv_enabled" :true,
"file_xls_enabled" :true
}
}
@@ -0,0 +1,106 @@
{
"name": "162 - Zu erzeugende Paketmarken (DPD) innerhalb eines Zeitraums",
"description": "Zu erzeugende Paketmarken von DPD innerhalb eines bestimmten Zeitraums.",
"project": 0,
"sql_query": "SELECT l.belegnr, l.kundennummer, l.name, l.ansprechpartner, l.abteilung, l.strasse, l.plz, l.ort, l.land, v.gewicht\r\nFROM versand v \r\nLEFT JOIN lieferschein l ON v.lieferschein = l.id\r\nWHERE v.abgeschlossen = 0 AND IF('{VON}'=0,1,v.versendet_am>='{VON}') AND IF('{BIS}'=0,1,v.versendet_am<='{BIS}') AND v.versandart LIKE 'dpdapi'",
"columns": [
{
"key_name": "belegnr",
"title": "Belegnr.",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "kundennummer",
"title": "Kundennr.",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "name",
"title": "Name",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "ansprechpartner",
"title": "Ansprechpartner",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "abteilung",
"title": "Abteilung",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "strasse",
"title": "Strasse",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "plz",
"title": "PLZ",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "ort",
"title": "Ort",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "land",
"title": "Land",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "gewicht",
"title": "Gewicht",
"width": "",
"alignment": "left",
"sum": 0
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "Lager \u0026 Logistik",
"share": {
"file_public": true,
"file_pdf_enabled" :true,
"file_csv_enabled" :true,
"file_xls_enabled" :true
}
}
@@ -0,0 +1,99 @@
{
"name": "163 - Zu erzeugende Paketmarken (DHL) innerhalb eines Zeitraums",
"description": "Zu erzeugende Paketmarken von DHL innerhalb eines bestimmten Zeitraums.",
"project": 0,
"sql_query": "SELECT l.belegnr, l.kundennummer, l.name, l.ansprechpartner, l.abteilung, l.strasse, l.plz, l.ort, l.land, v.gewicht\r\nFROM versand v \r\nLEFT JOIN lieferschein l ON v.lieferschein = l.id\r\nWHERE v.abgeschlossen = 0 AND IF('{VON}'=0,1,v.versendet_am>='{VON}') AND IF('{BIS}'=0,1,v.versendet_am<='{BIS}') AND v.versandart LIKE 'dhlversenden'",
"columns": [
{
"key_name": "belegnr",
"title": "Belegnr.",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "kundennummer",
"title": "Kundennr.",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "name",
"title": "Name",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "ansprechpartner",
"title": "Ansprechpartner",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "strasse",
"title": "Strasse",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "plz",
"title": "PLZ",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "ort",
"title": "Ort",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "land",
"title": "Land",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "gewicht",
"title": "Gewicht",
"width": "",
"alignment": "left",
"sum": 0
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "Lager \u0026 Logistik",
"share": {
"file_public": true,
"file_pdf_enabled" :true,
"file_csv_enabled" :true,
"file_xls_enabled" :true
}
}
@@ -0,0 +1,106 @@
{
"name": "164 - Zu erzeugende Paketmarken innerhalb eines Zeitraums",
"description": "Zu erzeugende Paketmarken innerhalb eines bestimmten Zeitraums.",
"project": 0,
"sql_query": "SELECT l.belegnr, l.kundennummer, l.name, l.ansprechpartner, l.abteilung, l.strasse, l.plz, l.ort, l.land, v.gewicht\r\nFROM versand v \r\nLEFT JOIN lieferschein l ON v.lieferschein = l.id\r\nWHERE v.abgeschlossen = 0 AND IF('{VON}'=0,1,v.versendet_am>='{VON}') AND IF('{BIS}'=0,1,v.versendet_am<='{BIS}') AND v.versandart LIKE ''",
"columns": [
{
"key_name": "belegnr",
"title": "Belegnr.",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "kundennummer",
"title": "Kundennr.",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "name",
"title": "Name",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "ansprechpartner",
"title": "Ansprechpartner",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "abteilung",
"title": "Abteilung",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "strasse",
"title": "Strasse",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "plz",
"title": "PLZ",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "ort",
"title": "Ort",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "land",
"title": "Land",
"width": "",
"alignment": "left",
"sum": 0
},
{
"key_name": "gewicht",
"title": "Gewicht",
"width": "",
"alignment": "left",
"sum": 0
}
],
"parameters": [
{
"varname": "Von",
"default_value": "0",
"displayname": "Beachten ab Datum",
"options": [],
"description": "Fr\u00fchester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
},
{
"varname": "Bis",
"default_value": "0",
"displayname": "Beachten bis Datum",
"options": [],
"description": "Sp\u00e4tester Zeitpunkt f\u00fcr den Auftr\u00e4ge beachtet werden sollen",
"editable": true,
"control_type": "date"
}
],
"remark": "",
"category": "Lager \u0026 Logistik",
"share": {
"file_public": true,
"file_pdf_enabled" :true,
"file_csv_enabled" :true,
"file_xls_enabled" :true
}
}

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