fix billing process

This commit is contained in:
Dennis Eichhorn 2023-04-08 04:36:25 +02:00
parent a9b7103be8
commit f1562c4307
15 changed files with 287 additions and 229 deletions

View File

@ -8,9 +8,11 @@ assignees: ''
--- ---
# Bug Description # Bug Description
A clear and concise description of what the bug is. A clear and concise description of what the bug is.
# How to Reproduce # How to Reproduce
Steps to reproduce the behavior: Steps to reproduce the behavior:
1. Go to '...' 1. Go to '...'
@ -19,16 +21,20 @@ Steps to reproduce the behavior:
4. See error 4. See error
# Expected Behavior # Expected Behavior
A clear and concise description of what you expected to happen. A clear and concise description of what you expected to happen.
# Screenshots # Screenshots
If applicable, add screenshots to help explain your problem. If applicable, add screenshots to help explain your problem.
# System Information # System Information
- System: [e.g. PC or iPhone11, ...]
- OS: [e.g. iOS] - System: [e.g. PC or iPhone11, ...]
- Browser [e.g. chrome, safari] - OS: [e.g. iOS]
- KarakaVersion [e.g. 22] - Browser [e.g. chrome, safari]
- KarakaVersion [e.g. 22]
# Additional Information # Additional Information
Add any other context about the problem here. Add any other context about the problem here.

View File

@ -45,32 +45,36 @@ class Media
\Modules\Admin\Admin\Installer::installExternal($app, \Modules\Admin\Admin\Installer::installExternal($app,
[ [
'type' => 'setting', 'data' => [
'name' => SettingsEnum::DEFAULT_LIST_EXPORTS, [
'content' => (string) $media['collection'][4]['id'], 'type' => 'setting',
'pattern' => '\\d+', 'name' => SettingsEnum::DEFAULT_LIST_EXPORTS,
'module' => 'Admin' 'content' => (string) $media['collection'][4]['id'],
], 'pattern' => '\\d+',
[ 'module' => 'Admin'
'type' => 'setting', ],
'name' => SettingsEnum::DEFAULT_LETTERS, [
'content' => (string) $media['collection'][5]['id'], 'type' => 'setting',
'pattern' => '\\d+', 'name' => SettingsEnum::DEFAULT_LETTERS,
'module' => 'Admin' 'content' => (string) $media['collection'][5]['id'],
], 'pattern' => '\\d+',
[ 'module' => 'Admin'
'type' => 'setting', ],
'name' => SettingsEnum::DEFAULT_ASSETS, [
'content' => (string) $media['upload'][0]['id'], 'type' => 'setting',
'pattern' => '\\d+', 'name' => SettingsEnum::DEFAULT_ASSETS,
'module' => 'Admin' 'content' => (string) $media['upload'][0]['id'],
], 'pattern' => '\\d+',
[ 'module' => 'Admin'
'type' => 'setting', ],
'name' => SettingsEnum::DEFAULT_TEMPLATES, [
'content' => (string) $media['upload'][1]['id'], 'type' => 'setting',
'pattern' => '\\d+', 'name' => SettingsEnum::DEFAULT_TEMPLATES,
'module' => 'Admin' 'content' => (string) $media['upload'][1]['id'],
'pattern' => '\\d+',
'module' => 'Admin'
]
]
] ]
); );
} }

View File

