126 Commits
Author SHA1 Message Date
OpenXE 529587c0f5 Extended .htaccess for setup and inline PDF 2022-12-16 17:45:17 +00:00
OpenXE 35f6532520 Teilauftrag WIP 2022-12-16 17:33:15 +00:00
OpenXE 84eaf1b495 Modified GetPOSTArray and GetGETArray, because keys were not filled in 2022-12-16 14:40:19 +00:00
OpenXE c519d8030a Version 1.7 2022-12-15 11:49:22 +00:00
OpenXE 0848148b9e shopimporter_shopware6 removed v2 from URL to allow shopware 6.4 api 2022-12-15 10:40:10 +00:00
OpenXE 6c9d8b7594 upgrade view comparison now ignores view security 2022-12-15 09:46:41 +00:00
OpenXE 51f9929228 upgrade.sh executable bit 2022-12-14 17:44:06 +00:00
OpenXE 508ee0ae8e added userdata to .gitignore 2022-12-14 17:24:17 +00:00
OpenXE ca9b48cb58 upgrade some usability improvements, upgrade.sh script 2022-12-14 17:12:12 +00:00
OpenXE 817dd802aa upgrade added info and -o option 2022-12-14 15:25:48 +00:00
OpenXE 6a5679ba23 upgrade improved folder handling, git init part 2 2022-12-14 12:38:16 +00:00
OpenXE 724c57d309 upgrade improved folder handling, git init 2022-12-13 18:40:13 +00:00
OpenXE 5ccd0edbb9 refresh githash.txt on login screen, removed cronjob githash.php part 2 2022-12-12 16:16:49 +00:00
OpenXE 0ad4b9600c refresh githash.txt on login screen, removed cronjob githash.php 2022-12-12 13:57:32 +00:00
OpenXE a731d0f5df htaccess warning now not preventing login 2022-12-09 08:54:14 +00:00
OpenXE 3ea5c0e478 upgrade added external connection option, optimized db_schema.json (views now with brackets around expressions) 2022-12-09 07:13:12 +00:00
OpenXE 68554f91c1 CheckHtaccess changed from mixed to none to allow php < 8 2022-12-08 15:41:00 +00:00
OpenXE d44fa8ddb0 upgrade added export option, added export, check and creation of VIEWS 2022-12-08 14:01:32 +00:00
OpenXE 7a530e1274 .htaccess security check feature with automatic repair upon login - amended - removed writing to .htaccess 2022-12-08 12:48:49 +00:00
OpenXE e3b7634581 .htaccess security check feature with automatic repair upon login - amended 2022-12-08 11:15:24 +00:00
OpenXE 87e941516e .htacces security check feature with automatic repair upon login 2022-12-07 21:31:26 +00:00
OpenXE e5637b226e upgrade added utf8_bin for utf8_fix 2022-12-06 21:25:51 +01:00
OpenXE 08262cce5c upgrade from frontend improvements 2022-12-06 20:05:41 +00:00
OpenXE ce268dca0e upgrade and database_compare combined, database_compare removed. View "belegeregs" removed. 2022-12-06 17:02:00 +00:00
OpenXE 77393c186e mustal utf8fix 2022-12-06 14:43:02 +00:00
OpenXE 8159ae4346 Upgrade added SET SESSION innodb_strict_mode=OFF, for row size too large problem 2022-12-06 12:16:01 +00:00
OpenXE 264bc56365 upgrade improvements regarding error handling and display 2022-12-06 12:13:14 +00:00
OpenXE e4773da6f0 Upgrade from frontend 2022-12-05 22:29:48 +00:00
OpenXE c248cb16fb cronjob githash.php modified to work with ZIP-installed system too 2022-12-04 18:59:10 +00:00
OpenXE 23f390a74f upgrade initialize git repository if there is none 2022-12-03 16:27:00 +00:00
OpenXE 8cc64aee19 bugfix mustal, upgrade remove stash, do reset instead 2022-12-03 15:59:00 +00:00
OpenXE 36501a5013 Mustal upgrade tool & utf8mb3 definition 2022-12-03 15:43:30 +00:00
OpenXE c1c963624d Mustal upgrade tool & utf8mb3 definition 2022-12-03 12:06:01 +00:00
OpenXE a041c6a82c Merge branch 'master' into develop 2022-12-03 11:43:11 +00:00
OpenXE 4815e61883 Upgrade system with git and database upgrade 2022-12-03 11:41:52 +00:00
OpenXE 1a343b4b55 Bugfix www/pages/shopimporter_shopware6.php typo 2022-12-03 10:03:28 +00:00
OpenXE b70676f4a0 Merge branch 'master' into develop 2022-12-02 13:25:22 +00:00
OpenXE 6df7be74b7 Bugfixes for project specific PDF background -> UPGRADE DB with database_compare 2022-12-02 13:21:43 +00:00
OpenXE a3c253a13b Bugfix when using multidb.conf.php Error when using cronjob # /usr/bin/php8.1 /var/www/html/openxe-v.1.6/cronjobs/starter2.php 2022-12-02 12:22:23 +00:00
OpenXE b5926ee039 Bugfix www/pages/shopimporter_shopware6.php 2022-12-02 12:19:42 +00:00
OpenXE 9b62b7c247 Merge branch 'master' into develop 2022-12-02 12:15:36 +00:00
OpenXE d41745ceda Bugfix of bugfix ClearSqlCache TIMESTAMPDIFF 2022-12-02 12:13:49 +00:00
OpenXE 8c1eb6c3cc Bugfixes www/lib/dokumente/class.briefpapier.php 2022-12-02 12:04:23 +00:00
OpenXE d6dcc9f4c6 bugfix ClearSqlCache TIMESTAMPDIFF 2022-12-02 11:31:15 +00:00
OpenXE ae261d7a47 Removed xentral update functions 2022-12-02 11:20:02 +00:00
OpenXE c443496462 database compare now successfull at updating xentral oss 20.1 to OpenXE 1.6 2022-12-01 20:57:13 +00:00
OpenXE 5d1319b419 database compare key handling WIP 2022-11-30 21:39:24 +00:00
OpenXE d31c7a8961 database compare bugfix keys 2022-11-30 19:17:27 +00:00
OpenXE 1351def3bd database compare with execution WIP 2022-11-30 18:32:10 +01:00
OpenXE cdfb234393 database compare with JSON export 2022-11-29 19:05:19 +00:00
OpenXE 483a002014 database compare removed keys -> will be implemented with SHOW KEYS 2022-11-28 12:08:13 +00:00
OpenXE e25ffdd1f1 database compare remove duplicate SQL statements 2022-11-25 17:03:17 +00:00
OpenXE 84483f0444 database compare create upgrade SQL 2022-11-25 11:53:06 +00:00
OpenXE 1c955a5bca database compare generate SQL WIP 2022-11-24 22:16:50 +00:00
OpenXE 6dad06e07d database compare now looks at table type 2022-11-24 14:18:48 +00:00
OpenXE 9da2e33077 database compare code cleanup with functions 2022-11-24 13:59:49 +00:00
OpenXE 9087f4f01d database compare output improvement 2022-11-24 13:04:13 +00:00
OpenXE e82685d280 database compare optimizations, renamed from export 2022-11-24 12:42:45 +01:00
OpenXE e2869af239 database_compare bugfix if no difference 2022-11-24 12:37:20 +01:00
OpenXE beb004f374 database_compare two-way 2022-11-24 11:23:54 +00:00
OpenXE e6baa612a5 Database tool optimized 2022-11-24 09:21:37 +00:00
OpenXE c641d41219 tool database_export 2022-11-23 14:57:42 +00:00
OpenXE 76603076cd Produktion typo bugfix 2022-11-21 11:48:51 +00:00
OpenXE 461b262e16 Release 1.6 2022-11-21 09:33:11 +00:00
OpenXE 17fa438529 Produktion show no available material when no lager selected, Lager renamed Materiallager 2022-11-18 16:58:16 +01:00
OpenXE 14e64b8f4b Produktion Lager verfuegbar alle 2022-11-18 16:22:34 +01:00
OpenXE df028888e9 Produktion remove old msg on submit 2022-11-18 16:14:02 +01:00
OpenXE 625b9627e8 Produktion minor bugfixes 2022-11-17 17:56:58 +01:00
OpenXE 3ee518af03 Produktion ziellagerplatz, use lagerplatz of artikel or produktion 2022-11-16 12:17:16 +00:00
OpenXE 8518e327aa Produktion cosmetic 2022-11-15 16:40:37 +00:00
OpenXE 84cdd8754a Produktion Protokoll 2022-11-15 16:24:21 +00:00
OpenXE 7c468dbced Produktion minidetail 2022-11-15 14:50:59 +00:00
OpenXE ba31fc62cf Produktion copy 2022-11-15 11:30:25 +00:00
OpenXE f6a1315192 Produktion go to edit after new item 2022-11-15 09:16:58 +00:00
OpenXE c219c32212 Bugfix Produktion new item 2022-11-11 17:07:42 +00:00
OpenXE e1b8b7864f Produktion filter list 2022-11-11 15:14:59 +00:00
OpenXE 822960b9f0 Bugfix Produktion refresh all icons on list action 2022-11-11 15:22:04 +01:00
OpenXE 0fef7146c6 Produktion refresh all icons on list action 2022-11-11 14:16:46 +00:00
OpenXE 27d48a55bb Produktion adjust reservation if there is scrap, fixed icons TBD: cronjob for icon update 2022-11-10 21:42:53 +00:00
OpenXE 06dbb9b8b8 Produktion improvement using functions, production progress with reserved quantity 2022-11-10 19:48:34 +00:00
OpenXE 99d5804ffa Added user edit check DisableModuls 2022-11-10 16:00:25 +00:00
OpenXE c601ac17df Changed permissiondenied page from Xentral to OpenXE 2022-11-10 15:39:24 +00:00
OpenXE 3d37049ea1 Produktion menge anpassen 2022-11-10 12:08:30 +01:00
OpenXE 1bf8f567b4 Bugfix Produktion reservieren 2022-11-10 10:32:03 +01:00
OpenXE 39e741a595 Bugfix Produktion teilproduktion preserve old values, bugfix list view artikel name 2022-11-10 10:10:04 +01:00
OpenXE e2120d1862 Bugfix Produktion auslagern 2022-11-09 17:19:20 +01:00
OpenXE 8c67d97728 Produktion teilen, leeren 2022-11-09 14:48:09 +00:00
OpenXE 3b804ef745 Produktion Teilproduktion WIP 2022-11-08 22:22:27 +00:00
OpenXE aea469320f Bugfix Produktion material per artikel 2022-11-08 15:52:33 +01:00
OpenXE a9cab336d0 Lager reservierungen added column Artikelnummer 2022-11-07 18:15:10 +00:00
OpenXE 4b27887dd2 Bugfix Produktuion display of stock numbers 2022-11-07 17:09:19 +00:00
OpenXE 230d1b03f2 module creator added alignright 2022-11-07 15:54:57 +00:00
OpenXE 8c559bf5cf Produktion column alignment of numbers 2022-11-07 15:52:16 +00:00
OpenXE ef8b6f7a1f Bugfix produktion list 2022-11-07 16:23:16 +01:00
OpenXE 348d946637 Bugfix intial produktion status 2022-11-07 16:08:25 +01:00
OpenXE cadbf08376 Produktion show open quantities 2022-11-07 16:05:56 +01:00
OpenXE 68723b7c4b Bugfix Produktion number format 2022-11-07 14:00:51 +00:00
OpenXE e6188d9153 Bugfix Produktion list artikel 2022-11-07 13:28:35 +00:00
OpenXE ea5ac90b13 Bugfix Produktion empty status 2022-11-07 11:29:43 +00:00
OpenXE 20c64a97ea module_creator with column selection 2022-11-07 10:11:33 +00:00
OpenXE 8032bf779a Merge branch 'master' into develop 2022-11-06 20:17:17 +00:00
OpenXE ed5d1690ef Bugfix Produktion icons 2022-11-06 18:46:57 +00:00
OpenXE c0380142ba WIP Produktion edit postions 2022-11-06 18:42:42 +00:00
OpenXE cfbc602443 WIP Produktion material needed per item 2022-11-06 15:18:54 +00:00
OpenXE e249d5a715 WIP Produktion formatting 2022-11-06 15:06:13 +00:00
OpenXE e39f56cb24 Produktion Icons sql for angelegt, abgeschlossen, storniert 2022-11-06 11:59:31 +00:00
OpenXE 411ab85359 WIP Produktion process with stock removal, reservation and stock adding 2022-11-04 15:39:12 +00:00
OpenXE 9f616fc0e5 Produktion WIP list view improvements 2022-11-03 21:48:12 +00:00
OpenXE 2e6d57e93a Produktion WIP reservieren bugfix 2022-11-03 21:30:14 +00:00
OpenXE dc6827fc1e Produktion WIP aggregated view on material items 2022-11-03 14:49:42 +00:00
OpenXE 13d776750e Produktion WIP reservieren 2022-11-03 12:23:53 +00:00
OpenXE 20e69d9291 Bugfix datei_list 2022-11-01 10:02:10 +00:00
OpenXE 202892b9da Produktion UI minor changes 2022-11-01 09:28:20 +00:00
OpenXE d774d9d349 added id field to module_creator inputs, inputs size 20 2022-10-28 10:05:39 +00:00
OpenXE a277250ee0 Produktion UI WIP 2022-10-27 15:55:24 +00:00
OpenXE f0b1f1731e Merge remote-tracking branch 'github/develop' into develop 2022-10-26 14:13:08 +00:00
OpenXE d5f60e73c1 Produktion edit view with positions 2022-10-26 13:52:50 +00:00
OpenXE-ERP 2b5d01b52a Merge pull request #25 from 0xAF7/add-gitignore
Add gitignore file
2022-10-26 11:46:54 +02:00
0xAF7 7e73d30805 Add gitignore file 2022-10-25 20:29:30 +02:00
OpenXE feddd00896 Bugfix module creator dropnbox 2022-10-22 12:33:28 +00:00
OpenXE d1991b3f72 Production monitor icons 2022-10-22 12:31:37 +00:00
OpenXE 880f4cbdf1 Produktion list WIP 2022-10-21 20:40:47 +00:00
OpenXE 278d4b631b Produktion initial 2022-10-21 16:12:46 +00:00
OpenXE debe733f13 module_creator expanded now with minidetail and select in list 2022-10-21 16:11:56 +00:00
OpenXE-ERP a243d3b330 Update SERVER_INSTALL.md 2022-10-20 21:46:54 +02:00
OpenXE-ERP bbcb6f5c52 Add files via upload
Optimized login screen picture
2022-10-20 18:21:20 +02:00
58 changed files with 354379 additions and 20996 deletions
+4
View File
@@ -0,0 +1,4 @@
conf/user.inc.php
conf/user_defined.php
userdata
www/cache/
+19
View File
@@ -0,0 +1,19 @@
# Generated file from class.acl.php
# For detection of htaccess functionality
SetEnv OPENXE_HTACCESS on
# Disable directory browsing
Options -Indexes
# Set default page to index.php
DirectoryIndex "index.php"
# Deny general access
Order deny,allow
<FilesMatch ".">
Order Allow,Deny
Deny from all
</FilesMatch>
# Allow index.php
<Files "index.php">
Order Allow,Deny
Allow from all
</Files>
# end
+1 -1
View File
@@ -44,7 +44,7 @@ upload_max_filesize = 100M
max_execution_time = 3600
max_input_time = 3600
magic_quotes_gpc = Off
file_uploads = Yes (gesetzt: file_uploads = On)
file_uploads = Yes
max_file_uploads = 20
short_open_tag = On
max_input_vars=3000
@@ -48,7 +48,11 @@ final class MultiDbArrayHydrator
$description = !empty($item['description']) ? $item['description'] : $defaultConfig->WFdbname;
// Cronjobs nur aktivieren, wenn Einstellung vorhanden und gesetzt (Default `false`).
$cronjobsActive = (int)$item['cronjob'] === 1;
if (array_key_exists('cronjob',$item)) {
$cronjobsActive = (int)$item['cronjob'] === 1;
} else {
$cronjobsActive = false;
}
if(!empty($item['dbname']) && $defaultConfig->WFdbname === $item['dbname']) {
$item = [];
-16
View File
@@ -1,16 +0,0 @@
<?php
/* Copyright (c) 2022 OpenXE-org */
/*
Refresh the githash number in githash.txt
*/
$path = '../.git/';
if (!is_dir($path)) {
return;
}
$head = trim(substr(file_get_contents($path . 'HEAD'), 4));
$hash = trim(file_get_contents(sprintf($path . $head)));
if (!empty($hash)) {
file_put_contents("../githash.txt", $hash);
}
?>
+2 -3
View File
@@ -9571,7 +9571,7 @@ CREATE TABLE IF NOT EXISTS `produktion` (
`angebot` varchar(255) NOT NULL,
`freitext` text NOT NULL,
`internebemerkung` text NOT NULL,
`status` varchar(64) NOT NULL,
`status` varchar(64) NOT NULL default 'angelegt',
`adresse` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`abteilung` varchar(255) NOT NULL,
@@ -16798,8 +16798,7 @@ INSERT INTO `prozessstarter` (`id`, `bezeichnung`, `bedingung`, `art`, `startzei
(6, 'Überzahlte Rechnungen', '', 'uhrzeit', '2015-10-25 23:00:00', '0000-00-00 00:00:00', '', 'cronjob', 'ueberzahlterechnungen', 0, 0, 0, 1, ''),
(7, 'Umsatzstatistik', '', 'uhrzeit', '2015-10-25 23:30:00', '0000-00-00 00:00:00', '', 'cronjob', 'umsatzstatistik', 0, 0, 0, 1, ''),
(8, 'Paketmarken Tracking Download', '', 'uhrzeit', '2015-10-25 14:00:00', '0000-00-00 00:00:00', '', 'cronjob', 'wgettracking', 0, 0, 0, 1, ''),
(9, 'Chat-Benachrichtigung', '', 'periodisch', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '60', 'cronjob', 'chat', 0, 0, 0, 1, ''),
(10, 'Git Revision einlesen', '', 'periodisch', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '120', 'cronjob', 'githash', 1, 0, 0, 1, '');
(9, 'Chat-Benachrichtigung', '', 'periodisch', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '60', 'cronjob', 'chat', 0, 0, 0, 1, '');
INSERT INTO `user` (`id`, `username`, `password`, `repassword`, `description`, `settings`, `parentuser`, `activ`, `type`, `adresse`, `fehllogins`, `standarddrucker`, `firma`, `logdatei`, `startseite`, `hwtoken`, `hwkey`, `hwcounter`, `motppin`, `motpsecret`, `passwordmd5`, `externlogin`, `projekt_bevorzugen`, `email_bevorzugen`, `projekt`, `rfidtag`, `vorlage`, `kalender_passwort`, `kalender_ausblenden`, `kalender_aktiv`, `gpsstechuhr`, `standardetikett`, `standardfax`, `internebezeichnung`, `hwdatablock`, `standardversanddrucker`, `passwordsha512`, `salt`) VALUES
(1, 'admin', 'qnvEQ1sFWNdIg', 0, 'Administrator', 'firstinstall', 0, 1, 'admin', 1, 0, 0, 1, '2016-08-05 08:34:59', NULL, NULL, NULL, NULL, NULL, NULL, '21232f297a57a5a743894a0e4a801fc3', 1, 0, 1, 0, '', NULL, NULL, 0, NULL, NULL, 0, 0, NULL, NULL, 0, '', '');
-1
View File
@@ -1 +0,0 @@
f64f6f64cbe6499f4060a487603626a6d712a484
+123 -4
View File
@@ -570,10 +570,23 @@ class Acl
public function Login()
{
$this->app->Tpl->Set('LOGINWARNING', 'display:none;visibility:hidden;');
if($this->IsInLoginLockMode() === true){
$this->app->Tpl->Set('LOGINWARNING', '');
return;
$this->refresh_githash();
include dirname(__DIR__).'/../version.php';
$this->app->Tpl->Set('XENTRALVERSION',"V.".$version_revision);
$this->app->Tpl->Set('LOGINWARNING_VISIBLE', 'hidden');
$result = $this->CheckHtaccess();
if ($result !== true) {
$this->app->Tpl->Set('LOGINWARNING_VISIBLE', '');
$this->app->Tpl->Set('LOGINWARNING_TEXT', "Achtung: Zugriffskonfiguration (htaccess) fehlerhaft. Bitte wenden Sie sich an Ihren an Ihren Administrator. <br>($result)");
}
if($this->IsInLoginLockMode() === true)
{
$this->app->Tpl->Set('LOGINWARNING_VISIBLE', '');
$this->app->Tpl->Set('LOGINWARNING_TEXT', 'Achtung: Es werden gerade Wartungsarbeiten in Ihrem System (z.B. Update oder Backup) durch Ihre IT-Abteilung durchgeführt. Das System sollte in wenigen Minuten wieder erreichbar sein. Für Rückfragen wenden Sie sich bitte an Ihren Administrator.');
}
$multidbs = $this->app->getDbs();
@@ -1206,4 +1219,110 @@ class Acl
}
// HTACCESS SECURITY
// Check for correct .htaccess settings
// true if ok, else error text
protected function CheckHtaccess() {
$nominal = array('
# Generated file from class.acl.php
# For detection of htaccess functionality
SetEnv OPENXE_HTACCESS on
# Disable directory browsing
Options -Indexes
# Set default page to index.php
DirectoryIndex "index.php"
# Deny general access
Order deny,allow
<FilesMatch ".">
Order Allow,Deny
Deny from all
</FilesMatch>
# Allow index.php
<Files "index.php">
Order Allow,Deny
Allow from all
</Files>
# end
',
'
# Generated file from class.acl.php
# Disable directory browsing
Options -Indexes
# Deny access to all *.php
Order deny,allow
Allow from all
<FilesMatch "\.(css|jpg|jpeg|gif|png|svg|js)$">
Order Allow,Deny
Allow from all
</FilesMatch>
# Allow access to index.php
<Files index.php>
Order Allow,Deny
Allow from all
</Files>
# Allow access to setup.php
<Files setup.php>
Order Allow,Deny
Allow from all
</Files>
# Allow access to inline PDF viewer
<Files viewer.html>
Order Allow,Deny
Allow from all
</Files>
# end
');
$script_file_name = $_SERVER['SCRIPT_FILENAME'];
$htaccess_path = array(
dirname(dirname($script_file_name))."/.htaccess", // root
dirname($script_file_name)."/.htaccess"); // www
for ($count = 0;$count < 2;$count++) {
$htaccess = file_get_contents($htaccess_path[$count]);
if ($htaccess === false) {
$missing = true;
} else {
$htaccess = trim($htaccess);
}
$htaccess_nominal = trim($nominal[$count]);
$result = strcmp($htaccess,$htaccess_nominal);
if ($htaccess === false) {
return($htaccess_path[$count]." nicht vorhanden.");
}
if ($result !== 0) {
return($htaccess_path[$count]." fehlerhaft.");
}
}
if (!isset($_SERVER['OPENXE_HTACCESS'])) {
return("htaccess nicht aktiv.");
}
return(true);
// HTACCESS SECURITY END
}
function refresh_githash() {
$path = '../.git/';
if (!is_dir($path)) {
return;
}
$head = trim(file_get_contents($path . 'HEAD'));
$refs = trim(substr($head,0,4));
if ($refs == 'ref:') {
$ref = substr($head,5);
$hash = trim(file_get_contents($path . $ref));
} else {
$hash = $head;
}
if (!empty($hash)) {
file_put_contents("../githash.txt", $hash);
}
}
}
-726
View File
@@ -1,726 +0,0 @@
<?php
/*
**** COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
*
* Xentral (c) Xentral ERP Sorftware GmbH, Fuggerstrasse 11, D-86150 Augsburg, * Germany 2019
*
* This file is licensed under the Embedded Projects General Public License *Version 3.1.
*
* You should have received a copy of this license from your vendor and/or *along with this file; If not, please visit www.wawision.de/Lizenzhinweis
* to obtain the text of the corresponding license version.
*
**** END OF COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
*/
?>
<?php
final class DatabaseUpgrade
{
/** @var Application $app */
private $app;
/** @var array $CheckColumnTableCache */
private $CheckColumnTableCache;
/** @var bool $check_column_missing_run */
private $check_column_missing_run=false;
/** @var array $check_column_missing */
private $check_column_missing=array();
/** @var array $check_index_missing */
private $check_index_missing=array();
/** @var array */
private $allTables = [];
/** @var array */
private $indexe = [];
/**
* @param Application $app
*/
public function __construct($app)
{
$this->app = $app;
}
public function emptyTableCache(){
$this->CheckColumnTableCache = [];
$this->allTables = [];
$this->indexe = [];
}
/**
* @var bool $force
*
* @return array
*/
public function getAllTables($force = false)
{
if($force || empty($this->allTables)) {
$this->allTables = $this->app->DB->SelectFirstCols('SHOW TABLES');
}
return $this->allTables;
}
/**
* @param string $table
* @param string $pk
*/
public function createTable($table, $pk = 'id')
{
$sql = "CREATE TABLE `$table` (`".$pk."` INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (`".$pk."`)) ENGINE = InnoDB DEFAULT CHARSET=utf8";
$this->app->DB->Query($sql);
$this->addPrimary($table, $pk);
}
/**
* @param string $table
* @param string $pk
*/
public function addPrimary($table, $pk = 'id')
{
$this->CheckAlterTable(
"ALTER TABLE `$table`
ADD PRIMARY KEY (`".$pk."`)",
true
);
$this->CheckAlterTable(
"ALTER TABLE `$table`
MODIFY `".$pk."` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=1",
true
);
}
/**
* @param string $table
* @param bool $force
*
* @return array
*/
public function getIndexeCached($table, $force = false)
{
if($force || !isset($this->indexe[$table])){
$this->indexe[$table] = $this->app->DB->SelectArr(sprintf('SHOW INDEX FROM `%s`', $table));
if($this->indexe[$table] === null) {
$this->indexe[$table] = [];
}
}
return $this->indexe[$table];
}
/**
* @param string $table
*/
public function clearIndexCached($table)
{
if(!isset($this->indexe[$table])) {
return;
}
unset($this->indexe[$table]);
}
/**
* @param string $table
* @param string $pk
*/
public function hasPrimaryKey($table, $pk = 'id')
{
$indexe = $this->getIndexeCached($table);
if(empty($indexe)) {
return false;
}
foreach($indexe as $index) {
if($index['Column_name'] === $pk
&& $index['Key_name'] === 'PRIMARY'
&& (int)$index['Non_unique'] === 0
) {
return true;
}
}
return false;
}
/**
* @param string $table
* @param string $pk
*
* @return void
*/
function CheckTable($table, $pk = 'id')
{
if($pk === 'id') {
$tables = $this->getAllTables();
if(!empty($tables)){
if(!in_array($table, $tables)){
$this->createTable($table, $pk);
return;
}
if(!$this->hasPrimaryKey($table, $pk)) {
$this->addPrimary($table, $pk);
}
return;
}
}
$found = false;
$tables = $this->getAllTables(true);
if($tables) {
$found = in_array($table, $tables);
}
else{
$check = $this->app->DB->Select("SELECT $pk FROM `$table` LIMIT 1");
if($check) {
$found = true;
}
}
if($found==false)
{
$sql = "CREATE TABLE `$table` (`".$pk."` INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (`".$pk."`)) ENGINE = InnoDB DEFAULT CHARSET=utf8";
$this->app->DB->Update($sql);
$this->CheckAlterTable("ALTER TABLE `$table`
ADD PRIMARY KEY (`".$pk."`)");
$this->CheckAlterTable("ALTER TABLE `$table`
MODIFY `".$pk."` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=1");
}
if($pk !== 'id') {
$this->CheckColumn('created_at','timestamp',$table,"DEFAULT CURRENT_TIMESTAMP NOT NULL");
}
}
/**
* @param string $column
* @param string $type
* @param string $table
* @param string $default
*
* @return void
*/
function UpdateColumn($column,$type,$table,$default="NOT NULL")
{
$fields = $this->app->DB->SelectArr("show columns from `".$table."`");
if($fields)
{
foreach($fields as $val)
{
$field_array[] = $val['Field'];
}
}
if (in_array($column, $field_array))
{
$this->app->DB->Query('ALTER TABLE `'.$table.'` CHANGE `'.$column.'` `'.$column.'` '.$type.' '.$default.';');
}
}
/**
* @param string $column
* @param string $table
*
* @return void
*/
public function DeleteColumn($column,$table)
{
$this->app->DB->Query('ALTER TABLE `'.$table.'` DROP `'.$column.'`;');
}
/**
* @param string $column
* @param string $type
* @param string $table
* @param string $default
*
* @return void
*/
public function CheckColumn($column,$type,$table,$default="")
{
if($table === 'firmendaten')
{
if($this->app->DB->Select("SELECT `id` FROM `firmendaten_werte` WHERE `name` = '$column' LIMIT 1"))return;
}
if(!isset($this->CheckColumnTableCache[$table]))
{
$tmp=$this->app->DB->SelectArr("show columns from `".$table."`");
if($tmp)
{
foreach($tmp as $val)
{
$this->CheckColumnTableCache[$table][] = $val['Field'];
//$types[$val['Field']] = strtolower($val['Type']);
}
}
}
if (isset($this->CheckColumnTableCache[$table]) && !in_array($column, $this->CheckColumnTableCache[$table]))
{
if($this->check_column_missing_run)
{
//$result = mysqli_query($this->app->DB->connection,'ALTER TABLE `'.$table.'` ADD `'.$column.'` '.$type.' '.$default.';');
$this->check_column_missing[$table][]=$column;
} else {
$result = $this->app->DB->Query('ALTER TABLE `'.$table.'` ADD `'.$column.'` '.$type.' '.$default.';');
if($table === 'firmendaten' && $this->app->DB->error())
{
if((method_exists($this->app->DB, 'errno2') && $this->app->DB->errno() == '1118')
|| strpos($this->app->DB->error(),'Row size too large') !== false
)
{
$this->ChangeFirmendatenToMyIsam();
$this->app->DB->Query('ALTER TABLE `'.$table.'` ADD `'.$column.'` '.$type.' '.$default.';');
}
}
}
}
}
/**
* @param array $indexe
*
* @return array
*/
protected function getGroupedIndexe($indexe)
{
if(empty($indexe)) {
return $indexe;
}
$return = [];
foreach($indexe as $index) {
$keyName = $index['Key_name'];
$isUnique = $index['Non_unique'] == '0';
$seq = $index['Seq_in_index'];
$columnName = $index['Column_name'];
$return[$isUnique?'unique':'index'][$keyName][(int)$seq - 1] = $columnName;
}
return $return;
}
/**
* @param array $indexe
*
* @return array
*/
protected function getDoubleIndexeFromGroupedIndexe($indexe)
{
if(empty($indexe)) {
return [];
}
$ret = [];
foreach($indexe as $type => $indexArrs) {
$columnStrings = [];
foreach($indexArrs as $indexKey => $columns) {
$columnString = implode('|', $columns);
if(in_array($columnString, $columnStrings)) {
$ret[$type][] = $indexKey;
continue;
}
$columnStrings[] = $columnString;
}
}
return $ret;
}
/**
* @param string $table
* @param array $indexe
* @param bool $noCache
*
* @return array|null
*/
public function CheckDoubleIndex($table, $indexe, $noCache = false)
{
$query = $noCache?null:$this->CheckAlterTable("SHOW INDEX FROM `$table`");
if(!$query) {
$indexeGrouped = $this->getGroupedIndexe($indexe);
$doubleIndexe = $this->getDoubleIndexeFromGroupedIndexe($indexeGrouped);
if(!empty($doubleIndexe)) {
$indexe = $this->getIndexeCached($table, true);
$indexeGrouped = $this->getGroupedIndexe($indexe);
$doubleIndexe = $this->getDoubleIndexeFromGroupedIndexe($indexeGrouped);
if(empty($doubleIndexe)) {
return $indexe;
}
foreach($doubleIndexe as $type => $doubleIndex) {
foreach($doubleIndex as $indexName) {
$this->app->DB->Query("ALTER TABLE `".$table."` DROP INDEX `".$indexName."`");
}
}
}
elseif($noCache) {
return $indexe;
}
$this->CheckAlterTable("SHOW INDEX FROM `$table`", true);
return $this->getIndexeCached($table, true);
}
if(empty($indexe) || count($indexe) == 1){
return $indexe;
}
$uniquearr = array();
$indexarr = array();
foreach($indexe as $index)
{
if($index['Key_name'] !== 'PRIMARY' && !empty($index['Column_name']))
{
if($index['Non_unique'])
{
$indexarr[$index['Key_name']][] = $index['Column_name'];
}else{
$uniquearr[$index['Key_name']][] = $index['Column_name'];
}
}
}
$cindex = count($indexarr);
$cuniqe = count($uniquearr);
$changed = false;
if($cindex > 1)
{
$check = array();
foreach($indexarr as $key => $value)
{
if(empty($value))
{
continue;
}
if(count($value) > 1){
sort($value);
}
$vstr = implode(',', $value);
if(in_array($vstr, $check))
{
$this->app->DB->Query("DROP INDEX `".$key."` ON `".$table."`");
$changed = true;
}else{
$check[] = $vstr;
}
}
}
if($cuniqe > 1)
{
$check = array();
foreach($uniquearr as $key => $value)
{
if(empty($value))
{
continue;
}
if(count($value) > 1){
sort($value);
}
$vstr = implode(',', $value);
if(in_array($vstr, $check))
{
$this->app->DB->Query("DROP UNIQUE `".$key."` ON `".$table."`");
$changed = true;
}else{
$check[] = $vstr;
}
}
}
if($changed) {
return $this->getIndexeCached($table, true);
}
return $indexe;
}
/**
* @param string $table
* @param string|array $column
*
* @return bool
*/
public function CheckFulltextIndex($table,$column)
{
if(empty($table) || empty($column))
{
return false;
}
if(!is_array($column))
{
$column = [$column];
}
$columnmasked = [];
foreach($column as $keyColumn => $valueColumn)
{
if(!empty($valueColumn))
{
$columnmasked[] = "`$valueColumn`";
}else{
unset($column[$keyColumn]);
}
}
if(empty($column))
{
return false;
}
$columnsFound = [];
$indexe = $this->getIndexeCached($table, true);
$indexeFound = [];
if(!empty($indexe))
{
foreach($indexe as $index)
{
if($index['Index_type'] === 'FULLTEXT')
{
$indexeFound[] = $index['Column_name'];
if(!in_array($index['Column_name'], $columnsFound))
{
$columnsFound[] = $index['Column_name'];
}
}
}
$cindexeFound = count($indexeFound);
$column = count($column);
if(($column === $cindexeFound) && (count($columnsFound) === $column))
{
return true;
}
if($cindexeFound > 0)
{
return false;
}
}
$this->app->DB->Query(
"ALTER TABLE `$table`
ADD FULLTEXT INDEX `FullText`
(".implode(',',$columnmasked).");"
);
$error = $this->app->DB->error();
return empty($error);
}
/**
* @param string $table
* @param string $column
* @param bool $unique
*
* @return void
*/
function CheckIndex($table, $column, $unique = false)
{
$indexex = null;
$indexexother = null;
$indexe = $this->getIndexeCached($table);
if($indexe)
{
$indexe = $this->CheckDoubleIndex($table, $indexe, true);
foreach($indexe as $index)
{
if(is_array($column) && $index['Key_name'] !== 'PRIMARY')
{
if($unique && !$index['Non_unique'])
{
if(in_array($index['Column_name'], $column))
{
$indexex[$index['Key_name']][$index['Column_name']] = true;
}else{
$indexexother[$index['Key_name']][$index['Column_name']] = true;
}
}
elseif(!$unique){
if(in_array($index['Column_name'], $column)) {
$indexex[$index['Key_name']][$index['Column_name']] = true;
}
}
}
elseif(!is_array($column)){
if($index['Column_name'] == $column)
{
return;
}
}
}
if($this->check_column_missing_run)
{
$this->check_index_missing[$table][] = $column;
}
if(!$unique)
{
if(is_array($column))
{
if($indexex)
{
foreach($indexex as $k => $v) {
if(count($v) === 1 && count($column) > 1) {
$this->app->DB->Query("DROP INDEX `".$k."` ON `".$table."`");
$this->clearIndexCached($table);
unset($indexex[$k]);
}
}
foreach($indexex as $k => $v)
{
if(count($v) == count($column)){
return;
}
}
foreach($indexex as $k => $v)
{
if(!isset($indexexother[$k]))
{
$this->app->DB->Query("DROP INDEX `".$k."` ON `".$table."`");
$cols = null;
foreach($column as $c) {
$cols[] = "`$c`";
}
$this->CheckAlterTable("ALTER TABLE `$table` ADD INDEX(".implode(', ',$cols)."); ",true);
$this->clearIndexCached($table);
return;
}
}
}
$cols = null;
foreach($column as $c) {
$cols[] = "`$c`";
}
$this->CheckAlterTable("ALTER TABLE `$table` ADD INDEX(".implode(', ',$cols)."); ", true);
$this->clearIndexCached($table);
}
else{
$this->CheckAlterTable("ALTER TABLE `$table` ADD INDEX(`$column`); ", true);
$this->clearIndexCached($table);
}
}
else{
if(is_array($column))
{
if($indexex)
{
foreach($indexex as $k => $v)
{
if(count($v) == count($column))
{
return;
}
}
foreach($indexex as $k => $v)
{
if(!isset($indexexother[$k]))
{
$this->app->DB->Query("DROP INDEX `".$k."` ON `".$table."`");
$cols = null;
foreach($column as $c) {
$cols[] = "`$c`";
}
$this->CheckAlterTable("ALTER TABLE `$table` ADD UNIQUE(".implode(', ',$cols)."); ", true);
$this->clearIndexCached($table);
return;
}
}
}
$cols = null;
foreach($column as $c) {
$cols[] = "`$c`";
}
$this->CheckAlterTable("ALTER TABLE `$table` ADD UNIQUE(".implode(', ',$cols)."); ", true);
$this->clearIndexCached($table);
}else{
$this->CheckAlterTable("ALTER TABLE `$table` ADD UNIQUE(`$column`); ", true);
$this->clearIndexCached($table);
}
}
}
elseif(!is_array($column))
{
if(!$unique)
{
$this->CheckAlterTable("ALTER TABLE `$table` ADD INDEX(`$column`); ");
}else{
$this->CheckAlterTable("ALTER TABLE `$table` ADD UNIQUE(`$column`); ");
}
$this->clearIndexCached($table);
}
elseif(is_array($column))
{
$cols = null;
foreach($column as $c) {
$cols[] = "`$c`";
}
$this->CheckAlterTable("ALTER TABLE `$table` ADD UNIQUE(".implode(', ',$cols)."); ");
$this->clearIndexCached($table);
}
}
/**
* @param string $sql
* @param bool $force
*
* @return mysqli_result|bool
*/
function CheckAlterTable($sql, $force = false)
{
$sqlmd5 = md5($sql);
$check = $this->app->DB->Select("SELECT id FROM checkaltertable WHERE checksum='$sqlmd5' LIMIT 1");
if($check > 0 && !$force) return;
$query = $this->app->DB->Query($sql);
if($query && empty($check) && !$this->app->DB->error()){
$this->app->DB->Insert("INSERT INTO checkaltertable (id,checksum) VALUES ('','$sqlmd5')");
}
return $query;
}
/**
* @return void
*/
public function ChangeFirmendatenToMyIsam()
{
$this->app->DB->Query("ALTER TABLE firmendaten ENGINE = MyISAM;");
}
/**
* @param string $table
*
* @return array
*/
public function getSortedIndexColumnsByIndexName($table): array
{
$indexesByName = [];
$indexes = $this->app->DB->SelectArr(sprintf('SHOW INDEX FROM `%s`', $table));
if(empty($indexes)) {
return $indexesByName;
}
foreach($indexes as $index) {
$indexesByName[$index['Key_name']][] = $index['Column_name'];
}
foreach($indexesByName as $indexName => $columns) {
$columns = array_unique($columns);
sort($columns);
$indexesByName[$indexName] = $columns;
}
return $indexesByName;
}
/**
* @deprecated will be removed in 21.4
*
* @param string $table
* @param array $columns
*/
public function dropIndex($table, $columns): void
{
if(empty($table) || empty($columns)) {
return;
}
$columns = array_unique($columns);
sort($columns);
$countColumns = count($columns);
$indexes = $this->getSortedIndexColumnsByIndexName($table);
if(empty($indexes)) {
return;
}
foreach($indexes as $indexName => $indexColumns) {
if(count($indexColumns) !== $countColumns) {
continue;
}
if(count(array_intersect($indexColumns, $columns)) === $countColumns) {
$this->app->DB->Query(sprintf('ALTER TABLE `%s` DROP INDEX `%s`', $table, $indexName));
}
}
}
}
+341 -337
View File
@@ -1,340 +1,344 @@
<?php
/*
**** COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
*
* Xentral (c) Xentral ERP Sorftware GmbH, Fuggerstrasse 11, D-86150 Augsburg, * Germany 2019
*
* This file is licensed under the Embedded Projects General Public License *Version 3.1.
*
* You should have received a copy of this license from your vendor and/or *along with this file; If not, please visit www.wawision.de/Lizenzhinweis
* to obtain the text of the corresponding license version.
*
**** END OF COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
/*
**** COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
*
* Xentral (c) Xentral ERP Sorftware GmbH, Fuggerstrasse 11, D-86150 Augsburg, * Germany 2019
*
* This file is licensed under the Embedded Projects General Public License *Version 3.1.
*
* You should have received a copy of this license from your vendor and/or *along with this file; If not, please visit www.wawision.de/Lizenzhinweis
* to obtain the text of the corresponding license version.
*
**** END OF COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
*/
?>
<?php
/// Secure Layer, SQL Inject. Check, Syntax Check
class Secure
{
public $GET;
public $POST;
/**
* Secure constructor.
*
* @param ApplicationCore $app
*/
public function __construct($app){
$this->app = $app;
// clear global variables, that everybody have to go over secure layer
$this->GET = $_GET;
if(isset($this->GET['msgs']) && isset($this->app->Location)) {
$this->GET['msg'] = $this->app->Location->getMessage($this->GET['msgs']);
}
// $_GET="";
$this->POST = $_POST;
// $_POST="";
if(!isset($this->app->stringcleaner) && file_exists(__DIR__. '/class.stringcleaner.php')) {
if(!class_exists('StringCleaner')) {
require_once __DIR__ . '/class.stringcleaner.php';
}
$this->app->stringcleaner = new StringCleaner($this->app);
}
$this->AddRule('notempty','reg','.'); // at least one sign
$this->AddRule('alpha','reg','[a-zA-Z]');
$this->AddRule('digit','reg','[0-9]');
$this->AddRule('space','reg','[ ]');
$this->AddRule('specialchars','reg','[_-]');
$this->AddRule('email','reg','^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.([a-zA-Z]{2,4})$');
$this->AddRule('datum','reg','([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})');
$this->AddRule('username','glue','alpha+digit');
$this->AddRule('password','glue','alpha+digit+specialchars');
}
/**
* @param string $name
* @param null $rule
* @param string $maxlength
* @param string $sqlcheckoff
*
* @return array|mixed|string
*/
public function GetGET($name,$rule=null,$maxlength='',$sqlcheckoff='')
{
if($name === 'msg' && isset($this->app->erp) && method_exists($this, 'xss_clean')) {
$ret = $this->Syntax(isset($this->GET[$name])?$this->GET[$name]:'','',$maxlength,$sqlcheckoff);
$ret = $this->app->erp->base64_url_decode($ret);
if(strpos($ret,'"button"') === false){
$ret = $this->xss_clean($ret);
}
return $this->app->erp->base64_url_encode($ret);
}
if($rule === null) {
$rule = $this->NameToRule($name);
}
return $this->Syntax(isset($this->GET[$name])?$this->GET[$name]:'',$rule,$maxlength,$sqlcheckoff);
}
function NameToRule($name)
{
switch($name)
{
case 'id':
return 'doppelid';
break;
case 'sid':
return 'alphadigits';
break;
case 'module':
case 'smodule':
case 'action':
case 'saction':
return 'module';
break;
case 'cmd':
return 'moduleminus';
break;
}
return 'nothtml';
}
public function GetPOST($name,$rule=null,$maxlength="",$sqlcheckoff="")
{
if($rule === null) {
$rule = $this->NameToRule($name);
if(isset($this->POST['ishtml_cke_'.$name]) && $this->POST['ishtml_cke_'.$name]) {
$rule = 'nojs';
}
}
return $this->Syntax(isset($this->POST[$name])?$this->POST[$name]:'',$rule,$maxlength,$sqlcheckoff);
}
public function GetPOSTForForms($name,$rule="",$maxlength="",$sqlcheckoff="")
{
return $this->SyntaxForForms($this->POST[$name],$rule,$maxlength,$sqlcheckoff);
}
public function CleanString($string, $rule='nohtml',$sqlcheckoff='')
{
return $this->Syntax($string, $rule, '', $sqlcheckoff);
}
public function xss_clean($data)
{
return $this->app->stringcleaner->xss_clean($data);
}
public function GetPOSTArray()
{
if(!empty($this->POST) && count($this->POST)>0)
{
foreach($this->POST as $key=>$value)
{
$key = $this->GetPOST($key,"alpha+digit+specialchars",20);
$ret[$key]=$this->GetPOST($value);
}
}
if(!empty($ret))
{
return $ret;
}
return null;
}
public function GetGETArray()
{
if(!empty($this->GET) && count($this->GET)>0)
{
foreach($this->GET as $key=>$value)
{
$key = $this->GetGET($key,"alpha+digit+specialchars",20);
$ret[$key]=$this->GetGET($value);
}
}
if(!empty($ret))
{
return $ret;
}
return null;
}
function stripallslashes($string) {
while(strstr($string,'\\')) {
$string = stripslashes($string);
}
return $string;
}
public function smartstripslashes($str) {
$cd1 = substr_count($str, "\"");
$cd2 = substr_count($str, "\\\"");
$cs1 = substr_count($str, "'");
$cs2 = substr_count($str, "\\'");
$tmp = strtr($str, array("\\\"" => "", "\\'" => ""));
$cb1 = substr_count($tmp, "\\");
$cb2 = substr_count($tmp, "\\\\");
if ($cd1 == $cd2 && $cs1 == $cs2 && $cb1 == 2 * $cb2) {
return strtr($str, array("\\\"" => "\"", "\\'" => "'", "\\\\" => "\\"));
}
return $str;
}
public function SyntaxForForms($value,$rule,$maxlength="",$sqlcheckoff="")
{
return $value;//mysqli_real_escape_string($this->app->DB->connection,$value);//mysqli_real_escape_string($value);
}
// check actual value with given rule
public function Syntax($value,$rule,$maxlength='',$sqlcheckoff='')
{
$striptags = false;
if(is_array($value))
{
if($sqlcheckoff != '')
{
return $value;
}
foreach($value as $k => $v)
{
if(is_array($v))
{
$value[$k] = $v;
}else{
$v = str_replace("\xef\xbb\xbf","NONBLOCKINGZERO",$v);
if($striptags){
$v = $this->stripallslashes($v);
$v = $this->smartstripslashes($v);
$v = $this->app->erp->superentities($v);
}
$value[$k] = $this->app->DB->real_escape_string($v);
}
}
return $value;
}
$value = str_replace("\xef\xbb\xbf","NONBLOCKINGZERO",$value);
if($striptags){
$value = $this->stripallslashes($value);
$value = $this->smartstripslashes($value);
$value = $this->app->erp->superentities($value);
}
if(!empty($this->app->stringcleaner)) {
if( $sqlcheckoff == '') {
return $this->app->DB->real_escape_string($this->app->stringcleaner->CleanString($value, $rule));
}
return $this->app->stringcleaner->CleanString($value, $rule);
}
if($rule === 'nohtml') {
if( $sqlcheckoff == '') {
return $this->app->DB->real_escape_string(strip_tags($value));
}
return strip_tags($value);
}
if($rule === 'nojs') {
if( $sqlcheckoff == '') {
return $this->app->DB->real_escape_string($this->xss_clean($value));
}
return $this->xss_clean($value);
}
if($rule=='' && $sqlcheckoff == '') {
return $this->app->DB->real_escape_string($value);//mysqli_real_escape_string($value);
}
if($rule=='' && $sqlcheckoff != '') {
return $value;
}
// build complete regexp
// check if rule exists
if($this->GetRegexp($rule)!=''){
//$v = '/^['.$this->GetRegexp($rule).']+$/';
$v = $this->GetRegexp($rule);
if (preg_match_all('/'.$v.'/i', $value, $teffer) ) {
if($sqlcheckoff==''){
return $this->app->DB->real_escape_string($value);//mysqli_real_escape_string($value);
}
return $value;
}
return '';
}
echo "<table border=\"1\" width=\"100%\" bgcolor=\"#FFB6C1\">
<tr><td>Rule <b>$rule</b> doesn't exists!</td></tr></table>";
return '';
}
function RuleCheck($value,$rule)
{
$found = false;
if(!empty($this->app->stringcleaner)) {
$value_ = $this->app->stringcleaner->RuleCheck($value, $rule, $found);
if($found) {
if($value_) {
return true;
}
return false;
}
}
$v = $this->GetRegexp($rule);
if (preg_match_all('/'.$v.'/i', $value, $teffer) ){
return true;
}
return false;
}
function AddRule($name,$type,$rule)
{
// type: reg = regular expression
// type: glue ( already exists rules copy to new e.g. number+digit)
$this->rules[$name]=array('type'=>$type,'rule'=>$rule);
}
// get complete regexp by rule name
function GetRegexp($rule)
{
$rules = explode('+',$rule);
$ret = '';
foreach($rules as $key) {
// check if rule is last in glue string
if($this->rules[$key]['type']==='glue') {
$subrules = explode('+',$this->rules[$key]['rule']);
if(count($subrules)>0) {
foreach($subrules as $subkey) {
$ret .= $this->GetRegexp($subkey);
}
}
}
elseif($this->rules[$key]['type']==='reg') {
$ret .= $this->rules[$key]['rule'];
}
}
if($ret==''){
$ret = 'none';
}
return $ret;
}
}
<?php
/// Secure Layer, SQL Inject. Check, Syntax Check
class Secure
{
public $GET;
public $POST;
/**
* Secure constructor.
*
* @param ApplicationCore $app
*/
public function __construct($app){
$this->app = $app;
// clear global variables, that everybody have to go over secure layer
$this->GET = $_GET;
if(isset($this->GET['msgs']) && isset($this->app->Location)) {
$this->GET['msg'] = $this->app->Location->getMessage($this->GET['msgs']);
}
// $_GET="";
$this->POST = $_POST;
// $_POST="";
if(!isset($this->app->stringcleaner) && file_exists(__DIR__. '/class.stringcleaner.php')) {
if(!class_exists('StringCleaner')) {
require_once __DIR__ . '/class.stringcleaner.php';
}
$this->app->stringcleaner = new StringCleaner($this->app);
}
$this->AddRule('notempty','reg','.'); // at least one sign
$this->AddRule('alpha','reg','[a-zA-Z]');
$this->AddRule('digit','reg','[0-9]');
$this->AddRule('space','reg','[ ]');
$this->AddRule('specialchars','reg','[_-]');
$this->AddRule('email','reg','^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.([a-zA-Z]{2,4})$');
$this->AddRule('datum','reg','([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})');
$this->AddRule('username','glue','alpha+digit');
$this->AddRule('password','glue','alpha+digit+specialchars');
}
/**
* @param string $name
* @param null $rule
* @param string $maxlength
* @param string $sqlcheckoff
*
* @return array|mixed|string
*/
public function GetGET($name,$rule=null,$maxlength='',$sqlcheckoff='')
{
if($name === 'msg' && isset($this->app->erp) && method_exists($this, 'xss_clean')) {
$ret = $this->Syntax(isset($this->GET[$name])?$this->GET[$name]:'','',$maxlength,$sqlcheckoff);
$ret = $this->app->erp->base64_url_decode($ret);
if(strpos($ret,'"button"') === false){
$ret = $this->xss_clean($ret);
}
return $this->app->erp->base64_url_encode($ret);
}
if($rule === null) {
$rule = $this->NameToRule($name);
}
return $this->Syntax(isset($this->GET[$name])?$this->GET[$name]:'',$rule,$maxlength,$sqlcheckoff);
}
function NameToRule($name)
{
switch($name)
{
case 'id':
return 'doppelid';
break;
case 'sid':
return 'alphadigits';
break;
case 'module':
case 'smodule':
case 'action':
case 'saction':
return 'module';
break;
case 'cmd':
return 'moduleminus';
break;
}
return 'nothtml';
}
public function GetPOST($name,$rule=null,$maxlength="",$sqlcheckoff="")
{
if($rule === null) {
$rule = $this->NameToRule($name);
if(isset($this->POST['ishtml_cke_'.$name]) && $this->POST['ishtml_cke_'.$name]) {
$rule = 'nojs';
}
}
return $this->Syntax(isset($this->POST[$name])?$this->POST[$name]:'',$rule,$maxlength,$sqlcheckoff);
}
public function GetPOSTForForms($name,$rule="",$maxlength="",$sqlcheckoff="")
{
return $this->SyntaxForForms($this->POST[$name],$rule,$maxlength,$sqlcheckoff);
}
public function CleanString($string, $rule='nohtml',$sqlcheckoff='')
{
return $this->Syntax($string, $rule, '', $sqlcheckoff);
}
public function xss_clean($data)
{
return $this->app->stringcleaner->xss_clean($data);
}
public function GetPOSTArray()
{
if(!empty($this->POST) && count($this->POST)>0)
{
foreach($this->POST as $key=>$value)
{
$value = $this->GetPOST($key);
if ($value !== null) {
$ret[$key] = $value;
}
}
}
if(!empty($ret))
{
return $ret;
}
return null;
}
public function GetGETArray()
{
if(!empty($this->GET) && count($this->GET)>0)
{
foreach($this->GET as $key=>$value)
{
$value = $this->GetGET($key);
if ($value !== null) {
$ret[$key] = $value;
}
}
}
if(!empty($ret))
{
return $ret;
}
return null;
}
function stripallslashes($string) {
while(strstr($string,'\\')) {
$string = stripslashes($string);
}
return $string;
}
public function smartstripslashes($str) {
$cd1 = substr_count($str, "\"");
$cd2 = substr_count($str, "\\\"");
$cs1 = substr_count($str, "'");
$cs2 = substr_count($str, "\\'");
$tmp = strtr($str, array("\\\"" => "", "\\'" => ""));
$cb1 = substr_count($tmp, "\\");
$cb2 = substr_count($tmp, "\\\\");
if ($cd1 == $cd2 && $cs1 == $cs2 && $cb1 == 2 * $cb2) {
return strtr($str, array("\\\"" => "\"", "\\'" => "'", "\\\\" => "\\"));
}
return $str;
}
public function SyntaxForForms($value,$rule,$maxlength="",$sqlcheckoff="")
{
return $value;//mysqli_real_escape_string($this->app->DB->connection,$value);//mysqli_real_escape_string($value);
}
// check actual value with given rule
public function Syntax($value,$rule,$maxlength='',$sqlcheckoff='')
{
$striptags = false;
if(is_array($value))
{
if($sqlcheckoff != '')
{
return $value;
}
foreach($value as $k => $v)
{
if(is_array($v))
{
$value[$k] = $v;
}else{
$v = str_replace("\xef\xbb\xbf","NONBLOCKINGZERO",$v);
if($striptags){
$v = $this->stripallslashes($v);
$v = $this->smartstripslashes($v);
$v = $this->app->erp->superentities($v);
}
$value[$k] = $this->app->DB->real_escape_string($v);
}
}
return $value;
}
$value = str_replace("\xef\xbb\xbf","NONBLOCKINGZERO",$value);
if($striptags){
$value = $this->stripallslashes($value);
$value = $this->smartstripslashes($value);
$value = $this->app->erp->superentities($value);
}
if(!empty($this->app->stringcleaner)) {
if( $sqlcheckoff == '') {
return $this->app->DB->real_escape_string($this->app->stringcleaner->CleanString($value, $rule));
}
return $this->app->stringcleaner->CleanString($value, $rule);
}
if($rule === 'nohtml') {
if( $sqlcheckoff == '') {
return $this->app->DB->real_escape_string(strip_tags($value));
}
return strip_tags($value);
}
if($rule === 'nojs') {
if( $sqlcheckoff == '') {
return $this->app->DB->real_escape_string($this->xss_clean($value));
}
return $this->xss_clean($value);
}
if($rule=='' && $sqlcheckoff == '') {
return $this->app->DB->real_escape_string($value);//mysqli_real_escape_string($value);
}
if($rule=='' && $sqlcheckoff != '') {
return $value;
}
// build complete regexp
// check if rule exists
if($this->GetRegexp($rule)!=''){
//$v = '/^['.$this->GetRegexp($rule).']+$/';
$v = $this->GetRegexp($rule);
if (preg_match_all('/'.$v.'/i', $value, $teffer) ) {
if($sqlcheckoff==''){
return $this->app->DB->real_escape_string($value);//mysqli_real_escape_string($value);
}
return $value;
}
return '';
}
echo "<table border=\"1\" width=\"100%\" bgcolor=\"#FFB6C1\">
<tr><td>Rule <b>$rule</b> doesn't exists!</td></tr></table>";
return '';
}
function RuleCheck($value,$rule)
{
$found = false;
if(!empty($this->app->stringcleaner)) {
$value_ = $this->app->stringcleaner->RuleCheck($value, $rule, $found);
if($found) {
if($value_) {
return true;
}
return false;
}
}
$v = $this->GetRegexp($rule);
if (preg_match_all('/'.$v.'/i', $value, $teffer) ){
return true;
}
return false;
}
function AddRule($name,$type,$rule)
{
// type: reg = regular expression
// type: glue ( already exists rules copy to new e.g. number+digit)
$this->rules[$name]=array('type'=>$type,'rule'=>$rule);
}
// get complete regexp by rule name
function GetRegexp($rule)
{
$rules = explode('+',$rule);
$ret = '';
foreach($rules as $key) {
// check if rule is last in glue string
if($this->rules[$key]['type']==='glue') {
$subrules = explode('+',$this->rules[$key]['rule']);
if(count($subrules)>0) {
foreach($subrules as $subkey) {
$ret .= $this->GetRegexp($subkey);
}
}
}
elseif($this->rules[$key]['type']==='reg') {
$ret .= $this->rules[$key]['rule'];
}
}
if($ret==''){
$ret = 'none';
}
return $ret;
}
}
+61
View File
@@ -3552,6 +3552,67 @@ class YUI {
'</td></tr></table>')";
}
function IconsSQL_produktion($tablename) {
$freigegeben = "<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/produkton_laeuft.png\" title=\"Produktion freigegeben\" border=\"0\" style=\"margin-right:1px\">";
$angelegt = "<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/blue.png\" title=\"Produktion angelegt\" border=\"0\" style=\"margin-right:1px\">";
$abgeschlossen = "<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/grey.png\" title=\"Produktion abgeschlossen\" border=\"0\" style=\"margin-right:1px\">";
$gestartet = "<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/produkton_green.png\" title=\"Produktion gestartet\" border=\"0\" style=\"margin-right:1px\">";
$storniert = "<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/storno.png\" title=\"Produktion storniert\" border=\"0\" style=\"margin-right:1px\">";
for ($z = 0;$z < 6;$z++) {
$angelegt_6 .= $angelegt;
$abgeschlossen_6 .= $abgeschlossen;
$storniert_6 .= $storniert;
}
$lager_ok = "<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/lagergo.png\" style=\"margin-right:1px\" title=\"Artikel ist im Lager\" border=\"0\">";
$lager_nicht_ok = "<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/lagerstop.png\" style=\"margin-right:1px\" title=\"Artikel fehlt im Lager\" border=\"0\">";
$reserviert_ok = "<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/ware_bestellt.png\" style=\"margin-right:1px\" title=\"Artikel reserviert\" border=\"0\">";
$reserviert_nicht_ok = "<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/ware_nicht_bestellt.png\" style=\"margin-right:1px\" title=\"Artikel nicht reserviert\" border=\"0\">";
$auslagern_ok = "<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/ausgelagert.png\" title=\"Produktion ausgelagert\" border=\"0\" style=\"margin-right:1px\">";
$auslagern_nicht_ok = "<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/nicht_ausgelagert.png\" title=\"Produktion ausgelagert\" border=\"0\" style=\"margin-right:1px\">";
$einlagern_ok = "<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/eingelagert.png\" title=\"Produktion eingelagert\" border=\"0\" style=\"margin-right:1px\">";
$einlagern_nicht_ok = "<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/nicht_eingelagert.png\" title=\"Produktion eingelagert\" border=\"0\" style=\"margin-right:1px\">";
$zeit_ok = "<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/zeit_dreiviertel.png\" style=\"margin-right:1px\" title=\"Zeiten erfasst\" border=\"0\">";
$zeit_nicht_ok = "<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/keine_zeiten.png\" style=\"margin-right:1px\" title=\"Zeiten nicht erfasst\" border=\"0\">";
$versand_ok = "<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/liefersperrego.png\" style=\"margin-right:1px\" title=\"Versand ok\" border=\"0\">";
$versand_nicht_ok = "<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/liefersperrestop.png\" style=\"margin-right:1px\" title=\"Versand nicht ok\" border=\"0\">";
return "CONCAT('<table><tr><td nowrap>',
CASE
WHEN $tablename.status = 'freigegeben' THEN '$freigegeben'
WHEN $tablename.status = 'abgeschlossen' THEN '$abgeschlossen'
WHEN $tablename.status = 'angelegt' THEN '$angelegt'
WHEN $tablename.status = 'gestartet' THEN '$gestartet'
ELSE
'$storniert'
end,
CASE
WHEN FIND_IN_SET($tablename.status, 'freigegeben,gestartet') THEN
CONCAT (
if($tablename.lager_ok,'$lager_ok','$lager_nicht_ok'),
if($tablename.reserviert_ok,'$reserviert_ok','$reserviert_nicht_ok'),
if($tablename.auslagern_ok,'$auslagern_ok','$auslagern_nicht_ok'),
if($tablename.einlagern_ok,'$einlagern_ok','$einlagern_nicht_ok'),
if($tablename.zeit_ok,'$zeit_ok','$zeit_nicht_ok'),
if($tablename.versand_ok,'$versand_ok','$versand_nicht_ok')
)
ELSE
CASE
WHEN $tablename.status = 'angelegt' THEN '$angelegt_6'
WHEN $tablename.status = 'abgeschlossen' THEN '$abgeschlossen_6'
ELSE
'$storniert_6'
END
END,
'</td></tr></table>')";
}
function TablePositionSearch($parsetarget, $name, $callback = "show", $gener) {
$id = $this->app->Secure->GetGET("id");
@@ -0,0 +1,6 @@
{
"host": "localhost",
"database": "openxe",
"user": "openxe",
"passwd": "openxe"
}
+343
View File
@@ -0,0 +1,343 @@
<?php
/*
* Helper to compare database structures from files vs. database
*
* Copyright (c) 2022 OpenXE project
*
*/
/*
MariaDB [openxe]> SHOW FULL db_def;
+----------------------------------------------+------------+
| Tables_in_openxe | Table_type |
+----------------------------------------------+------------+
| abrechnungsartikel | BASE TABLE |
| abrechnungsartikel_gruppe | BASE TABLE |
| abschlagsrechnung_rechnung | BASE TABLE |
| accordion | BASE TABLE |
| adapterbox | BASE TABLE |
| adapterbox_log | BASE TABLE |
| adapterbox_request_log | BASE TABLE |
| adresse | BASE TABLE |
| adresse_abosammelrechnungen | BASE TABLE |
| adresse_accounts | BASE TABLE |
| adresse_filter | BASE TABLE |
| adresse_filter_gruppen | BASE TABLE |
...
MariaDB [openxe]> SHOW FULL COLUMNS FROM wiki;
+-------------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+-------------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| id | int(11) | NULL | NO | PRI | NULL | auto_increment | select,insert,update,references | |
| name | varchar(255) | utf8mb3_general_ci | YES | MUL | NULL | | select,insert,update,references | |
| content | longtext | utf8mb3_general_ci | NO | | NULL | | select,insert,update,references | |
| lastcontent | longtext | utf8mb3_general_ci | NO | | NULL | | select,insert,update,references | |
| wiki_workspace_id | int(11) | NULL | NO | | 0 | | select,insert,update,references | |
| parent_id | int(11) | NULL | NO | | 0 | | select,insert,update,references | |
| language | varchar(32) | utf8mb3_general_ci | NO | | | | select,insert,update,references | |
+-------------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
MariaDB [openxe]> show keys from wiki;
+-------+------------+----------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Ignored |
+-------+------------+----------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| wiki | 0 | PRIMARY | 1 | id | A | 244 | NULL | NULL | | BTREE | | | NO |
| wiki | 0 | suche | 1 | name | A | 244 | NULL | NULL | YES | BTREE | | | NO |
| wiki | 0 | suche | 2 | wiki_workspace_id | A | 244 | NULL | NULL | | BTREE | | | NO |
| wiki | 1 | name | 1 | name | A | 244 | NULL | NULL | YES | BTREE | | | NO |
+-------+------------+----------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
*/
require('mustal_mysql_upgrade_tool.php');
$connection_info_file_name = "connection_info.json";
$target_folder = ".";
$tables_file_name_wo_folder = "db_schema.json";
$tables_file_name_w_folder = $target_folder."/".$tables_file_name_wo_folder;
$delimiter = ";";
$quote = '"';
$sql_file_name = "upgrade.sql";
$color_red = "\033[31m";
$color_green = "\033[32m";
$color_yellow = "\033[33m";
$color_default = "\033[39m";
// -------------------------------- START
echo("\n");
if ($argc > 1) {
if (in_array('-v', $argv)) {
$verbose = true;
} else {
$verbose = false;
}
if (in_array('-f', $argv)) {
$force = true;
} else {
$force = false;
}
if (in_array('-e', $argv)) {
$export = true;
} else {
$export = false;
}
if (in_array('-c', $argv)) {
$compare = true;
} else {
$compare = false;
}
if (in_array('-i', $argv)) {
$onlytables = true;
} else {
$onlytables = false;
}
if (in_array('-upgrade', $argv)) {
$upgrade = true;
} else {
$upgrade = false;
}
if (in_array('-do', $argv)) {
$doupgrade = true;
} else {
$doupgrade = false;
}
if (in_array('-clean', $argv)) {
$clean = true;
} else {
$clean = false;
}
if (in_array('-utf8fix', $argv)) {
$utf8fix = true;
} else {
$utf8fix = false;
}
$connection_info_contents = file_get_contents($connection_info_file_name);
if (!$connection_info_contents) {
echo("Unable to load $connection_info_file_name\n");
exit;
}
$connection_info = json_decode($connection_info_contents, true);
$host = $connection_info['host'];
$user = $connection_info['user'];
$passwd = $connection_info['passwd'];
$schema = $connection_info['database'];
echo("--------------- Loading from database '$schema@$host'... ---------------\n");
$db_def = mustal_load_tables_from_db($host, $schema, $user, $passwd, $mustal_replacers);
if (empty($db_def)) {
echo ("Could not load from $schema@$host\n");
exit;
}
echo("--------------- Loading from database '$schema@$host' complete. ---------------\n");
if ($export) {
echo("--------------- Export to JSON... ---------------\n");
// $result = save_tables_to_csv($db_def, $target_folder, $tables_file_name_wo_folder, $delimiter, $quote, $keys_postfix, $force);
$result = mustal_save_tables_to_json($db_def, $target_folder, $tables_file_name_wo_folder, $force);
if ($result != 0) {
$result_texts = array("ok","key postfix error","table list file error","table file error","key file error");
echo ("Could not save to JSON (".$result_texts[$result]."). To overwrite, use -f.\n");
exit;
}
echo("Exported ".count($db_def['tables'])." tables.\n");
echo("--------------- Export to JSON ($tables_file_name_w_folder) complete. ---------------\n");
}
if ($compare || $upgrade) {
// Results here as ['text'] ['diff']
$compare_differences = array();
echo("--------------- Loading from JSON... ---------------\n");
$compare_def = mustal_load_tables_from_json($target_folder, $tables_file_name_wo_folder);
if (empty($compare_def)) {
echo ("Could not load from JSON $tables_file_name_w_folder\n");
exit;
}
echo("--------------- Loading from JSON complete. ---------------\n");
// Do the comparison
/*
echo("--------------- Comparing JSON '".$compare_def['database']."@".$compare_def['host']."' vs. database '$schema@$host' ---------------\n");
echo(count($compare_def['tables'])." tables in JSON, ".count($db_def['tables'])." tables in database.\n");
$compare_differences = compare_table_array($db_def,"in DB",$compare_def,"in JSON",false);
echo("Comparison found ".(empty($compare_differences)?0:count($compare_differences))." differences.\n");
if ($verbose) {
foreach ($compare_differences as $compare_difference) {
$comma = "";
foreach ($compare_difference as $key => $value) {
echo($comma."$key => '$value'");
$comma = ", ";
}
echo("\n");
}
}*/
echo("--------------- Comparing database '$schema@$host' vs. JSON '".$compare_def['database']."@".$compare_def['host']."' ---------------\n");
if($utf8fix) {
$column_collation_aliases = array(
['utf8mb3_general_ci','utf8_general_ci']
);
} else {
$column_collation_aliases = array();
}
$compare_differences = mustal_compare_table_array($compare_def,"in JSON",$db_def,"in DB",true,$column_collation_aliases);
echo((empty($compare_differences)?0:count($compare_differences))." differences.\n");
if ($verbose) {
foreach ($compare_differences as $compare_difference) {
$comma = "";
foreach ($compare_difference as $key => $value) {
echo($comma."$key => [$value]");
$comma = ", ";
}
echo("\n");
}
}
echo("--------------- Comparison complete. ---------------\n");
}
if ($upgrade) {
// First create all db_def that are missing in the db
echo("--------------- Calculating database upgrade for '$schema@$host'... ---------------\n");
$upgrade_sql = array();
$result = mustal_calculate_db_upgrade($compare_def, $db_def, $upgrade_sql, $mustal_replacers);
if ($result != 0) {
echo("Error: $result\n");
exit;
}
if (!empty($result)) {
echo(count($result)." errors.\n");
if ($verbose) {
foreach($result as $error) {
echo("Code: ".$error[0]." '".$error[1]."'.");
}
}
return(-1);
}
echo("--------------- Database upgrade for '$schema@$host'... ---------------\n");
if ($verbose) {
foreach($upgrade_sql as $statement) {
echo($statement."\n");
}
}
echo(count($upgrade_sql)." upgrade statements\n");
echo("--------------- Database upgrade calculated for '$schema@$host' (show SQL with -v). ---------------\n");
if ($doupgrade) {
echo("--------------- Executing database upgrade for '$schema@$host' database will be written! ---------------\n");
// First get the contents of the database table structure
$mysqli = mysqli_connect($host, $user, $passwd, $schema);
/* Check if the connection succeeded */
if (!$mysqli) {
echo ("Failed to connect!\n");
} else {
$counter = 0;
$error_counter = 0;
$number_of_statements = count($upgrade_sql);
foreach ($upgrade_sql as $sql) {
$counter++;
echo("\rUpgrade step $counter of $number_of_statements... ");
if ($verbose) {
echo("(".substr($sql,0,100)."...) ");
}
$query_result = mysqli_query($mysqli, $sql);
if (!$query_result) {
$error = " not ok: ". mysqli_error($mysqli)."\n";
echo($error);
file_put_contents("./errors.txt",$error.$sql."\n",FILE_APPEND);
$error_counter++;
} else {
echo("ok.\r");
}
}
echo("--------------- Executing database upgrade for '$schema@$host' executed. ---------------\n");
echo("$error_counter errors.\n");
echo("--------------- Executing database upgrade for '$schema@$host' done. ---------------\n");
echo("--------------- Checking database upgrade for '$schema@$host'... ---------------\n");
$db_def = mustal_load_tables_from_db($host, $schema, $user, $passwd, $mustal_replacers);
echo("--------------- Comparing database '$schema@$host' vs. JSON '".$compare_def['database']."@".$compare_def['host']."' ---------------\n");
$compare_differences = mustal_compare_table_array($compare_def,"in JSON",$db_def,"in DB",true);
echo((empty($compare_differences)?0:count($compare_differences))." differences.\n");
}
}
} // upgrade
echo("--------------- Done. ---------------\n");
echo("\n");
} else {
info();
exit;
}
function info() {
echo("OpenXE database compare\n");
echo("Copyright 2022 (c) OpenXE project\n");
echo("\n");
echo("Export database structures in a defined format for database comparison / upgrade\n");
echo("Options:\n");
echo("\t-v: verbose output\n");
echo("\t-f: force override of existing files\n");
echo("\t-e: export database structure to files\n");
echo("\t-c: compare content of files with database structure\n");
echo("\t-i: ignore column definitions\n");
echo("\t-utf8fix: apply fix for 'utf8' != 'utf8mb3'\n");
echo("\t-upgrade: Create the needed SQL to upgrade the database to match the JSON\n");
echo("\t-do: Execute the SQL to upgrade the database to match the JSON (risky!)\n");
echo("\t-clean: (not yet implemented) Create the needed SQL to remove items from the database not in the JSON\n");
echo("\n");
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,661 @@
<?php
/*
MUSTAL Mysql Upgrade Schema Tool by Alex Ledis
Helper to compare database structures from JSON files vs. database and upgrade database
Copyright (c) 2022 Alex Ledis
Licensed under AGPL v3
Version 1.0
function mustal_load_tables_from_db(string $host, string $schema, string $user, string $passwd, $replacers) : array
Load structure from db connection to an array.
function mustal_save_tables_to_json(array $db_def, string $path, string $tables_file_name, bool $force) : int
Save structure from array to a JSON file.
function mustal_load_tables_from_json(string $path, string $tables_file_name) : array
Load structure from JSON file into array.
function mustal_compare_table_array(array $nominal, string $nominal_name, array $actual, string $actual_name, bool $check_column_definitions) : array
Compare two database structures
Returns a structured array containing information on all the differences.
function mustal_calculate_db_upgrade(array $compare_def, array $db_def, array &$upgrade_sql) : int
Generate the SQL needed to upgrade the database to match the definition, based on a comparison.
Data structure in Array and JSON
{
"host": "hostname",
"database": "schemaname",
"user": "username",
"tables": [
{
"name": "",
"type": "",
"columns": [
{
"Field": "",
"Type": "",
"Collation": "",
"Null": "",
"Key": "",
"Default": "",
"Extra": "",
"Privileges": "",
"Comment": ""
}
],
"keys": [
{
"Key_name": "",
"columns": [
"",
""
]
}
]
}
]
}
*/
// These default values will not be in quotes, converted to lowercase and be replaced by the second entry
$mustal_replacers = [
['current_timestamp','current_timestamp()'],
['on update current_timestamp','on update current_timestamp()']
];
// Load all db_def from a DB connection into a db_def array
function mustal_load_tables_from_db(string $host, string $schema, string $user, string $passwd, $replacers) : array {
// First get the contents of the database table structure
$mysqli = mysqli_connect($host, $user, $passwd, $schema);
/* Check if the connection succeeded */
if (!$mysqli) {
return(array());
}
// Get db_def and views
$sql = "SHOW FULL tables";
$query_result = mysqli_query($mysqli, $sql);
if (!$query_result) {
return(array());
}
while ($row = mysqli_fetch_assoc($query_result)) {
$table = array();
$table['name'] = $row['Tables_in_'.$schema];
$table['type'] = $row['Table_type'];
$tables[] = $table; // Add table to list of tables
}
// Get and add columns of the table
foreach ($tables as &$table) {
$sql = "SHOW FULL COLUMNS FROM ".$table['name'];
$query_result = mysqli_query($mysqli, $sql);
if (!$query_result) {
return(array());
}
$columns = array();
while ($column = mysqli_fetch_assoc($query_result)) {
// Do some harmonization
if ($column['Default'] !== NULL) {
mustal_sql_replace_reserved_functions($column,$replacers);
$column['Default'] = mustal_mysql_put_text_type_in_quotes($column['Type'],$column['Default']);
}
$columns[] = $column; // Add column to list of columns
}
$table['columns'] = $columns;
$sql = "SHOW KEYS FROM ".$table['name'];
$query_result = mysqli_query($mysqli, $sql);
if (!$query_result) {
return(array());
}
$keys = array();
while ($key = mysqli_fetch_assoc($query_result)) {
$keys[] = $key; // Add key to list of keys
}
// Compose comparable format for keys
$composed_keys = array();
foreach ($keys as $key) {
// Check if this key exists already
$key_pos = array_search($key['Key_name'],array_column($composed_keys,'Key_name'));
if ($key_pos == false) {
// New key
$composed_key = array();
$composed_key['Key_name'] = $key['Key_name'];
$composed_key['Index_type'] = $key['Index_type'];
$composed_key['columns'][] = $key['Column_name'];
$composed_keys[] = $composed_key;
} else {
// Given key, add column
$composed_keys[$key_pos]['columns'][] .= $key['Column_name'];
}
}
unset($key);
$table['keys'] = $composed_keys;
unset($composed_keys);
}
unset($table);
$result = array();
$result['host'] = $host;
$result['database'] = $schema;
$result['user'] = $user;
$result['tables'] = $tables;
return($result);
}
function mustal_save_tables_to_json(array $db_def, string $path, string $tables_file_name, bool $force) : int {
// Prepare db_def file
if (!is_dir($path)) {
mkdir($path);
}
if (!$force && file_exists($path."/".$tables_file_name)) {
return(2);
}
$tables_file = fopen($path."/".$tables_file_name, "w");
if (empty($tables_file)) {
return(2);
}
fwrite($tables_file, json_encode($db_def,JSON_PRETTY_PRINT));
fclose($tables_file);
return(0);
}
// Load all db_def from JSON file
function mustal_load_tables_from_json(string $path, string $tables_file_name) : array {
$db_def = array();
$contents = file_get_contents($path."/".$tables_file_name);
if (!$contents) {
return(array());
}
$db_def = json_decode($contents, true);
if (!$db_def) {
return(array());
}
return($db_def);
}
// Compare two definitions
// Report based on the first array
// Return Array
// $column_collation_aliases may contain synonyms for collations e.g. utf8mb3_general_ci vs utf8_general_ci
function mustal_compare_table_array(array $nominal, string $nominal_name, array $actual, string $actual_name, bool $check_column_definitions, array $column_collation_aliases = array()) : array {
$compare_differences = array();
if (count($nominal['tables']) != count($actual['tables'])) {
$compare_difference = array();
$compare_difference['type'] = "Table count";
$compare_difference[$nominal_name] = count($nominal['tables']);
$compare_difference[$actual_name] = count($actual['tables']);
$compare_differences[] = $compare_difference;
}
foreach ($nominal['tables'] as $database_table) {
$found_table = array();
foreach ($actual['tables'] as $compare_table) {
if ($database_table['name'] == $compare_table['name']) {
$found_table = $compare_table;
break;
}
}
unset($compare_table);
if ($found_table) {
// Check type table vs view
if ($database_table['type'] != $found_table['type']) {
$compare_difference = array();
$compare_difference['type'] = "Table type";
$compare_difference['table'] = $database_table['name'];
$compare_difference[$nominal_name] = $database_table['type'];
$compare_difference[$actual_name] = $found_table['type'];
$compare_differences[] = $compare_difference;
}
// Only BASE TABLE supported now
if ($found_table['type'] != 'BASE TABLE') {
continue;
}
// Check columns
$compare_table_columns = array_column($found_table['columns'],'Field');
foreach ($database_table['columns'] as $column) {
$column_name_to_find = $column['Field'];
$column_key = array_search($column_name_to_find,$compare_table_columns,true);
if ($column_key !== false) {
// Compare the properties of the columns
if ($check_column_definitions) {
$found_column = $found_table['columns'][$column_key];
foreach ($column as $key => $value) {
// Apply aliases
if (!empty($column_collation_aliases)) {
foreach($column_collation_aliases as $column_collation_alias) {
if ($value == $column_collation_alias[0]) {
$value = $column_collation_alias[1];
}
if ($found_column[$key] == $column_collation_alias[0]) {
$found_column[$key] = $column_collation_alias[1];
}
}
}
if ($found_column[$key] != $value) {
if ($key != 'Key') { // Keys will be handled separately
$compare_difference = array();
$compare_difference['type'] = "Column definition";
$compare_difference['table'] = $database_table['name'];
$compare_difference['column'] = $column['Field'];
$compare_difference['property'] = $key;
$compare_difference[$nominal_name] = $value;
$compare_difference[$actual_name] = $found_column[$key];
$compare_differences[] = $compare_difference;
}
}
}
unset($value);
} // $check_column_definitions
} else {
$compare_difference = array();
$compare_difference['type'] = "Column existence";
$compare_difference['table'] = $database_table['name'];
$compare_difference[$nominal_name] = $column['Field'];
$compare_differences[] = $compare_difference;
}
}
unset($column);
// Check keys
$compare_table_sql_indexs = array_column($found_table['keys'],'Key_name');
foreach ($database_table['keys'] as $sql_index) {
$sql_index_name_to_find = $sql_index['Key_name'];
$sql_index_key = array_search($sql_index_name_to_find,$compare_table_sql_indexs,true);
if ($sql_index_key !== false) {
// Compare the properties of the sql_indexs
if ($check_column_definitions) {
$found_sql_index = $found_table['keys'][$sql_index_key];
foreach ($sql_index as $key => $value) {
if ($found_sql_index[$key] != $value) {
// if ($key != 'permissions') {
$compare_difference = array();
$compare_difference['type'] = "Key definition";
$compare_difference['table'] = $database_table['name'];
$compare_difference['key'] = $sql_index['Key_name'];
$compare_difference['property'] = $key;
$compare_difference[$nominal_name] = implode(',',$value);
$compare_difference[$actual_name] = implode(',',$found_sql_index[$key]);
$compare_differences[] = $compare_difference;
// }
}
}
unset($value);
} // $check_sql_index_definitions
} else {
$compare_difference = array();
$compare_difference['type'] = "Key existence";
$compare_difference['table'] = $database_table['name'];
$compare_difference[$nominal_name] = $sql_index['Key_name'];
$compare_differences[] = $compare_difference;
}
}
unset($sql_index);
} else {
$compare_difference = array();
$compare_difference['type'] = "Table existence";
$compare_difference[$nominal_name] = $database_table['name'];
$compare_differences[] = $compare_difference;
}
}
unset($database_table);
return($compare_differences);
}
// Generate SQL to create or modify column
function mustal_column_sql_definition(string $table_name, array $column, array $reserved_words_without_quote) : string {
foreach($column as $key => &$value) {
$value = (string) $value;
$value = mustal_column_sql_create_property_definition($key,$value,$reserved_words_without_quote);
}
// Default handling here
if ($column['Default'] == " DEFAULT ''") {
$column['Default'] = "";
}
$sql =
$column['Type'].
$column['Null'].
$column['Default'].
$column['Extra'].
$column['Collation'];
return($sql);
}
// Generate SQL to modify a single column property
function mustal_column_sql_create_property_definition(string $property, string $property_value, array $reserved_words_without_quote) : string {
switch ($property) {
case 'Type':
break;
case 'Null':
if ($property_value == "NO") {
$property_value = " NOT NULL"; // Idiotic...
}
if ($property_value == "YES") {
$property_value = " NULL"; // Also Idiotic...
}
break;
case 'Default':
// Check for MYSQL function mustal_call as default
if (in_array(strtolower($property_value),$reserved_words_without_quote)) {
$quote = "";
} else {
// Remove quotes if there are
$property_value = trim($property_value,"'");
$quote = "'";
}
$property_value = " DEFAULT $quote".$property_value."$quote";
break;
case 'Extra':
if ($property_value != '') {
$property_value = " ".$property_value;
}
break;
case 'Collation':
if ($property_value != '') {
$property_value = " COLLATE ".$property_value;
}
break;
default:
$property_value = "";
break;
}
return($property_value);
}
// Replaces different variants of the same function mustal_to allow comparison
function mustal_sql_replace_reserved_functions(array &$column, array $replacers) {
$result = strtolower($column['Default']);
foreach ($replacers as $replace) {
if ($result == $replace[0]) {
$result = $replace[1];
}
}
$column['Default'] = $result;
$result = strtolower($column['Extra']);
foreach ($replacers as $replace) {
if ($result == $replace[0]) {
$result = $replace[1];
}
}
$column['Extra'] = $result;
}
// Is it a text type? -> Use quotes then
function mustal_mysql_put_text_type_in_quotes(string $checktype, string $value) : string {
$types = array('char','varchar','tinytext','text','mediumtext','longtext');
foreach($types as $type) {
if (stripos($checktype, $type) !== false) {
return("'".$value."'");
}
}
return($value);
}
function mustal_implode_with_quote(string $quote, string $delimiter, array $array_to_implode) : string {
return($quote.implode($quote.$delimiter.$quote, $array_to_implode).$quote);
}
// Calculate the sql neccessary to update the database
// returns array(code,text)
// Error codes:
// 0 ok
// 1 Upgrade type of table not supported
// 2 Error on table upgrade
// 3 Error on column existence upgrade
// 4 Error on column existence upgrade
// 5 Error on column definition upgrade
// 6 Error on column definition upgrade
// 7 Error on key existence upgrade
// 8 Error on key existence upgrade
// 9 Error on key definition upgrade
// 10 Error on key definition upgrade
// 11 Table type upgrade not supported
// 12 Upgrade type not supported
function mustal_calculate_db_upgrade(array $compare_def, array $db_def, array &$upgrade_sql, array $replacers) : array {
$result = array();
$upgrade_sql = array();
$compare_differences = mustal_compare_table_array($compare_def,"in JSON",$db_def,"in DB",true);
if (count($compare_differences) > 0) {
$upgrade_sql[] = ("SET SQL_MODE='ALLOW_INVALID_DATES';");
$upgrade_sql[] = ("SET SESSION innodb_strict_mode=OFF;");
}
foreach ($compare_differences as $compare_difference) {
switch ($compare_difference['type']) {
case 'Table existence':
// Get table definition from JSON
$table_name = $compare_difference['in JSON'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
switch ($table['type']) {
case 'BASE TABLE':
// Create table in DB
$sql = "";
$sql = "CREATE TABLE `".$table['name']."` (";
$comma = "";
foreach ($table['columns'] as $column) {
$sql .= $comma."`".$column['Field']."` ".mustal_column_sql_definition($table_name, $column,array_column($replacers,1));
$comma = ", ";
}
// Add keys
$comma = ", ";
foreach ($table['keys'] as $key) {
if ($key['Key_name'] == 'PRIMARY') {
$keystring = "PRIMARY KEY ";
} else {
if(array_key_exists('Index_type', $key)) {
$index_type = $key['Index_type'];
} else {
$index_type = "";
}
$keystring = $index_type." KEY `".$key['Key_name']."` ";
}
$sql .= $comma.$keystring."(`".implode("`,`",$key['columns'])."`) ";
}
$sql .= ")";
$upgrade_sql[] = $sql;
break;
default:
$result[] = array(1,"Upgrade type '".$table['type']."' on table '".$table['name']."' not supported.");
break;
}
} else {
$result[] = array(2,"Error table_key while creating upgrade for table existence `$table_name`.");
}
break;
case 'Column existence':
$table_name = $compare_difference['table'];
$column_name = $compare_difference['in JSON'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
$columns = $table['columns'];
$column_key = array_search($column_name,array_column($columns,'Field'));
if ($column_key !== false) {
$column = $table['columns'][$column_key];
$sql = "ALTER TABLE `$table_name` ADD COLUMN `".$column_name."` ";
$sql .= mustal_column_sql_definition($table_name, $column, array_column($replacers,1));
$sql .= ";";
$upgrade_sql[] = $sql;
}
else {
$result[] = array(3,"Error column_key while creating column '$column_name' in table '".$table['name']."'.");
}
}
else {
$result[] = array(4,"Error table_key while creating upgrade for column existence '$column_name' in table '$table_name'.");
}
// Add Column in DB
break;
case 'Column definition':
$table_name = $compare_difference['table'];
$column_name = $compare_difference['column'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
$columns = $table['columns'];
$column_names = array_column($columns,'Field');
$column_key = array_search($column_name,$column_names);
if ($column_key !== false) {
$column = $table['columns'][$column_key];
$sql = "ALTER TABLE `$table_name` MODIFY COLUMN `".$column_name."` ";
$sql .= mustal_column_sql_definition($table_name, $column,array_column($replacers,1));
$sql .= ";";
$upgrade_sql[] = $sql;
}
else {
$result[] = array(5,"Error column_key while modifying column '$column_name' in table '".$table['name']."'.");
}
}
else {
$result[] = array(6,"Error table_key while modifying column '$column_name' in table '$table_name'.");
return(6);
}
// Modify Column in DB
break;
case 'Key existence':
$table_name = $compare_difference['table'];
$key_name = $compare_difference['in JSON'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
$keys = $table['keys'];
$key_names = array_column($keys,'Key_name');
$key_key = array_search($key_name,$key_names);
if ($key_key !== false) {
$key = $table['keys'][$key_key];
$sql = "ALTER TABLE `$table_name` ADD KEY `".$key_name."` ";
$sql .= "(`".implode("`,`",$key['columns'])."`)";
$sql .= ";";
$upgrade_sql[] = $sql;
}
else {
$result[] = array(7,"Error key_key while adding key '$key_name' in table '".$table['name']."'.");
}
}
else {
$result[] = array(8,"Error table_key while adding key '$key_name' in table '$table_name'.");
}
break;
case "Key definition":
$table_name = $compare_difference['table'];
$key_name = $compare_difference['key'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
$keys = $table['keys'];
$key_names = array_column($keys,'Key_name');
$key_key = array_search($key_name,$key_names);
if ($key_key !== false) {
$key = $table['keys'][$key_key];
$sql = "ALTER TABLE `$table_name` DROP KEY `".$key_name."`;";
$upgrade_sql[] = $sql;
$sql = "ALTER TABLE `$table_name` ADD KEY `".$key_name."` ";
$sql .= "(`".implode("`,`",$key['columns'])."`)";
$sql .= ";";
$upgrade_sql[] = $sql;
}
else {
$result[] = array(9, "Error key_key while changing key '$key_name' in table '".$table['name']."'.");
}
}
else {
$result[] = array(10,"Error table_key while changing key '$key_name' in table '$table_name'.");
}
break;
case 'Table count':
// Nothing to do
break;
case 'Table type':
$result[] = array(11,"Upgrade type '".$compare_difference['type']."' on table '".$compare_difference['table']."' not supported.");
break;
default:
$result[] = array(12,"Upgrade type '".$compare_difference['type']."' not supported.");
break;
}
}
$upgrade_sql = array_unique($upgrade_sql);
return($result);
}
+73 -34
View File
@@ -13,7 +13,7 @@
* PLACEHOLDER_EDIT
* PLACEHOLDER_DELETE
* PLACEHOLDER_SQL_LIST
* PLACEHOLDER_SQL_LIST
* PLACEHOLDER_DROPNBOX
* PLACEHOLDER_GET_INPUT
* PLACEHOLDER_SET_INPUT
* PLACEHOLDER_COLUMNS
@@ -21,9 +21,11 @@
*/
$host = 'localhost';
$user = 'openxedev';
$passwd = 'openxedev';
$schema = 'openxedev';
$user = 'openxe';
$passwd = 'openxe';
$schema = 'openxe';
echo("\n");
if ($argc >= 2) {
@@ -39,12 +41,34 @@ if ($argc >= 2) {
$force = false;
}
if (!str_starts_with($argv[1],'-')) {
$module_name = $argv[1];
if (strpos($argv[1],'-') == 0) {
$module_name = $argv[1];
} else {
info();
exit;
}
// column selection
$selected_columns = array();
// Set selected_columns here or per parameter -c col1,col2,col3
// $selected_columns = array('belegnr','adresse','projekt');
if (in_array('-c', $argv)) {
$pos = array_keys($argv, '-c')[0];
$pos++;
if (isset($argv[$pos])) {
$selected_columns = explode(',',$argv[$pos]);
}
}
if (empty($selected_columns)) {
echo("Selected all columns.\n");
} else {
echo("Selected ".count($selected_columns)." columns,\n");
}
$module_class_name = ucfirst($module_name);
$php_file_name = $module_name . ".php";
$php_template_file_name = "module_creator_php_template.txt";
@@ -89,40 +113,52 @@ if ($argc >= 2) {
/* Iterate through the result set */
echo "FIELD\t\t\t\tType\t\tNull\tKey\tDefault\tExtra\n";
while ($row = mysqli_fetch_assoc($result)) {
foreach ($row as $key => $value) {
echo($value);
switch ($key) {
case 'Field':
$colwidth = 32;
$column_processed = false;
if ($value != 'id') {
$columns[] = $value;
$sql_columns[] = $table_short_name.".".$value;
}
if (empty($selected_columns) || in_array($row['Field'],$selected_columns) || $row['Field'] == 'id') {
break;
case 'Type':
$colwidth = 16;
break;
default:
$colwidth = 8;
break;
foreach ($row as $key => $value) {
echo($value);
switch ($key) {
case 'Field':
$colwidth = 32;
if ($value != 'id') {
$column_processed = true;
$columns[] = $value;
$sql_columns[] = $table_short_name.".".$value;
}
break;
case 'Type':
$colwidth = 16;
break;
default:
$colwidth = 8;
break;
}
for ($filler = strlen($value); $filler < $colwidth; $filler++) {
echo(" ");
}
}
for ($filler = strlen($value); $filler < $colwidth; $filler++) {
echo(" ");
}
// Build edit form
// <tr><td>{|Bezeichnung|}:*</td><td><input type="text" id="bezeichnung" name="bezeichnung" value="[BEZEICHNUNG]" size="40"></td></tr>
if ($row['Field'] != 'id') {
$edit_form = $edit_form . '<tr><td>{|' . ucfirst($row['Field']) . '|}:</td><td><input type="text" name="' . $row['Field'].'" id="'.$row['Field'].'" value="[' . strtoupper($row['Field']) . ']" size="20"></td></tr>' . "\n";
}
echo("\n");
}
}
// Build edit form
// <tr><td>{|Bezeichnung|}:*</td><td><input type="text" id="bezeichnung" name="bezeichnung" value="[BEZEICHNUNG]" size="40"></td></tr>
if ($row['Field'] != 'id') {
$edit_form = $edit_form . '<tr><td>{|' . ucfirst($row['Field']) . '|}:</td><td><input type="text" name="' . $row['Field'] . '" value="[' . strtoupper($row['Field']) . ']" size="40"></td></tr>' . "\n";
}
echo("\n");
if (empty($columns)) {
echo("No matching columns found!\n");
exit();
}
// Create php file
@@ -152,7 +188,8 @@ if ($argc >= 2) {
$php_file_contents = str_replace('PLACEHOLDER_LIST', $module_name . "_list", $php_file_contents);
$php_file_contents = str_replace('PLACEHOLDER_EDIT', $module_name . "_edit", $php_file_contents);
$php_file_contents = str_replace('PLACEHOLDER_DELETE', $module_name . "_delete", $php_file_contents);
$php_file_contents = str_replace('PLACEHOLDER_SQL_LIST', "SELECT SQL_CALC_FOUND_ROWS $table_short_name.id, $sql_list_of_columns, $table_short_name.id FROM $module_name $table_short_name", $php_file_contents);
$php_file_contents = str_replace('PLACEHOLDER_DROPNBOX',"'<img src=./themes/new/images/details_open.png class=details>' AS `open`, CONCAT('<input type=\\\"checkbox\\\" name=\\\"auswahl[]\\\" value=\\\"',".$table_short_name.".id,'\\\" />') AS `auswahl`", $php_file_contents);
$php_file_contents = str_replace('PLACEHOLDER_SQL_LIST', "SELECT SQL_CALC_FOUND_ROWS $table_short_name.id, \$dropnbox, $sql_list_of_columns, $table_short_name.id FROM $module_name $table_short_name", $php_file_contents);
$php_file_contents = str_replace('PLACEHOLDER_SQL_EDIT', "INSERT INTO $module_name ($list_of_columns, id) values ('\".implode('\', \'',\$input).\"', \$id) ON DUPLICATE KEY UPDATE SET ", $php_file_contents);
$php_file_contents = str_replace('PLACEHOLDER_GET_INPUT', $get_input, $php_file_contents);
$php_file_contents = str_replace('PLACEHOLDER_SET_INPUT', $set_input, $php_file_contents);
@@ -221,6 +258,8 @@ function info() {
echo("arg1: SQL table name\n");
echo("Options\n");
echo("\t-v: verbose output\n");
echo("\t-f: force override of existing files\n");
echo("\t-c: select columns like this: -c col1,col2,col3,col3\n");
echo("\n");
}
@@ -30,8 +30,11 @@ class PLACEHOLDER_MODULECLASSNAME {
switch ($name) {
case "PLACEHOLDER_LIST":
$allowed['PLACEHOLDER_LIST'] = array('list');
$heading = array(PLACEHOLDER_COLUMNS, 'Men&uuml;');
$width = array('10%'); // Fill out manually later
$heading = array('','',PLACEHOLDER_COLUMNS, 'Men&uuml;');
$width = array('1%','1%','10%'); // Fill out manually later
// columns that are aligned right (numbers etc)
// $alignright = array(4,5,6,7,8);
$findcols = array(PLACEHOLDER_SQL_COLUMNS);
$searchsql = array(PLACEHOLDER_SQL_COLUMNS);
@@ -39,6 +42,8 @@ class PLACEHOLDER_MODULECLASSNAME {
$defaultorder = 1;
$defaultorderdesc = 0;
$dropnbox = "PLACEHOLDER_DROPNBOX";
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" . "<a href=\"index.php?module=PLACEHOLDER_MODULENAME&action=edit&id=%value%\"><img src=\"./themes/{$app->Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"></a>&nbsp;<a href=\"#\" onclick=DeleteDialog(\"index.php?module=PLACEHOLDER_MODULENAME&action=delete&id=%value%\");>" . "<img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\"></a>" . "</td></tr></table>";
$sql = "PLACEHOLDER_SQL_LIST";
@@ -86,6 +91,12 @@ class PLACEHOLDER_MODULECLASSNAME {
function PLACEHOLDER_EDIT() {
$id = $this->app->Secure->GetGET('id');
// Check if other users are editing this id
if($this->app->erp->DisableModul('artikel',$id))
{
return;
}
$this->app->Tpl->Set('ID', $id);
@@ -141,6 +152,7 @@ class PLACEHOLDER_MODULECLASSNAME {
// Load values again from database
$dropnbox = "PLACEHOLDER_DROPNBOX";
$result = $this->app->DB->SelectArr("PLACEHOLDER_SQL_LIST"." WHERE id=$id");
foreach ($result[0] as $key => $value) {
-2
View File
@@ -1,2 +0,0 @@
<?php
header('Location: ./www/update.php?rand=' . sha1(mt_rand()));
-3
View File
@@ -1,3 +0,0 @@
<?php
include("upgradesystemclient2.php");
include("upgradedbonly.php");
+19
View File
@@ -0,0 +1,19 @@
OpenXE upgrade system
NOTE:
The upgrade system is for use in LINUX only and needs to have git installed.
The following steps are executed:
1. get files from git
2. run database upgrade
Files in this directory:
UPGRADE.md -> This file
upgrade.sh -> The upgrade starter, execute with "./upgrade.sh". Execute without parameters to view possible options.
Files in the data subdirectory:
upgrade.php -> The upgrade program
db_schema.json -> Contains the nominal database structure
exported_db_schema.json -> Contains the exported database structure (optional)
remote.json -> Contains the git remote & branch which should be used for upgrade
upgrade.log -> Contains the output from the last run that was started from within OpenXE
File diff suppressed because it is too large Load Diff
+4
View File
@@ -0,0 +1,4 @@
{
"host": "https://github.com/openxe-org/openxe.git",
"branch": "master"
}
+482
View File
@@ -0,0 +1,482 @@
<?php
/*
* Upgrader using git for file upgrade and mustal to update the database definition
*
* Copyright (c) 2022 OpenXE project
*
*/
$upgrade_echo_out_file_name = "";
function upgrade_set_out_file_name(string $filename) {
GLOBAL $upgrade_echo_out_file_name;
$upgrade_echo_out_file_name = $filename;
}
function echo_out(string $text) {
GLOBAL $upgrade_echo_out_file_name;
if ($upgrade_echo_out_file_name == "") {
echo($text);
} else {
file_put_contents($upgrade_echo_out_file_name,$text, FILE_APPEND);
}
}
function echo_output(array $output) {
echo_out(implode("\n",$output)."\n");
}
function abort(string $message) {
echo_out($message."\n");
echo_out("--------------- Aborted! ---------------\n");
echo_out("--------------- ".date("Y-m-d H:i:s")." ---------------\n");
}
function git(string $command, &$output, bool $show_command, bool $show_output, string $error_text) : int {
$output = array();
if ($show_command) {
echo_out("git ".$command."\n");
}
exec("git ".$command,$output,$retval);
if (!empty($output)) {
if ($show_output || $retval != 0) {
echo_output($output);
}
}
if ($retval != 0) {
echo_out($error_text."\n");
}
return($retval);
}
// -------------------------------- START
// Check for correct call method
if (php_sapi_name() == "cli") {
$directory = getcwd();
if (basename($directory) != 'upgrade') {
abort("Must be executed from 'upgrade' directory.");
return(-1);
}
$check_git = false;
$do_git = false;
$check_db = false;
$do_db = false;
$do = false;
if ($argc > 1) {
if (in_array('-v', $argv)) {
$verbose = true;
} else {
$verbose = false;
}
if (in_array('-e', $argv)) {
$export_db = true;
} else {
$export_db = false;
}
if (in_array('-f', $argv)) {
$force = true;
} else {
$force = false;
}
if (in_array('-o', $argv)) {
$origin = true;
} else {
$origin = false;
}
if (in_array('-connection', $argv)) {
$connection = true;
} else {
$connection = false;
}
if (in_array('-s', $argv)) {
$check_git = true;
} else {
}
if (in_array('-db', $argv)) {
$check_db = true;
} else {
}
if (in_array('-do', $argv)) {
if (!$check_git && !$check_db) {
$do_git = true;
$do_db = true;
}
if ($check_git) {
$do_git = true;
}
if ($check_db) {
$do_db = true;
}
}
if ($check_git || $check_db || $do_git || $do_db) {
upgrade_main($directory,$verbose,$check_git,$do_git,$export_db,$check_db,$do_db,$force,$connection,$origin);
} else {
info();
}
} else {
info();
}
}
// -------------------------------- END
function upgrade_main(string $directory,bool $verbose, bool $check_git, bool $do_git, bool $export_db, bool $check_db, bool $do_db, bool $force, bool $connection, bool $origin) {
$mainfolder = dirname($directory);
$datafolder = $directory."/data";
$lockfile_name = $datafolder."/.in_progress.flag";
$remote_file_name = $datafolder."/remote.json";
$schema_file_name = "db_schema.json";
echo_out("--------------- OpenXE upgrade ---------------\n");
echo_out("--------------- ".date("Y-m-d H:i:s")." ---------------\n");
//require_once($directory.'/../cronjobs/githash.php');
if ($origin) {
$remote_info = array('host' => 'origin','branch' => 'master');
} else {
$remote_info_contents = file_get_contents($remote_file_name);
if (!$remote_info_contents) {
abort("Unable to load $remote_file_name");
return(-1);
}
$remote_info = json_decode($remote_info_contents, true);
}
if ($check_git || $do_git) {
$retval = git("log HEAD --", $output,$verbose,false,"");
// Not a git repository -> Create it and then go ahead
if ($retval == 128) {
if (!$do_git) {
abort("Git not initialized, use -do to initialize.");
return(-1);
}
echo_out("Setting up git...");
$retval = git("init $mainfolder", $output,$verbose,$verbose,"Error while initializing git!");
if ($retval != 0) {
abort("");
return(-1);
}
$retval = git("add $mainfolder", $output,$verbose,$verbose,"Error while initializing git!");
if ($retval != 0) {
abort("");
return(-1);
}
$retval = git("fetch ".$remote_info['host']." ".$remote_info['branch'],$output,$verbose,$verbose,"Error while initializing git!");
if ($retval != 0) {
abort("");
return(-1);
}
$retval = git("checkout FETCH_HEAD -f --", $output,$verbose,$verbose,"Error while initializing git!");
if ($retval != 0) {
abort("");
return(-1);
}
} else if ($retval != 0) {
abort("Error while executing git!");
return(-1);
}
// Get changed files on system -> Should be empty
$modified_files = false;
$output = array();
$retval = git("ls-files -m $mainfolder", $output,$verbose,false,"Error while checking Git status.");
if (!empty($output)) {
$modified_files = true;
echo_out("There are modified files:\n");
echo_output($output);
}
if ($verbose) {
echo_out("--------------- Upgrade history ---------------\n");
$retval = git("log --date=short-local --pretty=\"%cd (%h): %s\" HEAD --not HEAD~5 --",$output,$verbose,$verbose,"Error while showing history!");
if ($retval != 0) {
abort("");
return(-1);
}
} else {
echo_out("--------------- Current version ---------------\n");
$retval = git("log -1 --date=short-local --pretty=\"%cd (%h): %s\" HEAD --",$output,$verbose,true,"Error while showing history!");
if ($retval != 0) {
return(-1);
}
}
if ($do_git) {
if ($modified_files && !$force) {
abort("Clear modified files or use -f");
return(-1);
}
echo_out("--------------- Pulling files... ---------------\n");
if ($force) {
$retval = git("reset --hard",$output,$verbose,$verbose,"Error while resetting modified files!");
if ($retval != 0) {
abort("");
return(-1);
}
}
$retval = git("pull ".$remote_info['host']." ".$remote_info['branch'],$output,$verbose,$verbose,"Error while pulling files!");
if ($retval != 0) {
abort("");
return(-1);
}
$retval = git("reset --hard",$output,$verbose,$verbose,"Error while applying files!");
if ($retval != 0) {
abort("");
return(-1);
}
echo_out("--------------- Files upgrade completed ---------------\n");
$retval = git("log -1 ",$output,$verbose,$verbose,"Error while checking files!");
if ($retval != 0) {
abort("");
return(-1);
}
echo_output($output);
} // $do_git
else { // Dry run
echo_out("--------------- Dry run, use -do to upgrade ---------------\n");
echo_out("--------------- Fetching files... ---------------\n");
$retval = git("fetch ".$remote_info['host']." ".$remote_info['branch'],$output,$verbose,$verbose,"Error while fetching files!");
if ($retval != 0) {
abort("");
}
echo_out("--------------- Pending upgrades: ---------------\n");
$retval = git("log --date=short-local --pretty=\"%cd (%h): %s\" FETCH_HEAD --not HEAD",$output,$verbose,true,"Error while fetching files!");
if (empty($output)) {
echo_out("No upgrades pending.\n");
}
if ($retval != 0) {
abort("");
}
} // Dry run
} // $check_git
if ($check_db || $do_db || $export_db) {
if ($connection) {
$connection_file_name = $directory."/data/connection.json";
$connection_file_contents = file_get_contents($connection_file_name);
if (!$connection_file_contents) {
abort("Unable to load $connection_file_name");
return(-1);
}
$connection_info = json_decode($connection_file_contents, true);
$host = $connection_info['host'];
$user = $connection_info['user'];
$passwd = $connection_info['passwd'];
$schema = $connection_info['schema'];
} else {
class DatabaseConnectionInfo {
function __construct($dir) {
require($dir."/../conf/user.inc.php");
}
}
$dbci = new DatabaseConnectionInfo($directory);
$host = $dbci->WFdbhost;
$user = $dbci->WFdbuser;
$passwd = $dbci->WFdbpass;
$schema = $dbci->WFdbname;
}
require_once($directory.'/../vendor/mustal/mustal_mysql_upgrade_tool.php');
echo_out("--------------- Loading from database '$schema@$host'... ---------------\n");
$db_def = mustal_load_tables_from_db($host, $schema, $user, $passwd, $mustal_replacers);
if (empty($db_def)) {
echo_out("Could not load from $schema@$host\n");
exit;
}
if ($export_db) {
$export_file_name = "exported_db_schema.json";
if (mustal_save_tables_to_json($db_def, $datafolder, $export_file_name, true) == 0) {
echo_out("Database exported to $datafolder/$export_file_name\n");
}
else {
echo_out("Could not export database to $datafolder/$export_file_name\n");
}
}
$compare_differences = array();
echo_out("--------------- Loading from JSON... ---------------\n");
$compare_def = mustal_load_tables_from_json($datafolder, $schema_file_name);
if (empty($compare_def)) {
abort("Could not load from JSON $schema_file_name\n");
return(-1);
}
echo_out("Table count database ".count($db_def['tables'])." vs. JSON ".count($compare_def['tables'])."\n");
echo_out("--------------- Comparing JSON '".$compare_def['database']."@".$compare_def['host']."' vs. database '$schema@$host' ---------------\n");
$compare_differences = mustal_compare_table_array($db_def,"in DB",$compare_def,"in JSON",false,true);
if ($verbose) {
foreach ($compare_differences as $compare_difference) {
$comma = "";
foreach ($compare_difference as $key => $value) {
echo_out($comma."$key => [$value]");
$comma = ", ";
}
echo_out("\n");
}
}
echo_out((empty($compare_differences)?0:count($compare_differences))." differences.\n");
echo_out("--------------- Comparing database '$schema@$host' vs. JSON '".$compare_def['database']."@".$compare_def['host']."' ---------------\n");
$compare_differences = mustal_compare_table_array($compare_def,"in JSON",$db_def,"in DB",true,true);
if ($verbose) {
foreach ($compare_differences as $compare_difference) {
$comma = "";
foreach ($compare_difference as $key => $value) {
echo_out($comma."$key => [$value]");
$comma = ", ";
}
echo_out("\n");
}
}
echo_out((empty($compare_differences)?0:count($compare_differences))." differences.\n");
echo_out("--------------- Calculating database upgrade for '$schema@$host'... ---------------\n");
$upgrade_sql = array();
$result = mustal_calculate_db_upgrade($compare_def, $db_def, $upgrade_sql, $mustal_replacers);
if (!empty($result)) {
abort(count($result)." errors.\n");
if ($verbose) {
foreach($result as $error) {
echo_out("Code: ".$error[0]." '".$error[1]."'\n");
}
}
return(-1);
}
if ($verbose) {
foreach($upgrade_sql as $statement) {
echo_out($statement."\n");
}
}
echo_out(count($upgrade_sql)." upgrade statements\n");
if ($do_db) {
echo_out("--------------- Executing database upgrade for '$schema@$host' database... ---------------\n");
// First get the contents of the database table structure
$mysqli = mysqli_connect($host, $user, $passwd, $schema);
/* Check if the connection succeeded */
if (!$mysqli) {
echo ("Failed to connect!\n");
} else {
$counter = 0;
$error_counter = 0;
$number_of_statements = count($upgrade_sql);
foreach ($upgrade_sql as $sql) {
$counter++;
echo_out("\rUpgrade step $counter of $number_of_statements... ");
$query_result = mysqli_query($mysqli, $sql);
if (!$query_result) {
$error = " not ok: ". mysqli_error($mysqli);
echo_out($error);
echo_out("\n");
// file_put_contents("./errors.txt",date()." ".$error.$sql."\n",FILE_APPEND);
$error_counter++;
} else {
echo_out("ok.\r");
}
}
echo_out("\n");
echo_out("$error_counter errors.\n");
if ($error_counter > 0) {
// echo_out("See 'errors.txt'\n");
}
echo_out("--------------- Checking database upgrade for '$schema@$host'... ---------------\n");
$db_def = mustal_load_tables_from_db($host, $schema, $user, $passwd, $mustal_replacers);
echo_out("--------------- Comparing database '$schema@$host' vs. JSON '".$compare_def['database']."@".$compare_def['host']."' ---------------\n");
$compare_differences = mustal_compare_table_array($compare_def,"in JSON",$db_def,"in DB",true,true);
echo_out((empty($compare_differences)?0:count($compare_differences))." differences.\n");
}
} // $do_db
} // $check_db
/*
echo_out("--------------- Locking system ---------------\n");
if (file_exists($lockfile_name)) {
echo_out("System is already locked.\n");
} else {
file_put_contents($lockfile_name," ");
}
echo_out("--------------- Unlocking system ---------------\n");
unlink($lockfile_name);
*/
echo_out("--------------- Done! ---------------\n");
echo_out("--------------- ".date("Y-m-d H:i:s")." ---------------\n");
return(0);
}
function info() {
echo_out("OpenXE upgrade tool\n");
echo_out("Copyright 2022 (c) OpenXE project\n");
echo_out("\n");
echo_out("Upgrade files and database\n");
echo_out("Options:\n");
echo_out("\t-s: check/do system upgrades\n");
echo_out("\t-db: check/do database upgrades\n");
echo_out("\t-e: export database schema\n");
echo_out("\t-do: execute all upgrades\n");
echo_out("\t-v: verbose output\n");
echo_out("\t-f: force override of existing files\n");
echo_out("\t-o: update from origin instead of remote.json\n");
echo_out("\t-connection use connection.json in data folder instead of user.inc.php\n");
echo_out("\t-clean: (not yet implemented) create the needed SQL to remove items from the database not in the JSON\n");
echo_out("\n");
}
+2
View File
@@ -0,0 +1,2 @@
#!/bin/bash
sudo -u www-data php data/upgrade.php "$@"
-98
View File
@@ -1,98 +0,0 @@
<?php
//include("wawision.inc.php");
use Xentral\Core\Installer\Installer;
use Xentral\Core\Installer\InstallerCacheConfig;
use Xentral\Core\Installer\InstallerCacheWriter;
use Xentral\Core\Installer\ClassMapGenerator;
use Xentral\Core\Installer\Psr4ClassNameResolver;
use Xentral\Core\Installer\TableSchemaEnsurer;
use Xentral\Components\Database\DatabaseConfig;
// Nur einfache Fehler melden
error_reporting(E_ERROR | E_COMPILE_ERROR | E_CORE_ERROR | E_RECOVERABLE_ERROR | E_USER_ERROR | E_PARSE);
if(file_exists(__DIR__.'/xentral_autoloader.php')){
include_once (__DIR__.'/xentral_autoloader.php');
}
include_once("conf/main.conf.php");
include_once("phpwf/plugins/class.mysql.php");
include_once("www/lib/class.erpapi.php");
if(file_exists("www/lib/class.erpapi_custom.php")){
include_once("www/lib/class.erpapi_custom.php");
}
/*
class app_t
{
var $DB;
var $user;
var $Conf;
}
$app = new app_t();
*/
$config = new Config();
// Delete ServiceMap-CacheFile
$installConf = new InstallerCacheConfig($config->WFuserdata . '/tmp/' . $config->WFdbname);
$serviceCacheFile = $installConf->getServiceCacheFile();
@unlink($serviceCacheFile);
$app = new ApplicationCore();
$DEBUG = 0;
$app->Conf = $config;
$app->DB = new DB($app->Conf->WFdbhost,$app->Conf->WFdbname,$app->Conf->WFdbuser,$app->Conf->WFdbpass, $app, $app->Conf->WFdbport);
if(class_exists('erpAPICustom'))
{
$erp = new erpAPICustom($app);
}else{
$erp = new erpAPI($app);
}
echo "STARTE DB Upgrade\r\n";
$erp->UpgradeDatabase();
echo "ENDE DB Upgrade\r\n\r\n";
try {
echo "STARTE Installer\r\n";
$resolver = new Psr4ClassNameResolver();
$resolver->addNamespace('Xentral\\', __DIR__ . '/classes');
$resolver->excludeFile(__DIR__ . '/classes/bootstrap.php');
$generator = new ClassMapGenerator($resolver, __DIR__);
$installer = new Installer($generator, $resolver);
$writer = new InstallerCacheWriter($installConf, $installer);
$dbConfig = new DatabaseConfig(
$app->Conf->WFdbhost,
$app->Conf->WFdbuser,
$app->Conf->WFdbpass,
$app->Conf->WFdbname,
null,
$app->Conf->WFdbport
);
$tableSchemaCreator = new TableSchemaEnsurer(
$app->Container->get('SchemaCreator'),
$installConf,
$dbConfig
);
echo "SCHREIBE ServiceMap\r\n";
$writer->writeServiceCache();
echo "SCHREIBE JavascriptMap\r\n";
$writer->writeJavascriptCache();
echo "ERZEUGE Table Schemas\r\n";
$schemaCollection = $installer->getTableSchemas();
$tableSchemaCreator->ensureSchemas($schemaCollection);
echo "ENDE Installer\r\n";
//
} catch (Exception $e) {
echo "FEHLER " . $e->getMessage() . "\r\n";
}
-7
View File
@@ -1,7 +0,0 @@
<?php
$intern = true;
if(!empty($argv[1]) && strtolower($argv[1]) === 'changeversion'){
$allowChangeVersion = true;
}
include __DIR__.'/www/update.php';
-812
View File
@@ -1,812 +0,0 @@
<?php
//include("wawision.inc.php");
// Nur einfache Fehler melden
//error_reporting(E_ERROR | E_WARNING | E_PARSE);
error_reporting(E_ERROR | E_PARSE);
include_once("conf/main.conf.php");
include_once("phpwf/plugins/class.mysql.php");
include_once("www/lib/class.erpapi.php");
class app_t {
var $DB;
var $user;
var $Conf;
}
$app = new app_t();
$DEBUG = 0;
$app->Conf = new Config();
$app->DB = new DB($app->Conf->WFdbhost,$app->Conf->WFdbname,$app->Conf->WFdbuser,$app->Conf->WFdbpass,null,$app->Conf->WFdbport);
$erp = new erpAPI($app);
$WAWISION['host'] = $app->Conf->updateHost ?? 'removed.upgrade.host';
$WAWISION['port']="443";
$myUpd = new UpgradeClient($WAWISION);
echo "STARTE UPDATE\n";
echo "Im folgenden stehen die Dateien die geaendert wurden.\n
Erscheinen keine Dateien sind Sie auf der neusten Version.\n";
$myUpd->Connect();
//$myUpd->CheckCRT();
$myUpd->CheckUpdate();
$myUpd->CheckUpdateCustom();
$myUpd->CheckUpdateModules();
echo "ENDE UPDATE\n";
//echo "STARTE DB UPGRADE\n";
//$erp->UpgradeDatabase();
//echo "ENDE DB UPGRADE\n";
//include("version.php");
//echo "\r\nRevision: $version_revision\r\n";
//$myUpd->Request();
//echo
class UpgradeClient
{
var $localmd5sums;
function __construct($conf)
{
$this->conf = $conf;
}
function Connect()
{
// check connection then stop
}
function CheckCRT()
{
$cert = shell_exec("openssl s_client -connect {$this->conf['host']}:{$this->conf['port']} < /dev/null 2>/dev/null | openssl x509 -in /dev/stdin");
if($cert==$this->conf['cert']."\n") return 1;
else {
echo "wrong\n";
exit;
}
}
function CheckUpdate()
{
$parameter['version']=@$this->conf['version'];
$result = $this->Request("md5list",$parameter);
if($result=="ERROR") { echo "Updates: ERROR FROM SERVER (Perhaps a wrong license?)\n"; return;}
$rows = explode(";",$result);
if(count($rows)>0)
{
foreach($rows as $value)
{
unset($single_row);
$single_row = explode(":",$value);
if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3)
{
$file = $single_row[0];
$md5sum = $single_row[1];
$parameter['file']=$file;
$parameter['md5sum']=$md5sum;
if($file=="./upgradesystemclient.php")
{
}
else if(is_file($file))
{
// pruefe md5sum
if(md5_file($file)!=$md5sum)
{
// wenn update dann UPD_
echo "update <- $file\n";
$result = $this->Request("getfile",$parameter);
$output = (base64_decode($result));
//$output = preg_replace('/[^(\x22-\x7F)\x0A]*/','', $output);
file_put_contents($file."UPD", $output);
/*
$fp = fopen($file."UPD","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
// pruefsuemme neu berechnen wenn passt umbenennen und ins archiv
echo md5_file($file."UPD");
echo "-".$md5sum."\n";
if(md5_file($file."UPD")==$md5sum)
{
echo "update ok $file\n";
rename($file."UPD",$file);
}
}
} else if($file!="") {
echo "datei <- $file\n";
// pruefe ob es verzeichnis gibt
$verzeichnis = dirname($file);
if(!is_dir($verzeichnis))
{
echo "verzeichnis <- $verzeichnis\n";
mkdir($verzeichnis,0777,true);
}
$result = $this->Request("getfile",$parameter);
$output = base64_decode($result);
//$output = iconv("UTF-8","ISO-8859-1//IGNORE",$output);
//$output = iconv("ISO-8859-1","UTF-8",$output);
//$output = preg_replace('/[^(\x20-\x7F)\x0A]*/','', $output);
file_put_contents($file."NEW", $output);
/*$fp = fopen($file."NEW","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
if(md5_file($file."NEW")==$md5sum)
{
echo "datei ok $file\n";
rename($file."NEW",$file);
} else {
// echo "datei XX $file local: ".md5_file($file."NEW")." remote: ".$md5sum."\n";
}
} else { }
}
}
}
//pruefe, update, lege verzeichnis an, lege datei an, loesche datei????
// download all files with UPD_ prefix
// get md5 liste von server
// pruefe ob alle dateien passen, wenn ja dann alle updaten am schluss
// wenn nein fehler abbrechen und ganzen prozess nochmal starten
//echo $md5sums;
}
function CheckUpdateModules()
{
$parameter['version']=@$this->conf['version'];
$result = $this->Request("md5listmodules",$parameter);
if($result=="ERROR") { echo "Modules: ERROR FROM SERVER (Perhaps a wrong license?)\n"; return;}
$rows = explode(";",$result);
if(count($rows)>0)
{
foreach($rows as $value)
{
unset($single_row);
$single_row = explode(":",$value);
if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3)
{
$file = $single_row[0];
$md5sum = $single_row[1];
$parameter['file']=$file;
$parameter['md5sum']=$md5sum;
if($file=="./upgradesystemclient.php")
{
}
else if(is_file($file))
{
// pruefe md5sum
if(md5_file($file)!=$md5sum)
{
// wenn update dann UPD_
echo "update (M) <- $file\n";
$result = $this->Request("getfilemodules",$parameter);
$output = (base64_decode($result));
//$output = preg_replace('/[^(\x22-\x7F)\x0A]*/','', $output);
file_put_contents($file."UPD", $output);
/*
$fp = fopen($file."UPD","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
// pruefsuemme neu berechnen wenn passt umbenennen und ins archiv
echo md5_file($file."UPD");
echo "-".$md5sum."\n";
if(md5_file($file."UPD")==$md5sum)
{
echo "update (M) ok $file\n";
rename($file."UPD",$file);
}
}
} else if($file!="") {
echo "datei (M) <- $file\n";
// pruefe ob es verzeichnis gibt
$verzeichnis = dirname($file);
if(!is_dir($verzeichnis))
{
echo "verzeichnis (M) <- $verzeichnis\n";
mkdir($verzeichnis,0777,true);
}
$result = $this->Request("getfilemodules",$parameter);
$output = base64_decode($result);
//$output = iconv("UTF-8","ISO-8859-1//IGNORE",$output);
//$output = iconv("ISO-8859-1","UTF-8",$output);
//$output = preg_replace('/[^(\x20-\x7F)\x0A]*/','', $output);
file_put_contents($file."NEW", $output);
/*$fp = fopen($file."NEW","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
if(md5_file($file."NEW")==$md5sum)
{
echo "datei (M) ok $file\n";
rename($file."NEW",$file);
} else {
// echo "datei XX $file local: ".md5_file($file."NEW")." remote: ".$md5sum."\n";
}
} else { }
}
}
}
//pruefe, update, lege verzeichnis an, lege datei an, loesche datei????
// download all files with UPD_ prefix
// get md5 liste von server
// pruefe ob alle dateien passen, wenn ja dann alle updaten am schluss
// wenn nein fehler abbrechen und ganzen prozess nochmal starten
//echo $md5sums;
}
function CheckUpdateCustom()
{
$parameter['version']=@$this->conf['version'];
$result = $this->Request("md5listcustom",$parameter);
if($result=="ERROR") { echo "Custom: ERROR FROM SERVER (Perhaps a wrong license?)\n"; return;}
$rows = explode(";",$result);
if(count($rows)>0)
{
foreach($rows as $value)
{
unset($single_row);
$single_row = explode(":",$value);
if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3)
{
$file = $single_row[0];
$md5sum = $single_row[1];
$parameter['file']=$file;
$parameter['md5sum']=$md5sum;
if($file=="./upgradesystemclient.php")
{
}
else if(is_file($file))
{
// pruefe md5sum
if(md5_file($file)!=$md5sum)
{
// wenn update dann UPD_
echo "update (C) <- $file\n";
$result = $this->Request("getfilecustom",$parameter);
$output = (base64_decode($result));
//$output = preg_replace('/[^(\x22-\x7F)\x0A]*/','', $output);
file_put_contents($file."UPD", $output);
/*
$fp = fopen($file."UPD","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
// pruefsuemme neu berechnen wenn passt umbenennen und ins archiv
echo md5_file($file."UPD");
echo "-".$md5sum."\n";
if(md5_file($file."UPD")==$md5sum)
{
echo "update (C) ok $file\n";
rename($file."UPD",$file);
}
}
} else if($file!="") {
echo "datei (C) <- $file\n";
// pruefe ob es verzeichnis gibt
$verzeichnis = dirname($file);
if(!is_dir($verzeichnis))
{
echo "verzeichnis (C) <- $verzeichnis\n";
mkdir($verzeichnis,0777,true);
}
$result = $this->Request("getfilecustom",$parameter);
$output = base64_decode($result);
//$output = iconv("UTF-8","ISO-8859-1//IGNORE",$output);
//$output = iconv("ISO-8859-1","UTF-8",$output);
//$output = preg_replace('/[^(\x20-\x7F)\x0A]*/','', $output);
file_put_contents($file."NEW", $output);
/*$fp = fopen($file."NEW","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
if(md5_file($file."NEW")==$md5sum)
{
echo "datei (C) ok $file\n";
rename($file."NEW",$file);
} else {
// echo "datei XX $file local: ".md5_file($file."NEW")." remote: ".$md5sum."\n";
}
} else { }
}
}
}
//pruefe, update, lege verzeichnis an, lege datei an, loesche datei????
// download all files with UPD_ prefix
// get md5 liste von server
// pruefe ob alle dateien passen, wenn ja dann alle updaten am schluss
// wenn nein fehler abbrechen und ganzen prozess nochmal starten
//echo $md5sums;
}
function DownloadUpdate()
{
}
function CheckDownloadedUpdate()
{
}
function ExecuteUpdate()
{
}
function Request($command,$parameter)
{
global $erp;
$auth['serial']=trim($erp->Firmendaten("lizenz"));//$this->conf['serial'];
$auth['authkey']=trim($erp->Firmendaten("schluessel"));//$this->conf['authkey'];
$auth = base64_encode(json_encode($auth));
$parameter = base64_encode(json_encode($parameter));
$client = new HttpClient($this->conf['host'],$this->conf['port']);
$client->post('/upgradesystem.php', array( "authjson" => $auth, "parameterjson"=>$parameter,"command"=>"$command" ));
$pageContents = $client->getContent();
return $pageContents;
}
function dir_rekursiv($verzeichnis)
{
$handle = opendir($verzeichnis);
while ($datei = readdir($handle))
{
if ($datei != "." && $datei != "..")
{
if (is_dir($verzeichnis.$datei)) // Wenn Verzeichniseintrag ein Verzeichnis ist
{
// Erneuter Funktionsaufruf, um das aktuelle Verzeichnis auszulesen
$this->dir_rekursiv($verzeichnis.$datei.'/');
}
else
{
// Wenn Verzeichnis-Eintrag eine Datei ist, diese ausgeben
$this->localmd5sums[$verzeichnis.$datei] = md5_file($verzeichnis.$datei);
}
}
}
closedir($handle);
}
}
/* Version 0.9, 6th April 2003 - Simon Willison ( http://simon.incutio.com/ )
Manual: http://scripts.incutio.com/httpclient/
*/
class HttpClient {
// Request vars
var $host;
var $port;
var $path;
var $method;
var $postdata = '';
var $cookies = array();
var $referer;
var $accept = 'text/xml,application/xml,application/xhtml+xml,text/html,text/plain,image/png,image/jpeg,image/gif,*/*';
var $accept_encoding = 'gzip';
var $accept_language = 'en-us';
var $user_agent = 'Incutio HttpClient v0.9';
// Options
var $timeout = 20;
var $use_gzip = true;
var $persist_cookies = true; // If true, received cookies are placed in the $this->cookies array ready for the next request
// Note: This currently ignores the cookie path (and time) completely. Time is not important,
// but path could possibly lead to security problems.
var $persist_referers = true; // For each request, sends path of last request as referer
var $debug = false;
var $handle_redirects = true; // Auaomtically redirect if Location or URI header is found
var $max_redirects = 5;
var $headers_only = false; // If true, stops receiving once headers have been read.
// Basic authorization variables
var $username;
var $password;
// Response vars
var $status;
var $headers = array();
var $content = '';
var $errormsg;
// Tracker variables
var $redirect_count = 0;
var $cookie_host = '';
function __construct($host, $port=80) {
$this->host = $host;
$this->port = $port;
}
function get($path, $data = false) {
$this->path = $path;
$this->method = 'GET';
if ($data) {
$this->path .= '?'.$this->buildQueryString($data);
}
return $this->doRequest();
}
function post($path, $data) {
$this->path = $path;
$this->method = 'POST';
$this->postdata = $this->buildQueryString($data);
return $this->doRequest();
}
function buildQueryString($data) {
$querystring = '';
if (is_array($data)) {
// Change data in to postable data
foreach ($data as $key => $val) {
if (is_array($val)) {
foreach ($val as $val2) {
$querystring .= urlencode($key).'='.urlencode($val2).'&';
}
} else {
$querystring .= urlencode($key).'='.urlencode($val).'&';
}
}
$querystring = substr($querystring, 0, -1); // Eliminate unnecessary &
} else {
$querystring = $data;
}
return $querystring;
}
function doRequest() {
// Performs the actual HTTP request, returning true or false depending on outcome
if(!fsockopen("ssl://".$this->host, $this->port, $errno, $errstr, $this->timeout) && $this->port==443)
{
$this->port=80;
}
if($this->port==443)
$url = "ssl://".$this->host;
else
$url = $this->host;
if (!$fp = @fsockopen($url, $this->port, $errno, $errstr, $this->timeout)) {
// Set error message
switch($errno) {
case -3:
$this->errormsg = 'Socket creation failed (-3)';
case -4:
$this->errormsg = 'DNS lookup failure (-4)';
case -5:
$this->errormsg = 'Connection refused or timed out (-5)';
default:
$this->errormsg = 'Connection failed ('.$errno.')';
$this->errormsg .= ' '.$errstr;
$this->debug($this->errormsg);
}
return false;
}
stream_set_timeout($fp, $this->timeout);
$request = $this->buildRequest();
$this->debug('Request', $request);
fwrite($fp, $request);
// Reset all the variables that should not persist between requests
$this->headers = array();
$this->content = '';
$this->errormsg = '';
// Set a couple of flags
$inHeaders = true;
$atStart = true;
// Now start reading back the response
while (!feof($fp)) {
$line = fgets($fp, 4096);
if ($atStart) {
// Deal with first line of returned data
$atStart = false;
if (!preg_match('/HTTP\/(\\d\\.\\d)\\s*(\\d+)\\s*(.*)/', $line, $m)) {
$this->errormsg = "Status code line invalid: ".htmlentities($line);
$this->debug($this->errormsg);
//return false;
}
$http_version = $m[1]; // not used
$this->status = $m[2];
$status_string = $m[3]; // not used
$this->debug(trim($line));
continue;
}
if ($inHeaders) {
if (trim($line) == '') {
$inHeaders = false;
$this->debug('Received Headers', $this->headers);
if ($this->headers_only) {
break; // Skip the rest of the input
}
continue;
}
if (!preg_match('/([^:]+):\\s*(.*)/', $line, $m)) {
// Skip to the next header
continue;
}
$key = strtolower(trim($m[1]));
$val = trim($m[2]);
// Deal with the possibility of multiple headers of same name
if (isset($this->headers[$key])) {
if (is_array($this->headers[$key])) {
$this->headers[$key][] = $val;
} else {
$this->headers[$key] = array($this->headers[$key], $val);
}
} else {
$this->headers[$key] = $val;
}
continue;
}
// We're not in the headers, so append the line to the contents
$this->content .= $line;
}
fclose($fp);
// If data is compressed, uncompress it
if (isset($this->headers['content-encoding']) && $this->headers['content-encoding'] == 'gzip') {
$this->debug('Content is gzip encoded, unzipping it');
$this->content = substr($this->content, 10); // See http://www.php.net/manual/en/function.gzencode.php
$this->content = gzinflate($this->content);
}
// If $persist_cookies, deal with any cookies
if ($this->persist_cookies && isset($this->headers['set-cookie']) && $this->host == $this->cookie_host) {
$cookies = $this->headers['set-cookie'];
if (!is_array($cookies)) {
$cookies = array($cookies);
}
foreach ($cookies as $cookie) {
if (preg_match('/([^=]+)=([^;]+);/', $cookie, $m)) {
$this->cookies[$m[1]] = $m[2];
}
}
// Record domain of cookies for security reasons
$this->cookie_host = $this->host;
}
// If $persist_referers, set the referer ready for the next request
if ($this->persist_referers) {
$this->debug('Persisting referer: '.$this->getRequestURL());
$this->referer = $this->getRequestURL();
}
// Finally, if handle_redirects and a redirect is sent, do that
if ($this->handle_redirects) {
if (++$this->redirect_count >= $this->max_redirects) {
$this->errormsg = 'Number of redirects exceeded maximum ('.$this->max_redirects.')';
$this->debug($this->errormsg);
$this->redirect_count = 0;
return false;
}
$location = isset($this->headers['location']) ? $this->headers['location'] : '';
$uri = isset($this->headers['uri']) ? $this->headers['uri'] : '';
if ($location || $uri) {
$url = parse_url($location.$uri);
// This will FAIL if redirect is to a different site
return $this->get($url['path']);
}
}
return true;
}
function buildRequest() {
$headers = array();
$headers[] = "{$this->method} {$this->path} HTTP/1.0"; // Using 1.1 leads to all manner of problems, such as "chunked" encoding
$headers[] = "Host: {$this->host}";
$headers[] = "User-Agent: {$this->user_agent}";
$headers[] = "Accept: {$this->accept}";
if ($this->use_gzip) {
$headers[] = "Accept-encoding: {$this->accept_encoding}";
}
$headers[] = "Accept-language: {$this->accept_language}";
if ($this->referer) {
$headers[] = "Referer: {$this->referer}";
}
// Cookies
if ($this->cookies) {
$cookie = 'Cookie: ';
foreach ($this->cookies as $key => $value) {
$cookie .= "$key=$value; ";
}
$headers[] = $cookie;
}
// Basic authentication
if ($this->username && $this->password) {
$headers[] = 'Authorization: BASIC '.base64_encode($this->username.':'.$this->password);
}
// If this is a POST, set the content type and length
if ($this->postdata) {
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
$headers[] = 'Content-Length: '.strlen($this->postdata);
}
$request = implode("\r\n", $headers)."\r\n\r\n".$this->postdata;
return $request;
}
function getStatus() {
return $this->status;
}
function getContent() {
return $this->content;
}
function getHeaders() {
return $this->headers;
}
function getHeader($header) {
$header = strtolower($header);
if (isset($this->headers[$header])) {
return $this->headers[$header];
} else {
return false;
}
}
function getError() {
return $this->errormsg;
}
function getCookies() {
return $this->cookies;
}
function getRequestURL() {
$url = 'http://'.$this->host;
if ($this->port != 80) {
$url .= ':'.$this->port;
}
$url .= $this->path;
return $url;
}
// Setter methods
function setUserAgent($string) {
$this->user_agent = $string;
}
function setAuthorization($username, $password) {
$this->username = $username;
$this->password = $password;
}
function setCookies($array) {
$this->cookies = $array;
}
// Option setting methods
function useGzip($boolean) {
$this->use_gzip = $boolean;
}
function setPersistCookies($boolean) {
$this->persist_cookies = $boolean;
}
function setPersistReferers($boolean) {
$this->persist_referers = $boolean;
}
function setHandleRedirects($boolean) {
$this->handle_redirects = $boolean;
}
function setMaxRedirects($num) {
$this->max_redirects = $num;
}
function setHeadersOnly($boolean) {
$this->headers_only = $boolean;
}
function setDebug($boolean) {
$this->debug = $boolean;
}
// "Quick" static methods
function quickGet($url) {
$bits = parse_url($url);
$host = $bits['host'];
$port = isset($bits['port']) ? $bits['port'] : 80;
$path = isset($bits['path']) ? $bits['path'] : '/';
if (isset($bits['query'])) {
$path .= '?'.$bits['query'];
}
$client = new HttpClient($host, $port);
if (!$client->get($path)) {
return false;
} else {
return $client->getContent();
}
}
function quickPost($url, $data) {
$bits = parse_url($url);
$host = $bits['host'];
$port = isset($bits['port']) ? $bits['port'] : 80;
$path = isset($bits['path']) ? $bits['path'] : '/';
$client = new HttpClient($host, $port);
if (!$client->post($path, $data)) {
return false;
} else {
return $client->getContent();
}
}
function debug($msg, $object = false) {
if ($this->debug) {
print '<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong>HttpClient Debug:</strong> '.$msg;
if ($object) {
ob_start();
print_r($object);
$content = htmlentities(ob_get_contents());
ob_end_clean();
print '<pre>'.$content.'</pre>';
}
print '</div>';
}
}
}
-783
View File
@@ -1,783 +0,0 @@
<?php
require_once __DIR__ . '/xentral_autoloader.php';
if (class_exists(Config::class)){
$config = new Config();
$updateHost = $config->updateHost ?: 'removed.upgrade.host';
}else{
$updateHost = 'removed.upgrade.host';
}
$WAWISION['host']=$updateHost;
$WAWISION['port']="443";
$myUpd = new UpgradeClient($WAWISION,$this->app);
echo "STARTE UPDATE\n";
echo "Im folgenden stehen die Dateien die geaendert wurden.\n
Erscheinen keine Dateien sind Sie auf der neusten Version.\n";
$myUpd->Connect();
//$myUpd->CheckCRT();
$myUpd->CheckUpdate();
$myUpd->CheckUpdateCustom();
$myUpd->CheckUpdateModules();
class UpgradeClient
{
var $localmd5sums;
function __construct($conf,&$app)
{
$this->conf = $conf;
$this->app=&$app;
}
function Connect()
{
// check connection then stop
}
function CheckCRT()
{
$cert = shell_exec("openssl s_client -connect update.embedded-projects.net:443 < /dev/null 2>/dev/null | openssl x509 -in /dev/stdin");
if($cert==$this->conf['cert']."\n") return 1;
else {
echo "wrong\n";
exit;
}
}
function CheckUpdate()
{
$parameter['version']=@$this->conf['version'];
$result = $this->Request("md5list",$parameter);
if($result=="ERROR") { echo "Updates: ERROR FROM SERVER (Perhaps a wrong license?)\n"; return;}
$rows = explode(";",$result);
if(count($rows)>0)
{
foreach($rows as $value)
{
unset($single_row);
$single_row = explode(":",$value);
if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3)
{
$filename = $single_row[0];
$file = __DIR__."/".$single_row[0];
$md5sum = $single_row[1];
$parameter['file']=$filename;
$parameter['md5sum']=$md5sum;
if($file=="./upgradesystemclient.php")
{
}
else if(is_file($file))
{
// pruefe md5sum
if(md5_file($file)!=$md5sum)
{
// wenn update dann UPD_
echo "update <- $file\n";
$result = $this->Request("getfile",$parameter);
$output = (base64_decode($result));
//$output = preg_replace('/[^(\x22-\x7F)\x0A]*/','', $output);
file_put_contents($file."UPD", $output);
/*
$fp = fopen($file."UPD","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
// pruefsuemme neu berechnen wenn passt umbenennen und ins archiv
echo md5_file($file."UPD");
echo "-".$md5sum."\n";
if(md5_file($file."UPD")==$md5sum)
{
echo "update ok $file\n";
rename($file."UPD",$file);
}
}
} else if($file!="") {
echo "datei <- $file\n";
// pruefe ob es verzeichnis gibt
$verzeichnis = dirname($file);
if(!is_dir($verzeichnis))
{
echo "verzeichnis <- $verzeichnis\n";
mkdir($verzeichnis,0777,true);
}
$result = $this->Request("getfile",$parameter);
$output = base64_decode($result);
//$output = iconv("UTF-8","ISO-8859-1//IGNORE",$output);
//$output = iconv("ISO-8859-1","UTF-8",$output);
//$output = preg_replace('/[^(\x20-\x7F)\x0A]*/','', $output);
file_put_contents($file."NEW", $output);
/*$fp = fopen($file."NEW","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
if(md5_file($file."NEW")==$md5sum)
{
echo "datei ok $file\n";
rename($file."NEW",$file);
} else {
// echo "datei XX $file local: ".md5_file($file."NEW")." remote: ".$md5sum."\n";
}
} else { }
}
}
}
//pruefe, update, lege verzeichnis an, lege datei an, loesche datei????
// download all files with UPD_ prefix
// get md5 liste von server
// pruefe ob alle dateien passen, wenn ja dann alle updaten am schluss
// wenn nein fehler abbrechen und ganzen prozess nochmal starten
//echo $md5sums;
}
function CheckUpdateModules()
{
$parameter['version']=@$this->conf['version'];
$result = $this->Request("md5listmodules",$parameter);
if($result=="ERROR") { echo "Modules: ERROR FROM SERVER (Perhaps a wrong license?)\n"; return;}
$rows = explode(";",$result);
if(count($rows)>0)
{
foreach($rows as $value)
{
unset($single_row);
$single_row = explode(":",$value);
if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3)
{
$filename = $single_row[0];
$file = dirname(__FILE__)."/".$single_row[0];
$md5sum = $single_row[1];
$parameter['file']=$filename;
$parameter['md5sum']=$md5sum;
if($file=="./upgradesystemclient.php")
{
}
else if(is_file($file))
{
// pruefe md5sum
if(md5_file($file)!=$md5sum)
{
// wenn update dann UPD_
echo "update (M) <- $file\n";
$result = $this->Request("getfilemodules",$parameter);
$output = (base64_decode($result));
//$output = preg_replace('/[^(\x22-\x7F)\x0A]*/','', $output);
file_put_contents($file."UPD", $output);
/*
$fp = fopen($file."UPD","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
// pruefsuemme neu berechnen wenn passt umbenennen und ins archiv
echo md5_file($file."UPD");
echo "-".$md5sum."\n";
if(md5_file($file."UPD")==$md5sum)
{
echo "update (M) ok $file\n";
rename($file."UPD",$file);
}
}
} else if($file!="") {
echo "datei (M) <- $file\n";
// pruefe ob es verzeichnis gibt
$verzeichnis = dirname($file);
if(!is_dir($verzeichnis))
{
echo "verzeichnis (M) <- $verzeichnis\n";
mkdir($verzeichnis,0777,true);
}
$result = $this->Request("getfilemodules",$parameter);
$output = base64_decode($result);
//$output = iconv("UTF-8","ISO-8859-1//IGNORE",$output);
//$output = iconv("ISO-8859-1","UTF-8",$output);
//$output = preg_replace('/[^(\x20-\x7F)\x0A]*/','', $output);
file_put_contents($file."NEW", $output);
/*$fp = fopen($file."NEW","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
if(md5_file($file."NEW")==$md5sum)
{
echo "datei (M) ok $file\n";
rename($file."NEW",$file);
} else {
// echo "datei XX $file local: ".md5_file($file."NEW")." remote: ".$md5sum."\n";
}
} else { }
}
}
}
//pruefe, update, lege verzeichnis an, lege datei an, loesche datei????
// download all files with UPD_ prefix
// get md5 liste von server
// pruefe ob alle dateien passen, wenn ja dann alle updaten am schluss
// wenn nein fehler abbrechen und ganzen prozess nochmal starten
//echo $md5sums;
}
function CheckUpdateCustom()
{
$parameter['version']=@$this->conf['version'];
$result = $this->Request("md5listcustom",$parameter);
if($result=="ERROR") { echo "Custom: ERROR FROM SERVER (Perhaps a wrong license?)\n"; return;}
$rows = explode(";",$result);
if(count($rows)>0)
{
foreach($rows as $value)
{
unset($single_row);
$single_row = explode(":",$value);
if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3)
{
$filename = $single_row[0];
$file = __DIR__."/".$single_row[0];
$md5sum = $single_row[1];
$parameter['file']=$filename;
$parameter['md5sum']=$md5sum;
if($file=="./upgradesystemclient.php")
{
}
else if(is_file($file))
{
// pruefe md5sum
if(md5_file($file)!=$md5sum)
{
// wenn update dann UPD_
echo "update (C) <- $file\n";
$result = $this->Request("getfilecustom",$parameter);
$output = (base64_decode($result));
//$output = preg_replace('/[^(\x22-\x7F)\x0A]*/','', $output);
file_put_contents($file."UPD", $output);
/*
$fp = fopen($file."UPD","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
// pruefsuemme neu berechnen wenn passt umbenennen und ins archiv
echo md5_file($file."UPD");
echo "-".$md5sum."\n";
if(md5_file($file."UPD")==$md5sum)
{
echo "update (C) ok $file\n";
rename($file."UPD",$file);
}
}
} else if($file!="") {
echo "datei (C) <- $file\n";
// pruefe ob es verzeichnis gibt
$verzeichnis = dirname($file);
if(!is_dir($verzeichnis))
{
echo "verzeichnis (C) <- $verzeichnis\n";
mkdir($verzeichnis,0777,true);
}
$result = $this->Request("getfilecustom",$parameter);
$output = base64_decode($result);
//$output = iconv("UTF-8","ISO-8859-1//IGNORE",$output);
//$output = iconv("ISO-8859-1","UTF-8",$output);
//$output = preg_replace('/[^(\x20-\x7F)\x0A]*/','', $output);
file_put_contents($file."NEW", $output);
/*$fp = fopen($file."NEW","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
if(md5_file($file."NEW")==$md5sum)
{
echo "datei (C) ok $file\n";
rename($file."NEW",$file);
} else {
// echo "datei XX $file local: ".md5_file($file."NEW")." remote: ".$md5sum."\n";
}
} else { }
}
}
}
//pruefe, update, lege verzeichnis an, lege datei an, loesche datei????
// download all files with UPD_ prefix
// get md5 liste von server
// pruefe ob alle dateien passen, wenn ja dann alle updaten am schluss
// wenn nein fehler abbrechen und ganzen prozess nochmal starten
//echo $md5sums;
}
function DownloadUpdate()
{
}
function CheckDownloadedUpdate()
{
}
function ExecuteUpdate()
{
}
function Request($command,$parameter)
{
global $erp;
$auth['serial']=$this->app->erp->Firmendaten("lizenz");//$this->conf['serial'];
$auth['authkey']=$this->app->erp->Firmendaten("schluessel");//$this->conf['authkey'];
$auth = base64_encode(json_encode($auth));
$parameter = base64_encode(json_encode($parameter));
$client = new HttpClientUpgrade($this->conf['host'],$this->conf['port']);
$client->post('/upgradesystem.php', array( "authjson" => $auth, "parameterjson"=>$parameter,"command"=>"$command" ));
$pageContents = $client->getContent();
return $pageContents;
}
function dir_rekursiv($verzeichnis)
{
$handle = opendir($verzeichnis);
while ($datei = readdir($handle))
{
if ($datei != "." && $datei != "..")
{
if (is_dir($verzeichnis.$datei)) // Wenn Verzeichniseintrag ein Verzeichnis ist
{
// Erneuter Funktionsaufruf, um das aktuelle Verzeichnis auszulesen
$this->dir_rekursiv($verzeichnis.$datei.'/');
}
else
{
// Wenn Verzeichnis-Eintrag eine Datei ist, diese ausgeben
$this->localmd5sums[$verzeichnis.$datei] = md5_file($verzeichnis.$datei);
}
}
}
closedir($handle);
}
}
/* Version 0.9, 6th April 2003 - Simon Willison ( http://simon.incutio.com/ )
Manual: http://scripts.incutio.com/httpclient/
*/
class HttpClientUpgrade {
// Request vars
var $host;
var $port;
var $path;
var $method;
var $postdata = '';
var $cookies = array();
var $referer;
var $accept = 'text/xml,application/xml,application/xhtml+xml,text/html,text/plain,image/png,image/jpeg,image/gif,*/*';
var $accept_encoding = 'gzip';
var $accept_language = 'en-us';
var $user_agent = 'Incutio HttpClientUpgrade v0.9';
// Options
var $timeout = 20;
var $use_gzip = true;
var $persist_cookies = true; // If true, received cookies are placed in the $this->cookies array ready for the next request
// Note: This currently ignores the cookie path (and time) completely. Time is not important,
// but path could possibly lead to security problems.
var $persist_referers = true; // For each request, sends path of last request as referer
var $debug = false;
var $handle_redirects = true; // Auaomtically redirect if Location or URI header is found
var $max_redirects = 5;
var $headers_only = false; // If true, stops receiving once headers have been read.
// Basic authorization variables
var $username;
var $password;
// Response vars
var $status;
var $headers = array();
var $content = '';
var $errormsg;
// Tracker variables
var $redirect_count = 0;
var $cookie_host = '';
function __construct($host, $port=80) {
$this->host = $host;
$this->port = $port;
}
function get($path, $data = false) {
$this->path = $path;
$this->method = 'GET';
if ($data) {
$this->path .= '?'.$this->buildQueryString($data);
}
return $this->doRequest();
}
function post($path, $data) {
$this->path = $path;
$this->method = 'POST';
$this->postdata = $this->buildQueryString($data);
return $this->doRequest();
}
function buildQueryString($data) {
$querystring = '';
if (is_array($data)) {
// Change data in to postable data
foreach ($data as $key => $val) {
if (is_array($val)) {
foreach ($val as $val2) {
$querystring .= urlencode($key).'='.urlencode($val2).'&';
}
} else {
$querystring .= urlencode($key).'='.urlencode($val).'&';
}
}
$querystring = substr($querystring, 0, -1); // Eliminate unnecessary &
} else {
$querystring = $data;
}
return $querystring;
}
function doRequest() {
// Performs the actual HTTP request, returning true or false depending on outcome
// check if port is available
if(!fsockopen("ssl://".$this->host, $this->port, $errno, $errstr, $this->timeout) && $this->port==443)
{
$this->port=80;
}
if($this->port==443)
$url = "ssl://".$this->host;
else
$url = $this->host;
if (!$fp = @fsockopen($url, $this->port, $errno, $errstr, $this->timeout)) {
// Set error message
switch($errno) {
case -3:
$this->errormsg = 'Socket creation failed (-3)';
case -4:
$this->errormsg = 'DNS lookup failure (-4)';
case -5:
$this->errormsg = 'Connection refused or timed out (-5)';
default:
$this->errormsg = 'Connection failed ('.$errno.')';
$this->errormsg .= ' '.$errstr;
$this->debug($this->errormsg);
}
return false;
}
stream_set_timeout($fp, $this->timeout);
$request = $this->buildRequest();
$this->debug('Request', $request);
fwrite($fp, $request);
// Reset all the variables that should not persist between requests
$this->headers = array();
$this->content = '';
$this->errormsg = '';
// Set a couple of flags
$inHeaders = true;
$atStart = true;
// Now start reading back the response
while (!feof($fp)) {
$line = fgets($fp, 4096);
if ($atStart) {
// Deal with first line of returned data
$atStart = false;
if (!preg_match('/HTTP\/(\\d\\.\\d)\\s*(\\d+)\\s*(.*)/', $line, $m)) {
$this->errormsg = "Status code line invalid: ".htmlentities($line);
$this->debug($this->errormsg);
//return false;
}
$http_version = $m[1]; // not used
$this->status = $m[2];
$status_string = $m[3]; // not used
$this->debug(trim($line));
continue;
}
if ($inHeaders) {
if (trim($line) == '') {
$inHeaders = false;
$this->debug('Received Headers', $this->headers);
if ($this->headers_only) {
break; // Skip the rest of the input
}
continue;
}
if (!preg_match('/([^:]+):\\s*(.*)/', $line, $m)) {
// Skip to the next header
continue;
}
$key = strtolower(trim($m[1]));
$val = trim($m[2]);
// Deal with the possibility of multiple headers of same name
if (isset($this->headers[$key])) {
if (is_array($this->headers[$key])) {
$this->headers[$key][] = $val;
} else {
$this->headers[$key] = array($this->headers[$key], $val);
}
} else {
$this->headers[$key] = $val;
}
continue;
}
// We're not in the headers, so append the line to the contents
$this->content .= $line;
}
fclose($fp);
// If data is compressed, uncompress it
if (isset($this->headers['content-encoding']) && $this->headers['content-encoding'] == 'gzip') {
$this->debug('Content is gzip encoded, unzipping it');
$this->content = substr($this->content, 10); // See http://www.php.net/manual/en/function.gzencode.php
$this->content = gzinflate($this->content);
}
// If $persist_cookies, deal with any cookies
if ($this->persist_cookies && isset($this->headers['set-cookie']) && $this->host == $this->cookie_host) {
$cookies = $this->headers['set-cookie'];
if (!is_array($cookies)) {
$cookies = array($cookies);
}
foreach ($cookies as $cookie) {
if (preg_match('/([^=]+)=([^;]+);/', $cookie, $m)) {
$this->cookies[$m[1]] = $m[2];
}
}
// Record domain of cookies for security reasons
$this->cookie_host = $this->host;
}
// If $persist_referers, set the referer ready for the next request
if ($this->persist_referers) {
$this->debug('Persisting referer: '.$this->getRequestURL());
$this->referer = $this->getRequestURL();
}
// Finally, if handle_redirects and a redirect is sent, do that
if ($this->handle_redirects) {
if (++$this->redirect_count >= $this->max_redirects) {
$this->errormsg = 'Number of redirects exceeded maximum ('.$this->max_redirects.')';
$this->debug($this->errormsg);
$this->redirect_count = 0;
return false;
}
$location = isset($this->headers['location']) ? $this->headers['location'] : '';
$uri = isset($this->headers['uri']) ? $this->headers['uri'] : '';
if ($location || $uri) {
$url = parse_url($location.$uri);
// This will FAIL if redirect is to a different site
return $this->get($url['path']);
}
}
return true;
}
function buildRequest() {
$headers = array();
$headers[] = "{$this->method} {$this->path} HTTP/1.0"; // Using 1.1 leads to all manner of problems, such as "chunked" encoding
$headers[] = "Host: {$this->host}";
$headers[] = "User-Agent: {$this->user_agent}";
$headers[] = "Accept: {$this->accept}";
if ($this->use_gzip) {
$headers[] = "Accept-encoding: {$this->accept_encoding}";
}
$headers[] = "Accept-language: {$this->accept_language}";
if ($this->referer) {
$headers[] = "Referer: {$this->referer}";
}
// Cookies
if ($this->cookies) {
$cookie = 'Cookie: ';
foreach ($this->cookies as $key => $value) {
$cookie .= "$key=$value; ";
}
$headers[] = $cookie;
}
// Basic authentication
if ($this->username && $this->password) {
$headers[] = 'Authorization: BASIC '.base64_encode($this->username.':'.$this->password);
}
// If this is a POST, set the content type and length
if ($this->postdata) {
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
$headers[] = 'Content-Length: '.strlen($this->postdata);
}
$request = implode("\r\n", $headers)."\r\n\r\n".$this->postdata;
return $request;
}
function getStatus() {
return $this->status;
}
function getContent() {
return $this->content;
}
function getHeaders() {
return $this->headers;
}
function getHeader($header) {
$header = strtolower($header);
if (isset($this->headers[$header])) {
return $this->headers[$header];
} else {
return false;
}
}
function getError() {
return $this->errormsg;
}
function getCookies() {
return $this->cookies;
}
function getRequestURL() {
$url = 'http://'.$this->host;
if ($this->port != 80) {
$url .= ':'.$this->port;
}
$url .= $this->path;
return $url;
}
// Setter methods
function setUserAgent($string) {
$this->user_agent = $string;
}
function setAuthorization($username, $password) {
$this->username = $username;
$this->password = $password;
}
function setCookies($array) {
$this->cookies = $array;
}
// Option setting methods
function useGzip($boolean) {
$this->use_gzip = $boolean;
}
function setPersistCookies($boolean) {
$this->persist_cookies = $boolean;
}
function setPersistReferers($boolean) {
$this->persist_referers = $boolean;
}
function setHandleRedirects($boolean) {
$this->handle_redirects = $boolean;
}
function setMaxRedirects($num) {
$this->max_redirects = $num;
}
function setHeadersOnly($boolean) {
$this->headers_only = $boolean;
}
function setDebug($boolean) {
$this->debug = $boolean;
}
// "Quick" static methods
function quickGet($url) {
$bits = parse_url($url);
$host = $bits['host'];
$port = isset($bits['port']) ? $bits['port'] : 80;
$path = isset($bits['path']) ? $bits['path'] : '/';
if (isset($bits['query'])) {
$path .= '?'.$bits['query'];
}
$client = new HttpClientUpgrade($host, $port);
if (!$client->get($path)) {
return false;
} else {
return $client->getContent();
}
}
function quickPost($url, $data) {
$bits = parse_url($url);
$host = $bits['host'];
$port = isset($bits['port']) ? $bits['port'] : 80;
$path = isset($bits['path']) ? $bits['path'] : '/';
$client = new HttpClientUpgrade($host, $port);
if (!$client->post($path, $data)) {
return false;
} else {
return $client->getContent();
}
}
function debug($msg, $object = false) {
if ($this->debug) {
print '<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong>HttpClientUpgrade Debug:</strong> '.$msg;
if ($object) {
ob_start();
print_r($object);
$content = htmlentities(ob_get_contents());
ob_end_clean();
print '<pre>'.$content.'</pre>';
}
print '</div>';
}
}
}
-928
View File
@@ -1,928 +0,0 @@
<?php
require_once __DIR__ . '/xentral_autoloader.php';
if (class_exists(Config::class)){
$config = new Config();
$updateHost = $config->updateHost ?: 'removed.upgrade.host';
}else{
$updateHost = 'removed.upgrade.host';
}
define('XENTRAL_UPDATE_HOST', $updateHost);
$WAWISION['host']=XENTRAL_UPDATE_HOST;
$WAWISION['port']="443";
$myUpd = new UpgradeClient($WAWISION,$this->app);
$myUpd->Connect();
if(isset($sendStats)) {
}
elseif(isset($buy)) {
}
elseif(isset($getBuyList)) {
}
elseif(isset($getBuyInfo)) {
}
elseif(isset($setBeta)) {
}
elseif(isset($setDevelopmentVersion)) {
}
elseif(isset($buyFromDemo)) {
}
elseif(isset($resetXentral)) {
}
elseif(isset($fiskalyCommand)) {
}
elseif(isset($createFiskalyClientFromClientId) && isset($tseId) && isset($organizationId)) {
}
elseif(isset($sma) && isset($sendSmaErrorMessage)) {
}
else{
}
if(!class_exists('Md5Dateien'))
{
class Md5Dateien
{
var $Dateien;
function __construct($quellverzeichnis)
{
$this->getVerzeichnis($quellverzeichnis, '', 0, '');
}
function getVerzeichnis($quellverzeichnis, $zielverzeichnis, $lvl, $relativ){
//echo "Verzeichnis: ".$quellverzeichnis." ".$zielverzeichnis. "\r\n";
$quelllast = $quellverzeichnis;
if($quellverzeichnis[strlen($quellverzeichnis) - 1] == '/')$quelllast = substr($quellverzeichnis, 0, strlen($quellverzeichnis) - 1);
$path_parts = pathinfo($quelllast);
$quelllast = $path_parts['basename'];
if(file_exists($quellverzeichnis))
{
if($quelllast != 'importer' || $lvl != 1){
if ($handle = opendir($quellverzeichnis)) {
while (false !== ($entry = readdir($handle))) {
if($entry != '.' && $entry != '..' && $entry != '.git' && $entry != '.svn' && $entry != 'main.conf.php' && $entry != 'user.inc.php' && $entry != 'user_db_version.php' && $entry != 'pygen')
{
if(is_dir($quellverzeichnis.'/'.$entry))
{
if(!($lvl == 1 && $entry == 'vorlagen' && strpos($quellverzeichnis,'www')))
$this->getVerzeichnis($quellverzeichnis.(strrpos($quellverzeichnis,'/')!==strlen($quellverzeichnis)-1?'/':'').$entry,$zielverzeichnis .(strrpos($zielverzeichnis,'/')!==strlen($zielverzeichnis)-1?'/':'').$entry, $lvl + 1,$relativ.'/'.$entry);
} else {
if(!($lvl == 0 && ($entry == 'INSTALL' || $entry == 'LICENSE_LIST' || $entry == 'LICENSE' || $entry == 'README' || $entry == 'gitlog.txt')))
{
//$this->getFile($quellverzeichnis.(strrpos($quellverzeichnis,'/')!==strlen($quellverzeichnis)-1?'/':'').$entry,$zielverzeichnis .(strrpos($zielverzeichnis,'/')!==strlen($zielverzeichnis)-1?'/':'').$entry,$relativ.'/'.$entry);
if(strtolower(substr($entry,-4)) == '.php')$this->Dateien[$relativ.'/'.$entry] = md5_file($quellverzeichnis.(strrpos($quellverzeichnis,'/')!==strlen($quellverzeichnis)-1?'/':'').$entry);
}
}
}
}
@closedir($handle);
} else {
}
}
} else {
}
return true;
}
}
}
class UpgradeClient
{
var $localmd5sums;
/**
* UpgradeClient constructor.
*
* @param Config $conf
* @param ApplicationCore $app
*/
public function __construct($conf, $app)
{
$this->conf = $conf;
$this->app = $app;
}
function Connect()
{
// check connection then stop
}
function CheckCRT()
{
$updateHost = XENTRAL_UPDATE_HOST;
$cert = shell_exec("openssl s_client -connect {$updateHost}:443 < /dev/null 2>/dev/null | openssl x509 -in /dev/stdin");
if($cert==$this->conf['cert']."\n") return 1;
else {
echo "wrong\n";
exit;
}
}
function CheckUpdate()
{
//$this->dir_rekursiv("./");
//$parameter['md5sums'] = $this->localmd5sums;
//shell_exec('find ./ -exec md5sum "{}" \;');
$lines = null;
$funktions_ind = null;
$dateien = new Md5Dateien(__DIR__.'/');
if(!empty($dateien->Dateien) && is_array($dateien->Dateien)) {
foreach($dateien->Dateien as $k => $v) {
if(
strtolower(substr($k,-4)) === '.php'
&& strpos($k, '_custom') !== false
&& strpos($k,'/vendor/') === false
) {
$datei = __DIR__.$k;
if(!file_exists($datei)) {
continue;
}
$fh = fopen($datei, 'r');
if(!$fh) {
continue;
}
$f_ind = -1;
if(isset($lines)) {
unset($lines);
}
$i = -1;
while(($line = fgets($fh)) !== false) {
$i++;
$lines[$i] = $line;
if(isset($funktions_ind) && isset($funktions_ind[$k])) {
foreach($funktions_ind[$k] as $k2 => $v2) {
if($v2 + 5 >= $i) {
$funktions[$k][$k2][] = $line;
}
}
}
if(strpos($line, 'function') !== false) {
$f_ind++;
for($j = $i-5; $j <= $i; $j++) {
if($j > -1) {
$funktions[$k][$f_ind][] = $lines[$j];
}
}
$funktions_ind[$k][$f_ind] = $i;
}
}
fclose($fh);
}
}
}
$parameter['version'] = @$this->conf['version'];
if(isset($funktions)) {
$parameter['funktionen'] = $funktions;
$this->Request("versionen", $parameter);
}
if (is_file(__DIR__ . '/marketing_labels.txt')) {
$parameter['marketing_labels'] = explode(',', (string)@file_get_contents(__DIR__ . '/marketing_labels.txt'));
}
$result = $this->Request("md5list",$parameter);
if($result==="ERROR") {
echo "Updates: ERROR FROM SERVER (Perhaps a wrong license?)\n";
return;
}
$rows = explode(";",$result);
if(count($rows)>0)
{
foreach($rows as $value)
{
unset($single_row);
$single_row = explode(":",$value);
if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3)
{
$filename = $single_row[0];
$file = __DIR__."/".$single_row[0];
$md5sum = $single_row[1];
$parameter['file']=$filename;
$parameter['md5sum']=$md5sum;
if($file==="./upgradesystemclient.php")
{
}
else if(is_file($file))
{
// pruefe md5sum
if(md5_file($file)!=$md5sum)
{
// wenn update dann UPD_
echo "update <- $file\n";
$result = $this->Request("getfile",$parameter);
$output = (base64_decode($result));
//$output = preg_replace('/[^(\x22-\x7F)\x0A]*/','', $output);
file_put_contents($file."UPD", $output);
/*
$fp = fopen($file."UPD","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
// pruefsuemme neu berechnen wenn passt umbenennen und ins archiv
echo md5_file($file."UPD");
echo "-".$md5sum."\n";
if(md5_file($file."UPD")==$md5sum)
{
echo "update ok $file\n";
rename($file."UPD",$file);
}
}
} else if($file!="") {
echo "datei <- $file\n";
// pruefe ob es verzeichnis gibt
$verzeichnis = dirname($file);
if(!is_dir($verzeichnis))
{
echo "verzeichnis <- $verzeichnis\n";
mkdir($verzeichnis,0777,true);
}
$result = $this->Request("getfile",$parameter);
$output = base64_decode($result);
//$output = iconv("UTF-8","ISO-8859-1//IGNORE",$output);
//$output = iconv("ISO-8859-1","UTF-8",$output);
//$output = preg_replace('/[^(\x20-\x7F)\x0A]*/','', $output);
file_put_contents($file."NEW", $output);
/*$fp = fopen($file."NEW","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
if(md5_file($file."NEW")==$md5sum)
{
echo "datei ok $file\n";
rename($file."NEW",$file);
} else {
// echo "datei XX $file local: ".md5_file($file."NEW")." remote: ".$md5sum."\n";
}
} else { }
}
}
}
//pruefe, update, lege verzeichnis an, lege datei an, loesche datei????
// download all files with UPD_ prefix
// get md5 liste von server
// pruefe ob alle dateien passen, wenn ja dann alle updaten am schluss
// wenn nein fehler abbrechen und ganzen prozess nochmal starten
//echo $md5sums;
}
function CheckUpdateModules()
{
$parameter['version']=@$this->conf['version'];
$result = $this->Request("md5listmodules",$parameter);
if($result=="ERROR") { echo "Modules: ERROR FROM SERVER (Perhaps a wrong license?)\n"; return;}
$rows = explode(";",$result);
if(count($rows)>0)
{
foreach($rows as $value)
{
unset($single_row);
$single_row = explode(":",$value);
if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3)
{
$filename = $single_row[0];
$file = dirname(__FILE__)."/".$single_row[0];
$md5sum = $single_row[1];
$parameter['file']=$filename;
$parameter['md5sum']=$md5sum;
if($file=="./upgradesystemclient.php")
{
}
else if(is_file($file))
{
// pruefe md5sum
if(md5_file($file)!=$md5sum)
{
// wenn update dann UPD_
echo "update (M) <- $file\n";
$result = $this->Request("getfilemodules",$parameter);
$output = (base64_decode($result));
//$output = preg_replace('/[^(\x22-\x7F)\x0A]*/','', $output);
file_put_contents($file."UPD", $output);
/*
$fp = fopen($file."UPD","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
// pruefsuemme neu berechnen wenn passt umbenennen und ins archiv
echo md5_file($file."UPD");
echo "-".$md5sum."\n";
if(md5_file($file."UPD")==$md5sum)
{
echo "update (M) ok $file\n";
rename($file."UPD",$file);
}
}
} else if($file!="") {
echo "datei (M) <- $file\n";
// pruefe ob es verzeichnis gibt
$verzeichnis = dirname($file);
if(!is_dir($verzeichnis))
{
echo "verzeichnis (M) <- $verzeichnis\n";
mkdir($verzeichnis,0777,true);
}
$result = $this->Request("getfilemodules",$parameter);
$output = base64_decode($result);
//$output = iconv("UTF-8","ISO-8859-1//IGNORE",$output);
//$output = iconv("ISO-8859-1","UTF-8",$output);
//$output = preg_replace('/[^(\x20-\x7F)\x0A]*/','', $output);
file_put_contents($file."NEW", $output);
/*$fp = fopen($file."NEW","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
if(md5_file($file."NEW")==$md5sum)
{
echo "datei (M) ok $file\n";
rename($file."NEW",$file);
} else {
// echo "datei XX $file local: ".md5_file($file."NEW")." remote: ".$md5sum."\n";
}
} else { }
}
}
}
//pruefe, update, lege verzeichnis an, lege datei an, loesche datei????
// download all files with UPD_ prefix
// get md5 liste von server
// pruefe ob alle dateien passen, wenn ja dann alle updaten am schluss
// wenn nein fehler abbrechen und ganzen prozess nochmal starten
//echo $md5sums;
}
/**
* @param array $data
*
* @return string|null
*/
public function sendSetDevelopmentStatus($data)
{
$parameter['version'] = isset($this->conf['version']) ? $this->conf['version']: null;
$parameter['data'] = $data;
return $this->Request('setdevelopmentversion', $parameter);
}
/**
* @param array $data
*
* @return string|null
*/
public function sendSetBetaStatus($data)
{
$parameter['version'] = isset($this->conf['version']) ? $this->conf['version']: null;
$parameter['data'] = $data;
return $this->Request('setbeta', $parameter);
}
function CheckUpdateKey()
{
$parameter['SERVER_NAME'] = $_SERVER['SERVER_NAME'];
if(!empty($_SERVER['HTTP_HOST']) && (empty($parameter['SERVER_NAME']) || $parameter['SERVER_NAME'] === '_')) {
$parameter['SERVER_NAME'] = $_SERVER['HTTP_HOST'];
}
$parameter['phpversion'] = (String)phpversion();
$parameter['mysqlversion'] = $this->app->DB->GetVersion();
$parameter['version']=@$this->conf['version'];
$result = $this->Request('md5listcustom',$parameter);
if($result==='ERROR') {
return false;
}
$rows = explode(';',$result);
$return = false;
if(count($rows) <= 0) {
return false;
}
foreach($rows as $value) {
unset($single_row);
$single_row = explode(':',$value);
if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3) {
$filename = $single_row[0];
$file = __DIR__.'/'.$single_row[0];
$md5sum = $single_row[1];
$parameter['file']=$filename;
$parameter['md5sum']=$md5sum;
$fileOk = $filename === './key.php';
if(!$fileOk && strpos($md5sum, 'DEL') === false) {
if($filename === './www/themes/new/templates/loginslider.tpl') {
$fileOk = true;
}
elseif(strpos($filename ,'./www/themes/new/templates/') === 0
&& (substr($filename,-4) === '.jpg' || substr($filename,-5) === '.jpeg')
&& strpos($filename, '/', 28) === false) {
$fileOk = true;
}
}
if(!$fileOk) {
continue;
}
if(is_file($file)) {
// pruefe md5sum
if(md5_file($file)!=$md5sum) {
// wenn update dann UPD_
$result = $this->Request('getfilecustom',$parameter);
$output = (base64_decode($result));
file_put_contents($file.'UPD', $output);
if(md5_file($file.'UPD')==$md5sum && $result) {
$return = rename($file.'UPD',$file);
}
}
else {
$return = true;
}
continue;
}
// pruefe ob es verzeichnis gibt
$verzeichnis = dirname($file);
if(!is_dir($verzeichnis) && !mkdir($verzeichnis,0777,true) && !is_dir($verzeichnis)) {
}
$result = $this->Request('getfilecustom',$parameter);
$output = base64_decode($result);
file_put_contents($file.'NEW', $output);
if(md5_file($file.'NEW')==$md5sum) {
$return = rename($file.'NEW',$file);
}
}
}
return $return;
}
function DownloadUpdate()
{
}
function CheckDownloadedUpdate()
{
}
function ExecuteUpdate()
{
}
function Request($command,$parameter)
{
global $erp;
$auth['serial']=$this->app->erp->Firmendaten("lizenz");//$this->conf['serial'];
$auth['authkey']=$this->app->erp->Firmendaten("schluessel");//$this->conf['authkey'];
$auth['SERVER_NAME'] = (isset($_SERVER['SERVER_NAME']) && $_SERVER['SERVER_NAME'] != '')?$_SERVER['SERVER_NAME']:(isset($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:'');
$auth = base64_encode(json_encode($auth));
$parameter = base64_encode(json_encode($parameter));
$client = new HttpClientUpgrade($this->conf['host'],$this->conf['port']);
$client->post('/upgradesystem.php', array( "authjson" => $auth, "parameterjson"=>$parameter,"command"=>"$command" ));
$pageContents = $client->getContent();
return $pageContents;
}
function dir_rekursiv($verzeichnis)
{
$handle = opendir($verzeichnis);
while ($datei = readdir($handle))
{
if ($datei != "." && $datei != "..")
{
if (is_dir($verzeichnis.$datei)) // Wenn Verzeichniseintrag ein Verzeichnis ist
{
// Erneuter Funktionsaufruf, um das aktuelle Verzeichnis auszulesen
$this->dir_rekursiv($verzeichnis.$datei.'/');
}
else
{
// Wenn Verzeichnis-Eintrag eine Datei ist, diese ausgeben
$this->localmd5sums[$verzeichnis.$datei] = md5_file($verzeichnis.$datei);
}
}
}
closedir($handle);
}
}
/* Version 0.9, 6th April 2003 - Simon Willison ( http://simon.incutio.com/ )
Manual: http://scripts.incutio.com/httpclient/
*/
class HttpClientUpgrade {
// Request vars
var $host;
var $port;
var $path;
var $method;
var $postdata = '';
var $cookies = array();
var $referer;
var $accept = 'text/xml,application/xml,application/xhtml+xml,text/html,text/plain,image/png,image/jpeg,image/gif,*/*';
var $accept_encoding = 'gzip';
var $accept_language = 'en-us';
var $user_agent = 'Incutio HttpClientUpgrade v0.9';
// Options
var $timeout = 20;
var $use_gzip = true;
var $persist_cookies = true; // If true, received cookies are placed in the $this->cookies array ready for the next request
// Note: This currently ignores the cookie path (and time) completely. Time is not important,
// but path could possibly lead to security problems.
var $persist_referers = true; // For each request, sends path of last request as referer
var $debug = false;
var $handle_redirects = true; // Auaomtically redirect if Location or URI header is found
var $max_redirects = 5;
var $headers_only = false; // If true, stops receiving once headers have been read.
// Basic authorization variables
var $username;
var $password;
// Response vars
var $status;
var $headers = array();
var $content = '';
var $errormsg;
// Tracker variables
var $redirect_count = 0;
var $cookie_host = '';
function __construct($host, $port=80) {
$this->host = $host;
$this->port = $port;
}
function get($path, $data = false) {
$this->path = $path;
$this->method = 'GET';
if ($data) {
$this->path .= '?'.$this->buildQueryString($data);
}
return $this->doRequest();
}
function post($path, $data) {
$this->path = $path;
$this->method = 'POST';
$this->postdata = $this->buildQueryString($data);
return $this->doRequest();
}
function buildQueryString($data) {
$querystring = '';
if (is_array($data)) {
// Change data in to postable data
foreach ($data as $key => $val) {
if (is_array($val)) {
foreach ($val as $val2) {
$querystring .= urlencode($key).'='.urlencode($val2).'&';
}
} else {
$querystring .= urlencode($key).'='.urlencode($val).'&';
}
}
$querystring = substr($querystring, 0, -1); // Eliminate unnecessary &
} else {
$querystring = $data;
}
return $querystring;
}
function doRequest() {
// Performs the actual HTTP request, returning true or false depending on outcome
// check if port is available
if(!fsockopen("ssl://".$this->host, $this->port, $errno, $errstr, $this->timeout) && $this->port==443)
{
$this->port=80;
}
if($this->port==443)
$url = "ssl://".$this->host;
else
$url = $this->host;
if (!$fp = @fsockopen($url, $this->port, $errno, $errstr, $this->timeout)) {
// Set error message
switch($errno) {
case -3:
$this->errormsg = 'Socket creation failed (-3)';
case -4:
$this->errormsg = 'DNS lookup failure (-4)';
case -5:
$this->errormsg = 'Connection refused or timed out (-5)';
default:
$this->errormsg = 'Connection failed ('.$errno.')';
$this->errormsg .= ' '.$errstr;
$this->debug($this->errormsg);
}
return false;
}
socket_set_timeout($fp, $this->timeout);
$request = $this->buildRequest();
$this->debug('Request', $request);
fwrite($fp, $request);
// Reset all the variables that should not persist between requests
$this->headers = array();
$this->content = '';
$this->errormsg = '';
// Set a couple of flags
$inHeaders = true;
$atStart = true;
// Now start reading back the response
while (!feof($fp)) {
$line = fgets($fp, 4096);
if ($atStart) {
// Deal with first line of returned data
$atStart = false;
if (!preg_match('/HTTP\/(\\d\\.\\d)\\s*(\\d+)\\s*(.*)/', $line, $m)) {
$this->errormsg = "Status code line invalid: ".htmlentities($line);
$this->debug($this->errormsg);
//return false;
}
$http_version = $m[1]; // not used
$this->status = $m[2];
$status_string = $m[3]; // not used
$this->debug(trim($line));
continue;
}
if ($inHeaders) {
if (trim($line) == '') {
$inHeaders = false;
$this->debug('Received Headers', $this->headers);
if ($this->headers_only) {
break; // Skip the rest of the input
}
continue;
}
if (!preg_match('/([^:]+):\\s*(.*)/', $line, $m)) {
// Skip to the next header
continue;
}
$key = strtolower(trim($m[1]));
$val = trim($m[2]);
// Deal with the possibility of multiple headers of same name
if (isset($this->headers[$key])) {
if (is_array($this->headers[$key])) {
$this->headers[$key][] = $val;
} else {
$this->headers[$key] = array($this->headers[$key], $val);
}
} else {
$this->headers[$key] = $val;
}
continue;
}
// We're not in the headers, so append the line to the contents
$this->content .= $line;
}
fclose($fp);
// If data is compressed, uncompress it
if (isset($this->headers['content-encoding']) && $this->headers['content-encoding'] == 'gzip') {
$this->debug('Content is gzip encoded, unzipping it');
$this->content = substr($this->content, 10); // See http://www.php.net/manual/en/function.gzencode.php
$this->content = gzinflate($this->content);
}
// If $persist_cookies, deal with any cookies
if ($this->persist_cookies && isset($this->headers['set-cookie']) && $this->host == $this->cookie_host) {
$cookies = $this->headers['set-cookie'];
if (!is_array($cookies)) {
$cookies = array($cookies);
}
foreach ($cookies as $cookie) {
if (preg_match('/([^=]+)=([^;]+);/', $cookie, $m)) {
$this->cookies[$m[1]] = $m[2];
}
}
// Record domain of cookies for security reasons
$this->cookie_host = $this->host;
}
// If $persist_referers, set the referer ready for the next request
if ($this->persist_referers) {
$this->debug('Persisting referer: '.$this->getRequestURL());
$this->referer = $this->getRequestURL();
}
// Finally, if handle_redirects and a redirect is sent, do that
if ($this->handle_redirects) {
if (++$this->redirect_count >= $this->max_redirects) {
$this->errormsg = 'Number of redirects exceeded maximum ('.$this->max_redirects.')';
$this->debug($this->errormsg);
$this->redirect_count = 0;
return false;
}
$location = isset($this->headers['location']) ? $this->headers['location'] : '';
$uri = isset($this->headers['uri']) ? $this->headers['uri'] : '';
if ($location || $uri) {
$url = parse_url($location.$uri);
// This will FAIL if redirect is to a different site
return $this->get($url['path']);
}
}
return true;
}
function buildRequest() {
$headers = array();
$headers[] = "{$this->method} {$this->path} HTTP/1.0"; // Using 1.1 leads to all manner of problems, such as "chunked" encoding
$headers[] = "Host: {$this->host}";
$headers[] = "User-Agent: {$this->user_agent}";
$headers[] = "Accept: {$this->accept}";
if ($this->use_gzip) {
$headers[] = "Accept-encoding: {$this->accept_encoding}";
}
$headers[] = "Accept-language: {$this->accept_language}";
if ($this->referer) {
$headers[] = "Referer: {$this->referer}";
}
// Cookies
if ($this->cookies) {
$cookie = 'Cookie: ';
foreach ($this->cookies as $key => $value) {
$cookie .= "$key=$value; ";
}
$headers[] = $cookie;
}
// Basic authentication
if ($this->username && $this->password) {
$headers[] = 'Authorization: BASIC '.base64_encode($this->username.':'.$this->password);
}
// If this is a POST, set the content type and length
if ($this->postdata) {
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
$headers[] = 'Content-Length: '.strlen($this->postdata);
}
$request = implode("\r\n", $headers)."\r\n\r\n".$this->postdata;
return $request;
}
function getStatus() {
return $this->status;
}
function getContent() {
return $this->content;
}
function getHeaders() {
return $this->headers;
}
function getHeader($header) {
$header = strtolower($header);
if (isset($this->headers[$header])) {
return $this->headers[$header];
} else {
return false;
}
}
function getError() {
return $this->errormsg;
}
function getCookies() {
return $this->cookies;
}
function getRequestURL() {
$url = 'http://'.$this->host;
if ($this->port != 80) {
$url .= ':'.$this->port;
}
$url .= $this->path;
return $url;
}
// Setter methods
function setUserAgent($string) {
$this->user_agent = $string;
}
function setAuthorization($username, $password) {
$this->username = $username;
$this->password = $password;
}
function setCookies($array) {
$this->cookies = $array;
}
// Option setting methods
function useGzip($boolean) {
$this->use_gzip = $boolean;
}
function setPersistCookies($boolean) {
$this->persist_cookies = $boolean;
}
function setPersistReferers($boolean) {
$this->persist_referers = $boolean;
}
function setHandleRedirects($boolean) {
$this->handle_redirects = $boolean;
}
function setMaxRedirects($num) {
$this->max_redirects = $num;
}
function setHeadersOnly($boolean) {
$this->headers_only = $boolean;
}
function setDebug($boolean) {
$this->debug = $boolean;
}
// "Quick" static methods
function quickGet($url) {
$bits = parse_url($url);
$host = $bits['host'];
$port = isset($bits['port']) ? $bits['port'] : 80;
$path = isset($bits['path']) ? $bits['path'] : '/';
if (isset($bits['query'])) {
$path .= '?'.$bits['query'];
}
$client = new HttpClientUpgrade($host, $port);
if (!$client->get($path)) {
return false;
} else {
return $client->getContent();
}
}
function quickPost($url, $data) {
$bits = parse_url($url);
$host = $bits['host'];
$port = isset($bits['port']) ? $bits['port'] : 80;
$path = isset($bits['path']) ? $bits['path'] : '/';
$client = new HttpClientUpgrade($host, $port);
if (!$client->post($path, $data)) {
return false;
} else {
return $client->getContent();
}
}
function debug($msg, $object = false) {
if ($this->debug) {
print '<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong>HttpClientUpgrade Debug:</strong> '.$msg;
if ($object) {
ob_start();
print_r($object);
$content = htmlentities(ob_get_contents());
ob_end_clean();
print '<pre>'.$content.'</pre>';
}
print '</div>';
}
}
}
+749
View File
@@ -0,0 +1,749 @@
<?php
/*
MUSTAL Mysql Upgrade Schema Tool by Alex Ledis
Helper to compare database structures from JSON files vs. database and upgrade database
Copyright (c) 2022 Alex Ledis
Licensed under AGPL v3
Version 1.0
function mustal_load_tables_from_db(string $host, string $schema, string $user, string $passwd, $replacers) : array
Load structure from db connection to an array.
function mustal_save_tables_to_json(array $db_def, string $path, string $tables_file_name, bool $force) : int
Save structure from array to a JSON file.
function mustal_load_tables_from_json(string $path, string $tables_file_name) : array
Load structure from JSON file into array.
function mustal_compare_table_array(array $nominal, string $nominal_name, array $actual, string $actual_name, bool $check_column_definitions) : array
Compare two database structures
Returns a structured array containing information on all the differences.
function mustal_calculate_db_upgrade(array $compare_def, array $db_def, array &$upgrade_sql) : int
Generate the SQL needed to upgrade the database to match the definition, based on a comparison.
Data structure in Array and JSON
{
"host": "hostname",
"database": "schemaname",
"user": "username",
"tables": [
{
"name": "",
"type": "",
"columns": [
{
"Field": "",
"Type": "",
"Collation": "",
"Null": "",
"Key": "",
"Default": "",
"Extra": "",
"Privileges": "",
"Comment": ""
}
],
"keys": [
{
"Key_name": "",
"columns": [
"",
""
]
}
]
}
]
}
*/
// These default values will not be in quotes, converted to lowercase and be replaced by the second entry
$mustal_replacers = [
['current_timestamp','current_timestamp()'],
['on update current_timestamp','on update current_timestamp()']
];
// Load all db_def from a DB connection into a db_def array
function mustal_load_tables_from_db(string $host, string $schema, string $user, string $passwd, array $replacers) : array {
// First get the contents of the database table structure
$mysqli = mysqli_connect($host, $user, $passwd, $schema);
/* Check if the connection succeeded */
if (!$mysqli) {
return(array());
}
// Get db_def and views
$sql = "SHOW FULL tables WHERE Table_type = 'BASE TABLE'";
$query_result = mysqli_query($mysqli, $sql);
if (!$query_result) {
return(array());
}
while ($row = mysqli_fetch_assoc($query_result)) {
$table = array();
$table['name'] = $row['Tables_in_'.$schema];
$table['type'] = $row['Table_type'];
$tables[] = $table; // Add table to list of tables
}
// Get and add columns of the table
foreach ($tables as &$table) {
$sql = "SHOW FULL COLUMNS FROM ".$table['name'];
$query_result = mysqli_query($mysqli, $sql);
if (!$query_result) {
return(array());
}
$columns = array();
while ($column = mysqli_fetch_assoc($query_result)) {
// Do some harmonization
if ($column['Default'] !== NULL) {
mustal_sql_replace_reserved_functions($column,$replacers);
$column['Default'] = mustal_mysql_put_text_type_in_quotes($column['Type'],$column['Default']);
}
$columns[] = $column; // Add column to list of columns
}
$table['columns'] = $columns;
$sql = "SHOW KEYS FROM ".$table['name'];
$query_result = mysqli_query($mysqli, $sql);
if (!$query_result) {
return(array());
}
$keys = array();
while ($key = mysqli_fetch_assoc($query_result)) {
$keys[] = $key; // Add key to list of keys
}
// Compose comparable format for keys
$composed_keys = array();
foreach ($keys as $key) {
// Check if this key exists already
$key_pos = array_search($key['Key_name'],array_column($composed_keys,'Key_name'));
if ($key_pos == false) {
// New key
$composed_key = array();
$composed_key['Key_name'] = $key['Key_name'];
$composed_key['Index_type'] = $key['Index_type'];
$composed_key['columns'][] = $key['Column_name'];
$composed_keys[] = $composed_key;
} else {
// Given key, add column
$composed_keys[$key_pos]['columns'][] .= $key['Column_name'];
}
}
unset($key);
$table['keys'] = $composed_keys;
unset($composed_keys);
}
unset($table);
$sql = "SHOW FULL tables WHERE Table_type = 'VIEW'";
$query_result = mysqli_query($mysqli, $sql);
if (!$query_result) {
return(array());
}
while ($row = mysqli_fetch_assoc($query_result)) {
$view = array();
$view['name'] = $row['Tables_in_'.$schema];
$view['type'] = $row['Table_type'];
$views[] = $view; // Add view to list of views
}
foreach ($views as &$view) {
$sql = "SHOW CREATE VIEW ".$view['name'];
$query_result = mysqli_query($mysqli, $sql);
if (!$query_result) {
return(array());
}
$viewdef = mysqli_fetch_assoc($query_result);
// Remove the security info from view definition
$view['Create'] = "CREATE ".stristr($viewdef['Create View'],"VIEW");
}
$result = array();
$result['host'] = $host;
$result['database'] = $schema;
$result['user'] = $user;
$result['tables'] = $tables;
$result['views'] = $views;
return($result);
}
function mustal_save_tables_to_json(array $db_def, string $path, string $tables_file_name, bool $force) : int {
// Prepare db_def file
if (!is_dir($path)) {
mkdir($path);
}
if (!$force && file_exists($path."/".$tables_file_name)) {
return(2);
}
$tables_file = fopen($path."/".$tables_file_name, "w");
if (empty($tables_file)) {
return(2);
}
fwrite($tables_file, json_encode($db_def,JSON_PRETTY_PRINT));
fclose($tables_file);
return(0);
}
// Load all db_def from JSON file
function mustal_load_tables_from_json(string $path, string $tables_file_name) : array {
$db_def = array();
$contents = file_get_contents($path."/".$tables_file_name);
if (!$contents) {
return(array());
}
$db_def = json_decode($contents, true);
if (!$db_def) {
return(array());
}
return($db_def);
}
// Compare two definitions
// Report based on the first array
// Return Array
function mustal_compare_table_array(array $nominal, string $nominal_name, array $actual, string $actual_name, bool $check_column_definitions, bool $utf8fix) : array {
$compare_differences = array();
if($utf8fix) {
$column_collation_aliases = array(
['utf8mb3_general_ci','utf8_general_ci'],
['utf8mb3_unicode_ci','utf8_unicode_ci'],
['utf8mb3_bin','utf8_bin']
);
} else {
$column_collation_aliases = array();
}
foreach ($nominal['tables'] as $database_table) {
$found_table = array();
foreach ($actual['tables'] as $compare_table) {
if ($database_table['name'] == $compare_table['name']) {
$found_table = $compare_table;
break;
}
}
unset($compare_table);
if ($found_table) {
// Check type table vs view
if ($database_table['type'] != $found_table['type']) {
$compare_difference = array();
$compare_difference['type'] = "Table type";
$compare_difference['table'] = $database_table['name'];
$compare_difference[$nominal_name] = $database_table['type'];
$compare_difference[$actual_name] = $found_table['type'];
$compare_differences[] = $compare_difference;
}
// Only BASE TABLE supported now
if ($found_table['type'] != 'BASE TABLE') {
continue;
}
// Check columns
$compare_table_columns = array_column($found_table['columns'],'Field');
foreach ($database_table['columns'] as $column) {
$column_name_to_find = $column['Field'];
$column_key = array_search($column_name_to_find,$compare_table_columns,true);
if ($column_key !== false) {
// Compare the properties of the columns
if ($check_column_definitions) {
$found_column = $found_table['columns'][$column_key];
foreach ($column as $key => $value) {
// Apply aliases
if (!empty($column_collation_aliases)) {
foreach($column_collation_aliases as $column_collation_alias) {
if ($value == $column_collation_alias[0]) {
$value = $column_collation_alias[1];
}
if ($found_column[$key] == $column_collation_alias[0]) {
$found_column[$key] = $column_collation_alias[1];
}
}
}
if ($found_column[$key] != $value) {
if ($key != 'Key') { // Keys will be handled separately
$compare_difference = array();
$compare_difference['type'] = "Column definition";
$compare_difference['table'] = $database_table['name'];
$compare_difference['column'] = $column['Field'];
$compare_difference['property'] = $key;
$compare_difference[$nominal_name] = $value;
$compare_difference[$actual_name] = $found_column[$key];
$compare_differences[] = $compare_difference;
}
}
}
unset($value);
} // $check_column_definitions
} else {
$compare_difference = array();
$compare_difference['type'] = "Column existence";
$compare_difference['table'] = $database_table['name'];
$compare_difference[$nominal_name] = $column['Field'];
$compare_differences[] = $compare_difference;
}
}
unset($column);
// Check keys
$compare_table_sql_indexs = array_column($found_table['keys'],'Key_name');
foreach ($database_table['keys'] as $sql_index) {
$sql_index_name_to_find = $sql_index['Key_name'];
$sql_index_key = array_search($sql_index_name_to_find,$compare_table_sql_indexs,true);
if ($sql_index_key !== false) {
// Compare the properties of the sql_indexs
if ($check_column_definitions) {
$found_sql_index = $found_table['keys'][$sql_index_key];
foreach ($sql_index as $key => $value) {
if ($found_sql_index[$key] != $value) {
// if ($key != 'permissions') {
$compare_difference = array();
$compare_difference['type'] = "Key definition";
$compare_difference['table'] = $database_table['name'];
$compare_difference['key'] = $sql_index['Key_name'];
$compare_difference['property'] = $key;
$compare_difference[$nominal_name] = implode(',',$value);
$compare_difference[$actual_name] = implode(',',$found_sql_index[$key]);
$compare_differences[] = $compare_difference;
// }
}
}
unset($value);
} // $check_sql_index_definitions
} else {
$compare_difference = array();
$compare_difference['type'] = "Key existence";
$compare_difference['table'] = $database_table['name'];
$compare_difference[$nominal_name] = $sql_index['Key_name'];
$compare_differences[] = $compare_difference;
}
}
unset($sql_index);
} else {
$compare_difference = array();
$compare_difference['type'] = "Table existence";
$compare_difference[$nominal_name] = $database_table['name'];
$compare_differences[] = $compare_difference;
}
}
unset($database_table);
foreach ($nominal['views'] as $database_view) {
$found_view = array();
foreach ($actual['views'] as $compare_view) {
if ($database_view['name'] == $compare_view['name']) {
$found_view = $compare_view;
break;
}
}
unset($compare_view);
if ($found_view) {
if (trim($database_view['Create']) != trim($found_view['Create'])) {
$compare_difference = array();
$compare_difference['type'] = "View definition";
$compare_difference[$nominal_name] = $database_view['name'];
$compare_differences[] = $compare_difference;
}
} else {
$compare_difference = array();
$compare_difference['type'] = "View existence";
$compare_difference[$nominal_name] = $database_view['name'];
$compare_differences[] = $compare_difference;
}
}
return($compare_differences);
}
// Generate SQL to create or modify column
function mustal_column_sql_definition(string $table_name, array $column, array $reserved_words_without_quote) : string {
foreach($column as $key => &$value) {
$value = (string) $value;
$value = mustal_column_sql_create_property_definition($key,$value,$reserved_words_without_quote);
}
// Default handling here
if ($column['Default'] == " DEFAULT ''") {
$column['Default'] = "";
}
$sql =
$column['Type'].
$column['Null'].
$column['Default'].
$column['Extra'].
$column['Collation'];
return($sql);
}
// Generate SQL to modify a single column property
function mustal_column_sql_create_property_definition(string $property, string $property_value, array $reserved_words_without_quote) : string {
switch ($property) {
case 'Type':
break;
case 'Null':
if ($property_value == "NO") {
$property_value = " NOT NULL"; // Idiotic...
}
if ($property_value == "YES") {
$property_value = " NULL"; // Also Idiotic...
}
break;
case 'Default':
// Check for MYSQL function mustal_call as default
if (in_array(strtolower($property_value),$reserved_words_without_quote)) {
$quote = "";
} else {
// Remove quotes if there are
$property_value = trim($property_value,"'");
$quote = "'";
}
$property_value = " DEFAULT $quote".$property_value."$quote";
break;
case 'Extra':
if ($property_value != '') {
$property_value = " ".$property_value;
}
break;
case 'Collation':
if ($property_value != '') {
$property_value = " COLLATE ".$property_value;
}
break;
default:
$property_value = "";
break;
}
return($property_value);
}
// Replaces different variants of the same function mustal_to allow comparison
function mustal_sql_replace_reserved_functions(array &$column, array $replacers) {
$result = strtolower($column['Default']);
foreach ($replacers as $replace) {
if ($result == $replace[0]) {
$result = $replace[1];
}
}
$column['Default'] = $result;
$result = strtolower($column['Extra']);
foreach ($replacers as $replace) {
if ($result == $replace[0]) {
$result = $replace[1];
}
}
$column['Extra'] = $result;
}
// Is it a text type? -> Use quotes then
function mustal_mysql_put_text_type_in_quotes(string $checktype, string $value) : string {
$types = array('char','varchar','tinytext','text','mediumtext','longtext');
foreach($types as $type) {
if (stripos($checktype, $type) !== false) {
return("'".$value."'");
}
}
return($value);
}
function mustal_implode_with_quote(string $quote, string $delimiter, array $array_to_implode) : string {
return($quote.implode($quote.$delimiter.$quote, $array_to_implode).$quote);
}
// Calculate the sql neccessary to update the database
// returns array(code,text)
// Error codes:
// 0 ok
// 1 Upgrade type of table not supported
// 2 Error on table upgrade
// 3 Error on column existence upgrade
// 4 Error on column existence upgrade
// 5 Error on column definition upgrade
// 6 Error on column definition upgrade
// 7 Error on key existence upgrade
// 8 Error on key existence upgrade
// 9 Error on key definition upgrade
// 10 Error on key definition upgrade
// 11 Table type upgrade not supported
// 12 Upgrade type not supported
function mustal_calculate_db_upgrade(array $compare_def, array $db_def, array &$upgrade_sql, array $replacers) : array {
$result = array();
$upgrade_sql = array();
$compare_differences = mustal_compare_table_array($compare_def,"in JSON",$db_def,"in DB",true,true);
foreach ($compare_differences as $compare_difference) {
$drop_view = false;
switch ($compare_difference['type']) {
case 'Table existence':
// Get table definition from JSON
$table_name = $compare_difference['in JSON'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
switch ($table['type']) {
case 'BASE TABLE':
// Create table in DB
$sql = "";
$sql = "CREATE TABLE `".$table['name']."` (";
$comma = "";
foreach ($table['columns'] as $column) {
$sql .= $comma."`".$column['Field']."` ".mustal_column_sql_definition($table_name, $column,array_column($replacers,1));
$comma = ", ";
}
// Add keys
$comma = ", ";
foreach ($table['keys'] as $key) {
if ($key['Key_name'] == 'PRIMARY') {
$keystring = "PRIMARY KEY ";
} else {
if(array_key_exists('Index_type', $key)) {
$index_type = $key['Index_type'];
} else {
$index_type = "";
}
$keystring = $index_type." KEY `".$key['Key_name']."` ";
}
$sql .= $comma.$keystring."(`".implode("`,`",$key['columns'])."`) ";
}
$sql .= ")";
$upgrade_sql[] = $sql;
break;
default:
$result[] = array(1,"Upgrade type '".$table['type']."' on table '".$table['name']."' not supported.");
break;
}
} else {
$result[] = array(2,"Error table_key while creating upgrade for table existence `$table_name`.");
}
break;
case 'Column existence':
$table_name = $compare_difference['table'];
$column_name = $compare_difference['in JSON'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
$columns = $table['columns'];
$column_key = array_search($column_name,array_column($columns,'Field'));
if ($column_key !== false) {
$column = $table['columns'][$column_key];
$sql = "ALTER TABLE `$table_name` ADD COLUMN `".$column_name."` ";
$sql .= mustal_column_sql_definition($table_name, $column, array_column($replacers,1));
$sql .= ";";
$upgrade_sql[] = $sql;
}
else {
$result[] = array(3,"Error column_key while creating column '$column_name' in table '".$table['name']."'.");
}
}
else {
$result[] = array(4,"Error table_key while creating upgrade for column existence '$column_name' in table '$table_name'.");
}
// Add Column in DB
break;
case 'Column definition':
$table_name = $compare_difference['table'];
$column_name = $compare_difference['column'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
$columns = $table['columns'];
$column_names = array_column($columns,'Field');
$column_key = array_search($column_name,$column_names);
if ($column_key !== false) {
$column = $table['columns'][$column_key];
$sql = "ALTER TABLE `$table_name` MODIFY COLUMN `".$column_name."` ";
$sql .= mustal_column_sql_definition($table_name, $column,array_column($replacers,1));
$sql .= ";";
$upgrade_sql[] = $sql;
}
else {
$result[] = array(5,"Error column_key while modifying column '$column_name' in table '".$table['name']."'.");
}
}
else {
$result[] = array(6,"Error table_key while modifying column '$column_name' in table '$table_name'.");
return(6);
}
// Modify Column in DB
break;
case 'Key existence':
$table_name = $compare_difference['table'];
$key_name = $compare_difference['in JSON'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
$keys = $table['keys'];
$key_names = array_column($keys,'Key_name');
$key_key = array_search($key_name,$key_names);
if ($key_key !== false) {
$key = $table['keys'][$key_key];
$sql = "ALTER TABLE `$table_name` ADD KEY `".$key_name."` ";
$sql .= "(`".implode("`,`",$key['columns'])."`)";
$sql .= ";";
$upgrade_sql[] = $sql;
}
else {
$result[] = array(7,"Error key_key while adding key '$key_name' in table '".$table['name']."'.");
}
}
else {
$result[] = array(8,"Error table_key while adding key '$key_name' in table '$table_name'.");
}
break;
case "Key definition":
$table_name = $compare_difference['table'];
$key_name = $compare_difference['key'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
$keys = $table['keys'];
$key_names = array_column($keys,'Key_name');
$key_key = array_search($key_name,$key_names);
if ($key_key !== false) {
$key = $table['keys'][$key_key];
$sql = "ALTER TABLE `$table_name` DROP KEY `".$key_name."`;";
$upgrade_sql[] = $sql;
$sql = "ALTER TABLE `$table_name` ADD KEY `".$key_name."` ";
$sql .= "(`".implode("`,`",$key['columns'])."`)";
$sql .= ";";
$upgrade_sql[] = $sql;
}
else {
$result[] = array(9, "Error key_key while changing key '$key_name' in table '".$table['name']."'.");
}
}
else {
$result[] = array(10,"Error table_key while changing key '$key_name' in table '$table_name'.");
}
break;
case 'Table count':
// Nothing to do
break;
case 'Table type':
$result[] = array(11,"Upgrade type '".$compare_difference['type']."' on table '".$compare_difference['table']."' not supported.");
break;
case 'View definition':
$drop_view = true;
// intentionally omitted break;
case 'View existence':
$view_name = $compare_difference['in JSON'];
$view_key = array_search($view_name,array_column($compare_def['views'],'name'));
if ($view_key !== false) {
$view = $compare_def['views'][$view_key];
switch ($view['type']) {
case 'VIEW':
if ($drop_view === true) {
$sql = "DROP VIEW ".$view['name'];
$upgrade_sql[] = $sql;
}
// Create view in DB
$upgrade_sql[] = $view['Create'];
break;
default:
$result[] = array(1,"Upgrade type '".$view['type']."' on view '".$view['name']."' not supported.");
break;
}
} else {
$result[] = array(2,"Error view_key while creating upgrade for view existence `$view_name`.");
}
break;
default:
$result[] = array(12,"Upgrade type '".$compare_difference['type']."' not supported.");
break;
}
}
$upgrade_sql = array_unique($upgrade_sql);
if (count($upgrade_sql) > 0) {
array_unshift($upgrade_sql,"SET SQL_MODE='ALLOW_INVALID_DATES';","SET SESSION innodb_strict_mode=OFF;");
}
return($result);
}
+1 -1
View File
@@ -1,7 +1,7 @@
<?php
$version="OSS";
$version_revision="1.5";
$version_revision="1.7";
$githash = file_get_contents("../githash.txt");
if (!empty($githash)) {
$version_revision .= " (".substr($githash,0,8).")";
+26
View File
@@ -0,0 +1,26 @@
# Generated file from class.acl.php
# Disable directory browsing
Options -Indexes
# Deny access to all *.php
Order deny,allow
Allow from all
<FilesMatch "\.(css|jpg|jpeg|gif|png|svg|js)$">
Order Allow,Deny
Allow from all
</FilesMatch>
# Allow access to index.php
<Files index.php>
Order Allow,Deny
Allow from all
</Files>
# Allow access to setup.php
<Files setup.php>
Order Allow,Deny
Allow from all
</Files>
# Allow access to inline PDF viewer
<Files viewer.html>
Order Allow,Deny
Allow from all
</Files>
# end
+51 -5349
View File
File diff suppressed because it is too large Load Diff
+173 -166
View File
@@ -54,6 +54,11 @@ class Briefpapier extends SuperFPDF {
/** @var array **/
private $styleData;
// Typed variables to get rid of the typos, $border omitted intenionally
function Cell_typed(int $w, int $h = 0, string $txt = '', $border = 0, int $ln = 0, string $align = '', bool $fill = false, string $link = '') {
return($this->Cell($w,$h,$txt,$border,$ln,$align,$fill,$link));
}
/**
* Briefpapier constructor.
*
@@ -1006,9 +1011,9 @@ class Briefpapier extends SuperFPDF {
$this->cMargin=-3;
if($this->getStyleElement("seite_belegnr"))
$this->Cell(0,8,$this->app->erp->Beschriftung("dokument_seite").' '.$this->PageNo().' '.$this->app->erp->Beschriftung("dokument_seitevon").' {nb} '.$this->zusatzfooter,0,0,$this->seite_von_ausrichtung);
$this->Cell_typed(0,8,$this->app->erp->Beschriftung("dokument_seite").' '.$this->PageNo().' '.$this->app->erp->Beschriftung("dokument_seitevon").' {nb} '.$this->zusatzfooter,0,0,$this->seite_von_ausrichtung);
else
$this->Cell(0,8,$this->app->erp->Beschriftung("dokument_seite").' '.$this->PageNo().' '.$this->app->erp->Beschriftung("dokument_seitevon").' {nb}',0,0,$this->seite_von_ausrichtung);
$this->Cell_typed(0,8,$this->app->erp->Beschriftung("dokument_seite").' '.$this->PageNo().' '.$this->app->erp->Beschriftung("dokument_seitevon").' {nb}',0,0,$this->seite_von_ausrichtung);
$this->cMargin = $tmpc;
@@ -1836,8 +1841,10 @@ class Briefpapier extends SuperFPDF {
//$this->setStationery("/home/eproo/eproo-master/app/main/www/lib/dokumente/demo.pdf");
$this->SetDisplayMode("real","single");
/*
if($this->getStyleElement("abstand_seitenrandrechts")=="")
$this->getStyleElementSet("abstand_seitenrandrechts",$this->getStyleElement("abstand_seitenrandlinks"));
*/
$this->SetMargins($this->getStyleElement("abstand_seitenrandlinks"),50,$this->getStyleElement("abstand_seitenrandrechts"));
$this->SetAutoPageBreak(true,$this->getStyleElement("abstand_umbruchunten"));
@@ -1886,7 +1893,7 @@ class Briefpapier extends SuperFPDF {
$this->SetTextColor(0,0,0);
if($this->doctype!="lieferschein" && $this->doctype!="preisanfrage" && !$this->nichtsichtbar_summe) {
$this->renderTotals();
} else $this->Cell(1,5,'',0);
} else $this->Cell_typed(1,5,'',0);
}
$this->renderFooter();
$this->logofile = "";
@@ -1928,7 +1935,7 @@ class Briefpapier extends SuperFPDF {
if($this->recipient['anrede']!="" && $this->getStyleElement('typimdokument'))
{
$this->SetX($this->getStyleElement("abstand_adresszeilelinks"));
$this->Cell(80,5,$this->recipient['anrede'],0,1);
$this->Cell_typed(80,5,$this->recipient['anrede'],0,1);
}
$this->SetMargins($this->getStyleElement("abstand_adresszeilelinks"),50);
@@ -1940,10 +1947,10 @@ class Briefpapier extends SuperFPDF {
$array = explode( "\n", wordwrap($this->recipient['enterprise'], $charlimit));
foreach($array as $row)
{
$this->Cell(80,5,$this->app->erp->ReadyForPDF($row),0,1);
$this->Cell_typed(80,5,$this->app->erp->ReadyForPDF($row),0,1);
}
} else {
$this->Cell(80,5,$this->app->erp->ReadyForPDF($this->recipient['enterprise']),0,1);
$this->Cell_typed(80,5,$this->app->erp->ReadyForPDF($this->recipient['enterprise']),0,1);
}
}
@@ -1952,30 +1959,30 @@ class Briefpapier extends SuperFPDF {
if($this->recipient['firstname']!="")
{
$this->SetX($this->getStyleElement("abstand_adresszeilelinks"));
$this->Cell(80,5,$this->recipient['firstname'],0,1);
$this->Cell_typed(80,5,$this->recipient['firstname'],0,1);
}
if($this->recipient['address2']!="") {
$this->SetX($this->getStyleElement("abstand_adresszeilelinks"));
$this->Cell(80,5,$this->recipient['address2'],0,1);
$this->Cell_typed(80,5,$this->recipient['address2'],0,1);
}
if($this->recipient['address3']!="")
{
$this->SetX($this->getStyleElement("abstand_adresszeilelinks"));
$this->Cell(80,5,$this->recipient['address3'],0,1);
$this->Cell_typed(80,5,$this->recipient['address3'],0,1);
}
if($this->recipient['address4']!="")
{
$this->SetX($this->getStyleElement("abstand_adresszeilelinks"));
$this->Cell(80,5,$this->recipient['address4'],0,1);
$this->Cell_typed(80,5,$this->recipient['address4'],0,1);
}
//$this->Cell(80,5,$this->recipient['firstname']." ".$this->recipient['familyname'],0,1);
//$this->Cell_typed(80,5,$this->recipient['firstname']." ".$this->recipient['familyname'],0,1);
$this->SetX($this->getStyleElement("abstand_adresszeilelinks"));
$this->Cell(80,5,$this->recipient['address1'],0,1);
$this->Cell_typed(80,5,$this->recipient['address1'],0,1);
$this->SetFont($this->GetFont(),'',10);
@@ -1987,22 +1994,22 @@ class Briefpapier extends SuperFPDF {
$inland = $this->getStyleElement("land");
if($this->recipient['country']!=$inland)
{
//$this->Cell(80,5,$this->recipient['country']."-".$this->recipient['areacode']." ".$this->recipient['city'],0,1);
//$this->Cell_typed(80,5,$this->recipient['country']."-".$this->recipient['areacode']." ".$this->recipient['city'],0,1);
if(function_exists('mb_strtoupper'))
$this->Cell(80,5,mb_strtoupper($this->recipient['areacode']." ".$this->recipient['city'],"UTF-8"),0,1);
$this->Cell_typed(80,5,mb_strtoupper($this->recipient['areacode']." ".$this->recipient['city'],"UTF-8"),0,1);
else
$this->Cell(80,5,strtoupper($this->recipient['areacode']." ".$this->recipient['city']),0,1);
$this->Cell_typed(80,5,strtoupper($this->recipient['areacode']." ".$this->recipient['city']),0,1);
$this->SetX($this->getStyleElement("abstand_adresszeilelinks"));
$this->Cell(80,5,strtoupper($this->app->erp->UmlauteEntfernen($this->app->GetLandLang($this->recipient['country'],$this->sprache))),0,1);
$this->Cell_typed(80,5,strtoupper($this->app->erp->UmlauteEntfernen($this->app->GetLandLang($this->recipient['country'],$this->sprache))),0,1);
}
else {
$this->Cell(80,5,$this->recipient['areacode']." ".$this->recipient['city'],0,1);
$this->Cell_typed(80,5,$this->recipient['areacode']." ".$this->recipient['city'],0,1);
}
//$this->SetFont($this->GetFont(),'',9);
//if(isset($this->recipient['country'])) $this->Cell(80,5,$this->recipient['country'],0,1);
//if(isset($this->recipient['country'])) $this->Cell_typed(80,5,$this->recipient['country'],0,1);
//FREITEXT1
@@ -2074,9 +2081,9 @@ class Briefpapier extends SuperFPDF {
$this->SetX($this->getStyleElement("abstand_adresszeilelinks"));
if($this->getStyleElement("absenderunterstrichen")=="1")
$this->Cell($this->GetStringWidth($cellStr)+2,5,$cellStr,'B');
$this->Cell_typed($this->GetStringWidth($cellStr)+2,5,$cellStr,'B');
else
$this->Cell($this->GetStringWidth($cellStr)+2,5,$cellStr,'');
$this->Cell_typed($this->GetStringWidth($cellStr)+2,5,$cellStr,'');
}
if($this->nichtsichtbar_rechtsoben!=true)
@@ -2088,70 +2095,70 @@ class Briefpapier extends SuperFPDF {
$this->SetXY($xOffset,10);
$this->SetFont($this->GetFont(),'',9);
$this->Cell(30,$lineHeight,"Name der Gesellschaft: ",0,0,'R');
$this->Cell_typed(30,$lineHeight,"Name der Gesellschaft: ",0,0,'R');
$this->SetFont($this->GetFont(),'B',9);
$this->Cell(60,$lineHeight,$this->sender['enterprise'],0,2);
$this->Cell_typed(60,$lineHeight,$this->sender['enterprise'],0,2);
if(isset($this->sender['enterprise2']))
$this->Cell(60,$lineHeight,$this->sender['enterprise2'],0,2);
$this->Cell_typed(60,$lineHeight,$this->sender['enterprise2'],0,2);
$this->SetXY($xOffset,$this->GetY());
$this->SetFont($this->GetFont(),'',9);
$this->Cell(30,$lineHeight,"Sitz der Gesellschaft: ",0,0,'R');
$this->Cell_typed(30,$lineHeight,"Sitz der Gesellschaft: ",0,0,'R');
$this->SetFont($this->GetFont(),'B',9);
$this->Cell(60,$lineHeight,$this->sender['address1'],0,2);
$this->Cell_typed(60,$lineHeight,$this->sender['address1'],0,2);
if(isset($this->sender['address2']))
$this->Cell(60,$lineHeight,$this->sender['address2'],0,2);
$this->Cell(60,$lineHeight,$this->sender['areacode']." ".$this->sender['city'],0,2);
$this->Cell_typed(60,$lineHeight,$this->sender['address2'],0,2);
$this->Cell_typed(60,$lineHeight,$this->sender['areacode']." ".$this->sender['city'],0,2);
$this->SetXY($xOffset,$this->GetY()+$absatz); //abstand
$this->SetFont($this->GetFont(),'',9);
if(isset($this->sender['phone1'])) {
$this->Cell(30,$lineHeight,"Fon: ",0,0,'R');
$this->Cell(60,$lineHeight,$this->sender['phone1'],0,2);
$this->Cell_typed(30,$lineHeight,"Fon: ",0,0,'R');
$this->Cell_typed(60,$lineHeight,$this->sender['phone1'],0,2);
}
if(isset($this->sender['fax'])) {
$this->SetXY($xOffset,$this->GetY());
$this->Cell(30,$lineHeight,"Fax: ",0,0,'R');
$this->Cell(60,$lineHeight,$this->sender['fax'],0,2);
$this->Cell_typed(30,$lineHeight,"Fax: ",0,0,'R');
$this->Cell_typed(60,$lineHeight,$this->sender['fax'],0,2);
}
$this->SetXY($xOffset, $this->GetY()+$absatz); //abstand
if(isset($this->sender['email'])) {
$this->Cell(30,$lineHeight,"Mail: ",0,0,'R');
$this->Cell(60,$lineHeight,$this->sender['email'],0,2);
$this->Cell_typed(30,$lineHeight,"Mail: ",0,0,'R');
$this->Cell_typed(60,$lineHeight,$this->sender['email'],0,2);
}
if(isset($this->sender['web'])) {
$this->SetXY($xOffset,$this->GetY());
$this->Cell(30,$lineHeight,"Web: ",0,0,'R');
$this->Cell(60,$lineHeight,$this->sender['web'],0,2);
$this->Cell_typed(30,$lineHeight,"Web: ",0,0,'R');
$this->Cell_typed(60,$lineHeight,$this->sender['web'],0,2);
}
$this->SetXY($xOffset, $this->GetY()+$absatz); //abstand
if(isset($this->sender['ustid'])) {
$this->Cell(30,$lineHeight,"UST-ID: ",0,0,'R');
$this->Cell(60,$lineHeight,$this->sender['ustid'],0,2);
$this->Cell_typed(30,$lineHeight,"UST-ID: ",0,0,'R');
$this->Cell_typed(60,$lineHeight,$this->sender['ustid'],0,2);
}
if(isset($this->sender['taxnr'])) {
$this->SetXY($xOffset,$this->GetY());
$this->Cell(30,$lineHeight,"Steuer-Nr.: ",0,0,'R');
$this->Cell(60,$lineHeight,$this->sender['taxnr'],0,2);
$this->Cell_typed(30,$lineHeight,"Steuer-Nr.: ",0,0,'R');
$this->Cell_typed(60,$lineHeight,$this->sender['taxnr'],0,2);
}
if(isset($this->sender['hreg'])) {
$this->SetXY($xOffset,$this->GetY());
$this->Cell(30,$lineHeight,"Handelsregister: ",0,0,'R');
$this->Cell(60,$lineHeight,$this->sender['hreg'],0,2);
$this->Cell_typed(30,$lineHeight,"Handelsregister: ",0,0,'R');
$this->Cell_typed(60,$lineHeight,$this->sender['hreg'],0,2);
}
$this->SetXY($xOffset,$this->GetY());
$this->Cell(30,$lineHeight,utf8_encode("Geschftsfhrung: "),0,0,'R');
$this->Cell(60,$lineHeight,$this->sender['firstname'].' '.$this->sender['familyname'],0,2);
$this->Cell_typed(30,$lineHeight,utf8_encode("Geschftsfhrung: "),0,0,'R');
$this->Cell_typed(60,$lineHeight,$this->sender['firstname'].' '.$this->sender['familyname'],0,2);
//$this->SetXY($xOffset, $this->GetY()+$absatz+2); //abstand
//$this->Cell(30,$lineHeight,"Datum: ",0,0,'R');
//$this->Cell(60,$lineHeight,utf8_encode($date),0,2);
//$this->Cell_typed(30,$lineHeight,"Datum: ",0,0,'R');
//$this->Cell_typed(60,$lineHeight,utf8_encode($date),0,2);
}
}
@@ -2270,7 +2277,7 @@ class Briefpapier extends SuperFPDF {
$this->SetFont($this->GetFont(),'B',$betreffszeile);
$this->SetY($this->GetY()+$this->abstand_betreffzeileoben);
//$this->Cell(85,6,$this->doctypeOrig);
//$this->Cell_typed(85,6,$this->doctypeOrig);
$this->MultiCell(210-83+$this->abstand_boxrechtsoben_lr-$this->getStyleElement("abstand_seitenrandlinks")-5,6,html_entity_decode($this->doctypeOrig,ENT_QUOTES),0,'L');
$this->SetY($this->GetY()-$this->abstand_betreffzeileoben);
@@ -2593,76 +2600,76 @@ class Briefpapier extends SuperFPDF {
$this->SetX($this->getStyleElement('abstand_seitenrandlinks')+1); // eventuell einstellbar per GUI
$this->SetFont($this->GetFont(),'B',$tabellenbeschriftung);
$this->Cell($posWidth,6,$this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_position'),0,0,'C'));
$this->Cell_typed($posWidth,6,$this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_position'),0,0,'C'));
if($this->doctype!='arbeitsnachweis')
{
if($this->doctype=='zahlungsavis')
{
$this->Cell($itemNoWidth,6,'Nummer');
$this->Cell($descWidth-$einheitWidth+$taxWidth+$priceWidth+$rabattWidth,6,'Beleg');
$this->Cell_typed($itemNoWidth,6,'Nummer');
$this->Cell_typed($descWidth-$einheitWidth+$taxWidth+$priceWidth+$rabattWidth,6,'Beleg');
$this->Cell($amWidth,6,'',0,0,'R');
$this->Cell_typed($amWidth,6,'',0,0,'R');
}
else {
$this->Cell($itemNoWidth,6,$this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_artikelnummer')));
$this->Cell_typed($itemNoWidth,6,$this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_artikelnummer')));
if($this->getStyleElement('artikeleinheit')=='1'){
$this->Cell($descWidth - $einheitWidth, 6, $this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_artikel')));
$this->Cell_typed($descWidth - $einheitWidth, 6, $this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_artikel')));
}
else{
$this->Cell($descWidth, 6, $this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_artikel')));
$this->Cell_typed($descWidth, 6, $this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_artikel')));
}
$this->Cell($amWidth,6,$this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_menge')),0,0,'R');
$this->Cell_typed($amWidth,6,$this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_menge')),0,0,'R');
}
} else {
$this->Cell($taxWidth,6,'Mitarbeiter');
$this->Cell($itemNoWidth,6,'Ort');
$this->Cell($descWidth,6,'Tätigkeit');
$this->Cell($amWidth,6,'Stunden',0,0,'R');
$this->Cell_typed($taxWidth,6,'Mitarbeiter');
$this->Cell_typed($itemNoWidth,6,'Ort');
$this->Cell_typed($descWidth,6,'Tätigkeit');
$this->Cell_typed($amWidth,6,'Stunden',0,0,'R');
}
if($this->doctype!='lieferschein' && $this->doctype!='arbeitsnachweis' && $this->doctype!='produktion' && $this->doctype!='zahlungsavis' && $this->doctype!='preisanfrage'){
if($this->getStyleElement('artikeleinheit')=='1'){
$this->Cell($einheitWidth, 6, $this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_einheit')), 0, 0, 'R');
$this->Cell_typed($einheitWidth, 6, $this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_einheit')), 0, 0, 'R');
}
if($this->ust_spalteausblende){
$this->Cell($taxWidth, 6, '', 0, 0, 'R');
$this->Cell_typed($taxWidth, 6, '', 0, 0, 'R');
}
else{
$this->Cell($taxWidth, 6, $this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_mwst')), 0, 0, 'R');
$this->Cell_typed($taxWidth, 6, $this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_mwst')), 0, 0, 'R');
}
if($this->getStyleElement('artikeleinheit')=='1'){
if(!$inventurohnepreis){
$this->Cell($priceWidth, 6, $this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_einzel')), 0, 0, 'R');
$this->Cell_typed($priceWidth, 6, $this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_einzel')), 0, 0, 'R');
}
}
else{
if(!$inventurohnepreis){
$this->Cell($priceWidth, 6, $this->app->erp->ParseUserVars($this->doctype, $this->id,$this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_stueck'))), 0, 0, 'R');
$this->Cell_typed($priceWidth, 6, $this->app->erp->ParseUserVars($this->doctype, $this->id,$this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_stueck'))), 0, 0, 'R');
}
}
if($this->rabatt=='1') {
if(!$inventurohnepreis){
$this->Cell($rabattWidth,6,$this->app->erp->Beschriftung('dokument_rabatt'),0,0,'R');
$this->Cell($sumWidth,6,$this->app->erp->ParseUserVars($this->doctype, $this->id,$this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_gesamt'))),0,0,'R');
$this->Cell_typed($rabattWidth,6,$this->app->erp->Beschriftung('dokument_rabatt'),0,0,'R');
$this->Cell_typed($sumWidth,6,$this->app->erp->ParseUserVars($this->doctype, $this->id,$this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_gesamt'))),0,0,'R');
}
} else {
if(!$inventurohnepreis){
$this->Cell($sumWidth,6,$this->app->erp->ParseUserVars($this->doctype, $this->id,$this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_gesamt'))),0,0,'R');
$this->Cell_typed($sumWidth,6,$this->app->erp->ParseUserVars($this->doctype, $this->id,$this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_gesamt'))),0,0,'R');
}
}
}
else if ($this->doctype=='lieferschein' || $this->doctype=='preisanfrage')
{
if($this->getStyleElement("artikeleinheit")=='1'){
$this->Cell($einheitWidth, 6, $this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_einheit')), 0, 0, 'R');
$this->Cell_typed($einheitWidth, 6, $this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_einheit')), 0, 0, 'R');
}
}
else if ($this->doctype=='zahlungsavis')
{
$this->Cell($sumWidth,6,$this->app->erp->ParseUserVars($this->doctype, $this->id,$this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_gesamt'))),0,0,'R');
$this->Cell_typed($sumWidth,6,$this->app->erp->ParseUserVars($this->doctype, $this->id,$this->app->erp->ReadyForPDF($this->app->erp->Beschriftung('dokument_gesamt'))),0,0,'R');
}
$this->Ln();
@@ -2748,7 +2755,7 @@ class Briefpapier extends SuperFPDF {
$posWidthold = $posWidth;
if($belege_stuecklisteneinrueckenmm && $newlvl > 0)
{
$this->Cell($belege_stuecklisteneinrueckenmm * $newlvl,$cellhoehe,'');
$this->Cell_typed($belege_stuecklisteneinrueckenmm * $newlvl,$cellhoehe,'');
$posWidth -= $belege_stuecklisteneinrueckenmm * $newlvl;
if($posWidth < 2* strlen($posstr))
{
@@ -2760,11 +2767,11 @@ class Briefpapier extends SuperFPDF {
if($belege_subpositionenstuecklisten)$posstr = $this->CalcPosString($posstr,$oldpostr, $hauptnummer, $oldlvl, $newlvl);
$oldpostr = $posstr;
$oldlvl = isset($item['lvl'])?(int)$item['lvl']:0;
$this->Cell($posWidth,$cellhoehe,$posstr,0,0,$belege_stuecklisteneinrueckenmm?'':'C');
$this->Cell_typed($posWidth,$cellhoehe,$posstr,0,0,$belege_stuecklisteneinrueckenmm?'':'C');
//artikelnummer
if($this->doctype==='arbeitsnachweis')
{
$this->Cell($taxWidth,$cellhoehe,trim($item['person']),0);
$this->Cell_typed($taxWidth,$cellhoehe,trim($item['person']),0);
$zeilenuntertext = $this->getStyleElement('zeilenuntertext');
$this->SetFont($this->GetFont(),'',$zeilenuntertext);
@@ -2785,10 +2792,10 @@ class Briefpapier extends SuperFPDF {
$this->SetFont($this->GetFont(), '', $tabelleninhalt);
}
if(isset($item['itemno'])) {
$this->Cell($itemNoWidth,$cellhoehe,$item['itemno'],0);
$this->Cell_typed($itemNoWidth,$cellhoehe,$item['itemno'],0);
}
else {
$this->Cell($itemNoWidth);
$this->Cell_typed($itemNoWidth);
}
$this->SetFont($this->GetFont(),'',$tabelleninhalt);
}
@@ -2837,10 +2844,10 @@ class Briefpapier extends SuperFPDF {
// Menge
if($this->doctype==='zahlungsavis'){
$this->Cell($amWidth, $cellhoehe, '', 0, 0, 'R');
$this->Cell_typed($amWidth, $cellhoehe, '', 0, 0, 'R');
}
else{
$this->Cell($amWidth, $cellhoehe, $item['amount'], 0, 0, 'R');
$this->Cell_typed($amWidth, $cellhoehe, $item['amount'], 0, 0, 'R');
}
if($this->doctype!=='lieferschein' && $this->doctype!=='arbeitsnachweis' && $this->doctype!=='produktion' && $this->doctype!=='preisanfrage') {
@@ -2877,7 +2884,7 @@ class Briefpapier extends SuperFPDF {
}
}
$this->Cell($einheitWidth,$cellhoehe,$this->app->erp->ReadyForPDF($einheit),0,0,'R');
$this->Cell_typed($einheitWidth,$cellhoehe,$this->app->erp->ReadyForPDF($einheit),0,0,'R');
}
// if($item['tax']=="hidden") $item['tax']=="hidden";
@@ -2905,21 +2912,21 @@ class Briefpapier extends SuperFPDF {
// standard anzeige mit steuer
if(!$this->ust_spalteausblende){
if($item['tax']==='hidden'){
$this->Cell($taxWidth,$cellhoehe,"",0,0,'R');
$this->Cell_typed($taxWidth,$cellhoehe,"",0,0,'R');
} else {
$tax = $item['tax']; //= $tax; //="USTV"?0.19:0.07;
$tax *= 100; $tax = $tax.'%';
if($this->doctype==='zahlungsavis'){
$this->Cell($taxWidth,$cellhoehe,"",0,0,'R');
$this->Cell_typed($taxWidth,$cellhoehe,"",0,0,'R');
}
else{
$this->Cell($taxWidth, $cellhoehe, $item['ohnepreis'] ? '' : $tax, 0, 0, 'R');
$this->Cell_typed($taxWidth, $cellhoehe, $item['ohnepreis'] ? '' : $tax, 0, 0, 'R');
}
}
} else {
//kleinunternehmer
$this->Cell($taxWidth,$cellhoehe,"",0,0,'R');
$this->Cell_typed($taxWidth,$cellhoehe,"",0,0,'R');
}
if($this->doctype!=='lieferschein' && $this->doctype!=='produktion' && $this->doctype!=='preisanfrage') {
@@ -2933,29 +2940,29 @@ class Briefpapier extends SuperFPDF {
//if(($this->anrede=="firma" || $this->app->erp->AnzeigeBelegNetto($this->anrede,$projekt) || $this->doctype=="bestellung" || $this->getStyleElement("immernettorechnungen",$projekt)=="1")
//&& $this->getStyleElement("immerbruttorechnungen",$projekt)!="1")
if(!$inventurohnepreis){
$this->Cell($priceWidth, $cellhoehe, $item['ohnepreis'] ? '' : $this->formatMoney((double)$item['price']), 0, 0, 'R');
$this->Cell_typed($priceWidth, $cellhoehe, $item['ohnepreis'] ? '' : $this->formatMoney((double)$item['price']), 0, 0, 'R');
}
}
else{
if(!$inventurohnepreis){
$this->Cell($priceWidth, $cellhoehe, $item['ohnepreis'] ? '' : $this->formatMoney((double)$item['price'] * $item['tmptax']), 0, 0, 'R');
$this->Cell_typed($priceWidth, $cellhoehe, $item['ohnepreis'] ? '' : $this->formatMoney((double)$item['price'] * $item['tmptax']), 0, 0, 'R');
}
}
} else
{
if($item['ohnepreis']==2) {
if(!$inventurohnepreis){
$this->Cell($priceWidth,$cellhoehe,$item['price'],0,0,'R');
$this->Cell_typed($priceWidth,$cellhoehe,$item['price'],0,0,'R');
}
} // text alternativ zu preis
else {
if(!$inventurohnepreis){
$this->Cell($priceWidth,$cellhoehe,$item['ohnepreis']?'':$this->formatMoney((double)$item['price']),0,0,'R');
$this->Cell_typed($priceWidth,$cellhoehe,$item['ohnepreis']?'':$this->formatMoney((double)$item['price']),0,0,'R');
}
}
}
} else {
$this->Cell($priceWidth,$cellhoehe,"",0,0,'R');
$this->Cell_typed($priceWidth,$cellhoehe,"",0,0,'R');
}
// zentale rabatt spalte
@@ -3023,7 +3030,7 @@ class Briefpapier extends SuperFPDF {
} else {
if($item['rabatt']<>0){
// && $item['keinrabatterlaubt']!="1")
$this->Cell($rabattWidth, $cellhoehe, $item['ohnepreis'] ? '' : $item['rabatt'] . " %", 0, 0, 'R');
$this->Cell_typed($rabattWidth, $cellhoehe, $item['ohnepreis'] ? '' : $item['rabatt'] . " %", 0, 0, 'R');
}
else
{
@@ -3032,13 +3039,13 @@ class Briefpapier extends SuperFPDF {
$rabatt_or_porto = $this->app->DB->Select("SELECT id FROM artikel WHERE
nummer='".$item['itemno']."' AND (porto='1' OR rabatt='1') LIMIT 1");
if($rabatt_or_porto){
$this->Cell($rabattWidth, $cellhoehe, '', 0, 0, 'R');
$this->Cell_typed($rabattWidth, $cellhoehe, '', 0, 0, 'R');
}
else{
$this->Cell($rabattWidth, $cellhoehe, 'SNP', 0, 0, 'R');
$this->Cell_typed($rabattWidth, $cellhoehe, 'SNP', 0, 0, 'R');
}
} else {
$this->Cell($rabattWidth,$cellhoehe,"",0,0,'R');
$this->Cell_typed($rabattWidth,$cellhoehe,"",0,0,'R');
}
}
}
@@ -3046,7 +3053,7 @@ class Briefpapier extends SuperFPDF {
else {
// anzeige ohne zentrale rabatt spalte
if ($item['tax']==="hidden"){
$this->Cell($priceWidth,$cellhoehe,"",0,0,'R');
$this->Cell_typed($priceWidth,$cellhoehe,"",0,0,'R');
}
else {
if($anzeigeBelegNettoAdrese)
@@ -3054,16 +3061,16 @@ class Briefpapier extends SuperFPDF {
// && $this->getStyleElement("immerbruttorechnungen",$projekt)!="1")
{
if(!$inventurohnepreis){
$this->Cell($priceWidth,$cellhoehe,$item['ohnepreis']?'':$this->formatMoney((double)$item['tprice']),0,0,'R');
$this->Cell_typed($priceWidth,$cellhoehe,$item['ohnepreis']?'':$this->formatMoney((double)$item['tprice']),0,0,'R');
}
}
else{
if(!$inventurohnepreis){
$this->Cell($priceWidth, $cellhoehe, $item['ohnepreis'] ? '' : $this->formatMoney((double)$item['tprice'] * $item['tmptax']), 0, 0, 'R');
$this->Cell_typed($priceWidth, $cellhoehe, $item['ohnepreis'] ? '' : $this->formatMoney((double)$item['tprice'] * $item['tmptax']), 0, 0, 'R');
}
}
$this->Cell($rabattWidth,$cellhoehe,"",0,0,'R');
$this->Cell_typed($rabattWidth,$cellhoehe,"",0,0,'R');
}
}
}
@@ -3072,20 +3079,20 @@ class Briefpapier extends SuperFPDF {
// if(($this->anrede=="firma" || $this->app->erp->AnzeigeBelegNetto($this->anrede,$projekt) || $this->doctype=="bestellung" || $this->getStyleElement("immernettorechnungen",$projekt)=="1")
// && $this->getStyleElement("immerbruttorechnungen",$projekt)!="1")
if(!$inventurohnepreis){
$this->Cell($priceWidth,$cellhoehe,$item['ohnepreis']?'':$this->formatMoney((double)$item['price']),0,0,'R');
$this->Cell_typed($priceWidth,$cellhoehe,$item['ohnepreis']?'':$this->formatMoney((double)$item['price']),0,0,'R');
}
else{
if(!$inventurohnepreis){
$this->Cell($priceWidth, $cellhoehe, $item['ohnepreis'] ? '' : $this->formatMoney((double)$item['price'] * $item['tmptax']), 0, 0, 'R');
$this->Cell_typed($priceWidth, $cellhoehe, $item['ohnepreis'] ? '' : $this->formatMoney((double)$item['price'] * $item['tmptax']), 0, 0, 'R');
}
}
}
//$this->Cell($sumWidth,$cellhoehe,$this->formatMoney($item['tprice']).' '.$item['currency'],0,0,'R');
//$this->Cell_typed($sumWidth,$cellhoehe,$this->formatMoney($item['tprice']).' '.$item['currency'],0,0,'R');
if($this->rabatt=='1')
{
//gesamt preis
if ($item['tax']==='hidden'){
$this->Cell($priceWidth,$cellhoehe,'',0,0,'R');
$this->Cell_typed($priceWidth,$cellhoehe,'',0,0,'R');
}
else {
if($this->rabatt=='1'){
@@ -3093,12 +3100,12 @@ class Briefpapier extends SuperFPDF {
//if(($this->anrede=="firma" || $this->app->erp->AnzeigeBelegNetto($this->anrede,$projekt) || $this->doctype=="bestellung" || $this->getStyleElement("immernettorechnungen",$projekt)=="1")
// && $this->getStyleElement("immerbruttorechnungen",$projekt)!="1")
if(!$inventurohnepreis){
$this->Cell($sumWidth, $cellhoehe, $item['ohnepreis'] ? '' : $this->formatMoney((double)$item['tprice']), 0, 0, 'R');
$this->Cell_typed($sumWidth, $cellhoehe, $item['ohnepreis'] ? '' : $this->formatMoney((double)$item['tprice']), 0, 0, 'R');
}
}
else{
if(!$inventurohnepreis){
$this->Cell($sumWidth, $cellhoehe, $item['ohnepreis'] ? '' : $this->formatMoney((double)$item['tprice'] * $item['tmptax']), 0, 0, 'R');
$this->Cell_typed($sumWidth, $cellhoehe, $item['ohnepreis'] ? '' : $this->formatMoney((double)$item['tprice'] * $item['tmptax']), 0, 0, 'R');
}
}
}
@@ -3107,12 +3114,12 @@ class Briefpapier extends SuperFPDF {
// if(($this->anrede=="firma" || $this->app->erp->AnzeigeBelegNetto($this->anrede,$projekt) || $this->doctype=="bestellung" || $this->getStyleElement("immernettorechnungen",$projekt)=="1")
// && $this->getStyleElement("immerbruttorechnungen",$projekt)!="1")
if(!$inventurohnepreis){
$this->Cell($sumWidth, $cellhoehe, $item['ohnepreis'] ? '' : $this->formatMoney((double)$item['tprice']), 0, 0, 'R');
$this->Cell_typed($sumWidth, $cellhoehe, $item['ohnepreis'] ? '' : $this->formatMoney((double)$item['tprice']), 0, 0, 'R');
}
}
else{
if(!$inventurohnepreis){
$this->Cell($sumWidth, $cellhoehe, $item['ohnepreis'] ? '' : $this->formatMoney((double)$item['tprice'] * $item['tmptax']), 0, 0, 'R');
$this->Cell_typed($sumWidth, $cellhoehe, $item['ohnepreis'] ? '' : $this->formatMoney((double)$item['tprice'] * $item['tmptax']), 0, 0, 'R');
}
}
}
@@ -3148,7 +3155,7 @@ class Briefpapier extends SuperFPDF {
}
}
$this->Cell($einheitWidth,$cellhoehe,$this->app->erp->ReadyForPDF($einheit),0,0,'R');
$this->Cell_typed($einheitWidth,$cellhoehe,$this->app->erp->ReadyForPDF($einheit),0,0,'R');
}
$this->Ln();
@@ -3298,12 +3305,12 @@ class Briefpapier extends SuperFPDF {
$yBeforeDescription = $this->GetY();
$this->SetFont($this->GetFont(),'',$zeilenuntertext);
if($belege_stuecklisteneinrueckenmm && $newlvl > 0){
$this->Cell($belege_stuecklisteneinrueckenmm * $newlvl, $cellhoehe, '');
$this->Cell_typed($belege_stuecklisteneinrueckenmm * $newlvl, $cellhoehe, '');
}
$this->Cell($posWidth);
$this->Cell($itemNoWidth);
$this->Cell_typed($posWidth);
$this->Cell_typed($itemNoWidth);
if($this->doctype==='arbeitsnachweis') {
$this->Cell($taxWidth);
$this->Cell_typed($taxWidth);
}
if($this->doctype==='lieferschein' && $this->getStyleElement('modul_verband')=='1'){
@@ -3392,17 +3399,17 @@ class Briefpapier extends SuperFPDF {
}
}
$this->Cell($taxWidth);
$this->Cell($amWidth);
$this->Cell_typed($taxWidth);
$this->Cell_typed($amWidth);
$this->Ln();
$this->SetFont($this->GetFont(),'',$tabelleninhalt);
$zeilenuntertext = $this->getStyleElement('zeilenuntertext');
$this->SetFont($this->GetFont(),'',$zeilenuntertext);
$this->Cell($posWidth);
$this->Cell($itemNoWidth);
$this->Cell_typed($posWidth);
$this->Cell_typed($itemNoWidth);
if($this->doctype==='arbeitsnachweis') {
$this->Cell($taxWidth);
$this->Cell_typed($taxWidth);
}
if($this->getStyleElement('artikeleinheit')=='1'){
$this->MultiCell($descWidth - $einheitWidth, 4, '', 0); // 4 = abstand zwischen Artikeln
@@ -3410,8 +3417,8 @@ class Briefpapier extends SuperFPDF {
else{
$this->MultiCell($descWidth, 4, '', 0); // 4 = abstand zwischen Artikeln
}
$this->Cell($taxWidth);
$this->Cell($amWidth);
$this->Cell_typed($taxWidth);
$this->Cell_typed($amWidth);
$this->Ln();
$this->SetFont($this->GetFont(),'',$tabelleninhalt);
$yAfterDescription = $this->GetY();
@@ -3421,11 +3428,11 @@ class Briefpapier extends SuperFPDF {
$this->SetY($position_y_end_name);
$yBeforeDescription = $this->GetY();
$this->SetFont($this->GetFont(),'',$zeilenuntertext);
$this->Cell($posWidth);
$this->Cell($itemNoWidth);
$this->Cell_typed($posWidth);
$this->Cell_typed($itemNoWidth);
if($this->doctype==='arbeitsnachweis')
{
$this->Cell($taxWidth);
$this->Cell_typed($taxWidth);
}
if($this->getStyleElement('artikeleinheit')=='1')
{
@@ -3450,8 +3457,8 @@ class Briefpapier extends SuperFPDF {
$this->MultiCell($posWidth+$itemNoWidth+$descWidth+$amWidth+$taxWidth+$sumWidth+$priceWidth,($zeilenuntertext/2),trim($staffelpreistext),0,'R');
}
$this->Cell($taxWidth);
$this->Cell($amWidth);
$this->Cell_typed($taxWidth);
$this->Cell_typed($amWidth);
$this->Ln();
$this->SetFont($this->GetFont(),'',$tabelleninhalt);
$yAfterDescription = $this->GetY();
@@ -3805,7 +3812,7 @@ class Briefpapier extends SuperFPDF {
$this->Image($dateiname, $this->GetX(), $this->GetY(),$width / 10, $hoehe / 10, 'jpg');
if($nochtext == '')
{
$this->Cell($picwidth,6,'',0,0,'C');
$this->Cell_typed($picwidth,6,'',0,0,'C');
}
$this->SetXY($this->GetX(), $y + $height / 10 + ($nochtext == ''?5:0));
}
@@ -4016,7 +4023,7 @@ class Briefpapier extends SuperFPDF {
}
$this->SetX($x+$abstand_links);
$this->Cell($descWidth,4,$this->WriteHTML($html));
$this->Cell_typed($descWidth,4,$this->WriteHTML($html));
$this->SetX($x+$abstand_links+$descWidth);
//$this->SetX($x);
@@ -4050,7 +4057,7 @@ class Briefpapier extends SuperFPDF {
{
$ausrichtung = $data['Text_Ausrichtung'];
}
$this->Cell($priceWidth+$amWidth+$taxWidth+$priceWidth,4,$summe,$rahmen,0,$ausrichtung);
$this->Cell_typed($priceWidth+$amWidth+$taxWidth+$priceWidth,4,$summe,$rahmen,0,$ausrichtung);
if(!empty($data['Abstand_Unten']))
{
$this->Ln((int)$data['Abstand_Unten']);
@@ -4098,19 +4105,19 @@ class Briefpapier extends SuperFPDF {
//$this->Line(110, $this->GetY(), 190, $this->GetY());
$this->Ln(1);
$this->SetFont($this->GetFont(),'',$this->getStyleElement('schriftgroesse_gesamt'));
$this->Cell($differenz_wegen_abstand,2,'',0);
$this->Cell_typed($differenz_wegen_abstand,2,'',0);
if($this->getStyleElement('kleinunternehmer')!='1' && $this->doctype!='zahlungsavis'){
$nettoText = $this->app->erp->Beschriftung('dokument_gesamtnetto');
$nettoAmount = $this->formatMoney(round((double)$this->totals['totalArticles'], 2), 2).' '.$this->waehrung;
$doctype = $this->doctype;
$doctypeid = !empty($this->doctypeid)?$this->doctypeid: $this->id;
$this->app->erp->RunHook('class_briefpapier_render_netto', 4, $doctype, $doctypeid, $nettoText, $nettoAmount);
$this->Cell(30,5,$nettoText,0,0,'L');
$this->Cell(40,5,$nettoAmount,0,'L','R');
$this->Cell_typed(30,5,$nettoText,0,0,'L');
$this->Cell_typed(40,5,$nettoAmount,0,0,'R');
} else {
//kleinunzernehmer
$this->Cell(30,5,'',0,0,'L');
$this->Cell(40,5,'',0,'L','R');
$this->Cell_typed(30,5,'',0,0,'L');
$this->Cell_typed(40,5,'',0,0,'R');
}
$this->Ln();
@@ -4121,16 +4128,16 @@ class Briefpapier extends SuperFPDF {
$versand = 'Versandkosten: ';
}
if(isset($this->totals['priceOfDispatch'])) {
$this->Cell($differenz_wegen_abstand,2,'',0);
$this->Cell(30,5,$versand,0,'L','L');
$this->Cell(40,5,$this->formatMoney((double)$this->totals['priceOfDispatch'], 2).' '.$this->waehrung,0,'L','R');
$this->Cell_typed($differenz_wegen_abstand,2,'',0);
$this->Cell_typed(30,5,$versand,0,'L','L');
$this->Cell_typed(40,5,$this->formatMoney((double)$this->totals['priceOfDispatch'], 2).' '.$this->waehrung,0,0,'R');
}
//$this->Ln();
if(isset($this->totals['priceOfPayment']) && $this->totals['priceOfPayment']!='0.00'){
$this->Cell($differenz_wegen_abstand,2,'',0);
$this->Cell(30,5,$this->totals['modeOfPayment'],0,'L','L');
$this->Cell(40,5,$this->formatMoney((double)$this->totals['priceOfPayment'], 2).' '.$this->waehrung,0,'L','R');
$this->Cell_typed($differenz_wegen_abstand,2,'',0);
$this->Cell_typed(30,5,$this->totals['modeOfPayment'],0,'L','L');
$this->Cell_typed(40,5,$this->formatMoney((double)$this->totals['priceOfPayment'], 2).' '.$this->waehrung,0,0,'R');
$this->Ln();
}
@@ -4139,7 +4146,7 @@ class Briefpapier extends SuperFPDF {
if(isset($this->totals['totalTaxV']) && $this->totals['totalTaxV']!="0.00"){
$this->Cell($differenz_wegen_abstand,1,'',0);
$this->Cell_typed($differenz_wegen_abstand,1,'',0);
if($this->getStyleElement('kleinunternehmer')!='1'){
if(!empty($this->doctype) && !empty($this->id) && is_numeric($this->id)){
@@ -4154,23 +4161,23 @@ class Briefpapier extends SuperFPDF {
//if(($this->anrede=="firma" || $this->app->erp->AnzeigeBelegNetto($this->anrede,$projekt) || $this->doctype=="bestellung" || $this->getStyleElement("immernettorechnungen",$projekt)=="1")
// && $this->getStyleElement("immerbruttorechnungen",$projekt)!="1")
{
$this->Cell(30,3,$this->app->erp->Beschriftung('dokument_zzglmwst').' '.$this->app->erp->GetSteuersatzNormal(false,$this->id,$this->table).' %',0,'L','L'); //1
$this->Cell_typed(30,3,$this->app->erp->Beschriftung('dokument_zzglmwst').' '.$this->app->erp->GetSteuersatzNormal(false,$this->id,$this->table).' %',0,0,'L'); //1
}
else {
$this->Cell(30,3,$this->app->erp->Beschriftung('dokument_inklmwst').' '.$this->app->erp->GetSteuersatzNormal(false,$this->id,$this->table).' %',0,'L','L');
$this->Cell_typed(30,3,$this->app->erp->Beschriftung('dokument_inklmwst').' '.$this->app->erp->GetSteuersatzNormal(false,$this->id,$this->table).' %',0,0,'L');
}
$this->Cell(40,3,$this->formatMoney((double)$this->totals['totalTaxV'], 2).' '.$this->waehrung,0,'L','R');
$this->Cell_typed(40,3,$this->formatMoney((double)$this->totals['totalTaxV'], 2).' '.$this->waehrung,0,0,'R');
} else {
//kleinunternehmer
$this->Cell(30,3,'',0,'L','L');
$this->Cell(40,3,'',0,'L','R');
$this->Cell_typed(30,3,'',0,0,'L');
$this->Cell_typed(40,3,'',0,0,'R');
}
$this->Ln();
}
$projekt = $this->projekt;
$adresse = $this->app->DB->Select("SELECT adresse FROM ".($this->table?$this->table:$this->doctype)." WHERE id = '".$this->id."' LIMIT 1");
if(!empty($this->totals['totalTaxR']) && $this->totals['totalTaxR']!='0.00'){
$this->Cell($differenz_wegen_abstand,1,'',0);
$this->Cell_typed($differenz_wegen_abstand,1,'',0);
if($this->getStyleElement('kleinunternehmer')!='1'){
@@ -4178,17 +4185,17 @@ class Briefpapier extends SuperFPDF {
//if(($this->anrede=="firma" || $this->app->erp->AnzeigeBelegNetto($this->anrede,$projekt) || $this->doctype=="bestellung" || $this->getStyleElement("immernettorechnungen",$projekt)=="1")
// && $this->getStyleElement("immerbruttorechnungen",$projekt)!="1")
{
$this->Cell(30,3,$this->app->erp->Beschriftung('dokument_zzglmwst').' '.$this->app->erp->GetSteuersatzErmaessigt(false,$this->id,$this->table).' %',0,'L','L'); //1
$this->Cell_typed(30,3,$this->app->erp->Beschriftung('dokument_zzglmwst').' '.$this->app->erp->GetSteuersatzErmaessigt(false,$this->id,$this->table).' %',0,0,'L'); //1
}
else {
$this->Cell(30,3,$this->app->erp->Beschriftung('dokument_inklmwst').' '.$this->app->erp->GetSteuersatzErmaessigt(false,$this->id,$this->table).' %',0,'L','L');
$this->Cell_typed(30,3,$this->app->erp->Beschriftung('dokument_inklmwst').' '.$this->app->erp->GetSteuersatzErmaessigt(false,$this->id,$this->table).' %',0,0,'L');
}
$this->Cell(40,3,$this->formatMoney(round((double)$this->totals['totalTaxR'],2), 2).' '.$this->waehrung,0,'L','R');
$this->Cell_typed(40,3,$this->formatMoney(round((double)$this->totals['totalTaxR'],2), 2).' '.$this->waehrung,0,0,'R');
} else {
//kleinunternehmer
$this->Cell(30,3,'',0,'L','L');
$this->Cell(40,3,"",0,'L','R');
$this->Cell_typed(30,3,'',0,0,'L');
$this->Cell_typed(40,3,"",0,0,'R');
}
$this->Ln();
@@ -4203,24 +4210,24 @@ class Briefpapier extends SuperFPDF {
{
continue;
}
$this->Cell($differenz_wegen_abstand,1,'',0);
$this->Cell_typed($differenz_wegen_abstand,1,'',0);
if($this->getStyleElement('kleinunternehmer')!='1'){
if($this->app->erp->AnzeigeBelegNettoAdresse($this->anrede, $this->doctype, $projekt, $adresse,$this->id))
//if(($this->anrede=="firma" || $this->app->erp->AnzeigeBelegNetto($this->anrede,$projekt) || $this->doctype=="bestellung" || $this->getStyleElement("immernettorechnungen",$projekt)=="1")
// && $this->getStyleElement("immerbruttorechnungen",$projekt)!="1")
{
$this->Cell(30,3,$this->app->erp->Beschriftung('dokument_zzglmwst').' '.$k.' %',0,'L','L'); //1
$this->Cell_typed(30,3,$this->app->erp->Beschriftung('dokument_zzglmwst').' '.$k.' %',0,0,'L'); //1
}else {
//$this->Cell(30,3,$this->app->erp->Beschriftung('dokument_inklmwst').' '.$k.' %',0,'L','L'); 09.12.2018 ab heute auskommentiert wegen 829087
$this->Cell(30,3,$this->app->erp->Beschriftung('dokument_zzglmwst').' '.$k.' %',0,'L','L');
//$this->Cell_typed(30,3,$this->app->erp->Beschriftung('dokument_inklmwst').' '.$k.' %',0,'L','L'); 09.12.2018 ab heute auskommentiert wegen 829087
$this->Cell_typed(30,3,$this->app->erp->Beschriftung('dokument_zzglmwst').' '.$k.' %',0,0,'L');
}
$this->Cell(40,3,$this->formatMoney(round($value,2), 2).' '.$this->waehrung,0,'L','R');
$this->Cell_typed(40,3,$this->formatMoney(round($value,2), 2).' '.$this->waehrung,0,0,'R');
} else {
//kleinunternehmer
$this->Cell(30,3,'',0,'L','L');
$this->Cell(40,3,"",0,'L','R');
$this->Cell_typed(30,3,'',0,0,'L');
$this->Cell_typed(40,3,"",0,0,'R');
}
$this->Ln();
@@ -4231,7 +4238,7 @@ class Briefpapier extends SuperFPDF {
if(!isset($this->totals['totalTaxR']) && !isset($this->totals['totalTaxV']) && !isset($this->totals['summen']) && $this->doctype!="zahlungsavis")
{
$this->Cell($differenz_wegen_abstand,3,'',0);
$this->Cell_typed($differenz_wegen_abstand,3,'',0);
if($this->getStyleElement('kleinunternehmer')!='1')
{
@@ -4241,24 +4248,24 @@ class Briefpapier extends SuperFPDF {
{
if(!($this->ust_befreit==3 && $this->getStyleElement('steuerfrei_inland_ausblenden')=='1')) //steuerfrei inland
{
$this->Cell(30, 3, $this->app->erp->Beschriftung('dokument_zzglmwst') . ' 0.00 %', 0, 'L', 'L'); //1
$this->Cell_typed(30, 3, $this->app->erp->Beschriftung('dokument_zzglmwst') . ' 0.00 %', 0, 0, 'L'); //1
}
}
else {
if(!($this->ust_befreit==3 && $this->getStyleElement('steuerfrei_inland_ausblenden')=='1')) //steuerfrei inland
{
$this->Cell(30, 3, $this->app->erp->Beschriftung('dokument_inklmwst') . ' 0.00 %', 0, 'L', 'L');
$this->Cell_typed(30, 3, $this->app->erp->Beschriftung('dokument_inklmwst') . ' 0.00 %', 0, 0, 'L');
}
}
if(!($this->ust_befreit==3 && $this->getStyleElement('steuerfrei_inland_ausblenden')=='1')) //steuerfrei inland
{
$this->Cell(40, 3, '0,00 ' . $this->waehrung, 0, 'L', 'R');
$this->Cell_typed(40, 3, '0,00 ' . $this->waehrung, 0, 0, 'R');
}
} else {
//kleinunternehmer
$this->Cell(30,3,'',0,'L','L');
$this->Cell(40,3,'',0,'L','R');
$this->Cell_typed(30,3,'',0,0,'L');
$this->Cell_typed(40,3,'',0,0,'R');
}
$this->Ln();
}
@@ -4267,32 +4274,32 @@ class Briefpapier extends SuperFPDF {
}
$this->SetFont($this->GetFont(),'B',$this->getStyleElement('schriftgroesse_gesamt'));
$this->Cell($differenz_wegen_abstand,5,'',0);
$this->Cell_typed($differenz_wegen_abstand,5,'',0);
if($this->doctype=='offer'){
$this->Cell(30, 5, $this->app->erp->Beschriftung('dokument_gesamt_total'), 0, 'L', 'L');
$this->Cell_typed(30, 5, $this->app->erp->Beschriftung('dokument_gesamt_total'), 0, 0, 'L');
}
elseif($this->doctype=='creditnote'){
$this->Cell(30, 5, $this->app->erp->Beschriftung('dokument_gesamt_total'), 0, 'L', 'L');
$this->Cell_typed(30, 5, $this->app->erp->Beschriftung('dokument_gesamt_total'), 0, 0, 'L');
}
else if($this->doctype=='arbeitsnachweis'){
$this->Cell(30, 5, $this->app->erp->Beschriftung('dokument_gesamt_total'), 0, 'L', 'L');
$this->Cell_typed(30, 5, $this->app->erp->Beschriftung('dokument_gesamt_total'), 0, 0, 'L');
}
else if($this->doctype=='zahlungsavis'){
$this->Cell(30, 5, $this->app->erp->Beschriftung('dokument_gesamt_total'), 0, 'L', 'L');
$this->Cell_typed(30, 5, $this->app->erp->Beschriftung('dokument_gesamt_total'), 0, 0, 'L');
}
else{
$this->Cell(30, 5, $this->app->erp->Beschriftung('dokument_gesamt_total'), 0, 'L', 'L');
$this->Cell_typed(30, 5, $this->app->erp->Beschriftung('dokument_gesamt_total'), 0, 0, 'L');
}
if($this->doctype=='arbeitsnachweis'){
$this->Cell(40, 5, $this->totals['total'] . ' ', 0, 'L', 'R');
$this->Cell_typed(40, 5, $this->totals['total'] . ' ', 0, 0, 'R');
}
else {
if($this->getStyleElement('kleinunternehmer')!='1'){
$this->Cell(40, 5, $this->formatMoney(round((double)$this->totals['total'], 2), 2) . ' ' . $this->waehrung, 0, 'L', 'R');
$this->Cell_typed(40, 5, $this->formatMoney(round((double)$this->totals['total'], 2), 2) . ' ' . $this->waehrung, 0, 0, 'R');
}
else{
$this->Cell(40, 5, $this->formatMoney(round((double)$this->totals['totalArticles'], 2), 2) . ' ' . $this->waehrung, 0, 'L', 'R');
$this->Cell_typed(40, 5, $this->formatMoney(round((double)$this->totals['totalArticles'], 2), 2) . ' ' . $this->waehrung, 0, 0, 'R');
}
}
+181 -5
View File
@@ -40,6 +40,7 @@ class Auftrag extends GenAuftrag
*/
public function TableSearch($app, $name, $erlaubtevars)
{
switch($name)
{
case 'auftraege':
@@ -711,6 +712,55 @@ class Auftrag extends GenAuftrag
break;
case 'positionen_teillieferung':
$id = $app->Secure->GetGET('id');
$allowed['positionen_teillieferung'] = array('list');
$heading = array('Position','Artikel','Nr.','Menge','Lager','Teilmenge','');
$width = array( '1%', '60%', '29%','5%','5%'); // Fill out manually later
// columns that are aligned right (numbers etc)
// $alignright = array(4,5,6,7,8);
$findcols = array('ap.sort','a.name_de','a.nummer','ap.menge','lager','teilmenge');
$searchsql = array('');
$defaultorder = 2;
$defaultorderdesc = 0;
$input_for_menge = "CONCAT(
'<input type = \"number\" min=\"0\" max=\"',
ap.menge,
'\" name=\"teilmenge_',
ap.id,
'\"',
' value=\"',
'\">',
'</input>'
)";
// .'(SELECT TRIM(IFNULL(SUM(l.menge),0))+0 FROM lager_platz_inhalt l WHERE l.artikel=a.id) as lager'
$sql = "SELECT SQL_CALC_FOUND_ROWS
ap.sort,
ap.sort,
a.name_de,
a.nummer,"
.$this->app->erp->FormatMenge('ap.menge').","
."(SELECT TRIM(IFNULL(SUM(l.menge),0))+0 FROM lager_platz_inhalt l WHERE l.artikel=a.id) as lager,"
.$input_for_menge
." FROM auftrag_position ap
INNER JOIN
artikel a
ON ap.artikel = a.id";
$where = " ap.auftrag = $id ";
$count = "SELECT count(DISTINCT ap.id) FROM auftrag_position ap WHERE $where";
// $groupby = "";
break;
}
$erg = [];
@@ -765,7 +815,7 @@ class Auftrag extends GenAuftrag
$this->app->ActionHandler("rechnung","AuftragRechnung");
$this->app->ActionHandler("lieferschein","AuftragLieferschein");
$this->app->ActionHandler("lieferscheinrechnung","AuftragLieferscheinRechnung");
$this->app->ActionHandler("teillieferung","AuftragTeillieferung");
$this->app->ActionHandler("nachlieferung","AuftragNachlieferung");
// $this->app->ActionHandler("versand","AuftragVersand");
$this->app->ActionHandler("freigabe","AuftragFreigabe");
@@ -1271,7 +1321,11 @@ class Auftrag extends GenAuftrag
$kommissionierart = $this->app->DB->Select("SELECT kommissionierverfahren FROM projekt WHERE id='$projekt' LIMIT 1");
//$art = $this->app->DB->Select("SELECT art FROM auftrag WHERE id='$id' LIMIT 1");
$alleartikelreservieren = '';
$teillieferungen = '';
if ($status==='angelegt' || $status==='freigegeben') {
$teillieferungen = '<option value="teillieferung">Teilauftrag erstellen</option>';
}
if($status==='freigegeben') {
$alleartikelreservieren = "<option value=\"reservieren\">alle Artikel reservieren</option>";
@@ -1369,9 +1423,14 @@ class Auftrag extends GenAuftrag
{
switch(cmd)
{
case 'storno': if(!confirm('Wirklich stornieren?')) return document.getElementById('aktion$prefix').selectedIndex = 0; else window.location.href='index.php?module=auftrag&action=delete&id=%value%'; break;
case 'unstorno': if(!confirm('Wirklich stornierten Auftrag wieder freigeben?')) return document.getElementById('aktion$prefix').selectedIndex = 0; else window.location.href='index.php?module=auftrag&action=undelete&id=%value%'; break;
case 'teillieferung': window.location.href='index.php?module=auftrag&action=teillieferung&id=%value%'; break;
case 'storno':
if(!confirm('Wirklich stornieren?')) return document.getElementById('aktion$prefix').selectedIndex = 0; else window.location.href='index.php?module=auftrag&action=delete&id=%value%'; break;
case 'unstorno':
if(!confirm('Wirklich stornierten Auftrag wieder freigeben?')) return document.getElementById('aktion$prefix').selectedIndex = 0; else window.location.href='index.php?module=auftrag&action=undelete&id=%value%';
break;
case 'teillieferung':
window.location.href='index.php?module=auftrag&action=teillieferung&id=%value%';
break;
case 'anfrage': if(!confirm('Wirklich rückführen?')) return document.getElementById('aktion$prefix').selectedIndex = 0; else window.location.href='index.php?module=auftrag&action=anfrage&id=%value%'; break;
case 'kreditlimit': if(!confirm('Wirklich Kreditlimit für diesen Auftrag freigeben?')) return document.getElementById('aktion$prefix').selectedIndex = 0; else window.location.href='index.php?module=auftrag&action=kreditlimit&id=%value%'; break;
case 'copy': if(!confirm('Wirklich kopieren?')) return document.getElementById('aktion$prefix').selectedIndex = 0; else window.location.href='index.php?module=auftrag&action=copy&id=%value%'; break;
@@ -7004,4 +7063,121 @@ Die Gesamtsumme stimmt nicht mehr mit urspr&uuml;nglich festgelegten Betrag '.
header('Location: index.php?module=auftrag&action=versandzentrum');
}
/*
* Split auftrag into separate documents with submit -> do it and return jump to the new split part
*/
function AuftragTeillieferung() {
$id = $this->app->Secure->GetGET('id');
$this->AuftragMenu();
$submit = $this->app->Secure->GetPOST('submit');
$sql = "SELECT * from auftrag WHERE id = $id";
$auftrag_alt = $this->app->DB->SelectArr($sql)[0];
$msg = "";
if (in_array($auftrag_alt['status'],array('angelegt','freigegeben'))) {
if ($submit != '') {
$msg = "";
switch ($submit) {
case 'speichern':
// Get parameters
$teilmenge_input = $this->app->Secure->GetPOSTArray();
$teilmengen = array();
foreach ($teilmenge_input as $key => $value) {
if ((strpos($key,'teilmenge_') === 0) && ($value !== '')) {
$posid = substr($key,'10');
$teilmenge = array('posid' => $posid, 'menge' => $value);
$teilmengen[] = $teilmenge;
}
}
if (!empty($teilmengen)) {
// Create new auftrag
$sql = "SELECT * from auftrag WHERE id = $id";
$auftrag_alt = $this->app->DB->SelectArr($sql)[0];
// Part auftrag of part auftrag -> select parent
$hauptauftrag_id = $auftrag_alt['teillieferungvon'];
if ($hauptauftrag_id != 0) {
$sql = "SELECT belegnr FROM auftrag WHERE id = $hauptauftrag_id";
$hauptauftrag_belegnr = $this->app->DB->SelectArr($sql)[0]['belegnr'];
} else {
$hauptauftrag_id = $auftrag_alt['id'];
$hauptauftrag_belegnr = $auftrag_alt['belegnr'];
}
$sql = "SELECT MAX(teillieferungnummer) as tpn FROM auftrag WHERE teillieferungvon = $hauptauftrag_id";
$teillieferungnummer = $this->app->DB->SelectArr($sql)[0]['tpn'];
if (empty($teillieferungnummer) || $teillieferungnummer == 0) {
$teillieferungnummer = '1';
} else {
$teillieferungnummer++;
}
$belegnr_neu = $hauptauftrag_belegnr."-".$teillieferungnummer;
$auftrag_neu = $auftrag_alt;
$auftrag_neu['id'] = null;
$auftrag_neu['belegnr'] = $belegnr_neu;
$auftrag_neu['teillieferungvon'] = $hauptauftrag_id;
$auftrag_neu['teillieferungnummer'] = $teillieferungnummer;
$id_neu = $this->app->DB->MysqlCopyRow('auftrag','id',$id);
$sql = "UPDATE auftrag SET belegnr = '$belegnr_neu', teillieferungvon = $hauptauftrag_id, teillieferungnummer = $teillieferungnummer WHERE id = $id_neu";
echo("---------------------------".$sql."<br>");
$this->app->DB->Update($sql);
// Adjust quantities
foreach ($teilmengen as $teilmenge) {
$sql = "SELECT menge FROM auftrag_position WHERE id = ".$teilmenge['posid'];
$menge_alt = $this->app->DB->SelectArr($sql)[0]['menge'];
$menge_neu = $teilmenge['menge'];
if ($menge_neu > $menge_alt) {
$menge_neu = $menge_alt;
}
$menge_reduziert = $menge_alt-$menge_neu;
$posid_alt = $teilmenge['posid'];
$posid_neu = $this->app->DB->MysqlCopyRow('auftrag_position','id',$posid_alt);
$sql = "UPDATE auftrag_position SET menge = $menge_reduziert WHERE id = $posid_alt";
echo("---------------------------".$sql."<br>");
$this->app->DB->Update($sql);
$sql = "UPDATE auftrag_position SET auftrag = $id_neu, menge = $menge_neu WHERE id = $posid_neu";
echo("---------------------------".$sql."<br>");
$this->app->DB->Update($sql);
}
}
break;
case 'abbrechen':
header('Location: index.php?module=auftrag&action=edit&id='.$id);
return;
break;
}
} // Submit
else {
$msg = "Teilauftrag: Auswahl der Artikel f&uuml;r den Teilauftrag.";
}
} // Status ok
else {
$msg = 'Teilauftrag in diesem Status nicht möglich.';
}
$this->app->Tpl->Add('INFOTEXT',$msg);
$this->app->YUI->TableSearch('TABLE','positionen_teillieferung', 'show','','',basename(__FILE__), __CLASS__);
$this->app->Tpl->Parse('PAGE','auftrag_teillieferung.tpl');
} // AuftragTeillieferung
}
+29 -16
View File
@@ -1,22 +1,35 @@
<!-- gehort zu tabview -->
<div id="tabs">
<ul>
<li><a href="#tabs-1">[TABTEXT]</a></li>
</ul>
<!-- ende gehort zu tabview -->
<!-- erstes tab -->
<div id="tabs-1">
<div class="info">Teillieferung: Auswahl der Artikel f&uuml;r eine Teillieferung. Bestimmen Sie welche Artikel als Teillieferung vorab versendet werden sollen,<br>
und wann die Rechnung versendet wird (bei aktueller oder n&auml;chster Lieferung).</div>
<br>
<form action="" method="post">
[MESSAGE]
[TAB1]
[TAB1NEXT]
</form>
</div>
<!-- tab view schließen -->
<div id="tabs-1">
<div class="info">[INFOTEXT]</div>
<br>
<form action="" method="post">
[MESSAGE]
<div class="row">
<div class="row-height">
<div class="col-xs-14 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
[TABLE]
</fieldset>
</div>
</div>
<div class="col-xs-14 col-md-2 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<table width="100%" border="0" class="mkTableFormular">
<legend>{|Aktionen|}</legend>
<tr><td><button name="submit" id="speichern" value="speichern" class="ui-button-icon" style="width:100%";>Teilauftrag erzeugen</button></td></tr>
<tr><td><button name="submit" id="abbrechen" value="abbrechen" class="ui-button-icon" style="width:100%";>Vorgang abbrechen</button></td></tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
+5
View File
@@ -0,0 +1,5 @@
<div id="tabs-1">
[MESSAGE]
[TAB1]
[TAB1NEXT]
</div>
+270
View File
@@ -0,0 +1,270 @@
<div id="tabs">
<ul>
<li><a href="#tabs-1">Allgemein</a></li>
<li><a href="#tabs-2">Produktion</a></li>
<li><a href="#tabs-3">Positionen</a></li>
<li><a href="#tabs-4">Protokoll</a></li>
</ul>
<div id="tabs-1">
[MESSAGE]
<form action="" method="post">
[FORMHANDLEREVENT]
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|<b>Produktion <font color="blue">[BELEGNR]</font></b>|}</legend>
[STATUSICONS]
[TEILPRODUKTIONINFO]
</fieldset>
</div>
</div>
</div>
</div>
<div class="row">
<div class="row-height">
<div class="col-xs-14 col-md-6 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Allgemein|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<tr><td>{|Kunde|}:</td><td><input type="text" name="kundennummer" id="kundennummer" value="[KUNDENNUMMER]" size="20"></td></tr>
<tr><td>{|Projekt|}:</td><td><input type="text" name="projekt" id="projekt" value="[PROJEKT]" size="20"></td></tr>
<tr><td>{|Auftrag|}:</td><td><input type="text" name="auftragid" id="auftragid" value="[AUFTRAGID]" size="20"></td></tr>
<tr><td>{|Interne Bezeichnung|}:</td><td><input type="text" name="internebezeichnung" value="[INTERNEBEZEICHNUNG]" size="20"></td></tr>
</table>
</fieldset>
</div>
</div>
<div class="col-xs-14 col-md-6 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<table width="100%" border="0" class="mkTableFormular">
<tr><td>{|Status|}:</td><td><input disabled type="text" name="status" value="[STATUS]" size="20"></td></tr>
<tr><td>{|Angelegt am|}:</td><td><input type="text" name="datum" id="datum" value="[DATUM]" size="10"></td></tr>
<tr><td>{|Materiallager|}:</td><td><input type="text" name="standardlager" id="standardlager" value="[STANDARDLAGER]" size="20"></td></tr>
</table>
</fieldset>
</div>
</div>
<div class="col-xs-14 col-md-2 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<table width="100%" border="0" class="mkTableFormular">
<legend>{|Aktionen|}</legend>
<tr><td><button [AKTION_SPEICHERN_DISABLED] name="submit" value="speichern" class="ui-button-icon" style="width:100%;">Speichern</button></td></tr>
<tr [AKTION_FREIGEBEN_VISIBLE]><td><button name="submit" value="freigeben" class="ui-button-icon" style="width:100%;">Freigeben</button></td></tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
<div class="row">
<div class="row-height">
<div class="col-xs-14 col-md-6 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Einstellungen|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<tr><td>{|Reservierart|}:</td><td><input disabled type="text" name="reservierart" value="[RESERVIERART]" size="20"></td></tr>
<tr><td>{|Auslagerart|}:</td><td><input disabled type="text" name="auslagerart" value="[AUSLAGERART]" size="20"></td></tr>
<tr><td>{|Unterstücklisten aufl&ouml;sen|}:</td><td><input disabled type="checkbox" name="unterlistenexplodieren" value=1 [UNTERLISTENEXPLODIEREN] size="20"></td></tr>
<tr><td>{|Funktionstest|}:</td><td><input disabled type="checkbox" name="funktionstest" value=1 [FUNKTIONSTEST] size="20"></td></tr>
<tr><td>{|Beschreibungen von Arbeitsschritten anzeigen|}:</td><td><input disabled type="checkbox" name="arbeitsschrittetextanzeigen" value=1 [ARBEITSSCHRITTETEXTANZEIGEN] size="20"></td></tr>
<tr><td>{|Seriennummer erstellen|}:</td><td><input disabled type="checkbox" name="seriennummer_erstellen" value=1 [SERIENNUMMER_ERSTELLEN] size="20"></td></tr>
<tr><td>{|Unterseriennummer erfassen|}:</td><td><input disabled type="checkbox" name="unterseriennummer_erfassen" value=1 [UNTERSERIENNUMMER_ERFASSEN] size="20"></td></tr>
</table>
</fieldset>
</div>
</div>
<div class="col-xs-14 col-md-8 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<table width="100%" border="0" class="mkTableFormular">
<tr><td>{|Auslieferung Lager|}:</td><td><input type="text" name="datumauslieferung" id="datumauslieferung" value="[DATUMAUSLIEFERUNG]" size="10"></td></tr>
<tr><td>{|Bereitstellung Start|}:</td><td><input type="text" name="datumbereitstellung" id="datumbereitstellung" value="[DATUMBEREITSTELLUNG]" size="10"></td></tr>
<tr><td>{|Produktion Start|}:</td><td><input type="text" name="datumproduktion" id="datumproduktion" value="[DATUMPRODUKTION]" size="10"></td></tr>
<tr><td>{|Produktion Ende|}:</td><td><input type="text" name="datumproduktionende" id="datumproduktionende" value="[DATUMPRODUKTIONENDE]" size="10"></td></tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Freitext|}</legend>
<textarea name="freitext" id="freitext" style="min-height: 180px;">[FREITEXT]</textarea>
</table>
</fieldset>
</div>
</div>
</div>
</div>
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Interne Bemerkung|}</legend>
<textarea name="internebemerkung" id="internebemerkung" style="min-height: 180px;">[INTERNEBEMERKUNG]</textarea>
</fieldset>
</div>
</div>
</div>
</div>
</form>
</div>
<div [POSITIONEN_TAB_VISIBLE]>
<div id="tabs-2">
[MESSAGE]
<form action="#tabs-2" method="post">
[FORMHANDLEREVENT]
<div class="row">
<div class="row-height">
<div class="col-xs-14 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|<b>Produktion <font color="blue">[BELEGNR]</font></b>|}</legend>
[STATUSICONS]
[TEILPRODUKTIONINFO]
</fieldset>
</div>
</div>
</div>
</div>
<div class="row">
<div class="row-height">
<div class="col-xs-14 col-md-5 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend [AKTION_PLANEN_VISIBLE]>{|Zu produzierende Artikel|}</legend>
<legend [ARTIKEL_MENGE_VISIBLE]>{|Produktionsfortschritt|}</legend>
<table width="100%" border="0">
<tr [AKTION_PLANEN_VISIBLE]><td>{|Artikel|}:</td></tr>
<tr [AKTION_PLANEN_VISIBLE]><td><input type="text" name="artikel_planen" id="artikel_planen" value="[ARTIKEL_PLANEN]" size="20"></td></tr>
<tr [AKTION_PLANEN_VISIBLE]><td>{|Planmenge|}:</td></tr>
<tr [AKTION_PLANEN_VISIBLE]><td><input type="text" name="artikel_planen_menge" id="artikel_planen_menge" value="[ARTIKEL_PLANEN_MENGE]" size="20"></td></tr>
<tr [ARTIKEL_MENGE_VISIBLE]>
<td>{|Geplant|}:</td>
<td>[MENGE_GEPLANT]</td>
<td>{|Offen:|}</td>
<td>[MENGE_OFFEN]</td>
</tr>
<tr [ARTIKEL_MENGE_VISIBLE]>
<td>{|Produziert|}:</td>
<td>[MENGE_PRODUZIERT]</td>
<td>{|Reserviert:|}</td>
<td>[MENGE_RESERVIERT]</td>
</tr>
<tr [ARTIKEL_MENGE_VISIBLE]>
<td>{|Erfolgreich|}:</td>
<td>[MENGE_ERFOLGREICH]</td>
<td>{|Produzierbar:|}</td>
<td>[MENGE_PRODUZIERBAR]</td>
</tr>
</tr>
<tr [ARTIKEL_MENGE_VISIBLE]>
<td>{|Ausschuss|}:</td>
<td>[MENGE_AUSSCHUSS]</td>
</tr>
</table>
</fieldset>
</div>
</div>
<div class="col-xs-14 col-md-5 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend [AKTION_PRODUZIEREN_VISIBLE]>{|Parameter|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<tr [AKTION_PRODUZIEREN_VISIBLE]>
<td>{|Menge|}:</td>
<td><input type="number" min="0" name="menge_produzieren" id="menge_produzieren" value="[MENGE_PRODUZIEREN]" size="20""></td>
</tr>
<tr [AKTION_PRODUZIEREN_VISIBLE]>
<td>{|Ausschuss|}:</td>
<td><input type="number" min="0" name="menge_ausschuss_produzieren" id="menge_ausschuss_produzieren" value="[MENGE_AUSSCHUSS_PRODUZIEREN]" size="20"></td>
</tr>
<tr [AKTION_PRODUZIEREN_VISIBLE]>
<td>{|Ziellager|}:</td>
<td><input type="text" name="ziellager" id="ziellager" value="[ZIELLAGER]" size="20"></td>
</tr>
</table>
</fieldset>
</div>
</div>
<div class="col-xs-14 col-md-2 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<table width="100%" border="0" class="mkTableFormular">
<legend>{|Anpassen|}</legend>
<tr [AKTION_PLANEN_VISIBLE]><td><button name="submit" value="planen" class="ui-button-icon" style="width:100%;">Planen</button></td></tr>
<tr [AKTION_LEEREN_VISIBLE]><td><button name="submit" value="leeren" class="ui-button-icon" style="width:100%;">Leeren</button></td></tr>
<tr [AKTION_FREIGEBEN_VISIBLE]><td><button name="submit" value="freigeben" class="ui-button-icon" style="width:100%;">Freigeben</button></td></tr>
<tr [AKTION_PRODUZIEREN_VISIBLE]><td><button name="submit" value="teilen" class="ui-button-icon" style="width:100%;">Teilen</button></td></tr>
<tr [AKTION_PRODUZIEREN_VISIBLE]><td><button name="submit" value="anpassen" class="ui-button-icon" style="width:100%;">Anpassen</button></td></tr>
</table>
</fieldset>
</div>
</div>
<div class="col-xs-14 col-md-2 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<table width="100%" border="0" class="mkTableFormular">
<legend>{|Produzieren|}</legend>
<tr [AKTION_RESERVIEREN_VISIBLE]><td><button name="submit" value="reservieren" class="ui-button-icon" style="width:100%;">Reservieren</button></td></tr>
<tr [AKTION_PRODUZIEREN_VISIBLE]><td><button name="submit" value="produzieren" class="ui-button-icon" style="width:100%;">Produzieren</button></td></tr>
<tr [AKTION_ABSCHLIESSEN_VISIBLE]><td><button name="submit" value="abschliessen" class="ui-button-icon" style="width:100%;">Abschliessen</button></td></tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
<div [ARTIKEL_MENGE_VISIBLE] class="row">
<div class="row-height">
<div class="col-xs-12 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Materialbedarf|}</legend>
</fieldset>
[PRODUKTION_POSITION_SOURCE_TABELLE]
</div>
</div>
</div>
</div>
</form>
</div>
</div>
<div id="tabs-3">
[MESSAGE]
<form action="" method="post">
[FORMHANDLEREVENT]
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Positionen|}</legend>
[PRODUKTION_POSITION_SOURCE_POSITION_TABELLE]
</fieldset>
</div>
</div>
</div>
</div>
</form>
</div>
<div id="tabs-4">
[MESSAGE]
<form action="" method="post">
[MINIDETAILINEDIT]
</form>
</div>
</div>
+48
View File
@@ -0,0 +1,48 @@
<div id="tabs">
<ul>
<li><a href="#tabs-1">[TABTEXT1]</a></li>
</ul>
<div id="tabs-1">
[MESSAGE]
<form action="#tabs-1" id="frmauto" name="frmauto" method="post">
<div class="filter-box filter-usersave">
<div class="filter-block filter-inline">
<div class="filter-title">{|Filter|}</div>
<ul class="filter-list">
[STATUSFILTER]
<li class="filter-item">
<label for="angelegte" class="switch">
<input type="checkbox" id="angelegte">
<span class="slider round"></span>
</label>
<label for="angelegte">{|Angelegt|}</label>
</li>
<li class="filter-item">
<label for="offene" class="switch">
<input type="checkbox" id="offene">
<span class="slider round"></span>
</label>
<label for="offene">{|Offen|}</label>
</li>
<li class="filter-item">
<label for="geschlossene" class="switch">
<input type="checkbox" id="geschlossene">
<span class="slider round"></span>
</label>
<label for="geschlossene">{|Abgeschlossen|}</label>
</li>
<li class="filter-item">
<label for="stornierte" class="switch">
<input type="checkbox" id="stornierte">
<span class="slider round"></span>
</label>
<label for="stornierte">{|Papierkorb|}</label>
</li>
</ul>
</div>
</div>
</form>
[TAB1]
[TAB1NEXT]
</div>
</div>
+40 -275
View File
@@ -1,281 +1,46 @@
<style>
.auftraginfo_cell {
color: #636363;border: 1px solid #ccc;padding: 5px;
}
.auftrag_cell {
color: #636363;border: 1px solid #fff;padding: 0px; margin:0px;
}
</style>
<table width="100%" border="0" cellpadding="10" cellspacing="5">
<tr valign="top">
<td width="">
<br>
<center>[MENU]</center>
<br>
<h2 class="greyh2">Artikel für Produktion</h2>
<div style="padding:10px;">[ARTIKEL]</div>
[MINIDETAILNACHARTIKEL]
<h2 class="greyh2">Externe Produktionsschritte</h2>
<div style="padding:10px;" id="[RAND]bestellungen">[BESTELLUNGEN]</div>
<h2 class="greyh2">Zeiterfassung</h2>
<div style="padding:10px;">[ZEITERFASSUNG]</div>
<h2 class="greyh2">Arbeitsschritte</h2>
<div style="padding:10px;">[ARBEITSSCHRITTE]</div>
<h2 class="greyh2">Abschlussbemerkung</h2>
<div style="padding:10px;">[ABSCHLUSSBEMERKUNG]</div>
<div style="padding:10px;">
<table width="100%>">
<tr>
<td>Zeit Geplant in Stunden</td>
<td>Zeit Tatsächlich in Stunden</td>
<td>Arbeitsplatzgruppe Kosten Geplant in EUR</td>
<td>Arbeitsplatzgruppe Kosten Tatsächlich in EUR</td>
</tr>
<tr>
<td class="greybox" width="25%">[ZEITGEPLANT]</td>
<td class="greybox" width="25%">[ZEITGEBUCHT]</td>
<td class="greybox" width="25%">[KOSTENGEPLANT]</td>
<td class="greybox" width="25%">[KOSTENGEBUCHT]</td>
</tr>
</table>
</div>
</td>
<td width="450">
<div style="overflow:auto; min-width:450px; max-height:550px;">
<div style="background-color:white">
<h2 class="greyh2">Produktionszentrum</h2>
<div style="padding:10px;">
<center>
[BUTTONS]
</center>
</div>
<div style="background-color:white">
<h2 class="greyh2">Protokoll</h2>
<div style="padding:10px;">
[PROTOKOLL]
</div>
</div>
<!--
<h2 class="greyh2">Datei Anhang</h2>
<div style="padding:10px;">[DATEIANHANGLISTE]</div>
-->
<!--
<h2 class="greyh2">Arbeitsschritte</h2>
<div style="padding:10px">
<table width="100%>">
<tr><td>Fertigstellung in %</td><td>Anzahl Schritte</td></tr>
<tr>
<td class="greybox" width="25%">[DECKUNGSBEITRAG]</td>
<td class="greybox" width="25%">[DBPROZENT]</td>
</tr>
</table>
</div>
-->
<h2 class="greyh2">Abschluss Bericht</h2>
<div style="padding:10px;">
<table width="100%>">
<tr>
<td>Menge Geplant</td>
<td>Menge Ausschuss</td>
</tr>
<tr>
<td class="greybox" width="25%">[MENGEGEPLANT]</td>
<td class="greybox" width="25%">[MENGEAUSSCHUSS]</td>
</tr>
</table>
</div>
<h2 class="greyh2">Deckungsbeitrag</h2>
<div style="padding:10px">
<table width="100%>">
<tr>
<td>Deckungsbeitrag in EUR</td>
<td>DB in %</td>
</tr>
<tr>
<td class="greybox" width="25%">[DECKUNGSBEITRAG]</td>
<td class="greybox" width="25%">[DBPROZENT]</td>
</tr>
</table>
<br>
<br>
</div>
<div class="row">
<div class="col-xs-12 col-md-6 col-md-height">
<div class="inside inside-full-height">
<legend>{|Produktionsfortschritt|}</legend>
<div class="inside inside-full-height">
<table width="100%" border="0">
<tr [ARTIKEL_MENGE_VISIBLE]>
<td>{|Geplant|}:</td>
<td>[MINI_MENGE_GEPLANT]</td>
<td>{|Offen:|}</td>
<td>[MINI_MENGE_OFFEN]</td>
</tr>
<tr [ARTIKEL_MENGE_VISIBLE]>
<td>{|Produziert|}:</td>
<td>[MINI_MENGE_PRODUZIERT]</td>
<td>{|Reserviert:|}</td>
<td>[MINI_MENGE_RESERVIERT]</td>
</tr>
<tr [ARTIKEL_MENGE_VISIBLE]>
<td>{|Erfolgreich|}:</td>
<td>[MINI_MENGEERFOLGREICH]</td>
<td>{|Produzierbar:|}</td>
<td>[MINI_MENGE_PRODUZIERBAR]</td>
</tr>
</tr>
<td>{|Ausschuss|}:</td>
<td>[MINI_MENGEAUSSCHUSS]</td>
</tr>
</table>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 col-md-height">
<div class="inside inside-full-height">
<legend>{|Protokoll|}</legend>
<div class="inside inside-full-height">
[PROTOKOLL]
</div>
</div>
</div>
</div>
</td>
</tr>
</table>
<div id="[RAND]createdocdialog">
<form id="[RAND]createdocfrom">
<fieldset><legend>{|Artikel|}</legend>
<div id="[RAND]createdocdialoginfo"></div>
<input type="hidden" name="[RAND]createdocsid" id="[RAND]createdocsid" />
<table class="mkTable" width="100%" id="[RAND]createdocdialogtable">
</table>
</fieldset>
<fieldset><legend>{|Bestellung bei externen Produzent|}</legend>
<table>
<tr>
<td nowrap>
<input type="radio" id="[RAND]createdoctypecreatebestellung" name="[RAND]createdoctypebestellungtyp" value="createbestellung" checked="checked" />
<label for="[RAND]createdoctypecreatebestellung">{|neue Bestellung anlegen|}</label>
<label for="[RAND]createdocadresse">{|bei Lieferant|}:</label>
</td><td nowrap>
<input type="text" id="[RAND]createdocadresse" name="[RAND]createdocadresse" size="30" />
</td>
</tr>
<tr class="[RAND]createdoctypetrlieferant"><td></td></tr>
<tr>
<td>
<input type="radio" id="[RAND]createdoctypeaddtobestellung" name="[RAND]createdoctypebestellungtyp" value="addtobestellung" /> <label for="[RAND]createdoctypeaddtobestellung">{|zu bestehender Bestellung anlegen|}:</label>
</td><td>
<input id="[RAND]createdocbestellung" name="[RAND]createdocbestellung" type="text" size="30"/>
</td>
</tr>
<tr id="[RAND]createdoctrbestellungnoprice">
<td colspan="2">
<input type="checkbox" id="[RAND]createdoctypebestellungnoprice" name="[RAND]createdoctypebestellungnoprice" value="1" [NEWSUPPLIERSORDERHASPRICE]/>
<label for="[RAND]createdoctypebestellungnoprice">{|Preis für Hauptprodukt nicht setzen|}</label>
</td>
</tr>
</table>
</fieldset>
<fieldset><legend>{|Beistellen des Materials|}</legend>
<table>
<tr id="[RAND]createdoctrtypebestellung">
<td colspan="2">
<input type="radio" id="[RAND]createdoctypebestellung" name="[RAND]createdoctype" value="bestellung" checked="checked" />
<label for="[RAND]createdoctypebestellung">{|Artikel sofort auslagern (basierend auf Bestellung)|}</label>
</td>
</tr>
<tr id="[RAND]createdoctrtypeauftrag">
<td colspan="2">
<input type="radio" id="[RAND]createdoctypeauftrag" name="[RAND]createdoctype" value="auftrag" />
<label for="[RAND]createdoctypeauftrag">{|Auftrag für Beistellung anlegen|}</label>
</td>
</tr>
</table>
</fieldset>
<fieldset><legend>{|Produktion|}</legend>
<table>
<tr id="[RAND]createdoctrprodstarten">
<td colspan="2">
<input type="checkbox" id="[RAND]createdocstartprod" name="[RAND]createdocstartprod" value="1" />
<label for="[RAND]createdocstartprod">{|Produktion starten|}</label>
</td>
</tr>
</table>
</fieldset>
</form>
</div>
<script type="application/javascript">
[AUTOCOMPLETE]
$(document).ready(function() {
$('#[RAND]createdocdialog').dialog(
{
modal: true,
autoOpen: false,
minWidth: 940,
title: 'Auftrag/Bestellung anlegen',
buttons: {
'OK': function () {
var $addr = $('#[RAND]createdocadresse');
var $best = $('#[RAND]createdocbestellung');
var allempty = ($($addr).val()+'' === '') &&
($($best).length === 0 || $($best).val()+'' === '');
if(allempty) {
alert('Bitte eine Adresse oder Bestellung auswählen');
} else {
if($('#[RAND]createdoctypebestellung').prop('checked') || $('#[RAND]createdoctypeauftrag').prop('checked')) {
$.ajax({
url: 'index.php?module=produktion&action=edit&cmd=createdocument&id=[ID]&frame=[FRAMEPARAM]',
type: 'POST',
dataType: 'json',
data: $('#[RAND]createdocfrom').serialize(),
success: function (data) {
//$('#[RAND]createdocdialog').dialog('close');
$('#[RAND]createdocdialoginfo').html(typeof data.html != 'undefined'? data.html:'');
if(data.html != '') {
$('input.[RAND]createdoc').remove();
}
$('#[RAND]createdocdialog').dialog('close');
if(typeof data.deliverynoteinfo != 'undefined') {
$('#[RAND]bestellungen').html(data.deliverynoteinfo);
bindButton[RAND]();
}
},
beforeSend: function () {
}
});
}
}
},
'ABBRECHEN': function () {
$(this).dialog('close');
}
},
close: function (event, ui) {
}
});
bindButton[RAND]();
});
function bindButton[RAND](){
$('input.[RAND]createdoc').on('click', function () {
$('#[RAND]createdocsid').val($(this).data('sid'));
$.ajax({
url: 'index.php?module=produktion&action=edit&cmd=gettableforcreatedocument&id=[ID]',
type: 'POST',
dataType: 'json',
data: {sid: $(this).data('sid'),rand:'[RAND]'},
success: function (data) {
$('#[RAND]createdocdialoginfo').html(typeof data.info != 'undefined'? data.info:'');
$('#[RAND]createdocdialogtable').html(data.html);
$('#[RAND]createdocadresse').val(data.adresse);
$('#[RAND]createdocbestellung').html(data.bestellung);
$('#[RAND]createdocauftrag').html(data.auftrag);
$('#[RAND]createdocdialog').dialog('open');
if(data.displayprodstart) {
$('#[RAND]createdoctrprodstarten').show();
} else {
$('#[RAND]createdoctrprodstarten').hide();
}
addClicklupe();
lupeclickevent();
// AutoComplete-Ergebnisboxen an Dialog-Fenster anhängen.
// Ansonsten wird AutoComplete-Ergebnis evtl. nicht sichtbar unterhalb des Dialog-Fensters angezeigt.
var $uiDialog = $('#[RAND]createdocdialog').first();
$($uiDialog).find('input.ui-autocomplete-input').autocomplete('option', 'appendTo', $uiDialog);
},
beforeSend: function () {
}
});
});
}
</script>
@@ -0,0 +1,33 @@
<div id="tabs">
<ul>
<li><a href="#tabs-1"></a></li>
</ul>
<!-- Example for multiple tabs
<ul hidden">
<li><a href="#tabs-1">First Tab</a></li>
<li><a href="#tabs-2">Second Tab</a></li>
</ul>
-->
<div id="tabs-1">
[MESSAGE]
<form action="" method="post">
[FORMHANDLEREVENT]
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|<a href="index.php?module=produktion&action=edit&id=[PRODUKTIONID]#tabs-3">PRODUKTION [PRODUKTIONBELEGNR]<a>|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<tr><td>{|Artikel|}:</td><td><input type="text" id="artikel" name="artikel" value="[ARTIKEL]" size="40"></td></tr>
<tr><td>{|Menge|}:</td><td><input type="text" name="menge" value="[MENGE]" size="40"></td></tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
<input type="submit" name="submit" value="Speichern" style="float:right"/>
</form>
</div>
</div>
+108
View File
@@ -0,0 +1,108 @@
<div id="tabs">
<ul>
<li><a href="#tabs-1"></a></li>
</ul>
<!-- Example for multiple tabs
<ul hidden">
<li><a href="#tabs-1">First Tab</a></li>
<li><a href="#tabs-2">Second Tab</a></li>
</ul>
-->
<div id="tabs-1">
[MESSAGE]
<div class="row">
<div class="row-height">
<div class="col-xs-14 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|OpenXE Upgrade-System|}</legend>
Das Upgrade funktioniert in 2 Schritten: Dateien aktualisieren, Datenbank auffrischen. Wenn das Upgrade lange l&auml;uft, kann der Fortschritt in einem neuen Fenster mit "Anzeige auffrischen" angezeigt werden.<br><br>
Falls nach einem Abbruch oder schwerwiegenden Fehler kein Upgrade möglich ist, im Hauptordner den Ordner ".git" l&ouml;schen und das Upgrade in der Konsole erneut durchf&uuml;hren.
Dazu im Unterordner "upgrade" diesen Befehl starten: <pre>./upgrade.sh -do</pre>
</fieldset>
</div>
</div>
</div>
</div>
<form action="" method="post">
[FORMHANDLEREVENT]
<div class="row">
<div class="row-height">
<div class="col-xs-14 col-md-12 col-md-height">
<div class="inside inside-full-height">
<div class="row">
<div class="row-height">
<div class="col-xs-14 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Aktuelle Version|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<b>OpenXE [CURRENT]</b>
</table>
</fieldset>
</div>
</div>
</div>
</div>
<div class="row">
<div class="row-height">
<div class="col-xs-14 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Ausgabe|}</legend>
<table width="100%" border="0" class="mkTableFormular">
[OUTPUT_FROM_CLI]
</table>
</fieldset>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-xs-14 col-md-2 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Aktionen|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<tr><td colspan=2><button name="submit" value="refresh" class="ui-button-icon" style="width:100%;">Anzeige auffrischen</button></td></tr>
<tr><td colspan=2><button name="submit" value="check_upgrade" class="ui-button-icon" style="width:100%;">Upgrades pr&uuml;fen</button></td></tr>
<tr><td style="width:100%;">{|Upgrade-Details anzeigen|}:</td><td><input type="checkbox" name="details_anzeigen" value=1 [DETAILS_ANZEIGEN] size="20"></td></tr>
<tr [UPGRADE_VISIBLE]><td colspan=2><button name="submit" formtarget="_blank" value="do_upgrade" class="ui-button-icon" style="width:100%;">UPGRADE</button></td></tr>
<tr [UPGRADE_VISIBLE]><td style="width:100%;">{|Erzwingen (-f)|}:</td><td><input type="checkbox" name="erzwingen" value=1 [ERZWINGEN] size="20"></td></tr>
<tr><td colspan=2><button name="submit" value="check_db" class="ui-button-icon" style="width:100%;">Datenbank pr&uuml;fen</button></td></tr>
<tr><td style="width:100%;">{|Datenbank-Details anzeigen|}:</td><td><input type="checkbox" name="db_details_anzeigen" value=1 [DB_DETAILS_ANZEIGEN] size="20"></td></tr>
<tr [UPGRADE_DB_VISIBLE]><td colspan=2><button name="submit" formtarget="_blank" value="do_db_upgrade" class="ui-button-icon" style="width:100%;">Datenbank UPGRADE</button></td></tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
</form>
</div>
<!-- Example for 2nd tab
<div id="tabs-2">
[MESSAGE]
<form action="" method="post">
[FORMHANDLEREVENT]
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|...|}</legend>
<table width="100%" border="0" class="mkTableFormular">
...
</table>
</fieldset>
</div>
</div>
</div>
</div>
<input type="submit" name="submit" value="Speichern" style="float:right"/>
</form>
</div>
-->
</div>
+3 -3
View File
@@ -95,15 +95,15 @@ class Dateien {
$heading = array('ID','Titel', 'Beschreibung', 'Verkn&uuml;pfung', 'Geloescht', 'Logdatei', 'Men&uuml;');
$width = array('10%'); // Fill out manually later
$findcols = array('d.id','d.titel', 'd.beschreibung', 'd.nummer', 'd.geloescht', 'd.logdatei');
$searchsql = array('d.titel', 'd.beschreibung', 'd.nummer', 'd.geloescht', 'd.logdatei');
$findcols = array('d.id','d.titel', 'd.beschreibung', 'ds.objekt', 'd.geloescht', 'd.logdatei');
$searchsql = array('d.titel', 'd.beschreibung', 'd.nummer', 'd.geloescht', 'd.logdatei','ds.objekt');
$defaultorder = 1;
$defaultorderdesc = 0;
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" . "<a href=\"index.php?module=dateien&action=edit&id=%value%\"><img src=\"./themes/{$app->Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"></a></td></tr></table>";
$sql = "SELECT SQL_CALC_FOUND_ROWS d.id, d.id, d.titel, d.beschreibung, GROUP_CONCAT(ds.objekt SEPARATOR ', '), d.geloescht, d.logdatei, d.id FROM datei d LEFT join datei_stichwoerter ds ON ds.datei = d.id";
$sql = "SELECT SQL_CALC_FOUND_ROWS d.id, d.id, d.titel, d.beschreibung, GROUP_CONCAT(ds.objekt SEPARATOR ', ') as verknuepfung, d.geloescht, d.logdatei, d.id FROM datei d LEFT join datei_stichwoerter ds ON ds.datei = d.id";
$where = "1";
$count = "SELECT count(DISTINCT id) FROM datei WHERE $where";
+14 -13
View File
@@ -1346,17 +1346,17 @@ class Lager extends GenLager {
case "lager_reservierungen":
$allowed['lager'] = array('reservierungen');
$heading = array('Kunde','Belegart','Belegnr','Status','Artikel','Menge','Projekt','Grund','Men&uuml;');
$width = array('20%','20%','5%','10%','20%','1%');
$findcols = array('t.kunde', 't.typ', 't.belegnr', 't.status', 't.Artikel', 't.menge', 't.projekt', 't.grund', 't.rid');
$searchsql = array('t.kunde', 't.typ', 't.belegnr', 't.status', 't.Artikel', $app->erp->FormatMenge('t.menge'), 't.projekt', 't.grund');
$heading = array('Kunde','Belegart','Belegnr','Status','Artikelnummer','Artikel','Menge','Projekt','Grund','Men&uuml;');
$width = array('20%', '10%', '5%', '5%', '5%', '20%', '1%', '10%', '20%');
$findcols = array('t.kunde', 't.typ', 't.belegnr', 't.status','t.Artikelnummer', 't.Artikel', 't.menge', 't.projekt', 't.grund', 't.rid');
$searchsql = array('t.kunde', 't.typ', 't.belegnr', 't.status','t.Artikelnummer', 't.Artikel', $app->erp->FormatMenge('t.menge'), 't.projekt', 't.grund');
$defaultorder = 1; //Optional wenn andere Reihenfolge gewuenscht
$defaultorderdesc = 1;
//$sumcol = 9;
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap><a href=\"#\" onclick=DeleteDialog(\"index.php?module=lager&action=artikelentfernenreserviert&reservierung=%value%\"); ><img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\"></a></td></tr></table>";
$alignright = array(6);
$numbercols = array(5);
$alignright = array(7);
$numbercols = array(6);
$menucol = 5;
//$moreinfo = true;
$sql = "
@@ -1366,6 +1366,7 @@ class Lager extends GenLager {
t.typ,
t.belegnr,
t.status,
t.Artikelnummer,
t.Artikel,
".$app->erp->FormatMenge('t.menge').",
t.projekt,
@@ -1375,43 +1376,43 @@ class Lager extends GenLager {
FROM
(
(
SELECT r.id as rid, adr.name as kunde,'Auftrag' as typ,if(auf.belegnr = '','ENTWURF',auf.belegnr) as belegnr ,if(auf.status = '','angelegt',auf.status) as status, a.name_de as Artikel,r.menge,p.abkuerzung as projekt,r.grund, r.id FROM lager_reserviert r LEFT JOIN artikel a ON a.id=r.artikel LEFT JOIN projekt p ON
SELECT r.id as rid, adr.name as kunde,'Auftrag' as typ,if(auf.belegnr = '','ENTWURF',auf.belegnr) as belegnr ,if(auf.status = '','angelegt',auf.status) as status, a.nummer as Artikelnummer, a.name_de as Artikel,r.menge,p.abkuerzung as projekt,r.grund, r.id FROM lager_reserviert r LEFT JOIN artikel a ON a.id=r.artikel LEFT JOIN projekt p ON
p.id=r.projekt LEFT JOIN adresse adr ON r.adresse=adr.id
INNER JOIN auftrag auf ON auf.id = r.parameter AND r.objekt = 'auftrag'
)
UNION ALL
(
SELECT r.id as rid, adr.name as kunde,'Lieferschein' as typ,if(l.belegnr = '','ENTWURF',l.belegnr) as belegnr ,if(l.status = '','angelegt',l.status) as status, a.name_de as Artikel,r.menge,p.abkuerzung as projekt,r.grund, r.id FROM lager_reserviert r LEFT JOIN artikel a ON a.id=r.artikel LEFT JOIN projekt p ON
SELECT r.id as rid, adr.name as kunde,'Lieferschein' as typ,if(l.belegnr = '','ENTWURF',l.belegnr) as belegnr ,if(l.status = '','angelegt',l.status) as status, a.nummer as Artikelnummer, a.name_de as Artikel,r.menge,p.abkuerzung as projekt,r.grund, r.id FROM lager_reserviert r LEFT JOIN artikel a ON a.id=r.artikel LEFT JOIN projekt p ON
p.id=r.projekt LEFT JOIN adresse adr ON r.adresse=adr.id
INNER JOIN lieferschein l ON l.id = r.parameter AND r.objekt = 'lieferschein'
)
UNION ALL
(
SELECT r.id as rid, adr.name as kunde,'Produktion' as typ,if(l.belegnr = '','ENTWURF',l.belegnr) as belegnr ,if(l.status = '','angelegt',l.status) as status, a.name_de as Artikel,r.menge,p.abkuerzung as projekt,r.grund, r.id FROM lager_reserviert r LEFT JOIN artikel a ON a.id=r.artikel LEFT JOIN projekt p ON
SELECT r.id as rid, adr.name as kunde,'Produktion' as typ,if(l.belegnr = '','ENTWURF',l.belegnr) as belegnr ,if(l.status = '','angelegt',l.status) as status, a.nummer as Artikelnummer, a.name_de as Artikel,r.menge,p.abkuerzung as projekt,r.grund, r.id FROM lager_reserviert r LEFT JOIN artikel a ON a.id=r.artikel LEFT JOIN projekt p ON
p.id=r.projekt LEFT JOIN adresse adr ON r.adresse=adr.id
INNER JOIN produktion l ON l.id = r.parameter AND r.objekt = 'produktion'
)
UNION ALL
(
SELECT r.id as rid, adr.name as kunde,'Auftrag' as typ,'GEL&Ouml;SCHT' as belegnr ,'GEL&Ouml;SCHT' as status, a.name_de as Artikel,r.menge,p.abkuerzung as projekt,r.grund, r.id FROM lager_reserviert r LEFT JOIN artikel a ON a.id=r.artikel LEFT JOIN projekt p ON
SELECT r.id as rid, adr.name as kunde,'Auftrag' as typ,'GEL&Ouml;SCHT' as belegnr ,'GEL&Ouml;SCHT' as status, a.nummer as Artikelnummer, a.name_de as Artikel,r.menge,p.abkuerzung as projekt,r.grund, r.id FROM lager_reserviert r LEFT JOIN artikel a ON a.id=r.artikel LEFT JOIN projekt p ON
p.id=r.projekt LEFT JOIN adresse adr ON r.adresse=adr.id
LEFT JOIN auftrag auf ON auf.id = r.parameter AND r.objekt = 'auftrag' WHERE isnull(auf.id) AND r.objekt = 'auftrag'
)
UNION ALL
(
SELECT r.id as rid, adr.name as kunde,'Lieferschein' as typ,'GEL&Ouml;SCHT' as belegnr ,'GEL&Ouml;SCHT' as status, a.name_de as Artikel,r.menge,p.abkuerzung as projekt,r.grund, r.id FROM lager_reserviert r LEFT JOIN artikel a ON a.id=r.artikel LEFT JOIN projekt p ON
SELECT r.id as rid, adr.name as kunde,'Lieferschein' as typ,'GEL&Ouml;SCHT' as belegnr ,'GEL&Ouml;SCHT' as status, a.nummer as Artikelnummer, a.name_de as Artikel,r.menge,p.abkuerzung as projekt,r.grund, r.id FROM lager_reserviert r LEFT JOIN artikel a ON a.id=r.artikel LEFT JOIN projekt p ON
p.id=r.projekt LEFT JOIN adresse adr ON r.adresse=adr.id
LEFT JOIN lieferschein l ON l.id = r.parameter AND r.objekt = 'lieferschein' WHERE isnull(l.id) AND r.objekt = 'lieferschein'
)
UNION ALL
(
SELECT r.id as rid, adr.name as kunde,'Produktion' as typ,'GEL&Ouml;SCHT' as belegnr ,'GEL&Ouml;SCHT' as status, a.name_de as Artikel,r.menge,p.abkuerzung as projekt,r.grund, r.id FROM lager_reserviert r LEFT JOIN artikel a ON a.id=r.artikel LEFT JOIN projekt p ON
SELECT r.id as rid, adr.name as kunde,'Produktion' as typ,'GEL&Ouml;SCHT' as belegnr ,'GEL&Ouml;SCHT' as status, a.nummer as Artikelnummer, a.name_de as Artikel,r.menge,p.abkuerzung as projekt,r.grund, r.id FROM lager_reserviert r LEFT JOIN artikel a ON a.id=r.artikel LEFT JOIN projekt p ON
p.id=r.projekt LEFT JOIN adresse adr ON r.adresse=adr.id
LEFT JOIN produktion l ON l.id = r.parameter AND r.objekt = 'produktion' WHERE isnull(l.id) AND r.objekt = 'produktion'
)
UNION ALL
(
SELECT r.id as rid, adr.name as kunde,r.objekt as typ,'' as belegnr , '' as status, a.name_de as Artikel,r.menge,p.abkuerzung as projekt,r.grund, r.id FROM lager_reserviert r LEFT JOIN artikel a ON a.id=r.artikel LEFT JOIN projekt p ON
SELECT r.id as rid, adr.name as kunde,r.objekt as typ,'' as belegnr , '' as status, a.nummer as Artikelnummer, a.name_de as Artikel, r.menge,p.abkuerzung as projekt,r.grund, r.id FROM lager_reserviert r LEFT JOIN artikel a ON a.id=r.artikel LEFT JOIN projekt p ON
p.id=r.projekt LEFT JOIN adresse adr ON r.adresse=adr.id WHERE r.objekt <> 'auftrag' AND r.objekt <> 'lieferschein' AND r.objekt <> 'produktion'
)
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+249
View File
@@ -0,0 +1,249 @@
<?php
/*
* Copyright (c) 2022 OpenXE project
*/
use Xentral\Components\Database\Exception\QueryFailureException;
class Produktion_position {
function __construct($app, $intern = false) {
$this->app = $app;
if ($intern)
return;
$this->app->ActionHandlerInit($this);
$this->app->ActionHandler("list", "produktion_position_list");
$this->app->ActionHandler("create", "produktion_position_edit"); // This automatically adds a "New" button
$this->app->ActionHandler("edit", "produktion_position_edit");
$this->app->ActionHandler("delete", "produktion_position_delete");
$this->app->DefaultActionHandler("list");
$this->app->ActionHandlerListen($app);
}
public function Install() {
/* Fill out manually later */
}
static function TableSearch(&$app, $name, $erlaubtevars) {
switch ($name) {
case "produktion_position_list":
$allowed['produktion_position_list'] = array('list');
$heading = array('','','produktion', 'artikel', 'projekt', 'bezeichnung', 'beschreibung', 'internerkommentar', 'nummer', 'menge', 'preis', 'waehrung', 'lieferdatum', 'vpe', 'sort', 'status', 'umsatzsteuer', 'bemerkung', 'geliefert', 'geliefert_menge', 'explodiert', 'explodiert_parent', 'logdatei', 'nachbestelltexternereinkauf', 'beistellung', 'externeproduktion', 'einheit', 'steuersatz', 'steuertext', 'erloese', 'erloesefestschreiben', 'freifeld1', 'freifeld2', 'freifeld3', 'freifeld4', 'freifeld5', 'freifeld6', 'freifeld7', 'freifeld8', 'freifeld9', 'freifeld10', 'freifeld11', 'freifeld12', 'freifeld13', 'freifeld14', 'freifeld15', 'freifeld16', 'freifeld17', 'freifeld18', 'freifeld19', 'freifeld20', 'freifeld21', 'freifeld22', 'freifeld23', 'freifeld24', 'freifeld25', 'freifeld26', 'freifeld27', 'freifeld28', 'freifeld29', 'freifeld30', 'freifeld31', 'freifeld32', 'freifeld33', 'freifeld34', 'freifeld35', 'freifeld36', 'freifeld37', 'freifeld38', 'freifeld39', 'freifeld40', 'stuecklistestufe', 'teilprojekt', 'Men&uuml;');
$width = array('1%','1%','10%'); // Fill out manually later
$findcols = array('p.produktion', 'p.artikel', 'p.projekt', 'p.bezeichnung', 'p.beschreibung', 'p.internerkommentar', 'p.nummer', 'p.menge', 'p.preis', 'p.waehrung', 'p.lieferdatum', 'p.vpe', 'p.sort', 'p.status', 'p.umsatzsteuer', 'p.bemerkung', 'p.geliefert', 'p.geliefert_menge', 'p.explodiert', 'p.explodiert_parent', 'p.logdatei', 'p.nachbestelltexternereinkauf', 'p.beistellung', 'p.externeproduktion', 'p.einheit', 'p.steuersatz', 'p.steuertext', 'p.erloese', 'p.erloesefestschreiben', 'p.freifeld1', 'p.freifeld2', 'p.freifeld3', 'p.freifeld4', 'p.freifeld5', 'p.freifeld6', 'p.freifeld7', 'p.freifeld8', 'p.freifeld9', 'p.freifeld10', 'p.freifeld11', 'p.freifeld12', 'p.freifeld13', 'p.freifeld14', 'p.freifeld15', 'p.freifeld16', 'p.freifeld17', 'p.freifeld18', 'p.freifeld19', 'p.freifeld20', 'p.freifeld21', 'p.freifeld22', 'p.freifeld23', 'p.freifeld24', 'p.freifeld25', 'p.freifeld26', 'p.freifeld27', 'p.freifeld28', 'p.freifeld29', 'p.freifeld30', 'p.freifeld31', 'p.freifeld32', 'p.freifeld33', 'p.freifeld34', 'p.freifeld35', 'p.freifeld36', 'p.freifeld37', 'p.freifeld38', 'p.freifeld39', 'p.freifeld40', 'p.stuecklistestufe', 'p.teilprojekt');
$searchsql = array('p.produktion', 'p.artikel', 'p.projekt', 'p.bezeichnung', 'p.beschreibung', 'p.internerkommentar', 'p.nummer', 'p.menge', 'p.preis', 'p.waehrung', 'p.lieferdatum', 'p.vpe', 'p.sort', 'p.status', 'p.umsatzsteuer', 'p.bemerkung', 'p.geliefert', 'p.geliefert_menge', 'p.explodiert', 'p.explodiert_parent', 'p.logdatei', 'p.nachbestelltexternereinkauf', 'p.beistellung', 'p.externeproduktion', 'p.einheit', 'p.steuersatz', 'p.steuertext', 'p.erloese', 'p.erloesefestschreiben', 'p.freifeld1', 'p.freifeld2', 'p.freifeld3', 'p.freifeld4', 'p.freifeld5', 'p.freifeld6', 'p.freifeld7', 'p.freifeld8', 'p.freifeld9', 'p.freifeld10', 'p.freifeld11', 'p.freifeld12', 'p.freifeld13', 'p.freifeld14', 'p.freifeld15', 'p.freifeld16', 'p.freifeld17', 'p.freifeld18', 'p.freifeld19', 'p.freifeld20', 'p.freifeld21', 'p.freifeld22', 'p.freifeld23', 'p.freifeld24', 'p.freifeld25', 'p.freifeld26', 'p.freifeld27', 'p.freifeld28', 'p.freifeld29', 'p.freifeld30', 'p.freifeld31', 'p.freifeld32', 'p.freifeld33', 'p.freifeld34', 'p.freifeld35', 'p.freifeld36', 'p.freifeld37', 'p.freifeld38', 'p.freifeld39', 'p.freifeld40', 'p.stuecklistestufe', 'p.teilprojekt');
$defaultorder = 1;
$defaultorderdesc = 0;
$dropnbox = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`, CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',p.id,'\" />') AS `auswahl`";
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" . "<a href=\"index.php?module=produktion_position&action=edit&id=%value%\"><img src=\"./themes/{$app->Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"></a>&nbsp;<a href=\"#\" onclick=DeleteDialog(\"index.php?module=produktion_position&action=delete&id=%value%\");>" . "<img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\"></a>" . "</td></tr></table>";
$sql = "SELECT SQL_CALC_FOUND_ROWS p.id, $dropnbox, p.produktion, p.artikel, p.projekt, p.bezeichnung, p.beschreibung, p.internerkommentar, p.nummer, p.menge, p.preis, p.waehrung, p.lieferdatum, p.vpe, p.sort, p.status, p.umsatzsteuer, p.bemerkung, p.geliefert, p.geliefert_menge, p.explodiert, p.explodiert_parent, p.logdatei, p.nachbestelltexternereinkauf, p.beistellung, p.externeproduktion, p.einheit, p.steuersatz, p.steuertext, p.erloese, p.erloesefestschreiben, p.freifeld1, p.freifeld2, p.freifeld3, p.freifeld4, p.freifeld5, p.freifeld6, p.freifeld7, p.freifeld8, p.freifeld9, p.freifeld10, p.freifeld11, p.freifeld12, p.freifeld13, p.freifeld14, p.freifeld15, p.freifeld16, p.freifeld17, p.freifeld18, p.freifeld19, p.freifeld20, p.freifeld21, p.freifeld22, p.freifeld23, p.freifeld24, p.freifeld25, p.freifeld26, p.freifeld27, p.freifeld28, p.freifeld29, p.freifeld30, p.freifeld31, p.freifeld32, p.freifeld33, p.freifeld34, p.freifeld35, p.freifeld36, p.freifeld37, p.freifeld38, p.freifeld39, p.freifeld40, p.stuecklistestufe, p.teilprojekt, p.id FROM produktion_position p";
$where = "1";
$count = "SELECT count(DISTINCT id) FROM produktion_position WHERE $where";
// $groupby = "";
break;
}
$erg = false;
foreach ($erlaubtevars as $k => $v) {
if (isset($$v)) {
$erg[$v] = $$v;
}
}
return $erg;
}
function produktion_position_list() {
/* $this->app->erp->MenuEintrag("index.php?module=produktion_position&action=list", "&Uuml;bersicht");
$this->app->erp->MenuEintrag("index.php?module=produktion_position&action=create", "Neu anlegen");
$this->app->erp->MenuEintrag("index.php", "Zur&uuml;ck");
$this->app->YUI->TableSearch('TAB1', 'produktion_position_list', "show", "", "", basename(__FILE__), __CLASS__);
$this->app->Tpl->Parse('PAGE', "produktion_position_list.tpl");*/
header("Location: index.php?module=produktion&action=list");
}
// End edit process and return to previous page
// Give pid in case of delete because position.id is already gone
function produktion_position_edit_end(string $msg, bool $error, bool $go_to_production, int $pid = 0) {
if ($error) {
$msg = $this->app->erp->base64_url_encode("<div class=\"error\">".$msg."</div>");
} else {
$msg = $this->app->erp->base64_url_encode("<div class=\"info\">".$msg."</div>");
}
if ($go_to_production) {
if ($pid == 0) {
$id = (int) $this->app->Secure->GetGET('id');
$sql = "SELECT p.status, p.id from produktion p INNER JOIN produktion_position pp ON pp.produktion = p.id WHERE pp.id = $id";
$result = $this->app->DB->SelectArr($sql)[0];
$pid = $result['id'];
}
header("Location: index.php?module=produktion&action=edit&id=$pid&msg=$msg#tabs-3");
} else {
header("Location: index.php?module=produktion_position&action=list&msg=$msg");
}
exit();
}
public function produktion_position_delete() {
$id = (int) $this->app->Secure->GetGET('id');
$sql = "SELECT p.status, p.id from produktion p INNER JOIN produktion_position pp ON pp.produktion = p.id WHERE pp.id = $id";
$result = $this->app->DB->SelectArr($sql)[0];
$status = $result['status'];
$pid = $result['id'];
if (!in_array($status,array('angelegt','freigegeben'))) {
$this->produktion_position_edit_end("Bearbeiten nicht möglich, Produktionsstatus ist '$status'",true, true);
}
$this->app->DB->Delete("DELETE FROM `produktion_position` WHERE `id` = '{$id}'");
// Remove reserved items
$this->produktion_position_edit_end("Der Eintrag wurde gel&ouml;scht.", true, true, $pid);
}
/*
* Edit produktion_position item
* If id is empty, create a new one
*/
function produktion_position_edit() {
$id = $this->app->Secure->GetGET('id');
$this->app->Tpl->Set('ID', $id);
$this->app->erp->MenuEintrag("index.php?module=produktion_position&action=edit&id=$id", "Details");
$this->app->erp->MenuEintrag("index.php?module=produktion&action=edit%id=$pid", "Zur&uuml;ck zur &Uuml;bersicht");
$id = $this->app->Secure->GetGET('id');
$input = $this->GetInput();
$submit = $this->app->Secure->GetPOST('submit');
if (empty($id)) {
// New item
$id = 'NULL';
}
$sql = "SELECT p.status, p.id from produktion p INNER JOIN produktion_position pp ON pp.produktion = p.id WHERE pp.id = $id";
$result = $this->app->DB->SelectArr($sql)[0];
$status = $result['status'];
$produktion_id = $result['id'];
$sql = "SELECT FORMAT(menge,0) as menge FROM produktion_position WHERE produktion = $produktion_id AND stuecklistestufe = 1";
$result = $this->app->DB->SelectArr($sql)[0];
$planmenge = $result['menge'];
if ($submit != '')
{
// Write to database
// Add checks here
$input['artikel'] = $this->app->erp->ReplaceArtikel(true, $input['artikel'],true); // Convert from form to db
// Only allowed when produktion is 'freigegeben or angelegt'
if (!in_array($status,array('angelegt','freigegeben'))) {
$this->produktion_position_edit_end("Bearbeiten nicht möglich, Produktionsstatus ist '$status'",true, true);
}
if ($input['menge'] < 0) {
$this->produktion_position_edit_end("Ung&uuml;ltige Menge.",true, true);
}
// Only allow quantities that are a multiple of the target quantity
if ($input['menge'] % $planmenge != 0) {
$this->produktion_position_edit_end("Positionsmenge muss Vielfaches von $planmenge sein.",true, true);
}
$columns = "id, ";
$values = "$id, ";
$update = "";
$fix = "";
foreach ($input as $key => $value) {
$columns = $columns.$fix.$key;
$values = $values.$fix."'".$value."'";
$update = $update.$fix.$key." = '$value'";
$fix = ", ";
}
// echo($columns."<br>");
// echo($values."<br>");
// echo($update."<br>");
$sql = "INSERT INTO produktion_position (".$columns.") VALUES (".$values.") ON DUPLICATE KEY UPDATE ".$update;
// echo($sql);
$this->app->DB->Update($sql);
if ($id == 'NULL') {
$msg = "Das Element wurde erfolgreich angelegt.";
} else {
$msg = "Die Einstellungen wurden erfolgreich &uuml;bernommen.";
}
$this->produktion_position_edit_end($msg,false,true);
}
// Load values again from database
$result = $this->app->DB->SelectArr("SELECT SQL_CALC_FOUND_ROWS pp.id, pp.produktion, p.belegnr, pp.artikel, FORMAT(pp.menge,0) as menge, pp.id FROM produktion_position pp INNER JOIN produktion p ON pp.produktion = p.id "." WHERE pp.id=$id");
foreach ($result[0] as $key => $value) {
$this->app->Tpl->Set(strtoupper($key), $value);
}
/*
* Add displayed items later
*
$this->app->Tpl->Add('KURZUEBERSCHRIFT2', $email);
$this->app->Tpl->Add('EMAIL', $email);
$this->app->Tpl->Add('ANGEZEIGTERNAME', $angezeigtername);
*/
//$this->app->YUI->AutoComplete("artikel", "artikelnummer");
$this->app->YUI->AutoComplete("artikel", "lagerartikelnummer");
$this->app->Tpl->Set('ARTIKEL',$this->app->erp->ReplaceArtikel(false, $result[0]['artikel'], false)); // Convert from form to db
$this->app->Tpl->Set('PRODUKTIONID',$result[0]['produktion']);
$this->app->Tpl->Set('PRODUKTIONBELEGNR',$result[0]['belegnr']);
$this->app->Tpl->Add('MESSAGE',"<div class=\"info\">Positionsmenge muss Vielfaches von $planmenge sein.</div>");
$this->app->Tpl->Parse('PAGE', "produktion_position_edit.tpl");
}
/**
* Get all paramters from html form and save into $input
*/
public function GetInput(): array {
$input = array();
$input['artikel'] = $this->app->Secure->GetPOST('artikel');
$input['menge'] = $this->app->Secure->GetPOST('menge');
return($input);
}
}
File diff suppressed because it is too large Load Diff
+81
View File
@@ -0,0 +1,81 @@
<?php
/*
* Copyright (c) 2022 OpenXE project
*/
use Xentral\Components\Database\Exception\QueryFailureException;
class upgrade {
function __construct($app, $intern = false) {
$this->app = $app;
if ($intern)
return;
$this->app->ActionHandlerInit($this);
$this->app->ActionHandler("list", "upgrade_overview");
$this->app->DefaultActionHandler("list");
$this->app->ActionHandlerListen($app);
}
public function Install() {
/* Fill out manually later */
}
function upgrade_overview() {
$submit = $this->app->Secure->GetPOST('submit');
$verbose = $this->app->Secure->GetPOST('details_anzeigen') === '1';
$db_verbose = $this->app->Secure->GetPOST('db_details_anzeigen') === '1';
$force = $this->app->Secure->GetPOST('erzwingen') === '1';
$this->app->Tpl->Set('DETAILS_ANZEIGEN', $verbose?"checked":"");
$this->app->Tpl->Set('DB_DETAILS_ANZEIGEN', $db_verbose?"checked":"");
include("../upgrade/data/upgrade.php");
$logfile = "../upgrade/data/upgrade.log";
upgrade_set_out_file_name($logfile);
$this->app->Tpl->Set('UPGRADE_VISIBLE', "hidden");
$this->app->Tpl->Set('UPGRADE_DB_VISIBLE', "hidden");
//function upgrade_main(string $directory,bool $verbose, bool $check_git, bool $do_git, bool $export_db, bool $check_db, bool $do_db, bool $force, bool $connection, bool $origin) {
$directory = dirname(getcwd())."/upgrade";
switch ($submit) {
case 'check_upgrade':
$this->app->Tpl->Set('UPGRADE_VISIBLE', "");
unlink($logfile);
upgrade_main($directory,$verbose,true,false,false,true,false,$force,false,false);
break;
case 'do_upgrade':
unlink($logfile);
upgrade_main($directory,$verbose,true,true,false,true,true,$force,false,false);
break;
case 'check_db':
$this->app->Tpl->Set('UPGRADE_DB_VISIBLE', "");
unlink($logfile);
upgrade_main($directory,$db_verbose,false,false,false,true,false,$force,false,false);
break;
case 'do_db_upgrade':
$this->app->Tpl->Set('UPGRADE_DB_VISIBLE', "");
unlink($logfile);
upgrade_main($directory,$db_verbose,false,false,false,true,true,$force,false,false);
break;
case 'refresh':
break;
}
// Read results
$result = file_get_contents($logfile);
$this->app->Tpl->Set('CURRENT', $this->app->erp->Revision());
$this->app->Tpl->Set('OUTPUT_FROM_CLI',nl2br($result));
$this->app->Tpl->Parse('PAGE', "upgrade.tpl");
}
}
-245
View File
@@ -90,8 +90,6 @@ class Welcome
$this->app->ActionHandler("mobileapps","WelcomeMobileApps");
$this->app->ActionHandler("spooler","WelcomeSpooler");
$this->app->ActionHandler("redirect","WelcomeRedirect");
$this->app->ActionHandler("upgrade","WelcomeUpgrade");
$this->app->ActionHandler("upgradedb","WelcomeUpgradeDB");
$this->app->ActionHandler("startseite","WelcomeStartseite");
$this->app->ActionHandler("addnote","WelcomeAddNote");
@@ -886,8 +884,6 @@ $this->app->Tpl->Add('TODOFORUSER',"<tr><td width=\"90%\">".$tmp[$i]['aufgabe'].
$this->app->Tpl->Parse('AUFGABENPOPUP','aufgaben_popup.tpl');
// ENDE:Aufgabe-Bearbeiten-Popup
$this->XentralUpgradeFeed();
$this->app->erp->RunHook('welcome_start', 1 , $this);
// Xentral 20 database compatibility
@@ -1113,97 +1109,6 @@ $this->app->Tpl->Add('TODOFORUSER',"<tr><td width=\"90%\">".$tmp[$i]['aufgabe'].
$this->app->erp->ExitWawi();
}
protected function XentralUpgradeFeed($max=3)
{
if(!$this->app->Conf->WFoffline)
{
$version = $this->app->erp->Version();
$revision = $this->app->erp->Revision();
/*
$tmp = explode('.',$revision);
$branch = strtolower($version).'_'.$tmp[0].'.'.$tmp[1];
$BLOGURL = "https://{$this->app->Conf->updateHost}/wawision_2016.php?branch=".$branch;
$CACHEFILE = $this->app->erp->GetTMP().md5($BLOGURL);
$CACHEFILE2 = $this->app->erp->GetTMP().md5($BLOGURL).'2';
if(!file_exists($CACHEFILE2))
{
if(file_exists($CACHEFILE)){
@unlink($CACHEFILE);
}
}else{
if(trim(file_get_contents($CACHEFILE2)) != $version.$revision){
@unlink($CACHEFILE);
}
}
$CACHETIME = 4; # hours
if(!file_exists($CACHEFILE) || ((time() - filemtime($CACHEFILE)) > 3600 * $CACHETIME)) {
if($feed_contents = @file_get_contents($BLOGURL)) {
$fp = fopen($CACHEFILE, 'w');
fwrite($fp, $feed_contents);
fclose($fp);
@file_put_contents($CACHEFILE2, $version.$revision);
}
}
$feed_contents = file_get_contents($CACHEFILE);
$xml = simplexml_load_string($feed_contents);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
$found = false;
$version_revision = null;
include dirname(dirname(__DIR__)) .'/version.php';
if($version_revision != '') {
$ra = explode('.', $version_revision);
if(isset($ra[2]) && $ra[2] != '') {
$itemsCount = isset($array['channel']['item'])?count($array['channel']['item']):0;
for($i = 0; $i< $itemsCount; $i++) {
if($found !== false) {
unset($array['channel']['item'][$i]);
}
else{
$rev = isset($array['channel']['item'][$i]['guid'])?(string)$array['channel']['item'][$i]['guid']:'';
if($rev === '') {
$rev = trim(trim($array['channel']['item'][$i]['title']),')');
$rev = trim(substr($rev, strrpos($rev, '(')+4));
}
if($rev == $ra[2]) {
$found = $i;
unset($array['channel']['item'][$i]);
}
}
}
}
}
if(!empty($array['channel']) && !empty($array['channel']['item']) && is_array($array['channel']['item'])) {
$itemsCount = isset($array['channel']['item'])?count($array['channel']['item']):0;
for($i = 0; $i < $itemsCount; $i++) {
$this->app->Tpl->Add('WAIWISONFEEDS','<tr><td><b>'.$array['channel']['item'][$i]['title']
.'</b></td></tr><tr><td style="font-size:7pt">'.$array['channel']['item'][$i]['description'].'</td></tr>');
}
}
elseif($found !== false){
$this->app->Tpl->Add('WAIWISONFEEDS','<tr><td><br><b>Ihre Version ist auf dem neusten Stand.</b></td></tr>');
}
$version = $this->app->erp->Version();
if($version==='OSS') {
$this->app->Tpl->Set('INFO', '<br>Sie verwenden die Open-Source Version.');
$this->app->Tpl->Set('TESTBUTTON','<div class="btn">
<a href="index.php?module=appstore&action=testen" class="button" target="_blank">14 Tage Business testen</a>
</div>');
}
$this->app->Tpl->Set('RAND',md5(microtime(true)));
if(!$this->app->erp->RechteVorhanden('welcome','changelog')) {
$this->app->Tpl->Set('BEFORECHANGELOG', '<!--');
$this->app->Tpl->Set('AFTERCHANGELOG', '-->');
}
$this->app->erp->RunHook('welcome_news');
$this->app->Tpl->Parse('WELCOMENEWS','welcome_news.tpl');
*/
}
}
public function WelcomeAddPinwand()
{
@@ -1668,156 +1573,6 @@ $this->app->Tpl->Add('TODOFORUSER',"<tr><td width=\"90%\">".$tmp[$i]['aufgabe'].
return $out;
}
public function WelcomeUpgrade()
{
$this->app->erp->MenuEintrag('index.php?module=welcome&action=start','zur&uuml;ck zur Startseite');
$this->app->erp->Headlines('Update f&uuml;r Xentral');
$this->app->Tpl->Set('STARTBUTTON','<!--');
$this->app->Tpl->Set('ENDEBUTTON','-->');
$lizenz = $this->app->erp->Firmendaten('lizenz');
$schluessel = $this->app->erp->Firmendaten('schluessel');
if($lizenz=='' || $schluessel=='')
{
if(is_file('../wawision.inc.php'))
{
include_once '../wawision.inc.php';
$this->app->erp->FirmendatenSet('lizenz',$WAWISION['serial']);
$this->app->erp->FirmendatenSet('schluessel',$WAWISION['authkey']);
}
}
$this->app->erp->MenuEintrag('index.php?module=welcome&action=upgrade','Update');
$this->XentralUpgradeFeed(5);
$result = '';
if($this->app->Secure->GetPOST('upgrade'))
{
ob_start();
// dringend nacheinander, sonst wird das alte upgrade nur ausgefuehrt
if(!is_dir('.svn'))
{
echo "new update system\r\n";
include '../upgradesystemclient2_include.php';
} else {
echo "Update in Entwicklungsversion\r\n";
}
$result .= "\r\n>>>>>>Bitte klicken Sie jetzt auf \"Weiter mit Schritt 2\"<<<<<<\r\n\r\n";
$result .= ob_get_contents();
$result .= "\r\n>>>>>>Bitte klicken Sie jetzt auf \"Weiter mit Schritt 2\"<<<<<<\r\n\r\n";
ob_end_clean();
if(is_dir('.svn'))
{
$version_revision = 'SVN';
} else {
include '../version.php';
}
$result .="\r\nIhre Version: $version_revision\r\n";
} else {
$result .=">>>>>Bitte auf \"Dateien aktualisieren jetzt starten\" klicken<<<<<<\r\n";
}
if($this->app->erp->Firmendaten('version')==''){
$this->app->erp->FirmendatenSet('version', $this->app->erp->RevisionPlain());
}
$doc_root = preg_replace("!{$_SERVER['SCRIPT_NAME']}$!", '', $_SERVER['SCRIPT_FILENAME']); # ex: /var/www
$path = preg_replace("!^{$doc_root}!", '', __DIR__);
$this->app->Tpl->Add('TAB1',"<h2>Schritt 1 von 2: Dateien aktualisieren</h2><table width=\"100%\"><tr valign=\"top\"><td width=\"70%\"><form action=\"\" method=\"post\" class=\"updateForm\"><input type=\"hidden\" name=\"upgrade\" value=\"1\">
<textarea rows=\"15\" cols=\"90\">$result</textarea>
<br><input type=\"submit\" value=\"Dateien aktualisieren jetzt starten\" name=\"upgrade\">&nbsp;
<input type=\"button\" value=\"Weiter mit Schritt 2\" onclick=\"window.location.href='index.php?module=welcome&action=upgradedb'\">&nbsp;
</form></td><td>[WELCOMENEWS]</td></tr></table>");
$this->app->Tpl->Parse('PAGE','tabview.tpl');
}
public function WelcomeUpgradeDB()
{
$this->app->erp->MenuEintrag('index.php?module=welcome&action=start','zur&uuml;ck zur Startseite');
$this->app->erp->Headlines('Update f&uuml;r Xentral');
$lizenz = $this->app->erp->Firmendaten('lizenz');
$schluessel = $this->app->erp->Firmendaten('schluessel');
if($lizenz=='' || $schluessel=='')
{
if(is_file('../wawision.inc.php'))
{
include_once '../wawision.inc.php';
$this->app->erp->FirmendatenSet('lizenz',$WAWISION['serial']);
$this->app->erp->FirmendatenSet('schluessel',$WAWISION['authkey']);
}
}
$this->app->erp->MenuEintrag('index.php?module=welcome&action=upgradedb','Update');
$this->XentralUpgradeFeed(5);
$result = '';
if($this->app->Secure->GetPOST('upgradedb'))
{
ob_start();
// include("upgradesystemclient.php");
$result .="Starte DB Update\r\n";
$this->app->erp->UpgradeDatabase();
$this->app->erp->check_column_missing_run = true;
$this->app->erp->UpgradeDatabase();
if((!empty($this->app->erp->check_column_missing)?count($this->app->erp->check_column_missing):0) > 0)
{
$result .= "\r\n**** INFORMATION DATENBANK ****\r\n";
foreach($this->app->erp->check_column_missing as $tablename=>$columns)
{
$result .= "\r\n";
foreach($columns as $key=>$columname) {
$result .= $tablename . ':' . $columname . "\r\n";
}
}
$result .= "\r\n**** INFORMATION DATENBANK ****\r\n\r\n";
}
if((!empty($this->app->erp->check_index_missing)?count($this->app->erp->check_index_missing):0) > 0)
{
$result .= "\r\n**** INFORMATION DATENBANK INDEXE ****\r\n";
foreach($this->app->erp->check_index_missing as $tablename=>$columns)
{
$result .= "\r\n";
foreach($columns as $key=>$columname) {
$result .= $tablename . ":" . $columname . "\r\n";
}
}
$result .= "\r\n**** INFORMATION DATENBANK INDEXE ****\r\n\r\n";
}
$result .="Fertig DB Update\r\n";
$result .="\r\n\r\nDas Datenbank Update wurde durchgef&uuml;hrt\r\n";
$result .="\r\n>>>>>Sie k&ouml;nnen nun mit Xentral weiterarbeiten.<<<<<<\r\n";
$result .= ob_get_contents();
ob_end_clean();
} else {
$result .="\r\n>>>>>Bitte auf \"Datenbank Anpassungen jetzt durchf&uuml;hren\" klicken<<<<<<\r\n";
}
if($this->app->erp->Firmendaten('version')==''){
$this->app->erp->FirmendatenSet('version', $this->app->erp->RevisionPlain());
}
$doc_root = preg_replace("!{$_SERVER['SCRIPT_NAME']}$!", '', $_SERVER['SCRIPT_FILENAME']); # ex: /var/www
$path = preg_replace("!^{$doc_root}!", '', __DIR__);
$this->app->Tpl->Add('TAB1',"<h2>Schritt 2 von 2: Datenbank anpassen</h2><table width=\"100%\"><tr valign=\"top\"><td width=\"70%\"><form action=\"\" method=\"post\" class=\"updateForm\"><input type=\"hidden\" name=\"upgrade\" value=\"1\">
<textarea rows=\"15\" cols=\"90\">$result</textarea>
<br><input type=\"submit\" value=\"Datenbank Anpassungen jetzt durchf&uuml;hren\" name=\"upgradedb\">&nbsp;
<input type=\"button\" value=\"Zur&uuml;ck\" onclick=\"window.location.href='index.php?module=welcome&action=upgrade'\">&nbsp;
<input type=\"button\" value=\"Abbrechen\" onclick=\"window.location.href='index.php'\">&nbsp;
</form></td><td>[WELCOMENEWS]</td></tr></table>");
$this->app->Tpl->Parse('PAGE','tabview.tpl');
}
public function Termine($date)
{
$userid = $this->app->User->GetID();
Binary file not shown.

Before

Width:  |  Height:  |  Size: 357 KiB

After

Width:  |  Height:  |  Size: 358 KiB

+4 -7
View File
@@ -31,18 +31,15 @@
Willkommen bei OpenXE ERP.<br/>
Bitte gib Deinen Benutzernamen und Passwort ein!
</div>
<div style="[LOGINWARNING]" class="warning"><p>Achtung: Es werden gerade Wartungsarbeiten in Ihrem System (z.B. Update oder Backup) durch Ihre IT-Abteilung durchgeführt. Das System sollte in wenigen Minuten wieder erreichbar sein. Für Rückfragen wenden Sie sich bitte an Ihren Administrator.</p></div>
<div [LOGINWARNING_VISIBLE] class="warning"><p>[LOGINWARNING_TEXT]</p></div>
[SPERRMELDUNGNACHRICHT]
[PAGE]
<div id="login-footer">
<div class="copyright">
&copy; [YEAR] by OpenXE-org & Xentral&nbsp;ERP&nbsp;Software&nbsp;GmbH.
<br>
[WAWIVERSION]
</br>
OpenXE is free open source software under AGPL-3.0 license, based on <a href="https://xentral.com" target="_blank">Xentral®</a>.
<!-- dead link [LIZENZHINWEIS] -->
&copy; [YEAR] by OpenXE-org & Xentral&nbsp;ERP&nbsp;Software&nbsp;GmbH.<br>
OpenXE is free open source software under AGPL-3.0 license, based on <a href="https://xentral.com" target="_blank">Xentral®</a>.<br>
[XENTRALVERSION]
</div>
</div>
@@ -4,12 +4,12 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Security-Policy" content="default-src 'self';">
<title>Xentral Login</title>
<title>OpenXE Login</title>
<link rel="stylesheet" href="themes/new/css/login.css?v=2">
</head>
<body>
<div class="permission-box">
<h1>LOGIN Xentral</h1>
<h1>OpenXE Login</h1>
<p class="error">Sie haben nicht das Recht auf diese Seite zugreifen zu d&uuml;rfen!</p>
<p><a href="BACK" class="btn btn-primary">Zur&uuml;ck zur vorherigen Seite</a></p>
<p><a href="index.php?module=welcome&action=logout" class="btn btn-secondary">Erneut einloggen</a></p>
-5420
View File
File diff suppressed because it is too large Load Diff
-886
View File
@@ -1,886 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="viewport" content="initial-scale=1, user-scalable=no">
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />
<script type="text/javascript" src="./jquery-update.js"></script>
<script type="text/javascript" src="./jquery-ui-update.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!--<meta name="viewport" content="width=1200, user-scalable=yes" />-->
<title>OpenXE Update</title>
<link rel="stylesheet" type="text/css" href="./jquery-ui.min.css">
<style type="text/css">
@font-face{
font-family: 'Inter';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('./themes/new/fonts/Inter-Regular.woff2?v=3.13') format("woff2"),
url('./themes/new/fonts/Inter-Regular.woff?v=3.13') format("woff");
}
@font-face {
font-family: 'Inter';
font-style: italic;
font-weight: 400;
font-display: swap;
src: url('./themes/new/fonts/Inter-Italic.woff2?v=3.13') format("woff2"),
url('./themes/new/fonts/Inter-Italic.woff?v=3.13') format("woff");
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('./themes/new/fonts/Inter-Bold.woff2?v=3.13') format("woff2"),
url('../themes/new/fonts/Inter-Bold.woff?v=3.13') format("woff");
}
@font-face {
font-family: 'Inter';
font-style: italic;
font-weight: 700;
font-display: swap;
src: url('./themes/new/fonts/Inter-BoldItalic.woff2?v=3.13') format("woff2"),
url('./themes/new/fonts/Inter-BoldItalic.woff?v=3.13') format("woff");
}
html, body {
height:100%;
}
body{
background:#ffffff;
font-family: 'Inter', Arial, Helvetica, sans-serif;
font-size: 8pt;
color: var(--grey);
margin: 0;
padding: 0;
line-height:1.4;
height: 100vh;
SCROLLBAR-FACE-COLOR: #fff;
SCROLLBAR-HIGHLIGHT-COLOR: #fff;
SCROLLBAR-SHADOW-COLOR: #fff;
SCROLLBAR-ARROW-COLOR: #d4d4d4;
SCROLLBAR-BASE-COLOR: #d4d4d4;
SCROLLBAR-DARKSHADOW-COLOR: #d4d4d4;
SCROLLBAR-TRACK-COLOR: #fff;
}
h1 {
color:#000;
text-align:center;
width:100%;
font-size:2em;
padding-top:10px;
}
DIV#footer {
height:32px; margin-top:-6px;
width:100%;
text-align:center; color: #c9c9cb;}
DIV#footer ul {
list-style-type:none;width:100%; text-align:center;
margin: 8px 0 0 0;
padding: 0;
}
DIV#footer ul li { color:rgb(73, 73, 73);font-weight:bold;display: inline;
padding-right: 8px;
list-style: none;
font-size: 0.9em;
}
DIV#footer ul li a{ color:rgb(73, 73, 73);font-weight:bold;ext-decoration: none;
}
#page_container
{
/*border: 0px solid rgb(166, 201, 226);
border-right:8px solid rgb(1, 143, 163);
border-left:8px solid rgb(1, 143, 163);*/
background-color:white;
min-height: calc(100vh - 230px);
/*border-bottom:8px solid rgb(1, 143, 163);*/
overflow:auto
}
input[type="button"] {
cursor:pointer;
}
input[type="submit"] {
cursor:pointer;
}
img.details {
cursor:pointer;
}
.button {
width: 300px;
height: 25px;
background: rgb(120, 185, 93);
padding: 10px;
text-align: center;
border-radius: 3px;
color: white !important;
font-weight: bold;
top: 20px;
position: relative;
text-decoration:none;
}
.button2 {
width: 300px;
height: 25px;
/*background: rgb(1, 143, 163);*/
text-align: center;
border-radius: 3px;
color: white !important;
font-weight: bold;
text-decoration:none;
border:1px solid rgb(120, 185, 93) !important;
margin-left:5px;
background: rgb(120, 185, 93);
}
input:disabled {
background: #dddddd;
}
</style>
[CSSLINKS]
[JAVASCRIPT]
<script type="application/javascript">
var aktprozent = 0;
var updateval = '';
function openPermissionbox(data)
{
var html = '';
if(typeof data.FolderError != 'undefined')
{
html += '<h3>In folgenden Ordnern fehlen Schreibrechte</h3>';
$(data.FolderError).each(function(k,v)
{
html += v+'<br />';
});
}
if(typeof data.FileError != 'undefined')
{
html += '<h3>In folgenden Dateien fehlen Schreibrechte</h3>';
$(data.FileError).each(function(k,v)
{
html += v+'<br />';
});
}
$('#permissionbox').dialog('open');
$('#permissionboxcontent').html(html);
}
$(document).ready(function() {
$('#upgrade').prop('disabled',true);
updateval = $('input#upgrade').val();
$('input#upgrade').val('Suche nach Updates. Bitte warten');
$.ajax({
url: 'update.php?action=ajax&cmd=checkforupdate',
type: 'POST',
dataType: 'json',
data: { version: '[AKTVERSION]'},
fail : function( ) {
$('#upgrade').prop('disabled',false);
$('input#upgrade').val(updateval);
},
error : function() {
$('#upgrade').prop('disabled',false);
$('input#upgrade').val(updateval);
},
success: function(data) {
if(typeof data != 'undefined' && data != null && typeof data.reload != 'undefined')
{
$('input#upgrade').val(updateval);
window.location = window.location.href;
}else{
$('#upgrade').prop('disabled',false);
$('input#upgrade').val(updateval);
if(data !== null && typeof data.error != 'undefined' && data.error != '') {
alert(data.error);
}
}
}
});
setInterval(function(){
if(aktprozent > 0)
{
var pr = parseInt(aktprozent);
if(pr > 0)
{
var modulo = pr % 10;
if(modulo < 9)pr++;
updateprogressbardbupgrade(pr);
}
}
},1000);
$('#permissionbox').dialog(
{
modal: true,
autoOpen: false,
minWidth: 940,
title:'Dateirechte',
buttons: {
OK: function() {
$(this).dialog('close');
}
},
close: function(event, ui){
}
});
});
[DATATABLES]
[SPERRMELDUNG]
[AUTOCOMPLETE]
[JQUERY]
</script>
[ADDITIONALJAVASCRIPT]
<style>
.ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
input.ui-autocomplete-input { background-color:#D5ECF2; }
.ui-autocomplete { font-size: 8pt;z-index: 100000 !important ; }
.ui-widget-header {border:0px;}
.ui-dialog { z-index: 10000 !important ;}
[YUICSS]
</style>
</head>
<body class="ex_highlight_row" [BODYSTYLE]>
[SPERRMELDUNGNACHRICHT]
<div class="container_6" style="height:100%;">
<div class="grid_6 bgstyle" style=" min-height: calc(100vh - 150px);">
<table width="100%"><tr valign="top">
[ICONBAR]
<td>
<style>
.ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default {
color:#fff;/*[TPLFIRMENFARBEHELL];*/
background-color:[TPLFIRMENFARBEHELL];
}
.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {
border: 1px solid #53bed0;
background:none;
background-color: #E5E4E2;
color: #53bed0;
}
.ui-state-hover a,
.ui-state-hover a:hover,
.ui-state-hover a:link,
.ui-state-hover a:visited {
color: #53bed0;
text-decoration: none;
}
.ui-state-hover,
.ui-widget-content .ui-state-hover,
.ui-widget-header .ui-state-hover,
.ui-state-focus,
.ui-widget-content .ui-state-focus,
.ui-widget-header .ui-state-focus {
border: 1px solid #448dae;
font-weight: normal;
color: #53bed0;
}
.ui-tabs-nav {
background: [TPLFIRMENFARBEHELL];
}
.ui-widget-content {
border-top: 1px solid [TPLFIRMENFARBEHELL];
border-left: 1px solid [TPLFIRMENFARBEHELL];
border-right: 1px solid [TPLFIRMENFARBEHELL];
}
.ui-accordion {
border-bottom: 1px solid [TPLFIRMENFARBEHELL];
}
.ui-state-default, .ui-widget-header .ui-state-default {
border: 0px solid none;
}
.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default {
border: 0px solid [TPLFIRMENFARBEHELL];
}
.ui-widget-content .ui-state-default a, .ui-widget-header .ui-state-default a, .ui-button-text {
font-size:8pt;
font-weight:bold;
border: 0px;
}
.ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active {
color:#53bed0;
}
.ui-widget-content .ui-state-active a, .ui-widget-header .ui-state-active a {
color:#53bed0;
font-weight:bold;
font-size:8pt;
background-color:[TPLFIRMENFARBEHELL];
border: 0px;
}
ul.ui-tabs-nav {
background: [TPLFIRMENFARBEHELL];
padding:2px;
}
.ui-widget-header {
background: [TPLFIRMENFARBEHELL];
}
.ui-button-icon-primary.ui-icon.ui-icon-closethick
{
background-color:[TPLFIRMENFARBEDUNKEL];
color:white;
}
#toolbar {
padding: 4px;
display: inline-block;
}
/* support: IE7 */
*+html #toolbar {
display: inline;
}
#wawilink
{
display:none;
font-size:150%;
text-align:center;
}
#downloadhinweis
{
display:none;
font-size:150%;
color:#000;
}
#installhinweis
{
display:none;
font-size:150%;
color:#000;
}
#upgradediv
{
display:none;
}
#dbhinweis
{
display:none;
font-size:150%;
color:#000;
}
#wawilink a {
color:#000;
}
@media screen and (max-width: 767px){
#tabsul
{
float:left;
display:block;
width:70%;
padding-left:0vw;
min-width:55vw;
}
#tabsul li a {
width:100%;
display:block;
}
#tabsul li
{
display:none;
}
#tabsul li.menuaktiv
{
display:block;
width:100%;
padding-top:0px;
}
#tabsul li.opentab
{
width:98%;
display:block;
}
#tabsul li.opentab a
{
width:100%;
display:block;
background-color:#53bed0;
}
#scroller2{
max-width:99vw !important;
}
.navdirekt{
min-width:70vw !important;
}
}
</style>
<div id="scroller2" style="margin-top:3px; padding:0px; position:relative; height:53px;">
<h1>OpenXE Update</h1>
</div>
<div id="page_container">
[PAGE]
<div id="progress" style="width:50%;top:100px;left:25%;position:relative;display:block;">
<div id="downloadhinweis">Download:</div>
<div id="progressbardownload"></div>
<div id="installhinweis">Installieren:</div>
<div id="progressbarupdate"></div>
<div id="dbhinweis">Datenbank Update:</div>
<div id="progressbardbupgrade"></div>
<div id="wawilink"><a href="./index.php" class="button">Installation vollst&auml;ndig - Zur&uuml;ck zu OpenXE</a></div>
<div id="upgradediv"><form id="upgradefrm" method="POST" action="index.php?module=welcome&action=upgradedb"><input type="hidden" name="upgradedb" value="1" /><input type="submit" style="display:none;" value=" "></form></div>
</div>
<script type="application/javascript">
var aktversion = '[AKTVERSION]';
var downloadversion = '[AKTVERSION]';
var ioncubeversion = '[IONCUBEVERSION]';
var phpversion = '[PHPVERSION]';
var todownload = null;
var tocopy = null;
var anzcheck = 0;
var runDownloaded = 0;
function versel()
{
downloadversion = $('#verssel').val();
}
function upgrade()
{
if(aktversion && downloadversion)
{
var text = 'Wirklich updaten?';
if(aktversion == downloadversion)
{
}else{
text = 'Wirklich auf neue Version upgraden?';
}
if(confirm(text))
{
anzcheck = 0;
check2();
}
}
}
function check2()
{
if(anzcheck > 10)
{
alert('Verbindungsproblem beim Updaten. Bitte nochmal das Update starten!');
return;
}
$('#downloadhinweis').show();
$('#installhinweis').show();
$('#dbhinweis').show();
anzcheck++;
$( "#progressbardownload" ).progressbar({
value: 0
});
$( "#progressbarupdate" ).progressbar({
value: 0
});
$( "#progressbardbupgrade" ).progressbar({
value: 0
});
aktprozent = 0;
$.ajax({
url: 'update.php?action=ajax&cmd=checkfiles2',
type: 'POST',
dataType: 'json',
data: { version: downloadversion}})
.done( function(data) {
if(typeof data.error != 'undefined')
{
alert(data.error);
return;
}
if(typeof data.FolderError != 'undefined' || typeof data.FileError != 'undefined')
{
openPermissionbox(data);
return;
}
if(downloadversion != aktversion)
{
$.ajax({
url: 'update.php?action=ajax&cmd=changeversion',
type: 'POST',
dataType: 'json',
data: { version: downloadversion}})
.done( function(data) {
if(typeof data.version != 'undefined')
{
if(downloadversion == data.version)
aktversion = data.version;
check2();
}
});
return;
}
if(typeof data.download != 'undefined')
{
todownload = data.download;
}else{
todownload = null;
}
if(typeof data.copy != 'undefined')
{
tocopy = data.copy;
}else{
tocopy = null;
}
if(todownload != null)
{
if(typeof todownload != 'undefined' && todownload > 0)
{
runDownloaded = 0;
return download2(todownload);
}
}else {
runDownloaded++;
if(runDownloaded < 3) {
return download2(1);
}
$( "#progressbardownload" ).progressbar({
value: 100
});
}
if(tocopy != null)
{
if(typeof tocopy != 'undefined' && tocopy > 0)
{
return copy2(tocopy);
}else {
copy2(0);
}
}else {
copy2(0);
}
})
.fail(function( jqXHR, textStatus, errorThrown ) {
alert('Verbindungsproblem beim Updaten. Bitte nochmal das Update starten!');
}
);
}
function download2(anzahl)
{
if(todownload == null)
{
$( "#progressbardownload" ).progressbar({
value: 100
});
if(anzahl > 0)check2();
if(anzahl == 0)copy2();
}
else if((typeof todownload == 'undefined' || todownload == 0) )
{
$( "#progressbardownload" ).progressbar({
value: 100
});
check2();
}else if((todownload == 0))
{
$( "#progressbardownload" ).progressbar({
value: 100
});
check2();
}else{
var len = todownload;
if(anzahl <= len)
{
$( "#progressbardownload" ).progressbar({
value: false
});
}else if(anzahl > len){
$( "#progressbardownload" ).progressbar({
value: 100*((anzahl-len)/anzahl)
});
}
if(len > 0)
{
var j = 0;
for(j = 0; j < 250; j++) {
$.ajax({
url: 'update.php?action=ajax&cmd=downloadfiles2',
type: 'POST',
dataType: 'json',
async: false,
data: {version: downloadversion}
})
.done(
function (data) {
if (typeof data.todownload !== undefined) {
todownload = data.todownload;
if (todownload === null) {
len = 0;
} else {
len = todownload;
runDownloaded = 0;
}
$("#progressbardownload").progressbar({
value: 100 * ((anzahl - len) / anzahl)
});
}
else {
todownload = null;
}
})
.fail(function (jqXHR, textStatus) {
todownload = null;
check2();
});
if(todownload === null) {
break;
}
}
check2();
}
}
}
function copy2(anzahl)
{
if((todownload == null) || (typeof todownload == 'undefined') || (todownload == 0))
{
if((tocopy == null) || (typeof tocopy == 'undefined') || (tocopy == 0))
{
$( "#progressbarupdate" ).progressbar({
value: 100
});
upgradedb2(1);
}
else{
var len = tocopy;
if(anzahl <= len)
{
$( "#progressbarupdate" ).progressbar({
value: false
});
}else if(anzahl > len){
$( "#progressbarupdate" ).progressbar({
value: 100*(len/anzahl)
});
}
if(len > 0)
{
$.ajax({
url: 'update.php?action=ajax&cmd=copyfiles2',
type: 'POST',
dataType: 'json',
data: { version: downloadversion}})
.done(function(data) {
if(typeof data.tocopy != 'undefined')
{
tocopy = data.tocopy;
if(tocopy === null)
{
len = 0;
}else{
len = tocopy;
}
$( "#progressbardownload" ).progressbar({
value: 100*((anzahl-len)/anzahl)
});
copy2(anzahl);
}
})
.fail(function( jqXHR, textStatus, errorThrown ) {
check2();
});
}
}
}else{
check2();
}
}
function updateprogressbardbupgrade(prozent)
{
aktprozent = prozent;
$( "#progressbardbupgrade" ).progressbar({
value: prozent
});
}
var aktdb = null;
var aktsubdb = null;
function upgradedb2(nr)
{
if(anzcheck > 12 && nr == 0) {
return;
}
if(todownload == null || typeof todownload == 'undefined' || todownload == 0)
{
if(tocopy == null || typeof tocopy == 'undefined' || tocopy == 0)
{
if(nr == 1) {
anzcheck = 0;
}
if(nr < 1)
{
updateprogressbardbupgrade(1);
}else{
updateprogressbardbupgrade(8 * nr - 5);
}
aktdb = nr;
$.ajax({
url: 'update.php?action=ajax&cmd=upgradedb',
type: 'POST',
dataType: 'json',
data: {
version: downloadversion,
nummer: (nr!=10 || aktsubdb == null)?nr:nr+'-'+aktsubdb
}})
.done( function(data) {
if(typeof data.nr != 'undefined')
{
var nrar = (data.nr+'').split('-');
nr = parseInt(nrar[ 0 ]);
if(typeof nrar[ 1 ] != 'undefined') {
aktsubdb = parseInt(nrar[ 1 ]);
}
else {
aktsubdb = null;
}
if(nr > 11 || data.nr == null)
{
updateprogressbardbupgrade(100);
$('#wawilink').show();
}else{
updateprogressbardbupgrade(8 * nr);
upgradedb2(data.nr);
}
}
}).fail(function( jqXHR, textStatus, errorThrown ) {
if(aktdb < 12)
{
if(aktdb == 10) {
if(aktsubdb == null) {
aktsubdb = 1;
}
else {
aktsubdb++;
if(aktsubdb > 100) {
aktdb++;
aktsubdb = null;
}
}
}
else {
aktdb++;
aktsubdb = null;
}
upgradedb2(aktdb);
}else {
aktsubdb = null;
$('#upgradediv').show();
$('#upgradefrm').submit();
}
}
);
}else{
check2();
}
}else{
check2();
}
}
</script>
</div>
</td></tr></table>
<div class="clear"></div>
</div>
<!-- end CONTENT -->
<!-- end RIGHT -->
<div id="footer" class="grid_6">
&copy; [YEAR] OpenXE project & Xentral ERP Software GmbH
</div>
<!-- end FOOTER -->
<div class="clear"></div>
</div>
[JSSCRIPTS]
[BODYENDE]
<div id="permissionbox" style="display:none;">
<div id="permissionboxcontent"></div>
</div>
</body>
</html>
-121
View File
@@ -1,121 +0,0 @@
<center>
<table border="0" celpadding="0" cellspacing="4" width="100%"
height="100%" align="left">
<tr>
<td valign="top">
<form action="" id="frmlogin" method="post"><br>
<table align="center">
[MULTIDB]
<tr>
<td style="width:100%;text-align:center;"><input style="display:none;width:200px;" id="chtype" type="button" value="Login mit Username / PW" /></td>
</tr>
<tr>
<td align="center"><input type="hidden" name="isbarcode" id="isbarcode" value="0" /><input name="username" type="text" size="45" id="username" placeholder="Benutzer"></td>
</tr>
<tr>
<td align="center"><input name="password" id="password" type="password" size="45" placeholder="Passwort"></td>
</tr>
<tr>
<td align="center"><span id="loginmsg">[LOGINMSG]</span>
<span style="color:red">[LOGINERRORMSG]</span></td>
</tr>
<tr>
<td align="center">[STECHUHRDEVICE]</td>
</tr>
<tr>
<td align="center"><input name="token" id="token" type="text" size="45" autocomplete="off" placeholder="optional OTP"><br></td>
</tr>
<tr>
<td align="center"><br><br><input type="submit" value="anmelden"> <input type="reset"
name="Submit" value="zur&uuml;cksetzen"></td>
</tr>
<tr>
<td><br></td>
<td></td>
</tr>
</table>
</form>
</td>
</tr>
</table>
</center>
<script type="text/javascript">
var siv = null;
document.getElementById("username").focus();
$("#isbarcode").val('0');
$(document).ready(function() {
$( "#username" ).focus();
$( "#username" ).on('keydown',function( event ) {
var which = event.which;
if ( which == 13 ) {
event.preventDefault();
if($( "#username" ).val().indexOf("!!!") < 1)
{
$('#password').focus();
}else{
$('#frmlogin').submit();
}
} else {
var iof = $( "#username" ).val().indexOf("!!!");
if(iof > 0)
{
$('#password').focus();
$('#username').val($( "#username" ).val().substring(0,iof));
$("#isbarcode").val('1');
}
}
});
if(typeof(Storage) !== "undefined") {
[RESETSTORAGE]
var devicecode = localStorage.getItem("devicecode");
if(devicecode)
{
$('#stechuhrdevice').each(function(){
$('#token').hide();
$('#password').hide();
$('#username').hide();
$('#loginmsg').hide();
$('#chtype').show();
$('#chtype').on('click',function()
{
$('#token').show();
$('#password').show();
$('#username').show();
$('#loginmsg').show();
$(this).hide();
clearInterval(siv);
});
$('#code').val(devicecode);
$('#stechuhrdevice').focus();
$( "#stechuhrdevice" ).on('keydown',function( event ) {
setTimeout(function(){
if($('#stechuhrdevice').val().length > 205)
setTimeout(function(){$('#frmlogin').submit();},100);
}, 500);
});
siv = setInterval(function(){$('#stechuhrdevice').focus(),200});
});
} else {
$('#stechuhrdevice').hide();
}
} else {
$('#stechuhrdevice').hide();
}
});
</script>
+14
View File
@@ -43,6 +43,20 @@
</div>
</div>
</div>
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset><legend>{|Briefpapier|}</legend>
<table border="0" width="100%">
<tr><td width="300">{|Eigenes Briefpapier f&uuml;r Projekt|}:</td><td>[SPEZIALLIEFERSCHEIN][MSGSPEZIALLIEFERSCHEIN]</td></tr>
<tr><td>{|Beschriftung|}:</td><td>[SPEZIALLIEFERSCHEINBESCHRIFTUNG][MSGSPEZIALLIEFERSCHEINBESCHRIFTUNG]</td></tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-12 col-md-height">