@ -19,6 +19,8 @@ declare(strict_types=1);
* @license OMS License 2.0 * @license OMS License 2.0
* @link https://jingga.app * @link https://jingga.app
* @since 1.0.0 * @since 1.0.0
*
* @phpstan-import-type TCPDF from ../../../../../Resources/tcpdf.php
*/ */
class DefaultPdf extends TCPDF class DefaultPdf extends TCPDF
{ {
@ -46,6 +48,43 @@ class DefaultPdf extends TCPDF
*/ */
public int $sideMargin = 15; public int $sideMargin = 15;
public string $language = 'en';
public array $lang = [
'en' => [
'Page' => 'Page',
'CEO' => 'CEO',
'TaxOffice' => 'Tax office',
'TaxNumber' => 'Tax number',
'Swift' => 'BIC',
'BankAccount' => 'Account',
],
'de' => [
'Page' => 'Seite',
'CEO' => 'Geschäftsführer',
'TaxOffice' => 'Finanzamt',
'TaxNumber' => 'Steuernummer',
'Swift' => 'BIC',
'BankAccount' => 'IBAN',
]
];
public array $attributes = [
'legal_name' => '',
'address' => '',
'city' => '',
'country' => '',
'ceo' => '',
'tax_office' => '',
'tax_number' => '',
'bank_name' => '',
'swift' => '',
'bank_account' => '',
'website' => '',
'email' => '',
'phone' => '',
];
/** /**
* Constructor. * Constructor.
* *
@ -55,29 +94,24 @@ class DefaultPdf extends TCPDF
{ {
parent::__construct('P', 'mm', 'A4', true, 'UTF-8', false); parent::__construct('P', 'mm', 'A4', true, 'UTF-8', false);
$this->SetCreator("Jingga");
// set default header data // set default header data
$this->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, 'Jingga', 'Business solutions made simple.'); $this->setHeaderData('', 15, 'Jingga', 'Business solutions made simple.');
// set header and footer fonts // set header and footer fonts
$this->SetHeaderFont([PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN]); $this->setHeaderFont([PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN]);
$this->SetFooterFont([PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA]); $this->setFooterFont([PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA]);
// set default monospaced font // set default monospaced font
$this->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); $this->setDefaultMonospacedFont(PDF_FONT_MONOSPACED);
// set margins // set margins
$this->SetMargins(15, 30, 15); $this->setMargins(15, 30, 15);
// set auto page breaks // set auto page breaks
$this->SetAutoPageBreak(true, 25); $this->setAutoPageBreak(true, 25);
// set image scale factor // set image scale factor
$this->SetImageScale(PDF_IMAGE_SCALE_RATIO); $this->setImageScale(PDF_IMAGE_SCALE_RATIO);
// add a page
$this->AddPage();
} }
/** /**
@ -93,15 +127,21 @@ class DefaultPdf extends TCPDF
$this->header_xobjid = $this->startTemplate($this->w, 0); $this->header_xobjid = $this->startTemplate($this->w, 0);
// Set Logo // Set Logo
$image_file = '/home/spl1nes/Orange-Management/Web/Backend/img/logo.png'; if (!empty($this->header_logo)) {
$this->Image($image_file, 15, 15, 15, 15, 'PNG', '', 'T', false, 300, '', false, false, 0, false, false, false); $this->Image(
$this->header_logo,
15, 15,
$this->header_logo_width, 0,
'PNG', '', 'T', false, 300, '', false, false, 0, false, false, false
);
}
// Set Title // Set Title
$this->SetFont('helvetica', 'B', 20); $this->setFont('helvetica', 'B', 20);
$this->setX(15 + 15 + 3); $this->setX(15 + 15 + 3);
$this->Cell(0, 14, $this->header_title, 0, false, 'L', 0, '', 0, false, 'T', 'M'); $this->Cell(0, 14, $this->header_title, 0, false, 'L', 0, '', 0, false, 'T', 'M');
$this->SetFont('helvetica', '', 10); $this->setFont('helvetica', '', 10);
$this->setX(15 + 15 + 3); $this->setX(15 + 15 + 3);
$this->Cell(0, 26, $this->header_string, 0, false, 'L', 0, '', 0, false, 'T', 'M'); $this->Cell(0, 26, $this->header_string, 0, false, 'L', 0, '', 0, false, 'T', 'M');
@ -138,50 +178,52 @@ class DefaultPdf extends TCPDF
*/ */
public function Footer() : void public function Footer() : void
{ {
$this->SetY(-25); $this->setY(-25);
$this->SetFont('helvetica', 'I', 7); $this->setFont('helvetica', 'I', 7);
$this->Cell($this->getPageWidth() - 22, 0, 'Page '.$this->getAliasNumPage().'/'.$this->getAliasNbPages(), 0, false, 'R', 0, '', 0, false, 'T', 'M'); $this->Cell($this->getPageWidth() - 22, 0, $this->lang[$this->language]['Page'] . ' '.$this->getAliasNumPage().'/'.$this->getAliasNbPages(), 0, false, 'R', 0, '', 0, false, 'T', 'M');
$this->Ln(); $this->Ln();
$this->Ln(); $this->Ln();
$this->SetFillColor(245, 245, 245); $this->SetFillColor(245, 245, 245);
$this->SetX(0); $this->setX(0);
$this->Cell($this->getPageWidth(), 25, '', 0, 0, 'L', true, '', 0, false, 'T', 'T'); $this->Cell($this->getPageWidth(), 25, '', 0, 0, 'L', true, '', 0, false, 'T', 'T');
$this->SetFont('helvetica', '', 7); $this->setFont('helvetica', '', 7);
$this->SetXY(15 + 10, -15, true); $this->setXY(15 + 10, -15, true);
$this->MultiCell(30, 0, "Jingga e.K.\nGartenstr. 26\n61206 Woellstadt", 0, 'L', false, 1, null, null, true, 0, false, true, 0, 'B'); $this->MultiCell(
30, 0,
$this->attributes['legal_name'] . "\n"
. $this->attributes['address'] . "\n"
. $this->attributes['city'],
0, 'L', false, 1, null, null, true, 0, false, true, 0, 'B'
);
$this->SetXY(25 + 15 + 20, -15, true); $this->setXY(25 + 15 + 20, -15, true);
$this->MultiCell(40, 0, "Geschäftsführer: Dennis Eichhorn\nFinanzamt: HRB ???\nUSt Id: DE ??????????", 0, 'L', false, 1, null, null, true, 0, false, true, 0, 'B'); $this->MultiCell(
40, 0,
$this->lang[$this->language]['CEO']. ': ' . $this->attributes['ceo'] . "\n"
. $this->lang[$this->language]['TaxOffice']. ': ' . $this->attributes['tax_office'] . "\n"
. $this->lang[$this->language]['TaxNumber']. ': ' . $this->attributes['tax_number'],
0, 'L', false, 1, null, null, true, 0, false, true, 0, 'B'
);
$this->SetXY(25 + 45 + 15 + 30, -15, true); $this->setXY(25 + 45 + 15 + 30, -15, true);
$this->MultiCell(35, 0, "Volksbank Mittelhessen\nBIC: ??????????\nIBAN: ???????????", 0, 'L', false, 1, null, null, true, 0, false, true, 0, 'B'); $this->MultiCell(
35, 0,
$this->attributes['bank_name'] . "\n"
. $this->lang[$this->language]['Swift']. ': ' . $this->attributes['swift'] . "\n"
. $this->lang[$this->language]['BankAccount']. ': ' . $this->attributes['bank_account'],
0, 'L', false, 1, null, null, true, 0, false, true, 0, 'B'
);
$this->SetXY(25 + 45 + 35 + 15 + 40, -15, true); $this->setXY(25 + 45 + 35 + 15 + 40, -15, true);
$this->MultiCell(35, 0, "www.jingga.app\ninfo@jingga.app\n+49 0152 ???????", 0, 'L', false, 1, null, null, true, 0, false, true, 0, 'B'); $this->MultiCell(
35, 0,
$this->attributes['website'] . "\n"
. $this->attributes['email'] . "\n"
. $this->attributes['phone'],
0, 'L', false, 1, null, null, true, 0, false, true, 0, 'B'
);
} }
} }
/*
[
'company' => '',
'slogan' => '',
'company_full' => '',
'address' => '',
'ciry' => '',
'manager' => '',
'tax_office' => '',
'tax_id' => '',
'tax_vat' => '',
'bank_name' => '',
'bank_bic' => '',
'bank_iban' => '',
'website' => '',
'email' => '',
'phone' => '',
'creator' => '',
'date' => '',
]
*/

View File

@ -22,7 +22,8 @@ $data = $this->getData('data') ?? [];
include $media->getSourceByName('template.php')->getAbsolutePath(); include $media->getSourceByName('template.php')->getAbsolutePath();
$excel = new DefaultPdf(); /** @phpstan-import-type DefaultPdf from ../../../../Admin/Install/Media/PdfDefaultTemplate/pdfTemplate.pdf.php */
$pdf = new DefaultPdf();
$topPos = $pdf->getY(); $topPos = $pdf->getY();
@ -46,4 +47,4 @@ foreach ($data as $i => $row) {
} }
$tbl .= '</table>'; $tbl .= '</table>';
$pdf->Output('list.pdf', 'I'); $pdf->Output('list.pdf', 'I');

View File

@ -16,7 +16,7 @@
}, },
"country_code2": { "country_code2": {
"name": "country_code2", "name": "country_code2",
"type": "VARCHAR(2)", "type": "VARCHAR(3)",
"null": false, "null": false,
"unique": true "unique": true
}, },
@ -930,7 +930,7 @@
"group_permission_app": { "group_permission_app": {
"description": "@todo: consider to use int as value and create foreign key", "description": "@todo: consider to use int as value and create foreign key",
"name": "group_permission_app", "name": "group_permission_app",
"type": "VARCHAR(255)", "type": "INT",
"default": null, "default": null,
"null": true "null": true
}, },
@ -1308,7 +1308,7 @@
}, },
"account_permission_app": { "account_permission_app": {
"name": "account_permission_app", "name": "account_permission_app",
"type": "VARCHAR(255)", "type": "INT",
"default": null, "default": null,
"null": true "null": true
}, },

View File

@ -7,164 +7,164 @@ use phpOMS\Message\Mail\SubmitType;
return [ return [
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::PASSWORD_PATTERN, 'name' => SettingsEnum::PASSWORD_PATTERN,
'content' => '/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[.,\/\(\)\{\}\[\]#?!@$%^&*+=\':"-]).{8,}$/', 'content' => '/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[.,\/\(\)\{\}\[\]#?!@$%^&*+=\':"-]).{8,}$/',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::LOGIN_TRIES, 'name' => SettingsEnum::LOGIN_TRIES,
'content' => '3', 'content' => '3',
'pattern' => '/\\d+/', 'pattern' => '/\\d+/',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::PASSWORD_INTERVAL, 'name' => SettingsEnum::PASSWORD_INTERVAL,
'content' => '90', 'content' => '90',
'pattern' => '/\\d+/', 'pattern' => '/\\d+/',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::PASSWORD_HISTORY, 'name' => SettingsEnum::PASSWORD_HISTORY,
'content' => '3', 'content' => '3',
'pattern' => '/\\d+/', 'pattern' => '/\\d+/',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::LOGGING_STATUS, 'name' => SettingsEnum::LOGGING_STATUS,
'content' => '1', 'content' => '1',
'pattern' => '/[0-3]/', 'pattern' => '/[0-3]/',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::LOGGING_PATH, 'name' => SettingsEnum::LOGGING_PATH,
'content' => '', 'content' => '',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::DEFAULT_UNIT, 'name' => SettingsEnum::DEFAULT_UNIT,
'content' => '1', 'content' => '1',
'pattern' => '/\\d+/', 'pattern' => '/\\d+/',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::LOGIN_STATUS, 'name' => SettingsEnum::LOGIN_STATUS,
'content' => '1', 'content' => '1',
'pattern' => '/[0-3]/', 'pattern' => '/[0-3]/',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::LOGIN_MAIL_REGISTRATION_TEMPLATE, 'name' => SettingsEnum::LOGIN_MAIL_REGISTRATION_TEMPLATE,
'content' => '', 'content' => '',
'pattern' => '/\\d*/', 'pattern' => '/\\d*/',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::LOGIN_MAIL_FORGOT_PASSWORD_TEMPLATE, 'name' => SettingsEnum::LOGIN_MAIL_FORGOT_PASSWORD_TEMPLATE,
'content' => '', 'content' => '',
'pattern' => '/\\d*/', 'pattern' => '/\\d*/',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::LOGIN_MAIL_FAILED_TEMPLATE, 'name' => SettingsEnum::LOGIN_MAIL_FAILED_TEMPLATE,
'content' => '', 'content' => '',
'pattern' => '/\\d*/', 'pattern' => '/\\d*/',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::DEFAULT_LOCALIZATION, 'name' => SettingsEnum::DEFAULT_LOCALIZATION,
'content' => '1', 'content' => '1',
'pattern' => '/\\d+/', 'pattern' => '/\\d+/',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::MAIL_SERVER_OUT, 'name' => SettingsEnum::MAIL_SERVER_OUT,
'content' => '', 'content' => '',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::MAIL_SERVER_PORT_OUT, 'name' => SettingsEnum::MAIL_SERVER_PORT_OUT,
'content' => '', 'content' => '',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::MAIL_SERVER_IN, 'name' => SettingsEnum::MAIL_SERVER_IN,
'content' => '', 'content' => '',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::MAIL_SERVER_PORT_IN, 'name' => SettingsEnum::MAIL_SERVER_PORT_IN,
'content' => '', 'content' => '',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::MAIL_SERVER_ADDR, 'name' => SettingsEnum::MAIL_SERVER_ADDR,
'content' => '', 'content' => '',
'pattern' => "/(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*|\"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/", 'pattern' => "/(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*|\"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/",
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::MAIL_SERVER_TYPE, 'name' => SettingsEnum::MAIL_SERVER_TYPE,
'content' => SubmitType::MAIL, 'content' => SubmitType::MAIL,
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::MAIL_SERVER_USER, 'name' => SettingsEnum::MAIL_SERVER_USER,
'content' => '', 'content' => '',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::MAIL_SERVER_PASS, 'name' => SettingsEnum::MAIL_SERVER_PASS,
'content' => '', 'content' => '',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::MAIL_SERVER_CERT, 'name' => SettingsEnum::MAIL_SERVER_CERT,
'content' => '', 'content' => '',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::MAIL_SERVER_KEY, 'name' => SettingsEnum::MAIL_SERVER_KEY,
'content' => '', 'content' => '',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::MAIL_SERVER_KEYPASS, 'name' => SettingsEnum::MAIL_SERVER_KEYPASS,
'content' => '', 'content' => '',
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::MAIL_SERVER_TLS, 'name' => SettingsEnum::MAIL_SERVER_TLS,
'content' => (string) false, 'content' => (string) false,
'module' => 'Admin', 'module' => 'Admin',
], ],
[ [
'type' => 'setting', 'type' => 'setting',
'name' => SettingsEnum::GROUP_GENERATE_AUTOMATICALLY_APP, 'name' => SettingsEnum::GROUP_GENERATE_AUTOMATICALLY_APP,
'content' => (string) true, 'content' => (string) true,
'module' => 'Admin', 'module' => 'Admin',
], ],
]; ];

View File

@ -239,16 +239,23 @@ final class Installer extends InstallerAbstract
*/ */
public static function installExternal(ApplicationAbstract $app, array $data) : array public static function installExternal(ApplicationAbstract $app, array $data) : array
{ {
if (!\is_file($data['path'] ?? '')) { if (!\is_file($data['path'] ?? '') && !isset($data['data'])) {
throw new PathException($data['path'] ?? ''); throw new PathException($data['path'] ?? '');
} }
$adminFile = \file_get_contents($data['path'] ?? ''); $adminData = [];
if ($adminFile === false) {
throw new PathException($data['path'] ?? ''); // @codeCoverageIgnore if (isset($data['path'])) {
$adminFile = \file_get_contents($data['path'] ?? '');
if ($adminFile === false) {
throw new PathException($data['path'] ?? ''); // @codeCoverageIgnore
}
$adminData = \json_decode($adminFile, true) ?? [];
} elseif (isset($data['data'])) {
$adminData = $data['data'];
} }
$adminData = \json_decode($adminFile, true) ?? [];
if (!\is_array($adminData)) { if (!\is_array($adminData)) {
throw new \Exception(); // @codeCoverageIgnore throw new \Exception(); // @codeCoverageIgnore
} }

View File

@ -122,7 +122,6 @@ final class ApiController extends Controller
if ($login > LoginReturnType::OK) { if ($login > LoginReturnType::OK) {
$this->app->sessionManager->set('UID', $login, true); $this->app->sessionManager->set('UID', $login, true);
$this->app->sessionManager->save();
$response->set($request->uri->__toString(), new Reload()); $response->set($request->uri->__toString(), new Reload());
} elseif ($login === LoginReturnType::NOT_ACTIVATED) { } elseif ($login === LoginReturnType::NOT_ACTIVATED) {
$response->header->status = RequestStatusCode::R_401; $response->header->status = RequestStatusCode::R_401;
@ -260,7 +259,7 @@ final class ApiController extends Controller
public function apiForgot(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void public function apiForgot(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void
{ {
/** @var \Modules\Admin\Models\Account $account */ /** @var \Modules\Admin\Models\Account $account */
$account = !empty($request->getData('user')) $account = $request->hasData('user')
? AccountMapper::get()->where('login', (string) $request->getData('user'))->execute() ? AccountMapper::get()->where('login', (string) $request->getData('user'))->execute()
: AccountMapper::get()->where('email', (string) $request->getData('email'))->execute(); : AccountMapper::get()->where('email', (string) $request->getData('email'))->execute();
@ -367,7 +366,7 @@ final class ApiController extends Controller
$token = $forgotten[SettingsEnum::LOGIN_FORGOTTEN_TOKEN]->content; $token = $forgotten[SettingsEnum::LOGIN_FORGOTTEN_TOKEN]->content;
if ($date->getTimestamp() < \time() - 60 * 10 if ($date->getTimestamp() < \time() - 60 * 10
|| empty($request->getData('token')) || !$request->hasData('token')
|| $request->getData('token') !== $token || $request->getData('token') !== $token
) { ) {
$response->header->status = RequestStatusCode::R_405; $response->header->status = RequestStatusCode::R_405;
@ -626,7 +625,7 @@ final class ApiController extends Controller
private function validateSettingsCreate(RequestAbstract $request) : array private function validateSettingsCreate(RequestAbstract $request) : array
{ {
$val = []; $val = [];
if (($val['name'] = empty($request->getData('name')))) { if (($val['name'] = !$request->hasData('name'))) {
return $val; return $val;
} }
@ -751,9 +750,9 @@ final class ApiController extends Controller
private function validatePasswordUpdate(RequestAbstract $request) : array private function validatePasswordUpdate(RequestAbstract $request) : array
{ {
$val = []; $val = [];
if (($val['oldpass'] = empty($request->getData('oldpass'))) if (($val['oldpass'] = !$request->hasData('oldpass'))
|| ($val['newpass'] = empty($request->getData('newpass'))) || ($val['newpass'] = !$request->hasData('newpass'))
|| ($val['reppass'] = empty($request->getData('reppass'))) || ($val['reppass'] = !$request->hasData('reppass'))
) { ) {
return $val; return $val;
} }
@ -783,7 +782,7 @@ final class ApiController extends Controller
&& !$this->app->accountManager->get($accountId)->hasPermission( && !$this->app->accountManager->get($accountId)->hasPermission(
PermissionType::MODIFY, PermissionType::MODIFY,
$this->app->unitId, $this->app->unitId,
$this->app->appName, $this->app->appId,
self::NAME, self::NAME,
PermissionCategory::ACCOUNT_SETTINGS, PermissionCategory::ACCOUNT_SETTINGS,
$accountId $accountId
@ -1030,7 +1029,7 @@ final class ApiController extends Controller
private function validateApplicationCreate(RequestAbstract $request) : array private function validateApplicationCreate(RequestAbstract $request) : array
{ {
$val = []; $val = [];
if (($val['name'] = empty($request->getData('name')))) { if (($val['name'] = !$request->hasData('name'))) {
return $val; return $val;
} }
@ -1211,7 +1210,7 @@ final class ApiController extends Controller
private function validateGroupCreate(RequestAbstract $request) : array private function validateGroupCreate(RequestAbstract $request) : array
{ {
$val = []; $val = [];
if (($val['name'] = empty($request->getData('name'))) if (($val['name'] = !$request->hasData('name'))
|| ($val['status'] = !GroupStatus::isValidValue((int) $request->getData('status'))) || ($val['status'] = !GroupStatus::isValidValue((int) $request->getData('status')))
) { ) {
return $val; return $val;
@ -1467,10 +1466,10 @@ final class ApiController extends Controller
private function validateAccountCreate(RequestAbstract $request) : array private function validateAccountCreate(RequestAbstract $request) : array
{ {
$val = []; $val = [];
if (($val['name1'] = empty($request->getData('name1'))) if (($val['name1'] = !$request->hasData('name1'))
|| ($val['type'] = !AccountType::isValidValue((int) $request->getData('type'))) || ($val['type'] = !AccountType::isValidValue((int) $request->getData('type')))
|| ($val['status'] = !AccountStatus::isValidValue((int) $request->getData('status'))) || ($val['status'] = !AccountStatus::isValidValue((int) $request->getData('status')))
|| ($val['email'] = !empty($request->getData('email')) && !EmailValidator::isValid((string) $request->getData('email'))) || ($val['email'] = $request->hasData('email') && !EmailValidator::isValid((string) $request->getData('email')))
) { ) {
return $val; return $val;
} }
@ -1501,9 +1500,11 @@ final class ApiController extends Controller
} }
$account = $this->createAccountFromRequest($request); $account = $this->createAccountFromRequest($request);
$this->createModel($request->header->account, $account, AccountCredentialMapper::class, 'account', $request->getOrigin()); $this->createModel($request->header->account, $account, AccountCredentialMapper::class, 'account', $request->getOrigin());
$this->createProfileForAccount($account, $request);
if ($request->hasData('create_profile')) {
$this->createProfileForAccount($account, $request);
}
$collection = $this->createMediaDirForAccount($account->getId(), $account->login ?? '', $request->header->account); $collection = $this->createMediaDirForAccount($account->getId(), $account->login ?? '', $request->header->account);
$this->createModel($request->header->account, $collection, CollectionMapper::class, 'collection', $request->getOrigin()); $this->createModel($request->header->account, $collection, CollectionMapper::class, 'collection', $request->getOrigin());
@ -1789,6 +1790,7 @@ final class ApiController extends Controller
// New account // New account
$request->setData('status', AccountStatus::INACTIVE, true); $request->setData('status', AccountStatus::INACTIVE, true);
$request->setData('type', AccountType::USER, true); $request->setData('type', AccountType::USER, true);
$request->setData('create_profile', (string) true);
$request->setData('name1', !$request->hasData('name1') $request->setData('name1', !$request->hasData('name1')
? (!$request->hasData('user') ? (!$request->hasData('user')
? \explode('@', $request->getDataString('email'))[0] ? \explode('@', $request->getDataString('email'))[0]
@ -1826,34 +1828,29 @@ final class ApiController extends Controller
} }
// Create client // Create client
if ($request->hasData('client') && $account->getStatus() !== AccountStatus::ACTIVE) { if ($request->hasData('client')) {
// @todo: only create if no client exists at the specified unit $client = $this->app->moduleManager->get('ClientManagement')
// The check !== ACTIVE above is only a bad, wrong and specific solution to the problem ->findClientForAccount($account->getId(), $request->getDataInt('unit'));
$internalRequest = new HttpRequest(); if ($client === null) {
$internalResponse = new HttpResponse(); $internalRequest = new HttpRequest();
$internalResponse = new HttpResponse();
$internalRequest->header->account = $account->getId(); $internalRequest->header->account = $account->getId();
$internalRequest->setData('account', $account->getId()); $internalRequest->setData('account', $account->getId());
$internalRequest->setData('number', 100000 + $account->getId()); $internalRequest->setData('number', 100000 + $account->getId());
$internalRequest->setData('address', $request->getDataString('address') ?? ''); $internalRequest->setData('address', $request->getDataString('address') ?? '');
$internalRequest->setData('postal', $request->getDataString('postal') ?? ''); $internalRequest->setData('postal', $request->getDataString('postal') ?? '');
$internalRequest->setData('city', $request->getDataString('city') ?? ''); $internalRequest->setData('city', $request->getDataString('city') ?? '');
$internalRequest->setData('country', $request->getDataString('country') ?? ''); $internalRequest->setData('country', $request->getDataString('country'));
$internalRequest->setData('state', $request->getDataString('state') ?? ''); $internalRequest->setData('state', $request->getDataString('state') ?? '');
$internalRequest->setData('vat_id', $request->getDataString('vat_id') ?? ''); $internalRequest->setData('vat_id', $request->getDataString('vat_id') ?? '');
$internalRequest->setData('unit', $request->getDataInt('unit')); $internalRequest->setData('unit', $request->getDataInt('unit'));
$this->app->moduleManager->get('ClientManagement')->apiClientCreate($internalRequest, $internalResponse); $this->app->moduleManager->get('ClientManagement')->apiClientCreate($internalRequest, $internalResponse);
}
} }
// Create confirmation email
// @todo: adjust
// load base template for app
// load text content for login
// replace placeholders
// send email
$handler = $this->setUpServerMailHandler(); $handler = $this->setUpServerMailHandler();
$emailSettings = $this->app->appSettings->get( $emailSettings = $this->app->appSettings->get(
@ -1861,6 +1858,7 @@ final class ApiController extends Controller
module: 'Admin' module: 'Admin'
); );
/** @var \Modules\Messages\Models\Email $mail */
$mail = EmailMapper::get() $mail = EmailMapper::get()
->where('id', (int) $emailSettings[SettingsEnum::LOGIN_MAIL_REGISTRATION_TEMPLATE]) ->where('id', (int) $emailSettings[SettingsEnum::LOGIN_MAIL_REGISTRATION_TEMPLATE])
->execute(); ->execute();
@ -1922,11 +1920,11 @@ final class ApiController extends Controller
private function validateRegistration(RequestAbstract $request) : array private function validateRegistration(RequestAbstract $request) : array
{ {
$val = []; $val = [];
if (($val['email'] = !empty($request->getData('email')) if (($val['email'] = $request->hasData('email')
&& !EmailValidator::isValid((string) $request->getData('email'))) && !EmailValidator::isValid((string) $request->getData('email')))
|| ($val['unit'] = empty($request->getData('unit'))) || ($val['unit'] = !$request->hasData('unit'))
|| ($val['app'] = empty($request->getData('app'))) || ($val['app'] = !$request->hasData('app'))
|| ($val['password'] = empty($request->getData('password'))) || ($val['password'] = !$request->hasData('password'))
) { ) {
return $val; return $val;
} }
@ -1993,7 +1991,7 @@ final class ApiController extends Controller
private function validateDataChange(RequestAbstract $request) : array private function validateDataChange(RequestAbstract $request) : array
{ {
$val = []; $val = [];
if (($val['hash'] = empty($request->getData('hash')))) { if (($val['hash'] = !$request->hasData('hash'))) {
return $val; return $val;
} }
@ -2169,7 +2167,7 @@ final class ApiController extends Controller
$account->setStatus($request->getDataInt('status') ?? $account->getStatus()); $account->setStatus($request->getDataInt('status') ?? $account->getStatus());
$account->setType($request->getDataInt('type') ?? $account->getType()); $account->setType($request->getDataInt('type') ?? $account->getType());
if ($allowPassword && !empty($request->getData('password'))) { if ($allowPassword && $request->hasData('password')) {
$account->generatePassword((string) $request->getData('password')); $account->generatePassword((string) $request->getData('password'));
} }
@ -2656,7 +2654,7 @@ final class ApiController extends Controller
: new AccountPermission((int) $request->getData('permissionref')); : new AccountPermission((int) $request->getData('permissionref'));
$permission->setUnit($request->getDataInt('permissionunit')); $permission->setUnit($request->getDataInt('permissionunit'));
$permission->setApp($request->getDataString('permissionapp')); $permission->setApp($request->getDataInt('permissionapp'));
$permission->setModule($request->getDataString('permissionmodule')); $permission->setModule($request->getDataString('permissionmodule'));
$permission->setCategory($request->getDataInt('permissioncategory')); $permission->setCategory($request->getDataInt('permissioncategory'));
$permission->setElement($request->getDataInt('permissionelement')); $permission->setElement($request->getDataInt('permissionelement'));
@ -2764,12 +2762,12 @@ final class ApiController extends Controller
*/ */
private function updatePermissionFromRequest(RequestAbstract $request, PermissionAbstract $permission) : PermissionAbstract private function updatePermissionFromRequest(RequestAbstract $request, PermissionAbstract $permission) : PermissionAbstract
{ {
$permission->setUnit(empty($request->getData('permissionunit')) ? $permission->getUnit() : (int) $request->getData('permissionunit')); $permission->setUnit($request->getDataInt('permissionunit') ?? $permission->getUnit());
$permission->setApp(empty($request->getData('permissionapp')) ? $permission->getApp() : (string) $request->getData('permissionapp')); $permission->setApp($request->getDataInt('permissionapp') ?? $permission->getApp());
$permission->setModule(empty($request->getData('permissionmodule')) ? $permission->getModule() : (string) $request->getData('permissionmodule')); $permission->setModule($request->getDataString('permissionmodule') ?? $permission->getModule());
$permission->setCategory(empty($request->getData('permissioncategory')) ? $permission->getCategory() : (int) $request->getData('permissioncategory')); $permission->setCategory($request->getDataInt('permissioncategory') ?? $permission->getCategory());
$permission->setElement(empty($request->getData('permissionelement')) ? $permission->getElement() : (int) $request->getData('permissionelement')); $permission->setElement($request->getDataInt('permissionelement') ?? $permission->getElement());
$permission->setComponent(empty($request->getData('permissioncomponent')) ? $permission->getComponent() : (int) $request->getData('permissioncomponent')); $permission->setComponent($request->getDataInt('permissioncomponent') ?? $permission->getComponent());
$permission->setPermission(($request->getDataInt('permissioncreate') ?? 0) $permission->setPermission(($request->getDataInt('permissioncreate') ?? 0)
| ($request->getDataInt('permissionread') ?? 0) | ($request->getDataInt('permissionread') ?? 0)
| ($request->getDataInt('permissionupdate') ?? 0) | ($request->getDataInt('permissionupdate') ?? 0)
@ -3152,9 +3150,9 @@ final class ApiController extends Controller
public function validateContactCreate(RequestAbstract $request) : array public function validateContactCreate(RequestAbstract $request) : array
{ {
$val = []; $val = [];
if (($val['account'] = empty($request->getData('account'))) if (($val['account'] = !$request->hasData('account'))
|| ($val['type'] = !\is_numeric($request->getData('type'))) || ($val['type'] = !\is_numeric($request->getData('type')))
|| ($val['content'] = empty($request->getData('content'))) || ($val['content'] = !$request->hasData('content'))
) { ) {
return $val; return $val;
} }

View File

@ -123,7 +123,7 @@ final class BackendController extends Controller
$member = \prev($split); $member = \prev($split);
if (!empty($request->getData('accountslist-f-' . $member . '-f1'))) { if ($request->hasData('accountslist-f-' . $member . '-f1')) {
$filterField[$member] = [ $filterField[$member] = [
'type' => $type, 'type' => $type,
'value1' => $request->getData('accountslist-f-' . $member . '-f1'), 'value1' => $request->getData('accountslist-f-' . $member . '-f1'),
@ -297,7 +297,7 @@ final class BackendController extends Controller
$member = \prev($split); $member = \prev($split);
if (!empty($request->getData('groupslist-f-' . $member . '-f1'))) { if ($request->hasData('groupslist-f-' . $member . '-f1')) {
$filterField[$member] = [ $filterField[$member] = [
'type' => $type, 'type' => $type,
'value1' => $request->getData('groupslist-f-' . $member . '-f1'), 'value1' => $request->getData('groupslist-f-' . $member . '-f1'),

View File

@ -39,7 +39,7 @@ class AccountMapper extends DataMapperFactory
'account_external_id' => ['name' => 'account_external_id', 'type' => 'int', 'internal' => 'id'], 'account_external_id' => ['name' => 'account_external_id', 'type' => 'int', 'internal' => 'id'],
'account_external_status' => ['name' => 'account_external_status', 'type' => 'int', 'internal' => 'status'], 'account_external_status' => ['name' => 'account_external_status', 'type' => 'int', 'internal' => 'status'],
'account_external_type' => ['name' => 'account_external_type', 'type' => 'int', 'internal' => 'type'], 'account_external_type' => ['name' => 'account_external_type', 'type' => 'int', 'internal' => 'type'],
'account_external_subtype' => ['name' => 'account_external_subtype', 'type' => 'int', 'internal' => 'subtype',], 'account_external_subtype' => ['name' => 'account_external_subtype', 'type' => 'int', 'internal' => 'subtype'],
'account_external_key' => ['name' => 'account_external_key', 'type' => 'string', 'internal' => 'key'], 'account_external_key' => ['name' => 'account_external_key', 'type' => 'string', 'internal' => 'key'],
'account_external_name' => ['name' => 'account_external_name', 'type' => 'string', 'internal' => 'name'], 'account_external_name' => ['name' => 'account_external_name', 'type' => 'string', 'internal' => 'name'],
'account_external_auth' => ['name' => 'account_external_auth', 'type' => 'string', 'internal' => 'auth', ], 'account_external_auth' => ['name' => 'account_external_auth', 'type' => 'string', 'internal' => 'auth', ],

View File

@ -42,7 +42,7 @@ class AccountPermission extends PermissionAbstract
* *
* @param int $account Group id * @param int $account Group id
* @param null|int $unit Unit Unit to check (null if all are acceptable) * @param null|int $unit Unit Unit to check (null if all are acceptable)
* @param null|string $app App App to check (null if all are acceptable) * @param null|int $app App App to check (null if all are acceptable)
* @param null|string $module Module to check (null if all are acceptable) * @param null|string $module Module to check (null if all are acceptable)
* @param null|string $from Module providing this permission * @param null|string $from Module providing this permission
* @param null|int $category Category (e.g. customer) (null if all are acceptable) * @param null|int $category Category (e.g. customer) (null if all are acceptable)
@ -55,7 +55,7 @@ class AccountPermission extends PermissionAbstract
public function __construct( public function __construct(
int $account = 0, int $account = 0,
int $unit = null, int $unit = null,
string $app = null, int $app = null,
string $module = null, string $module = null,
string $from = null, string $from = null,
int $category = null, int $category = null,

View File

@ -36,7 +36,7 @@ final class AccountPermissionMapper extends DataMapperFactory
'account_permission_id' => ['name' => 'account_permission_id', 'type' => 'int', 'internal' => 'id'], 'account_permission_id' => ['name' => 'account_permission_id', 'type' => 'int', 'internal' => 'id'],
'account_permission_account' => ['name' => 'account_permission_account', 'type' => 'int', 'internal' => 'account'], 'account_permission_account' => ['name' => 'account_permission_account', 'type' => 'int', 'internal' => 'account'],
'account_permission_unit' => ['name' => 'account_permission_unit', 'type' => 'int', 'internal' => 'unit'], 'account_permission_unit' => ['name' => 'account_permission_unit', 'type' => 'int', 'internal' => 'unit'],
'account_permission_app' => ['name' => 'account_permission_app', 'type' => 'string', 'internal' => 'app'], 'account_permission_app' => ['name' => 'account_permission_app', 'type' => 'int', 'internal' => 'app'],
'account_permission_module' => ['name' => 'account_permission_module', 'type' => 'string', 'internal' => 'module'], 'account_permission_module' => ['name' => 'account_permission_module', 'type' => 'string', 'internal' => 'module'],
'account_permission_from' => ['name' => 'account_permission_from', 'type' => 'string', 'internal' => 'from'], 'account_permission_from' => ['name' => 'account_permission_from', 'type' => 'string', 'internal' => 'from'],
'account_permission_category' => ['name' => 'account_permission_category', 'type' => 'int', 'internal' => 'category'], 'account_permission_category' => ['name' => 'account_permission_category', 'type' => 'int', 'internal' => 'category'],

View File

@ -42,7 +42,7 @@ class GroupPermission extends PermissionAbstract
* *
* @param int $group Group id * @param int $group Group id
* @param null|int $unit Unit to check (null if all are acceptable) * @param null|int $unit Unit to check (null if all are acceptable)
* @param null|string $app App to check (null if all are acceptable) * @param null|int $app App to check (null if all are acceptable)
* @param null|string $module Module to check (null if all are acceptable) * @param null|string $module Module to check (null if all are acceptable)
* @param null|string $from Module providing this permission * @param null|string $from Module providing this permission
* @param null|int $category Category (e.g. customer) (null if all are acceptable) * @param null|int $category Category (e.g. customer) (null if all are acceptable)
@ -55,7 +55,7 @@ class GroupPermission extends PermissionAbstract
public function __construct( public function __construct(
int $group = 0, int $group = 0,
int $unit = null, int $unit = null,
string $app = null, int $app = null,
string $module = null, string $module = null,
string $from = null, string $from = null,
int $category = null, int $category = null,

View File

@ -36,7 +36,7 @@ final class GroupPermissionMapper extends DataMapperFactory
'group_permission_id' => ['name' => 'group_permission_id', 'type' => 'int', 'internal' => 'id'], 'group_permission_id' => ['name' => 'group_permission_id', 'type' => 'int', 'internal' => 'id'],
'group_permission_group' => ['name' => 'group_permission_group', 'type' => 'int', 'internal' => 'group'], 'group_permission_group' => ['name' => 'group_permission_group', 'type' => 'int', 'internal' => 'group'],
'group_permission_unit' => ['name' => 'group_permission_unit', 'type' => 'int', 'internal' => 'unit'], 'group_permission_unit' => ['name' => 'group_permission_unit', 'type' => 'int', 'internal' => 'unit'],
'group_permission_app' => ['name' => 'group_permission_app', 'type' => 'string', 'internal' => 'app'], 'group_permission_app' => ['name' => 'group_permission_app', 'type' => 'int', 'internal' => 'app'],
'group_permission_module' => ['name' => 'group_permission_module', 'type' => 'string', 'internal' => 'module'], 'group_permission_module' => ['name' => 'group_permission_module', 'type' => 'string', 'internal' => 'module'],
'group_permission_from' => ['name' => 'group_permission_from', 'type' => 'string', 'internal' => 'from'], 'group_permission_from' => ['name' => 'group_permission_from', 'type' => 'string', 'internal' => 'from'],
'group_permission_category' => ['name' => 'group_permission_category', 'type' => 'int', 'internal' => 'category'], 'group_permission_category' => ['name' => 'group_permission_category', 'type' => 'int', 'internal' => 'category'],

View File

@ -73,7 +73,7 @@ final class ApiControllerTest extends \PHPUnit\Framework\TestCase
$permission = new AccountPermission(); $permission = new AccountPermission();
$permission->setUnit(1); $permission->setUnit(1);
$permission->setApp('backend'); $permission->setApp(2);
$permission->setPermission( $permission->setPermission(
PermissionType::READ PermissionType::READ
| PermissionType::CREATE | PermissionType::CREATE