146 Commits
Author SHA1 Message Date
OpenXE 2eabd85b91 added message to do db upgrade after install 2023-07-10 19:10:31 +02:00
OpenXE 1be7ba66ee Release 1.10 2023-07-04 11:18:13 +02:00
OpenXE 56e743334a added rechnung_anzahlpapier_abweichend option for adresse 2023-06-26 19:59:25 +02:00
OpenXE e125a29fa9 bugfix kalender user intern 2023-06-26 09:56:01 +02:00
OpenXE 63a99b1a6e bugfix autoversand print number of invoices according to setting in adresse 2023-06-25 15:32:15 +02:00
OpenXE 1ea3d3a175 bugfix lager seriennummern typo 2023-06-25 15:04:02 +02:00
OpenXE fcb9b0aeb7 bugfix rechnung mahnwesen minidetail 2023-06-24 10:57:59 +02:00
OpenXE 53bb9fcdf9 bugfix ticket system warteschlange 2023-06-23 15:54:33 +02:00
OpenXE 2b2f84a020 emailbackup_edit minor GUI improvements 2023-06-23 08:42:45 +02:00
OpenXE f3587501f2 Bugfix ticket system autoresponder 2023-06-23 08:42:28 +02:00
OpenXE 4b40c27c84 bugfix scrolling to middle of page 2023-06-17 12:27:32 +02:00
OpenXE 265d815534 mahnwesen bugfix delete 2023-06-16 14:09:57 +02:00
OpenXE 7c17b2aed9 Merge remote-tracking branch 'github/master' 2023-06-16 14:04:36 +02:00
OpenXE 174909c178 bugfix mahnwesen status, error on mail 2023-06-16 14:02:58 +02:00
OpenXE b8cfa9efbb bugfix rechnung rechnung_zahlstatus_berechnen 2023-06-16 12:29:50 +02:00
OpenXE 5da0490260 bugfix mahnwesen neu 2023-06-16 12:20:21 +02:00
OpenXE 9fbd0eb85a mahnwesen added e-mail 2023-06-15 17:26:44 +02:00
OpenXE 1c1c7034f1 mahnwesen added CRM for printed dokumente (email not yet implemented) 2023-06-15 17:03:42 +02:00
OpenXE 2c7f113d6b mahnwesen initial 2023-06-13 18:35:59 +02:00
OpenXE 1f6caa8632 mahnwesen initial 2023-06-08 15:35:46 +02:00
OpenXE 73725a31bb rechnung calculate payment status with skonto 2023-06-07 15:40:36 +02:00
OpenXE 06686a6020 removed language selection from login 2023-06-05 14:41:39 +02:00
OpenXE-ERP 1e04647dae Merge pull request #79 from tsgoff/tooltip
tooltip link
2023-06-05 09:37:19 +02:00
tsgoff 62cca6fe3c tooltip link 2023-06-04 22:00:20 +02:00
OpenXE bf10c0d807 bugfix systemhealth db version 2023-06-01 14:15:11 +02:00
OpenXE d9ff872a98 artikelkategorien & artikelbaum 2023-05-31 17:46:03 +02:00
OpenXE 05699986eb .htaccess added ico and css.map 2023-05-31 14:45:22 +02:00
OpenXE dcedcec0f2 bugfix edit positions getpreise 2023-05-30 13:31:29 +02:00
OpenXE 6fc74f1bf3 bugfix AARLGPositionen removed formatmenge because the javascript screws up numbers above 1000 (decimal point vs thousands) 2023-05-25 17:17:54 +02:00
OpenXE 33b5c1e171 ticket system increased and colored red hidden eye icon 2023-05-25 15:55:57 +02:00
OpenXE 3f7cf88d99 fibu_buchungen added temp tables to db_schema.json 2023-05-24 19:29:43 +02:00
OpenXE 1ebaa24473 .htaccess include robots.txt 2023-05-24 15:44:15 +02:00
OpenXE 5ca3a7297b bugfix exportbuchhaltung date of differences 2023-05-24 10:35:56 +02:00
OpenXE 88e1e2ebc2 ticket system show ... ih subject of message is empty 2023-05-23 11:27:47 +02:00
OpenXE 5a4c73d9b8 ticket / mailclient added dump information on mail fetch error 2023-05-23 11:16:16 +02:00
OpenXE d294daa08b ticket system show embedded cid images in ticket view (insecure view) 2023-05-22 20:51:38 +02:00
OpenXE 75bd00770c ticket system show user's tickets and all tickets separately in sidebar 2023-05-22 18:42:20 +02:00
OpenXE 674c7b9958 bugfix send document with ',' in name 2023-05-22 14:01:34 +02:00
OpenXE 60611a2d03 bugfix gutschrift versenden, added column abweichendebezeichnung 2023-05-21 17:27:03 +02:00
OpenXE 2e70e1f2dc bugfix lager lager_bestand menue wrong id 2023-05-21 12:16:54 +02:00
OpenXE 7548c601f5 auftrag refresh PDF and protokoll on teillieferung (teilauftrag) 2023-05-21 11:32:35 +02:00
OpenXE ac8407faed exportbuchhaltung add ignore / export of differences 2023-05-20 14:15:25 +02:00
OpenXE 14e727500e projekt added additional option for calculation of brutto 2023-05-15 12:31:17 +02:00
OpenXE 011f2915c1 bugfix fibu_buchungen rounding 2023-05-12 12:23:43 +02:00
OpenXE 38cf7c3bc2 ticket system bugfix address with subdomain 2023-05-12 11:59:28 +02:00
OpenXE 209364f8c3 artikel stueckliste added referenz column 2023-05-09 10:33:49 +02:00
OpenXE fea7a173dc produktion bugfix display of used parts, bugfix produktion list 2023-05-08 17:24:49 +02:00
OpenXE 33d2ca9497 bestellung show wareneingang in minidetail 2023-05-07 19:02:58 +02:00
OpenXE 9002a66085 wareneingang expanded minidetail 2023-05-05 14:46:16 +02:00
OpenXE c8426bcbc0 wareneingang bugfix bestellung 2023-05-05 14:34:08 +02:00
OpenXE 25cf7de75b wareneingang usability improvements 2023-05-05 14:25:56 +02:00
OpenXE 2d938e96a0 wareneingang added column bestellung 2023-05-05 13:39:03 +02:00
OpenXE 4ffeafa5ac bugfix gruppensumme PDF Briefpapier::Cell_typed(): Argument #3 ($txt) must be of type string, null given 2023-05-05 09:58:15 +02:00
OpenXE 2533e4ca4f bugfix class.yui.php dragndrop positionen 2023-05-04 18:34:17 +02:00
OpenXE a144e2183b class.yui.php refactor count(null) 2023-05-04 16:39:18 +02:00
OpenXE 30ce445ac1 db_schema added explodiert_parent to bestellung_position and rechnung_posistion (seemed to be missing) 2023-05-04 15:51:47 +02:00
OpenXE 51d7ad7f17 bestellvorschlag bugfix html 2023-05-04 14:15:31 +02:00
OpenXE f6d71cbbc8 ticket system bugfix sent mails insecure display enabled 2023-05-03 08:45:57 +02:00
OpenXE 1bf58aa8ba ticket system clean tags 2023-05-02 21:05:32 +02:00
OpenXE 63dbedc1a8 report exclude readonly reports as default, added row preview 2023-05-02 18:57:13 +02:00
OpenXE cd3c0f2113 stueckliste import moved to importvorlage 2023-04-28 16:22:39 +02:00
OpenXE b497d65d81 cronjob lagerzahlen set cache_lagerplatzinhaltmenge only on success 2023-04-27 18:07:08 +02:00
OpenXE 87a884bd8a Bugfix auftrag vorkasse_ok 2023-04-26 11:10:07 +02:00
OpenXE 3efbcb82d9 db_schema.json changed order of fibu_objekte_view and fibu_buchungen_alle_view 2023-04-24 16:54:30 +02:00
OpenXE f0f468c94e mustal bugfix create table key type 2023-04-24 16:49:34 +02:00
OpenXE b82d17d6f4 Merge branch 'prerelease.1.9' 2023-04-24 16:23:37 +02:00
OpenXE 9db337ce95 release 1.9 2023-04-24 16:23:21 +02:00
OpenXE 62f6df1aeb fibu_buchungen added error when startdate is not set 2023-04-23 17:18:51 +02:00
OpenXE 828c1b1a75 Kontoauszuege removed "new" button. 2023-04-23 16:54:52 +02:00
OpenXE 7de88ca3b5 gutschrift freigabe with our without offsettung against rechnung, with offsetting creates fibu_buchung 2023-04-21 14:59:02 +02:00
OpenXE 5794301826 fibu_buchungen db_schema changed views, removed gutschrift vs. rechnung, fibu_objekte independent from zahlungsstatus 2023-04-21 14:52:48 +02:00
OpenXE 1a28b5d75b Prerelease 1.9, added EGPL 2023-04-18 19:14:59 +02:00
OpenXE df292c9c02 db_schema.json revert changes from 95d26d5c6e database upgrade to utf8mb4
reverted change from varchar(255) to text for many columns, due to utf8mb4 problems
2023-04-18 11:54:12 +02:00
OpenXE f0a24b7e5b ticket system improved logging on invalid date 2023-04-17 18:21:43 +02:00
OpenXE 50df55e35e bugfix auftrag offene status <> 'storniert' 2023-04-17 13:45:34 +02:00
OpenXE 4720cc8e94 fibu_buchungen einzelzuordnen multifilter 2023-04-15 18:45:09 +02:00
OpenXE 64d6b90312 fibu_buchungen usability improvements 2023-04-15 10:48:47 +02:00
OpenXE 17bdb1c5e1 auftrag set vorkasse_ok according to fibu_buchungen 2023-04-13 21:58:11 +02:00
OpenXE c1d42f6ceb removed fints-hbci, white-cup-filled-by-coffee.jpg 2023-04-12 22:17:57 +02:00
OpenXE c4eaaa966a removed fints-hbci, white-cup-filled-by-coffee.jpg 2023-04-12 22:16:52 +02:00
OpenXE a43ac720b6 fibu_buchungen single with sachkonto 2023-04-11 19:52:58 +02:00
OpenXE 170a33687f fibu_buchungen views fixed empty date on kontorahmen 2023-04-11 16:41:20 +02:00
OpenXE ea6a6a5dda rechnung removed all updates of ist, except from fibu_buchungen 2023-04-11 15:40:23 +02:00
OpenXE 69172672b2 fibu_buchhaltung belege zuordnen multi option 2023-04-11 15:20:40 +02:00
OpenXE 667b70eaf5 fibu_buchungen booking to kontorahmen 2023-04-08 17:48:39 +02:00
OpenXE 44af8f3b3d Bugfix erpapi lagernummern typo 2023-04-07 18:17:57 +02:00
OpenXE 82fc367405 fibu_buchungen einzelzuordnung 2023-04-06 15:33:53 +02:00
OpenXE 828af9ab50 fibu_buchungen check saldo for vorschlag 2023-04-05 20:38:31 +02:00
OpenXE e79f2839e2 fibu_objekte_view added sachkonto and is_beleg filter 2023-04-05 12:52:50 +02:00
OpenXE 7aab51a390 fibu_buchungen vorschlag now includes saldo info 2023-04-05 12:32:10 +02:00
OpenXE 3dfba163df fibu_buchungen zuordnen with tablesearch instead of easytable 2023-04-05 11:07:12 +02:00
OpenXE 4a4b1f8320 bugfix import kontoauszuege importfehler 2023-04-05 11:02:06 +02:00
OpenXE 03f0f7217b rechnung & gutschrift set zahlungsstatus according to saldo 2023-04-05 11:01:16 +02:00
OpenXE c6a4cf0d23 Usability improvement kontoauszuege and buchungen 2023-04-04 14:15:01 +02:00
OpenXE 92f016d06b bugfix kontoauszuege import decimals and sum display 2023-04-04 13:48:40 +02:00
OpenXE 222b0ac239 importvorlage kontoauszuege 2.betrag 2023-04-04 11:59:53 +02:00
OpenXE 1e59009862 gutschrift mark as offen or bezahlt rework 2023-04-04 11:34:07 +02:00
OpenXE 76740aee02 db_schema changed reference in fibu_buchungen_view from fibu_objekte to fibu_objekte_view 2023-04-04 10:59:49 +02:00
OpenXE 06bc38e66a fibu_buchungen improved cache refresh 2023-04-03 21:17:59 +02:00
OpenXE ad4599e381 fibu_buchungen_alle converted to cached view for better performance 2023-04-03 20:25:00 +02:00
OpenXE b1349afb6b fibu_buchungen bugfix search with multiple results 2023-04-03 16:47:44 +02:00
OpenXE 820dc9fec6 kontoauszuege bugfix importer date and filter import errors 2023-04-03 16:23:00 +02:00
OpenXE 46f9e0728d fibu_buchungen add date limit (firmendaten) 2023-04-03 16:10:28 +02:00
OpenXE 8bdedcb72f Develop version 1.8.1 2023-04-02 17:44:11 +02:00
OpenXE ebd50b4f28 fibu_buchungen document auto assign 2023-04-02 12:23:51 +02:00
OpenXE 85094921a0 bugfix inverted UNIQUE parameter in db_schema and mustal 2023-04-02 11:46:17 +02:00
OpenXE d97f41e293 db_schema adjustments mainly utf8mb3 2023-04-02 10:23:07 +02:00
OpenXE b701a880a4 Merge remote-tracking branch 'github/master' into develop.1.8.1 2023-04-01 22:39:15 +02:00
OpenXE-ERP 7ee2bfae5b Merge pull request #73 from exciler/sendcloud
Versanddienstleiter improvement
2023-04-01 22:10:10 +02:00
OpenXE 2b573268fa fibu buchungen 2023-04-01 20:42:37 +02:00
Andreas Palm e79e2e24d2 Sendcloud: Fix for domestic parcels - use IsEU instead of IstEU :-/ 2023-03-31 22:30:35 +02:00
Andreas Palm 03f51a548a Sendcloud: handle field requirement/null for parcels without customs declaration 2023-03-31 10:21:25 +02:00
Andreas Palm b6c23399c6 Versanddienstleister: display customs form only for non-EU countries, improve product/method selection 2023-03-30 22:24:40 +02:00
OpenXE 689fdb0490 Kontoauszuege konto overview and saldo 2023-03-30 19:29:46 +02:00
OpenXE c223e7c956 mustal improvement view handling 2023-03-30 15:21:33 +02:00
OpenXE a15d7b0b41 database utf8 rework 2023-03-30 15:21:09 +02:00
OpenXE ebc7034164 firmendaten hotfix freifelder 2023-03-30 12:39:04 +02:00
OpenXE 3715c2f205 firmendaten hotfix freifelder 2023-03-30 12:33:38 +02:00
OpenXE 95d26d5c6e database upgrade to utf8mb4 2023-03-30 11:24:14 +02:00
OpenXE 5bc7a64c8c mustal improvement on collation handling 2023-03-30 11:19:46 +02:00
OpenXE b7153c423c fibu_buchungen added, rework of zahlungen auftrag, rechnung, gutschrift 2023-03-28 12:30:57 +02:00
OpenXE 1637bf965a bugfix mustal default values forced lower case 2023-03-28 12:18:41 +02:00
OpenXE 9a6ed1ae75 fibu_buchungen_alle with type and id of editable item 2023-03-27 16:31:30 +02:00
OpenXE-ERP b6b856fd11 Merge pull request #72 from exciler/sendcloud
Versandarten Bugfixes and stability improvements, some cleanup
2023-03-27 15:42:24 +02:00
Andreas Palm c361a82583 add "empty" to versandarten module list 2023-03-27 15:27:20 +02:00
Andreas Palm aa93070185 Merge remote-tracking branch 'upstream/master' into sendcloud
# Conflicts:
#	www/pages/versandarten.php
2023-03-27 15:27:10 +02:00
OpenXE 7a83c9fd29 Bugfix briefpapier freitexte width 2023-03-26 13:28:20 +02:00
OpenXE 09039f9d2a Bugfix user avatar 2023-03-26 13:27:49 +02:00
OpenXE 49dfd255e4 Bugfix briefpapier freitexte width 2023-03-26 13:26:49 +02:00
OpenXE 791a12b731 Bugfix user avatar 2023-03-26 13:23:15 +02:00
OpenXE 62e16cfcc1 fibu_buchungen database definitions 2023-03-25 21:23:20 +01:00
OpenXE 23dc74cd08 Bugfix versandart no module (dummy) 2023-03-25 20:51:16 +01:00
OpenXE 18f2785abd Bugfix typ db_schema 2023-03-25 20:47:08 +01:00
OpenXE 691ad237b5 Merge branch 'develop.1.8' 2023-03-25 20:38:27 +01:00
OpenXE c220639e82 Zahlungsstatus Rechnung Gutschrift reworked with fibu_buchungen 2023-03-25 17:50:04 +01:00
Andreas Palm 51552e7530 cleanup old versandarten 2023-03-23 23:23:03 +01:00
Andreas Palm 696e9efc76 improve stability of versandarten 2023-03-23 23:22:45 +01:00
OpenXE 6a566a99af Kontoauszuege module & importer 2023-03-22 20:37:17 +01:00
OpenXE e356051f5a Zahlungen improvements 2023-03-22 14:33:34 +01:00
OpenXE 1f52278758 mustal added handling of UNIQUE keys 2023-03-21 20:20:44 +01:00
OpenXE ab91715c20 Zahlungen minidetail and collation of relevant documents as tree 2023-03-16 11:49:45 +01:00
OpenXE ecd86d120a Bugfix lager wert calculation of prices added geloescht != 1 and date range 2023-03-14 13:43:36 +01:00
OpenXE 8dd78dfa55 Bugfix lager wert calculation of prices added geloescht != 1 and date range 2023-03-14 13:40:14 +01:00
OpenXE 71883d34ae Zahlungseingang Minidetail hacked rechnung, gutschrift 2023-03-13 17:12:38 +01:00
OpenXE 73dbbb061a Geschaeftskonto module restored (basic variant) 2023-03-13 14:22:39 +01:00
OpenXE-ERP 5638f18770 Merge pull request #67 from exciler/bugfix_gutschrift_php8
fix index accessor for new PHP Versions (implicit const string)
2023-03-13 13:22:04 +01:00
206 changed files with 25119 additions and 35700 deletions
@@ -12,8 +12,9 @@ class ParcelCreation extends ParcelBase
{ {
public ?int $SenderAddressId = null; public ?int $SenderAddressId = null;
public function toApiRequest(): array { public function toApiRequest(): array
return [ {
$data = [
'name' => $this->Name, 'name' => $this->Name,
'company_name' => $this->CompanyName, 'company_name' => $this->CompanyName,
'address' => $this->Address, 'address' => $this->Address,
@@ -32,16 +33,19 @@ class ParcelCreation extends ParcelBase
'total_order_value' => number_format($this->TotalOrderValue, 2, '.', null), 'total_order_value' => number_format($this->TotalOrderValue, 2, '.', null),
'country_state' => $this->CountryState, 'country_state' => $this->CountryState,
'sender_address' => $this->SenderAddressId, 'sender_address' => $this->SenderAddressId,
'customs_invoice_nr' => $this->CustomsInvoiceNr,
'customs_shipment_type' => $this->CustomsShipmentType,
'external_reference' => $this->ExternalReference, 'external_reference' => $this->ExternalReference,
'total_insured_value' => $this->TotalInsuredValue ?? 0, 'total_insured_value' => $this->TotalInsuredValue ?? 0,
'parcel_items' => array_map(fn(ParcelItem $item)=>$item->toApiRequest(), $this->ParcelItems), 'parcel_items' => array_map(fn(ParcelItem $item) => $item->toApiRequest(), $this->ParcelItems),
'is_return' => $this->IsReturn, 'is_return' => $this->IsReturn,
'length' => $this->Length, 'length' => $this->Length,
'width' => $this->Width, 'width' => $this->Width,
'height' => $this->Height, 'height' => $this->Height,
]; ];
} if ($this->CustomsInvoiceNr !== null)
$data['customs_invoice_nr'] = $this->CustomsInvoiceNr;
if ($this->CustomsShipmentType !== null)
$data['customs_shipment_type'] = $this->CustomsShipmentType;
return $data;
}
} }
@@ -128,7 +128,7 @@ final class ImapMailClient implements MailClientInterface
$message = $this->imap->getMessage($msgNumber); $message = $this->imap->getMessage($msgNumber);
} catch (Exception $e) { } catch (Exception $e) {
throw new MessageNotFoundException( throw new MessageNotFoundException(
sprintf('Message number %s not found.', $msgNumber) sprintf("Message number %s could not be fetched.\n\r%s", $msgNumber,print_r($e,true))
); );
} }
@@ -309,6 +309,7 @@ final class MailMessageData implements MailMessageInterface, JsonSerializable
} }
$dateTime = date_create($date->getValue()); $dateTime = date_create($date->getValue());
if ($dateTime === false) { if ($dateTime === false) {
throw new InvalidArgumentException('Invalid date: '.$date->getValue());
return null; return null;
} }
+5
View File
@@ -492,6 +492,8 @@ final class ReportService
$testResult['messagetype'] = 'error'; $testResult['messagetype'] = 'error';
$testResult['message'] = sprintf("QUERY FAILED:\n%s", $e->getMessage()); $testResult['message'] = sprintf("QUERY FAILED:\n%s", $e->getMessage());
$testResult['message'] .= "\n\r".$compiled;
return $testResult; return $testResult;
} }
@@ -500,6 +502,9 @@ final class ReportService
if(count($rows) < 101){ if(count($rows) < 101){
$message = sprintf('Query successful: %s datasets found', count($rows)); $message = sprintf('Query successful: %s datasets found', count($rows));
} }
$message .= "\n\r".print_r($rows[0],true);
$testResult = [ $testResult = [
'messagetype' => 'success', 'messagetype' => 'success',
'message' => $message, 'message' => $message,
@@ -335,7 +335,7 @@ class TicketImportHelper
$queue_id = $this->mailAccount->getTicketQueueId(); $queue_id = $this->mailAccount->getTicketQueueId();
if (!empty($queue_id)) { if (!empty($queue_id)) {
$queue_label = $this->db->Select("SELECT label FROM warteschlangen WHERE id = ".$queue_id." LIMIT 1"); $queue_label = $this->db->Select("SELECT label FROM warteschlangen WHERE label = '".$queue_id."' LIMIT 1");
} }
$insertTicket = "INSERT INTO `ticket` ( $insertTicket = "INSERT INTO `ticket` (
@@ -511,7 +511,10 @@ class TicketImportHelper
continue; continue;
} }
} catch (Throwable $e) { } catch (Throwable $e) {
$this->logger->error('Error during email import '.$messageNumber, ['message' => substr(print_r($message,true),0,1000)]);
$exception_message = $e->getMessage();
$this->logger->error('Error during email import '.$messageNumber, ['exc-message' => $exception_message ,'message2' => substr(print_r($message,true),0,1000)]);
continue; continue;
} }
} }
@@ -573,14 +576,17 @@ class TicketImportHelper
$this->logger->debug('Text (converted)',['plain' => $action, 'html' => $action_html]); $this->logger->debug('Text (converted)',['plain' => $action, 'html' => $action_html]);
// Import database emailbackup // Import database emailbackup
$date = $message->getDate(); try {
if (is_null($date)) { // This should not be happening -> Todo check getDate function $date = $message->getDate();
$this->logger->debug('Null date',['subject' => $message->getSubject(), $message->getHeader('date')->getValue()]);
return(false);
} else {
$timestamp = $date->getTimestamp();
$frommd5 = md5($from . $subject . $timestamp);
} }
catch (exception $e) {
$this->logger->debug('Invalid date',['exc-message' => $e->getMessage(),'subject' => $message->getSubject(), $message->getHeader('date')->getValue()]);
return(false);
}
$timestamp = $date->getTimestamp();
$frommd5 = md5($from . $subject . $timestamp);
$empfang = $date->format('Y-m-d H:i:s'); $empfang = $date->format('Y-m-d H:i:s');
$sql = "SELECT COUNT(id) $sql = "SELECT COUNT(id)
FROM `emailbackup_mails` FROM `emailbackup_mails`
@@ -837,8 +843,8 @@ class TicketImportHelper
$this->mailAccount->isAutoresponseEnabled() $this->mailAccount->isAutoresponseEnabled()
&& $this->mailAccount->getAutoresponseText() !== '' && $this->mailAccount->getAutoresponseText() !== ''
&& ( && (
$this->erpApi->AutoresponderBlacklist($from) !== 1 // $this->erpApi->AutoresponderBlacklist($from) !== 1 ||
|| $this->mailAccount->isAutoresponseLimitEnabled() === false $this->mailAccount->isAutoresponseLimitEnabled() === false
) )
) { ) {
+2 -2
View File
@@ -125,9 +125,9 @@ $firmendatenid = $app->DB->Select("SELECT MAX(id) FROM firmendaten LIMIT 1");
); );
try { try {
if($anzargs > 2){ if($anzargs > 2){
$message .= $app->erp->LagerSync($articleId, true, $shopByIds); $message .= $app->erp->LagerSync($articleId, false, $shopByIds); // 2nd parameter is print_echo -> prints via echo to logfile (big print_r)
}else{ }else{
$message .= $app->erp->LagerSync($articleId, true); $message .= $app->erp->LagerSync($articleId, false);
} }
} }
catch (Exception $exception) { catch (Exception $exception) {
+5 -1
View File
@@ -1252,7 +1252,7 @@ Options -Indexes
# Deny access to all *.php # Deny access to all *.php
Order deny,allow Order deny,allow
Allow from all Allow from all
<FilesMatch "\.(css|jpg|jpeg|gif|png|svg|js)$"> <FilesMatch "\.(css|jpg|jpeg|gif|png|svg|js|ico|css.map)$">
Order Allow,Deny Order Allow,Deny
Allow from all Allow from all
</FilesMatch> </FilesMatch>
@@ -1271,6 +1271,10 @@ Allow from all
Order Allow,Deny Order Allow,Deny
Allow from all Allow from all
</Files> </Files>
<Files robots.txt>
Order Allow,Deny
Allow from all
</Files>
# end # end
'); ');
+119 -96
View File
@@ -1259,7 +1259,7 @@ class YUI {
}elseif($check[0]['sort'] < $check2[0]['pos']) }elseif($check[0]['sort'] < $check2[0]['pos'])
{ {
$kinderartikel = $this->app->DB->SelectArr("SELECT id,sort FROM ".$module."_position WHERE explodiert_parent ='".$check[0]['id']."' ORDER BY sort ASC"); $kinderartikel = $this->app->DB->SelectArr("SELECT id,sort FROM ".$module."_position WHERE explodiert_parent ='".$check[0]['id']."' ORDER BY sort ASC");
if(count($kinderartikel)){ if((empty($kinderartikel)?0:count($kinderartikel))){
$maxsortkind = $this->app->DB->Select("SELECT max(sort) FROM ".$module."_position WHERE explodiert_parent ='".$check[0]['id']."'"); $maxsortkind = $this->app->DB->Select("SELECT max(sort) FROM ".$module."_position WHERE explodiert_parent ='".$check[0]['id']."'");
$zuverschiebendezwischenpositionen = $this->app->DB->SelectArr("SELECT ID,pos FROM beleg_zwischenpositionen WHERE doctype='$module' AND doctypeid='$id' AND pos <='$maxsortkind' AND pos >= '".$check[0]['sort']."'"); $zuverschiebendezwischenpositionen = $this->app->DB->SelectArr("SELECT ID,pos FROM beleg_zwischenpositionen WHERE doctype='$module' AND doctypeid='$id' AND pos <='$maxsortkind' AND pos >= '".$check[0]['sort']."'");
$zwipos = "(".implode(",", $zuverschiebendezwischenpositionen).")"; $zwipos = "(".implode(",", $zuverschiebendezwischenpositionen).")";
@@ -1273,13 +1273,13 @@ class YUI {
$this->app->DB->Update("UPDATE ".$module."_position SET sort = ".$check2[0]['pos']." WHERE $module = '$id' AND id = '".$check[0]['id']."'"); $this->app->DB->Update("UPDATE ".$module."_position SET sort = ".$check2[0]['pos']." WHERE $module = '$id' AND id = '".$check[0]['id']."'");
if(!empty($kinderartikel)){ if(!empty($kinderartikel)){
$elternsort = $check[0]['sort']; $elternsort = $check[0]['sort'];
$ckinderartikel = count($kinderartikel); $ckinderartikel = (empty($kinderartikel)?0:count($kinderartikel));
for ($i=0; $i < $ckinderartikel; $i++) { for ($i=0; $i < $ckinderartikel; $i++) {
$this->app->DB->Update("UPDATE beleg_zwischenpositionen SET pos = pos - 1 WHERE doctype = '".$module."' AND doctypeid = '$id' AND pos < '".($check2[0]['pos'])."' AND pos >= '".$check[0]['sort']."'"); $this->app->DB->Update("UPDATE beleg_zwischenpositionen SET pos = pos - 1 WHERE doctype = '".$module."' AND doctypeid = '$id' AND pos < '".($check2[0]['pos'])."' AND pos >= '".$check[0]['sort']."'");
$this->app->DB->Update("UPDATE ".$module."_position SET sort = sort - 1 WHERE $module = '$id' AND sort > '$elternsort' AND sort <= '".$check2[0]['pos']."'"); $this->app->DB->Update("UPDATE ".$module."_position SET sort = sort - 1 WHERE $module = '$id' AND sort > '$elternsort' AND sort <= '".$check2[0]['pos']."'");
$this->app->DB->Update("UPDATE ".$module."_position SET sort = '".($check2[0]['pos']-$i)."' WHERE $module = '$id' AND id = '".$kinderartikel[$i]['id']."' LIMIT 1"); $this->app->DB->Update("UPDATE ".$module."_position SET sort = '".($check2[0]['pos']-$i)."' WHERE $module = '$id' AND id = '".$kinderartikel[$i]['id']."' LIMIT 1");
} }
if(count($zuverschiebendezwischenpositionen)){ if((empty($zuverschiebendezwischenpositionen)?0:count($zuverschiebendezwischenpositionen))){
$positionsanzahl = $this->app->DB->Select("SELECT sort-".$check[0]['sort']." FROM auftrag_position WHERE id = '".$check[0]['id']."'"); $positionsanzahl = $this->app->DB->Select("SELECT sort-".$check[0]['sort']." FROM auftrag_position WHERE id = '".$check[0]['id']."'");
foreach ($zuverschiebendezwischenpositionen as $zkey => $zvalue) { foreach ($zuverschiebendezwischenpositionen as $zkey => $zvalue) {
$this->app->DB->Update("UPDATE beleg_zwischenpositionen SET pos = ".$zvalue['pos']." + $positionsanzahl WHERE id = '".$zvalue['ID']."'"); $this->app->DB->Update("UPDATE beleg_zwischenpositionen SET pos = ".$zvalue['pos']." + $positionsanzahl WHERE id = '".$zvalue['ID']."'");
@@ -1293,7 +1293,7 @@ class YUI {
{ {
$kinderartikel = $this->app->DB->SelectArr("SELECT id,sort FROM ".$module."_position WHERE explodiert_parent ='".$check[0]['id']."' ORDER BY sort ASC"); $kinderartikel = $this->app->DB->SelectArr("SELECT id,sort FROM ".$module."_position WHERE explodiert_parent ='".$check[0]['id']."' ORDER BY sort ASC");
$zuverschiebendezwischenpositionen= array(0); $zuverschiebendezwischenpositionen= array(0);
if(count($kinderartikel)){ if((empty($kinderartikel)?0:count($kinderartikel))){
$maxsortkind = $this->app->DB->Select("SELECT max(sort) FROM ".$module."_position WHERE explodiert_parent ='".$check[0]['id']."'"); $maxsortkind = $this->app->DB->Select("SELECT max(sort) FROM ".$module."_position WHERE explodiert_parent ='".$check[0]['id']."'");
$zuverschiebendezwischenpositionentmp = $this->app->DB->SelectArr("SELECT ID FROM beleg_zwischenpositionen WHERE doctype='$module' AND doctypeid='$id' AND pos <='$maxsortkind' AND pos >= '".$check[0]['sort']."'"); $zuverschiebendezwischenpositionentmp = $this->app->DB->SelectArr("SELECT ID FROM beleg_zwischenpositionen WHERE doctype='$module' AND doctypeid='$id' AND pos <='$maxsortkind' AND pos >= '".$check[0]['sort']."'");
$zuverschiebendezwischenpositionen = array(0); $zuverschiebendezwischenpositionen = array(0);
@@ -1319,7 +1319,7 @@ class YUI {
if(!empty($kinderartikel)){ if(!empty($kinderartikel)){
$elternsort = $check2[0]['pos']+1; $elternsort = $check2[0]['pos']+1;
$zielpos = $elternsort+1; $zielpos = $elternsort+1;
$ckinderartikel = count($kinderartikel); $ckinderartikel = (empty($kinderartikel)?0:count($kinderartikel));
for ($i=0; $i < $ckinderartikel; $i++) { for ($i=0; $i < $ckinderartikel; $i++) {
$this->app->DB->Update("UPDATE ".$module."_position SET sort = sort + 1 WHERE $module = '$id' AND sort < '".$kinderartikel[$i]['sort']."' AND sort > '".($elternsort+$i)."'"); $this->app->DB->Update("UPDATE ".$module."_position SET sort = sort + 1 WHERE $module = '$id' AND sort < '".$kinderartikel[$i]['sort']."' AND sort > '".($elternsort+$i)."'");
$this->app->DB->Update("UPDATE ".$module."_position SET sort = '".($zielpos+$i)."' WHERE $module = '$id' AND id = '".$kinderartikel[$i]['id']."' LIMIT 1"); $this->app->DB->Update("UPDATE ".$module."_position SET sort = '".($zielpos+$i)."' WHERE $module = '$id' AND id = '".$kinderartikel[$i]['id']."' LIMIT 1");
@@ -1355,12 +1355,12 @@ class YUI {
if($check[0]['sort'] < $check2[0]['sort']) if($check[0]['sort'] < $check2[0]['sort'])
{ {
$maxsort = $check[0]['sort']; $maxsort = $check[0]['sort'];
$zuverschiebendezwischenpositionen = ''; $zuverschiebendezwischenpositionen = array(0);
$kinderartikel = $this->app->DB->SelectArr("SELECT id,sort FROM ".$module."_position WHERE explodiert_parent ='".$check[0]['id']."' ORDER BY sort ASC"); $kinderartikel = $this->app->DB->SelectArr("SELECT id,sort FROM ".$module."_position WHERE explodiert_parent ='".$check[0]['id']."' ORDER BY sort ASC");
if(count($kinderartikel)){ if((empty($kinderartikel)?0:count($kinderartikel))){
$maxsortkind = $this->app->DB->Select("SELECT max(sort) FROM ".$module."_position WHERE explodiert_parent ='".$check[0]['id']."'"); $maxsortkind = $this->app->DB->Select("SELECT max(sort) FROM ".$module."_position WHERE explodiert_parent ='".$check[0]['id']."'");
$zuverschiebendezwischenpositionentmp = $this->app->DB->SelectArr("SELECT ID FROM beleg_zwischenpositionen WHERE doctype='$module' AND doctypeid='$id' AND pos >='$maxsort' AND pos <= '$maxsortkind'"); $zuverschiebendezwischenpositionentmp = $this->app->DB->SelectArr("SELECT ID FROM beleg_zwischenpositionen WHERE doctype='$module' AND doctypeid='$id' AND pos >='$maxsort' AND pos <= '$maxsortkind'");
$zuverschiebendezwischenpositionen = array(); $zuverschiebendezwischenpositionen = array(0);
if(is_array($zuverschiebendezwischenpositionentmp)){ if(is_array($zuverschiebendezwischenpositionentmp)){
foreach ($zuverschiebendezwischenpositionentmp as $key => $value) { foreach ($zuverschiebendezwischenpositionentmp as $key => $value) {
$zuverschiebendezwischenpositionen[] = $value['ID']; $zuverschiebendezwischenpositionen[] = $value['ID'];
@@ -1376,10 +1376,10 @@ class YUI {
$this->app->DB->Update("UPDATE ".$module."_position SET sort = '".$check2[0]['sort']."' WHERE $module = '$id' AND id = '".$check[0]['id']."' LIMIT 1"); $this->app->DB->Update("UPDATE ".$module."_position SET sort = '".$check2[0]['sort']."' WHERE $module = '$id' AND id = '".$check[0]['id']."' LIMIT 1");
if(!empty($kinderartikel)){ if(!empty($kinderartikel)){
$differenzwert = $check2[0]['sort'] - $check[0]['sort']-count($kinderartikel); $differenzwert = $check2[0]['sort'] - $check[0]['sort']-(empty($kinderartikel)?0:count($kinderartikel));
$this->app->DB->Update("UPDATE beleg_zwischenpositionen SET pos=pos+$differenzwert WHERE id IN $zwipos"); $this->app->DB->Update("UPDATE beleg_zwischenpositionen SET pos=pos+$differenzwert WHERE id IN $zwipos");
$elternsort = $check2[0]['sort']; $elternsort = $check2[0]['sort'];
$ckinderartikel = count($kinderartikel); $ckinderartikel = (empty($kinderartikel)?0:count($kinderartikel));
for ($i=0; $i < $ckinderartikel; $i++) { for ($i=0; $i < $ckinderartikel; $i++) {
$this->app->DB->Update("UPDATE ".$module."_position SET sort = sort - 1 WHERE $module = '$id' AND sort > '".$kinderartikel[$i]['sort']."' AND sort < '$elternsort'"); $this->app->DB->Update("UPDATE ".$module."_position SET sort = sort - 1 WHERE $module = '$id' AND sort > '".$kinderartikel[$i]['sort']."' AND sort < '$elternsort'");
$this->app->DB->Update("UPDATE ".$module."_position SET sort = '$elternsort' WHERE $module = '$id' AND id = '".$kinderartikel[$i]['id']."' LIMIT 1"); $this->app->DB->Update("UPDATE ".$module."_position SET sort = '$elternsort' WHERE $module = '$id' AND id = '".$kinderartikel[$i]['id']."' LIMIT 1");
@@ -1412,7 +1412,7 @@ class YUI {
$differenzwert = $check[0]['sort'] - ($check2[0]['sort'] + 1); $differenzwert = $check[0]['sort'] - ($check2[0]['sort'] + 1);
$this->app->DB->Update("UPDATE beleg_zwischenpositionen SET pos=pos-$differenzwert WHERE id IN $zwipos"); $this->app->DB->Update("UPDATE beleg_zwischenpositionen SET pos=pos-$differenzwert WHERE id IN $zwipos");
$elternsort = $check2[0]['sort']+1; $elternsort = $check2[0]['sort']+1;
$ckinderartikel = count($kinderartikel); $ckinderartikel = (empty($kinderartikel)?0:count($kinderartikel));
for ($i=0; $i < $ckinderartikel; $i++) { for ($i=0; $i < $ckinderartikel; $i++) {
$this->app->DB->Update("UPDATE beleg_zwischenpositionen SET pos = pos + 1 WHERE doctype = '".$module."' AND doctypeid = '$id' AND pos >= '".$check2[0]['sort']."' AND pos <= '$maxsortkind' AND NOT id IN $zwipos"); $this->app->DB->Update("UPDATE beleg_zwischenpositionen SET pos = pos + 1 WHERE doctype = '".$module."' AND doctypeid = '$id' AND pos >= '".$check2[0]['sort']."' AND pos <= '$maxsortkind' AND NOT id IN $zwipos");
$this->app->DB->Update("UPDATE ".$module."_position SET sort = sort + 1 WHERE $module = '$id' AND sort < '".$maxsortkind."' AND sort > '$elternsort'"); $this->app->DB->Update("UPDATE ".$module."_position SET sort = sort + 1 WHERE $module = '$id' AND sort < '".$maxsortkind."' AND sort > '$elternsort'");
@@ -1455,6 +1455,8 @@ class YUI {
$cmd = $this->app->Secure->GetGET('cmd'); $cmd = $this->app->Secure->GetGET('cmd');
} }
$priceCol = 'b.preis';
if($cmd === 'getpreise') { if($cmd === 'getpreise') {
$ret = null; $ret = null;
//$scol = $this->app->Secure->GetPOST('scol'); //$scol = $this->app->Secure->GetPOST('scol');
@@ -1472,7 +1474,6 @@ class YUI {
$projekt = $moduleArr['projekt'];//$this->app->DB->Select("SELECT projekt FROM $module WHERE id = '$id' LIMIT 1"); $projekt = $moduleArr['projekt'];//$this->app->DB->Select("SELECT projekt FROM $module WHERE id = '$id' LIMIT 1");
$adresse = $moduleArr['adresse'];//$this->app->DB->Select("SELECT adresse FROM $module WHERE id = '$id' LIMIT 1"); $adresse = $moduleArr['adresse'];//$this->app->DB->Select("SELECT adresse FROM $module WHERE id = '$id' LIMIT 1");
$funktion = ucfirst($module).'MitUmsatzeuer'; $funktion = ucfirst($module).'MitUmsatzeuer';
$priceCol = 'b.preis';
$join = ''; $join = '';
$anrede = 'firma'; $anrede = 'firma';
if(!$this->app->erp->AnzeigeBelegNettoAdresse($anrede, $module, $projekt, $adresse, $id) if(!$this->app->erp->AnzeigeBelegNettoAdresse($anrede, $module, $projekt, $adresse, $id)
@@ -1507,7 +1508,7 @@ class YUI {
$positionsIds = []; $positionsIds = [];
foreach($prices as $priceInForm) { foreach($prices as $priceInForm) {
$priceSplit = explode(':', $priceInForm); $priceSplit = explode(':', $priceInForm);
if(count($priceSplit) == 2) { if((empty($priceSplit)?0:count($priceSplit)) == 2) {
$elementId = $priceSplit[0]; $elementId = $priceSplit[0];
$price = trim($priceSplit[1]); $price = trim($priceSplit[1]);
$idSplit = explode('split', $elementId); $idSplit = explode('split', $elementId);
@@ -1519,7 +1520,7 @@ class YUI {
} }
foreach($quantities as $quantityInForm) { foreach($quantities as $quantityInForm) {
$quantitySplittet = explode(':', $quantityInForm); $quantitySplittet = explode(':', $quantityInForm);
if(count($quantitySplittet) == 2) { if((empty($quantitySplittet)?0:count($quantitySplittet)) == 2) {
$elementId = $quantitySplittet[0]; $elementId = $quantitySplittet[0];
$quantity = $this->app->erp->ReplaceMenge(1, trim($quantitySplittet[1]), 1); $quantity = $this->app->erp->ReplaceMenge(1, trim($quantitySplittet[1]), 1);
if(!is_numeric($quantity)) { if(!is_numeric($quantity)) {
@@ -1541,7 +1542,7 @@ class YUI {
if(!empty($positionsIds)) { if(!empty($positionsIds)) {
$positions = $this->app->DB->SelectArr( $positions = $this->app->DB->SelectArr(
sprintf( sprintf(
"SELECT b.id, %s AS `preis`, b.menge "SELECT b.id, %s AS `preis`, round(b.menge) as menge
FROM `%s` AS `b` FROM `%s` AS `b`
%s %s
WHERE b.`%s` = %d AND b.id IN (%s)", WHERE b.`%s` = %d AND b.id IN (%s)",
@@ -1560,8 +1561,8 @@ class YUI {
) { ) {
$price = rtrim(number_format($position['preis'], 8, ',', '.'), '0'); $price = rtrim(number_format($position['preis'], 8, ',', '.'), '0');
$priceSplit = explode(',', $price); $priceSplit = explode(',', $price);
if(strlen($priceSplit[count($priceSplit)-1]) < 2) { if(strlen($priceSplit[(empty($priceSplit)?0:count($priceSplit))-1]) < 2) {
$price .= str_repeat('0',2-strlen($priceSplit[count($priceSplit)-1])); $price .= str_repeat('0',2-strlen($priceSplit[(empty($priceSplit)?0:count($priceSplit))-1]));
} }
$ret[] = ['elid' => $arr[$positionId]['price_id'], 'value' => $price]; $ret[] = ['elid' => $arr[$positionId]['price_id'], 'value' => $price];
} }
@@ -2251,7 +2252,7 @@ class YUI {
$allestaffelpreise = array(); $allestaffelpreise = array();
$allestaffelpreise = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise WHERE artikel='$artikel_id' AND geloescht = 0 AND (gueltig_bis >= '".date("Y-m-d")."' OR gueltig_bis = '0000-00-00') AND (gueltig_ab <= '".date("Y-m-d")."' OR gueltig_ab = '0000-00-00') AND (adresse='0' OR adresse='$adresse') AND (gruppe='0') AND inbelegausblenden=0"); $allestaffelpreise = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise WHERE artikel='$artikel_id' AND geloescht = 0 AND (gueltig_bis >= '".date("Y-m-d")."' OR gueltig_bis = '0000-00-00') AND (gueltig_ab <= '".date("Y-m-d")."' OR gueltig_ab = '0000-00-00') AND (adresse='0' OR adresse='$adresse') AND (gruppe='0') AND inbelegausblenden=0");
$anzeigepreise = array(); $anzeigepreise = array();
for ($i=0; $i < count($allestaffelpreise); $i++) { for ($i=0; $i < (empty($allestaffelpreise)?0:count($allestaffelpreise)); $i++) {
if(!isset($anzeigepreise[$allestaffelpreise[$i]['ab_menge']])){ if(!isset($anzeigepreise[$allestaffelpreise[$i]['ab_menge']])){
$anzeigepreise[$allestaffelpreise[$i]['ab_menge']] = $allestaffelpreise[$i]; $anzeigepreise[$allestaffelpreise[$i]['ab_menge']] = $allestaffelpreise[$i];
}else{ }else{
@@ -2260,7 +2261,7 @@ class YUI {
} }
} }
} }
if(count($anzeigepreise)>1){ if((empty($anzeigepreise)?0:count($anzeigepreise))>1){
ksort($anzeigepreise); ksort($anzeigepreise);
$staffelpreistext = ''; $staffelpreistext = '';
$belegsprache = $this->app->DB->Select("SELECT sprache FROM $module WHERE id='$id' LIMIT 1"); $belegsprache = $this->app->DB->Select("SELECT sprache FROM $module WHERE id='$id' LIMIT 1");
@@ -2580,7 +2581,7 @@ class YUI {
p.abkuerzung as projekt, b.nummer as nummer, DATE_FORMAT(lieferdatum,'%d.%m.%Y') as lieferdatum, ".$this->app->erp->FormatMenge('b.menge')." as menge, ".$this->FormatPreis($preiscell)." as preis,b.waehrung, ".$this->FormatPreis('b.rabatt')." as rabatt, "; p.abkuerzung as projekt, b.nummer as nummer, DATE_FORMAT(lieferdatum,'%d.%m.%Y') as lieferdatum, round(b.menge) as menge, ".$this->FormatPreis($preiscell)." as preis,b.waehrung, ".$this->FormatPreis('b.rabatt')." as rabatt, ";
$sql .= "b.id as id $sql .= "b.id as id
@@ -2600,7 +2601,7 @@ class YUI {
as Artikel, as Artikel,
p.abkuerzung as projekt, b.nummer as nummer, DATE_FORMAT(lieferdatum,'%d.%m.%Y') as lieferdatum, ".$this->app->erp->FormatMenge('b.menge')." as menge, if(b.geliefert, ".$this->app->erp->FormatMenge('b.geliefert')." ,'-') as geliefert, b.id as id p.abkuerzung as projekt, b.nummer as nummer, DATE_FORMAT(lieferdatum,'%d.%m.%Y') as lieferdatum, round(b.menge) as menge, if(b.geliefert, ".$this->app->erp->FormatMenge('b.geliefert')." ,'-') as geliefert, b.id as id
FROM $table b FROM $table b
LEFT JOIN artikel a ON a.id=b.artikel LEFT JOIN projekt p ON b.projekt=p.id LEFT JOIN artikel a ON a.id=b.artikel LEFT JOIN projekt p ON b.projekt=p.id
WHERE b.$module='$id'"; WHERE b.$module='$id'";
@@ -2655,7 +2656,7 @@ class YUI {
p.abkuerzung as projekt, b.nummer as nummer, DATE_FORMAT(lieferdatum,'%d.%m.%Y') as lieferdatum, p.abkuerzung as projekt, b.nummer as nummer, DATE_FORMAT(lieferdatum,'%d.%m.%Y') as lieferdatum,
".$this->app->erp->FormatMenge('b.menge')." as menge, round(b.menge) as menge,
if(b.geliefert, ".$this->app->erp->FormatMenge('b.geliefert')." ,'-') as geliefert, if(b.geliefert, ".$this->app->erp->FormatMenge('b.geliefert')." ,'-') as geliefert,
if(b.menge_eingang, ".$this->app->erp->FormatMenge('b.menge_eingang')." ,'-') as `Eingang`, if(b.menge_eingang, ".$this->app->erp->FormatMenge('b.menge_eingang')." ,'-') as `Eingang`,
if(b.menge_gutschrift, ".$this->app->erp->FormatMenge('b.menge_gutschrift')." ,'-') as `Menge Gutschrift`, if(b.menge_gutschrift, ".$this->app->erp->FormatMenge('b.menge_gutschrift')." ,'-') as `Menge Gutschrift`,
@@ -2677,7 +2678,7 @@ class YUI {
as Artikel, as Artikel,
p.abkuerzung as projekt, b.nummer as nummer, ".$this->app->erp->FormatMenge('b.menge')." as menge, p.abkuerzung as projekt, b.nummer as nummer, round(b.menge) as menge,
".$this->FormatPreis(' b.preis')." as preis, ".$this->FormatPreis(' b.preis')." as preis,
b.id as id b.id as id
@@ -2694,7 +2695,7 @@ class YUI {
as Artikel, as Artikel,
p.abkuerzung as projekt, b.nummer as nummer, DATE_FORMAT(b.lieferdatum,'%d.%m.%Y') as lieferdatum, ".$this->app->erp->FormatMenge('b.menge')." as menge, p.abkuerzung as projekt, b.nummer as nummer, DATE_FORMAT(b.lieferdatum,'%d.%m.%Y') as lieferdatum, round(b.menge) as menge,
b.id as id b.id as id
FROM $table b FROM $table b
@@ -2716,7 +2717,7 @@ class YUI {
if(CHAR_LENGTH(b.bezeichnunglieferant)>" . $this->app->erp->MaxArtikelbezeichnung() . ",CONCAT(SUBSTR(CONCAT(b.bezeichnunglieferant,' *'),1," . $this->app->erp->MaxArtikelbezeichnung() . "),'...'),CONCAT(b.bezeichnunglieferant,' *')), if(CHAR_LENGTH(b.bezeichnunglieferant)>" . $this->app->erp->MaxArtikelbezeichnung() . ",CONCAT(SUBSTR(CONCAT(b.bezeichnunglieferant,' *'),1," . $this->app->erp->MaxArtikelbezeichnung() . "),'...'),CONCAT(b.bezeichnunglieferant,' *')),
if(CHAR_LENGTH(b.bezeichnunglieferant)>" . $this->app->erp->MaxArtikelbezeichnung() . ",CONCAT(SUBSTR(b.bezeichnunglieferant,1," . $this->app->erp->MaxArtikelbezeichnung() . "),'...'),b.bezeichnunglieferant))) if(CHAR_LENGTH(b.bezeichnunglieferant)>" . $this->app->erp->MaxArtikelbezeichnung() . ",CONCAT(SUBSTR(b.bezeichnunglieferant,1," . $this->app->erp->MaxArtikelbezeichnung() . "),'...'),b.bezeichnunglieferant)))
as Artikel, as Artikel,
p.abkuerzung as projekt, a.nummer as nummer, DATE_FORMAT(lieferdatum,'%d.%m.%Y') as lieferdatum,".$this->app->erp->FormatMenge('b.menge')." as menge, ".$this->FormatPreis(' b.preis')." as preis, b.waehrung, b.id as id p.abkuerzung as projekt, a.nummer as nummer, DATE_FORMAT(lieferdatum,'%d.%m.%Y') as lieferdatum, round(b.menge) as menge, ".$this->FormatPreis(' b.preis')." as preis, b.waehrung, b.id as id
FROM $table b FROM $table b
LEFT JOIN artikel a ON a.id=b.artikel LEFT JOIN projekt p ON b.projekt=p.id LEFT JOIN artikel a ON a.id=b.artikel LEFT JOIN projekt p ON b.projekt=p.id
WHERE b.$module='$id'"; WHERE b.$module='$id'";
@@ -3419,7 +3420,7 @@ class YUI {
$check = $this->app->DB->Select("SELECT id FROM `auftragsampel_auftrageinstellungen` LIMIT 1"); $check = $this->app->DB->Select("SELECT id FROM `auftragsampel_auftrageinstellungen` LIMIT 1");
$deaktivertok = false; $deaktivertok = false;
if(!$this->app->DB->error())$deaktivertok = true; if(!$this->app->DB->error())$deaktivertok = true;
$anzahl3 = count($auftragsampel); $anzahl3 = (empty($auftragsampel)?0:count($auftragsampel));
$anzahl += $anzahl3; $anzahl += $anzahl3;
$ifextra2a[] = " a.status = 'abgeschlossen' "; $ifextra2a[] = " a.status = 'abgeschlossen' ";
foreach($auftragsampel as $k => $ampel) foreach($auftragsampel as $k => $ampel)
@@ -3440,7 +3441,7 @@ class YUI {
if($deaktivertok) $_extra2e = "),'<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/abgeschlossen.png\" title=\"Auftragsampel deaktivert\" border=\"0\" style=\"margin-right:1px\">' if($deaktivertok) $_extra2e = "),'<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/abgeschlossen.png\" title=\"Auftragsampel deaktivert\" border=\"0\" style=\"margin-right:1px\">'
)"; )";
if($deaktivertok) $_extra2e = "),'".str_repeat($_extra2icon,count($auftragsampel))."')"; if($deaktivertok) $_extra2e = "),'".str_repeat($_extra2icon,(empty($auftragsampel)?0:count($auftragsampel)))."')";
$extra3 .= ",'".$abgeschlossen."'"; $extra3 .= ",'".$abgeschlossen."'";
$ifextra2a[] = " $ifextra2a[] = "
substring(ifnull(aac.status,'".str_repeat('0', $anzahl3)."'),$k2,1) = '1' "; substring(ifnull(aac.status,'".str_repeat('0', $anzahl3)."'),$k2,1) = '1' ";
@@ -3452,7 +3453,7 @@ class YUI {
$check = $this->app->DB->Select("SELECT id FROM `auftragsampel_auftrageinstellungen` LIMIT 1"); $check = $this->app->DB->Select("SELECT id FROM `auftragsampel_auftrageinstellungen` LIMIT 1");
$deaktivertok = false; $deaktivertok = false;
if(!$this->app->DB->error())$deaktivertok = true; if(!$this->app->DB->error())$deaktivertok = true;
$anzahl3 = count($auftragsampel); $anzahl3 = (empty($auftragsampel)?0:count($auftragsampel));
$anzahl += $anzahl3; $anzahl += $anzahl3;
$ifextra2a[] = " a.status = 'abgeschlossen' "; $ifextra2a[] = " a.status = 'abgeschlossen' ";
foreach($auftragsampel as $ampel) foreach($auftragsampel as $ampel)
@@ -3462,7 +3463,7 @@ class YUI {
if($deaktivertok) $_extra2a = ",if(isnull((SELECT aae.id FROM auftragsampel_auftrageinstellungen aae WHERE aae.auftrag = a.id AND aae.deaktiviert = 1 LIMIT 1)),concat(''"; if($deaktivertok) $_extra2a = ",if(isnull((SELECT aae.id FROM auftragsampel_auftrageinstellungen aae WHERE aae.auftrag = a.id AND aae.deaktiviert = 1 LIMIT 1)),concat(''";
$extra2 .= "IF(isnull( (SELECT aampa.id FROM auftragsampel_auftrag aampa WHERE aampa.auftrag = a.id AND aampa.auftragsampel = '".$ampel['id']."' AND aampa.erledigt = 1) ), "."'<img src=\"./pages/icons/".str_replace('_go_','_stop_',$ampel['icon'])."\" title=\"".$ampel['beschriftung']."\" border=\"0\" style=\"margin-right:1px\">'".","."'<img src=\"./pages/icons/".$ampel['icon']."\" title=\"".$ampel['beschriftung']."\" border=\"0\" style=\"margin-right:1px\">'". ") "; $extra2 .= "IF(isnull( (SELECT aampa.id FROM auftragsampel_auftrag aampa WHERE aampa.auftrag = a.id AND aampa.auftragsampel = '".$ampel['id']."' AND aampa.erledigt = 1) ), "."'<img src=\"./pages/icons/".str_replace('_go_','_stop_',$ampel['icon'])."\" title=\"".$ampel['beschriftung']."\" border=\"0\" style=\"margin-right:1px\">'".","."'<img src=\"./pages/icons/".$ampel['icon']."\" title=\"".$ampel['beschriftung']."\" border=\"0\" style=\"margin-right:1px\">'". ") ";
if($deaktivertok) $_extra2e = "),'<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/abgeschlossen.png\" title=\"Auftragsampel deaktivert\" border=\"0\" style=\"margin-right:1px\">')"; if($deaktivertok) $_extra2e = "),'<img src=\"./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/abgeschlossen.png\" title=\"Auftragsampel deaktivert\" border=\"0\" style=\"margin-right:1px\">')";
if($deaktivertok) $_extra2e = "),'".str_repeat($_extra2icon,count($auftragsampel))."')"; if($deaktivertok) $_extra2e = "),'".str_repeat($_extra2icon,(empty($auftragsampel)?0:count($auftragsampel)))."')";
$extra3 .= ",'".$abgeschlossen."'"; $extra3 .= ",'".$abgeschlossen."'";
$ifextra2a[] = " $ifextra2a[] = "
not isnull( (SELECT aampa.id FROM auftragsampel_auftrag aampa WHERE aampa.auftrag = a.id AND aampa.auftragsampel = '".$ampel['id']."' AND aampa.erledigt = 1) ) "; not isnull( (SELECT aampa.id FROM auftragsampel_auftrag aampa WHERE aampa.auftrag = a.id AND aampa.auftragsampel = '".$ampel['id']."' AND aampa.erledigt = 1) ) ";
@@ -3747,7 +3748,7 @@ class YUI {
$module = $this->app->Secure->GetGET("module"); $module = $this->app->Secure->GetGET("module");
$this->app->Tpl->Add('JAVASCRIPT', 'function ' . $name . 'fnFormatDetails ( nTr ) { $this->app->Tpl->Add('JAVASCRIPT', 'function ' . $name . 'fnFormatDetails ( nTr ) {
//var aData = oTable' . $name . '.fnGetData( nTr ); //var aData = oTable' . $name . '.fnGetData( nTr );
var str = aData[' . (isset($menucol)?$menucol:count($heading)-1) . ']; var str = aData[' . (isset($menucol)?$menucol:(empty($heading)?0:count($heading))-1) . '];
var match = str.match(/[1-9]{1}[0-9]*/); var match = str.match(/[1-9]{1}[0-9]*/);
@@ -3770,14 +3771,14 @@ url:strUrl, success:function(html){strReturn = html;}, async:false
} }
'); ');
} }
$colspan = count($heading); $colspan = (empty($heading)?0:count($heading));
//<tr><th colspan="' . $colspan . '"><br></th></tr> //<tr><th colspan="' . $colspan . '"><br></th></tr>
$this->app->Tpl->Add($parsetarget, ' $this->app->Tpl->Add($parsetarget, '
<table cellpadding="0" cellspacing="0" border="0" class="display" id="' . $name . '"> <table cellpadding="0" cellspacing="0" border="0" class="display" id="' . $name . '">
<thead> <thead>
<tr>'); <tr>');
for ($i = 0;$i < count($heading);$i++) { for ($i = 0;$i < (empty($heading)?0:count($heading));$i++) {
$this->app->Tpl->Add($parsetarget, '<th width="' . $width[$i] . '">' . $heading[$i] . '</th>'); $this->app->Tpl->Add($parsetarget, '<th width="' . $width[$i] . '">' . $heading[$i] . '</th>');
} }
$this->app->Tpl->Add($parsetarget, '</tr> $this->app->Tpl->Add($parsetarget, '</tr>
@@ -3791,7 +3792,7 @@ url:strUrl, success:function(html){strReturn = html;}, async:false
<tfoot> <tfoot>
<tr> <tr>
'); ');
for ($i = 0;$i < count($heading);$i++) { for ($i = 0;$i < (empty($heading)?0:count($heading));$i++) {
$this->app->Tpl->Add($parsetarget, '<th>' . $heading[$i] . '</th>'); $this->app->Tpl->Add($parsetarget, '<th>' . $heading[$i] . '</th>');
} }
$this->app->Tpl->Add($parsetarget, ' $this->app->Tpl->Add($parsetarget, '
@@ -5816,7 +5817,7 @@ url:strUrl, success:function(html){strReturn = html;}, async:false
if ($more_data3 == 1) $subwhere[] = " l.lieferantenretoure=1 "; if ($more_data3 == 1) $subwhere[] = " l.lieferantenretoure=1 ";
// ENDE EXTRA more // ENDE EXTRA more
for ($j = 0;$j < count($subwhere);$j++) $tmp.= " AND " . $subwhere[$j]; for ($j = 0;$j < (empty($subwhere)?0:count($subwhere));$j++) $tmp.= " AND " . $subwhere[$j];
$where = " l.id!='' AND l.status!='angelegt' $tmp " . $this->app->erp->ProjektRechte('p.id', true, 'l.vertriebid'); $where = " l.id!='' AND l.status!='angelegt' $tmp " . $this->app->erp->ProjektRechte('p.id', true, 'l.vertriebid');
/* STAMMDATEN */ /* STAMMDATEN */
@@ -6081,11 +6082,11 @@ r.land as land, p.abkuerzung as projekt, r.zahlungsweise as zahlungsweise,
$heading = array('', '', 'Gutschrift', 'Vom', 'Kd-Nr.', 'Kunde', 'Land', 'Projekt', $heading = array('', '', 'Gutschrift', 'Vom', 'Kd-Nr.', 'Kunde', 'Land', 'Projekt',
'Zahlweise', 'Betrag (brutto)', 'bezahlt','RE-Nr.', 'Status','Monitor' ,'Men&uuml;' 'Zahlweise', 'Betrag (brutto)', 'Zahlstatus','Differenz','RE-Nr.', 'Status','Monitor' ,'Men&uuml;'
); );
$width = array('1%', '1%', '10%', '10%', '10%', '25%', '5%', '1%', '1%', '1%', '1%', '1%','5%', '1%','1%', '1%'); $width = array('1%', '1%', '10%', '10%', '10%', '25%', '5%', '1%', '1%', '1%', '1%', '1%', '1%','5%', '1%','1%', '1%');
$findcols = array('open', 'r.belegnr', 'r.belegnr', 'r.datum', 'adr.kundennummer', 'r.name', 'r.land', 'p.abkuerzung', 'r.zahlungsweise', 'r.soll','re.belegnr', 'r.zahlungsstatus', 'r.status', 'pt.payement_status' ,'id'); $findcols = array('open', 'r.belegnr', 'r.belegnr', 'r.datum', 'adr.kundennummer', 'r.name', 'r.land', 'p.abkuerzung', 'r.zahlungsweise', 'r.soll', 'r.zahlungsstatus','r.soll-r.ist', 're.belegnr', 'r.status', 'id');
$searchsql = array('DATE_FORMAT(r.datum,\'%d.%m.%Y\')', 'r.belegnr', 'adr.kundennummer', 'r.name', 'r.land', 'p.abkuerzung','re.belegnr', 'r.status', "FORMAT(r.soll,2{$extended_mysql55})", 'adr.freifeld1', 'r.ihrebestellnummer','r.internebezeichnung','au.internet'); $searchsql = array('DATE_FORMAT(r.datum,\'%d.%m.%Y\')', 'r.belegnr', 'adr.kundennummer', 'r.name', 'r.land', 'p.abkuerzung','re.belegnr', 'r.status', "FORMAT(r.soll,2{$extended_mysql55})", 'adr.freifeld1', 'r.ihrebestellnummer','r.internebezeichnung','au.internet');
$defaultorder = 13; //Optional wenn andere Reihenfolge gewuenscht $defaultorder = 13; //Optional wenn andere Reihenfolge gewuenscht
@@ -6127,20 +6128,31 @@ r.land as land, p.abkuerzung as projekt, r.zahlungsweise as zahlungsweise,
$menu .= "</table>"; $menu .= "</table>";
$menucol = 14; $menucol = 15;
$parameter = $this->app->User->GetParameter('table_filter_gutschrift'); $parameter = $this->app->User->GetParameter('table_filter_gutschrift');
$parameter = base64_decode($parameter); $parameter = base64_decode($parameter);
$parameter = json_decode($parameter, true); $parameter = json_decode($parameter, true);
// SQL statement // SQL statement
$sql = "SELECT SQL_CALC_FOUND_ROWS r.id,'<img src=./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/details_open.png class=details>' as open, concat('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',r.id,'\" />')as auswahl, $sql = "SELECT SQL_CALC_FOUND_ROWS
r.belegnr, r.id,
DATE_FORMAT(r.datum,'%d.%m.%Y') as vom, adr.kundennummer as kundennummer, '<img src=./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/details_open.png class=details>' as open,
CONCAT(" . $this->app->erp->MarkerUseredit("r.name", "r.useredittimestamp") . ", if(r.internebezeichnung!='',CONCAT('<br><i style=color:#999>',r.internebezeichnung,'</i>'),'')) as kunde, concat('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',r.id,'\" />')as auswahl,
r.land as land, p.abkuerzung as projekt, r.zahlungsweise as zahlungsweise, r.belegnr,
FORMAT(r.soll,2{$extended_mysql55}) as soll, r.zahlungsstatus as zahlung, re.belegnr as rechnung, UPPER(r.status) as status, DATE_FORMAT(r.datum,'%d.%m.%Y') as vom,
".$this->IconsSQLReturnOrder()." ,r.id adr.kundennummer as kundennummer,
CONCAT(" . $this->app->erp->MarkerUseredit("r.name", "r.useredittimestamp") . ", if(r.internebezeichnung!='',CONCAT('<br><i style=color:#999>',r.internebezeichnung,'</i>'),'')) as kunde,
r.land as land,
p.abkuerzung as projekt,
r.zahlungsweise as zahlungsweise,
".$this->app->erp->FormatMenge('r.soll',2)." as soll,
r.zahlungsstatus as zahlung,
".$this->app->erp->FormatMenge('r.soll-r.ist',2)." as differenz,
re.belegnr as rechnung,
UPPER(r.status) as status,
".$this->IconsSQLReturnOrder().",
r.id
FROM gutschrift r FROM gutschrift r
LEFT JOIN rechnung re ON re.id=r.rechnungid LEFT JOIN rechnung re ON re.id=r.rechnungid
LEFT JOIN projekt p ON p.id=r.projekt LEFT JOIN projekt p ON p.id=r.projekt
@@ -6173,7 +6185,7 @@ r.land as land, p.abkuerzung as projekt, r.zahlungsweise as zahlungsweise,
$tmp = ''; $tmp = '';
if (!is_null($subwhere)) { if (!is_null($subwhere)) {
for ($j = 0;$j < count($subwhere);$j++) $tmp.= " AND " . $subwhere[$j]; for ($j = 0;$j < (empty($subwhere)?0:count($subwhere));$j++) $tmp.= " AND " . $subwhere[$j];
} }
$where = " r.status!='angelegt' AND r.id!='' ".$tmp ." ". $this->app->erp->ProjektRechte('p.id', true, 'r.vertriebid'); $where = " r.status!='angelegt' AND r.id!='' ".$tmp ." ". $this->app->erp->ProjektRechte('p.id', true, 'r.vertriebid');
@@ -6551,13 +6563,24 @@ r.land as land, p.abkuerzung as projekt, r.zahlungsweise as zahlungsweise,
// $columnfilter = true; // $columnfilter = true;
// SQL statement // SQL statement
$sql = "SELECT SQL_CALC_FOUND_ROWS r.id,'<img src=./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/details_open.png class=details>' as open,concat('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',r.id,'\" />')as auswahl, r.belegnr, DATE_FORMAT(r.datum,'%d.%m.%Y') as vom, $sql = "SELECT SQL_CALC_FOUND_ROWS
if(r.kundennummer <> '',r.kundennummer,adr.kundennummer), r.id,
'<img src=./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/details_open.png class=details>' as open,
CONCAT(" . $this->app->erp->MarkerUseredit("r.name", "r.useredittimestamp") . ", if(r.internebezeichnung!='',CONCAT('<br><i style=color:#999>',r.internebezeichnung,'</i>'),'')) as kunde, concat('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',r.id,'\" />') as auswahl,
r.land as land, p.abkuerzung as projekt, r.zahlungsweise as zahlungsweise, FORMAT(r.soll,2{$extended_mysql55} ) as soll, ifnull(r.waehrung,'EUR'), r.belegnr,
if(r.soll-r.ist+r.skonto_gegeben!=0 AND r.ist > 0 AND r.zahlungsstatus!='bezahlt','teilbezahlt',r.zahlungsstatus) as zahlung, DATE_FORMAT(r.datum,'%d.%m.%Y') as vom,
if(r.soll-r.ist+r.skonto_gegeben!=0 AND r.ist > 0,FORMAT(r.ist-r.soll+r.skonto_gegeben,2{$extended_mysql55}),FORMAT((r.soll-r.ist+r.skonto_gegeben)*-1,2{$extended_mysql55})) as fehlt, if(r.status = 'storniert' AND r.teilstorno = 1,'TEILSTORNO',UPPER(r.status)) as status, ".(!empty($zusatzcols)?implode(', ',$zusatzcols).',':'')." r.id if(r.kundennummer <> '',r.kundennummer,adr.kundennummer),
CONCAT(" . $this->app->erp->MarkerUseredit("r.name", "r.useredittimestamp") . ", if(r.internebezeichnung!='',CONCAT('<br><i style=color:#999>',r.internebezeichnung,'</i>'),'')) as kunde,
r.land as land,
p.abkuerzung as projekt,
r.zahlungsweise as zahlungsweise,
FORMAT(r.soll,2{$extended_mysql55} ) as soll,
ifnull(r.waehrung,'EUR'),
r.zahlungsstatus as zahlung,
if(r.soll-r.ist!=0 AND r.ist > 0,FORMAT(r.ist-r.soll,2{$extended_mysql55}),FORMAT((r.soll-r.ist)*-1,2{$extended_mysql55})) as fehlt,
if(r.status = 'storniert' AND r.teilstorno = 1,'TEILSTORNO',UPPER(r.status)) as status,
".(!empty($zusatzcols)?implode(', ',$zusatzcols).',':'')."
r.id
FROM rechnung r LEFT JOIN projekt p ON p.id=r.projekt LEFT JOIN adresse adr ON r.adresse=adr.id LEFT JOIN auftrag au ON au.id = r.auftragid "; FROM rechnung r LEFT JOIN projekt p ON p.id=r.projekt LEFT JOIN adresse adr ON r.adresse=adr.id LEFT JOIN auftrag au ON au.id = r.auftragid ";
if(isset($parameter['artikel']) && !empty($parameter['artikel'])) { if(isset($parameter['artikel']) && !empty($parameter['artikel'])) {
$artikelid = $this->app->DB->Select("SELECT id FROM artikel where geloescht != 1 AND nummer != 'DEL' AND nummer != '' AND nummer = '".$this->app->DB->real_escape_string(reset(explode(' ',trim($parameter['artikel']))))."' LIMIT 1"); $artikelid = $this->app->DB->Select("SELECT id FROM artikel where geloescht != 1 AND nummer != 'DEL' AND nummer != '' AND nummer = '".$this->app->DB->real_escape_string(reset(explode(' ',trim($parameter['artikel']))))."' LIMIT 1");
@@ -6589,7 +6612,7 @@ r.land as land, p.abkuerzung as projekt, r.zahlungsweise as zahlungsweise,
if ($more_data4 == 1) { if ($more_data4 == 1) {
$subwhere[] = " r.status='storniert' "; $subwhere[] = " r.status='storniert' ";
} }
$csubwhere = !empty($subwhere)?count($subwhere):0; $csubwhere = !empty($subwhere)?(empty($subwhere)?0:count($subwhere)):0;
for ($j = 0;$j < $csubwhere;$j++) { for ($j = 0;$j < $csubwhere;$j++) {
$tmp.= " AND " . $subwhere[$j]; $tmp.= " AND " . $subwhere[$j];
} }
@@ -6858,7 +6881,7 @@ r.land as land, p.abkuerzung as projekt, r.zahlungsweise as zahlungsweise,
if ($more_data1 == 1) $subwhere[] = " a.lagerartikel='1' "; if ($more_data1 == 1) $subwhere[] = " a.lagerartikel='1' ";
$tmp = ''; $tmp = '';
$csubwhere = !empty($subwhere)?count($subwhere):0; $csubwhere = !empty($subwhere)?(empty($subwhere)?0:count($subwhere)):0;
for ($j = 0;$j < $csubwhere;$j++) $tmp.= " AND " . $subwhere[$j]; for ($j = 0;$j < $csubwhere;$j++) $tmp.= " AND " . $subwhere[$j];
if($liefertermine) if($liefertermine)
@@ -7040,7 +7063,7 @@ r.land as land, p.abkuerzung as projekt, r.zahlungsweise as zahlungsweise,
$more_data7 = $this->app->Secure->GetGET("more_data7"); $more_data7 = $this->app->Secure->GetGET("more_data7");
// SQL statement // SQL statement
$sql = "SELECT $sql = "SELECT SQL_CALC_FOUND_ROWS
b.id,'<img src=./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/details_open.png class=details>' AS `open`, b.id,'<img src=./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/details_open.png class=details>' AS `open`,
CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',b.id,'\" />') AS `auswahl`, CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',b.id,'\" />') AS `auswahl`,
IF(b.status='storniert',CONCAT(b.belegnr),b.belegnr) AS `belegnr`, IF(b.status='storniert',CONCAT(b.belegnr),b.belegnr) AS `belegnr`,
@@ -7195,7 +7218,7 @@ r.land as land, p.abkuerzung as projekt, r.zahlungsweise as zahlungsweise,
} }
if (!is_null($subwhere)) { if (!is_null($subwhere)) {
for ($j = 0;$j < count($subwhere);$j++) $tmp.= " AND " . $subwhere[$j]; for ($j = 0;$j < (empty($subwhere)?0:count($subwhere));$j++) $tmp.= " AND " . $subwhere[$j];
} }
// START EXTRA more // START EXTRA more
@@ -7650,7 +7673,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
if($fteilprojektfilter) { if($fteilprojektfilter) {
$subwhere[] = " a.teilprojekt = '$fteilprojektfilter' "; $subwhere[] = " a.teilprojekt = '$fteilprojektfilter' ";
} }
for ($j = 0;$j < count($subwhere);$j++) $tmp.= " AND " . $subwhere[$j]; for ($j = 0;$j < (empty($subwhere)?0:count($subwhere));$j++) $tmp.= " AND " . $subwhere[$j];
$where = " a.projekt='" . $id."'".$tmp; $where = " a.projekt='" . $id."'".$tmp;
$count = "SELECT COUNT(a.id) FROM aufgabe a WHERE $where "; $count = "SELECT COUNT(a.id) FROM aufgabe a WHERE $where ";
@@ -7738,7 +7761,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
} }
for ($j = 0;$j < count($subwhere);$j++) $tmp.= " AND " . $subwhere[$j]; for ($j = 0;$j < (empty($subwhere)?0:count($subwhere));$j++) $tmp.= " AND " . $subwhere[$j];
$where = " (z.adresse_abrechnung='" . $id . "' OR p.kunde='$id') $tmp"; $where = " (z.adresse_abrechnung='" . $id . "' OR p.kunde='$id') $tmp";
$count = "SELECT COUNT(z.id) FROM zeiterfassung z LEFT JOIN adresse a ON a.id=z.adresse LEFT JOIN projekt p ON p.id=z.projekt WHERE $where"; $count = "SELECT COUNT(z.id) FROM zeiterfassung z LEFT JOIN adresse a ON a.id=z.adresse LEFT JOIN projekt p ON p.id=z.projekt WHERE $where";
@@ -7829,7 +7852,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
}else{ }else{
$subwhere[] = " z.abgerechnet <> 1 "; $subwhere[] = " z.abgerechnet <> 1 ";
} }
for ($j = 0;$j < count($subwhere);$j++) $tmp.= " AND " . $subwhere[$j]; for ($j = 0;$j < (empty($subwhere)?0:count($subwhere));$j++) $tmp.= " AND " . $subwhere[$j];
$where = " z.projekt ='" . $id . "' $tmp"; $where = " z.projekt ='" . $id . "' $tmp";
$count = "SELECT COUNT(z.id) FROM zeiterfassung z LEFT JOIN arbeitspaket arb ON z.arbeitspaket = arb.id WHERE $where"; $count = "SELECT COUNT(z.id) FROM zeiterfassung z LEFT JOIN arbeitspaket arb ON z.arbeitspaket = arb.id WHERE $where";
@@ -7969,7 +7992,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
$tmp = ''; $tmp = '';
$csubwhere = !empty($subwhere)?count($subwhere):0; $csubwhere = !empty($subwhere)?(empty($subwhere)?0:count($subwhere)):0;
for ($j = 0;$j < $csubwhere;$j++) $tmp.= " AND " . $subwhere[$j]; for ($j = 0;$j < $csubwhere;$j++) $tmp.= " AND " . $subwhere[$j];
$where = " a.id!='' AND a.status!='angelegt' $tmp " . $this->app->erp->ProjektRechte(); $where = " a.id!='' AND a.status!='angelegt' $tmp " . $this->app->erp->ProjektRechte();
@@ -8329,7 +8352,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
// $more_data2 = $this->app->Secure->GetGET("more_data2"); if($more_data2==1) $subwhere[] = " a.datum=CURDATE() AND a.status='freigegeben'"; // $more_data2 = $this->app->Secure->GetGET("more_data2"); if($more_data2==1) $subwhere[] = " a.datum=CURDATE() AND a.status='freigegeben'";
for ($j = 0;$j < count($subwhere);$j++) $tmp.= " AND " . $subwhere[$j]; for ($j = 0;$j < (empty($subwhere)?0:count($subwhere));$j++) $tmp.= " AND " . $subwhere[$j];
$id = $this->app->Secure->GetGET("id"); $id = $this->app->Secure->GetGET("id");
$where = " ap.aufgabe IS NOT NULL $tmp AND ap.projekt='$id' GROUP by Datum,ap.id "; $where = " ap.aufgabe IS NOT NULL $tmp AND ap.projekt='$id' GROUP by Datum,ap.id ";
@@ -8392,7 +8415,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
$more_data1 = $this->app->Secure->GetGET("more_data1"); $more_data1 = $this->app->Secure->GetGET("more_data1");
if ($more_data1 == 1) $subwhere[] = " OR ( ap.abgenommen='1') "; if ($more_data1 == 1) $subwhere[] = " OR ( ap.abgenommen='1') ";
for ($j = 0;$j < count($subwhere);$j++) $tmp.= " " . $subwhere[$j]; for ($j = 0;$j < (empty($subwhere)?0:count($subwhere));$j++) $tmp.= " " . $subwhere[$j];
// if($tmp!="")$tmp .= " AND e.geloescht='1' "; // if($tmp!="")$tmp .= " AND e.geloescht='1' ";
@@ -8611,7 +8634,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
if (!is_null($subwhere)) if (!is_null($subwhere))
{ {
for ($j = 0;$j < count($subwhere);$j++) $tmp.= " AND " . $subwhere[$j]; for ($j = 0;$j < (empty($subwhere)?0:count($subwhere));$j++) $tmp.= " AND " . $subwhere[$j];
} }
if ($more_data1 == 1) if ($more_data1 == 1)
@@ -8677,7 +8700,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
if ($more_data1 == 1) $subwhere[] = " AND ap.status='abgerechnet' "; if ($more_data1 == 1) $subwhere[] = " AND ap.status='abgerechnet' ";
else $subwhere[] = " AND ap.status!='abgerechnet' "; else $subwhere[] = " AND ap.status!='abgerechnet' ";
for ($j = 0;$j < count($subwhere);$j++) $tmp.= " " . $subwhere[$j]; for ($j = 0;$j < (empty($subwhere)?0:count($subwhere));$j++) $tmp.= " " . $subwhere[$j];
// Fester filter // Fester filter
@@ -8770,7 +8793,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
if ($more_data1 == 1) $subwhere[] = " z.abrechnen='1' AND z.abgerechnet!='1' "; if ($more_data1 == 1) $subwhere[] = " z.abrechnen='1' AND z.abgerechnet!='1' ";
// $more_data2 = $this->app->Secure->GetGET("more_data2"); if($more_data2==1) $subwhere[] = " a.datum=CURDATE() AND a.status='freigegeben'"; // $more_data2 = $this->app->Secure->GetGET("more_data2"); if($more_data2==1) $subwhere[] = " a.datum=CURDATE() AND a.status='freigegeben'";
for ($j = 0;$j < count($subwhere);$j++) $tmp.= " AND " . $subwhere[$j]; for ($j = 0;$j < (empty($subwhere)?0:count($subwhere));$j++) $tmp.= " AND " . $subwhere[$j];
$where = " z.id!='' AND z.adresse='" . $id . "' $tmp"; $where = " z.id!='' AND z.adresse='" . $id . "' $tmp";
$count = "SELECT COUNT(z.id) FROM zeiterfassung z WHERE z.adresse='" . $id . "'"; $count = "SELECT COUNT(z.id) FROM zeiterfassung z WHERE z.adresse='" . $id . "'";
$moreinfo = true; $moreinfo = true;
@@ -9455,7 +9478,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
if(bearbeiter!="",bearbeiter,a2.name) as bearbeiter, if(bearbeiter!="",bearbeiter,a2.name) as bearbeiter,
CONCAT(UCASE(LEFT(d.typ, 1)), SUBSTRING(d.typ, 2)) as art, CONCAT(UCASE(LEFT(d.typ, 1)), SUBSTRING(d.typ, 2)) as art,
CONCAT(IF(d.sent = 1, "JA", "NEIN"),"<a data-type=dokumente data-id=", d.id, "></a>") as gesendet, CONCAT(IF(d.sent = 1, "JA", "NEIN"),"<a data-type=dokumente data-id=", d.id, "></a>") as gesendet,
"" as pdf, concat("<a href=\"index.php?module=dateien&action=send&id=",(SELECT datei FROM datei_stichwoerter WHERE subjekt="anhang" AND objekt="dokument" AND parameter = d.id LIMIT 1),"\"><img src=./themes/' . $this->app->Conf->WFconf['defaulttheme'] . '/images/pdf.svg></a>") as pdf,
concat("1","-",d.id) as did,d.content as suchtext,d.internebezeichnung concat("1","-",d.id) as did,d.content as suchtext,d.internebezeichnung
FROM FROM
dokumente d dokumente d
@@ -9799,7 +9822,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
*/ */
$this->app->User->SetParameter('stammdatenbereinigen_list_param', implode(';',$paramsGroupBy)); $this->app->User->SetParameter('stammdatenbereinigen_list_param', implode(';',$paramsGroupBy));
if(count($groupABy)>0) if((empty($groupABy)?0:count($groupABy))>0)
{ {
$groupby = ' $groupby = '
GROUP BY ' . implode(',', $groupABy) . ' GROUP BY ' . implode(',', $groupABy) . '
@@ -10822,7 +10845,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
} }
if(isset($alignright)) if(isset($alignright))
{ {
for ($aligni = 0;$aligni < count($alignright);$aligni++) { for ($aligni = 0;$aligni < (empty($alignright)?0:count($alignright));$aligni++) {
$this->app->Tpl->Add('YUICSS', ' $this->app->Tpl->Add('YUICSS', '
#' . $name . ' > tbody > tr > td:nth-child(' . $alignright[$aligni] . ') { #' . $name . ' > tbody > tr > td:nth-child(' . $alignright[$aligni] . ') {
text-align: right; text-align: right;
@@ -10832,7 +10855,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
} }
if(isset($aligncenter)) if(isset($aligncenter))
{ {
for ($aligni = 0;$aligni < count($aligncenter);$aligni++) { for ($aligni = 0;$aligni < (empty($aligncenter)?0:count($aligncenter));$aligni++) {
$this->app->Tpl->Add('YUICSS', ' $this->app->Tpl->Add('YUICSS', '
#' . $name . ' > tbody > tr > td:nth-child(' . $aligncenter[$aligni] . ') { #' . $name . ' > tbody > tr > td:nth-child(' . $aligncenter[$aligni] . ') {
text-align: center; text-align: center;
@@ -10842,7 +10865,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
} }
if(isset($hide320)) if(isset($hide320))
{ {
for ($h = 0;$h < count($hide320);$h++) { for ($h = 0;$h < (empty($hide320)?0:count($hide320));$h++) {
$this->app->Tpl->Add('YUICSS', ' $this->app->Tpl->Add('YUICSS', '
@media screen and (max-width: 320px){ @media screen and (max-width: 320px){
#' . $name . ' > thead > tr > th:nth-child(' . $hide320[$h] . ') { #' . $name . ' > thead > tr > th:nth-child(' . $hide320[$h] . ') {
@@ -10861,7 +10884,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
if(isset($nowrap) && is_array($nowrap)) if(isset($nowrap) && is_array($nowrap))
{ {
for ($h = 0;$h < count($nowrap);$h++) { for ($h = 0;$h < (empty($nowrap)?0:count($nowrap));$h++) {
$this->app->Tpl->Add('YUICSS', ' $this->app->Tpl->Add('YUICSS', '
@media screen and (max-width: 767px){ @media screen and (max-width: 767px){
#' . $name . ' > tbody > tr > td:nth-child(' . $hide767[$h] . '){ #' . $name . ' > tbody > tr > td:nth-child(' . $hide767[$h] . '){
@@ -10875,7 +10898,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
if(isset($hide767)) if(isset($hide767))
{ {
for ($h = 0;$h < count($hide767);$h++) { for ($h = 0;$h < (empty($hide767)?0:count($hide767));$h++) {
$this->app->Tpl->Add('YUICSS', ' $this->app->Tpl->Add('YUICSS', '
@media screen and (max-width: 767px){ @media screen and (max-width: 767px){
#' . $name . ' > thead > tr > th:nth-child(' . $hide767[$h] . ') { #' . $name . ' > thead > tr > th:nth-child(' . $hide767[$h] . ') {
@@ -10894,7 +10917,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
} }
if(isset($hide480)) if(isset($hide480))
{ {
for ($h = 0;$h < count($hide480);$h++) { for ($h = 0;$h < (empty($hide480)?0:count($hide480));$h++) {
$this->app->Tpl->Add('YUICSS', ' $this->app->Tpl->Add('YUICSS', '
@media screen and (max-width: 479px){ @media screen and (max-width: 479px){
#' . $name . ' > thead > tr > th:nth-child(' . $hide480[$h] . ') { #' . $name . ' > thead > tr > th:nth-child(' . $hide480[$h] . ') {
@@ -10939,7 +10962,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
} }
} }
if(isset($hidecolumns) && $hidecolumns && is_array($hidecolumns) && count($hidecolumns) > 2) if(isset($hidecolumns) && $hidecolumns && is_array($hidecolumns) && (empty($hidecolumns)?0:count($hidecolumns)) > 2)
{ {
$hidecolumnsitem = $hidecolumns[0]; $hidecolumnsitem = $hidecolumns[0];
if(!is_array($hidecolumns[2]))$hidecolumns[2][0] = $hidecolumns[2]; if(!is_array($hidecolumns[2]))$hidecolumns[2][0] = $hidecolumns[2];
@@ -11306,7 +11329,7 @@ $directlink=0;
if( (($this->app->erp->RechteVorhanden($_module,"edit") && $_action=="list") || if( (($this->app->erp->RechteVorhanden($_module,"edit") && $_action=="list") ||
(!empty($forcerowclick))) && !empty($rowclick)) (!empty($forcerowclick))) && !empty($rowclick))
{ {
if($menucol > 0 || count($heading) > 0) { if($menucol > 0 || (empty($heading)?0:count($heading)) > 0) {
if(!empty($doppelteids)){ if(!empty($doppelteids)){
$doppelteids = '\-[1-9]{1}[0-9]*'; $doppelteids = '\-[1-9]{1}[0-9]*';
}else{ }else{
@@ -11316,11 +11339,11 @@ if( (($this->app->erp->RechteVorhanden($_module,"edit") && $_action=="list") ||
{ {
$tmpmenucol=$menucol; $tmpmenucol=$menucol;
} else { } else {
$tmpmenucol=!empty($heading)?count($heading)-1:0; $tmpmenucol=!empty($heading)?(empty($heading)?0:count($heading))-1:0;
} }
if(!empty($menucol) && $menucol > 0 || count($heading) > 0) { if(!empty($menucol) && $menucol > 0 || (empty($heading)?0:count($heading)) > 0) {
if(isset($doppelteids)&& $doppelteids){ if(isset($doppelteids)&& $doppelteids){
$doppelteids = '\-[1-9]{1}[0-9]*'; $doppelteids = '\-[1-9]{1}[0-9]*';
} }
@@ -11331,7 +11354,7 @@ if(!empty($menucol) && $menucol > 0 || count($heading) > 0) {
{ {
$tmpmenucol=$menucol; $tmpmenucol=$menucol;
} else { } else {
$tmpmenucol=count($heading)-1; $tmpmenucol=(empty($heading)?0:count($heading))-1;
} }
if(empty($rowclickaction) || $rowclickaction=="") if(empty($rowclickaction) || $rowclickaction=="")
@@ -11389,7 +11412,7 @@ if((isset($extra_anzahl_datensaetze) && (int)$extra_anzahl_datensaetze > 0) || (
{ {
if(!empty($aLengthMenuArr)) if(!empty($aLengthMenuArr))
{ {
if($aLengthMenuArr[count($aLengthMenuArr)-1] < $maxrows) if($aLengthMenuArr[(empty($aLengthMenuArr)?0:count($aLengthMenuArr))-1] < $maxrows)
{ {
$aLengthMenuArr[] = (int)$maxrows; $aLengthMenuArr[] = (int)$maxrows;
break; break;
@@ -12028,7 +12051,7 @@ url:strUrl, success:function(html){strReturn = html;}, async:false
} }
'); ');
} }
$colspan = !empty($heading)?count($heading):1; $colspan = !empty($heading)?(empty($heading)?0:count($heading)):1;
//<tr><th colspan="' . $colspan . '"><br></th></tr> //<tr><th colspan="' . $colspan . '"><br></th></tr>
$this->app->Tpl->Add($parsetarget, ' $this->app->Tpl->Add($parsetarget, '
<div class="table-responsive"> <div class="table-responsive">
@@ -12036,7 +12059,7 @@ url:strUrl, success:function(html){strReturn = html;}, async:false
<thead> <thead>
<tr>'); <tr>');
if(!empty($heading)){ if(!empty($heading)){
$cHeading = count($heading); $cHeading = (empty($heading)?0:count($heading));
for ($i = 0; $i < $cHeading; $i++) { for ($i = 0; $i < $cHeading; $i++) {
$this->app->Tpl->Add( $this->app->Tpl->Add(
$parsetarget, $parsetarget,
@@ -12050,7 +12073,7 @@ url:strUrl, success:function(html){strReturn = html;}, async:false
if(empty($columnfilter) && !(isset($columnfilter) && $columnfilter === false)) { if(empty($columnfilter) && !(isset($columnfilter) && $columnfilter === false)) {
$this->app->Tpl->Add($parsetarget, '</tr><tr>'); $this->app->Tpl->Add($parsetarget, '</tr><tr>');
if(!empty($heading)){ if(!empty($heading)){
$cHeading = count($heading); $cHeading = (empty($heading)?0:count($heading));
for ($i = 0; $i < $cHeading; $i++) { for ($i = 0; $i < $cHeading; $i++) {
$this->app->Tpl->Add( $this->app->Tpl->Add(
$parsetarget, $parsetarget,
@@ -12073,7 +12096,7 @@ url:strUrl, success:function(html){strReturn = html;}, async:false
<tr> <tr>
'); ');
if(!empty($heading)){ if(!empty($heading)){
$cheader = count($heading); $cheader = (empty($heading)?0:count($heading));
for ($i = 0; $i < $cheader; $i++) { for ($i = 0; $i < $cheader; $i++) {
$this->app->Tpl->Add( $this->app->Tpl->Add(
$parsetarget, $parsetarget,
@@ -13815,7 +13838,7 @@ source: "index.php?module=ajax&action=filter&filtername=' . $filter . $extendurl
function ChartDB($sql, $parsetarget, $width, $height, $limitmin = 0, $limitmax = 100, $gridy = 5) { function ChartDB($sql, $parsetarget, $width, $height, $limitmin = 0, $limitmax = 100, $gridy = 5) {
$result = $this->app->DB->SelectArr($sql); $result = $this->app->DB->SelectArr($sql);
for ($i = 0;$i < count($result);$i++) { for ($i = 0;$i < (empty($result)?0:count($result));$i++) {
$lables[] = $result[$i]['legende']; $lables[] = $result[$i]['legende'];
$values[] = $result[$i]['wert']; $values[] = $result[$i]['wert'];
} }
@@ -13828,7 +13851,7 @@ source: "index.php?module=ajax&action=filter&filtername=' . $filter . $extendurl
function Chart($parsetarget, $labels, $width = 400, $height = 200, $limitmin = 0, $limitmax = 100, $gridy = 5) { function Chart($parsetarget, $labels, $width = 400, $height = 200, $limitmin = 0, $limitmax = 100, $gridy = 5) {
$werte = ''; $werte = '';
$values = $labels; $values = $labels;
for ($i = 0;$i < count($values) - 1;$i++) { for ($i = 0;$i < (empty($values)?0:count($values)) - 1;$i++) {
$werte = $werte . "'" . $values[$i] . "',"; $werte = $werte . "'" . $values[$i] . "',";
} }
$werte = $werte . "'" . $values[$i + 1] . "'"; $werte = $werte . "'" . $values[$i + 1] . "'";
@@ -13837,7 +13860,7 @@ source: "index.php?module=ajax&action=filter&filtername=' . $filter . $extendurl
$this->app->Tpl->Set('CHART_HEIGHT', $height); $this->app->Tpl->Set('CHART_HEIGHT', $height);
$this->app->Tpl->Set('LIMITMIN', $limitmin); $this->app->Tpl->Set('LIMITMIN', $limitmin);
$this->app->Tpl->Set('LIMITMAX', $limitmax); $this->app->Tpl->Set('LIMITMAX', $limitmax);
$this->app->Tpl->Set('GRIDX', count($values)); $this->app->Tpl->Set('GRIDX', (empty($values)?0:count($values)));
$this->app->Tpl->Set('GRIDY', $gridy); $this->app->Tpl->Set('GRIDY', $gridy);
$this->app->Tpl->Parse($parsetarget, "chart.tpl"); $this->app->Tpl->Parse($parsetarget, "chart.tpl");
} }
@@ -13866,7 +13889,7 @@ source: "index.php?module=ajax&action=filter&filtername=' . $filter . $extendurl
function ChartAdd($color, $values) { function ChartAdd($color, $values) {
$werte = ''; $werte = '';
for ($i = 0;$i < count($values) - 1;$i++) { for ($i = 0;$i < (empty($values)?0:count($values)) - 1;$i++) {
$werte = $werte . $values[$i] . ","; $werte = $werte . $values[$i] . ",";
} }
$werte = $werte . $values[$i + 1]; $werte = $werte . $values[$i + 1];
@@ -13931,7 +13954,7 @@ source: "index.php?module=ajax&action=filter&filtername=' . $filter . $extendurl
LEFT JOIN datei_version v ON v.datei=v2.datei AND v.version = v2.version WHERE $where ORDER BY s.sort DESC LIMIT 2 "; LEFT JOIN datei_version v ON v.datei=v2.datei AND v.version = v2.version WHERE $where ORDER BY s.sort DESC LIMIT 2 ";
$query = $this->app->DB->SelectArr($sql); $query = $this->app->DB->SelectArr($sql);
$status = 0; $status = 0;
if($query && count($query) == 2) if($query && (empty($query)?0:count($query)) == 2)
{ {
$status = 1; $status = 1;
$this->app->DB->Update("UPDATE datei_stichwoerter SET sort = '".$query[1]['sort']."' WHERE id = '".$query[0]['id']."' LIMIT 1"); $this->app->DB->Update("UPDATE datei_stichwoerter SET sort = '".$query[1]['sort']."' WHERE id = '".$query[0]['id']."' LIMIT 1");
@@ -13964,7 +13987,7 @@ source: "index.php?module=ajax&action=filter&filtername=' . $filter . $extendurl
LEFT JOIN datei_version v ON v.datei=v2.datei AND v.version = v2.version WHERE $where ORDER BY s.sort LIMIT 2 "; LEFT JOIN datei_version v ON v.datei=v2.datei AND v.version = v2.version WHERE $where ORDER BY s.sort LIMIT 2 ";
$query = $this->app->DB->SelectArr($sql); $query = $this->app->DB->SelectArr($sql);
$status = 0; $status = 0;
if($query && count($query) == 2) if($query && (empty($query)?0:count($query)) == 2)
{ {
$status = 1; $status = 1;
$this->app->DB->Update("UPDATE datei_stichwoerter SET sort = '".$query[1]['sort']."' WHERE id = '".$query[0]['id']."' LIMIT 1"); $this->app->DB->Update("UPDATE datei_stichwoerter SET sort = '".$query[1]['sort']."' WHERE id = '".$query[0]['id']."' LIMIT 1");
@@ -14075,7 +14098,7 @@ source: "index.php?module=ajax&action=filter&filtername=' . $filter . $extendurl
} }
if(!$found)unset($auswahl[$k]); if(!$found)unset($auswahl[$k]);
} }
if(!$auswahl || count($auswahl) == 0) if(!$auswahl || (empty($auswahl)?0:count($auswahl)) == 0)
{ {
echo 'Keine PDF-Dateien ausgew&auml;hlt!'; echo 'Keine PDF-Dateien ausgew&auml;hlt!';
exit; exit;
@@ -14146,7 +14169,7 @@ source: "index.php?module=ajax&action=filter&filtername=' . $filter . $extendurl
} }
if(!$found)unset($auswahl[$k]); if(!$found)unset($auswahl[$k]);
} }
if(!$auswahl || count($auswahl) == 0) if(!$auswahl || (empty($auswahl)?0:count($auswahl)) == 0)
{ {
echo 'Keine Dateien ausgew&auml;hlt!'; echo 'Keine Dateien ausgew&auml;hlt!';
exit; exit;
@@ -14267,7 +14290,7 @@ source: "index.php?module=ajax&action=filter&filtername=' . $filter . $extendurl
/* /*
$tmp = $this->app->DB->SelectArr("SELECT * FROM datei_stichwortvorlagen WHERE modul='' ORDER by beschriftung"); $tmp = $this->app->DB->SelectArr("SELECT * FROM datei_stichwortvorlagen WHERE modul='' ORDER by beschriftung");
for($i=0;$i<count($tmp);$i++) for($i=0;$i<(empty($tmp)?0:count($tmp));$i++)
$this->app->Tpl->Add('EXTRASTICHWOERTER','<option value="'.$tmp[$i]['beschriftung'].'">'.$tmp[$i]['beschriftung'].'</option>'); $this->app->Tpl->Add('EXTRASTICHWOERTER','<option value="'.$tmp[$i]['beschriftung'].'">'.$tmp[$i]['beschriftung'].'</option>');
*/ */
$maxsize = 0; $maxsize = 0;
@@ -15080,7 +15103,7 @@ source: "index.php?module=ajax&action=filter&filtername=' . $filter . $extendurl
$summenarray[] = '<input type="hidden" id="mcol" value="'.$mengencol.'" /><input type="hidden" id="rcol" value="'.$rabattcol.'" /><input type="hidden" id="scol" value="'.$summencol.'" /><span id="zwischensumme">'.number_format($zwischensumme,4,'.','').'</span>'; $summenarray[] = '<input type="hidden" id="mcol" value="'.$mengencol.'" /><input type="hidden" id="rcol" value="'.$rabattcol.'" /><input type="hidden" id="scol" value="'.$summencol.'" /><span id="zwischensumme">'.number_format($zwischensumme,4,'.','').'</span>';
if($module != 'verbindlichkeit')$summenarray[] = ''; if($module != 'verbindlichkeit')$summenarray[] = '';
$summenarray[] = ''; $summenarray[] = '';
$summenarray[count($summenarray)-1] .= $js; $summenarray[(empty($summenarray)?0:count($summenarray))-1] .= $js;
if($mengencol && $summencol && $module!='produktion')$table->AddRow($summenarray); if($mengencol && $summencol && $module!='produktion')$table->AddRow($summenarray);
//$this->app->YUI->AutoComplete(ARTIKELAUTO,"artikel",array('name_de','warengruppe'),"nummer"); //$this->app->YUI->AutoComplete(ARTIKELAUTO,"artikel",array('name_de','warengruppe'),"nummer");
@@ -15602,11 +15625,11 @@ function IframeDialog($width, $height, $src = "") {
} }
</script> </script>
<div id=\"preistabellediv\" style=\"display:none;\"><div id=\"preiserror\">".(count($waehrungen) > 1?"":"Bitte legen Sie erst W&auml;hrungen an!")."</div> <div id=\"preistabellediv\" style=\"display:none;\"><div id=\"preiserror\">".((empty($waehrungen)?0:count($waehrungen)) > 1?"":"Bitte legen Sie erst W&auml;hrungen an!")."</div>
"; ";
$i = -1; $i = -1;
if(count($waehrungen) > 1) if((empty($waehrungen)?0:count($waehrungen)) > 1)
{ {
$htmltabelle .= "<table><tr><th>W&auml;hrung</th><th>Kurs</th><th>umgerechnter Preis</th><th>Aktion</th></tr>"; $htmltabelle .= "<table><tr><th>W&auml;hrung</th><th>Kurs</th><th>umgerechnter Preis</th><th>Aktion</th></tr>";
foreach($waehrungen as $waehrung => $kurs) foreach($waehrungen as $waehrung => $kurs)
+11097 -7818
View File
File diff suppressed because it is too large Load Diff
+4
View File
@@ -415,6 +415,10 @@ function upgrade_main(string $directory,bool $verbose, bool $check_git, bool $do
$counter++; $counter++;
echo_out("\rUpgrade step $counter of $number_of_statements... "); echo_out("\rUpgrade step $counter of $number_of_statements... ");
if ($verbose) {
echo_out("\n".$sql."\n");
}
$query_result = mysqli_query($mysqli, $sql); $query_result = mysqli_query($mysqli, $sql);
if (!$query_result) { if (!$query_result) {
$error = " not ok: ". mysqli_error($mysqli); $error = " not ok: ". mysqli_error($mysqli);
+64 -29
View File
@@ -79,20 +79,22 @@ function mustal_load_tables_from_db(string $host, string $schema, string $user,
} }
// Get db_def and views // Get db_def and views
$sql = "SHOW FULL tables WHERE Table_type = 'BASE TABLE'"; $sql = "SHOW TABLE STATUS WHERE engine IS NOT NULL";
$query_result = mysqli_query($mysqli, $sql); $query_result = mysqli_query($mysqli, $sql);
if (!$query_result) { if (!$query_result) {
return(array()); return(array());
} }
while ($row = mysqli_fetch_assoc($query_result)) { while ($row = mysqli_fetch_assoc($query_result)) {
$table = array(); $table = array();
$table['name'] = $row['Tables_in_'.$schema]; $table['name'] = $row['Name'];
$table['type'] = $row['Table_type']; $table['collation'] = $row['Collation'];
$table['type'] = 'BASE TABLE';
$tables[] = $table; // Add table to list of tables $tables[] = $table; // Add table to list of tables
} }
// Get and add columns of the table // Get and add columns of the table
foreach ($tables as &$table) { foreach ($tables as &$table) {
$sql = "SHOW FULL COLUMNS FROM ".$table['name']; $sql = "SHOW FULL COLUMNS FROM ".$table['name'];
$query_result = mysqli_query($mysqli, $sql); $query_result = mysqli_query($mysqli, $sql);
@@ -109,6 +111,10 @@ function mustal_load_tables_from_db(string $host, string $schema, string $user,
$column['Default'] = mustal_mysql_put_text_type_in_quotes($column['Type'],$column['Default']); $column['Default'] = mustal_mysql_put_text_type_in_quotes($column['Type'],$column['Default']);
} }
if (empty($column['Collation']) && mustal_is_string_type($column['Type'])) {
$column['Collation'] = $table['collation'];
}
$columns[] = $column; // Add column to list of columns $columns[] = $column; // Add column to list of columns
} }
$table['columns'] = $columns; $table['columns'] = $columns;
@@ -135,6 +141,13 @@ function mustal_load_tables_from_db(string $host, string $schema, string $user,
$composed_key['Key_name'] = $key['Key_name']; $composed_key['Key_name'] = $key['Key_name'];
$composed_key['Index_type'] = $key['Index_type']; $composed_key['Index_type'] = $key['Index_type'];
$composed_key['columns'][] = $key['Column_name']; $composed_key['columns'][] = $key['Column_name'];
if ($key['Key_name'] != 'PRIMARY') {
$composed_key['Non_unique'] = ($key['Non_unique'] == 1)?'':'UNIQUE';
} else {
$composed_key['Non_unique'] = '';
}
$composed_keys[] = $composed_key; $composed_keys[] = $composed_key;
} else { } else {
// Given key, add column // Given key, add column
@@ -161,9 +174,16 @@ function mustal_load_tables_from_db(string $host, string $schema, string $user,
foreach ($views as &$view) { foreach ($views as &$view) {
$sql = "SHOW CREATE VIEW ".$view['name']; $sql = "SHOW CREATE VIEW ".$view['name'];
$query_result = mysqli_query($mysqli, $sql);
try {
$query_result = mysqli_query($mysqli, $sql);
}
catch (exception $e) {
$query_result = false; // VIEW is erroneous
}
if (!$query_result) { if (!$query_result) {
return(array()); $view['Create'] = '';
continue;
} }
$viewdef = mysqli_fetch_assoc($query_result); $viewdef = mysqli_fetch_assoc($query_result);
@@ -330,19 +350,19 @@ function mustal_compare_table_array(array $nominal, string $nominal_name, array
// Compare the properties of the sql_indexs // Compare the properties of the sql_indexs
if ($check_column_definitions) { if ($check_column_definitions) {
$found_sql_index = $found_table['keys'][$sql_index_key]; $found_sql_index = $found_table['keys'][$sql_index_key];
foreach ($sql_index as $key => $value) { foreach ($sql_index as $key => $value) {
if ($found_sql_index[$key] != $value) { if ($found_sql_index[$key] != $value) {
$compare_difference = array();
// if ($key != 'permissions') { $compare_difference['type'] = "Key definition";
$compare_difference = array(); $compare_difference['table'] = $database_table['name'];
$compare_difference['type'] = "Key definition"; $compare_difference['key'] = $sql_index['Key_name'];
$compare_difference['table'] = $database_table['name']; $compare_difference['property'] = $key;
$compare_difference['key'] = $sql_index['Key_name']; /* $compare_difference[$nominal_name] = implode(',',$value);
$compare_difference['property'] = $key; $compare_difference[$actual_name] = implode(',',$found_sql_index[$key]);*/
$compare_difference[$nominal_name] = implode(',',$value); $compare_difference[$nominal_name] = $value;
$compare_difference[$actual_name] = implode(',',$found_sql_index[$key]); $compare_difference[$actual_name] = $found_sql_index[$key];
$compare_differences[] = $compare_difference; $compare_differences[] = $compare_difference;
// }
} }
} }
unset($value); unset($value);
@@ -401,9 +421,11 @@ function mustal_compare_table_array(array $nominal, string $nominal_name, array
// Generate SQL to create or modify column // Generate SQL to create or modify column
function mustal_column_sql_definition(string $table_name, array $column, array $reserved_words_without_quote) : string { function mustal_column_sql_definition(string $table_name, array $column, array $reserved_words_without_quote) : string {
$column_is_string_type = mustal_is_string_type($column['Type']);
foreach($column as $key => &$value) { foreach($column as $key => &$value) {
$value = (string) $value; $value = (string) $value;
$value = mustal_column_sql_create_property_definition($key,$value,$reserved_words_without_quote); $value = mustal_column_sql_create_property_definition($key,$value,$reserved_words_without_quote,$column_is_string_type);
} }
// Default handling here // Default handling here
@@ -422,7 +444,7 @@ function mustal_column_sql_definition(string $table_name, array $column, array $
} }
// Generate SQL to modify a single column property // 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 { function mustal_column_sql_create_property_definition(string $property, string $property_value, array $reserved_words_without_quote, $column_is_string_type) : string {
switch ($property) { switch ($property) {
case 'Type': case 'Type':
@@ -453,8 +475,10 @@ function mustal_column_sql_create_property_definition(string $property, string $
} }
break; break;
case 'Collation': case 'Collation':
if ($property_value != '') { if ($property_value != '' && $column_is_string_type) {
$property_value = " COLLATE ".$property_value; $property_value = " COLLATE ".$property_value;
} else {
$property_value = "";
} }
break; break;
default: default:
@@ -468,9 +492,9 @@ function mustal_column_sql_create_property_definition(string $property, string $
// Replaces different variants of the same function mustal_to allow comparison // Replaces different variants of the same function mustal_to allow comparison
function mustal_sql_replace_reserved_functions(array &$column, array $replacers) { function mustal_sql_replace_reserved_functions(array &$column, array $replacers) {
$result = strtolower($column['Default']); $result = $column['Default'];
foreach ($replacers as $replace) { foreach ($replacers as $replace) {
if ($result == $replace[0]) { if (strtolower($column['Default']) == $replace[0]) {
$result = $replace[1]; $result = $replace[1];
} }
} }
@@ -562,13 +586,13 @@ function mustal_calculate_db_upgrade(array $compare_def, array $db_def, array &$
$keystring = "PRIMARY KEY "; $keystring = "PRIMARY KEY ";
} else { } else {
if(array_key_exists('Index_type', $key)) { // if(array_key_exists('Index_type', $key)) {
$index_type = $key['Index_type']; // $index_type = $key['Index_type'];
} else { // } else {
$index_type = ""; $index_type = "";
} // }
$keystring = $index_type." KEY `".$key['Key_name']."` "; $keystring = $index_type." ".$key['Non_unique']." KEY `".$key['Key_name']."` ";
} }
$sql .= $comma.$keystring."(`".implode("`,`",$key['columns'])."`) "; $sql .= $comma.$keystring."(`".implode("`,`",$key['columns'])."`) ";
} }
@@ -652,7 +676,7 @@ function mustal_calculate_db_upgrade(array $compare_def, array $db_def, array &$
if ($key_key !== false) { if ($key_key !== false) {
$key = $table['keys'][$key_key]; $key = $table['keys'][$key_key];
$sql = "ALTER TABLE `$table_name` ADD KEY `".$key_name."` "; $sql = "ALTER TABLE `$table_name` ADD ".$key['Non_unique']." KEY `".$key_name."` ";
$sql .= "(`".implode("`,`",$key['columns'])."`)"; $sql .= "(`".implode("`,`",$key['columns'])."`)";
$sql .= ";"; $sql .= ";";
$upgrade_sql[] = $sql; $upgrade_sql[] = $sql;
@@ -682,7 +706,7 @@ function mustal_calculate_db_upgrade(array $compare_def, array $db_def, array &$
$sql = "ALTER TABLE `$table_name` DROP KEY `".$key_name."`;"; $sql = "ALTER TABLE `$table_name` DROP KEY `".$key_name."`;";
$upgrade_sql[] = $sql; $upgrade_sql[] = $sql;
$sql = "ALTER TABLE `$table_name` ADD KEY `".$key_name."` "; $sql = "ALTER TABLE `$table_name` ADD ".$key['Non_unique']." KEY `".$key_name."` ";
$sql .= "(`".implode("`,`",$key['columns'])."`)"; $sql .= "(`".implode("`,`",$key['columns'])."`)";
$sql .= ";"; $sql .= ";";
$upgrade_sql[] = $sql; $upgrade_sql[] = $sql;
@@ -743,6 +767,17 @@ function mustal_calculate_db_upgrade(array $compare_def, array $db_def, array &$
array_unshift($upgrade_sql,"SET SQL_MODE='ALLOW_INVALID_DATES';","SET SESSION innodb_strict_mode=OFF;"); array_unshift($upgrade_sql,"SET SQL_MODE='ALLOW_INVALID_DATES';","SET SESSION innodb_strict_mode=OFF;");
} }
return($result); return($result);
} }
// Check if given type is a string, relevant for collation
function mustal_is_string_type(string $type) {
$mustal_string_types = array('varchar','char','text','tinytext','mediumtext','longtext');
foreach($mustal_string_types as $string_type) {
if (stripos($type,$string_type) === 0) {
return(true);
}
}
return(false);
}
+1 -1
View File
@@ -1,7 +1,7 @@
<?php <?php
$version="OSS"; $version="OSS";
$version_revision="1.8"; $version_revision="1.10";
$githash = file_get_contents("../githash.txt"); $githash = file_get_contents("../githash.txt");
if (!empty($githash)) { if (!empty($githash)) {
$version_revision .= " (".substr($githash,0,8).")"; $version_revision .= " (".substr($githash,0,8).")";
+5 -1
View File
@@ -4,7 +4,7 @@ Options -Indexes
# Deny access to all *.php # Deny access to all *.php
Order deny,allow Order deny,allow
Allow from all Allow from all
<FilesMatch "\.(css|jpg|jpeg|gif|png|svg|js)$"> <FilesMatch "\.(css|jpg|jpeg|gif|png|svg|js|ico|css.map)$">
Order Allow,Deny Order Allow,Deny
Allow from all Allow from all
</FilesMatch> </FilesMatch>
@@ -23,4 +23,8 @@ Allow from all
Order Allow,Deny Order Allow,Deny
Allow from all Allow from all
</Files> </Files>
<Files robots.txt>
Order Allow,Deny
Allow from all
</Files>
# end # end
+5 -2
View File
@@ -440,12 +440,15 @@ class erpooSystem extends Application
); );
} }
// Creates user specific items // Creates user specific items
$offene_tickets = $this->erp->AnzahlOffeneTickets(false);
$offene_tickets_user = $this->erp->AnzahlOffeneTickets(true);
$possibleUserItems = [ $possibleUserItems = [
'Tickets' => [ 'Tickets' => [
'link' => 'index.php?module=ticket&action=list', 'link' => 'index.php?module=ticket&action=list',
'counter' => $this->erp->AnzahlOffeneTickets() 'counter' => ($offene_tickets+$offene_tickets_user > 0)?$offene_tickets_user."/".$offene_tickets:""
], ],
'Aufgaben' => [ 'Aufgaben' => [
'link' => 'index.php?module=aufgaben&action=list', 'link' => 'index.php?module=aufgaben&action=list',
+7
View File
@@ -0,0 +1,7 @@
/*
* Fix scrolling to middle of page bug
*/
$(() => {
window.scrollTo(0, 0);
})
+349 -213
View File
@@ -1517,6 +1517,11 @@ public function NavigationHooks(&$menu)
// return "replace(trim($spalte)+0,'.',',')"; // return "replace(trim($spalte)+0,'.',',')";
} }
function FormatUCfirst($spalte)
{
return ('CONCAT(UCASE(LEFT('.$spalte.', 1)),SUBSTRING('.$spalte.', 2))');
}
static function add_alias(string $text, $alias = false) { static function add_alias(string $text, $alias = false) {
if (empty($alias)) { if (empty($alias)) {
return($text); return($text);
@@ -2642,6 +2647,24 @@ public function NavigationHooks(&$menu)
return "if(" . $fieldstroke . ",CONCAT('<s>'," . $field . ",'</s>')," . $field . ")"; return "if(" . $fieldstroke . ",CONCAT('<s>'," . $field . ",'</s>')," . $field . ")";
} }
// @refactor DbHelper Komponente
// creates a CONCAT sql statement with strings or sql expressions
// Use like this: ConcatSQL('<a href=index.php?id=',['sql'] => 'id','>','click here</a>');
function ConcatSQL(array $fields) {
$result = "CONCAT(";
$comma = "";
foreach ($fields as $field) {
if (gettype($field) == 'array') {
$result .= $comma.$field['sql'];
} else {
$result .= $comma."'".$field."'";
}
$comma = ",";
}
$result .= ")";
return($result);
}
// @refactor Formater Komponente // @refactor Formater Komponente
function Dateinamen($text) { function Dateinamen($text) {
$text = $this->UmlauteEntfernen($text); $text = $this->UmlauteEntfernen($text);
@@ -2673,7 +2696,14 @@ public function NavigationHooks(&$menu)
public function AnzahlOffeneTickets($eigene=true) public function AnzahlOffeneTickets($eigene=true)
{ {
$sql = "SELECT COUNT(t.id) FROM ticket t WHERE t.status = 'neu' AND ((t.warteschlange = '') OR (t.warteschlange IN (SELECT w.label FROM warteschlangen w WHERE w.adresse = '".$this->app->User->GetAdresse()."')))";
if ($eigene) {
$sql = "SELECT COUNT(t.id) FROM ticket t WHERE t.status = 'neu' AND (t.warteschlange IN (SELECT w.label FROM warteschlangen w WHERE w.adresse = '".$this->app->User->GetAdresse()."'))";
} else
{
$sql = "SELECT COUNT(t.id) FROM ticket t WHERE t.status = 'neu' AND (t.warteschlange = '')";
}
return (int)$this->app->DB->Select($sql); return (int)$this->app->DB->Select($sql);
} }
@@ -5396,6 +5426,18 @@ title: 'Abschicken',
return $ret; return $ret;
} }
/*
* Replace {VARS} with texts given in array
* Input array(key => value)
*/
function ParseVars(array $mapping, $text) {
foreach ($mapping as $key => $value) {
$text = str_replace('{'.strtoupper($key).'}',$value,$text);
}
return $text;
}
// @refactor Document Komponente // @refactor Document Komponente
function CheckBearbeiter($id,$module) function CheckBearbeiter($id,$module)
{ {
@@ -7095,6 +7137,8 @@ title: 'Abschicken',
$navarray['menu']['admin'][$menu]['sec'][] = array('Arbeitsnachweis','arbeitsnachweis','list'); $navarray['menu']['admin'][$menu]['sec'][] = array('Arbeitsnachweis','arbeitsnachweis','list');
$navarray['menu']['admin'][$menu]['sec'][] = array('Gutschrift / '.$this->Firmendaten("bezeichnungstornorechnung"),'gutschrift','list'); $navarray['menu']['admin'][$menu]['sec'][] = array('Gutschrift / '.$this->Firmendaten("bezeichnungstornorechnung"),'gutschrift','list');
$navarray['menu']['admin'][$menu]['sec'][] = array('Proformarechnung','proformarechnung','list'); $navarray['menu']['admin'][$menu]['sec'][] = array('Proformarechnung','proformarechnung','list');
$navarray['menu']['admin'][$menu]['sec'][] = array('Kontoausz&uuml;ge','kontoauszuege','list');
$navarray['menu']['admin'][$menu]['sec'][] = array('Buchungen','fibu_buchungen','list');
$navarray['menu']['admin'][$menu]['sec'][] = array('Abolauf','rechnungslauf','list'); $navarray['menu']['admin'][$menu]['sec'][] = array('Abolauf','rechnungslauf','list');
$navarray['menu']['admin'][$menu]['sec'][] = array('Mahnwesen','mahnwesen','list'); $navarray['menu']['admin'][$menu]['sec'][] = array('Mahnwesen','mahnwesen','list');
@@ -12658,9 +12702,8 @@ function SendPaypalFromAuftrag($auftrag, $test = false)
//$this->app->DB->Update("UPDATE auftrag_position ap, artikel a SET ap.preis='0' WHERE ap.auftrag='$auftrag' AND a.id=ap.artikel AND a.porto='1'"); //$this->app->DB->Update("UPDATE auftrag_position ap, artikel a SET ap.preis='0' WHERE ap.auftrag='$auftrag' AND a.id=ap.artikel AND a.porto='1'");
} }
// Vorkasse Check
//Vorkasse Check $auftrag_ist_vorkasse = false;
//ist genug geld da? zusammenzaehlen der kontoauszuege_zahlungseingang
$summe_eingang = 0; $summe_eingang = 0;
$auftrag_gesamtsumme = 0; $auftrag_gesamtsumme = 0;
$zahlungsweise = ''; $zahlungsweise = '';
@@ -12669,37 +12712,37 @@ function SendPaypalFromAuftrag($auftrag, $test = false)
$auftrag_gesamtsumme = $auftragarr['gesamtsumme'];// $this->app->DB->Select("SELECT gesamtsumme FROM auftrag WHERE id='$auftrag' LIMIT 1"); $auftrag_gesamtsumme = $auftragarr['gesamtsumme'];// $this->app->DB->Select("SELECT gesamtsumme FROM auftrag WHERE id='$auftrag' LIMIT 1");
$zahlungsweise = $auftragarr['zahlungsweise'];// $this->app->DB->Select("SELECT zahlungsweise FROM auftrag WHERE id='$auftrag' LIMIT 1"); $zahlungsweise = $auftragarr['zahlungsweise'];// $this->app->DB->Select("SELECT zahlungsweise FROM auftrag WHERE id='$auftrag' LIMIT 1");
$vorabbezahltmarkieren = $auftragarr['vorabbezahltmarkieren'];// $this->app->DB->Select("SELECT vorabbezahltmarkieren FROM auftrag WHERE id='$auftrag' LIMIT 1"); $vorabbezahltmarkieren = $auftragarr['vorabbezahltmarkieren'];// $this->app->DB->Select("SELECT vorabbezahltmarkieren FROM auftrag WHERE id='$auftrag' LIMIT 1");
$waehrung = $auftragarr['waehrung'];
} }
//TODO zahlungsweisemodul
$zahlungsweise = strtolower($zahlungsweise); $zahlungsweise = strtolower($zahlungsweise);
if($zahlungsweisenmodule = $this->app->DB->SelectArr("SELECT id, modul, verhalten FROM zahlungsweisen WHERE type = '".$this->app->DB->real_escape_string($zahlungsweise)."' AND // Check behaviour
(projekt = '$projekt' OR projekt = 0) ORDER BY projekt = '$projekt' DESC LIMIT 1 $zahlungsweisenmodule = $this->app->DB->SelectArr("SELECT id, modul, verhalten FROM zahlungsweisen WHERE type = '".$this->app->DB->real_escape_string($zahlungsweise)."' AND (projekt = '$projekt' OR projekt = 0) ORDER BY projekt = '$projekt' DESC LIMIT 1");
")) if (!empty($zahlungsweisenmodule)) {
{ if ($zahlungsweisenmodule[0]['verhalten'] == 'vorkasse') {
if( ( $zahlungsweisenmodule[0]['verhalten'] == 'vorkasse' && (($summe_eingang + $toleranz>=$auftrag_gesamtsumme) || $vorabbezahltmarkieren)) || ($zahlungsweisenmodule[0]['verhalten'] == 'lastschrift') || ($zahlungsweisenmodule[0]['verhalten'] == '') || ($zahlungsweisenmodule[0]['verhalten'] == 'rechnung') ) $auftrag_ist_vorkasse = true;
{ }
$this->app->DB->Update("UPDATE auftrag SET vorkasse_ok='1' WHERE id='$auftrag' LIMIT 1"); } else if ($zahlungsweise == 'vorkasse') {
}elseif($summe_eingang > 0) $auftrag_ist_vorkasse = true;
{
$this->app->DB->Update("UPDATE auftrag SET vorkasse_ok='2' WHERE id='$auftrag' LIMIT 1");
}else{
$this->app->DB->Update("UPDATE auftrag SET vorkasse_ok='0' WHERE id='$auftrag' LIMIT 1");
} }
}else{
if($summe_eingang+$toleranz>=$auftrag_gesamtsumme || ($zahlungsweise=="rechnung" || $zahlungsweise=="amazon" || $zahlungsweise=="amazon_bestellung" || $zahlungsweise=="secupay" // Check fibu_buchungen saldo
|| $zahlungsweise=="nachnahme" || $zahlungsweise=="einzugsermaechtigung" || $zahlungsweise=="lastschrift" || $zahlungsweise=="bar") || $auftrag_gesamtsumme==0 || $vorabbezahltmarkieren=="1") $saldo = $this->app->erp->GetSaldoDokument($auftrag,'auftrag');
{ if (!empty($saldo)) {
//TODO ok bei amazon und amazon_bestellung nur wenn transaktionsnummer vorhanden? if ($saldo['waehrung'] == $waehrung && $saldo['betrag'] >= $auftrag_gesamtsumme) {
$this->app->DB->Update("UPDATE auftrag SET vorkasse_ok='1' WHERE id='$auftrag' LIMIT 1"); $saldo_ok = true;
}
} }
else if ($summe_eingang > 0) {
$this->app->DB->Update("UPDATE auftrag SET vorkasse_ok='2' WHERE id='$auftrag' LIMIT 1"); // Decide condition
if ($auftrag_ist_vorkasse && !$saldo_ok && !$vorabbezahltmarkieren) {
$vorkasse_ok = '0';
} else {
$vorkasse_ok = '1';
} }
else {
$this->app->DB->Update("UPDATE auftrag SET vorkasse_ok='0' WHERE id='$auftrag' LIMIT 1"); $this->app->DB->Update("UPDATE auftrag SET vorkasse_ok='$vorkasse_ok' WHERE id='$auftrag'");
}
}
//nachnahme gebuehr check!!!! //nachnahme gebuehr check!!!!
//$nachnahme = $this->app->DB->Select("SELECT id FROM auftrag_position WHERE auftrag='$auftrag' AND nummer='200001' LIMIT 1"); //$nachnahme = $this->app->DB->Select("SELECT id FROM auftrag_position WHERE auftrag='$auftrag' AND nummer='200001' LIMIT 1");
$nachnahme = $this->app->DB->Select("SELECT COUNT(ap.id) FROM auftrag_position ap, artikel a WHERE ap.auftrag='$auftrag' AND ap.artikel=a.id AND a.porto=1 AND ap.preis >= 0 $nachnahme = $this->app->DB->Select("SELECT COUNT(ap.id) FROM auftrag_position ap, artikel a WHERE ap.auftrag='$auftrag' AND ap.artikel=a.id AND a.porto=1 AND ap.preis >= 0
@@ -13749,6 +13792,19 @@ function SendPaypalFromAuftrag($auftrag, $test = false)
} }
} }
function ReplaceKontorahmen($db,$value,$fromform = null) {
$value = $this->app->DB->real_escape_string($value);
if ($db) {
$sachkonto = explode(' ',$value)[0];
$kontoid = $this->app->DB->Select("SELECT id FROM kontorahmen WHERE sachkonto = '$sachkonto' LIMIT 1");
return($kontoid);
} else {
$sachkonto = $this->app->DB->Select("SELECT CONCAT(sachkonto,' ',beschriftung) FROM kontorahmen WHERE id = '$value' LIMIT 1");
return($sachkonto);
}
}
// @refactor FormHelper Komponente // @refactor FormHelper Komponente
function ReplaceLieferant($db,$value,$fromform) function ReplaceLieferant($db,$value,$fromform)
{ {
@@ -14504,156 +14560,6 @@ function get_emails ($str)
else return false; else return false;
} }
// @refactor Mahnwesen Modul
function MahnwesenBody($id,$als,$_datum=null,$sprache='')
{
if($id > 0)
{
$rechnungarr = $this->app->DB->SelectRow("SELECT r.*,DATE_FORMAT(datum,'%d.%m.%Y') as datum_de,DATE_FORMAT(mahnwesen_datum,'%d.%m.%Y') as mahnwesen_datum_de,r.mahnwesen_datum
FROM rechnung AS r WHERE r.id=$id LIMIT 1");
}
if(empty($rechnungarr))
{
return '';
}
$adresse = $rechnungarr['adresse'];
if($sprache==''){
$sprache = $rechnungarr['sprache'];
}
if($sprache==''){
$sprache = $this->app->DB->Select("SELECT sprache FROM adresse WHERE id='$adresse' LIMIT 1");
}
// OfferNo, customerId, OfferDate
$kundennummer = $rechnungarr['kundennummer'];
$projekt = $rechnungarr['projekt'];
$auftrag= $rechnungarr['auftrag'];
$buchhaltung= $rechnungarr['buchhaltung'];
$lieferschein = $rechnungarr['lieferschein'];
$lieferscheinid = $lieferschein;
if($lieferscheinid){
$lieferschein = $this->app->DB->Select("SELECT belegnr FROM lieferschein WHERE id='$lieferschein' LIMIT 1");
}else{
$lieferschein = '';
}
$bestellbestaetigung = $rechnungarr['kundennummer'];
$datum = $rechnungarr['datum_de'];
$datum_sql = $rechnungarr['datum'];
$belegnr = $rechnungarr['belegnr'];
$doppel = $rechnungarr['doppel'];
$freitext = $rechnungarr['freitext'];
$ustid = $rechnungarr['ustid'];
$soll = $rechnungarr['soll'];
$ist = $rechnungarr['ist'];
$land = $rechnungarr['land'];
$mahnwesen_datum = $rechnungarr['mahnwesen_datum'];
$mahnwesen_datum_deutsch = $rechnungarr['mahnwesen_datum_de'];
$zahlungsweise = $rechnungarr['zahlungsweise'];
$zahlungsstatus = $rechnungarr['zahlungsstatus'];
$zahlungszieltage = $rechnungarr['zahlungszieltage'];
$zahlungszieltageskonto = $rechnungarr['zahlungszieltageskonto'];
$zahlungszielskonto = $rechnungarr['zahlungszielskonto'];
$waehrung = $rechnungarr['waehrung'];
$zahlungdatum = $this->app->DB->Select("SELECT DATE_FORMAT(DATE_ADD(datum, INTERVAL $zahlungszieltage DAY),'%d.%m.%Y') FROM rechnung WHERE id='$id' LIMIT 1");
if($_datum!=null)
{
$mahnwesen_datum = $this->app->String->Convert($_datum,'%1.%2.%3','%3-%2-%1');
$mahnwesen_datum_deutsch = $_datum;
}
$zahlungsweise = strtolower($zahlungsweise);
if($als=='zahlungserinnerung')
{
$body = $this->GetGeschaeftsBriefText("MahnwesenZahlungserinnerung",$sprache,$projekt,"rechnung",$id);
$tage = $this->GetKonfiguration('mahnwesen_m1_tage');
}
else if($als=='mahnung1')
{
$body = $this->GetGeschaeftsBriefText("MahnwesenMahnung1",$sprache,$projekt,"rechnung",$id);
$mahngebuehr = $this->GetKonfiguration('mahnwesen_m1_gebuehr');
$tage = $this->GetKonfiguration('mahnwesen_m2_tage');
}
else if($als=='mahnung2')
{
$body = $this->GetGeschaeftsBriefText("MahnwesenMahnung2",$sprache,$projekt,"rechnung",$id);
$tage = $this->GetKonfiguration('mahnwesen_m3_tage');
$mahngebuehr = $this->GetKonfiguration('mahnwesen_m2_gebuehr');
}
else if($als=='mahnung3')
{
$body = $this->GetGeschaeftsBriefText("MahnwesenMahnung3",$sprache,$projekt,"rechnung",$id);
$tage = $this->GetKonfiguration('mahnwesen_ik_tage');
$mahngebuehr = $this->GetKonfiguration('mahnwesen_m3_gebuehr');
}
else if($als=='inkasso')
{
$body = $this->GetGeschaeftsBriefText("MahnwesenInkasso",$sprache,$projekt,"rechnung",$id);
//$tage = $this->GetKonfiguration("mahnwesen_ik_tage");
$tage = 3; //eigentlich vorbei
$mahngebuehr = $this->GetKonfiguration('mahnwesen_ik_gebuehr');
}
else
{
$body = $this->app->erp->Beschriftung("dokument_anschreiben");
}
if($tage <=0) $tage = 0;
$datummahnung= $this->app->DB->Select("SELECT DATE_FORMAT(DATE_ADD('$mahnwesen_datum', INTERVAL $tage DAY),'%d.%m.%Y')");
$datumrechnungzahlungsziel= $this->app->DB->Select("SELECT DATE_FORMAT(DATE_ADD('$datum_sql', INTERVAL $zahlungszieltage DAY),'%d.%m.%Y')");
$tage_ze = $zahlungszieltage + $this->GetKonfiguration('mahnwesen_m1_tage');
$datumzahlungserinnerung= $this->app->DB->Select("SELECT DATE_FORMAT(DATE_ADD('$datum_sql', INTERVAL $tage_ze DAY),'%d.%m.%Y')");
// checkstamp $this->CheckStamp("jhdskKUHsiusakiakuhsd"); // errechnet aus laufzeit und kundenid // wenn es nicht drinnen ist darf es nicht gehen
if($mahngebuehr=='' || !is_numeric($mahngebuehr))
$mahngebuehr = 0;
//$offen= '11,23';
$body = str_replace('{RECHNUNG}',$belegnr,$body);
$body = str_replace('{BELEGNR}',$belegnr,$body);
$body = str_replace('{DATUMRECHNUNG}',$datum,$body);
$body = str_replace('{TAGE}',$tage,$body);
$body = str_replace('{OFFEN}',$this->formatMoney($soll - $ist,$waehrung),$body);
$body = str_replace('{SOLL}',$this->formatMoney($soll,$waehrung),$body);
$body = str_replace('{SUMME}',$this->formatMoney($soll - $ist + $mahngebuehr,$waehrung),$body);
$body = str_replace('{IST}',$this->formatMoney($ist,$waehrung),$body);
$body = str_replace('{DATUM}',$datummahnung,$body);
$body = str_replace('{MAHNGEBUEHR}',$this->formatMoney($mahngebuehr,$waehrung),$body);
$body = str_replace('{OFFENMITMAHNGEBUEHR}',$this->formatMoney($mahngebuehr + $soll - $ist,$waehrung),$body);
$body = str_replace('{MAHNDATUM}',$mahnwesen_datum_deutsch,$body);
// Im Protokoll suchen Datum von Zahlungserinnerung, Mahnung 1, Mahnung 2, Mahnung 3
$mahnung1 = $this->app->DB->Select("SELECT DATE_FORMAT(zeit,'%d.%m.%Y') FROM rechnung_protokoll WHERE rechnung='$id'
AND grund LIKE 'Mahnung1 versendet%' ORDER by Zeit DESC LIMIT 1");
$mahnung2 = $this->app->DB->Select("SELECT DATE_FORMAT(zeit,'%d.%m.%Y') FROM rechnung_protokoll WHERE rechnung='$id'
AND grund LIKE 'Mahnung2 versendet%' ORDER by Zeit DESC LIMIT 1");
$mahnung3 = $this->app->DB->Select("SELECT DATE_FORMAT(zeit,'%d.%m.%Y') FROM rechnung_protokoll WHERE rechnung='$id'
AND grund LIKE 'Mahnung3 versendet%' ORDER by Zeit DESC LIMIT 1");
$body = str_replace('{DATUMMAHNUNG1}',$mahnung1,$body);
$body = str_replace('{DATUMMAHNUNG2}',$mahnung2,$body);
$body = str_replace('{DATUMMAHNUNG3}',$mahnung3,$body);
$body = str_replace('{DATUMZAHLUNGSERINNERUNGFAELLIG}',$datumzahlungserinnerung,$body);
$body = str_replace('{DATUMZAHLUNGSERINNERUNG}',$datumzahlungserinnerung,$body);
$body = str_replace('{DATUMRECHNUNGZAHLUNGSZIEL}',$datumrechnungzahlungsziel,$body);
$body = $this->ParseUserVars('rechnung',$id,$body);
return $body;
}
/**@deprecated */ /**@deprecated */
function AufragZuDTA($auftrag,$rechnung="1") function AufragZuDTA($auftrag,$rechnung="1")
{ {
@@ -18077,7 +17983,8 @@ function Gegenkonto($ust_befreit,$ustid='', $doctype = '', $doctypeId = 0)
created = NOW(), created = NOW(),
uhrzeit = "' . $data['uhrzeit'] . '", uhrzeit = "' . $data['uhrzeit'] . '",
projekt = "' . $data['projekt'] . '", projekt = "' . $data['projekt'] . '",
bearbeiter = "' . $data['bearbeiter'] . '" bearbeiter = "' . $data['bearbeiter'] . '",
sent = "' . $data['sent'] . '"
'); ');
return $this->app->DB->GetInsertID(); return $this->app->DB->GetInsertID();
@@ -22193,8 +22100,8 @@ function ChargenMHDAuslagern($artikel, $menge, $lagerplatztyp, $lpid,$typ,$wert,
$this->app->DB->Delete("DELETE lager_charge FROM lager_charge INNER JOIN lager_platz ON lager_platz.id=lager_charge.lager_platz $this->app->DB->Delete("DELETE lager_charge FROM lager_charge INNER JOIN lager_platz ON lager_platz.id=lager_charge.lager_platz
WHERE lager_platz.verbrauchslager='1' AND lager_platz.id = '$regal'"); WHERE lager_platz.verbrauchslager='1' AND lager_platz.id = '$regal'");
$this->app->DB->Delete("DELETE lager_seriennummer FROM lager_seriennummer $this->app->DB->Delete("DELETE FROM lager_seriennummern
INNER JOIN lager_platz ON lager_platz.id=lager_seriennummer.lager_platz INNER JOIN lager_platz ON lager_platz.id=lager_seriennummern.lager_platz
WHERE lager_platz.verbrauchslager='1' AND lager_platz.id = '$regal'"); WHERE lager_platz.verbrauchslager='1' AND lager_platz.id = '$regal'");
$this->app->DB->Delete("DELETE lager_mindesthaltbarkeitsdatum FROM lager_mindesthaltbarkeitsdatum $this->app->DB->Delete("DELETE lager_mindesthaltbarkeitsdatum FROM lager_mindesthaltbarkeitsdatum
@@ -22212,8 +22119,8 @@ function ChargenMHDAuslagern($artikel, $menge, $lagerplatztyp, $lpid,$typ,$wert,
$this->app->DB->Delete("DELETE lager_charge FROM lager_charge INNER JOIN lager_platz ON lager_platz.id=lager_charge.lager_platz $this->app->DB->Delete("DELETE lager_charge FROM lager_charge INNER JOIN lager_platz ON lager_platz.id=lager_charge.lager_platz
WHERE lager_platz.verbrauchslager='1'"); WHERE lager_platz.verbrauchslager='1'");
$this->app->DB->Delete("DELETE lager_seriennummer FROM lager_seriennummer $this->app->DB->Delete("DELETE FROM lager_seriennummern
INNER JOIN lager_platz ON lager_platz.id=lager_seriennummer.lager_platz INNER JOIN lager_platz ON lager_platz.id=lager_seriennummern.lager_platz
WHERE lager_platz.verbrauchslager='1'"); WHERE lager_platz.verbrauchslager='1'");
$this->app->DB->Delete("DELETE lager_mindesthaltbarkeitsdatum FROM lager_mindesthaltbarkeitsdatum $this->app->DB->Delete("DELETE lager_mindesthaltbarkeitsdatum FROM lager_mindesthaltbarkeitsdatum
@@ -22703,22 +22610,17 @@ function ChargenMHDAuslagern($artikel, $menge, $lagerplatztyp, $lpid,$typ,$wert,
} }
} }
$this->LogFile('*** UPDATE '.$lagerartikel[$ij]['nummer'].' '.$lagerartikel[$ij]['name_de'].' Shop: '.$shop.' Lagernd: '.$verkaufbare_menge.' Korrektur: '.round((float) ($verkaufbare_menge_korrektur - $verkaufbare_menge),7).' Pseudolager: '.round((float) $pseudolager,8));
$cacheQuantity = (int) $verkaufbare_menge_korrektur + (int) $pseudolager;
$this->app->DB->Update(
"UPDATE `artikel` SET `cache_lagerplatzinhaltmenge` = '{$cacheQuantity}'
WHERE `id`= '{$lagerartikel[$ij]['id']}' LIMIT 1"
);
$extnummer = null; $extnummer = null;
$anzges = 0; $anzges = 0;
$anzfehler = 0; $anzfehler = 0;
$result = null; // 1 on success
if(!empty($extnummer) && is_array($extnummer)) { if(!empty($extnummer) && is_array($extnummer)) {
foreach($extnummer as $nummer) { foreach($extnummer as $nummer) {
$anzges++; $anzges++;
try { try {
$this->app->remote->RemoteSendArticleList($shop, array($lagerartikel[$ij]['id']), array($nummer['nummer']), true); $result = $this->app->remote->RemoteSendArticleList($shop, array($lagerartikel[$ij]['id']), array($nummer['nummer']), true);
} }
catch(Exception $e) { catch(Exception $e) {
$this->app->erp->LogFile($this->app->DB->real_escape_string('Lagersync Fehler '.$shop.' '.$nummer['nummer'].' '.$e->getMessage())); $this->app->erp->LogFile($this->app->DB->real_escape_string('Lagersync Fehler '.$shop.' '.$nummer['nummer'].' '.$e->getMessage()));
@@ -22729,7 +22631,7 @@ function ChargenMHDAuslagern($artikel, $menge, $lagerplatztyp, $lpid,$typ,$wert,
else{ else{
$anzges++; $anzges++;
try { try {
$this->app->remote->RemoteSendArticleList($shop,array($lagerartikel[$ij]['id']),!empty($extnummer)? array($extnummer):'',true); $result = $this->app->remote->RemoteSendArticleList($shop,array($lagerartikel[$ij]['id']),!empty($extnummer)? array($extnummer):'',true);
} }
catch(Exception $e) { catch(Exception $e) {
$this->app->erp->LogFile($this->app->DB->real_escape_string('Lagersync Fehler '.$shop.' '.(!empty($extnummer)? array($extnummer):$lagerartikel[$ij]['nummer']).' '.$e->getMessage())); $this->app->erp->LogFile($this->app->DB->real_escape_string('Lagersync Fehler '.$shop.' '.(!empty($extnummer)? array($extnummer):$lagerartikel[$ij]['nummer']).' '.$e->getMessage()));
@@ -22741,6 +22643,19 @@ function ChargenMHDAuslagern($artikel, $menge, $lagerplatztyp, $lpid,$typ,$wert,
if($print_echo) { if($print_echo) {
echo '*** UPDATE ' . $lagerartikel[$ij]['nummer'] . ' ' . $lagerartikel[$ij]['name_de'] . ' Lagernd: ' . ($verkaufbare_menge) . ' Korrekturwert: ' . round($verkaufbare_menge_korrektur - $verkaufbare_menge, 7) . "\r\n"; echo '*** UPDATE ' . $lagerartikel[$ij]['nummer'] . ' ' . $lagerartikel[$ij]['name_de'] . ' Lagernd: ' . ($verkaufbare_menge) . ' Korrekturwert: ' . round($verkaufbare_menge_korrektur - $verkaufbare_menge, 7) . "\r\n";
} }
$this->LogFile('*** UPDATE '.$lagerartikel[$ij]['nummer'].' '.$lagerartikel[$ij]['name_de'].' Shop: '.$shop.' Lagernd: '.$verkaufbare_menge.' Korrektur: '.round((float) ($verkaufbare_menge_korrektur - $verkaufbare_menge),7).' Pseudolager: '.round((float) $pseudolager,8).' Result: '.gettype($result).' '.$result);
if ($result == 1) {
$cacheQuantity = (int) $verkaufbare_menge_korrektur + (int) $pseudolager;
$this->app->DB->Update(
"UPDATE `artikel` SET `cache_lagerplatzinhaltmenge` = '{$cacheQuantity}'
WHERE `id`= '{$lagerartikel[$ij]['id']}' LIMIT 1"
);
}
} }
$this->app->DB->Update( $this->app->DB->Update(
@@ -26542,6 +26457,9 @@ function ChargenMHDAuslagern($artikel, $menge, $lagerplatztyp, $lpid,$typ,$wert,
$to_name = $this->app->DB->Select("SELECT name FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); $to_name = $this->app->DB->Select("SELECT name FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1");
} }
} }
$to_name = str_replace(",","",$to_name); // , is not allowed in names, because mailsend will interpret it as a list
// wenn emailadresse from email from user name von benutzer sonst firmenname // wenn emailadresse from email from user name von benutzer sonst firmenname
if($drucker==$this->app->User->GetEmail()) if($drucker==$this->app->User->GetEmail())
$from_name = $this->app->User->GetName(); $from_name = $this->app->User->GetName();
@@ -27118,7 +27036,7 @@ function MailSendFinal($from,$from_name,$to,$to_name,$betreff,$text,$files="",$p
$to_name_csv .= $item; $to_name_csv .= $item;
} }
} else if (!empty($to_name)) { } else if (!empty($to_name)) {
foreach (explode(',',str_replace(" ","",$to_name)) as $item) { foreach (explode(',',$to_name) as $item) {
$to_name_array[] = $item; $to_name_array[] = $item;
$to_name_csv .= $item; $to_name_csv .= $item;
} }
@@ -28104,31 +28022,15 @@ function Firmendaten($field,$projekt="")
$modul = ""; $modul = "";
$tmp = array( $tmp = array(
'DHL'=>'DHL','DPD'=>'DPD',
'express_dpd'=>'Express DPD',
'export_dpd'=>'Export DPD',
'gls'=>'GLS',
'keinversand'=>'Kein Versand', 'keinversand'=>'Kein Versand',
'selbstabholer'=>'Selbstabholer', 'selbstabholer'=>'Selbstabholer',
'versandunternehmen'=>'Sonstige',
'spedition'=>'Spedition', 'spedition'=>'Spedition',
'Go'=>'GO!',
'post'=>'Post'
); );
foreach($tmp as $key=>$value) foreach($tmp as $key=>$value)
{ {
if($key == 'DHL'){$modul='intraship';}
if($key == 'DPD'){$modul='dpdapi';}
if($key == 'express_dpd'){$modul='';}
if($key == 'export_dpd'){$modul='';}
if($key == 'gls'){$modul='glsapi';}
if($key == 'keinversand'){$modul='';} if($key == 'keinversand'){$modul='';}
if($key == 'selbstabholer'){$modul='selbstabholer';} if($key == 'selbstabholer'){$modul='selbstabholer';}
if($key == 'versandunternehmen'){$modul='';}
if($key == 'spedition'){$modul='';} if($key == 'spedition'){$modul='';}
if($key == 'Go'){$modul='';}
if($key == 'post'){$modul='post';}
$this->app->DB->Insert("INSERT INTO versandarten (id,type,bezeichnung,aktiv,modul) VALUES ('','$key','$value','1','$modul')"); $this->app->DB->Insert("INSERT INTO versandarten (id,type,bezeichnung,aktiv,modul) VALUES ('','$key','$value','1','$modul')");
} }
@@ -34516,7 +34418,7 @@ function Firmendaten($field,$projekt="")
$this->CopyBelegZwischenpositionen('rechnung',$id,'gutschrift',$newid); $this->CopyBelegZwischenpositionen('rechnung',$id,'gutschrift',$newid);
$this->app->DB->Update("UPDATE gutschrift SET stornorechnung='$stornorechnung', ohne_briefpapier='".$ohnebriefpapier."' WHERE id='$newid,' LIMIT 1"); $this->app->DB->Update("UPDATE gutschrift SET stornorechnung='$stornorechnung', ohne_briefpapier='".$ohnebriefpapier."' WHERE id='$newid,' LIMIT 1");
$this->app->DB->Update("UPDATE rechnung SET schreibschutz='1',status='storniert',zahlungsstatus='bezahlt' WHERE id='$id' LIMIT 1"); $this->app->DB->Update("UPDATE rechnung SET schreibschutz='1',status='storniert' WHERE id='$id' LIMIT 1");
$this->RechnungProtokoll($id, $grund); $this->RechnungProtokoll($id, $grund);
$this->SchnellFreigabe("gutschrift",$newid); $this->SchnellFreigabe("gutschrift",$newid);
return $newid; return $newid;
@@ -35657,7 +35559,7 @@ function Firmendaten($field,$projekt="")
$rechnungid = $this->app->DB->Select("SELECT rechnungid FROM gutschrift WHERE id='$id' LIMIT 1"); $rechnungid = $this->app->DB->Select("SELECT rechnungid FROM gutschrift WHERE id='$id' LIMIT 1");
if($rechnungid > 0 && $this->Firmendaten("mahnwesenmitkontoabgleich")=="1") if($rechnungid > 0 && $this->Firmendaten("mahnwesenmitkontoabgleich")=="1")
{ {
$this->app->DB->Update("UPDATE rechnung SET ist=0, zahlungsstatus='offen' WHERE id='$rechnungid' AND mahnwesenfestsetzen!=1 LIMIT 1"); $this->app->DB->Update("UPDATE rechnung SET zahlungsstatus='offen' WHERE id='$rechnungid' AND mahnwesenfestsetzen!=1 LIMIT 1");
$this->RechnungNeuberechnen($rechnungid); $this->RechnungNeuberechnen($rechnungid);
} }
} }
@@ -35835,6 +35737,240 @@ function Firmendaten($field,$projekt="")
} }
} }
/*
* Retrieve the associated documents regarding payments
* Gutschrift -> Rechnung -> Auftrag OR Verbindlichkeit
* Results array of ids, types, belegnr
*/
public function GetZahlungenAssociatedDocuments(int $id, string $type, string $lastlevel = 'auftrag') : array {
$assocs = array(
array(
'type' => 'auftrag',
'below' => 'rechnung',
),
array(
'above' => 'auftrag',
'type' => 'rechnung',
'below' => 'gutschrift'
),
array(
'above' => 'rechnung',
'type' => 'gutschrift'
),
array(
'type' => 'verbindlichkeit'
)
);
if ($id <= 0) {
throw new exception('no id provided');
}
if (!in_array($type, array('rechnung','gutschrift','auftrag','verbindlichkeit'))) {
throw new exception('invalid type '.$type);
}
$id = $this->app->Secure->GetGET('id');
// Go to highest level
$above = $assocs[array_search($type,array_column($assocs,'type'))]['above'];
while ($above) {
if ($type == $lastlevel) {
break;
}
$sql = "SELECT ".$above."id as id FROM ".$type." WHERE id = ".$id;
$above_id = $this->app->DB->SelectArr($sql)[0];
if (!empty($above)) {
$type = $above;
$id = $above_id['id'];
}
$above = $assocs[array_search($type,array_column($assocs,'type'))]['above'];
}
// Cascade down and retrieve all documents
$result_documents = array();
$ids = array($id);
$ref = 'id';
do {
$sql = "SELECT id, '".$type."' AS type, belegnr FROM ".$type." WHERE ".$ref." IN (".implode(",",$ids).")";
$result = $this->app->DB->SelectArr($sql);
if (!empty($result)) {
$result_documents = array_merge($result_documents, $result);
$ids = array_column($result,'id');
$ref = $type."id";
$type = $assocs[array_search($type,array_column($assocs,'type'))]['below'];
} else {
break;
}
} while ($type);
return($result_documents);
}
/*
* Calculate the payments of a document (rechnung, gutschrift, auftrag, verbindlichkeit)
* Results array of payments (datum, doc_type, doc_id, doc_inof, betrag, waehrung)
* Gutschrift -> Rechnungid, Rechnung -> Auftragid
*/
public function GetZahlungen(int $id, string $type, string $cascadelevel = '') : array {
if ($cascadelevel != '') {
$documents = $this->GetZahlungenAssociatedDocuments($id, $type, $cascadelevel);
} else {
$documents = array(array('id' => $id, 'type' => $type));
}
if (empty($documents)) {
return(array());
}
$ids = array();
foreach ($documents as $document) {
$ids[] = $document['type'].$document['id'];
}
$sql = "
SELECT
typ,
id,
".$this->app->erp->FormatDate('datum')." as datum,
doc_typ,
doc_id,
doc_info,
".$this->app->erp->FormatMenge('betrag',2)." as betrag,
waehrung
FROM
fibu_buchungen_alle
WHERE
CONCAT(typ,id) IN ('".implode("','",$ids)."')
ORDER BY
(SELECT datum) ASC
";
$result = $this->app->DB->SelectArr($sql);
if (empty($result)) {
return(array());
}
return($result);
}
/*
* Calculate the payment saldo information of a document
* Auftrag: gesamtsumme, rechnung: soll, gutschrift: soll verbindlichkeit: betrag
* returns array(array(betrag, waehrung)) one line per waehrung
*/
public function GetSaldenDokument(int $id, string $type, string $cascadelevel = '') : array {
if ($cascadelevel != '') {
$documents = $this->GetZahlungenAssociatedDocuments($id, $type, $cascadelevel);
} else {
$documents = array(array('id' => $id, 'type' => $type));
}
if (empty($documents)) {
return(array());
}
$ids = array();
foreach ($documents as $document) {
$ids[] = $document['type'].$document['id'];
}
$sql = "
SELECT
".$this->app->erp->FormatMenge('SUM(betrag)',2)." as betrag,
waehrung
FROM
fibu_buchungen_alle
WHERE
CONCAT(typ,id) IN ('".implode("','",$ids)."')
GROUP BY
waehrung";
$result = $this->app->DB->SelectArr($sql);
if (!empty($result)) {
return($result);
}
return(array());
}
/*
* Calculate the payment amount of a document
* Auftrag: gesamtsumme, rechnung: soll, gutschrift: soll verbindlichkeit: betrag
* returns array(betrag, waehrung) or empty array if multiple
*/
public function GetSaldoDokument(int $id, string $type, string $buchungsart = '', string $datum_bis = '') : array {
$sql = "
SELECT
SUM(betrag) as betrag,
waehrung
FROM
fibu_buchungen_alle
WHERE
typ = '".$type."'
AND
id = ".$id."
AND
(buchungsart = '".$buchungsart."' OR '".$buchungsart."' = '')
AND
(datum <= '".$datum_bis."' OR '".$datum_bis."' = '')
GROUP BY
waehrung";
$result = $this->app->DB->SelectArr($sql);
if (!empty($result)) {
if (count($result) == 1) {
return($result[0]);
}
}
return(array());
}
/*
* Create a fibu buchung
* using module fibu_buchungen
*/
public function fibu_buchungen_buchen(string $von_typ, int $von_id, string $nach_typ, int $nach_id, $betrag, string $waehrung, $datum, string $internebemerkung) {
$fibu_buchungen = $this->app->loadModule('fibu_buchungen', false);
if($fibu_buchungen !== null && method_exists($fibu_buchungen, 'fibu_buchungen_buchen')) {
return $fibu_buchungen->fibu_buchungen_buchen($von_typ, $von_id, $nach_typ, $nach_id, $betrag, $waehrung, $datum, $internebemerkung);
}
}
/*
* Refresh fibu buchung_alle tables
* using module fibu_buchungen
*/
public function fibu_rebuild_tables() {
$fibu_buchungen = $this->app->loadModule('fibu_buchungen', false);
if($fibu_buchungen !== null && method_exists($fibu_buchungen, 'fibu_buchungen_buchen')) {
return $fibu_buchungen->fibu_rebuild_tables();
}
}
/*
* Recalculate payment status and skonto
* using module rechnung
*/
public function rechnung_zahlstatus_berechnen() {
$rechnung = $this->app->loadModule('rechnung', false);
if($rechnung !== null && method_exists($rechnung, 'rechnung_zahlstatus_berechnen')) {
return $rechnung->rechnung_zahlstatus_berechnen();
}
}
public function ANABREGSNeuberechnen($id,$art,$force=false) public function ANABREGSNeuberechnen($id,$art,$force=false)
{ {
if($id <= 0 || empty($art)) if($id <= 0 || empty($art))
+4 -3
View File
@@ -49,6 +49,7 @@ class image {
$manipulator = new ImageManipulator($str); $manipulator = new ImageManipulator($str);
$type = mime_content_type($path); $type = mime_content_type($path);
$manipulator->resample($newwidth, $newheight, true, $upscale); $manipulator->resample($newwidth, $newheight, true, $upscale);
/* /*
@@ -200,7 +201,7 @@ class ImageManipulator
public function resample($width, $height, $constrainProportions = true, $upscale = false, $keepformat = false) public function resample($width, $height, $constrainProportions = true, $upscale = false, $keepformat = false)
{ {
if (!is_resource($this->image)) { if (!is_resource($this->image)) {
throw new RuntimeException('No image set'); // throw new RuntimeException('No image set');
} }
if($keepformat) if($keepformat)
{ {
@@ -340,9 +341,9 @@ class ImageManipulator
*/ */
protected function _replace($res) protected function _replace($res)
{ {
if (!is_resource($res)) { /* if (!is_resource($res)) {
throw new UnexpectedValueException('Invalid resource'); throw new UnexpectedValueException('Invalid resource');
} }*/
if (is_resource($this->image)) { if (is_resource($this->image)) {
imagedestroy($this->image); imagedestroy($this->image);
} }
+8 -5
View File
@@ -153,14 +153,14 @@ abstract class Versanddienstleister
lp.zollwaehrung lp.zollwaehrung
FROM lieferschein_position lp FROM lieferschein_position lp
JOIN artikel a on lp.artikel = a.id JOIN artikel a on lp.artikel = a.id
LEFT JOIN auftrag_position ap on lp.auftrag_position_id = ap.id LEFT OUTER JOIN auftrag_position ap on lp.auftrag_position_id = ap.id
LEFT JOIN rechnung_position rp on ap.id = rp.auftrag_position_id LEFT OUTER JOIN rechnung_position rp on ap.id = rp.auftrag_position_id
LEFT JOIN rechnung r on rp.rechnung = r.id LEFT OUTER JOIN rechnung r on rp.rechnung = r.id
WHERE lp.lieferschein = $lieferscheinId WHERE lp.lieferschein = $lieferscheinId
AND a.lagerartikel = 1 AND a.lagerartikel = 1
AND r.status != 'storniert' AND r.status != 'storniert'
ORDER BY lp.sort"; ORDER BY lp.sort";
$ret['positions'] = $this->app->DB->SelectArr($sql); $ret['positions'] = $this->app->DB->SelectArr($sql) ?? [];
if ($sid === "lieferschein") { if ($sid === "lieferschein") {
$standardkg = $this->app->erp->VersandartMindestgewicht($lieferscheinId); $standardkg = $this->app->erp->VersandartMindestgewicht($lieferscheinId);
@@ -409,8 +409,11 @@ abstract class Versanddienstleister
$products = array_combine(array_column($products, 'Id'), $products); $products = array_combine(array_column($products, 'Id'), $products);
$address['product'] = $products[0]->Id ?? ''; $address['product'] = $products[0]->Id ?? '';
$countries = $this->app->DB->SelectArr("SELECT iso, bezeichnung_de name, eu FROM laender ORDER BY bezeichnung_de");
$countries = array_combine(array_column($countries, 'iso'), $countries);
$json['form'] = $address; $json['form'] = $address;
$json['countries'] = $this->app->erp->GetSelectLaenderliste(); $json['countries'] = $countries;
$json['products'] = $products; $json['products'] = $products;
$json['customs_shipment_types'] = [ $json['customs_shipment_types'] = [
CustomsInfo::CUSTOMS_TYPE_GIFT => 'Geschenk', CustomsInfo::CUSTOMS_TYPE_GIFT => 'Geschenk',
+15 -4
View File
@@ -1800,9 +1800,16 @@ class Briefpapier extends SuperFPDF {
} }
private function getStyleElement($key){ private function getStyleElement($key){
if(isset($this->styleData[$key]) && !empty($this->styleData[$key])) return $this->styleData[$key]; $result = null;
if(isset($this->styleData[$key]) && !empty($this->styleData[$key])) {
return $this->app->erp->Firmendaten($key); $result = $this->styleData[$key];
} else {
$result = $this->app->erp->Firmendaten($key);
}
if (empty($result)) {
$result = 0;
}
return($result);
} }
public function renderDocument() { public function renderDocument() {
@@ -4023,7 +4030,11 @@ class Briefpapier extends SuperFPDF {
} }
$this->SetX($x+$abstand_links); $this->SetX($x+$abstand_links);
$this->Cell_typed($descWidth,4,$this->WriteHTML($html));
$text = $this->WriteHTML($html);
$text = empty($text)?"":$text;
$this->Cell_typed($descWidth,4,);
$this->SetX($x+$abstand_links+$descWidth); $this->SetX($x+$abstand_links+$descWidth);
//$this->SetX($x); //$this->SetX($x);
+21 -15
View File
@@ -43,9 +43,9 @@ class RechnungPDF extends BriefpapierCustom {
parent::__construct($this->app,$projekt,$styleData); parent::__construct($this->app,$projekt,$styleData);
} }
public function GetRechnung($id,$als="",$doppeltmp=0, $_datum = null) public function GetRechnung($id, $titel_abw="",$doppeltmp=0, $_datum = null, $text_abw = '')
{ {
$this->parameter = $als;
if($this->app->erp->Firmendaten("steuerspalteausblenden")=="1") if($this->app->erp->Firmendaten("steuerspalteausblenden")=="1")
{ {
// pruefe ob es mehr als ein steuersatz gibt // wenn ja dann darf man sie nicht ausblenden // pruefe ob es mehr als ein steuersatz gibt // wenn ja dann darf man sie nicht ausblenden
@@ -124,10 +124,10 @@ class RechnungPDF extends BriefpapierCustom {
$lieferschein = $this->app->DB->Select("SELECT belegnr FROM lieferschein WHERE id='$lieferscheinid' LIMIT 1"); $lieferschein = $this->app->DB->Select("SELECT belegnr FROM lieferschein WHERE id='$lieferscheinid' LIMIT 1");
if(empty($als) || $als === 'doppel') { /* if(empty($als) || $als === 'doppel') {
$rechnungsnummeranzeigen = false; $rechnungsnummeranzeigen = false;
} }
elseif(!empty($belegnr)){ else*/if(!empty($belegnr)){
$rechnungsnummeranzeigen = true; $rechnungsnummeranzeigen = true;
} }
$projektabkuerzung = $this->app->DB->Select(sprintf('SELECT abkuerzung FROM projekt WHERE id = %d', $projekt)); $projektabkuerzung = $this->app->DB->Select(sprintf('SELECT abkuerzung FROM projekt WHERE id = %d', $projekt));
@@ -172,7 +172,7 @@ class RechnungPDF extends BriefpapierCustom {
$zahlungsweisetext = $this->app->erp->Zahlungsweisetext("rechnung",$id); $zahlungsweisetext = $this->app->erp->Zahlungsweisetext("rechnung",$id);
if($doppel==1) $als = "doppel"; // if($doppel==1) $als = "doppel";
if($belegnr=="" || $belegnr=="0") $belegnr = "- ".$this->app->erp->Beschriftung("dokument_entwurf"); if($belegnr=="" || $belegnr=="0") $belegnr = "- ".$this->app->erp->Beschriftung("dokument_entwurf");
else { else {
@@ -181,7 +181,7 @@ class RechnungPDF extends BriefpapierCustom {
} }
$posanzeigen = true; $posanzeigen = true;
if($als=="zahlungserinnerung") /* if($als=="zahlungserinnerung")
{ {
$this->doctypeOrig=$this->app->erp->Beschriftung("dokument_zahlungserinnerung")." ".(is_null($_datum)?$mahnwesen_datum:$_datum); $this->doctypeOrig=$this->app->erp->Beschriftung("dokument_zahlungserinnerung")." ".(is_null($_datum)?$mahnwesen_datum:$_datum);
if($this->app->erp->GetKonfiguration("mahnwesen_ze_pos") === '0')$posanzeigen = false; if($this->app->erp->GetKonfiguration("mahnwesen_ze_pos") === '0')$posanzeigen = false;
@@ -207,14 +207,12 @@ class RechnungPDF extends BriefpapierCustom {
if($this->app->erp->GetKonfiguration("mahnwesen_inkasso_pos") === '0')$posanzeigen = false; if($this->app->erp->GetKonfiguration("mahnwesen_inkasso_pos") === '0')$posanzeigen = false;
} }
else else
{ {*/
if($rechnungersatz) if($rechnungersatz)
$this->doctypeOrig=($this->app->erp->Beschriftung("bezeichnungrechnungersatz")?$this->app->erp->Beschriftung("bezeichnungrechnungersatz"):$this->app->erp->Beschriftung("dokument_rechnung"))." $belegnr"; $this->doctypeOrig=($this->app->erp->Beschriftung("bezeichnungrechnungersatz")?$this->app->erp->Beschriftung("bezeichnungrechnungersatz"):$this->app->erp->Beschriftung("dokument_rechnung"))." $belegnr";
else else
$this->doctypeOrig=$this->app->erp->Beschriftung("dokument_rechnung")." $belegnr"; $this->doctypeOrig=$this->app->erp->Beschriftung("dokument_rechnung")." $belegnr";
} // }
$this->zusatzfooter = " (RE$belegnr)"; $this->zusatzfooter = " (RE$belegnr)";
@@ -407,12 +405,12 @@ class RechnungPDF extends BriefpapierCustom {
if($als!="" && $als!="doppel") /* if($als!="" && $als!="doppel")
{ {
$body = $this->app->erp->MahnwesenBody($id,$als,$_datum); $body = $this->app->erp->MahnwesenBody($id,$als,$_datum);
$footer =$this->app->erp->ParseUserVars("rechnung",$id, $this->app->erp->Beschriftung("rechnung_footer")); $footer =$this->app->erp->ParseUserVars("rechnung",$id, $this->app->erp->Beschriftung("rechnung_footer"));
} }
else { else {*/
$body = $this->app->erp->Beschriftung("rechnung_header"); $body = $this->app->erp->Beschriftung("rechnung_header");
if($bodyzusatz!="") $body=$body."\r\n".$bodyzusatz; if($bodyzusatz!="") $body=$body."\r\n".$bodyzusatz;
$body = $this->app->erp->ParseUserVars("rechnung",$id,$body); $body = $this->app->erp->ParseUserVars("rechnung",$id,$body);
@@ -442,6 +440,14 @@ class RechnungPDF extends BriefpapierCustom {
$footer = $versandinfo."$freitext"."\r\n".$this->app->erp->ParseUserVars("rechnung",$id,$this->app->erp->Beschriftung("rechnung_footer"). $footer = $versandinfo."$freitext"."\r\n".$this->app->erp->ParseUserVars("rechnung",$id,$this->app->erp->Beschriftung("rechnung_footer").
"\r\n$steuer\r\n$zahlungsweisetext").$systemfreitext; "\r\n$steuer\r\n$zahlungsweisetext").$systemfreitext;
} }
// }
if ($titel_abw != '') {
$this->doctypeOrig = $titel_abw;
}
if ($text_abw != '') {
$body = $text_abw;
} }
$this->setTextDetails(array( $this->setTextDetails(array(
@@ -686,10 +692,10 @@ class RechnungPDF extends BriefpapierCustom {
$tmp_name = str_replace(' ','',trim($this->recipient['enterprise'])); $tmp_name = str_replace(' ','',trim($this->recipient['enterprise']));
$tmp_name = str_replace('.','',$tmp_name); $tmp_name = str_replace('.','',$tmp_name);
if($als=="" || $als=="doppel") if($titel_abw != "")
$this->filename = $datum2."_RE".$belegnr.".pdf"; $this->filename = $datum2."_RE".$belegnr."_INFO.pdf";
else else
$this->filename = $datum2."_MA".$belegnr.".pdf"; $this->filename = $datum2."_RE".$belegnr.".pdf";
$this->setBarcode($belegnr); $this->setBarcode($belegnr);
} }
File diff suppressed because it is too large Load Diff
+47 -23
View File
@@ -73,7 +73,7 @@ SPDX-License-Identifier: LicenseRef-EGPL-3.1
<td>{|Land|}:</td> <td>{|Land|}:</td>
<td> <td>
<select v-model="form.country" required> <select v-model="form.country" required>
<option v-for="(value, key) in countries" :value="key">{{value}}</option> <option v-for="(value, key) in countries" :value="key">{{value.name}}</option>
</select> </select>
</td> </td>
</tr> </tr>
@@ -156,7 +156,7 @@ SPDX-License-Identifier: LicenseRef-EGPL-3.1
<td>{|Produkt|}:</td> <td>{|Produkt|}:</td>
<td> <td>
<select v-model="form.product" required> <select v-model="form.product" required>
<option v-for="prod in products" :value="prod.Id">{{prod.Name}}</option> <option v-for="prod in products" :value="prod.Id" v-if="productAvailable(prod)">{{prod.Name}}</option>
</select> </select>
</td> </td>
</tr> </tr>
@@ -170,29 +170,33 @@ SPDX-License-Identifier: LicenseRef-EGPL-3.1
<div class="col-md-12"> <div class="col-md-12">
<h2>{|Bestellung|}</h2> <h2>{|Bestellung|}</h2>
<table> <table>
<tr> <tbody>
<td>{|Bestellnummer|}:</td> <tr>
<td><input type="text" size="36" v-model="form.order_number"></td> <td>{|Bestellnummer|}:</td>
</tr> <td><input type="text" size="36" v-model="form.order_number"></td>
<tr> </tr>
<td>{|Rechnungsnummer|}:</td> <tr>
<td><input type="text" size="36" v-model="form.invoice_number"></td> <td>{|Versicherungssumme|}:</td>
</tr> <td><input type="text" size="10" v-model="form.total_insured_value"/></td>
<tr> </tr>
<td>{|Sendungsart|}:</td> </tbody>
<td> <tbody v-if="customsRequired()">
<select v-model="form.shipment_type"> <tr>
<option v-for="(value, key) in customs_shipment_types" :value="key">{{value}}</option> <td>{|Rechnungsnummer|}:</td>
</select> <td><input type="text" size="36" v-model="form.invoice_number" required="required"></td>
</td> </tr>
</tr> <tr>
<tr> <td>{|Sendungsart|}:</td>
<td>{|Versicherungssumme|}:</td> <td>
<td><input type="text" size="10" v-model="form.total_insured_value"/></td> <select v-model="form.shipment_type">
</tr> <option v-for="(value, key) in customs_shipment_types" :value="key">{{value}}</option>
</select>
</td>
</tr>
</tbody>
</table> </table>
</div> </div>
<div class="col-md-12"> <div class="col-md-12" v-if="customsRequired()">
<table> <table>
<tr> <tr>
<th>{|Bezeichnung|}</th> <th>{|Bezeichnung|}</th>
@@ -269,10 +273,30 @@ SPDX-License-Identifier: LicenseRef-EGPL-3.1
deletePosition: function (index) { deletePosition: function (index) {
this.form.positions.splice(index, 1); this.form.positions.splice(index, 1);
}, },
productAvailable: function (product) {
if (product == undefined)
return false;
if (product.WeightMin > this.form.weight || product.WeightMax < this.form.weight)
return false;
return true;
},
serviceAvailable: function (service) { serviceAvailable: function (service) {
if (!this.products.hasOwnProperty(this.form.product)) if (!this.products.hasOwnProperty(this.form.product))
return false; return false;
return this.products[this.form.product].AvailableServices.indexOf(service) >= 0; return this.products[this.form.product].AvailableServices.indexOf(service) >= 0;
},
customsRequired: function () {
return this.countries[this.form.country].eu == '0';
}
},
beforeUpdate: function () {
if (!this.productAvailable(this.products[this.form.product])) {
for (prod in this.products) {
if (!this.productAvailable(this.products[prod]))
continue;
this.form.product = prod;
break;
}
} }
} }
}) })
-691
View File
@@ -1,691 +0,0 @@
<?php
use Xentral\Components\Database\Database;
use Xentral\Components\Http\JsonResponse;
use Xentral\Modules\Dhl\Api\DhlApi;
use Xentral\Modules\Dhl\Content\PackageContent;
use Xentral\Modules\Dhl\Exception\DhlBaseException;
use Xentral\Modules\Dhl\Exception\InvalidCredentialsException;
use Xentral\Modules\Dhl\Exception\InvalidRequestDataException;
use Xentral\Modules\Dhl\Exception\UnknownProductException;
use Xentral\Modules\Dhl\Factory\DhlApiFactory;
use Xentral\Modules\Dhl\Request\CreateInterationalShipmentRequest;
use Xentral\Modules\Dhl\Request\CreateNationalShipmentRequest;
require_once dirname(__DIR__) . '/class.versanddienstleister.php';
class Versandart_dhl extends Versanddienstleister
{
private $einstellungen;
private $info;
private $credentials;
public $paketmarke_drucker;
public $export_drucker;
public $errors;
public $name;
protected $voucherId;
/**
* Versandart_internetmarke constructor.
*
* @param ApplicationCore $app
* @param int $id
*/
function __construct($app, $id)
{
$this->id = $id;
$this->app = $app;
$einstellungenArr = $this->app->DB->SelectRow("SELECT einstellungen_json,paketmarke_drucker,export_drucker FROM versandarten WHERE id = '$id' LIMIT 1");
$einstellungen_json = $einstellungenArr['einstellungen_json'];
$this->paketmarke_drucker = $einstellungenArr['paketmarke_drucker'];
$this->export_drucker = $einstellungenArr['export_drucker'];
$this->name = 'DHL 3.0';
if($einstellungen_json){
$this->einstellungen = json_decode($einstellungen_json, true);
}else{
$this->einstellungen = [];
}
$this->errors = [];
}
function ShowUserdata()
{
if(isset($this->app->Conf->WFuserdata)){
return 'Userdata-Ordner: ' . $this->app->Conf->WFuserdata;
}
}
public function Einstellungen($target = 'return')
{
if($this->app->Secure->GetPOST('testen')){
$parameter1 = $this->einstellungen['pfad'];
if($parameter1){
if(is_dir($parameter1)){
if(substr($parameter1, -1) !== '/'){
$parameter1 .= '/';
}
if(file_put_contents($parameter1 . 'wawision_test.txt', 'TEST')){
$this->app->Tpl->Add('MESSAGE',
'<div class="info">Datei ' . $parameter1 . 'wawision_test.txt' . ' wurde erstellt!</div>');
}else{
$this->app->Tpl->Add('MESSAGE', '<div class="error">Datei konnte nicht angelegt werden!</div>');
}
}else{
$this->app->Tpl->Add('MESSAGE',
'<div class="error">Speicherort existiert nicht oder ist nicht erreichbar!</div>');
}
}else{
$this->app->Tpl->Add('MESSAGE', '<div class="error">Bitte einen Speicherort angeben!</div>');
}
}
parent::Einstellungen($target);
}
//TODO ....
/*function Trackinglink($tracking, &$notsend, &$link, &$rawlink)
{
$notsend = 0;
//$rawlink = 'https://tracking.dpd.de/parcelstatus/?locale=de_DE&query='.$tracking;
$rawlink = ' https://www.gls-group.eu/276-I-PORTAL-WEB/content/GLS/DE03/DE/5004.htm?txtRefNo='.$tracking.'&txtAction=71000';
$link = 'GLS Versand: '.$tracking.' ('.$rawlink.')';
}*/
public function GetBezeichnung()
{
return 'DHL 3.0';
}
/**
* @return array[]
*/
public function getCreateForm()
{
return [
[
'id' => 0,
'name' => 'usernameGroup',
'inputs' => [
[
'label' => 'Benutzername',
'type' => 'text',
'name' => 'dhl_username',
'validation' => true,
],
],
],
[
'id' => 1,
'name' => 'passwordGroup',
'inputs' => [
[
'label' => 'Passwort',
'type' => 'text',
'name' => 'dhl_password',
'validation' => true,
]
],
],
[
'id' => 2,
'name' => 'accountNumberGroup',
'inputs' => [
[
'label' => 'Abrechnungsnummer',
'type' => 'text',
'name' => 'dhl_accountnumber',
'validation' => true,
]
],
]
];
}
/**
* @param array $postData
*
* @return array
*/
public function updatePostDataForAssistent($postData): array
{
$name = $this->app->erp->Firmendaten('name');
$street = $this->app->erp->Firmendaten('strasse');
$zip = $this->app->erp->Firmendaten('plz');
$city = $this->app->erp->Firmendaten('ort');
$country = $this->app->erp->Firmendaten('land');
$houseNo = '';
$streetParts = explode(' ', $street);
$partsCount = count($streetParts);
if($partsCount >= 2){
$street = implode(' ', array_slice($streetParts, 0, $partsCount - 1));
$houseNo = $streetParts[$partsCount - 1];
}
$postData['dhl_origin_name'] = $name;
$postData['dhl_origin_street'] = $street;
$postData['dhl_origin_houseno'] = $houseNo;
$postData['dhl_origin_zip'] = $zip;
$postData['dhl_origin_city'] = $city;
$postData['dhl_origin_country'] = $country;
return $postData;
}
/**
* @return JsonResponse|null
*/
public function AuthByAssistent()
{
$step = (int)$this->app->Secure->GetPOST('step');
if($step == 0){
$username = $this->app->Secure->GetPOST('dhl_username');
$password = $this->app->Secure->GetPOST('dhl_password');
$accountnumber = $this->app->Secure->GetPOST('dhl_accountnumber');
$error = null;
if(empty($username)){
$error = 'Bitte Nutzernamen eingeben';
}else if(empty($password)){
$error = 'Bitte Passwort eingeben';
}else if(empty($accountnumber)){
$error = 'Bitte Abrechnungsnummer eingeben';
}
if($error != null) {
return new JsonResponse(
['error' => $error],
JsonResponse::HTTP_BAD_REQUEST
);
}
try{
$this->testCredentials($username, $password, $accountnumber);
}catch (DhlBaseException $e){
return new JsonResponse(
['error' => $e->getMessage()],
JsonResponse::HTTP_BAD_REQUEST
);
}
}
return null;
}
/**
* @return array
*/
public function getStructureDataForClickByClickSave(): array
{
return $this->updatePostDataForAssistent([]);
}
function EinstellungenStruktur()
{
if(!empty($this->einstellungen['dhl_username']) && !empty($this->einstellungen['dhl_password'])){
try{
$this->testCredentials($this->einstellungen['dhl_username'], $this->einstellungen['dhl_password'], $this->einstellungen['dhl_accountnumber']);
$this->app->Tpl->Set('MESSAGE', '<div class="info">Zugangsdaten erfolgreich &uuml;berpr&uuml;ft</div>');
}catch (DhlBaseException $e){
$this->app->Tpl->Set('MESSAGE', '<div class="error">' . $e->getMessage() . '</div>');
}
}
return [
'dhl_username' => ['typ' => 'text', 'bezeichnung' => 'Benutzername:'],
'dhl_password' => ['typ' => 'text', 'bezeichnung' => 'Passwort:'],
'dhl_accountnumber' => ['typ' => 'text', 'bezeichnung' => 'Abrechnungsnummer:'],
'dhl_origin_name' => ['typ' => 'text', 'bezeichnung' => 'Versender Name:'],
'dhl_origin_street' => ['typ' => 'text', 'bezeichnung' => 'Versender Strasse:'],
'dhl_origin_houseno' => ['typ' => 'text', 'bezeichnung' => 'Versender Hausnummer:'],
'dhl_origin_city' => ['typ' => 'text', 'bezeichnung' => 'Versender Ort:'],
'dhl_origin_zip' => ['typ' => 'text', 'bezeichnung' => 'Versender PLZ:'],
'dhl_origin_country' => ['typ' => 'text', 'bezeichnung' => 'Versender Land (2-stellig):'],
'dhl_origin_email' => ['typ' => 'text', 'bezeichnung' => 'Versender Email:'],
'dhl_height' => ['typ' => 'text', 'bezeichnung' => 'Standardh&ouml;he'],
'dhl_width' => ['typ' => 'text', 'bezeichnung' => 'Standardbreite'],
'dhl_length' => ['typ' => 'text', 'bezeichnung' => 'Standardl&auml;nge'],
'dhl_export_product_type' => [
'typ' => 'select',
'bezeichnung' => 'Export Producttyp',
'optionen' => [
'PRESENT' => 'Geschenke',
'COMMERCIAL_SAMPLE' => 'Kommerzielle Probe',
'DOCUMENT' => 'Dokumente',
'RETURN_OF_GOODS' => 'Rücksendungen',
'OTHER' => 'Andere',
]
],
'dhl_export_product_type_description' => [
'typ' => 'text',
'bezeichnung' => 'Beschreibung im Falle von "Andere"'
],
'dhl_product' => [
'typ' => 'select',
'bezeichnung' => 'Produkt:',
'optionen' => [
'V01PAK' => 'Paket national',
'V53WPAK' => 'Paket international'
],
],
'dhl_coding' => ['typ' => 'checkbox', 'bezeichnung' => 'Leitcodierung aktivieren'],
'autotracking' => ['typ' => 'checkbox', 'bezeichnung' => 'Tracking übernehmen:'],
];
}
public function testCredentials($username, $password, $accountNumber){
/** @var DhlApiFactory $dhlApiFactory */
$dhlApiFactory = $this->app->Container->get('DhlApiFactory');
/** @var DhlApi $dhlApi */
$dhlApi = $dhlApiFactory->createProductionInstance(
$username,
$password,
$accountNumber,
'',
'',
'',
'',
'',
'',
''
);
try {
$dhlApi->validateShipment(new CreateNationalShipmentRequest(
date("Y-m-d"),
1.0,
10,
20,
30,
"Max muster",
'',
'',
'Teststr. 1',
'11',
'86153',
'Augsburg',
'DE',
'max.muster@xentral.com',
false
));
}catch (InvalidRequestDataException $e){
// do nothing, test data is invalid
}
}
public function PaketmarkeDrucken($id, $sid)
{
$adressdaten = $this->GetAdressdaten($id, $sid);
$ret = $this->Paketmarke($sid, $id, '', false, $adressdaten);
if($sid === 'lieferschein'){
$deliveryNoteArr = $this->app->DB->SelectRow("SELECT adresse,projekt,versandart,auftragid FROM lieferschein WHERE id = '$id' LIMIT 1");
$adresse = $deliveryNoteArr['adresse'];
$projekt = $deliveryNoteArr['projekt'];
$versandart = $deliveryNoteArr['versandart'];
$adressvalidation = 2;
if($ret){
$adressvalidation = 1;
}
$tracking = '';
if(isset($adressdaten['tracking'])){
$tracking = $adressdaten['tracking'];
}
if(!isset($adressdaten['versandid'])){
$adressdaten['versandid'] = $this->app->DB->Select("SELECT id FROM versand WHERE abgeschlossen = 0 AND tracking = '' AND lieferschein = '$id' LIMIT 1");
}
if(!isset($adressdaten['versandid'])){
$this->app->DB->Insert("INSERT INTO versand (versandunternehmen, tracking,
versendet_am,abgeschlossen,lieferschein,freigegeben,firma,adresse,projekt,paketmarkegedruckt,adressvalidation)
VALUES ($versandart','$tracking',NOW(),1,'$id',1,'1','$adresse','$projekt',1,'$adressvalidation') ");
$adressdaten['versandid'] = $this->app->DB->GetInsertID();
}elseif($tracking){
$this->app->DB->Update("UPDATE versand SET freigegeben = 1, abgeschlossen = 1, tracking =1, paketmarkegedruckt = 1, tracking= '$tracking',adressvalidation = '$adressvalidation', versendet_am = now() WHERE id = '" . $adressdaten['versandid'] . "' LIMIT 1");
$this->app->DB->Update("UPDATE versand SET versandunternehmen = versandart WHERE id = '" . $adressdaten['versandid'] . "' AND versandunternehmen = '' LIMIT 1");
$this->app->DB->Update("UPDATE versand SET versandunternehmen = '$versandart' WHERE id = '" . $adressdaten['versandid'] . "' AND versandunternehmen = '' LIMIT 1");
}
$auftragid = $deliveryNoteArr['auftragid'];
if($auftragid){
$this->app->DB->Update("UPDATE auftrag SET schreibschutz = 1, status = 'abgeschlossen' WHERE id = '$auftragid' AND status = 'freigegeben' LIMIT 1");
}
if($adressvalidation == 1){
$this->app->erp->LieferscheinProtokoll($id, 'Paketmarke automatisch gedruckt');
if($adressdaten['versandid']){
return $adressdaten['versandid'];
}
}elseif($adressvalidation == 2){
$this->app->erp->LieferscheinProtokoll($id, 'automatisches Paketmarke Drucken fehlgeschlagen');
}
}
return $ret;
}
public function Paketmarke($doctyp, $docid, $target = '', $error = false, &$adressdaten = null)
{
$id = $docid;
$sid = $doctyp;
if($adressdaten === null){
$drucken = $this->app->Secure->GetPOST('drucken');
$anders = $this->app->Secure->GetPOST('anders');
$tracking_again = $this->app->Secure->GetGET('tracking_again');
$module = $this->app->Secure->GetPOST('module');
if(empty($module)){
$module = $doctyp;
}
}else{
$drucken = 1;
$anders = '';
$tracking_again = '';
$module = $doctyp;
}
/** @var DhlApiFactory $dhlApiFactory */
$dhlApiFactory = $this->app->Container->get('DhlApiFactory');
/** @var DhlApi $dhlApi */
$dhlApi = $dhlApiFactory->createProductionInstance(
$this->einstellungen['dhl_username'],
$this->einstellungen['dhl_password'],
$this->einstellungen['dhl_accountnumber'],
$this->einstellungen['dhl_origin_name'],
$this->einstellungen['dhl_origin_street'],
$this->einstellungen['dhl_origin_houseno'],
$this->einstellungen['dhl_origin_zip'],
$this->einstellungen['dhl_origin_city'],
$this->einstellungen['dhl_origin_country'],
$this->einstellungen['dhl_origin_email']
);
if($drucken != '' || $tracking_again == '1'){
if($tracking_again != "1"){
$versandId = 0;
if($module === 'retoure'){
$Query = $this->app->DB->SelectRow("SELECT * FROM retoure where id='$id'");
}elseif($module === 'versand'){
$versandId = $id;
$lieferschein = $this->app->DB->Select("SELECT lieferschein WHERE id = '$id' LIMIT 1");
$Query = $this->app->DB->SelectRow("SELECT * FROM lieferschein where id='$lieferschein'");
}else{
$Query = $this->app->DB->SelectRow("SELECT * FROM lieferschein where id='$id'");
}
$projekt = $Query['projekt'];
$Adresse = $this->app->DB->SelectRow("SELECT * FROM adresse WHERE id='" . $Query['adresse'] . "'");
$product = '';
$Country = $Query['land'];
if($adressdaten === null){
$versandmit = $this->app->Secure->GetPOST("versandmit");
$trackingsubmit = $this->app->Secure->GetPOST("trackingsubmit");
$versandmitbutton = $this->app->Secure->GetPOST("versandmitbutton");
$tracking = $this->app->Secure->GetPOST("tracking");
$trackingsubmitcancel = $this->app->Secure->GetPOST("trackingsubmitcancel");
$retourenlabel = $this->app->Secure->GetPOST("retourenlabel");
//$Weight = $this->app->Secure->GetPOST("kg1");
$Name = $this->app->Secure->GetPOST("name");
$Name2 = $this->app->Secure->GetPOST("name2");
$Name3 = $this->app->Secure->GetPOST("name3");
$Street = $this->app->Secure->GetPOST("strasse");
$HouseNo = $this->app->Secure->GetPOST("hausnummer");
$ZipCode = $this->app->Secure->GetPOST("plz");
$City = $this->app->Secure->GetPOST("ort");
$Mail = $this->app->Secure->GetPOST("email");
$Phone = $this->app->Secure->GetPOST("phone");
$Country = $this->app->Secure->GetPOST("land");
$Weight = $this->app->Secure->GetPOST('kg1');
$height = $this->app->Secure->GetPOST('height');
$wigth = $this->app->Secure->GetPOST('width');
$length = $this->app->Secure->GetPOST('length');
$coding = $this->app->Secure->GetPOST('coding') == '1';
}else{
$versandmit = '';//$this->app->Secure->GetPOST("versandmit");
$trackingsubmit = '';//$this->app->Secure->GetPOST("trackingsubmit");
$versandmitbutton = '';//$this->app->Secure->GetPOST("versandmitbutton");
$tracking = '';//$this->app->Secure->GetPOST("tracking");
$trackingsubmitcancel = '';//$this->app->Secure->GetPOST("trackingsubmitcancel");
$retourenlabel = '';// $this->app->Secure->GetPOST("retourenlabel");
$Name = $adressdaten["name"];
$Name2 = $adressdaten["name2"];
$Name3 = $adressdaten["name3"];
$Street = $adressdaten["strasse"];
$HouseNo = $adressdaten["hausnummer"];
$ZipCode = $adressdaten['plz'];
$City = $adressdaten['ort'];
$Mail = $adressdaten['email'];
$Phone = $adressdaten["telefon"];
$Country = $adressdaten["land"];
$Company = "Company";
$Weight = $adressdaten["standardkg"];
$coding = $this->einstellungen['dhl_coding'] == 1;
$height = $this->einstellungen('dhl_height');
$wigth = $this->einstellungen('dhl_width');
$length = $this->einstellungen('dhl_length');
}
try {
$shipmentDate = date("Y-m-d");
switch ($this->einstellungen['dhl_product']) {
case 'V01PAK':
{
$shipmentData = new CreateNationalShipmentRequest(
$shipmentDate,
$Weight,
$length,
$wigth,
$height,
$Name,
$Name2,
$Name3,
$Street,
$HouseNo,
$ZipCode,
$City,
$Country,
$Mail,
$coding
);
break;
}
case 'V53WPAK':
{
$shipmentData = new CreateInterationalShipmentRequest(
$shipmentDate,
$Weight,
$length,
$wigth,
$height,
$Name,
$Name2,
$Name3,
$Street,
$HouseNo,
$ZipCode,
$City,
$Country,
$Mail,
$coding,
$this->einstellungen['dhl_export_product_type'],
$this->einstellungen['dhl_export_product_type_description'],
$this->getPackageContents($Query['id'])
);
break;
}
default:
{
throw new UnknownProductException();
}
}
$createResponse = $dhlApi->createShipment($shipmentData);
if($this->einstellungen['autotracking'] == "1")
$this->SetTracking($createResponse->getShipmentNumber(), $sid === 'versand' ? $id : 0, $lieferschein);
$data['drucker'] = $this->paketmarke_drucker;
$data['druckerlogistikstufe2'] = $this->export_drucker;
if(!$data['drucker']){
if($this->app->erp->GetStandardPaketmarkendrucker() > 0){
$data['drucker'] = $this->app->erp->GetStandardPaketmarkendrucker();
}
}
if(!$data['druckerlogistikstufe2']){
if($this->app->erp->GetStandardVersanddrucker($projekt) > 0){
$data['druckerlogistikstufe2'] = $this->app->erp->GetStandardVersanddrucker($projekt);
}
}
$pdf = $createResponse->getLabelAsPdf();
$datei = $this->app->erp->GetTMP() . 'DhlLabel_' . $createResponse->getShipmentNumber() . '.pdf';
file_put_contents($datei, $pdf);
$spoolerId = $this->app->printer->Drucken($data['drucker'], $datei);
if($spoolerId > 0 && $versandId > 0){
$this->app->DB->Update(
sprintf(
'UPDATE versand SET lastspooler_id = %d, lastprinter = %d WHERE id = %d',
$spoolerId, $data['drucker'], $versandId
)
);
}
if($module === 'retoure'){
if(@is_file($datei) && @filesize($datei)){
$fileid = $this->app->erp->CreateDatei('DhlMarkeLabel_' . $this->app->DB->Select("SELECT belegnr FROM retoure WHERE id = '$id' LIMIT 1") . '.pdf',
'Anhang', '', "", $datei,
$this->app->DB->real_escape_string($this->app->User->GetName()));
$this->app->erp->AddDateiStichwort($fileid, 'anhang', 'retoure', $id);
}
}
unlink($datei);
if($adressdaten !== null){
return true;
}
if($createResponse->containsExportDocuments()){
$tmppdf = $this->app->erp->GetTMP() . 'DhlExport_' . $createResponse->getShipmentNumber() . '.pdf';
file_put_contents($tmppdf, $createResponse->getExportPaperAsPdf());
$spoolerId = $this->app->printer->Drucken($data['druckerlogistikstufe2'], $tmppdf);
if($versandId && $spoolerId){
$this->app->DB->Update(
sprintf(
'UPDATE versand SET lastexportspooler_id = %d, lastexportprinter = %d WHERE id = %d',
$spoolerId, $data['druckerlogistikstufe2'], $versandId
)
);
}
if($module === 'retoure'){
if(@is_file($tmppdf) && @filesize($tmppdf)){
$fileid = $this->app->erp->CreateDatei('Export_' . $this->app->DB->Select("SELECT belegnr FROM retoure WHERE id = '$id' LIMIT 1") . '.pdf', 'Anhang', '', "", $tmppdf, $this->app->DB->real_escape_string($this->app->User->GetName()));
$this->app->erp->AddDateiStichwort($fileid, 'anhang', 'retoure', $id);
}
}
unlink($tmppdf);
}
} catch (DhlBaseException $e) {
$this->errors[] = $e->getMessage();
}
}
}
if($adressdaten !== null){
return false;
}
if($target){
if($this->einstellungen['dhl_coding'] == '1'){
$this->app->Tpl->Set('DHL_CODING_CHECKED', 'checked="checked"');
}
$this->app->Tpl->Add("HEIGHT", $this->einstellungen['dhl_height']);
$this->app->Tpl->Add("WIDTH", $this->einstellungen['dhl_width']);
$this->app->Tpl->Add("LENGTH", $this->einstellungen['dhl_length']);
$this->app->Tpl->Parse($target, 'versandarten_dhl.tpl');
}
if(count($this->errors) > 0){
return $this->errors;
}
}
private function getPackageContents($deliveryNoteId)
{
$contents = [];
/** @var Database $db */
$db = $this->app->Container->get('Database');
$select = $db->select()
->from('lieferschein_position AS l')
->cols([
'l.bezeichnung',
'l.menge',
'l.zolltarifnummer',
'l.herkunftsland',
'a.umsatz_netto_einzeln',
'g.gewicht'
])
->leftJoin('auftrag_position AS a', 'l.auftrag_position_id = a.id')
->leftJoin('artikel AS g', 'l.artikel = g.id')
->where('l.lieferschein=:id')
->bindValue('id', $deliveryNoteId);
$positions = $db->fetchAll($select->getStatement(), $select->getBindValues());
foreach ($positions as $position) {
$contents[] = new PackageContent(
(int)$position['menge'],
$position['bezeichnung'],
$position['umsatz_netto_einzeln'],
$position['herkunftsland'],
$position['zolltarifnummer'],
$position['gewicht']
);
}
return $contents;
}
public function Export($daten)
{
}
private function log($message)
{
if(isset($this->einstellungen['log'])){
if(is_array($message) || is_object($message)){
error_log(print_r($message, true));
}else{
error_log($message);
}
}
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-90
View File
@@ -1,90 +0,0 @@
01.01.2021;;1;N;Standardbrief;0,8;Standardbrief;0,8;;;140;90;0;235;125;5;0;20;;;Die Länge muss mindestens das 1,4-fache der Breite betragen.;Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände bis 20 g. Die Länge muss mindestens das 1,4-fache der Breite betragen.;https://www.deutschepost.de/de/b/brief_postkarte.html;nein;nein
01.01.2021;;11;N;Kompaktbrief;0,95;Kompaktbrief;0,95;;;100;70;0;235;125;10;0;50;;;Die Länge muss mindestens das 1,4-fache der Breite betragen.;Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände bis 50 g. Die Länge muss mindestens das 1,4-fache der Breite betragen.;https://www.deutschepost.de/de/b/brief_postkarte.html;nein;nein
01.01.2021;;21;N;Großbrief;1,55;Großbrief;1,55;;;100;70;0;353;250;20;0;500;;;;Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände bis 500 g.;https://www.deutschepost.de/de/b/brief_postkarte.html;nein;nein
01.01.2021;;31;N;Maxibrief;2,7;Maxibrief;2,7;;;100;70;0;353;250;50;0;1000;;;;Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände bis 1000 g.;https://www.deutschepost.de/de/b/brief_postkarte.html;nein;nein
01.01.2021;;41;N;Maxibrief bis 2000 g + Zusatzentgelt MBf;4,9;Maxibrief;2,7;Zusatzentgelt MBf;2,2;100;70;0;600;300;150;0;2000;;;Höchstmaße alternativ: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Ein Maxibrief bis 2000 g mit einem Überformat.;https://www.deutschepost.de/de/b/brief_postkarte.html;nein;nein
01.01.2021;;51;N;Postkarte;0,6;Postkarte;0,6;;;140;90;0;235;125;2;;;;;Flächengewicht: 150 g/m2 bis 500 g/m2. Die Länge muss mindestens das 1,4-fache der Breite betragen.;Preis nach UStG umsatzsteuerfrei. Die Länge muss mindestens das 1,4-fache der Breite betragen.;https://www.deutschepost.de/de/b/brief_postkarte.html;nein;nein
01.01.2021;1;195;N;Standardbrief + Prio;1,8;Standardbrief;0,8;Prio;1;140;90;0;235;125;5;0;20;;;Die Länge muss mindestens das 1,4-fache der Breite betragen.;Kombi-Produkt aus Standardbrief (umsatzsteuerfrei) und Zusatzleistung Prio (umsatzsteuerfrei). Sendungsverfolgung per T&T. Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/p/prio.html;nein;nein
01.01.2021;1;196;N;Kompaktbrief + Prio;1,95;Kompaktbrief;0,95;Prio;1;100;70;0;235;125;10;0;50;;;Die Länge muss mindestens das 1,4-fache der Breite betragen.;Kombi-Produkt aus Kompaktbrief (umsatzsteuerfrei) und Zusatzleistung Prio (umsatzsteuerfrei). Sendungsverfolgung per T&T. Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/p/prio.html;nein;nein
01.01.2021;1;197;N;Großbrief + Prio;2,55;Großbrief;1,55;Prio;1;100;70;0;353;250;20;0;500;;;;Kombi-Produkt aus Großbrief (umsatzsteuerfrei) und Zusatzleistung Prio (umsatzsteuerfrei). Sendungsverfolgung per T&T. Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/p/prio.html;nein;nein
01.01.2021;1;198;N;Maxibrief + Prio;3,7;Maxibrief;2,7;Prio;1;100;70;0;353;250;50;0;1000;;;;Kombi-Produkt aus Maxibrief (umsatzsteuerfrei) und Zusatzleistung Prio (umsatzsteuerfrei). Sendungsverfolgung per T&T. Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/p/prio.html;nein;nein
01.01.2021;1;199;N;Maxibrief bis 2000 g + Zusatzentgelt MBf + Prio;5,9;Maxibrief;2,7;Zusatzentgelt MBf + Prio;3,2;100;70;0;600;300;150;0;2000;;;Höchstmaße alternativ: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Kombi-Produkt aus Maxibrief bis 2000 g mit einem Überformat (umsatzsteuerfrei) und Zusatzleistung Prio (umsatzsteuerfrei). Sendungsverfolgung per T&T. Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/p/prio.html;nein;nein
01.01.2021;1;200;N;Postkarte + Prio;1,6;Postkarte;0,6;Prio;1;140;90;0;235;125;2;;;;;Flächengewicht: 150 g/m2 bis 500 g/m2. Die Länge muss mindestens das 1,4-fache der Breite betragen.;Kombi-Produkt aus Postkarte (umsatzsteuerfrei) und Zusatzleistung Prio (umsatzsteuerfrei). Sendungsverfolgung per T&T. Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/p/prio.html;nein;nein
01.01.2021;;282;N;Bücher- und Warensendung 500;1,9;BÜCHER- UND WARENSENDUNG 500;1,9;;;100;70;0;353;250;50;0;500;;;;Preis nach UStG umsatzsteuerfrei. Bücher- und Warenversand bis 500 g, 35,3 x 25 x 5 cm. Zustellung bis 4 Werktage. Verschlossener Versand. Keine brieflichen Mitteilungen.;https://www.deutschepost.de/de/w/buecherundwarensendung.html;nein;nein
01.01.2021;;290;N;Bücher- und Warensendung 1000;2,2;BÜCHER- UND WARENSENDUNG 1000;2,2;;;100;70;0;353;250;50;501;1000;;;;Preis nach UStG umsatzsteuerfrei. Bücher- und Warenversand bis 1000 g, 35,3 x 25 x 5 cm. Zustellung bis 4 Werktage. Verschlossener Versand. Keine brieflichen Mitteilungen.;https://www.deutschepost.de/de/w/buecherundwarensendung.html;nein;nein
01.01.2021;;401;N;Streifbandzeitung bis 50 g;0,89;Streifbandzeitung bis 50 g;0,89;;;140;90;0;353;250;50;0;50;;;Einlieferung in Filiale oder Großannahmestelle, bei mehr als 500 Stück immer in Großannahmestelle. Mit Produkt- oder Internetmarke ist die Einlieferung über Briefkasten möglich.;Nutzung exklusiv für Vertragspartner der Deutsche Post Presse Distribution oder gewerbliche Einrichtungen des Pressehandels.;https://www.deutschepost.de/de/p/presse-distribution/produkte/streifbandzeitung.html;nein;nein
01.01.2021;;402;N;Streifbandzeitung bis 100 g;1,19;Streifbandzeitung über 50 g bis 100 g;1,19;;;140;90;0;353;250;50;51;100;;;Einlieferung in Filiale oder Großannahmestelle, bei mehr als 500 Stück immer in Großannahmestelle. Mit Produkt- oder Internetmarke ist die Einlieferung über Briefkasten möglich.;Nutzung exklusiv für Vertragspartner der Deutsche Post Presse Distribution oder gewerbliche Einrichtungen des Pressehandels.;https://www.deutschepost.de/de/p/presse-distribution/produkte/streifbandzeitung.html;nein;nein
01.01.2021;;403;N;Streifbandzeitung bis 250 g;1,37;Streifbandzeitung über 100 g bis 250 g;1,37;;;140;90;0;353;250;50;101;250;;;Einlieferung in Filiale oder Großannahmestelle, bei mehr als 500 Stück immer in Großannahmestelle. Mit Produkt- oder Internetmarke ist die Einlieferung über Briefkasten möglich.;Nutzung exklusiv für Vertragspartner der Deutsche Post Presse Distribution oder gewerbliche Einrichtungen des Pressehandels.;https://www.deutschepost.de/de/p/presse-distribution/produkte/streifbandzeitung.html;nein;nein
01.01.2021;;404;N;Streifbandzeitung bis 500 g;1,67;Streifbandzeitung über 250 g bis 500 g;1,67;;;140;90;0;353;250;50;251;500;;;Einlieferung in Filiale oder Großannahmestelle, bei mehr als 500 Stück immer in Großannahmestelle. Mit Produkt- oder Internetmarke ist die Einlieferung über Briefkasten möglich.;Nutzung exklusiv für Vertragspartner der Deutsche Post Presse Distribution oder gewerbliche Einrichtungen des Pressehandels.;https://www.deutschepost.de/de/p/presse-distribution/produkte/streifbandzeitung.html;nein;nein
01.01.2021;;405;N;Streifbandzeitung bis 1000 g;2,5;Streifbandzeitung über 500 g bis 1000 g;2,5;;;140;90;0;353;250;50;501;1000;;;Einlieferung in Filiale oder Großannahmestelle, bei mehr als 500 Stück immer in Großannahmestelle. Mit Produkt- oder Internetmarke ist die Einlieferung über Briefkasten möglich.;Nutzung exklusiv für Vertragspartner der Deutsche Post Presse Distribution oder gewerbliche Einrichtungen des Pressehandels.;https://www.deutschepost.de/de/p/presse-distribution/produkte/streifbandzeitung.html;nein;nein
01.01.2021;1;1002;N;Standardbrief Integral + EINSCHREIBEN EINWURF;3;Standardbrief;0,8;EINSCHREIBEN EINWURF;2,2;140;90;0;235;125;5;0;20;;;Die Länge muss mindestens das 1,4-fache der Breite betragen.;Preis nach UStG umsatzsteuerfrei. Ein Standardbrief bis 20 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 20 EUR, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/e/einschreiben.html;nein;nein
01.01.2021;1;1007;N;Standardbrief Integral + EINSCHREIBEN;3,3;Standardbrief;0,8;EINSCHREIBEN;2,5;140;90;0;235;125;5;0;20;;;Die Länge muss mindestens das 1,4-fache der Breite betragen.;Preis nach UStG umsatzsteuerfrei. Ein Standardbrief bis 20 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/e/einschreiben.html;nein;nein
01.01.2021;1;1009;N;Standardbrief Integral + EINSCHREIBEN + EIGENHÄNDIG;5,5;Standardbrief;0,8;EINSCHREIBEN + EIGENHÄNDIG;4,7;140;90;0;235;125;5;0;20;;;Die Länge muss mindestens das 1,4-fache der Breite betragen.;Preis nach UStG umsatzsteuerfrei. Ein Standardbrief bis 20 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/e/einschreiben.html;nein;nein
01.01.2021;1;1012;N;Kompaktbrief Integral + EINSCHREIBEN EINWURF;3,15;Kompaktbrief;0,95;EINSCHREIBEN EINWURF;2,2;100;70;0;235;125;10;0;50;;;Die Länge muss mindestens das 1,4-fache der Breite betragen.;Preis nach UStG umsatzsteuerfrei. Ein Kompaktbrief bis 50 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 20 EUR, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/e/einschreiben.html;nein;nein
01.01.2021;1;1017;N;Kompaktbrief Integral + EINSCHREIBEN;3,45;Kompaktbrief;0,95;EINSCHREIBEN;2,5;100;70;0;235;125;10;0;50;;;Die Länge muss mindestens das 1,4-fache der Breite betragen.;Preis nach UStG umsatzsteuerfrei. Ein Kompaktbrief bis 50 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/e/einschreiben.html;nein;nein
01.01.2021;1;1019;N;Kompaktbrief Integral + EINSCHREIBEN + EIGENHÄNDIG;5,65;Kompaktbrief;0,95;EINSCHREIBEN + EIGENHÄNDIG;4,7;100;70;0;235;125;10;0;50;;;Die Länge muss mindestens das 1,4-fache der Breite betragen.;Preis nach UStG umsatzsteuerfrei. Ein Kompaktbrief bis 50 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/e/einschreiben.html;nein;nein
01.01.2021;1;1022;N;Großbrief Integral + EINSCHREIBEN EINWURF;3,75;Großbrief;1,55;EINSCHREIBEN EINWURF;2,2;100;70;0;353;250;20;0;500;;;;Preis nach UStG umsatzsteuerfrei. Ein Großbrief bis 500 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 20 EUR, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/e/einschreiben.html;nein;nein
01.01.2021;1;1027;N;Großbrief Integral + EINSCHREIBEN;4,05;Großbrief;1,55;EINSCHREIBEN;2,5;100;70;0;353;250;20;0;500;;;;Preis nach UStG umsatzsteuerfrei. Ein Großbrief bis 500 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/e/einschreiben.html;nein;nein
01.01.2021;1;1029;N;Großbrief Integral + EINSCHREIBEN + EIGENHÄNDIG;6,25;Großbrief;1,55;EINSCHREIBEN + EIGENHÄNDIG;4,7;100;70;0;353;250;20;0;500;;;;Preis nach UStG umsatzsteuerfrei. Ein Großbrief bis 500 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/e/einschreiben.html;nein;nein
01.01.2021;1;1032;N;Maxibrief Integral + EINSCHREIBEN EINWURF;4,9;Maxibrief;2,7;EINSCHREIBEN EINWURF;2,2;100;70;0;353;250;50;0;1000;;;;Preis nach UStG umsatzsteuerfrei. Ein Maxibrief bis 1000 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 20 EUR, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/e/einschreiben.html;nein;nein
01.01.2021;1;1037;N;Maxibrief Integral + EINSCHREIBEN;5,2;Maxibrief;2,7;EINSCHREIBEN;2,5;100;70;0;353;250;50;0;1000;;;;Preis nach UStG umsatzsteuerfrei. Ein Maxibrief bis 1000 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/e/einschreiben.html;nein;nein
01.01.2021;1;1039;N;Maxibrief Integral + EINSCHREIBEN + EIGENHÄNDIG;7,4;Maxibrief;2,7;EINSCHREIBEN + EIGENHÄNDIG;4,7;100;70;0;353;250;50;0;1000;;;;Preis nach UStG umsatzsteuerfrei. Ein Maxibrief bis 1000 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/e/einschreiben.html;nein;nein
01.01.2021;1;1042;N;Maxibrief Integral + Zusatzentgelt MBf + EINSCHREIBEN EINWURF;7,1;Maxibrief;2,7;Zusatzentgelt MBf + EINSCHREIBEN EINWURF;4,4;100;70;0;600;300;150;0;2000;;;Höchstmaße alternativ: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Ein Maxibrief bis 2000 g mit einem Überformat, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 20 EUR, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/e/einschreiben.html;nein;nein
01.01.2021;1;1047;N;Maxibrief Integral + Zusatzentgelt MBf + EINSCHREIBEN;7,4;Maxibrief;2,7;Zusatzentgelt MBf + EINSCHREIBEN;4,7;100;70;0;600;300;150;0;2000;;;Höchstmaße alternativ: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Ein Maxibrief bis 2000 g mit einem Überformat, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/e/einschreiben.html;nein;nein
01.01.2021;1;1049;N;Maxibrief Integral + Zusatzentgelt MBf + EINSCHREIBEN + EIGENHÄNDIG;9,6;Maxibrief;2,7;Zusatzentgelt MBf + EINSCHREIBEN + EIGENHÄNDIG;6,9;100;70;0;600;300;150;0;2000;;;Höchstmaße alternativ: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Ein Maxibrief bis 2000 g mit einem Überformat, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/e/einschreiben.html;nein;nein
01.01.2021;1;1052;N;Postkarte Integral + EINSCHREIBEN EINWURF;2,8;Postkarte;0,6;EINSCHREIBEN EINWURF;2,2;140;90;0;235;125;2;;;;;Flächengewicht: 150 g/m2 bis 500 g/m2. Die Länge muss mindestens das 1,4-fache der Breite betragen.;Preis nach UStG umsatzsteuerfrei. Eine Postkarte, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 20 EUR, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/e/einschreiben.html;nein;nein
01.01.2021;1;1057;N;Postkarte Integral + EINSCHREIBEN;3,1;Postkarte;0,6;EINSCHREIBEN;2,5;140;90;0;235;125;2;;;;;Flächengewicht: 150 g/m2 bis 500 g/m2. Die Länge muss mindestens das 1,4-fache der Breite betragen.;Preis nach UStG umsatzsteuerfrei. Eine Postkarte, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/e/einschreiben.html;nein;nein
01.01.2021;1;1059;N;Postkarte Integral + EINSCHREIBEN + EIGENHÄNDIG;5,3;Postkarte;0,6;EINSCHREIBEN + EIGENHÄNDIG;4,7;140;90;0;235;125;2;;;;;Flächengewicht: 150 g/m2 bis 500 g/m2. Die Länge muss mindestens das 1,4-fache der Breite betragen.;Preis nach UStG umsatzsteuerfrei. Eine Postkarte, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/e/einschreiben.html;nein;nein
01.01.2021;;10001;I;Standardbrief Intern. GK;1,1;Standardbrief Intern. GK;1,1;;;140;90;0;235;125;5;0;20;;;Die Länge muss mindestens das 1,4-fache der Breite betragen.;Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände bis 20 g. Die Länge muss mindestens das 1,4-fache der Breite betragen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/brief-postkarte-international.html;nein;nein
01.01.2021;;10011;I;Kompaktbrief Intern. GK;1,7;Kompaktbrief Intern. GK;1,7;;;140;90;0;235;125;10;0;50;;;Die Länge muss mindestens das 1,4-fache der Breite betragen.;Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände bis 50 g. Die Länge muss mindestens das 1,4-fache der Breite betragen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/brief-postkarte-international.html;nein;nein
01.01.2021;;10051;I;Großbrief Intern. GK;3,7;Großbrief Intern. GK;3,7;;;140;90;0;600;600;600;0;500;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände bis 500 g. Keine Seite länger als 600 mm.;https://www.deutschepost.de/de/b/briefe-ins-ausland/brief-postkarte-international.html;nein;nein
01.01.2021;;10071;I;Maxibrief Intern. bis 1.000g GK;7;Maxibrief Intern. bis 1.000g GK;7;;;140;90;0;600;600;600;501;1000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände bis 1000 g. Keine Seite länger als 600 mm.;https://www.deutschepost.de/de/b/briefe-ins-ausland/brief-postkarte-international.html;nein;nein
01.01.2021;;10091;I;Maxibrief Intern. bis 2.000g GK;17;Maxibrief Intern. bis 2.000g GK;17;;;140;90;0;600;600;600;1001;2000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände bis 2000 g. Keine Seite länger als 600 mm.;https://www.deutschepost.de/de/b/briefe-ins-ausland/brief-postkarte-international.html;nein;nein
01.01.2021;1;10162;I;Brief Kilotarif international ohne USt + EINSCHREIBEN;4,29;Frankierung Brief Kilotarif Stückentgelt;0,79;EINSCHREIBEN;3,5;140;90;0;600;600;600;0;2000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände. Die Länge muss mindestens das 1,4-fache der Breite betragen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/brief-international-kilotarif.html;ja;nein
01.01.2021;;10166;I;Brief Kilotarif international ohne USt.;0,79;Frankierung Brief Kilotarif Stückentgelt;0,79;;;140;90;0;600;600;600;0;2000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände. Die Länge muss mindestens das 1,4-fache der Breite betragen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/brief-international-kilotarif.html;ja;nein
01.01.2021;;10201;I;Postkarte Intern. GK;0,95;Postkarte Intern. GK;0,95;;;140;90;0;235;125;2;;;;;Flächengewicht: 150 g/m2 bis 500 g/m2. Die Länge muss mindestens das 1,4-fache der Breite betragen.;Preis nach UStG umsatzsteuerfrei. Die Länge muss mindestens das 1,4-fache der Breite betragen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/brief-postkarte-international.html;nein;nein
01.01.2021;;10246;I;Warenpost International XS;3,8;Warenpost International XS;3,8;;;140;90;0;353;250;30;0;500;;;;Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;;10247;I;Warenpost International S;5;Warenpost International S;5;;;140;90;0;600;600;600;0;500;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;;10248;I;Warenpost International M;9;Warenpost International M;9;;;140;90;0;600;600;600;501;1000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;;10249;I;Warenpost International L;19,9;Warenpost International L;19,9;;;140;90;0;600;600;600;1001;2000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;1;10250;I;Warenpost International XS Tracked;6,15;Warenpost International XS Tracked;6,15;;;140;90;0;353;250;30;0;500;;;;Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;1;10251;I;Warenpost International S Tracked;7,35;Warenpost International S Tracked;7,35;;;140;90;0;600;600;600;0;500;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;1;10252;I;Warenpost International M Tracked;11,35;Warenpost International M Tracked;11,35;;;140;90;0;600;600;600;501;1000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;1;10253;I;Warenpost International L Tracked;22,25;Warenpost International L Tracked;22,25;;;140;90;0;600;600;600;1001;2000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;;10254;I;Warenpost International XS (EU/USt.);3,81;Warenpost International XS (EU/USt.);3,81;;;140;90;0;353;250;30;0;500;;;;Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;;10255;I;Warenpost International S (EU/USt.);4,4;Warenpost International S (EU/USt.);4,4;;;140;90;0;600;600;600;0;500;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;;10256;I;Warenpost International M (EU/USt.);8,33;Warenpost International M (EU/USt.);8,33;;;140;90;0;600;600;600;501;1000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;;10257;I;Warenpost International L (EU/USt.);20,23;Warenpost International L (EU/USt.);20,23;;;140;90;0;600;600;600;1001;2000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;1;10258;I;Warenpost International XS Tracked (EU/USt.);6,6;Warenpost International XS Tracked (EU/USt.);6,6;;;140;90;0;353;250;30;0;500;;;;Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;1;10259;I;Warenpost International S Tracked (EU/USt.);7,2;Warenpost International S Tracked (EU/USt.);7,2;;;140;90;0;600;600;600;0;500;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;1;10260;I;Warenpost International M Tracked (EU/USt.);11,13;Warenpost International M Tracked (EU/USt.);11,13;;;140;90;0;600;600;600;501;1000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;1;10261;I;Warenpost International L Tracked (EU/USt.);23,03;Warenpost International L Tracked (EU/USt.);23,03;;;140;90;0;600;600;600;1001;2000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;;10270;I;Warenpost Int. KT (EU/USt.) für Internetmarke;1,5;WARENPOST INT KT EU Internetmarke;1,5;;;140;90;0;600;600;600;0;2000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;ja;ja
01.01.2021;1;10271;I;Warenpost Int. KT Tracked (EU/USt.) für Internetmarke;3,6;WARENPOST INT KT TRACKED EU Internetmarke;3,6;;;140;90;0;600;600;600;0;2000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;ja;ja
01.01.2021;;10272;I;Warenpost Int. KT (Non EU) für Internetmarke;2;WARENPOST INT KT NON EU Internetmarke;2;;;140;90;0;600;600;600;0;2000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;ja;ja
01.01.2021;1;10273;I;Warenpost Int. KT Tracked (Non EU) für Internetmarke;4,1;WARENPOST INT KT TRACKED NON EU Internetmarke;4,1;;;140;90;0;600;600;600;0;2000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;ja;ja
01.01.2021;;10280;I;Warenpost International XS Unterschrift;7,3;Warenpost International XS Unterschrift;7,3;;;140;90;0;353;250;30;0;500;;;;Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;;10281;I;Warenpost International S Unterschrift;8,5;Warenpost International S Unterschrift;8,5;;;140;90;0;600;600;600;0;500;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;;10282;I;Warenpost International M Unterschrift;12,5;Warenpost International M Unterschrift;12,5;;;140;90;0;600;600;600;501;1000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;;10283;I;Warenpost International L Unterschrift;23,4;Warenpost International L Unterschrift;23,4;;;140;90;0;600;600;600;1001;2000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;;10284;I;Warenpost International XS Unterschrift (EU/USt.);7,97;Warenpost International XS Unterschrift (EU/USt.);7,97;;;140;90;0;353;250;30;0;500;;;;Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;;10285;I;Warenpost International S Unterschrift (EU/USt.);8,57;Warenpost International S Unterschrift (EU/USt.);8,57;;;140;90;0;600;600;600;0;500;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;;10286;I;Warenpost International M Unterschrift (EU/USt.);12,5;Warenpost International M Unterschrift (EU/USt.);12,5;;;140;90;0;600;600;600;501;1000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;;10287;I;Warenpost International L Unterschrift (EU/USt.);24,4;Warenpost International L Unterschrift (EU/USt.);24,4;;;140;90;0;600;600;600;1001;2000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;nein;ja
01.01.2021;;10292;I;Warenpost Int. KT Unterschrift (EU/USt.) für Internetmarke;4,75;WARENPOST INT KT UNTERSCHRIFT EU Internetmarke;4,75;;;140;90;0;600;600;600;0;2000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;ja;ja
01.01.2021;;10293;I;Warenpost Int. KT Unterschrift (Non EU) für Internetmarke;5,25;WARENPOST INT KT UNTERSCHRIFT NON EU Internetmarke;5,25;;;140;90;0;600;600;600;0;2000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen.;https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html;ja;ja
01.01.2021;1;11006;I;Standardbrief Intern. GK Integral + EINSCHREIBEN;4,6;Standardbrief Intern. GK;1,1;EINSCHREIBEN;3,5;140;90;0;235;125;5;0;20;;;Die Länge muss mindestens das 1,4-fache der Breite betragen.;Preis nach UStG umsatzsteuerfrei. Ein Standardbrief INTERNATIONAL bis 20 g, nachgewiesene Übergabe an Empfänger, Sendungsverfolgung per T&T, Haftung, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/b/briefe-ins-ausland/einschreiben-international.html;nein;nein
01.01.2021;1;11016;I;Kompaktbrief Intern. GK Integral + EINSCHREIBEN;5,2;Kompaktbrief Intern. GK;1,7;EINSCHREIBEN;3,5;140;90;0;235;125;10;0;50;;;Die Länge muss mindestens das 1,4-fache der Breite betragen.;Preis nach UStG umsatzsteuerfrei. Ein Kompaktbrief INTERNATIONAL bis 50 g, nachgewiesene Übergabe an Empfänger, Sendungsverfolgung per T&T, Haftung, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/b/briefe-ins-ausland/einschreiben-international.html;nein;nein
01.01.2021;1;11056;I;Großbrief Intern. GK Integral + EINSCHREIBEN;7,2;Großbrief Intern. GK;3,7;EINSCHREIBEN;3,5;140;90;0;600;600;600;0;500;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Ein Großbrief INTERNATIONAL bis 500 g, nachgewiesene Übergabe an Empfänger, Sendungsverfolgung per T&T, Haftung, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/b/briefe-ins-ausland/einschreiben-international.html;nein;nein
01.01.2021;1;11076;I;Maxibrief Intern. bis 1.000g GK Integral + EINSCHREIBEN;10,5;Maxibrief Intern. bis 1.000g GK;7;EINSCHREIBEN;3,5;140;90;0;600;600;600;501;1000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Ein Maxibrief INTERNATIONAL bis 1000 g, nachgewiesene Übergabe an Empfänger, Sendungsverfolgung per T&T, Haftung, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/b/briefe-ins-ausland/einschreiben-international.html;nein;nein
01.01.2021;1;11096;I;Maxibrief Intern. bis 2.000g GK Integral + EINSCHREIBEN;20,5;Maxibrief Intern. bis 2.000g GK;17;EINSCHREIBEN;3,5;140;90;0;600;600;600;1001;2000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Ein Maxibrief INTERNATIONAL bis 2000 g, nachgewiesene Übergabe an Empfänger, Sendungsverfolgung per T&T, Haftung, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/b/briefe-ins-ausland/einschreiben-international.html;nein;nein
01.01.2021;1;11202;I;Postkarte Intern. GK Integral + EINSCHREIBEN;4,45;Postkarte Intern. GK;0,95;EINSCHREIBEN;3,5;140;90;0;235;125;2;;;;;Flächengewicht: 150 g/m2 bis 500 g/m2. Die Länge muss mindestens das 1,4-fache der Breite betragen.;Preis nach UStG umsatzsteuerfrei. Eine Postkarte INTERNATIONAL, nachgewiesene Übergabe an Empfänger, Sendungsverfolgung per T&T, Haftung, Einlieferung über die Filialen der Deutschen Post.;https://www.deutschepost.de/de/b/briefe-ins-ausland/einschreiben-international.html;nein;nein
01.01.2021;;30092;I;Presse Eco 500g;3,5;Presse Eco 500g;3,5;;;140;90;0;600;600;600;0;500;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Mit Presse Eco 500g versenden Sie Zeitungen und Zeitschriften.;https://www.deutschepost.de/de/b/briefe-ins-ausland/presse-international.html;nein;nein
01.01.2021;;30112;I;Presse Eco 1000g;6,5;Presse Eco 1000g;6,5;;;140;90;0;600;600;600;501;1000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Mit Presse Eco 1000g versenden Sie Zeitungen und Zeitschriften.;https://www.deutschepost.de/de/b/briefe-ins-ausland/presse-international.html;nein;nein
01.01.2021;;30132;I;Presse Eco 2000g;14;Presse Eco 2000g;14;;;140;90;0;600;600;600;1001;2000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Mit Presse Eco 2000g versenden Sie Zeitungen und Zeitschriften.;https://www.deutschepost.de/de/b/briefe-ins-ausland/presse-international.html;nein;nein
01.01.2021;;30202;I;Presse Prio 500g;3,7;Presse Prio 500g;3,7;;;140;90;0;600;600;600;0;500;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Mit Presse Prio 500 g versenden Sie Zeitungen und Zeitschriften. Bitte beachten Sie die Kennzeichnungspflicht der Sendung.;https://www.deutschepost.de/de/b/briefe-ins-ausland/presse-international.html;nein;nein
01.01.2021;1;30207;I;Presse Prio 500g + EINSCHREIBEN;7,2;Presse Prio 500g;3,7;EINSCHREIBEN;3,5;140;90;0;600;600;600;0;500;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Presse Prio 500g, nachgewiesene Übergabe an Empfänger, Sendungsverfolgung per T&T, Haftung, Einlieferung über die Filialen der Deutschen Post. Bitte beachten Sie die Kennzeichnungspflicht der Sendung. ;https://www.deutschepost.de/de/b/briefe-ins-ausland/presse-international.html;nein;nein
01.01.2021;;30222;I;Presse Prio 1000g;7;Presse Prio 1000g;7;;;140;90;0;600;600;600;501;1000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Mit Presse Prio 1000 g versenden Sie Zeitungen und Zeitschriften. Bitte beachten Sie die Kennzeichnungspflicht der Sendung.;https://www.deutschepost.de/de/b/briefe-ins-ausland/presse-international.html;nein;nein
01.01.2021;1;30227;I;Presse Prio 1000g + EINSCHREIBEN;10,5;Presse Prio 1000g;7;EINSCHREIBEN;3,5;140;90;0;600;600;600;501;1000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Presse Prio 1000 g, nachgewiesene Übergabe an Empfänger, Sendungsverfolgung per T&T, Haftung, Einlieferung über die Filialen der Deutschen Post. Bitte beachten Sie die Kennzeichnungspflicht der Sendung.;https://www.deutschepost.de/de/b/briefe-ins-ausland/presse-international.html;nein;nein
01.01.2021;;30242;I;Presse Prio 2000g;17;Presse Prio 2000g;17;;;140;90;0;600;600;600;1001;2000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Mit Presse Prio 2000 g versenden Sie Zeitungen und Zeitschriften. Bitte beachten Sie die Kennzeichnungspflicht der Sendung.;https://www.deutschepost.de/de/b/briefe-ins-ausland/presse-international.html;nein;nein
01.01.2021;1;30247;I;Presse Prio 2000g + EINSCHREIBEN;20,5;Presse Prio 2000g;17;EINSCHREIBEN;3,5;140;90;0;600;600;600;1001;2000;;;Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm.;Preis nach UStG umsatzsteuerfrei. Presse Prio 2000g, nachgewiesene Übergabe an Empfänger, Sendungsverfolgung per T&T, Haftung, Einlieferung über die Filialen der Deutschen Post. Bitte beachten Sie die Kennzeichnungspflicht der Sendung. ;https://www.deutschepost.de/de/b/briefe-ins-ausland/presse-international.html;nein;nein
1 01.01.2021 1 N Standardbrief 0,8 Standardbrief 0,8 140 90 0 235 125 5 0 20 Die Länge muss mindestens das 1,4-fache der Breite betragen. Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände bis 20 g. Die Länge muss mindestens das 1,4-fache der Breite betragen. https://www.deutschepost.de/de/b/brief_postkarte.html nein nein
2 01.01.2021 11 N Kompaktbrief 0,95 Kompaktbrief 0,95 100 70 0 235 125 10 0 50 Die Länge muss mindestens das 1,4-fache der Breite betragen. Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände bis 50 g. Die Länge muss mindestens das 1,4-fache der Breite betragen. https://www.deutschepost.de/de/b/brief_postkarte.html nein nein
3 01.01.2021 21 N Großbrief 1,55 Großbrief 1,55 100 70 0 353 250 20 0 500 Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände bis 500 g. https://www.deutschepost.de/de/b/brief_postkarte.html nein nein
4 01.01.2021 31 N Maxibrief 2,7 Maxibrief 2,7 100 70 0 353 250 50 0 1000 Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände bis 1000 g. https://www.deutschepost.de/de/b/brief_postkarte.html nein nein
5 01.01.2021 41 N Maxibrief bis 2000 g + Zusatzentgelt MBf 4,9 Maxibrief 2,7 Zusatzentgelt MBf 2,2 100 70 0 600 300 150 0 2000 Höchstmaße alternativ: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Ein Maxibrief bis 2000 g mit einem Überformat. https://www.deutschepost.de/de/b/brief_postkarte.html nein nein
6 01.01.2021 51 N Postkarte 0,6 Postkarte 0,6 140 90 0 235 125 2 Flächengewicht: 150 g/m2 bis 500 g/m2. Die Länge muss mindestens das 1,4-fache der Breite betragen. Preis nach UStG umsatzsteuerfrei. Die Länge muss mindestens das 1,4-fache der Breite betragen. https://www.deutschepost.de/de/b/brief_postkarte.html nein nein
7 01.01.2021 1 195 N Standardbrief + Prio 1,8 Standardbrief 0,8 Prio 1 140 90 0 235 125 5 0 20 Die Länge muss mindestens das 1,4-fache der Breite betragen. Kombi-Produkt aus Standardbrief (umsatzsteuerfrei) und Zusatzleistung Prio (umsatzsteuerfrei). Sendungsverfolgung per T&T. Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/p/prio.html nein nein
8 01.01.2021 1 196 N Kompaktbrief + Prio 1,95 Kompaktbrief 0,95 Prio 1 100 70 0 235 125 10 0 50 Die Länge muss mindestens das 1,4-fache der Breite betragen. Kombi-Produkt aus Kompaktbrief (umsatzsteuerfrei) und Zusatzleistung Prio (umsatzsteuerfrei). Sendungsverfolgung per T&T. Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/p/prio.html nein nein
9 01.01.2021 1 197 N Großbrief + Prio 2,55 Großbrief 1,55 Prio 1 100 70 0 353 250 20 0 500 Kombi-Produkt aus Großbrief (umsatzsteuerfrei) und Zusatzleistung Prio (umsatzsteuerfrei). Sendungsverfolgung per T&T. Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/p/prio.html nein nein
10 01.01.2021 1 198 N Maxibrief + Prio 3,7 Maxibrief 2,7 Prio 1 100 70 0 353 250 50 0 1000 Kombi-Produkt aus Maxibrief (umsatzsteuerfrei) und Zusatzleistung Prio (umsatzsteuerfrei). Sendungsverfolgung per T&T. Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/p/prio.html nein nein
11 01.01.2021 1 199 N Maxibrief bis 2000 g + Zusatzentgelt MBf + Prio 5,9 Maxibrief 2,7 Zusatzentgelt MBf + Prio 3,2 100 70 0 600 300 150 0 2000 Höchstmaße alternativ: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Kombi-Produkt aus Maxibrief bis 2000 g mit einem Überformat (umsatzsteuerfrei) und Zusatzleistung Prio (umsatzsteuerfrei). Sendungsverfolgung per T&T. Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/p/prio.html nein nein
12 01.01.2021 1 200 N Postkarte + Prio 1,6 Postkarte 0,6 Prio 1 140 90 0 235 125 2 Flächengewicht: 150 g/m2 bis 500 g/m2. Die Länge muss mindestens das 1,4-fache der Breite betragen. Kombi-Produkt aus Postkarte (umsatzsteuerfrei) und Zusatzleistung Prio (umsatzsteuerfrei). Sendungsverfolgung per T&T. Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/p/prio.html nein nein
13 01.01.2021 282 N Bücher- und Warensendung 500 1,9 BÜCHER- UND WARENSENDUNG 500 1,9 100 70 0 353 250 50 0 500 Preis nach UStG umsatzsteuerfrei. Bücher- und Warenversand bis 500 g, 35,3 x 25 x 5 cm. Zustellung bis 4 Werktage. Verschlossener Versand. Keine brieflichen Mitteilungen. https://www.deutschepost.de/de/w/buecherundwarensendung.html nein nein
14 01.01.2021 290 N Bücher- und Warensendung 1000 2,2 BÜCHER- UND WARENSENDUNG 1000 2,2 100 70 0 353 250 50 501 1000 Preis nach UStG umsatzsteuerfrei. Bücher- und Warenversand bis 1000 g, 35,3 x 25 x 5 cm. Zustellung bis 4 Werktage. Verschlossener Versand. Keine brieflichen Mitteilungen. https://www.deutschepost.de/de/w/buecherundwarensendung.html nein nein
15 01.01.2021 401 N Streifbandzeitung bis 50 g 0,89 Streifbandzeitung bis 50 g 0,89 140 90 0 353 250 50 0 50 Einlieferung in Filiale oder Großannahmestelle, bei mehr als 500 Stück immer in Großannahmestelle. Mit Produkt- oder Internetmarke ist die Einlieferung über Briefkasten möglich. Nutzung exklusiv f�ür Vertragspartner der Deutsche Post Presse Distribution oder gewerbliche Einrichtungen des Pressehandels. https://www.deutschepost.de/de/p/presse-distribution/produkte/streifbandzeitung.html nein nein
16 01.01.2021 402 N Streifbandzeitung bis 100 g 1,19 Streifbandzeitung über 50 g bis 100 g 1,19 140 90 0 353 250 50 51 100 Einlieferung in Filiale oder Großannahmestelle, bei mehr als 500 Stück immer in Großannahmestelle. Mit Produkt- oder Internetmarke ist die Einlieferung über Briefkasten möglich. Nutzung exklusiv f�ür Vertragspartner der Deutsche Post Presse Distribution oder gewerbliche Einrichtungen des Pressehandels. https://www.deutschepost.de/de/p/presse-distribution/produkte/streifbandzeitung.html nein nein
17 01.01.2021 403 N Streifbandzeitung bis 250 g 1,37 Streifbandzeitung über 100 g bis 250 g 1,37 140 90 0 353 250 50 101 250 Einlieferung in Filiale oder Großannahmestelle, bei mehr als 500 Stück immer in Großannahmestelle. Mit Produkt- oder Internetmarke ist die Einlieferung über Briefkasten möglich. Nutzung exklusiv f�ür Vertragspartner der Deutsche Post Presse Distribution oder gewerbliche Einrichtungen des Pressehandels. https://www.deutschepost.de/de/p/presse-distribution/produkte/streifbandzeitung.html nein nein
18 01.01.2021 404 N Streifbandzeitung bis 500 g 1,67 Streifbandzeitung über 250 g bis 500 g 1,67 140 90 0 353 250 50 251 500 Einlieferung in Filiale oder Großannahmestelle, bei mehr als 500 Stück immer in Großannahmestelle. Mit Produkt- oder Internetmarke ist die Einlieferung über Briefkasten möglich. Nutzung exklusiv f�ür Vertragspartner der Deutsche Post Presse Distribution oder gewerbliche Einrichtungen des Pressehandels. https://www.deutschepost.de/de/p/presse-distribution/produkte/streifbandzeitung.html nein nein
19 01.01.2021 405 N Streifbandzeitung bis 1000 g 2,5 Streifbandzeitung über 500 g bis 1000 g 2,5 140 90 0 353 250 50 501 1000 Einlieferung in Filiale oder Großannahmestelle, bei mehr als 500 Stück immer in Großannahmestelle. Mit Produkt- oder Internetmarke ist die Einlieferung über Briefkasten möglich. Nutzung exklusiv f�ür Vertragspartner der Deutsche Post Presse Distribution oder gewerbliche Einrichtungen des Pressehandels. https://www.deutschepost.de/de/p/presse-distribution/produkte/streifbandzeitung.html nein nein
20 01.01.2021 1 1002 N Standardbrief Integral + EINSCHREIBEN EINWURF 3 Standardbrief 0,8 EINSCHREIBEN EINWURF 2,2 140 90 0 235 125 5 0 20 Die Länge muss mindestens das 1,4-fache der Breite betragen. Preis nach UStG umsatzsteuerfrei. Ein Standardbrief bis 20 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 20 EUR, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/e/einschreiben.html nein nein
21 01.01.2021 1 1007 N Standardbrief Integral + EINSCHREIBEN 3,3 Standardbrief 0,8 EINSCHREIBEN 2,5 140 90 0 235 125 5 0 20 Die Länge muss mindestens das 1,4-fache der Breite betragen. Preis nach UStG umsatzsteuerfrei. Ein Standardbrief bis 20 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/e/einschreiben.html nein nein
22 01.01.2021 1 1009 N Standardbrief Integral + EINSCHREIBEN + EIGENHÄNDIG 5,5 Standardbrief 0,8 EINSCHREIBEN + EIGENHÄNDIG 4,7 140 90 0 235 125 5 0 20 Die Länge muss mindestens das 1,4-fache der Breite betragen. Preis nach UStG umsatzsteuerfrei. Ein Standardbrief bis 20 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/e/einschreiben.html nein nein
23 01.01.2021 1 1012 N Kompaktbrief Integral + EINSCHREIBEN EINWURF 3,15 Kompaktbrief 0,95 EINSCHREIBEN EINWURF 2,2 100 70 0 235 125 10 0 50 Die Länge muss mindestens das 1,4-fache der Breite betragen. Preis nach UStG umsatzsteuerfrei. Ein Kompaktbrief bis 50 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 20 EUR, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/e/einschreiben.html nein nein
24 01.01.2021 1 1017 N Kompaktbrief Integral + EINSCHREIBEN 3,45 Kompaktbrief 0,95 EINSCHREIBEN 2,5 100 70 0 235 125 10 0 50 Die Länge muss mindestens das 1,4-fache der Breite betragen. Preis nach UStG umsatzsteuerfrei. Ein Kompaktbrief bis 50 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/e/einschreiben.html nein nein
25 01.01.2021 1 1019 N Kompaktbrief Integral + EINSCHREIBEN + EIGENHÄNDIG 5,65 Kompaktbrief 0,95 EINSCHREIBEN + EIGENHÄNDIG 4,7 100 70 0 235 125 10 0 50 Die Länge muss mindestens das 1,4-fache der Breite betragen. Preis nach UStG umsatzsteuerfrei. Ein Kompaktbrief bis 50 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/e/einschreiben.html nein nein
26 01.01.2021 1 1022 N Großbrief Integral + EINSCHREIBEN EINWURF 3,75 Großbrief 1,55 EINSCHREIBEN EINWURF 2,2 100 70 0 353 250 20 0 500 Preis nach UStG umsatzsteuerfrei. Ein Großbrief bis 500 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 20 EUR, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/e/einschreiben.html nein nein
27 01.01.2021 1 1027 N Großbrief Integral + EINSCHREIBEN 4,05 Großbrief 1,55 EINSCHREIBEN 2,5 100 70 0 353 250 20 0 500 Preis nach UStG umsatzsteuerfrei. Ein Großbrief bis 500 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/e/einschreiben.html nein nein
28 01.01.2021 1 1029 N Großbrief Integral + EINSCHREIBEN + EIGENHÄNDIG 6,25 Großbrief 1,55 EINSCHREIBEN + EIGENHÄNDIG 4,7 100 70 0 353 250 20 0 500 Preis nach UStG umsatzsteuerfrei. Ein Großbrief bis 500 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/e/einschreiben.html nein nein
29 01.01.2021 1 1032 N Maxibrief Integral + EINSCHREIBEN EINWURF 4,9 Maxibrief 2,7 EINSCHREIBEN EINWURF 2,2 100 70 0 353 250 50 0 1000 Preis nach UStG umsatzsteuerfrei. Ein Maxibrief bis 1000 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 20 EUR, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/e/einschreiben.html nein nein
30 01.01.2021 1 1037 N Maxibrief Integral + EINSCHREIBEN 5,2 Maxibrief 2,7 EINSCHREIBEN 2,5 100 70 0 353 250 50 0 1000 Preis nach UStG umsatzsteuerfrei. Ein Maxibrief bis 1000 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/e/einschreiben.html nein nein
31 01.01.2021 1 1039 N Maxibrief Integral + EINSCHREIBEN + EIGENHÄNDIG 7,4 Maxibrief 2,7 EINSCHREIBEN + EIGENHÄNDIG 4,7 100 70 0 353 250 50 0 1000 Preis nach UStG umsatzsteuerfrei. Ein Maxibrief bis 1000 g, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/e/einschreiben.html nein nein
32 01.01.2021 1 1042 N Maxibrief Integral + Zusatzentgelt MBf + EINSCHREIBEN EINWURF 7,1 Maxibrief 2,7 Zusatzentgelt MBf + EINSCHREIBEN EINWURF 4,4 100 70 0 600 300 150 0 2000 Höchstmaße alternativ: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Ein Maxibrief bis 2000 g mit einem Überformat, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 20 EUR, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/e/einschreiben.html nein nein
33 01.01.2021 1 1047 N Maxibrief Integral + Zusatzentgelt MBf + EINSCHREIBEN 7,4 Maxibrief 2,7 Zusatzentgelt MBf + EINSCHREIBEN 4,7 100 70 0 600 300 150 0 2000 Höchstmaße alternativ: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Ein Maxibrief bis 2000 g mit einem Überformat, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/e/einschreiben.html nein nein
34 01.01.2021 1 1049 N Maxibrief Integral + Zusatzentgelt MBf + EINSCHREIBEN + EIGENHÄNDIG 9,6 Maxibrief 2,7 Zusatzentgelt MBf + EINSCHREIBEN + EIGENHÄNDIG 6,9 100 70 0 600 300 150 0 2000 Höchstmaße alternativ: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Ein Maxibrief bis 2000 g mit einem Überformat, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/e/einschreiben.html nein nein
35 01.01.2021 1 1052 N Postkarte Integral + EINSCHREIBEN EINWURF 2,8 Postkarte 0,6 EINSCHREIBEN EINWURF 2,2 140 90 0 235 125 2 Flächengewicht: 150 g/m2 bis 500 g/m2. Die Länge muss mindestens das 1,4-fache der Breite betragen. Preis nach UStG umsatzsteuerfrei. Eine Postkarte, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 20 EUR, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/e/einschreiben.html nein nein
36 01.01.2021 1 1057 N Postkarte Integral + EINSCHREIBEN 3,1 Postkarte 0,6 EINSCHREIBEN 2,5 140 90 0 235 125 2 Flächengewicht: 150 g/m2 bis 500 g/m2. Die Länge muss mindestens das 1,4-fache der Breite betragen. Preis nach UStG umsatzsteuerfrei. Eine Postkarte, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/e/einschreiben.html nein nein
37 01.01.2021 1 1059 N Postkarte Integral + EINSCHREIBEN + EIGENHÄNDIG 5,3 Postkarte 0,6 EINSCHREIBEN + EIGENHÄNDIG 4,7 140 90 0 235 125 2 Flächengewicht: 150 g/m2 bis 500 g/m2. Die Länge muss mindestens das 1,4-fache der Breite betragen. Preis nach UStG umsatzsteuerfrei. Eine Postkarte, Zustellnachweis durch Postmitarbeiter, Sendungsverfolgung per T&T, Haftung bis 25 EUR, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/e/einschreiben.html nein nein
38 01.01.2021 10001 I Standardbrief Intern. GK 1,1 Standardbrief Intern. GK 1,1 140 90 0 235 125 5 0 20 Die Länge muss mindestens das 1,4-fache der Breite betragen. Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände bis 20 g. Die Länge muss mindestens das 1,4-fache der Breite betragen. https://www.deutschepost.de/de/b/briefe-ins-ausland/brief-postkarte-international.html nein nein
39 01.01.2021 10011 I Kompaktbrief Intern. GK 1,7 Kompaktbrief Intern. GK 1,7 140 90 0 235 125 10 0 50 Die Länge muss mindestens das 1,4-fache der Breite betragen. Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände bis 50 g. Die Länge muss mindestens das 1,4-fache der Breite betragen. https://www.deutschepost.de/de/b/briefe-ins-ausland/brief-postkarte-international.html nein nein
40 01.01.2021 10051 I Großbrief Intern. GK 3,7 Großbrief Intern. GK 3,7 140 90 0 600 600 600 0 500 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände bis 500 g. Keine Seite länger als 600 mm. https://www.deutschepost.de/de/b/briefe-ins-ausland/brief-postkarte-international.html nein nein
41 01.01.2021 10071 I Maxibrief Intern. bis 1.000g GK 7 Maxibrief Intern. bis 1.000g GK 7 140 90 0 600 600 600 501 1000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände bis 1000 g. Keine Seite länger als 600 mm. https://www.deutschepost.de/de/b/briefe-ins-ausland/brief-postkarte-international.html nein nein
42 01.01.2021 10091 I Maxibrief Intern. bis 2.000g GK 17 Maxibrief Intern. bis 2.000g GK 17 140 90 0 600 600 600 1001 2000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände bis 2000 g. Keine Seite länger als 600 mm. https://www.deutschepost.de/de/b/briefe-ins-ausland/brief-postkarte-international.html nein nein
43 01.01.2021 1 10162 I Brief Kilotarif international ohne USt + EINSCHREIBEN 4,29 Frankierung Brief Kilotarif Stückentgelt 0,79 EINSCHREIBEN 3,5 140 90 0 600 600 600 0 2000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände. Die Länge muss mindestens das 1,4-fache der Breite betragen. https://www.deutschepost.de/de/b/briefe-ins-ausland/brief-international-kilotarif.html ja nein
44 01.01.2021 10166 I Brief Kilotarif international ohne USt. 0,79 Frankierung Brief Kilotarif Stückentgelt 0,79 140 90 0 600 600 600 0 2000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Für Briefe, Schriftstücke und kleinere Gegenstände. Die Länge muss mindestens das 1,4-fache der Breite betragen. https://www.deutschepost.de/de/b/briefe-ins-ausland/brief-international-kilotarif.html ja nein
45 01.01.2021 10201 I Postkarte Intern. GK 0,95 Postkarte Intern. GK 0,95 140 90 0 235 125 2 Flächengewicht: 150 g/m2 bis 500 g/m2. Die Länge muss mindestens das 1,4-fache der Breite betragen. Preis nach UStG umsatzsteuerfrei. Die Länge muss mindestens das 1,4-fache der Breite betragen. https://www.deutschepost.de/de/b/briefe-ins-ausland/brief-postkarte-international.html nein nein
46 01.01.2021 10246 I Warenpost International XS 3,8 Warenpost International XS 3,8 140 90 0 353 250 30 0 500 Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
47 01.01.2021 10247 I Warenpost International S 5 Warenpost International S 5 140 90 0 600 600 600 0 500 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
48 01.01.2021 10248 I Warenpost International M 9 Warenpost International M 9 140 90 0 600 600 600 501 1000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
49 01.01.2021 10249 I Warenpost International L 19,9 Warenpost International L 19,9 140 90 0 600 600 600 1001 2000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
50 01.01.2021 1 10250 I Warenpost International XS Tracked 6,15 Warenpost International XS Tracked 6,15 140 90 0 353 250 30 0 500 Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
51 01.01.2021 1 10251 I Warenpost International S Tracked 7,35 Warenpost International S Tracked 7,35 140 90 0 600 600 600 0 500 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
52 01.01.2021 1 10252 I Warenpost International M Tracked 11,35 Warenpost International M Tracked 11,35 140 90 0 600 600 600 501 1000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
53 01.01.2021 1 10253 I Warenpost International L Tracked 22,25 Warenpost International L Tracked 22,25 140 90 0 600 600 600 1001 2000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
54 01.01.2021 10254 I Warenpost International XS (EU/USt.) 3,81 Warenpost International XS (EU/USt.) 3,81 140 90 0 353 250 30 0 500 Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
55 01.01.2021 10255 I Warenpost International S (EU/USt.) 4,4 Warenpost International S (EU/USt.) 4,4 140 90 0 600 600 600 0 500 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
56 01.01.2021 10256 I Warenpost International M (EU/USt.) 8,33 Warenpost International M (EU/USt.) 8,33 140 90 0 600 600 600 501 1000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
57 01.01.2021 10257 I Warenpost International L (EU/USt.) 20,23 Warenpost International L (EU/USt.) 20,23 140 90 0 600 600 600 1001 2000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
58 01.01.2021 1 10258 I Warenpost International XS Tracked (EU/USt.) 6,6 Warenpost International XS Tracked (EU/USt.) 6,6 140 90 0 353 250 30 0 500 Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
59 01.01.2021 1 10259 I Warenpost International S Tracked (EU/USt.) 7,2 Warenpost International S Tracked (EU/USt.) 7,2 140 90 0 600 600 600 0 500 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
60 01.01.2021 1 10260 I Warenpost International M Tracked (EU/USt.) 11,13 Warenpost International M Tracked (EU/USt.) 11,13 140 90 0 600 600 600 501 1000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
61 01.01.2021 1 10261 I Warenpost International L Tracked (EU/USt.) 23,03 Warenpost International L Tracked (EU/USt.) 23,03 140 90 0 600 600 600 1001 2000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
62 01.01.2021 10270 I Warenpost Int. KT (EU/USt.) für Internetmarke 1,5 WARENPOST INT KT EU Internetmarke 1,5 140 90 0 600 600 600 0 2000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html ja ja
63 01.01.2021 1 10271 I Warenpost Int. KT Tracked (EU/USt.) für Internetmarke 3,6 WARENPOST INT KT TRACKED EU Internetmarke 3,6 140 90 0 600 600 600 0 2000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html ja ja
64 01.01.2021 10272 I Warenpost Int. KT (Non EU) für Internetmarke 2 WARENPOST INT KT NON EU Internetmarke 2 140 90 0 600 600 600 0 2000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html ja ja
65 01.01.2021 1 10273 I Warenpost Int. KT Tracked (Non EU) für Internetmarke 4,1 WARENPOST INT KT TRACKED NON EU Internetmarke 4,1 140 90 0 600 600 600 0 2000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html ja ja
66 01.01.2021 10280 I Warenpost International XS Unterschrift 7,3 Warenpost International XS Unterschrift 7,3 140 90 0 353 250 30 0 500 Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
67 01.01.2021 10281 I Warenpost International S Unterschrift 8,5 Warenpost International S Unterschrift 8,5 140 90 0 600 600 600 0 500 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
68 01.01.2021 10282 I Warenpost International M Unterschrift 12,5 Warenpost International M Unterschrift 12,5 140 90 0 600 600 600 501 1000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
69 01.01.2021 10283 I Warenpost International L Unterschrift 23,4 Warenpost International L Unterschrift 23,4 140 90 0 600 600 600 1001 2000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
70 01.01.2021 10284 I Warenpost International XS Unterschrift (EU/USt.) 7,97 Warenpost International XS Unterschrift (EU/USt.) 7,97 140 90 0 353 250 30 0 500 Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
71 01.01.2021 10285 I Warenpost International S Unterschrift (EU/USt.) 8,57 Warenpost International S Unterschrift (EU/USt.) 8,57 140 90 0 600 600 600 0 500 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
72 01.01.2021 10286 I Warenpost International M Unterschrift (EU/USt.) 12,5 Warenpost International M Unterschrift (EU/USt.) 12,5 140 90 0 600 600 600 501 1000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
73 01.01.2021 10287 I Warenpost International L Unterschrift (EU/USt.) 24,4 Warenpost International L Unterschrift (EU/USt.) 24,4 140 90 0 600 600 600 1001 2000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html nein ja
74 01.01.2021 10292 I Warenpost Int. KT Unterschrift (EU/USt.) für Internetmarke 4,75 WARENPOST INT KT UNTERSCHRIFT EU Internetmarke 4,75 140 90 0 600 600 600 0 2000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerpflichtig. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html ja ja
75 01.01.2021 10293 I Warenpost Int. KT Unterschrift (Non EU) für Internetmarke 5,25 WARENPOST INT KT UNTERSCHRIFT NON EU Internetmarke 5,25 140 90 0 600 600 600 0 2000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Vertragsprodukt. Umsatzsteuerfrei. Nur Waren als Inhalt, keine schriftlichen Mitteilungen zulässig, eine auf den Inhalt bezogene Rechnung ist zulässig, für Versande in Länder außerhalb der EU ist immer eine Zollinhaltserklärung auf der Sendung anzubringen. https://www.deutschepost.de/de/b/briefe-ins-ausland/warenpost-international.html ja ja
76 01.01.2021 1 11006 I Standardbrief Intern. GK Integral + EINSCHREIBEN 4,6 Standardbrief Intern. GK 1,1 EINSCHREIBEN 3,5 140 90 0 235 125 5 0 20 Die Länge muss mindestens das 1,4-fache der Breite betragen. Preis nach UStG umsatzsteuerfrei. Ein Standardbrief INTERNATIONAL bis 20 g, nachgewiesene Übergabe an Empfänger, Sendungsverfolgung per T&T, Haftung, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/b/briefe-ins-ausland/einschreiben-international.html nein nein
77 01.01.2021 1 11016 I Kompaktbrief Intern. GK Integral + EINSCHREIBEN 5,2 Kompaktbrief Intern. GK 1,7 EINSCHREIBEN 3,5 140 90 0 235 125 10 0 50 Die Länge muss mindestens das 1,4-fache der Breite betragen. Preis nach UStG umsatzsteuerfrei. Ein Kompaktbrief INTERNATIONAL bis 50 g, nachgewiesene Übergabe an Empfänger, Sendungsverfolgung per T&T, Haftung, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/b/briefe-ins-ausland/einschreiben-international.html nein nein
78 01.01.2021 1 11056 I Großbrief Intern. GK Integral + EINSCHREIBEN 7,2 Großbrief Intern. GK 3,7 EINSCHREIBEN 3,5 140 90 0 600 600 600 0 500 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Ein Großbrief INTERNATIONAL bis 500 g, nachgewiesene Übergabe an Empfänger, Sendungsverfolgung per T&T, Haftung, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/b/briefe-ins-ausland/einschreiben-international.html nein nein
79 01.01.2021 1 11076 I Maxibrief Intern. bis 1.000g GK Integral + EINSCHREIBEN 10,5 Maxibrief Intern. bis 1.000g GK 7 EINSCHREIBEN 3,5 140 90 0 600 600 600 501 1000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Ein Maxibrief INTERNATIONAL bis 1000 g, nachgewiesene Übergabe an Empfänger, Sendungsverfolgung per T&T, Haftung, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/b/briefe-ins-ausland/einschreiben-international.html nein nein
80 01.01.2021 1 11096 I Maxibrief Intern. bis 2.000g GK Integral + EINSCHREIBEN 20,5 Maxibrief Intern. bis 2.000g GK 17 EINSCHREIBEN 3,5 140 90 0 600 600 600 1001 2000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Ein Maxibrief INTERNATIONAL bis 2000 g, nachgewiesene Übergabe an Empfänger, Sendungsverfolgung per T&T, Haftung, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/b/briefe-ins-ausland/einschreiben-international.html nein nein
81 01.01.2021 1 11202 I Postkarte Intern. GK Integral + EINSCHREIBEN 4,45 Postkarte Intern. GK 0,95 EINSCHREIBEN 3,5 140 90 0 235 125 2 Flächengewicht: 150 g/m2 bis 500 g/m2. Die Länge muss mindestens das 1,4-fache der Breite betragen. Preis nach UStG umsatzsteuerfrei. Eine Postkarte INTERNATIONAL, nachgewiesene Übergabe an Empfänger, Sendungsverfolgung per T&T, Haftung, Einlieferung über die Filialen der Deutschen Post. https://www.deutschepost.de/de/b/briefe-ins-ausland/einschreiben-international.html nein nein
82 01.01.2021 30092 I Presse Eco 500g 3,5 Presse Eco 500g 3,5 140 90 0 600 600 600 0 500 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Mit Presse Eco 500g versenden Sie Zeitungen und Zeitschriften. https://www.deutschepost.de/de/b/briefe-ins-ausland/presse-international.html nein nein
83 01.01.2021 30112 I Presse Eco 1000g 6,5 Presse Eco 1000g 6,5 140 90 0 600 600 600 501 1000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Mit Presse Eco 1000g versenden Sie Zeitungen und Zeitschriften. https://www.deutschepost.de/de/b/briefe-ins-ausland/presse-international.html nein nein
84 01.01.2021 30132 I Presse Eco 2000g 14 Presse Eco 2000g 14 140 90 0 600 600 600 1001 2000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Mit Presse Eco 2000g versenden Sie Zeitungen und Zeitschriften. https://www.deutschepost.de/de/b/briefe-ins-ausland/presse-international.html nein nein
85 01.01.2021 30202 I Presse Prio 500g 3,7 Presse Prio 500g 3,7 140 90 0 600 600 600 0 500 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Mit Presse Prio 500 g versenden Sie Zeitungen und Zeitschriften. Bitte beachten Sie die Kennzeichnungspflicht der Sendung. https://www.deutschepost.de/de/b/briefe-ins-ausland/presse-international.html nein nein
86 01.01.2021 1 30207 I Presse Prio 500g + EINSCHREIBEN 7,2 Presse Prio 500g 3,7 EINSCHREIBEN 3,5 140 90 0 600 600 600 0 500 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Presse Prio 500g, nachgewiesene Übergabe an Empfänger, Sendungsverfolgung per T&T, Haftung, Einlieferung über die Filialen der Deutschen Post. Bitte beachten Sie die Kennzeichnungspflicht der Sendung. https://www.deutschepost.de/de/b/briefe-ins-ausland/presse-international.html nein nein
87 01.01.2021 30222 I Presse Prio 1000g 7 Presse Prio 1000g 7 140 90 0 600 600 600 501 1000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Mit Presse Prio 1000 g versenden Sie Zeitungen und Zeitschriften. Bitte beachten Sie die Kennzeichnungspflicht der Sendung. https://www.deutschepost.de/de/b/briefe-ins-ausland/presse-international.html nein nein
88 01.01.2021 1 30227 I Presse Prio 1000g + EINSCHREIBEN 10,5 Presse Prio 1000g 7 EINSCHREIBEN 3,5 140 90 0 600 600 600 501 1000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Presse Prio 1000 g, nachgewiesene Übergabe an Empfänger, Sendungsverfolgung per T&T, Haftung, Einlieferung über die Filialen der Deutschen Post. Bitte beachten Sie die Kennzeichnungspflicht der Sendung. https://www.deutschepost.de/de/b/briefe-ins-ausland/presse-international.html nein nein
89 01.01.2021 30242 I Presse Prio 2000g 17 Presse Prio 2000g 17 140 90 0 600 600 600 1001 2000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Mit Presse Prio 2000 g versenden Sie Zeitungen und Zeitschriften. Bitte beachten Sie die Kennzeichnungspflicht der Sendung. https://www.deutschepost.de/de/b/briefe-ins-ausland/presse-international.html nein nein
90 01.01.2021 1 30247 I Presse Prio 2000g + EINSCHREIBEN 20,5 Presse Prio 2000g 17 EINSCHREIBEN 3,5 140 90 0 600 600 600 1001 2000 Höchstmaße: L + B + H = 900 mm, dabei keine Seite länger als 600 mm. Preis nach UStG umsatzsteuerfrei. Presse Prio 2000g, nachgewiesene Übergabe an Empfänger, Sendungsverfolgung per T&T, Haftung, Einlieferung über die Filialen der Deutschen Post. Bitte beachten Sie die Kennzeichnungspflicht der Sendung. https://www.deutschepost.de/de/b/briefe-ins-ausland/presse-international.html nein nein
+15 -11
View File
@@ -105,19 +105,21 @@ class Versandart_sendcloud extends Versanddienstleister
$parcel->EMail = $json->email; $parcel->EMail = $json->email;
$parcel->Telephone = $json->phone; $parcel->Telephone = $json->phone;
$parcel->CountryState = $json->state; $parcel->CountryState = $json->state;
$parcel->CustomsInvoiceNr = $json->invoice_number;
$parcel->CustomsShipmentType = $json->shipment_type;
$parcel->TotalInsuredValue = $json->total_insured_value; $parcel->TotalInsuredValue = $json->total_insured_value;
$parcel->OrderNumber = $json->order_number; $parcel->OrderNumber = $json->order_number;
foreach ($json->positions as $pos) { if (!$this->app->erp->IsEU($json->country)) {
$item = new ParcelItem(); $parcel->CustomsInvoiceNr = $json->invoice_number;
$item->HsCode = $pos->zolltarifnummer; $parcel->CustomsShipmentType = $json->shipment_type;
$item->Description = $pos->bezeichnung; foreach ($json->positions as $pos) {
$item->Quantity = $pos->menge; $item = new ParcelItem();
$item->OriginCountry = $pos->herkunftsland; $item->HsCode = $pos->zolltarifnummer ?? '';
$item->Price = $pos->zolleinzelwert; $item->Description = $pos->bezeichnung;
$item->Weight = $pos->zolleinzelgewicht * 1000; $item->Quantity = $pos->menge;
$parcel->ParcelItems[] = $item; $item->OriginCountry = $pos->herkunftsland ?? '';
$item->Price = $pos->zolleinzelwert;
$item->Weight = $pos->zolleinzelgewicht * 1000;
$parcel->ParcelItems[] = $item;
}
} }
$parcel->Weight = floatval($json->weight) * 1000; $parcel->Weight = floatval($json->weight) * 1000;
$ret = new CreateShipmentResult(); $ret = new CreateShipmentResult();
@@ -154,6 +156,8 @@ class Versandart_sendcloud extends Versanddienstleister
$p = new Product(); $p = new Product();
$p->Id = $item->Id; $p->Id = $item->Id;
$p->Name = $item->Name; $p->Name = $item->Name;
$p->WeightMin = $item->MinWeight / 1000;
$p->WeightMax = $item->MaxWeight / 1000;
$result[] = $p; $result[] = $p;
} }
return $result; return $result;
-410
View File
@@ -1,410 +0,0 @@
<?php
require_once(dirname(__FILE__).'/../class.versanddienstleister.php');
class Versandart_sonstiges extends Versanddienstleister{
private $einstellungen;
private $info;
private $client;
private $credentials;
public $paketmarke_drucker;
public $export_drucker;
public $errors;
/**
* Constructor for Shipment SDK
*
* @param type $api_einstellungen
* @param type $customer_info
*/
function __construct(&$app, $id) {
$this->id = $id;
$this->app = &$app;
$einstellungen_json = $this->app->DB->Select("SELECT einstellungen_json FROM versandarten WHERE id = '$id' LIMIT 1");
$this->paketmarke_drucker = $this->app->DB->Select("SELECT paketmarke_drucker FROM versandarten WHERE id = '$id' LIMIT 1");
$this->export_drucker = $this->app->DB->Select("SELECT export_drucker FROM versandarten WHERE id = '$id' LIMIT 1");
if($einstellungen_json)
{
$this->einstellungen = json_decode($einstellungen_json,true);
}else{
$this->einstellungen = array();
}
$this->credentials = $this->einstellungen;
//$this->errors = array();
$data = $this->einstellungen;
$this->info = $this->einstellungen;
}
public function GetBezeichnung()
{
return 'UPS';
}
function EinstellungenStruktur()
{
return array();
}
public function VersandartMindestgewicht()
{
if(!isset($this->einstellungen['WeightInKG']))return 1;
if($this->einstellungen['WeightInKG'] === '')return 1;
return str_replace(',','.',$this->einstellungen['WeightInKG']);
}
public function Paketmarke($doctyp, $docid, $target = '', $error = false)
{
$id = $docid;
$drucken = $this->app->Secure->GetPOST("drucken");
$anders = $this->app->Secure->GetPOST("anders");
$land = $this->app->Secure->GetPOST("land");
$tracking_again = $this->app->Secure->GetGET("tracking_again");
$versandmit= $this->app->Secure->GetPOST("versandmit");
$trackingsubmit= $this->app->Secure->GetPOST("trackingsubmit");
$versandmitbutton = $this->app->Secure->GetPOST("versandmitbutton");
$tracking= $this->app->Secure->GetPOST("tracking");
$trackingsubmitcancel= $this->app->Secure->GetPOST("trackingsubmitcancel");
$retourenlabel = $this->app->Secure->GetPOST("retourenlabel");
$kg= $this->app->Secure->GetPOST("kg1");
$name= $this->app->Secure->GetPOST("name");
$name2= $this->app->Secure->GetPOST("name2");
$name3= $this->app->Secure->GetPOST("name3");
$strasse= $this->app->Secure->GetPOST("strasse");
$hausnummer= $this->app->Secure->GetPOST("hausnummer");
$plz= $this->app->Secure->GetPOST("plz");
$ort= $this->app->Secure->GetPOST("ort");
$email= $this->app->Secure->GetPOST("email");
$phone= $this->app->Secure->GetPOST("telefon");
$nummeraufbeleg= $this->app->Secure->GetPOST("nummeraufbeleg");
if($sid=="")
$sid= $this->app->Secure->GetGET("sid");
if($zusatz=="express")
$this->app->Tpl->Set('ZUSATZ',"Express");
if($zusatz=="export")
$this->app->Tpl->Set('ZUSATZ',"Export");
$id = $this->app->Secure->GetGET("id");
$drucken = $this->app->Secure->GetPOST("drucken");
$anders = $this->app->Secure->GetPOST("anders");
$land = $this->app->Secure->GetGET("land");
if($land=="")$land = $this->app->Secure->GetPOST("land");
if($name3=="" && $land!=$this->app->erp->Firmendaten("land")) $name3=$name;
$tracking_again = $this->app->Secure->GetGET("tracking_again");
$versandmit= $this->app->Secure->GetPOST("versandmit");
$trackingsubmit= $this->app->Secure->GetPOST("trackingsubmit");
$versandmitbutton = $this->app->Secure->GetPOST("versandmitbutton");
$tracking= $this->app->Secure->GetPOST("tracking");
$trackingsubmitcancel= $this->app->Secure->GetPOST("trackingsubmitcancel");
$retourenlabel = $this->app->Secure->GetPOST("retourenlabel");
if($typ=="DHL" || $typ=="dhl")
$versand = "dhl";
else if($typ=="Intraship")
$versand = "intraship";
else $versand = $typ;
if($sid == "versand")
{
$projekt = $this->app->DB->Select("SELECT projekt FROM versand WHERE id='$id' LIMIT 1");
}else{
$projekt = $this->app->DB->Select("SELECT projekt FROM lieferschein WHERE id='$id' LIMIT 1");
}
if($trackingsubmit!="" || $trackingsubmitcancel!="")
{
if($sid==='versand') {
// falche tracingnummer bei DHL da wir in der Funktion PaketmarkeDHLEmbedded sind
if((strlen($tracking) < 12 || strlen($tracking) > 20) && $trackingsubmitcancel=='' && ($typ==='DHL' || $typ==='Intraship')) {
$this->app->Location->execute("index.php?module=versanderzeugen&action=frankieren&id=$id&land=$land&tracking_again=1");
}
$this->app->DB->Update("UPDATE versand SET versandunternehmen='$versand', tracking='$tracking',
versendet_am=NOW(),versendet_am_zeitstempel=NOW(), abgeschlossen='1',logdatei=NOW() WHERE id='$id' LIMIT 1");
$this->app->erp->VersandAbschluss($id);
$this->app->erp->RunHook('versanderzeugen_frankieren_hook1', 1, $id);
//versand mail an kunden
$this->app->erp->Versandmail($id);
$weiterespaket=$this->app->Secure->GetPOST("weiterespaket");
$lieferscheinkopie=$this->app->Secure->GetPOST("lieferscheinkopie");
if($weiterespaket=='1') {
if($lieferscheinkopie=='1') {
$lieferscheinkopie=0;
}
else {
$lieferscheinkopie=1;
}
//$this->app->erp->LogFile("Lieferscheinkopie $lieferscheinkopie");
$all = $this->app->DB->SelectArr("SELECT * FROM versand WHERE id='$id' LIMIT 1");
$this->app->DB->Insert("INSERT INTO versand (id,adresse,rechnung,lieferschein,versandart,projekt,bearbeiter,versender,versandunternehmen,firma,
keinetrackingmail,gelesen,paketmarkegedruckt,papieregedruckt,weitererlieferschein)
VALUES ('','{$all[0]['adresse']}','{$all[0]['rechnung']}','{$all[0]['lieferschein']}','{$all[0]['versandart']}','{$all[0]['projekt']}',
'{$all[0]['bearbeiter']}','{$all[0]['versender']}','{$all[0]['versandunternehmen']}',
'{$all[0]['firma']}','{$all[0]['keinetrackingmail']}','{$all[0]['gelesen']}',0,$lieferscheinkopie,1)");
$newid = $this->app->DB->GetInsertID();
$this->app->Location->execute('index.php?module=versanderzeugen&action=einzel&id='.$newid);
}
$url = 'index.php?module=versanderzeugen&action=offene';
$lieferschein = $this->app->DB->Select(sprintf('SELECT lieferschein FROM versand WHERE id = %d', $id));
$this->app->erp->RunHook('paketmarke_abschluss_url', 2, $lieferschein, $url);
$this->app->Location->execute($url);
}
//direkt aus dem Lieferschein
if($id > 0) {
$adresse = $this->app->DB->Select("SELECT adresse FROM lieferschein WHERE id='$id' LIMIT 1");
$projekt = $this->app->DB->Select("SELECT projekt FROM lieferschein WHERE id='$id' LIMIT 1");
$kg = $this->app->Secure->GetPOST("kg1");
if($kg=="") {
$kg = $this->app->erp->VersandartMindestgewicht($id);
}
$this->app->DB->Insert("INSERT INTO versand (id,versandunternehmen, tracking,
versendet_am,abgeschlossen,lieferschein,
freigegeben,firma,adresse,projekt,gewicht,paketmarkegedruckt,anzahlpakete)
VALUES ('','$versand','$tracking',NOW(),1,'$id',1,'".$this->app->User->GetFirma()."','$adresse','$projekt','$kg','1','1') ");
$versandId = $this->app->DB->GetInsertID();
$auftrag = $this->app->DB->Select("SELECT auftragid FROM lieferschein WHERE id = '$id'");
$shop = $this->app->DB->Select("SELECT shop FROM auftrag WHERE id = '$auftrag' LIMIT 1");
$auftragabgleich=$this->app->DB->Select("SELECT auftragabgleich FROM shopexport WHERE id='$shop' LIMIT 1");
if($shop > 0 && $auftragabgleich=="1")
{
//$this->LogFile("Tracking gescannt");
$this->app->remote->RemoteUpdateAuftrag($shop,$auftrag);
}
$this->app->erp->sendPaymentStatus($versandId);
$this->app->Location->execute('index.php?module=lieferschein&action=paketmarke&id='.$id);
}
}
if($versandmitbutton!="")
{
if($sid=="versand")
{
$this->app->DB->Update("UPDATE versand SET versandunternehmen='$versandmit',
versendet_am=NOW(),versendet_am_zeitstempel=NOW(),abgeschlossen='1' WHERE id='$id' LIMIT 1");
$this->VersandAbschluss($id);
//versand mail an kunden
$this->Versandmail($id);
header("Location: index.php?module=versanderzeugen&action=offene");
exit;
}
}
if($sid=="versand")
{
// wenn paketmarke bereits gedruckt nur tracking scannen
$paketmarkegedruckt = $this->app->DB->Select("SELECT paketmarkegedruckt FROM versand WHERE id='$id' LIMIT 1");
if($paketmarkegedruckt>=1)
$tracking_again=1;
}
if($anders!="")
{
}
else if(($drucken!="" || $tracking_again=="1") && !$error )
{
if($tracking_again!="1")
{
$kg = (float)(str_replace(',','.',$kg));
$kg = round($kg,2);
$name = substr($this->app->erp->ReadyForPDF($name),0,30);
$name2 = $this->app->erp->ReadyForPDF($name2);
$name3 = $this->app->erp->ReadyForPDF($name3);
$strasse = $this->app->erp->ReadyForPDF($strasse);
$hausnummer = $this->app->erp->ReadyForPDF($hausnummer);
$plz = $this->app->erp->ReadyForPDF($plz);
$ort = $this->app->erp->ReadyForPDF(html_entity_decode($ort));
$land = $this->app->erp->ReadyForPDF($land);
$module = $this->app->Secure->GetGET("module");
//TODO Workarrond fuer lieferschein
if($module=="lieferschein")
{
$lieferschein = $id;
}
else {
$lieferschein = $this->app->DB->Select("SELECT lieferschein FROM versand WHERE id='$id' LIMIT 1");
if($lieferschein <=0) $lieferschein=$id;
}
$projekt = $this->app->DB->Select("SELECT projekt FROM lieferschein WHERE id='$lieferschein' LIMIT 1");
$lieferscheinnummer = $this->app->DB->Select("SELECT belegnr FROM lieferschein WHERE id='$lieferschein' LIMIT 1");
//pruefe ob es auftragsnummer gibt dann nehmen diese
/*
$auftragid = $this->app->DB->Select("SELECT auftragid FROM lieferschein WHERE id='$lieferschein' LIMIT 1");
if($auftragid > 0)
{
$nummeraufbeleg = $this->app->DB->Select("SELECT belegnr FROM auftrag WHERE id='$auftragid' LIMIT 1");
} else {
$nummeraufbeleg = $lieferscheinnummer;
}
*/
$nummeraufbeleg = $lieferscheinnummer;
$rechnung = $this->app->DB->Select("SELECT id FROM rechnung WHERE lieferschein='$lieferschein' LIMIT 1");
$rechnung_data = $this->app->DB->SelectArr("SELECT * FROM rechnung WHERE id='$rechnung' LIMIT 1");
// fuer export
$email = $rechnung_data[0]['email']; //XXX
if($phone=="")
$phone = $rechnung_data[0]['telefon']; //XXX
$rechnungssumme = $rechnung_data[0]['soll']; //XXX
if($rechnung){
$artikel_positionen = $this->app->DB->SelectArr("SELECT * FROM rechnung_position WHERE rechnung='$rechnung'");
} else {
$artikel_positionen = $this->app->DB->SelectArr("SELECT * FROM lieferschein_position WHERE lieferschein='$lieferschein'");
}
$data = $this->einstellungen;
// your customer and api credentials from/for dhl
$credentials = array(
'api_user' => $data['api_user'],
'api_password' => $data['api_password'],
'api_accountnumber' => $data['accountnumber'],
'api_key' => $data['api_key'],
'log' => true
);
// your company info
$info = array(
'company_name' => $data['company_name'],
'street_name' => $data['street_name'],
'street_number' => $data['street_number'],
'zip' => $data['zip'],
'country' => $data['country'],
'city' => $data['city'],
'email' => $data['email'],
'phone' => $data['phone'],
'internet' => $data['internet'],
'contact_person' => $data['contact_person'],
'export_reason' => $data['exportgrund']
);
// receiver details
$customer_details = array(
'name1' => $name,
'name2' => $name2,
'c/o' => $name3,
'street_name' => $strasse,
'street_number' => $hausnummer,
//'country' => 'germany',
'country_code' => $land,
'zip' => $plz,
'city' => $ort,
'email' => $email,
'phone' => $phone,
'ordernumber' => $nummeraufbeleg,
'ordernumber2' => $lieferscheinnummer,
'weight' => $kg,
'amount' => str_replace(",",".",$rechnungssumme),
'currency' => 'EUR'
);
$shipment_details['WeightInKG'] = $data['WeightInKG'];
$shipment_details['LengthInCM'] = $data['LengthInCM'];
$shipment_details['WidthInCM'] = $data['WidthInCM'];
$shipment_details['HeightInCM'] = $data['HeightInCM'];
$shipment_details['PackageType'] = $data['PackageType'];
$shipment_details['service_code'] = $data['service_code'];
$shipment_details['service_description'] = $data['service_description'];
$shipment_details['package_code'] = $data['package_code'];
$shipment_details['package_description'] = $data['package_description'];
$shipment_details['exportgrund'] = $data['exportgrund'];
if($data['note']=="") $data['note'] = $rechnungsnummer;
//$response = $this->createShipment($customer_details,$shipment_details);
$data['sonstiges_drucker'] = $this->paketmarke_drucker;
$data['druckerlogistikstufe2'] = $this->export_drucker;
if($this->app->erp->GetStandardPaketmarkendrucker()>0)
$data['sonstiges_drucker'] = $this->app->erp->GetStandardPaketmarkendrucker();
if($this->app->erp->GetStandardVersanddrucker($projekt)>0)
$data['druckerlogistikstufe2'] = $this->app->erp->GetStandardVersanddrucker($projekt);
}
if($this->app->Secure->GetPOST('drucken') || $this->app->Secure->GetPOST('anders'))
{
}else{
}
}
//$this->info = $customer_info;
if($target)$this->app->Tpl->Parse($target,'versandarten_sonstiges.tpl');
}
public function Export($daten)
{
}
private function log($message) {
if (isset($this->einstellungen['log'])) {
if (is_array($message) || is_object($message)) {
error_log(print_r($message, true));
} else {
error_log($message);
}
}
}
}
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -6417,7 +6417,7 @@ function AdresseVerein()
if(bearbeiter!="",bearbeiter,a2.name) as bearbeiter, if(bearbeiter!="",bearbeiter,a2.name) as bearbeiter,
CONCAT(UCASE(LEFT(d.typ, 1)), SUBSTRING(d.typ, 2)) as art, CONCAT(UCASE(LEFT(d.typ, 1)), SUBSTRING(d.typ, 2)) as art,
CONCAT(IF(d.sent = 1, "JA", "NEIN"),"<a data-type=dokumente data-id=", d.id, "></a>") as gesendet, CONCAT(IF(d.sent = 1, "JA", "NEIN"),"<a data-type=dokumente data-id=", d.id, "></a>") as gesendet,
"" as pdf, concat("<a href=\"index.php?module=dateien&action=send&id=",(SELECT datei FROM datei_stichwoerter WHERE subjekt="anhang" AND objekt="dokument" AND parameter = d.id LIMIT 1),"\"><img src=./themes/' . $this->app->Conf->WFconf['defaulttheme'] . '/images/pdf.svg></a>") as pdf,
concat("1","-",d.id) as did, concat("1","-",d.id) as did,
d.content as suchtext, d.content as suchtext,
d.internebezeichnung d.internebezeichnung
+14
View File
@@ -2072,6 +2072,20 @@ select a.kundennummer, (SELECT name FROM adresse a2 WHERE a2.kundennummer = a.ku
$newarr[] = $arr[$i]['name']; $newarr[] = $arr[$i]['name'];
break; break;
case "fibu_objekte":
$arr = $this->app->DB->SelectArr("SELECT CONCAT(".$this->app->erp->FormatUCfirst('typ').",'-',id,'-',info) as objekt FROM fibu_objekte WHERE info LIKE '%$term%' LIMIT 20");
$carr = !empty($arr)?count($arr):0;
for($i = 0; $i < $carr; $i++)
$newarr[] = $arr[$i]['objekt'];
break;
case "fibu_belege":
$arr = $this->app->DB->SelectArr("SELECT CONCAT(".$this->app->erp->FormatUCfirst('typ').",'-',id,'-',info) as objekt FROM fibu_objekte WHERE info LIKE '%$term%' AND typ IN ('auftrag','rechnung','gutschrift','verbindlichkeit') LIMIT 20");
$carr = !empty($arr)?count($arr):0;
for($i = 0; $i < $carr; $i++)
$newarr[] = $arr[$i]['objekt'];
break;
case "vpeartikel": case "vpeartikel":
$arr = $this->app->DB->SelectArr("SELECT DISTINCT vpe FROM verkaufspreise WHERE geloescht=0 AND vpe LIKE '%$term%' ORDER by vpe"); $arr = $this->app->DB->SelectArr("SELECT DISTINCT vpe FROM verkaufspreise WHERE geloescht=0 AND vpe LIKE '%$term%' ORDER by vpe");
$carr = !empty($arr)?count($arr):0; $carr = !empty($arr)?count($arr):0;
+20 -21
View File
@@ -907,14 +907,14 @@ class Artikel extends GenArtikel {
$defaultorder = 7; $defaultorder = 7;
// headings // headings
$heading = array('Artikel', 'Nummer','Menge', 'Einheit', 'Lager', 'Reserviert', 'Men&uuml;'); $heading = array('Artikel', 'Nummer','Referenz','Menge', 'Einheit', 'Lager', 'Reserviert', 'Men&uuml;');
$width = array('50%', '10%', '5%', '5%','5%', '5%', '9%'); $width = array('50%', '10%', '5%', '5%', '5%','5%', '5%', '9%');
$findcols = array('a.name_de', 'a.nummer', 's.menge','a.einheit', $findcols = array('a.name_de', 'a.nummer','s.referenz', 's.menge','a.einheit',
'lag.menge', 'CASE WHEN (SELECT SUM(lr.menge) FROM lager_reserviert lr WHERE lr.artikel=a.id) > 0 'lag.menge', 'CASE WHEN (SELECT SUM(lr.menge) FROM lager_reserviert lr WHERE lr.artikel=a.id) > 0
THEN (SELECT SUM(lr.menge) FROM lager_reserviert lr WHERE lr.artikel=a.id) THEN (SELECT SUM(lr.menge) FROM lager_reserviert lr WHERE lr.artikel=a.id)
ELSE 0 ELSE 0
END','id'); END','id');
$searchsql = array('a.name_de', 'a.nummer','a.einheit', 's.menge','s.art',"CONCAT(IF(s.art='' OR s.art='et','Einkaufsteil',''),IF(s.art='it','Informationsteil/Dienstleistung',''),IF(s.art='bt','Beistellung',''))"); $searchsql = array('a.name_de', 'a.nummer','s.referenz','a.einheit', 's.menge','s.art',"CONCAT(IF(s.art='' OR s.art='et','Einkaufsteil',''),IF(s.art='it','Informationsteil/Dienstleistung',''),IF(s.art='bt','Beistellung',''))");
$menu = "<table cellpadding=0 cellspacing=0>"; $menu = "<table cellpadding=0 cellspacing=0>";
$menu .= "<tr>"; $menu .= "<tr>";
@@ -932,20 +932,19 @@ class Artikel extends GenArtikel {
$alignright = array(3,5,6); $alignright = array(3,5,6);
// SQL statement // SQL statement
$sql = "SELECT SQL_CALC_FOUND_ROWS s.id, $sql = "SELECT SQL_CALC_FOUND_ROWS
CONCAT('<a href=\"index.php?module=artikel&action=edit&id=',a.id,'\" target=\"_blank\">',a.name_de,'</a>&nbsp;', s.id,
IF(s.art='it','<br><i style=color:#999>- Informationsteil/Dienstleistung</i>',''),IF(s.art='bt','<br><i style=color:#999>- Beistellung</i>',''), COALESCE((SELECT GROUP_CONCAT('<br><i style=color:#999>- ', art.nummer, ' ', art.name_de, ' (', alt.reason, ')', '</i>' SEPARATOR '') FROM parts_list_alternative AS alt INNER JOIN artikel AS art ON art.id = alt.alternative_article_id WHERE alt.parts_list_id = s.id), '')) as artikel, CONCAT('<a href=\"index.php?module=artikel&action=edit&id=',a.id,'\" target=\"_blank\">',a.name_de,'</a>&nbsp;',
CONCAT('<a href=\"index.php?module=artikel&action=edit&id=',a.id,'\" target=\"_blank\">',a.nummer,'</a>') as nummer, IF(s.art='it','<br><i style=color:#999>- Informationsteil/Dienstleistung</i>',''),IF(s.art='bt','<br><i style=color:#999>- Beistellung</i>',''), COALESCE((SELECT GROUP_CONCAT('<br><i style=color:#999>- ', art.nummer, ' ', art.name_de, ' (', alt.reason, ')', '</i>' SEPARATOR '') FROM parts_list_alternative AS alt INNER JOIN artikel AS art ON art.id = alt.alternative_article_id WHERE alt.parts_list_id = s.id), '')) as artikel,
".$this->app->erp->FormatMenge('s.menge').' as menge, a.einheit, CONCAT('<a href=\"index.php?module=artikel&action=edit&id=',a.id,'\" target=\"_blank\">',a.nummer,'</a>') as nummer,
s.referenz,
'.$this->app->erp->FormatMenge('ifnull(lag.menge,0)').' as lager, ".$this->app->erp->FormatMenge('s.menge').' as menge, a.einheit,
'.$this->app->erp->FormatMenge('ifnull(lag.menge,0)').' as lager,
CASE WHEN (SELECT SUM(lr.menge) FROM lager_reserviert lr WHERE lr.artikel=a.id) > 0 CASE WHEN (SELECT SUM(lr.menge) FROM lager_reserviert lr WHERE lr.artikel=a.id) > 0
THEN (SELECT '.$this->app->erp->FormatMenge('SUM(lr.menge)')." FROM lager_reserviert lr WHERE lr.artikel=a.id) THEN (SELECT '.$this->app->erp->FormatMenge('SUM(lr.menge)')." FROM lager_reserviert lr WHERE lr.artikel=a.id)
ELSE 0 ELSE 0
END as reserviert, END as reserviert,
s.id as menu
s.id as menu
FROM stueckliste s FROM stueckliste s
INNER JOIN artikel a ON s.artikel=a.id INNER JOIN artikel a ON s.artikel=a.id
LEFT JOIN (SELECT sum(lpi.menge) as menge ,lpi.artikel LEFT JOIN (SELECT sum(lpi.menge) as menge ,lpi.artikel
@@ -6090,7 +6089,7 @@ class Artikel extends GenArtikel {
$stueck = $this->app->erp->ArtikelAnzahlLagerStueckliste($id); $stueck = $this->app->erp->ArtikelAnzahlLagerStueckliste($id);
$this->ArtikelStuecklisteImport('TAB3'); // $this->ArtikelStuecklisteImport('TAB3');
$url = 'index.php?module=artikel&action=stueckliste&cmd=getbaum&id='.$id; $url = 'index.php?module=artikel&action=stueckliste&cmd=getbaum&id='.$id;
$this->app->Tpl->Set('URL',$url); $this->app->Tpl->Set('URL',$url);
$this->app->Tpl->Add('TAB1',"<center>"); $this->app->Tpl->Add('TAB1',"<center>");
@@ -6255,8 +6254,8 @@ class Artikel extends GenArtikel {
{ {
$id = $this->app->Secure->GetGET('id'); $id = $this->app->Secure->GetGET('id');
if($id > 0){ if($id > 0){
$result = $this->app->DB->SelectArr("SELECT a.nummer, a.name_de, a.hersteller,a.herstellernummer, REPLACE(TRIM(s.menge)+0,'.',',') as menge, s.referenz, s.place, s.layer, s.wert, s.bauform, s.zachse,s.xpos, s.ypos, s.art FROM stueckliste s $sql = "SELECT avon.nummer as stuecklistevon, a.nummer, a.name_de, a.hersteller,a.herstellernummer, REPLACE(TRIM(s.menge)+0,'.',',') as menge, s.referenz, s.place, s.layer, s.wert, s.bauform, s.zachse,s.xpos, s.ypos, s.art FROM stueckliste s LEFT JOIN artikel a ON a.id=s.artikel LEFT JOIN artikel avon ON avon.id=s.stuecklistevonartikel WHERE s.stuecklistevonartikel='$id'";
LEFT JOIN artikel a ON a.id=s.artikel WHERE s.stuecklistevonartikel='$id'"); $result = $this->app->DB->SelectArr($sql);
} }
header('Content-type: text/csv'); header('Content-type: text/csv');
header('Content-Disposition: attachment; filename=file.csv'); header('Content-Disposition: attachment; filename=file.csv');
+2 -1
View File
@@ -122,7 +122,8 @@ class Artikelbaum
public function ArtikelbaumList() public function ArtikelbaumList()
{ {
$this->app->erp->MenuEintrag('index.php?module=artikelbaum&action=list','&Uuml;bersicht'); $this->app->erp->MenuEintrag('index.php?module=artikelkategorien&action=list','Artikelkategorien');
$this->app->erp->MenuEintrag('index.php?module=artikelbaum&action=list','Artikelbaum');
$id = $this->app->Secure->GetGET('id'); $id = $this->app->Secure->GetGET('id');
$url = 'index.php?module=artikelbaum&action=baumajax&id='.$id; $url = 'index.php?module=artikelbaum&action=baumajax&id='.$id;
$this->app->Tpl->Set('URL',$url); $this->app->Tpl->Set('URL',$url);
+249
View File
@@ -0,0 +1,249 @@
<?php
/*
* Copyright (c) 2022 OpenXE project
*/
use Xentral\Components\Database\Exception\QueryFailureException;
class Artikelkategorien {
function __construct($app, $intern = false) {
$this->app = $app;
if ($intern)
return;
$this->app->ActionHandlerInit($this);
$this->app->ActionHandler("list", "artikelkategorien_list");
$this->app->ActionHandler("create", "artikelkategorien_edit"); // This automatically adds a "New" button
$this->app->ActionHandler("edit", "artikelkategorien_edit");
$this->app->ActionHandler("delete", "artikelkategorien_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 "artikelkategorien_list":
$allowed['artikelkategorien_list'] = array('list');
$heading = array('','','Bezeichnung', 'Projekt','Gel&ouml;scht', 'Men&uuml;');
$width = array('1%','1%','30%','10%','1%','1%'); // Fill out manually later
// columns that are aligned right (numbers etc)
// $alignright = array(4,5,6,7,8);
$findcols = array('a.id','a.id','a.bezeichnung', 'a.projekt');
$searchsql = array('a.bezeichnung');
$defaultorder = 1;
$defaultorderdesc = 0;
$dropnbox = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`, CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',a.id,'\" />') AS `auswahl`";
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" . "<a href=\"index.php?module=artikelkategorien&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=artikelkategorien&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 a.id, $dropnbox, a.bezeichnung, p.abkuerzung, a.geloescht, a.id FROM artikelkategorien a LEFT JOIN projekt p ON a.projekt = p.id";
$where = "1";
$count = "SELECT count(DISTINCT id) FROM artikelkategorien WHERE $where";
// $groupby = "";
break;
}
$erg = false;
foreach ($erlaubtevars as $k => $v) {
if (isset($$v)) {
$erg[$v] = $$v;
}
}
return $erg;
}
function artikelkategorien_list() {
$this->app->erp->MenuEintrag("index.php?module=artikelkategorien&action=list", "&Uuml;bersicht");
$this->app->erp->MenuEintrag("index.php?module=artikelkategorien&action=create", "Neu anlegen");
$this->app->erp->MenuEintrag("index.php?module=artikelbaum&action=list", "Artikelbaum");
// $this->app->erp->MenuEintrag("index.php", "Zur&uuml;ck");
$this->app->YUI->TableSearch('TAB1', 'artikelkategorien_list', "show", "", "", basename(__FILE__), __CLASS__);
$this->app->Tpl->Parse('PAGE', "artikelkategorien_list.tpl");
}
public function artikelkategorien_delete() {
$id = (int) $this->app->Secure->GetGET('id');
$this->app->DB->Delete("DELETE FROM `artikelkategorien` WHERE `id` = '{$id}'");
$this->app->Tpl->Set('MESSAGE', "<div class=\"error\">Der Eintrag wurde gel&ouml;scht.</div>");
$this->artikelkategorien_list();
}
/*
* Edit artikelkategorien item
* If id is empty, create a new one
*/
function artikelkategorien_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);
$this->app->erp->MenuEintrag("index.php?module=artikelkategorien&action=edit&id=$id", "Details");
$this->app->erp->MenuEintrag("index.php?module=artikelkategorien&action=list", "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';
}
if ($submit != '')
{
// Write to database
// Add checks here
$input['projekt'] = $this->app->erp->ReplaceProjekt(true,$input['projekt'],true); // Parameters: Target db?, value, from form?
$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 artikelkategorien (".$columns.") VALUES (".$values.") ON DUPLICATE KEY UPDATE ".$update;
// echo($sql);
$this->app->DB->Update($sql);
if ($id == 'NULL') {
$msg = $this->app->erp->base64_url_encode("<div class=\"success\">Das Element wurde erfolgreich angelegt.</div>");
header("Location: index.php?module=artikelkategorien&action=list&msg=$msg");
} else {
$this->app->Tpl->Set('MESSAGE', "<div class=\"success\">Die Einstellungen wurden erfolgreich &uuml;bernommen.</div>");
}
}
// Load values again from database
$dropnbox = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`, CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',a.id,'\" />') AS `auswahl`";
$result = $this->app->DB->SelectArr("SELECT SQL_CALC_FOUND_ROWS a.id, $dropnbox, a.bezeichnung, a.next_nummer, a.projekt, a.geloescht, a.externenummer, a.parent, a.steuer_erloese_inland_normal, a.steuer_aufwendung_inland_normal, a.steuer_erloese_inland_ermaessigt, a.steuer_aufwendung_inland_ermaessigt, a.steuer_erloese_inland_steuerfrei, a.steuer_aufwendung_inland_steuerfrei, a.steuer_erloese_inland_innergemeinschaftlich, a.steuer_aufwendung_inland_innergemeinschaftlich, a.steuer_erloese_inland_eunormal, a.steuer_erloese_inland_nichtsteuerbar, a.steuer_erloese_inland_euermaessigt, a.steuer_aufwendung_inland_nichtsteuerbar, a.steuer_aufwendung_inland_eunormal, a.steuer_aufwendung_inland_euermaessigt, a.steuer_erloese_inland_export, a.steuer_aufwendung_inland_import, a.steuertext_innergemeinschaftlich, a.steuertext_export, a.id FROM artikelkategorien a"." WHERE 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->Tpl->Set('PROJEKT',$this->app->erp->ReplaceProjekt(false,$result[0]['projekt'],false)); // Parameters: Target db?, value, from form?
$this->app->YUI->AutoComplete('projekt', 'projektname', 1);
// $this->SetInput($input);
$this->app->Tpl->Parse('PAGE', "artikelkategorien_edit.tpl");
}
/**
* Get all paramters from html form and save into $input
*/
public function GetInput(): array {
$input = array();
//$input['EMAIL'] = $this->app->Secure->GetPOST('email');
$input['bezeichnung'] = $this->app->Secure->GetPOST('bezeichnung');
$input['next_nummer'] = $this->app->Secure->GetPOST('next_nummer');
$input['projekt'] = $this->app->Secure->GetPOST('projekt');
$input['geloescht'] = $this->app->Secure->GetPOST('geloescht');
$input['externenummer'] = $this->app->Secure->GetPOST('externenummer');
$input['parent'] = $this->app->Secure->GetPOST('parent');
$input['steuer_erloese_inland_normal'] = $this->app->Secure->GetPOST('steuer_erloese_inland_normal');
$input['steuer_aufwendung_inland_normal'] = $this->app->Secure->GetPOST('steuer_aufwendung_inland_normal');
$input['steuer_erloese_inland_ermaessigt'] = $this->app->Secure->GetPOST('steuer_erloese_inland_ermaessigt');
$input['steuer_aufwendung_inland_ermaessigt'] = $this->app->Secure->GetPOST('steuer_aufwendung_inland_ermaessigt');
$input['steuer_erloese_inland_steuerfrei'] = $this->app->Secure->GetPOST('steuer_erloese_inland_steuerfrei');
$input['steuer_aufwendung_inland_steuerfrei'] = $this->app->Secure->GetPOST('steuer_aufwendung_inland_steuerfrei');
$input['steuer_erloese_inland_innergemeinschaftlich'] = $this->app->Secure->GetPOST('steuer_erloese_inland_innergemeinschaftlich');
$input['steuer_aufwendung_inland_innergemeinschaftlich'] = $this->app->Secure->GetPOST('steuer_aufwendung_inland_innergemeinschaftlich');
$input['steuer_erloese_inland_eunormal'] = $this->app->Secure->GetPOST('steuer_erloese_inland_eunormal');
$input['steuer_erloese_inland_nichtsteuerbar'] = $this->app->Secure->GetPOST('steuer_erloese_inland_nichtsteuerbar');
$input['steuer_erloese_inland_euermaessigt'] = $this->app->Secure->GetPOST('steuer_erloese_inland_euermaessigt');
$input['steuer_aufwendung_inland_nichtsteuerbar'] = $this->app->Secure->GetPOST('steuer_aufwendung_inland_nichtsteuerbar');
$input['steuer_aufwendung_inland_eunormal'] = $this->app->Secure->GetPOST('steuer_aufwendung_inland_eunormal');
$input['steuer_aufwendung_inland_euermaessigt'] = $this->app->Secure->GetPOST('steuer_aufwendung_inland_euermaessigt');
$input['steuer_erloese_inland_export'] = $this->app->Secure->GetPOST('steuer_erloese_inland_export');
$input['steuer_aufwendung_inland_import'] = $this->app->Secure->GetPOST('steuer_aufwendung_inland_import');
$input['steuertext_innergemeinschaftlich'] = $this->app->Secure->GetPOST('steuertext_innergemeinschaftlich');
$input['steuertext_export'] = $this->app->Secure->GetPOST('steuertext_export');
return $input;
}
/*
* Set all fields in the page corresponding to $input
*/
function SetInput($input) {
// $this->app->Tpl->Set('EMAIL', $input['email']);
$this->app->Tpl->Set('BEZEICHNUNG', $input['bezeichnung']);
$this->app->Tpl->Set('NEXT_NUMMER', $input['next_nummer']);
$this->app->Tpl->Set('PROJEKT', $input['projekt']);
$this->app->Tpl->Set('GELOESCHT', $input['geloescht']);
$this->app->Tpl->Set('EXTERNENUMMER', $input['externenummer']);
$this->app->Tpl->Set('PARENT', $input['parent']);
$this->app->Tpl->Set('STEUER_ERLOESE_INLAND_NORMAL', $input['steuer_erloese_inland_normal']);
$this->app->Tpl->Set('STEUER_AUFWENDUNG_INLAND_NORMAL', $input['steuer_aufwendung_inland_normal']);
$this->app->Tpl->Set('STEUER_ERLOESE_INLAND_ERMAESSIGT', $input['steuer_erloese_inland_ermaessigt']);
$this->app->Tpl->Set('STEUER_AUFWENDUNG_INLAND_ERMAESSIGT', $input['steuer_aufwendung_inland_ermaessigt']);
$this->app->Tpl->Set('STEUER_ERLOESE_INLAND_STEUERFREI', $input['steuer_erloese_inland_steuerfrei']);
$this->app->Tpl->Set('STEUER_AUFWENDUNG_INLAND_STEUERFREI', $input['steuer_aufwendung_inland_steuerfrei']);
$this->app->Tpl->Set('STEUER_ERLOESE_INLAND_INNERGEMEINSCHAFTLICH', $input['steuer_erloese_inland_innergemeinschaftlich']);
$this->app->Tpl->Set('STEUER_AUFWENDUNG_INLAND_INNERGEMEINSCHAFTLICH', $input['steuer_aufwendung_inland_innergemeinschaftlich']);
$this->app->Tpl->Set('STEUER_ERLOESE_INLAND_EUNORMAL', $input['steuer_erloese_inland_eunormal']);
$this->app->Tpl->Set('STEUER_ERLOESE_INLAND_NICHTSTEUERBAR', $input['steuer_erloese_inland_nichtsteuerbar']);
$this->app->Tpl->Set('STEUER_ERLOESE_INLAND_EUERMAESSIGT', $input['steuer_erloese_inland_euermaessigt']);
$this->app->Tpl->Set('STEUER_AUFWENDUNG_INLAND_NICHTSTEUERBAR', $input['steuer_aufwendung_inland_nichtsteuerbar']);
$this->app->Tpl->Set('STEUER_AUFWENDUNG_INLAND_EUNORMAL', $input['steuer_aufwendung_inland_eunormal']);
$this->app->Tpl->Set('STEUER_AUFWENDUNG_INLAND_EUERMAESSIGT', $input['steuer_aufwendung_inland_euermaessigt']);
$this->app->Tpl->Set('STEUER_ERLOESE_INLAND_EXPORT', $input['steuer_erloese_inland_export']);
$this->app->Tpl->Set('STEUER_AUFWENDUNG_INLAND_IMPORT', $input['steuer_aufwendung_inland_import']);
$this->app->Tpl->Set('STEUERTEXT_INNERGEMEINSCHAFTLICH', $input['steuertext_innergemeinschaftlich']);
$this->app->Tpl->Set('STEUERTEXT_EXPORT', $input['steuertext_export']);
}
}
+63 -4
View File
@@ -848,7 +848,7 @@ class Auftrag extends GenAuftrag
FROM auftrag auf FROM auftrag auf
INNER JOIN auftrag_position ON auf.id = auftrag_position.auftrag INNER JOIN auftrag_position ON auf.id = auftrag_position.auftrag
INNER JOIN artikel ON auftrag_position.artikel = artikel.id INNER JOIN artikel ON auftrag_position.artikel = artikel.id
WHERE auf.status <> 'abgeschlossen' AND auf.belegnr <> '' WHERE auf.status NOT IN ('abgeschlossen','storniert') AND auf.belegnr <> ''
ORDER BY urspruengliches_lieferdatum ASC, auf.belegnr ASC, auftrag_position.sort ASC ORDER BY urspruengliches_lieferdatum ASC, auf.belegnr ASC, auftrag_position.sort ASC
) a"; ) a";
@@ -3182,6 +3182,11 @@ class Auftrag extends GenAuftrag
); );
} }
$this->app->Tpl->Add(
'ZAHLUNGEN',
$this->AuftragZahlung(true)
);
// schaue ob es eine GS zu diesem Auftrag gibt // schaue ob es eine GS zu diesem Auftrag gibt
// schaue ob es eine GS zu diesem Auftrag gibt // schaue ob es eine GS zu diesem Auftrag gibt
//$gutschriftid = $this->app->DB->Select("SELECT id FROM gutschrift WHERE rechnungid='$rechnungid' LIMIT 1"); //$gutschriftid = $this->app->DB->Select("SELECT id FROM gutschrift WHERE rechnungid='$rechnungid' LIMIT 1");
@@ -3409,7 +3414,47 @@ class Auftrag extends GenAuftrag
<tr><td><b>Lieferadresse:</b><br><br>$lieferadresse</td></tr></table>"; <tr><td><b>Lieferadresse:</b><br><br>$lieferadresse</td></tr></table>";
} }
/* Build the html output for minidetail containing the payments
* @param bool $return
*
* @return string
*/
function AuftragZahlung($return=false)
{
$id = $this->app->Secure->GetGET('id');
$zahlungen = $this->app->erp->GetZahlungen($id,'auftrag',true);
if (!empty($zahlungen)) {
$et = new EasyTable($this->app);
$et->headings = array('Datum','Beleg','Betrag','W&auml;hrung');
foreach ($zahlungen as $zahlung) {
$row = array(
$zahlung['datum'],
"<a href=\"index.php?module=".$zahlung['doc_typ']."&action=edit&id=".$zahlung['doc_id']."\">
".ucfirst($zahlung['doc_typ'])."
".$zahlung['doc_info']."
</a>",
$zahlung['betrag'],
$zahlung['waehrung']
);
$et->AddRow($row);
}
$salden = $this->app->erp->GetSaldenDokument($id,'auftrag',true);
foreach ($salden as $saldo) {
$row = array(
'',
'<b>Saldo</b>',
"<b>".$saldo['betrag']."</b>",
"<b>".$saldo['waehrung']."</b>"
);
$et->AddRow($row);
}
return($et->DisplayNew('return',""));
}
}
function AuftragZahlungsmail() function AuftragZahlungsmail()
{ {
@@ -5962,6 +6007,13 @@ Die Gesamtsumme stimmt nicht mehr mit urspr&uuml;nglich festgelegten Betrag '.
} }
} }
// Check for override in adresse
$sql = "SELECT rechnung_anzahlpapier, rechnung_anzahlpapier_abweichend FROM adresse WHERE id =".$adresse;
$rechnung_anzahlpapier = $this->app->DB->SelectArr($sql);
if ($rechnung_anzahlpapier[0]['rechnung_anzahlpapier_abweichend']) {
$autodruckrechnungstufe1menge = $rechnung_anzahlpapier[0]['rechnung_anzahlpapier'];
}
if($exportdruckrechnungstufe1) if($exportdruckrechnungstufe1)
{ {
if(!empty($projektarr)) if(!empty($projektarr))
@@ -5975,9 +6027,6 @@ Die Gesamtsumme stimmt nicht mehr mit urspr&uuml;nglich festgelegten Betrag '.
$exportdruckrechnungstufe1 = $this->app->erp->Export($exportland); $exportdruckrechnungstufe1 = $this->app->erp->Export($exportland);
} }
if(($autodruckrechnungstufe1=='1' || $exportdruckrechnungstufe1) && $rechnung > 0) if(($autodruckrechnungstufe1=='1' || $exportdruckrechnungstufe1) && $rechnung > 0)
{ {
$this->app->DB->Update("UPDATE rechnung SET status='versendet', versendet='1',schreibschutz='1' WHERE id='$rechnung' LIMIT 1"); $this->app->DB->Update("UPDATE rechnung SET status='versendet', versendet='1',schreibschutz='1' WHERE id='$rechnung' LIMIT 1");
@@ -6666,6 +6715,13 @@ Die Gesamtsumme stimmt nicht mehr mit urspr&uuml;nglich festgelegten Betrag '.
public function AuftragList() public function AuftragList()
{ {
// refresh all open items
$openids = $this->app->DB->SelectArr("SELECT id from auftrag WHERE status <> 'abgeschlossen'");
foreach ($openids as $openid) {
$this->app->erp->AuftragAutoversandBerechnen($openid['id']);
}
if($this->app->Secure->GetPOST('ausfuehren') && $this->app->erp->RechteVorhanden('auftrag', 'edit')) if($this->app->Secure->GetPOST('ausfuehren') && $this->app->erp->RechteVorhanden('auftrag', 'edit'))
{ {
$drucker = $this->app->Secure->GetPOST('seldrucker'); $drucker = $this->app->Secure->GetPOST('seldrucker');
@@ -7261,6 +7317,9 @@ Die Gesamtsumme stimmt nicht mehr mit urspr&uuml;nglich festgelegten Betrag '.
$this->app->DB->Update($sql); $this->app->DB->Update($sql);
} }
$this->app->erp->AuftragProtokoll($id,"Teilauftrag $belegnr_neu erstellt");
$this->app->erp->PDFArchivieren('auftrag', $id, true);
header('Location: index.php?module=auftrag&action=edit&id='.$id_neu); header('Location: index.php?module=auftrag&action=edit&id='.$id_neu);
} }
+25
View File
@@ -776,6 +776,7 @@ class Bestellung extends GenBestellung
$tmp3->DisplayNew('PDFARCHIV','Men&uuml;',"noAction"); $tmp3->DisplayNew('PDFARCHIV','Men&uuml;',"noAction");
} }
/*
$wareneingangsbelege = $this->app->DB->SelectFirstCols("SELECT $wareneingangsbelege = $this->app->DB->SelectFirstCols("SELECT
CONCAT('<a href=\"index.php?module=receiptdocument&action=edit&id=',r.id,'\" target=\"_blank\"',if(r.status='storniert',' title=\"Wareneingangsbeleg storniert\"><s>','>'),if(r.document_number='0' OR document_number='','ENTWURF',r.document_number),if(r.status='storniert','</s>',''),'</a>&nbsp;<a href=\"index.php?module=receiptdocument&action=pdf&id=',r.id,'\" target=\"_blank\"><img src=\"./themes/new/images/pdf.svg\" title=\"Wareneingangsbeleg PDF\" border=\"0\"></a>&nbsp; CONCAT('<a href=\"index.php?module=receiptdocument&action=edit&id=',r.id,'\" target=\"_blank\"',if(r.status='storniert',' title=\"Wareneingangsbeleg storniert\"><s>','>'),if(r.document_number='0' OR document_number='','ENTWURF',r.document_number),if(r.status='storniert','</s>',''),'</a>&nbsp;<a href=\"index.php?module=receiptdocument&action=pdf&id=',r.id,'\" target=\"_blank\"><img src=\"./themes/new/images/pdf.svg\" title=\"Wareneingangsbeleg PDF\" border=\"0\"></a>&nbsp;
<a href=\"index.php?module=receiptdocument&action=edit&id=',r.id,'\" target=\"_blank\"><img src=\"./themes/new/images/edit.svg\" title=\"Wareneingangsbeleg bearbeiten\" border=\"0\"></a>') as wareneingangsbeleg <a href=\"index.php?module=receiptdocument&action=edit&id=',r.id,'\" target=\"_blank\"><img src=\"./themes/new/images/edit.svg\" title=\"Wareneingangsbeleg bearbeiten\" border=\"0\"></a>') as wareneingangsbeleg
@@ -787,6 +788,30 @@ class Bestellung extends GenBestellung
else{ else{
$this->app->Tpl->Set('WARENEINGANGSBELEG', '-'); $this->app->Tpl->Set('WARENEINGANGSBELEG', '-');
} }
*/
$sql = "SELECT
CONCAT('<a href =\"index.php?module=wareneingang&action=distriinhalt&id=',pa.id,'\">',pa.id,'</a>') as wareneingang
FROM
paketannahme pa
INNER JOIN paketdistribution pd ON
pd.paketannahme = pa.id
INNER JOIN bestellung_position bp ON
pd.bestellung_position = bp.id
INNER JOIN bestellung b ON
b.id = bp.bestellung
WHERE
b.id = $id
GROUP BY
pa.id";
// echo($sql);
$wareneingangsbelege = $this->app->DB->SelectArr($sql);
if(!empty($wareneingangsbelege)){
$this->app->Tpl->Add('WARENEINGANGSBELEG', implode('<br />', array_column($wareneingangsbelege , 'wareneingang' )));
}
else{
$this->app->Tpl->Set('WARENEINGANGSBELEG', '-');
}
$this->app->Tpl->Set('ID', $id); $this->app->Tpl->Set('ID', $id);
+1 -1
View File
@@ -33,7 +33,7 @@
</tr> </tr>
<tr> <tr>
<td>Bearbeiter:</td> <td>Bearbeiter:</td>
<td colspan="3"><input type="text" name="von" id="von" value="[SENDER]" style="width: 370px;"></td> <td colspan="3"><input type="text" name="von" id="von" value="[BEARBEITER]" style="width: 370px;"></td>
</tr> </tr>
<tr> <tr>
<td width="100">{|Projekt|}:</td> <td width="100">{|Projekt|}:</td>
@@ -0,0 +1,455 @@
<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>{|Artikelkategorien|}</legend><i>Info like this.</i>
<table width="100%" border="0" class="mkTableFormular">
<tr>
<td>
{|Bezeichnung|}:
</td>
<td>
<input type="text" name="bezeichnung" id="bezeichnung" value="[BEZEICHNUNG]" size="20">
</td>
</tr>
<tr>
<td>
{|Next_nummer|}:
</td>
<td>
<input type="text" name="next_nummer" id="next_nummer" value="[NEXT_NUMMER]" size="20">
</td>
</tr>
<tr>
<td>
{|Projekt|}:
</td>
<td>
<input type="text" name="projekt" id="projekt" value="[PROJEKT]" size="20">
</td>
</tr>
<tr>
<td>
{|Geloescht|}:
</td>
<td>
<input type="text" name="geloescht" id="geloescht" value="[GELOESCHT]" size="20">
</td>
</tr>
<tr>
<td>
{|Externenummer|}:
</td>
<td>
<input type="text" name="externenummer" id="externenummer" value="[EXTERNENUMMER]" size="20">
</td>
</tr>
<tr>
<td>
{|Parent|}:
</td>
<td>
<input type="text" name="parent" id="parent" value="[PARENT]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_erloese_inland_normal|}:
</td>
<td>
<input type="text" name="steuer_erloese_inland_normal" id="steuer_erloese_inland_normal" value="[STEUER_ERLOESE_INLAND_NORMAL]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_aufwendung_inland_normal|}:
</td>
<td>
<input type="text" name="steuer_aufwendung_inland_normal" id="steuer_aufwendung_inland_normal" value="[STEUER_AUFWENDUNG_INLAND_NORMAL]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_erloese_inland_ermaessigt|}:
</td>
<td>
<input type="text" name="steuer_erloese_inland_ermaessigt" id="steuer_erloese_inland_ermaessigt" value="[STEUER_ERLOESE_INLAND_ERMAESSIGT]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_aufwendung_inland_ermaessigt|}:
</td>
<td>
<input type="text" name="steuer_aufwendung_inland_ermaessigt" id="steuer_aufwendung_inland_ermaessigt" value="[STEUER_AUFWENDUNG_INLAND_ERMAESSIGT]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_erloese_inland_steuerfrei|}:
</td>
<td>
<input type="text" name="steuer_erloese_inland_steuerfrei" id="steuer_erloese_inland_steuerfrei" value="[STEUER_ERLOESE_INLAND_STEUERFREI]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_aufwendung_inland_steuerfrei|}:
</td>
<td>
<input type="text" name="steuer_aufwendung_inland_steuerfrei" id="steuer_aufwendung_inland_steuerfrei" value="[STEUER_AUFWENDUNG_INLAND_STEUERFREI]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_erloese_inland_innergemeinschaftlich|}:
</td>
<td>
<input type="text" name="steuer_erloese_inland_innergemeinschaftlich" id="steuer_erloese_inland_innergemeinschaftlich" value="[STEUER_ERLOESE_INLAND_INNERGEMEINSCHAFTLICH]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_aufwendung_inland_innergemeinschaftlich|}:
</td>
<td>
<input type="text" name="steuer_aufwendung_inland_innergemeinschaftlich" id="steuer_aufwendung_inland_innergemeinschaftlich" value="[STEUER_AUFWENDUNG_INLAND_INNERGEMEINSCHAFTLICH]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_erloese_inland_eunormal|}:
</td>
<td>
<input type="text" name="steuer_erloese_inland_eunormal" id="steuer_erloese_inland_eunormal" value="[STEUER_ERLOESE_INLAND_EUNORMAL]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_erloese_inland_nichtsteuerbar|}:
</td>
<td>
<input type="text" name="steuer_erloese_inland_nichtsteuerbar" id="steuer_erloese_inland_nichtsteuerbar" value="[STEUER_ERLOESE_INLAND_NICHTSTEUERBAR]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_erloese_inland_euermaessigt|}:
</td>
<td>
<input type="text" name="steuer_erloese_inland_euermaessigt" id="steuer_erloese_inland_euermaessigt" value="[STEUER_ERLOESE_INLAND_EUERMAESSIGT]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_aufwendung_inland_nichtsteuerbar|}:
</td>
<td>
<input type="text" name="steuer_aufwendung_inland_nichtsteuerbar" id="steuer_aufwendung_inland_nichtsteuerbar" value="[STEUER_AUFWENDUNG_INLAND_NICHTSTEUERBAR]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_aufwendung_inland_eunormal|}:
</td>
<td>
<input type="text" name="steuer_aufwendung_inland_eunormal" id="steuer_aufwendung_inland_eunormal" value="[STEUER_AUFWENDUNG_INLAND_EUNORMAL]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_aufwendung_inland_euermaessigt|}:
</td>
<td>
<input type="text" name="steuer_aufwendung_inland_euermaessigt" id="steuer_aufwendung_inland_euermaessigt" value="[STEUER_AUFWENDUNG_INLAND_EUERMAESSIGT]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_erloese_inland_export|}:
</td>
<td>
<input type="text" name="steuer_erloese_inland_export" id="steuer_erloese_inland_export" value="[STEUER_ERLOESE_INLAND_EXPORT]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_aufwendung_inland_import|}:
</td>
<td>
<input type="text" name="steuer_aufwendung_inland_import" id="steuer_aufwendung_inland_import" value="[STEUER_AUFWENDUNG_INLAND_IMPORT]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuertext_innergemeinschaftlich|}:
</td>
<td>
<input type="text" name="steuertext_innergemeinschaftlich" id="steuertext_innergemeinschaftlich" value="[STEUERTEXT_INNERGEMEINSCHAFTLICH]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuertext_export|}:
</td>
<td>
<input type="text" name="steuertext_export" id="steuertext_export" value="[STEUERTEXT_EXPORT]" size="20">
</td>
</tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
<!-- Example for 2nd row
<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>{|Another legend|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<tr>
<td>
{|Bezeichnung|}:
</td>
<td>
<input type="text" name="bezeichnung" id="bezeichnung" value="[BEZEICHNUNG]" size="20">
</td>
</tr>
<tr>
<td>
{|Next_nummer|}:
</td>
<td>
<input type="text" name="next_nummer" id="next_nummer" value="[NEXT_NUMMER]" size="20">
</td>
</tr>
<tr>
<td>
{|Projekt|}:
</td>
<td>
<input type="text" name="projekt" id="projekt" value="[PROJEKT]" size="20">
</td>
</tr>
<tr>
<td>
{|Geloescht|}:
</td>
<td>
<input type="text" name="geloescht" id="geloescht" value="[GELOESCHT]" size="20">
</td>
</tr>
<tr>
<td>
{|Externenummer|}:
</td>
<td>
<input type="text" name="externenummer" id="externenummer" value="[EXTERNENUMMER]" size="20">
</td>
</tr>
<tr>
<td>
{|Parent|}:
</td>
<td>
<input type="text" name="parent" id="parent" value="[PARENT]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_erloese_inland_normal|}:
</td>
<td>
<input type="text" name="steuer_erloese_inland_normal" id="steuer_erloese_inland_normal" value="[STEUER_ERLOESE_INLAND_NORMAL]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_aufwendung_inland_normal|}:
</td>
<td>
<input type="text" name="steuer_aufwendung_inland_normal" id="steuer_aufwendung_inland_normal" value="[STEUER_AUFWENDUNG_INLAND_NORMAL]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_erloese_inland_ermaessigt|}:
</td>
<td>
<input type="text" name="steuer_erloese_inland_ermaessigt" id="steuer_erloese_inland_ermaessigt" value="[STEUER_ERLOESE_INLAND_ERMAESSIGT]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_aufwendung_inland_ermaessigt|}:
</td>
<td>
<input type="text" name="steuer_aufwendung_inland_ermaessigt" id="steuer_aufwendung_inland_ermaessigt" value="[STEUER_AUFWENDUNG_INLAND_ERMAESSIGT]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_erloese_inland_steuerfrei|}:
</td>
<td>
<input type="text" name="steuer_erloese_inland_steuerfrei" id="steuer_erloese_inland_steuerfrei" value="[STEUER_ERLOESE_INLAND_STEUERFREI]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_aufwendung_inland_steuerfrei|}:
</td>
<td>
<input type="text" name="steuer_aufwendung_inland_steuerfrei" id="steuer_aufwendung_inland_steuerfrei" value="[STEUER_AUFWENDUNG_INLAND_STEUERFREI]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_erloese_inland_innergemeinschaftlich|}:
</td>
<td>
<input type="text" name="steuer_erloese_inland_innergemeinschaftlich" id="steuer_erloese_inland_innergemeinschaftlich" value="[STEUER_ERLOESE_INLAND_INNERGEMEINSCHAFTLICH]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_aufwendung_inland_innergemeinschaftlich|}:
</td>
<td>
<input type="text" name="steuer_aufwendung_inland_innergemeinschaftlich" id="steuer_aufwendung_inland_innergemeinschaftlich" value="[STEUER_AUFWENDUNG_INLAND_INNERGEMEINSCHAFTLICH]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_erloese_inland_eunormal|}:
</td>
<td>
<input type="text" name="steuer_erloese_inland_eunormal" id="steuer_erloese_inland_eunormal" value="[STEUER_ERLOESE_INLAND_EUNORMAL]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_erloese_inland_nichtsteuerbar|}:
</td>
<td>
<input type="text" name="steuer_erloese_inland_nichtsteuerbar" id="steuer_erloese_inland_nichtsteuerbar" value="[STEUER_ERLOESE_INLAND_NICHTSTEUERBAR]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_erloese_inland_euermaessigt|}:
</td>
<td>
<input type="text" name="steuer_erloese_inland_euermaessigt" id="steuer_erloese_inland_euermaessigt" value="[STEUER_ERLOESE_INLAND_EUERMAESSIGT]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_aufwendung_inland_nichtsteuerbar|}:
</td>
<td>
<input type="text" name="steuer_aufwendung_inland_nichtsteuerbar" id="steuer_aufwendung_inland_nichtsteuerbar" value="[STEUER_AUFWENDUNG_INLAND_NICHTSTEUERBAR]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_aufwendung_inland_eunormal|}:
</td>
<td>
<input type="text" name="steuer_aufwendung_inland_eunormal" id="steuer_aufwendung_inland_eunormal" value="[STEUER_AUFWENDUNG_INLAND_EUNORMAL]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_aufwendung_inland_euermaessigt|}:
</td>
<td>
<input type="text" name="steuer_aufwendung_inland_euermaessigt" id="steuer_aufwendung_inland_euermaessigt" value="[STEUER_AUFWENDUNG_INLAND_EUERMAESSIGT]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_erloese_inland_export|}:
</td>
<td>
<input type="text" name="steuer_erloese_inland_export" id="steuer_erloese_inland_export" value="[STEUER_ERLOESE_INLAND_EXPORT]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuer_aufwendung_inland_import|}:
</td>
<td>
<input type="text" name="steuer_aufwendung_inland_import" id="steuer_aufwendung_inland_import" value="[STEUER_AUFWENDUNG_INLAND_IMPORT]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuertext_innergemeinschaftlich|}:
</td>
<td>
<input type="text" name="steuertext_innergemeinschaftlich" id="steuertext_innergemeinschaftlich" value="[STEUERTEXT_INNERGEMEINSCHAFTLICH]" size="20">
</td>
</tr>
<tr>
<td>
{|Steuertext_export|}:
</td>
<td>
<input type="text" name="steuertext_export" id="steuertext_export" value="[STEUERTEXT_EXPORT]" size="20">
</td>
</tr>
</table>
</fieldset>
</div>
</div>
</div>
</div> -->
<input type="submit" name="submit" value="Speichern" style="float:right"/>
</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>
@@ -0,0 +1,10 @@
<div id="tabs">
<ul>
<li><a href="#tabs-1">[TABTEXT1]</a></li>
</ul>
<div id="tabs-1">
[MESSAGE]
[TAB1]
[TAB1NEXT]
</div>
</div>
+1 -1
View File
@@ -87,7 +87,7 @@
--> -->
<div style="background-color:white"> <div style="background-color:white">
<h2 class="greyh2">{|Zahlungseingang|}</h2> <h2 class="greyh2">{|Zahlungen|}</h2>
<div style="padding:10px"> <div style="padding:10px">
[ZAHLUNGEN] [ZAHLUNGEN]
</div> </div>
+5 -2
View File
@@ -1,4 +1,7 @@
<div id="tabs"> <div id="tabs">
<ul>
<li><a href="#tabs-1">Allgemein</a></li>
</ul>
<div id="tabs-1"> <div id="tabs-1">
[MESSAGE] [MESSAGE]
<form action="" method="post"> <form action="" method="post">
@@ -11,11 +14,11 @@
<legend>{|Einstellungen|}</legend> <legend>{|Einstellungen|}</legend>
<td>{|Absatz ber&uuml;cksichtigen (Monate)|}:</td> <td>{|Absatz ber&uuml;cksichtigen (Monate)|}:</td>
<td><input type="number" min="0" name="monate_absatz" id="monate_absatz" value="[MONATE_ABSATZ]" size="20""></td> <td><input type="number" min="0" name="monate_absatz" id="monate_absatz" value="[MONATE_ABSATZ]" size="20"></td>
</tr> </tr>
<tr> <tr>
<td>{|Vorausplanen (Monate)|}:</td> <td>{|Vorausplanen (Monate)|}:</td>
<td><input type="number" min="0" name="monate_voraus" id="monate_voraus" value="[MONATE_VORAUS]" size="20""></td> <td><input type="number" min="0" name="monate_voraus" id="monate_voraus" value="[MONATE_VORAUS]" size="20"></td>
</tr> </tr>
</table> </table>
</fieldset> </fieldset>
+2 -2
View File
@@ -68,13 +68,13 @@
<td width="25%" style="position:relative"><a href="index.php?module=versandarten&action=list"><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_16.gif" border="0" width="30%"></a></td> <td width="25%" style="position:relative"><a href="index.php?module=versandarten&action=list"><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_16.gif" border="0" width="30%"></a></td>
<td width="25%" style="position:relative"><a href="index.php?module=zahlungsweisen&action=list"><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_16.gif" border="0" width="30%"></a></td> <td width="25%" style="position:relative"><a href="index.php?module=zahlungsweisen&action=list"><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_16.gif" border="0" width="30%"></a></td>
<td width="25%" style="position:relative"><a [LIEFERBEDINGUNGENLINK]><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_16.gif" border="0" width="30%"></a>[GREYLIEFERBEDINGUNGEN]</td> <td width="25%" style="position:relative"><a [LIEFERBEDINGUNGENLINK]><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_16.gif" border="0" width="30%"></a>[GREYLIEFERBEDINGUNGEN]</td>
<td width="25%"></td> <td width="25%" style="position:relative"><a href="index.php?module=mahnwesen&action=einstellungen"><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_11.gif" border="0" width="30%"></a></td>
</tr> </tr>
<tr align="center"> <tr align="center">
<td><a href="index.php?module=versandarten&action=list">{|Versandarten|}</a></td> <td><a href="index.php?module=versandarten&action=list">{|Versandarten|}</a></td>
<td><a href="index.php?module=zahlungsweisen&action=list">{|Zahlungsweisen|}</a></td> <td><a href="index.php?module=zahlungsweisen&action=list">{|Zahlungsweisen|}</a></td>
<td><a [LIEFERBEDINGUNGENLINK]>{|Lieferbedingungen|}</a></td> <td><a [LIEFERBEDINGUNGENLINK]>{|Lieferbedingungen|}</a></td>
<td></td> <td><a href="index.php?module=mahnwesen&action=einstellungen">{|Mahnwesen|}</a></td>
</tr> </tr>
</table> </table>
+7 -7
View File
@@ -100,8 +100,8 @@
<legend>{|Ticketsystem|}</legend> <legend>{|Ticketsystem|}</legend>
<table width="100%" border="0" class="mkTableFormular"> <table width="100%" border="0" class="mkTableFormular">
<tr><td>{|ticket|}:</td><td><input type="text" name="ticket" value="[TICKET]" size="40"></td></tr> <tr><td>{|ticket|}:</td><td><input type="text" name="ticket" value="[TICKET]" size="40"></td></tr>
<tr><td>{|ticketprojekt|}:</td><td><input type="text" name="ticketprojekt" value="[TICKETPROJEKT]" size="40"></td></tr> <tr><td>{|ticketprojekt|}:</td><td><input type="text" id="ticketprojekt" name="ticketprojekt" value="[TICKETPROJEKT]" size="40"></td></tr>
<tr><td>{|ticketqueue|}:</td><td><input type="text" name="ticketqueue" value="[TICKETQUEUE]" size="40"></td></tr> <tr><td>{|ticketqueue|}:</td><td><input type="text" id="ticketqueue" name="ticketqueue" value="[TICKETQUEUE]" size="40"></td></tr>
<tr><td>{|abdatum|}:</td><td><input type="text" name="abdatum" value="[ABDATUM]" size="40"></td></tr> <tr><td>{|abdatum|}:</td><td><input type="text" name="abdatum" value="[ABDATUM]" size="40"></td></tr>
<tr><td>{|ticketloeschen|}:</td><td><input type="text" name="ticketloeschen" value="[TICKETLOESCHEN]" size="40"></td></tr> <tr><td>{|ticketloeschen|}:</td><td><input type="text" name="ticketloeschen" value="[TICKETLOESCHEN]" size="40"></td></tr>
<tr><td>{|ticketabgeschlossen|}:</td><td><input type="text" name="ticketabgeschlossen" value="[TICKETABGESCHLOSSEN]" size="40"></td></tr> <tr><td>{|ticketabgeschlossen|}:</td><td><input type="text" name="ticketabgeschlossen" value="[TICKETABGESCHLOSSEN]" size="40"></td></tr>
@@ -121,16 +121,16 @@
<table width="100%" border="0" class="mkTableFormular"> <table width="100%" border="0" class="mkTableFormular">
<tr><td>{|autosresponder_blacklist|}:</td><td><input type="text" name="autosresponder_blacklist" value="[AUTOSRESPONDER_BLACKLIST]" size="40"></td></tr> <tr><td>{|autosresponder_blacklist|}:</td><td><input type="text" name="autosresponder_blacklist" value="[AUTOSRESPONDER_BLACKLIST]" size="40"></td></tr>
<tr><td>{|eigenesignatur|}:</td><td><input type="text" name="eigenesignatur" value="[EIGENESIGNATUR]" size="40"></td></tr> <tr><td>{|eigenesignatur|}:</td><td><input type="text" name="eigenesignatur" value="[EIGENESIGNATUR]" size="40"></td></tr>
<tr><td>{|signatur|}:</td><td><input type="text" name="signatur" value="[SIGNATUR]" size="40"></td></tr> <tr><td>{|signatur|}:</td><td><textarea id="signatur" name="signatur" rows="6" style="width:100%;">[SIGNATUR]</textarea></td></tr>
<tr><td>{|adresse|}:</td><td><input type="text" name="adresse" value="[ADRESSE]" size="40"></td></tr> <tr><td>{|adresse|}:</td><td><input type="text" id="adresse" name="adresse" value="[ADRESSE]" size="40"></td></tr>
<tr><td>{|firma|}:</td><td><input type="text" name="firma" value="[FIRMA]" size="40"></td></tr> <tr><td>{|firma|}:</td><td><input type="text" name="firma" value="[FIRMA]" size="40"></td></tr>
<tr><td>{|geloescht|}:</td><td><input type="text" name="geloescht" value="[GELOESCHT]" size="40"></td></tr> <tr><td>{|geloescht|}:</td><td><input type="text" name="geloescht" value="[GELOESCHT]" size="40"></td></tr>
<tr><td>{|mutex|}:</td><td><input type="text" name="mutex" value="[MUTEX]" size="40"></td></tr> <tr><td>{|mutex|}:</td><td><input type="text" name="mutex" value="[MUTEX]" size="40"></td></tr>
<tr><td>{|autoresponder|}:</td><td><input type="text" name="autoresponder" value="[AUTORESPONDER]" size="40"></td></tr> <tr><td>{|autoresponder|}:</td><td><input type="text" name="autoresponder" value="[AUTORESPONDER]" size="40"></td></tr>
<tr><td>{|geschaeftsbriefvorlage|}:</td><td><input type="text" name="geschaeftsbriefvorlage" value="[GESCHAEFTSBRIEFVORLAGE]" size="40"></td></tr> <tr><td>{|geschaeftsbriefvorlage|}:</td><td><input type="text" name="geschaeftsbriefvorlage" value="[GESCHAEFTSBRIEFVORLAGE]" size="40"></td></tr>
<tr><td>{|autoresponderbetreff|}:</td><td><input type="text" name="autoresponderbetreff" value="[AUTORESPONDERBETREFF]" size="40"></td></tr> <tr><td>{|autoresponderbetreff|}:</td><td><textarea id="autoresponderbetreff" name="autoresponderbetreff" rows="6" style="width:100%;">[AUTORESPONDERBETREFF]</textarea></td></tr>
<tr><td>{|autorespondertext|}:</td><td><input type="text" name="autorespondertext" value="[AUTORESPONDERTEXT]" size="40"></td></tr> <tr><td>{|autorespondertext|}:</td><td><textarea id="autorespondertext" name="autorespondertext" rows="6" style="width:100%;">[AUTORESPONDERTEXT]</textarea></td></tr>
<tr><td>{|projekt|}:</td><td><input type="text" name="projekt" value="[PROJEKT]" size="40"></td></tr> <tr><td>{|projekt|}:</td><td><input type="text" id="projekt" name="projekt" value="[PROJEKT]" size="40"></td></tr>
</table> </table>
</fieldset> </fieldset>
</div> </div>
@@ -39,6 +39,14 @@
<td>Projekt:</td> <td>Projekt:</td>
<td><input type="text" name="projekt" id="projekt" value="[PROJEKT]" /></td> <td><input type="text" name="projekt" id="projekt" value="[PROJEKT]" /></td>
</tr> </tr>
<tr>
<td>Differenzen (Kopf/Positionen) ignorieren:</td>
<td><input type="checkbox" name="diffignore" value="1" [DIFFIGNORE] /></td>
</tr>
<tr>
<td>Konto f&uuml;r Differenzen:</td>
<td><input type="text" name="sachkonto" id="sachkonto" value="[SACHKONTO]" /></td>
</tr>
</table> </table>
</fieldset> </fieldset>
</div> </div>
+204
View File
@@ -0,0 +1,204 @@
<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>{|Einzelbuchung bearbeiten.|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<tr>
<tr>
<td>
{|Von|}:
</td>
<td>
<a href="index.php?module=[VON_TYP]&id=[VON_ID]&action=edit">[VON]</a>
<input hidden type="text" name="von_typ" id="von_typ" value="[VON_TYP]" size="20">
<input hidden type="text" name="von_id" id="von_id" value="[VON_ID]" size="20">
</td>
</tr>
<tr>
<td>
{|Nach|}:
</td>
<td>
<a href="index.php?module=[NACH_TYP]&id=[NACH_ID]&action=edit">[NACH]</a>
<input hidden type="text" name="nach_typ" id="nach_typ" value="[NACH_TYP]" size="20">
<input hidden type="text" name="nach_id" id="nach_id" value="[NACH_ID]" size="20">
</td>
</tr>
<tr>
<td>
{|Betrag|}:
</td>
<td>
<input type="numeric" name="betrag" id="betrag" value="[BETRAG]" size="20">
</td>
</tr>
<tr>
<td>
{|W&auml;hrung|}:
</td>
<td>
<select name="waehrung">[WAEHRUNG]</select>
</td>
</tr>
<tr>
<td>
{|Benutzer|}:
</td>
<td>
[BENUTZER]
</td>
</tr>
<tr>
<td>
{|Datum|}:
</td>
<td>
<input type="text" name="datum" id="datum" value="[DATUM]" size="20">
</td>
</tr>
<tr>
<td>
{|Internebemerkung|}:
</td>
<td>
<textarea type="text" name="internebemerkung" id="internebemerkung" size="20">[INTERNEBEMERKUNG]</textarea>
</td>
</tr>
</table>
</fieldset>
<input type="submit" name="submit" value="Speichern" style="float:right"/>
</div>
</div>
</div>
</div>
[TAB1]
<!-- Example for 2nd row
<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>{|Another legend|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<tr>
<td>
{|Von_typ|}:
</td>
<td>
<input type="text" name="von_typ" id="von_typ" value="[VON_TYP]" size="20">
</td>
</tr>
<tr>
<td>
{|Von_id|}:
</td>
<td>
<input type="text" name="von_id" id="von_id" value="[VON_ID]" size="20">
</td>
</tr>
<tr>
<td>
{|Nach_typ|}:
</td>
<td>
<input type="text" name="nach_typ" id="nach_typ" value="[NACH_TYP]" size="20">
</td>
</tr>
<tr>
<td>
{|Nach_id|}:
</td>
<td>
<input type="text" name="nach_id" id="nach_id" value="[NACH_ID]" size="20">
</td>
</tr>
<tr>
<td>
{|Betrag|}:
</td>
<td>
<input type="text" name="betrag" id="betrag" value="[BETRAG]" size="20">
</td>
</tr>
<tr>
<td>
{|Waehrung|}:
</td>
<td>
<input type="text" name="waehrung" id="waehrung" value="[WAEHRUNG]" size="20">
</td>
</tr>
<tr>
<td>
{|Benutzer|}:
</td>
<td>
<input type="text" name="benutzer" id="benutzer" value="[BENUTZER]" size="20">
</td>
</tr>
<tr>
<td>
{|Zeit|}:
</td>
<td>
<input type="text" name="zeit" id="zeit" value="[ZEIT]" size="20">
</td>
</tr>
<tr>
<td>
{|Internebemerkung|}:
</td>
<td>
<input type="text" name="internebemerkung" id="internebemerkung" value="[INTERNEBEMERKUNG]" size="20">
</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>
@@ -0,0 +1,105 @@
<form action="" method="post" id="buchungenform">
<div id="tabs">
<ul>
<li><a href="#tabs-1"><!--[TABTEXT]--></a></li>
</ul>
<div id="tabs-1">
[MESSAGE]
[FORMHANDLEREVENT]
<legend>{|Einzelsaldo zuordnen und auf mehrere Gegenbelege oder Sachkonto verbuchen.|}</legend>
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-6 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<table>
<tr>
<td>
"[DOC_ZUORDNUNG]"
</td>
</tr>
<tr>
<td>
Saldo: <u>[DOC_SALDO]</u>
</td>
</tr>
</table>
</fieldset>
</div>
</div>
<div class="col-xs-12 col-md-6 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<table>
<tr>
<td>
Multifilter f&uuml;r "Info" (Trennzeichen ',; ')
</td>
</tr>
<tr>
<td>
<textarea type="text" name="multifilter" id="multifilter" style="width:100%;">[MULTIFILTER]</textarea>
</td>
<td>
<button name="submit" value="multifilter" class="ui-button-icon">{|Filtern|}</button>
</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">
[TAB1]
<fieldset>
<table>
<legend>Stapelverarbeitung</legend>
<tr>
<td><input type="checkbox" value="1" name="override" form="buchungenform" />&nbsp;Mit Abweichung buchen&nbsp;</td>
</tr>
<tr>
<td><input type="checkbox" value="1" id="autoalle" />&nbsp;alle markieren&nbsp;
<select id="sel_aktion" name="sel_aktion">
<option value="buchen">{|auf Ausgew&auml;hlte buchen|}</option>
<option value="buchen_diff_sachkonto">{|auf Ausgew&auml;hlte buchen, Gegenbeleg auf Sachkonto ausgleichen|}</option>
</select>&nbsp;Sachkonto:
<input type="text" id="sachkonto" name="sachkonto" value="">
<button name="submit" value="BUCHEN" class="ui-button-icon">{|BUCHEN|}</button>
</td>
</tr>
<tr>
<td>
<input type="number" name="abschlag" id="abschlag" value=[ABSCHLAG] />% Abschlag auf Buchungsbetrag</td>
</td>
</tr>
<tr>
<td>
<button name="submit" value="neuberechnen" class="ui-button-icon" style="width:100%;">
{|Buchungen neu berechnen|}
</button>
</td>
</tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
</div>
</div>
</form>
<script>
$('#autoalle').on('change',function(){
var wert = $(this).prop('checked');
$('#fibu_buchungen_einzelzuordnen').find('input[type="checkbox"]').prop('checked',wert);
$('#fibu_buchungen_einzelzuordnen').find('input[type="checkbox"]').first().trigger('change');
});
</script>
+62
View File
@@ -0,0 +1,62 @@
<div id="tabs">
<ul>
<li><a href="#tabs-1">Salden</a></li>
<li><a href="#tabs-2">Buchungen</a></li>
</ul>
<div id="tabs-1">
<legend>Salden&uuml;bersicht. Salden m&uuml;ssen &uuml;ber Gegenbuchungen ausgeglichen werden.<br><br></legend>
<form action="" enctype="multipart/form-data" method="POST">
[MESSAGE]
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-10 col-md-height">
<div class="inside inside-full-height">
<fieldset>
[TAB1]
</fieldset>
</div>
</div>
<div class="col-xs-12 col-md-2 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<table width="100%" border="0" class="mkTableFormular">
<legend>{|Aktionen|}</legend>
<td><button name="submit" value="neuberechnen" class="ui-button-icon" style="width:100%;">Buchungen neu berechnen</button></td></tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
</form>
[TAB1NEXT]
</div>
<div id="tabs-2">
<form action="#tabs-2" enctype="multipart/form-data" method="POST">
[MESSAGE]
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-10 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Einzelbuchungen|}</legend>
[TAB2]
</fieldset>
</div>
</div>
<div class="col-xs-12 col-md-2 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<table width="100%" border="0" class="mkTableFormular">
<legend>{|Aktionen|}</legend>
<td><button name="submit" value="neuberechnen" class="ui-button-icon" style="width:100%;">Buchungen neu berechnen</button></td></tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
</form>
[TAB2NEXT]
</div>
</div>
@@ -0,0 +1,79 @@
<div id="tabs">
<ul>
<li><a href="#tabs-1"><!--[TABTEXT]--></a></li>
</ul>
<div id="tabs-1">
[MESSAGE]
[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>{|Einzelsalden zuordnen und auf Gegenbelege oder Sachkonto verbuchen.|}</legend>
<div class="filter-box filter-usersave">
<div class="filter-block filter-inline">
<div class="filter-title">{|Filter|}</div>
<ul class="filter-list">
<li class="filter-item">
<label for="vorschlagfilter" class="switch">
<input type="checkbox" id="vorschlagfilter">
<span class="slider round"></span>
</label>
<label for="vorschlagfilter">{|Vorschl&auml;ge|}</label>
</li>
<li class="filter-item">
<label for="checkedfilter" class="switch">
<input type="checkbox" id="checkedfilter">
<span class="slider round"></span>
</label>
<label for="checkedfilter">{|Betrag korrekt|}</label>
</li>
</ul>
</div>
</div>
<form action="" method="post" id="buchungenform">
[TAB1]
</form>
</fieldset>
<fieldset>
<table>
<legend>Stapelverarbeitung</legend>
<tr>
<td><input type="checkbox" value="1" id="autoalle" />&nbsp;alle markieren&nbsp;
<select form="buchungenform" id="sel_aktion" name="sel_aktion">
<option value="vorschlag">{|auf Vorschlag buchen|}</option>
<option value="vorschlag_diff_sachkonto">{|auf Vorschlag buchen, Gegenbeleg auf Sachkonto ausgleichen|}</option>
<option value="sachkonto">{|auf Sachkonto buchen|}</option>
</select>&nbsp;Sachkonto:
<input type="text" form="buchungenform" id="sachkonto" name="sachkonto" value="">
<button name="submit" form="buchungenform" value="BUCHEN" class="ui-button-icon">{|BUCHEN|}</button>
</td>
</tr>
<tr>
<form action="" method="post">
<td>
<button name="submit" value="neuberechnen" class="ui-button-icon" style="width:100%;">
{|Buchungen neu berechnen|}
</button>
</td>
</form>
</tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
$('#autoalle').on('change',function(){
var wert = $(this).prop('checked');
$('#fibu_buchungen_zuordnen').find('input[type="checkbox"]').prop('checked',wert);
$('#fibu_buchungen_zuordnen').find('input[type="checkbox"]').first().trigger('change');
});
</script>
+20
View File
@@ -1101,6 +1101,26 @@
</div> </div>
</div> </div>
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-6 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Finanzbuchhaltung Einstellungen|}</legend>
<table width="100%">
<tr>
<td width="300">Buchungen erzeugen ab Datum:</td><td colspan="3"><input type="text" id= "fibu_buchungen_startdatum" name="fibu_buchungen_startdatum" size="10" value="[FIBU_BUCHUNGEN_STARTDATUM]"><i>F&uuml;r die Nutzung mit dem Modul Buchhaltung-Buchungen (Zahlungseingang, Zahlungsstatus, Mahnwesen)</i></td>
</tr>
<tr>
<td width="300">Konto f&uuml;r Rechnung-Skontobuchungen:</td><td colspan="3"><input type="text" id= "rechnung_skonto_kontorahmen" name="rechnung_skonto_kontorahmen" size="10" value="[RECHNUNG_SKONTO_KONTORAHMEN]"><i>Auf dieses Sachkonto werden Skontobuchungen mithilfe der Funktion "Zahlungsstatus berechnen" im Rechnungsmodul gebucht</i></td>
</tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
<!-- <!--
<fieldset><legend>Finanzbuchhaltung Export Kontenrahmen - Weitere Kostenarten</legend> <fieldset><legend>Finanzbuchhaltung Export Kontenrahmen - Weitere Kostenarten</legend>
<table> <table>
@@ -15,7 +15,7 @@
<tr> <tr>
<td><input type="checkbox" id="angeboteoffen">&nbsp;Fehlende Artikel</td> <td><input type="checkbox" id="angeboteoffen">&nbsp;Fehlende Artikel</td>
<td><input type="checkbox" id="angeboteoffen">&nbsp;Artikel im Zulauf</td> <td><input type="checkbox" id="angeboteoffen">&nbsp;Artikel im Zulauf</td>
<td><input type="checkbox" id="angeboteheute">&nbsp;Gersperrte Artikel</td> <td><input type="checkbox" id="angeboteheute">&nbsp;Gesperrte Artikel</td>
<td>Artikelgruppen: <select><option>alle</option><option>Waren 700000</option></select></td> <td>Artikelgruppen: <select><option>alle</option><option>Waren 700000</option></select></td>
</tr></table> </tr></table>
</center> </center>
@@ -121,6 +121,7 @@
<li>{|ZahlungDiff|} <i>{|Variablen|}: {AUFTRAG}, {DATUM}, {GESAMT}, {REST}, {ANSCHREIBEN}, {INTERNET}</i></li> <li>{|ZahlungDiff|} <i>{|Variablen|}: {AUFTRAG}, {DATUM}, {GESAMT}, {REST}, {ANSCHREIBEN}, {INTERNET}</i></li>
<li>{|Stornierung|} <i>{|Variablen|}: {AUFTRAG}, {DATUM}, {INTERNET}</i></li> <li>{|Stornierung|} <i>{|Variablen|}: {AUFTRAG}, {DATUM}, {INTERNET}</i></li>
<li>{|ZahlungMiss|} <i>{|Variablen|}: {AUFTRAG}, {DATUM}, {GESAMT}, {REST}, {ANSCHREIBEN}, {INTERNET}</i></li> <li>{|ZahlungMiss|} <i>{|Variablen|}: {AUFTRAG}, {DATUM}, {GESAMT}, {REST}, {ANSCHREIBEN}, {INTERNET}</i></li>
<li>Mahnung <i>Variablen: {BELEGNR}, {DATUM}, {OFFEN}, {MAHNGEBUEHR}, {HEUTE}</i></li>
<li>{|Versand|} <i>{|Variablen|}: {VERSAND}, {VERSANDTYPE}, {VERSANDBEZEICHNUNG}, {TRACKINGNUMMER}, {NAME}, {ANSCHREIBEN}, {BELEGNR}, {IHREBESTELLNUMMER}, {INTERNET}, {AUFTRAGDATUM}, {LIEFERADRESSE}, {LIEFERADRESSELANG}</i></li> <li>{|Versand|} <i>{|Variablen|}: {VERSAND}, {VERSANDTYPE}, {VERSANDBEZEICHNUNG}, {TRACKINGNUMMER}, {NAME}, {ANSCHREIBEN}, {BELEGNR}, {IHREBESTELLNUMMER}, {INTERNET}, {AUFTRAGDATUM}, {LIEFERADRESSE}, {LIEFERADRESSELANG}</i></li>
<li>{|VersandMailDokumente|} <i>{|Variablen|}: {NAME}, {ANSCHREIBEN}, {BELEGNR}, {IHREBESTELLNUMMER}, {INTERNET}, {AUFTRAGDATUM}</i></li> <li>{|VersandMailDokumente|} <i>{|Variablen|}: {NAME}, {ANSCHREIBEN}, {BELEGNR}, {IHREBESTELLNUMMER}, {INTERNET}, {AUFTRAGDATUM}</i></li>
<li>{|Erweiterte Freigabe|} <i>{|Variablen|}: {REQUESTER}, {LINK}, {LINKFREIGABEUEBERSICHT}, {DOCTYPE}, {DOCTYPE_ID}</i></li> <li>{|Erweiterte Freigabe|} <i>{|Variablen|}: {REQUESTER}, {LINK}, {LINKFREIGABEUEBERSICHT}, {DOCTYPE}, {DOCTYPE_ID}</i></li>
+1 -7
View File
@@ -39,7 +39,7 @@
</div> </div>
<div style="background-color:white"> <div style="background-color:white">
<h2 class="greyh2">{|Zahlungseingang|}</h2> <h2 class="greyh2">Buchungen</h2>
<div style="padding:10px"> <div style="padding:10px">
[ZAHLUNGEN] [ZAHLUNGEN]
</div> </div>
@@ -58,12 +58,6 @@
</div> </div>
</div> </div>
<div style="background-color:white"> <div style="background-color:white">
<h2 class="greyh2">Deckungsbeitrag</h2>
<div style="padding:10px">
<div class="info">Dieses Modul ist erst ab Version Professional verfügbar</div>
</div>
</div> </div>
</div> </div>
+2 -2
View File
@@ -45,8 +45,8 @@
<input type="checkbox" id="auswahlalle" onchange="alleauswaehlen();" />&nbsp;{|alle markieren|}&nbsp; <input type="checkbox" id="auswahlalle" onchange="alleauswaehlen();" />&nbsp;{|alle markieren|}&nbsp;
<select id="sel_aktion" name="sel_aktion"> <select id="sel_aktion" name="sel_aktion">
<option value="">{|bitte w&auml;hlen|} ...</option> <option value="">{|bitte w&auml;hlen|} ...</option>
<option value="erledigtam">{|als erledigt markieren|}</option> [ALSBEZAHLTMARKIEREN]
<option value="offen">{|erledigt Markierung entfernen|}</option> <option value="offen">{|als offen markieren|}</option>
<option value="mail">{|per Mail versenden|}</option> <option value="mail">{|per Mail versenden|}</option>
<option value="versendet">{|als versendet markieren|}</option> <option value="versendet">{|als versendet markieren|}</option>
<option value="pdf">{|Sammel-PDF|}</option> <option value="pdf">{|Sammel-PDF|}</option>
+143 -2
View File
@@ -6,7 +6,9 @@
<li><a href="#tabs-3">{|Zeiterfassung|}</a></li> <li><a href="#tabs-3">{|Zeiterfassung|}</a></li>
<li><a href="#tabs-4">{|Wiedervorlagen|}</a></li> <li><a href="#tabs-4">{|Wiedervorlagen|}</a></li>
<li><a href="#tabs-5">{|Notizen|}</a></li> <li><a href="#tabs-5">{|Notizen|}</a></li>
<li><a href="#tabs-6">{|Kontorahmen|}</a></li> <li><a href="#tabs-6">{|Kontenrahmen|}</a></li>
<li><a href="#tabs-7">{|Kontoauszug|}</a></li>
<li><a href="#tabs-8">{|St&uuml;ckliste|}</a></li>
</ul> </ul>
<div id="tabs-1"> <div id="tabs-1">
@@ -508,7 +510,7 @@
<div class="row"> <div class="row">
<div class="col-xs-12 col-sm-1 col-sm-height"> <div class="col-xs-12 col-sm-1 col-sm-height">
<div class="inside inside-full-height"> <div class="inside inside-full-height">
<fieldset><legend>{|Kontorahmen|}</legend> <fieldset><legend>{|Kontenrahmen|}</legend>
<table class="mkTable"> <table class="mkTable">
<tr> <tr>
<th>Variable</th> <th>Variable</th>
@@ -551,4 +553,143 @@
</div> </div>
</div> </div>
</div> </div>
<div id="tabs-7">
<div class="row">
<div class="col-xs-12 col-sm-1 col-sm-height">
<div class="inside inside-full-height">
<fieldset><legend>{|Kontoauszug|}</legend>
<table class="mkTable">
<tr>
<th>Variable</th>
<th>Beschreibung</th>
<th>Kommentar</th>
</tr>
<tr>
<td>konto</td>
<td>Konto-Kurzbezeichnung</td>
<td></td>
</tr>
<tr>
<td>buchung</td>
<td>Buchungsdatum</td>
<td>Im Format DD.MM.YYYY</td>
</tr>
<tr>
<td>betrag</td>
<td>Betrag</td>
<td></td>
</tr>
<tr>
<td>betrag2</td>
<td>Betrag (wenn z.B. Soll / Haben getrennt)</td>
<td></td>
</tr>
<tr>
<td>waehrung</td>
<td>W&auml;hrung</td>
<td>Muss in den W&auml;hrungen vorhanden sein</td>
</tr>
<tr>
<td>buchungstext</td>
<td>Buchungstext</td>
<td>Wird für die Zuordnung verwendet</td>
</tr>
<tr>
<td>buchungstext2</td>
<td>Buchungstext</td>
<td>Wird für die Zuordnung verwendet</td>
</tr>
<tr>
<td>buchungstext3</td>
<td>Buchungstext</td>
<td>Wird für die Zuordnung verwendet</td>
</tr>
<tr>
<td>buchungstext4</td>
<td>Buchungstext</td>
<td>Wird für die Zuordnung verwendet</td>
</tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
<div id="tabs-8">
<div class="row">
<div class="col-xs-12 col-sm-1 col-sm-height">
<div class="inside inside-full-height">
<fieldset><legend>{|St&uuml;ckliste|}</legend>
<table class="mkTable">
<tr>
<th>Variable</th>
<th>Beschreibung</th>
<th>Kommentar</th>
</tr>
<tr>
<td>stuecklistevonartikel</td>
<td>Hauptartikel (muss eine St&uuml;ckliste sein)</td>
<td>Artikelnummer</td>
</tr>
<tr>
<td>artikel</td>
<td></td>
<td>Artikelnummer</td>
</tr>
<tr>
<td>menge</td>
<td>Zahl</td>
<td></td>
</tr>
<tr>
<td>referenz</td>
<td>Text</td>
<td>F&uuml;r Best&uuml;ckungen</td>
</tr>
<tr>
<td>place</td>
<td>Leer oder 'DNP' = Nicht platzieren</td>
<td>F&uuml;r Best&uuml;ckungen</td>
</tr>
<tr>
<td>layer</td>
<td>"top" oder "bottom"</td>
<td>F&uuml;r Best&uuml;ckungen</td>
</tr>
<tr>
<td>wert</td>
<td>Text</td>
<td>F&uuml;r Best&uuml;ckungen</td>
</tr>
<tr>
<td>bauform</td>
<td>Text</td>
<td>F&uuml;r Best&uuml;ckungen</td>
</tr>
<tr>
<td>zachse</td>
<td>Zahl</td>
<td>F&uuml;r Best&uuml;ckungen</td>
</tr>
<tr>
<td>xpos</td>
<td>Zahl</td>
<td>F&uuml;r Best&uuml;ckungen</td>
</tr>
<tr>
<td>ypos</td>
<td>Zahl</td>
<td>F&uuml;r Best&uuml;ckungen</td>
</tr>
<tr>
<td>art</td>
<td>Einkaufsteil "et",Informationsteil "it" oder Beistellung "bt"</td>
<td>Alternativposition?</td>
</tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
</div> </div>
@@ -8,7 +8,7 @@
<!--<td width="25%"><a href="index.php?module=shopexport&action=list"><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_20.gif" border="0" width="30%"></a></td>--> <!--<td width="25%"><a href="index.php?module=shopexport&action=list"><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_20.gif" border="0" width="30%"></a></td>-->
</tr> </tr>
<tr align="center"> <tr align="center">
<td><a href="index.php?module=importvorlage&action=list">{|Stammdaten|} <br>{|Import|}</a></td> <td><a href="index.php?module=importvorlage&action=list">{|Daten|} <br>{|Import|}</a></td>
<td><a href="index.php?module=exportvorlage&action=list">{|Stammdaten|} <br>{|Export|}</a></td> <td><a href="index.php?module=exportvorlage&action=list">{|Stammdaten|} <br>{|Export|}</a></td>
<!--<td><a href="index.php?module=adresse_import&action=list">{|Intranet|}</a></td>--> <!--<td><a href="index.php?module=adresse_import&action=list">{|Intranet|}</a></td>-->
<td><a href="index.php?module=shopimport&action=list">{|Import|}<br>({|Online-Shop|})</a></td> <td><a href="index.php?module=shopimport&action=list">{|Import|}<br>({|Online-Shop|})</a></td>
@@ -17,7 +17,7 @@
<tr><td colspan="99">&nbsp;</td></tr> <tr><td colspan="99">&nbsp;</td></tr>
<tr align="center"> <tr align="center">
<td width="25%"><a href="index.php?module=exportbelegepositionen&action=export"><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_1.gif" border="0" width="30%"></a></td> <td width="25%"><a href="index.php?module=exportbelegepositionen&action=export"><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_1.gif" border="0" width="30%"></a></td>
<td width="25%"><a href="index.php?module=exportbuchhaltung&action=export"><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_1.gif" border="0" width="30%"></a></td> <td width="25%"><a href="index.php?module=exportbuchhaltung&action=export"><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_19.gif" border="0" width="30%"></a></td>
<td width="25%">[BELEGEIMPORTSTART]<a href="index.php?module=belegeimport&action=list"><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_1.gif" border="0" width="30%"></a>[BELEGEIMPORTEND]</td> <td width="25%">[BELEGEIMPORTSTART]<a href="index.php?module=belegeimport&action=list"><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_1.gif" border="0" width="30%"></a>[BELEGEIMPORTEND]</td>
<!--<td width="25%"><a href="index.php?module=shopexport&action=list"><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_20.gif" border="0" width="30%"></a></td>--> <!--<td width="25%"><a href="index.php?module=shopexport&action=list"><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_20.gif" border="0" width="30%"></a></td>-->
</tr> </tr>
+280 -113
View File
@@ -18,37 +18,66 @@
<legend>{|Einstellungen|}</legend> <legend>{|Einstellungen|}</legend>
<table width="100%"> <table width="100%">
<tr> <tr>
<td width="150">{|Bezeichnung|}:</td> <td width="150">
<td><input type="text" name="bezeichnung" id="bezeichnung" size="40" rule="notempty" {|Kurzbezeichnung|}:
msg="Pflichfeld!" tabindex="2" value="[BEZEICHNUNG]"></td> </td>
<td>
<input type="text" name="kurzbezeichnung" id="kurzbezeichnung" size="40" rule="notempty" msg="Pflichfeld!" tabindex="2" value="[KURZBEZEICHNUNG]" required><i>{|Muss eindeutig sein.|}</i>
</td>
</tr> </tr>
<tr> <tr>
<td>{|Typ|}:</td> <td width="150">
{|Bezeichnung|}:
</td>
<td> <td>
<input type="text" name="bezeichnung" id="bezeichnung" size="40" rule="notempty" msg="Pflichfeld!" tabindex="2" value="[BEZEICHNUNG]" required>
</td>
</tr>
<tr>
<td>
{|Typ|}:
</td>
<td>
<!--
<select name="type" id="type"> <select name="type" id="type">
[TYPE] [TYPE]
</select> </select>
-->
<input type="text" name="type" id="type" size="40" value="konto" required readonly>
</td> </td>
</tr> </tr>
<tr> <tr>
<td>{|Projekt|}:</td> <td>
<td><input type="text" size="30" name="projekt" id="projekt" value="[PROJEKT]"></td> {|Projekt|}:
</td>
<td>
<input type="text" size="30" name="projekt" id="projekt" value="[PROJEKT]">
</td>
</tr> </tr>
<tr> <tr>
<td>{|Aktiv|}:</td> <td>
<td><input type="checkbox" name="aktiv" id="aktiv" value="1" {|Aktiv|}:
[AKTIV]><i>{|Aktiv. Nicht mehr verwendete Konten k&ouml;nnen deaktiviert werden.|}</i> </td>
<td>
<input type="checkbox" name="aktiv" id="aktiv" value="1"
[AKTIV]><i>{|Aktiv. Nicht mehr verwendete Konten k&ouml;nnen deaktiviert werden.|}</i>
</td> </td>
</tr> </tr>
<tr> <tr>
<td>{|Keine E-Mail|}:</td> <td>
<td><input type="checkbox" name="keineemail" id="keineemail" value="1" {|Keine E-Mail|}:
[KEINEEMAIL]><i>{|Normalerweise wird beim Zahlungseingang eine Mail an den Kunden gesendet. Soll dies unterdr&uuml;ckt werden muss diese Option gesetzt werden.|}</i> </td>
<td>
<input type="checkbox" name="keineemail" id="keineemail" value="1"
[KEINEEMAIL]><i>{|Normalerweise wird beim Zahlungseingang eine Mail an den Kunden gesendet. Soll dies unterdr&uuml;ckt werden muss diese Option gesetzt werden.|}</i>
</td> </td>
</tr> </tr>
<tr> <tr>
<td>{|&Auml;nderungen erlauben|}:</td> <td>
<td><input type="checkbox" name="schreibbar" id="schreibbar" value="1" {|&Auml;nderungen erlauben|}:
</td>
<td>
<input type="checkbox" name="schreibbar" id="schreibbar" value="1"
[SCHREIBBAR]><i>&nbsp;{|Es d&uuml;rfen nachtr&auml;glich Kontobuchungen ver&auml;ndert werden|}</i> [SCHREIBBAR]><i>&nbsp;{|Es d&uuml;rfen nachtr&auml;glich Kontobuchungen ver&auml;ndert werden|}</i>
</td> </td>
</tr> </tr>
@@ -66,38 +95,71 @@
<legend>{|Bankverbindung (bei Typ Bank)|}</legend> <legend>{|Bankverbindung (bei Typ Bank)|}</legend>
<table width="100%"> <table width="100%">
<tr> <tr>
<td width="150">{|Inhaber|}:</td> <td width="150">{|Inhaber|}:
<td><input type="text" name="inhaber" id="inhaber" size="40" value="[INHABER]"></td> </td>
<td> <td>
<input type="text" name="inhaber" id="inhaber" size="40" value="[INHABER]">
</td>
<td>
</tr> </tr>
<tr> <tr>
<td>{|BIC|}:</td>
<td><input type="text" name="swift" id="swift" size="40" value="[SWIFT]"></td>
<td> <td>
{|BIC|}:
</td>
<td>
<input type="text" name="swift" id="swift" size="40" value="[SWIFT]">
</td>
<td>
</tr> </tr>
<tr> <tr>
<td>{|IBAN|}:</td>
<td><input type="text" name="iban" id="iban" size="40" value="[IBAN]"></td>
<td> <td>
{|IBAN|}:
</td>
<td>
<input type="text" name="iban" id="iban" size="40" value="[IBAN]">
</td>
<td>
</tr> </tr>
<tr> <tr>
<td>{|BLZ|}:</td>
<td><input type="text" name="blz" id="blz" size="40" value="[BLZ]"></td>
<td> <td>
{|BLZ|}:
</td>
<td>
<input type="text" name="blz" id="blz" size="40" value="[BLZ]">
</td>
<td>
</tr> </tr>
<tr> <tr>
<td>{|Konto|}:</td>
<td><input type="text" name="konto" id="konto" size="40" value="[KONTO]"></td>
<td> <td>
{|Konto|}:
</td>
<td>
<input type="text" name="konto" id="konto" size="40" value="[KONTO]">
</td>
<td>
</tr> </tr>
<tr> <tr>
<td>{|Gl&auml;ubiger ID|}:</td>
<td><input type="text" name="glaeubiger" id="glaeubiger" size="40" value="[GLAEUBIGER]"></td>
<td> <td>
{|Gl&auml;ubiger ID|}:
</td>
<td>
<input type="text" name="glaeubiger" id="glaeubiger" size="40" value="[GLAEUBIGER]">
</td>
<td>
</tr> </tr>
<tr> <tr>
<td>{|Lastschrift|}:</td> <td>
<td><input type="checkbox" name="lastschrift" id="lastschrift" value="1" [LASTSCHRIFT]></td> {|Lastschrift|}:
</td>
<td>
<input type="checkbox" name="lastschrift" id="lastschrift" value="1" [LASTSCHRIFT]>
</td>
</tr> </tr>
</table> </table>
</fieldset> </fieldset>
@@ -113,9 +175,13 @@
<legend>{|DATEV|}</legend> <legend>{|DATEV|}</legend>
<table width="100%"> <table width="100%">
<tr> <tr>
<td width="150">{|Konto|}:</td> <td width="150">{|Konto|}:
<td><input type="text" name="datevkonto" id="datevkonto" size="40" value="[DATEVKONTO]"></td> </td>
<td> <td>
<input type="text" name="datevkonto" id="datevkonto" size="40" value="[DATEVKONTO]">
</td>
<td>
</tr> </tr>
</table> </table>
</fieldset> </fieldset>
@@ -123,6 +189,7 @@
</div> </div>
</div> </div>
</div> </div>
<!--
<div class="row"> <div class="row">
<div class="row-height"> <div class="row-height">
<div class="col-xs-12 col-md-12 col-md-height"> <div class="col-xs-12 col-md-12 col-md-height">
@@ -131,46 +198,68 @@
<legend>{|CSV-Import|}</legend> <legend>{|CSV-Import|}</legend>
<table width="100%"> <table width="100%">
<tr> <tr>
<td width="150">{|Erste Datenzeile|}:</td> <td width="150">{|Erste Datenzeile|}:
<td><input type="text" name="importerstezeilenummer" id="importerstezeilenummer" size="15" </td>
value="[IMPORTERSTEZEILENUMMER]">&nbsp;
<i>{|Zeilennummer in der echte Daten stehen (Erste Zeile: 1)|}</i></td>
</tr>
<tr>
<td width="150">{|Kodierung|}:</td>
<td><select name="codierung" id="codierung">[CODIERUNG]</select></td>
</tr>
<tr>
<td width="150">{|Trennzeichen|}:</td>
<td><select name="importtrennzeichen" id="importtrennzeichen">[IMPORTTRENNZEICHEN]</select></td>
</tr>
<tr>
<td width="150">{|Maskierung|}:</td>
<td> <td>
<input type="text" name="importerstezeilenummer" id="importerstezeilenummer" size="15"
value="[IMPORTERSTEZEILENUMMER]">&nbsp;
<i>{|Zeilennummer in der echte Daten stehen (Erste Zeile: 1)|}</i>
</td>
</tr>
<tr>
<td width="150">{|Kodierung|}:
</td>
<td>
<select name="codierung" id="codierung">[CODIERUNG]</select>
</td>
</tr>
<tr>
<td width="150">{|Trennzeichen|}:
</td>
<td>
<select name="importtrennzeichen" id="importtrennzeichen">[IMPORTTRENNZEICHEN]</select>
</td>
</tr>
<tr>
<td width="150">{|Maskierung|}:
</td>
<td>
<select name="importdatenmaskierung" id="importdatenmaskierung"> <select name="importdatenmaskierung" id="importdatenmaskierung">
[IMPORTDATENMASKIERUNG] [IMPORTDATENMASKIERUNG]
</select> </select>
</td> </td>
</tr> </tr>
<tr> <tr>
<td width="150">{|Nullbytes entfernen|}:</td> <td width="150">{|Nullbytes entfernen|}:
<td><input type="checkbox" name="importnullbytes" id="importnullbytes" value="1" [IMPORTNULLBYTES]> </td>
<td>
<input type="checkbox" name="importnullbytes" id="importnullbytes" value="1" [IMPORTNULLBYTES]>
</td> </td>
</tr> </tr>
<tr> <tr>
<td width="150">{|Letzte Zeilen ignorieren|}:</td> <td width="150">{|Letzte Zeilen ignorieren|}:
<td><input type="text" size="15" name="importletztenzeilenignorieren" </td>
id="importletztenzeilenignorieren" value="[IMPORTLETZTENZEILENIGNORIEREN]"></td> <td>
<input type="text" size="15" name="importletztenzeilenignorieren"
id="importletztenzeilenignorieren" value="[IMPORTLETZTENZEILENIGNORIEREN]">
</td>
</tr> </tr>
</table> </table>
<br><br> <br><br>
<table> <table>
<tr> <tr>
<td width="150">{|Spalte in CSV|}</td> <td width="150">{|Spalte in CSV|}
<td>{|Spalten 1 bis n (Spaltennummer in CSV).|}</tr> </td>
<td>
{|Spalten 1 bis n (Spaltennummer in CSV).|}</tr>
<tr> <tr>
<td width="150">{|Datum|}:</td> <td width="150">{|Datum|}:
<td><input type="text" name="importfelddatum" id="importfelddatum" size="15" </td>
<td>
<input type="text" name="importfelddatum" id="importfelddatum" size="15"
value="[IMPORTFELDDATUM]"> value="[IMPORTFELDDATUM]">
&nbsp;{|Eingabeformat|}:&nbsp;<input type="text" name="importfelddatumformat" &nbsp;{|Eingabeformat|}:&nbsp;<input type="text" name="importfelddatumformat"
id="importfelddatumformat" size="20" id="importfelddatumformat" size="20"
@@ -179,67 +268,103 @@
id="importfelddatumformatausgabe" size="20" id="importfelddatumformatausgabe" size="20"
value="[IMPORTFELDDATUMFORMATAUSGABE]"> value="[IMPORTFELDDATUMFORMATAUSGABE]">
<br><i>{|Bsp. 24.12.2016 in CSV entspricht Eingabeformat %1.%2.%3 und Ausgabeformat %3-%2-%1 (Ausgabe muss immer auf diese Format gebracht werden YYYY-MM-DD)|}</i> <br><i>{|Bsp. 24.12.2016 in CSV entspricht Eingabeformat %1.%2.%3 und Ausgabeformat %3-%2-%1 (Ausgabe muss immer auf diese Format gebracht werden YYYY-MM-DD)|}</i>
</td> </td>
</tr> </tr>
<tr> <tr>
<td width="150">{|Betrag|}:</td> <td width="150">{|Betrag|}:
<td><input type="text" name="importfeldbetrag" id="importfeldbetrag" size="15" </td>
value="[IMPORTFELDBETRAG]"></td>
</tr>
<tr>
<td width="150">{|Extra Haben u. Soll|}:</td>
<td><input type="checkbox" name="importextrahabensoll" id="importextrahabensoll" value="1" size="15"
[IMPORTEXTRAHABENSOLL] /></td>
</tr>
<tr>
<td></td>
<td> <td>
<input type="text" name="importfeldbetrag" id="importfeldbetrag" size="15"
value="[IMPORTFELDBETRAG]">
</td>
</tr>
<tr>
<td width="150">{|Extra Haben u. Soll|}:
</td>
<td>
<input type="checkbox" name="importextrahabensoll" id="importextrahabensoll" value="1" size="15"
[IMPORTEXTRAHABENSOLL] />
</td>
</tr>
<tr>
<td>
</td>
<td>
<table> <table>
<tr> <tr>
<td width="150">{|Haben|}:</td> <td width="150">{|Haben|}:
<td><input type="text" name="importfeldhaben" id="importfeldhaben" size="15" </td>
value="[IMPORTFELDHABEN]"></td> <td>
<input type="text" name="importfeldhaben" id="importfeldhaben" size="15"
value="[IMPORTFELDHABEN]">
</td>
</tr> </tr>
<tr> <tr>
<td width="150">{|Soll|}:</td> <td width="150">{|Soll|}:
<td><input type="text" name="importfeldsoll" id="importfeldsoll" size="15" </td>
value="[IMPORTFELDSOLL]"></td> <td>
<input type="text" name="importfeldsoll" id="importfeldsoll" size="15"
value="[IMPORTFELDSOLL]">
</td>
</tr> </tr>
</table> </table>
</td> </td>
</tr> </tr>
<tr> <tr>
<td width="150">{|Buchungstext|}:</td> <td width="150">{|Buchungstext|}:
<td><input type="text" name="importfeldbuchungstext" id="importfeldbuchungstext" size="15" </td>
<td>
<input type="text" name="importfeldbuchungstext" id="importfeldbuchungstext" size="15"
value="[IMPORTFELDBUCHUNGSTEXT]">&nbsp;<i> {|Mit + mehre Spalten zusammenf&uuml;gen (aus dem Inhalt wird eine Pr&uuml;fsumme berechnet, daher so eindeutig wie m&ouml;glich machen.)|}</i> value="[IMPORTFELDBUCHUNGSTEXT]">&nbsp;<i> {|Mit + mehre Spalten zusammenf&uuml;gen (aus dem Inhalt wird eine Pr&uuml;fsumme berechnet, daher so eindeutig wie m&ouml;glich machen.)|}</i>
</td> </td>
</tr> </tr>
<tr> <tr>
<td width="150">{|W&auml;hrung|}:</td> <td width="150">{|W&auml;hrung|}:
<td><input type="text" name="importfeldwaehrung" id="importfeldwaehrung" size="15"
value="[IMPORTFELDWAEHRUNG]">&nbsp;<i>{|Ziel: EUR, USD|}</i></td>
</tr>
<tr>
<td width="150">{|Haben/Soll Kennung|}:</td>
<td><input type="text" name="importfeldhabensollkennung" id="importfeldhabensollkennung" size="15"
value="[IMPORTFELDHABENSOLLKENNUNG]">&nbsp;<i>{|Extra Spalte in der steht was der Betrag ist.|}</i>
</td> </td>
</tr>
<tr>
<td width="150"></td>
<td> <td>
<input type="text" name="importfeldwaehrung" id="importfeldwaehrung" size="15"
value="[IMPORTFELDWAEHRUNG]">&nbsp;<i>{|Ziel: EUR, USD|}</i>
</td>
</tr>
<tr>
<td width="150">{|Haben/Soll Kennung|}:
</td>
<td>
<input type="text" name="importfeldhabensollkennung" id="importfeldhabensollkennung" size="15"
value="[IMPORTFELDHABENSOLLKENNUNG]">&nbsp;<i>{|Extra Spalte in der steht was der Betrag ist.|}</i>
</td>
</tr>
<tr>
<td width="150">
</td>
<td>
<table> <table>
<tr> <tr>
<td width="150">{|Markierung Eingang|}:</td> <td width="150">{|Markierung Eingang|}:
<td><input type="text" name="importfeldkennunghaben" id="importfeldkennunghaben" size="15" </td>
value="[IMPORTFELDKENNUNGHABEN]">&nbsp;<i>{|z.B. H oder +|}</i></td> <td>
<input type="text" name="importfeldkennunghaben" id="importfeldkennunghaben" size="15"
value="[IMPORTFELDKENNUNGHABEN]">&nbsp;<i>{|z.B. H oder +|}</i>
</td>
</tr> </tr>
<tr> <tr>
<td>{|Markierung Ausgang|}:&nbsp;</td> <td>
<td><input type="text" name="importfeldkennungsoll" id="importfeldkennungsoll" size="15" {|Markierung Ausgang|}:&nbsp;
value="[IMPORTFELDKENNUNGSOLL]">&nbsp;<i>{|z.B. S oder -|}</i></td> </td>
<td>
<input type="text" name="importfeldkennungsoll" id="importfeldkennungsoll" size="15"
value="[IMPORTFELDKENNUNGSOLL]">&nbsp;<i>{|z.B. S oder -|}</i>
</td>
</tr> </tr>
</table> </table>
</td> </td>
</tr> </tr>
</table> </table>
@@ -256,37 +381,56 @@
<legend>{|Live-Import|}</legend> <legend>{|Live-Import|}</legend>
<table id="liveimport-table"> <table id="liveimport-table">
<tr> <tr>
<td>{|Live-Import aktiv|}:</td> <td>
<td><input type="checkbox" name="liveimport_online" id="liveimport_online" value="1" {|Live-Import aktiv|}:
[LIVEIMPORT_ONLINE]></td> </td>
<td>
<input type="checkbox" name="liveimport_online" id="liveimport_online" value="1"
[LIVEIMPORT_ONLINE]>
</td>
</tr> </tr>
<tr> <tr>
<td>{|Zeitraum|}:</td>
<td> <td>
{|Zeitraum|}:
</td>
<td>
<select name="importperiode_in_hours" id="importperiode_in_hours"> <select name="importperiode_in_hours" id="importperiode_in_hours">
[IMPORTPERIODE_IN_HOURS] [IMPORTPERIODE_IN_HOURS]
</select> {|Stunden|} </select> {|Stunden|}
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
{|zu Zeiten|}: {|zu Zeiten|}:
</td> </td>
<td> <td>
[SCHEDULER] [SCHEDULER]
</td> </td>
</tr> </tr>
[BEFORELIVEIMPORT] [BEFORELIVEIMPORT]
<tr> <tr>
<td width="150">{|Zugangsdaten|}:</td> <td width="150">{|Zugangsdaten|}:
<td><textarea rows="5" cols="100" name="liveimport" id="liveimport">[LIVEIMPORT]</textarea></td> </td>
<td>
<textarea rows="5" cols="100" name="liveimport" id="liveimport">[LIVEIMPORT]</textarea>
</td>
</tr> </tr>
[AFTERLIVEIMPORT] [AFTERLIVEIMPORT]
<tr> <tr>
<td>{|Passwort Tresor|}:</td> <td>
<td><input type="button" value="{|Passwort setzen|}" {|Passwort Tresor|}:
</td>
<td>
<input type="button" value="{|Passwort setzen|}"
id="setpassword"/> id="setpassword"/>
<i>{|Der Inhalt des Passwort-Tresors kann in der Datenstruktur der Zugangsdaten über die Variable {PASSWORT} genutzt werden.|}</i> <i>{|Der Inhalt des Passwort-Tresors kann in der Datenstruktur der Zugangsdaten über die Variable {PASSWORT} genutzt werden.|}</i>
</td> </td>
</tr> </tr>
</table> </table>
@@ -316,13 +460,21 @@
<legend>{|Prozessstarter|}</legend> <legend>{|Prozessstarter|}</legend>
<table> <table>
<tr> <tr>
<td>{|Zahlungseing&auml;nge automatisch abholen|}:</td> <td>
<td><input type="checkbox" name="cronjobaktiv" id="cronjobaktiv" value="1" [CRONJOBAKTIV]></td> {|Zahlungseing&auml;nge automatisch abholen|}:
</td>
<td>
<input type="checkbox" name="cronjobaktiv" id="cronjobaktiv" value="1" [CRONJOBAKTIV]>
</td>
</tr> </tr>
<tr> <tr>
<td>{|Zahlungseing&auml;nge automatisch verbuchen|}:</td> <td>
<td><input type="checkbox" name="cronjobverbuchen" id="cronjobverbuchen" value="1" {|Zahlungseing&auml;nge automatisch verbuchen|}:
[CRONJOBVERBUCHEN]></td> </td>
<td>
<input type="checkbox" name="cronjobverbuchen" id="cronjobverbuchen" value="1"
[CRONJOBVERBUCHEN]>
</td>
</tr> </tr>
</table> </table>
</fieldset> </fieldset>
@@ -330,6 +482,7 @@
</div> </div>
</div> </div>
</div> </div>
-->
<div class="row"> <div class="row">
<div class="row-height"> <div class="row-height">
<div class="col-xs-12 col-md-12 col-md-height"> <div class="col-xs-12 col-md-12 col-md-height">
@@ -338,20 +491,32 @@
<legend>{|Startwert für Konto|}</legend> <legend>{|Startwert für Konto|}</legend>
<table width="100%"> <table width="100%">
<tr> <tr>
<td width="150">{|Summieren|}:</td> <td width="150">{|Summieren|}:
<td><input type="checkbox" name="saldo_summieren" id="saldo_summieren" value="1" [SALDO_SUMMIEREN]>
</td> </td>
<td> <td>
<input type="checkbox" name="saldo_summieren" id="saldo_summieren" value="1" [SALDO_SUMMIEREN]>
</td>
<td>
</tr> </tr>
<tr> <tr>
<td width="150">{|Datum Saldo|}:</td> <td width="150">{|Datum Saldo|}:
<td><input type="text" name="saldo_datum" id="saldo_datum" size="40" value="[SALDO_DATUM]"></td> </td>
<td> <td>
<input type="text" name="saldo_datum" id="saldo_datum" size="40" value="[SALDO_DATUM]">
</td>
<td>
</tr> </tr>
<tr> <tr>
<td width="150">{|Betrag Saldo|}:</td> <td width="150">{|Betrag Saldo|}:
<td><input type="text" name="saldo_betrag" id="saldo_betrag" size="40" value="[SALDO_BETRAG]"></td> </td>
<td> <td>
<input type="text" name="saldo_betrag" id="saldo_betrag" size="40" value="[SALDO_BETRAG]">
</td>
<td>
</tr> </tr>
</table> </table>
</fieldset> </fieldset>
@@ -359,8 +524,7 @@
</div> </div>
</div> </div>
</div> </div>
<input type="hidden" name="save" value="1" /> <input type="submit" name="submit" value="Speichern" style="float:right"/>
<input type="submit" value="{|Speichern|}" style="float:right"/>
</form> </form>
</div> </div>
<!-- tab view schließen --> <!-- tab view schließen -->
@@ -372,8 +536,11 @@
<input type="hidden" id="e_id" value="[ID]"/> <input type="hidden" id="e_id" value="[ID]"/>
<table width="" cellspacing="0" cellpadding="0"> <table width="" cellspacing="0" cellpadding="0">
<tr> <tr>
<td width="110"><label for="e_passwort">{|Passwort|}:</label></td> <td width="110"><label for="e_passwort">{|Passwort|}:</label>
<td><input type="password" id="e_passwort" name="e_passwort" size="40"/></td> </td>
<td>
<input type="password" id="e_passwort" name="e_passwort" size="40"/>
</td>
</tr> </tr>
</table> </table>
</div> </div>
+151
View File
@@ -0,0 +1,151 @@
<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>{|Kontoauszug Eintrag|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<tr>
<td>
{|Konto|}:
</td>
<td>
<input type="text" name="konto" id="konto" value="[KONTO]" size="20" disabled>
</td>
</tr>
<tr>
<td>
{|Datum|}:
</td>
<td>
<input type="text" name="buchung" id="buchung" value="[BUCHUNG]" size="20" disabled>
</td>
</tr>
<tr>
<td>
{|Betrag|}:
</td>
<td>
<input type="text" name="soll" id="soll" value="[SOLL]" size="20" disabled>
</td>
</tr>
<tr>
<td>
{|W&auml;hrung|}:
</td>
<td>
<input type="text" name="waehrung" id="waehrung" value="[WAEHRUNG]" size="20" disabled>
</td>
</tr>
<tr>
<td>
{|Fertig|}:
</td>
<td>
<input type="text" name="fertig" id="fertig" value="[FERTIG]" size="20" disabled>
</td>
</tr>
<tr>
<td>
{|Datev_abgeschlossen|}:
</td>
<td>
<input type="text" name="datev_abgeschlossen" id="datev_abgeschlossen" value="[DATEV_ABGESCHLOSSEN]" size="20" disabled>
</td>
</tr>
<tr>
<td>
{|Buchungstext|}:
</td>
<td>
<Textarea type="text" name="buchungstext" id="buchungstext" size="20" disabled>[BUCHUNGSTEXT]</textarea>
</td>
</tr>
<tr>
<td>
{|Bearbeiter|}:
</td>
<td>
<input type="text" name="bearbeiter" id="bearbeiter" value="[BEARBEITER]" size="20" disabled>
</td>
</tr>
<tr>
<td>
{|Internebemerkung|}:
</td>
<td>
<textarea type="text" name="internebemerkung" id="internebemerkung" size="20">[INTERNEBEMERKUNG]</textarea>
</td>
</tr>
<tr>
<td>
{|Importfehler|}:
</td>
<td>
<input type="text" name="importfehler" id="importfehler" value="[IMPORTFEHLER]" size="20" disabled>
</td>
</tr>
<tr>
<td>
{|Klaerfall|}:
</td>
<td>
<input type="text" name="klaerfall" id="klaerfall" value="[KLAERFALL]" size="20" disabled>
</td>
</tr>
<tr>
<td>
{|Klaergrund|}:
</td>
<td>
<input type="text" name="klaergrund" id="klaergrund" value="[KLAERGRUND]" size="20" disabled>
</td>
</tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
<input type="submit" name="submit" value="Speichern" style="float:right"/>
</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>
@@ -0,0 +1,14 @@
<div id="tabs">
<ul>
<li><a href="#tabs-1">[TABTEXT1]</a></li>
</ul>
<div id="tabs-1">
<form action="#tabs-1" id="frmauto" name="frmauto" method="post">
[MESSAGE]
<legend>Kontoausz&uuml;ge bitte &uuml;ber Importzentrale importieren.</legend>
[TAB1]
</form>
</div>
</div>
+46
View File
@@ -0,0 +1,46 @@
<div id="tabs">
<ul>
<li><a href="#tabs-1">[TABTEXT1]</a></li>
</ul>
<div id="tabs-1">
<form action="#tabs-1" id="frmauto" name="frmauto" method="post">
[MESSAGE]
<legend>[INFO]</legend>
<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="importfehler" class="switch">
<input type="checkbox" id="importfehler" />
<span class="slider round"></span>
</label>
<label for="meinetickets">{|Inkl. Importfehler|}</label>
</li>
</ul>
</div>
</div>
[TAB1]
<fieldset>
<table>
<legend>Stapelverarbeitung</legend>
<tr>
<td><input type="checkbox" value="1" id="autoalle" />&nbsp;alle markieren&nbsp;</td>
<td><input type="submit" class="btnBlue" name="ausfuehren" value="{|Importfehler|}" /></td>
</tr>
</table>
</fieldset>
</form>
</div>
</div>
<script>
$('#autoalle').on('change',function(){
var wert = $(this).prop('checked');
$('#kontoauszuege_list').find('input[type="checkbox"]').prop('checked',wert);
$('#kontoauszuege_list').find('input[type="checkbox"]').first().trigger('change');
});
</script>
+142
View File
@@ -0,0 +1,142 @@
<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>{|<!--Legend for this form area goes here>-->Mahnwesen-Einstellungen|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<tr>
<td>
{|Name|}:
</td>
<td>
<input type="text" name="name" id="name" value="[NAME]" size="20"><i>Entspricht "Typ" in der Gesch&auml;ftsbrief-Vorlage</i>
</td>
</tr>
<tr>
<td>
{|Tage|}:
</td>
<td>
<input type="number" name="tage" id="tage" value="[TAGE]" size="20">
</td>
</tr>
<tr>
<td>
{|Gebuehr|}:
</td>
<td>
<input type="number" step="0.01" name="gebuehr" id="gebuehr" value="[GEBUEHR]" size="20">
</td>
</tr>
<tr>
<td>
{|E-Mail senden|}:
</td>
<td>
<input type="checkbox" name="mail" id="mail" [MAIL] size="20">
</td>
</tr>
<tr>
<td>
{|Mahnung ausdrucken|}:
</td>
<td>
<input type="checkbox" name="druck" id="druck" [DRUCK] size="20">
</td>
</tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
<!-- Example for 2nd row
<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>{|Another legend|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<tr>
<td>
{|Name|}:
</td>
<td>
<input type="text" name="name" id="name" value="[NAME]" size="20">
</td>
</tr>
<tr>
<td>
{|Tage|}:
</td>
<td>
<input type="text" name="tage" id="tage" value="[TAGE]" size="20">
</td>
</tr>
<tr>
<td>
{|Gebuehr|}:
</td>
<td>
<input type="text" name="gebuehr" id="gebuehr" value="[GEBUEHR]" size="20">
</td>
</tr>
<tr>
<td>
{|Versandmethode|}:
</td>
<td>
<input type="text" name="versandmethode" id="versandmethode" value="[VERSANDMETHODE]" size="20">
</td>
</tr>
</table>
</fieldset>
</div>
</div>
</div>
</div> -->
<input type="submit" name="submit" value="Speichern" style="float:right"/>
</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>
@@ -0,0 +1,10 @@
<div id="tabs">
<ul>
<li><a href="#tabs-1">[TABTEXT1]</a></li>
</ul>
<div id="tabs-1">
[MESSAGE]
[TAB1]
[TAB1NEXT]
</div>
</div>
+64
View File
@@ -0,0 +1,64 @@
<div id="tabs">
<ul>
<li><a href="#tabs-1">[TABTEXT1]</a></li>
</ul>
<div id="tabs-1">
<form method="post" action="#">
<div class="filter-box filter-usersave">
<div class="filter-block filter-inline">
<div class="filter-title">{|Filter|}</div>
<ul class="filter-list">
<li class="filter-item">
<label for="zu_mahnen" class="switch">
<input type="checkbox" id="zu_mahnen">
<span class="slider round"></span>
</label>
<label for="zu_mahnen">{|Nur zu mahnende|}</label>
</li>
<li class="filter-item">
<label for="inkl_bezahlte" class="switch">
<input type="checkbox" id="inkl_bezahlte">
<span class="slider round"></span>
</label>
<label for="inkl_bezahlte">{|Inkl. bezahlte|}</label>
</li>
<li class="filter-item">
<label for="inkl_gesperrte" class="switch">
<input type="checkbox" id="inkl_gesperrte">
<span class="slider round"></span>
</label>
<label for="inkl_gesperrte">{|Inkl. gesperrte|}</label>
</li>
</ul>
<input type="submit" class="btnBlue" name="mahnstufe_berechnen" value="{|Mahnstufe berechnen|}" />
</div>
</div>
</form>
<form method="post" action="#">
[MESSAGE]
[TAB1]
[TAB1NEXT]
<fieldset>
<legend>{|Stapelverarbeitung|}</legend>
<input type="checkbox" id="auswahlalle" onchange="alleauswaehlen();" />&nbsp;{|alle markieren|}&nbsp;
<select id="sel_aktion" name="sel_aktion">
<option value="">{|bitte w&auml;hlen|} ...</option>
[ALSBEZAHLTMARKIEREN]
<option value="offen">{|als offen markieren|}</option>
<option value="mahnung_reset">{|Mahnstatus zur&uuml;cksetzen|}</option>
<option value="mahnen">{|Mahnung durchf&uuml;hren|}</option>
<!-- <option value="email">{|Mahnung durchf&uuml;hren (nur E-Mail)|}</option>
<option value="email">{|Mahnung durchf&uuml;hren (nur Drucken)|}</option> -->
</select>&nbsp;{|Drucker|}: <select name="seldrucker">[SELDRUCKER]</select>&nbsp;<input type="submit" class="btnBlue" name="ausfuehren" value="{|ausf&uuml;hren|}" />
</fieldset>
</form>
</div>
</div>
<script>
function alleauswaehlen()
{
var wert = $('#auswahlalle').prop('checked');
$('#mahnwesen_list').find(':checkbox').prop('checked',wert);
}
</script>
+10 -13
View File
@@ -44,7 +44,7 @@
</div> </div>
<div style="background-color:white"> <div style="background-color:white">
<h2 class="greyh2">Zahlungseingang</h2> <h2 class="greyh2">Buchungen</h2>
<div style="padding:10px"> <div style="padding:10px">
[ZAHLUNGEN] [ZAHLUNGEN]
</div> </div>
@@ -69,15 +69,12 @@
[PDFARCHIV] [PDFARCHIV]
</div> </div>
</div> </div>
<div style="background-color:white"> <!--
<h2 class="greyh2">Deckungsbeitrag</h2> <div style="background-color:white">
<div style="padding:10px"> <h2 class="greyh2">Deckungsbeitrag</h2>
<div style="padding:10px">
<div class="info">Dieses Modul ist erst ab Version Professional verfügbar</div>
<div class="info">Dieses Modul ist erst ab Version Professional verfügbar</div> </div>
</div>
</div> </div>
</div> -->
</div>
+4
View File
@@ -39,9 +39,13 @@
<label for="rechnungenstorniert">{|Storniert|}</label> <label for="rechnungenstorniert">{|Storniert|}</label>
</li> </li>
</ul> </ul>
<form method="post" action="#">
<input type="submit" class="btnBlue" name="zahlungsstatus_berechnen" value="{|Zahlungsstatus berechnen|}" />
</form>
</div> </div>
</div> </div>
[MESSAGE] [MESSAGE]
<form method="post" action="#"> <form method="post" action="#">
[TAB1] [TAB1]
+1 -1
View File
@@ -26,7 +26,7 @@
<input type="checkbox" id="report-list-filter-own"> <input type="checkbox" id="report-list-filter-own">
<span class="slider round"></span> <span class="slider round"></span>
</label> </label>
<label for="report-list-filter-own">{|Nur eigene|}</label> <label for="report-list-filter-own">{|Inkl. Vorlagen|}</label>
</li> </li>
<li class="filter-item"> <li class="filter-item">
<label for="report-list-filter-favorites" class="switch"> <label for="report-list-filter-favorites" class="switch">
@@ -3,12 +3,6 @@
<div id="tabs"> <div id="tabs">
<ul>
<li><a href="#tabs-1">&Uuml;bersicht</a></li>
<!--<li><a href="#tabs-2">neue Position anlegen</a></li>-->
<li><a href="#tabs-3">St&uuml;ckliste importieren</a></li>
</ul>
<!-- erstes tab --> <!-- erstes tab -->
<div id="tabs-1"> <div id="tabs-1">
[MESSAGE] [MESSAGE]
@@ -5,7 +5,7 @@
<ul> <ul>
<li><a href="#tabs-1">&Uuml;bersicht</a></li> <li><a href="#tabs-1">&Uuml;bersicht</a></li>
<li><a href="#tabs-2">neue Position anlegen</a></li> <li><a href="#tabs-2">neue Position anlegen</a></li>
<li><a href="#tabs-3">St&uuml;ckliste importieren</a></li> <!-- DEPRECATED moved to importvorlage <li><a href="#tabs-3">St&uuml;ckliste importieren</a></li> -->
</ul> </ul>
<!-- erstes tab --> <!-- erstes tab -->
+9 -4
View File
@@ -1,5 +1,10 @@
<div id="tabs-1"> <div id="tabs">
[MESSAGE] <ul>
[TAB1] <li><a href="#tabs-1">[TABTEXT1]</a></li>
[TAB1NEXT] </ul>
<div id="tabs-1">
[MESSAGE]
[TAB1]
[TAB1NEXT]
</div>
</div> </div>
+15
View File
@@ -112,6 +112,10 @@ $width = array('10%'); // Fill out manually later
// Write to database // Write to database
// Add checks here // Add checks here
$input['projekt'] = $this->app->erp->ReplaceProjekt(true,$input['projekt'],true); // Parameters: Target db?, value, from form?
$input['ticketprojekt'] = $this->app->erp->ReplaceProjekt(true,$input['ticketprojekt'],true); // Parameters: Target db?, value, from form?
$input['adresse'] = $this->app->erp->ReplaceAdresse(true,$input['adresse'],true); // Parameters: Target db?, value, from form?
$input['ticketqueue'] = explode(" ",$input['ticketqueue'])[0]; // Just the label
$columns = "id, "; $columns = "id, ";
$values = "$id, "; $values = "$id, ";
@@ -168,6 +172,17 @@ $width = array('10%'); // Fill out manually later
$this->app->Tpl->Add('ANGEZEIGTERNAME', $angezeigtername); $this->app->Tpl->Add('ANGEZEIGTERNAME', $angezeigtername);
*/ */
$this->app->YUI->CkEditor("signatur","internal", null, 'JQUERY');
$this->app->YUI->CkEditor("autoresponderbetreff","internal", null, 'JQUERY');
$this->app->YUI->CkEditor("autorespondertext","internal", null, 'JQUERY');
$this->app->Tpl->Set('PROJEKT',$this->app->erp->ReplaceProjekt(false,$result[0]['projekt'],false)); // Parameters: Target db?, value, from form?
$this->app->Tpl->Set('TICKETPROJEKT',$this->app->erp->ReplaceProjekt(false,$result[0]['ticketprojekt'],false)); // Parameters: Target db?, value, from form?
$this->app->Tpl->Set('ADRESSE', $this->app->erp->ReplaceAdresse(false,$result[0]['adresse'],false)); // Convert ID to form display
$this->app->YUI->AutoComplete("projekt","projektname",1);
$this->app->YUI->AutoComplete("ticketprojekt","projektname",1);
$this->app->YUI->AutoComplete("adresse","adresse");
$this->app->YUI->AutoComplete("ticketqueue","warteschlangename");
$this->app->YUI->AutoComplete("ticketprojekt","projektname",1);
$this->app->Tpl->Parse('PAGE', "emailbackup_edit.tpl"); $this->app->Tpl->Parse('PAGE', "emailbackup_edit.tpl");
} }
+93 -34
View File
@@ -77,6 +77,14 @@ class Exportbuchhaltung
$rgchecked = $this->app->Secure->GetPOST("rechnung"); $rgchecked = $this->app->Secure->GetPOST("rechnung");
$gschecked = $this->app->Secure->GetPOST("gutschrift"); $gschecked = $this->app->Secure->GetPOST("gutschrift");
$vbchecked = $this->app->Secure->GetPOST("verbindlichkeit"); $vbchecked = $this->app->Secure->GetPOST("verbindlichkeit");
$diffignore = $this->app->Secure->GetPOST("diffignore");
$sachkonto = $this->app->Secure->GetPOST('sachkonto');
$account_id = null;
if (!empty($sachkonto)) {
$sachkonto_kennung = explode(' ',$sachkonto)[0];
$account_id = $this->app->DB->SelectArr("SELECT id from kontorahmen WHERE sachkonto = '".$sachkonto_kennung."'")[0]['id'];
}
$msg = ""; $msg = "";
@@ -151,7 +159,7 @@ class Exportbuchhaltung
if ($dataok) { if ($dataok) {
$filename = "EXTF_".date('Ymd') . "_Buchungsstapel_DATEV_export.csv"; $filename = "EXTF_".date('Ymd') . "_Buchungsstapel_DATEV_export.csv";
try { try {
$csv = $this->DATEV_Buchuchungsstapel($rgchecked, $gschecked, $vbchecked, $buchhaltung_berater, $buchhaltung_mandant, $buchhaltung_wj_beginn, $buchhaltung_sachkontenlaenge, $von, $bis, $projekt, $filename); $csv = $this->DATEV_Buchuchungsstapel($rgchecked, $gschecked, $vbchecked, $buchhaltung_berater, $buchhaltung_mandant, $buchhaltung_wj_beginn, $buchhaltung_sachkontenlaenge, $von, $bis, $projekt, $filename, $diffignore, $sachkonto_kennung);
header("Content-Disposition: attachment; filename=" . $filename); header("Content-Disposition: attachment; filename=" . $filename);
header("Pragma: no-cache"); header("Pragma: no-cache");
header("Expires: 0"); header("Expires: 0");
@@ -183,25 +191,28 @@ class Exportbuchhaltung
$this->app->YUI->AutoComplete("projekt", "projektname", 1); $this->app->YUI->AutoComplete("projekt", "projektname", 1);
$this->app->YUI->DatePicker("von"); $this->app->YUI->DatePicker("von");
$this->app->YUI->DatePicker("bis"); $this->app->YUI->DatePicker("bis");
$this->app->YUI->AutoComplete('sachkonto', 'sachkonto');
$this->app->Tpl->SET('MESSAGE', $msg); $this->app->Tpl->SET('MESSAGE', $msg);
$this->app->Tpl->SET('RGCHECKED',$rgchecked?'checked':''); $this->app->Tpl->SET('RGCHECKED',$rgchecked?'checked':'');
$this->app->Tpl->SET('GSCHECKED',$gschecked?'checked':''); $this->app->Tpl->SET('GSCHECKED',$gschecked?'checked':'');
$this->app->Tpl->SET('VBCHECKED',$vbchecked?'checked':''); $this->app->Tpl->SET('VBCHECKED',$vbchecked?'checked':'');
$this->app->Tpl->SET('DIFFIGNORE',$diffignore?'checked':'');
$this->app->Tpl->SET('VON', $von_form); $this->app->Tpl->SET('VON', $von_form);
$this->app->Tpl->SET('BIS', $bis_form); $this->app->Tpl->SET('BIS', $bis_form);
$this->app->Tpl->SET('PROJEKT', $projektkuerzel); $this->app->Tpl->SET('PROJEKT', $projektkuerzel);
$this->app->Tpl->SET('SACHKONTO', $sachkonto);
$this->app->Tpl->Parse('PAGE', "exportbuchhaltung_export.tpl"); $this->app->Tpl->Parse('PAGE', "exportbuchhaltung_export.tpl");
} }
/* /*
* Create DATEV Buchhungsstapel * Create DATEV Buchhungsstapel
* @throws ConsistencyException with string (list of items) if consistency check fails * @throws ConsistencyException with string (list of items) if consistency check fails and no sachkonto for differences is given
*/ */
function DATEV_Buchuchungsstapel(bool $rechnung, bool $gutschrift, bool $verbindlichkeit, string $berater, string $mandant, datetime $wj_beginn, int $sachkontenlaenge, datetime $von, datetime $bis, int $projekt = 0, string $filename = 'EXTF_Buchungsstapel_DATEV_export.csv') : string { function DATEV_Buchuchungsstapel(bool $rechnung, bool $gutschrift, bool $verbindlichkeit, string $berater, string $mandant, datetime $wj_beginn, int $sachkontenlaenge, datetime $von, datetime $bis, int $projekt = 0, string $filename = 'EXTF_Buchungsstapel_DATEV_export.csv', $diffignore = false, $sachkonto_differences) : string {
$datev_header_definition = array ( $datev_header_definition = array (
'1' => 'Kennzeichen', '1' => 'Kennzeichen',
@@ -499,7 +510,8 @@ class Exportbuchhaltung
b.".$typ['field_date']." as datum, b.".$typ['field_date']." as datum,
p.id as pos_id, p.id as pos_id,
".$typ['field_betrag_gesamt']." as betrag_gesamt, ".$typ['field_betrag_gesamt']." as betrag_gesamt,
".$typ['field_betrag']." as betrag, b.waehrung,
ROUND(".$typ['field_betrag'].",2) as betrag,
".$typ['field_gegenkonto']." as gegenkonto, ".$typ['field_gegenkonto']." as gegenkonto,
p.waehrung as pos_waehrung p.waehrung as pos_waehrung
FROM FROM
@@ -513,33 +525,72 @@ class Exportbuchhaltung
WHERE WHERE
b.".$typ['field_date']." BETWEEN '".date_format($von,"Y-m-d")."' AND '".date_format($bis,"Y-m-d")."' AND (b.projekt=$projekt OR $projekt=0)".$typ['condition_where']; b.".$typ['field_date']." BETWEEN '".date_format($von,"Y-m-d")."' AND '".date_format($bis,"Y-m-d")."' AND (b.projekt=$projekt OR $projekt=0)".$typ['condition_where'];
// Check consistency of positions // Check consistency of positions
if (!$diffignore) {
$sql_check = "SELECT * $sql_check = "SELECT *
FROM
(
SELECT
belegnr,
betrag_gesamt,
ROUND(SUM(betrag),2) AS betrag_summe
FROM FROM
(".$sql.") posten (
GROUP BY SELECT
belegnr belegnr,
) summen datum,
WHERE betrag_gesamt <> betrag_summe OR betrag_summe IS NULL"; betrag_gesamt,
ROUND(SUM(betrag),2) AS betrag_summe,
waehrung,
kundennummer,
ustid,
auftrag
FROM
(".$sql.") posten
GROUP BY
belegnr
) summen
WHERE betrag_gesamt <> betrag_summe OR betrag_summe IS NULL";
$result = $this->app->DB->SelectArr($sql_check); $result = $this->app->DB->SelectArr($sql_check);
if (!empty($result)) { if (!empty($result)) {
$e = new ConsistencyException(ucfirst($typ['typ']),$result);
throw $e; if (!$sachkonto_differences) {
} $e = new ConsistencyException(ucfirst($typ['typ']),$result);
throw $e;
} else {
// Create differences entries
foreach ($result as $row) {
$posid = $row['pos_id'];
$tmpsteuersatz = 0;
$tmpsteuertext = '';
$erloes = '';
$result = array();
$this->app->erp->GetSteuerPosition($typ['typ'], $posid, $tmpsteuersatz, $tmpsteuertext, $erloes);
$data = array();
$difference = $row['betrag_gesamt']-$row['betrag_summe'];
$data['Umsatz'] = number_format(abs($difference), 2, ',', ''); // obligatory
$data['EU-Steuersatz (Bestimmung)'] = 0;
$data['WKZ Umsatz'] = $row['waehrung'];
$data['Belegfeld 1'] = mb_strimwidth($row['belegnr'],0,12);
$data['Konto'] = $row['kundennummer'];
$data['Soll-/Haben-Kennzeichen'] = ($difference < 0)?'S':'H'; // obligatory
$data['Gegenkonto (ohne BU-Schlüssel)'] = $sachkonto_differences; // obligatory
$data['Belegdatum'] = date_format(date_create($row['datum']),"dm"); // obligatory
$data['Buchungstext'] = "Differenz";
$data['EU-Mitgliedstaat u. UStID (Bestimmung)'] = $row['ustid'];
$data['Auftragsnummer'] = $row['auftrag'];
$csv .= $this->create_line($datev_buchungsstapel_definition,$data);
}
}
}
} // diffignore
// Query position data // Query position data
$arr = $this->app->DB->Query($sql); $arr = $this->app->DB->Query($sql);
while ($row = $this->app->DB->Fetch_Assoc($arr)) { while ($row = $this->app->DB->Fetch_Assoc($arr)) {
// print_r($row); //print_r($row);
$posid = $row['pos_id']; $posid = $row['pos_id'];
$tmpsteuersatz = 0; $tmpsteuersatz = 0;
@@ -572,17 +623,10 @@ class Exportbuchhaltung
$data['Belegdatum'] = date_format(date_create($row['datum']),"dm"); // obligatory $data['Belegdatum'] = date_format(date_create($row['datum']),"dm"); // obligatory
$data['Buchungstext'] = mb_strimwidth($row['name'],0,60); $data['Buchungstext'] = mb_strimwidth($row['name'],0,60);
$data['EU-Mitgliedstaat u. UStID (Bestimmung)'] = $row['ustid']; $data['EU-Mitgliedstaat u. UStID (Bestimmung)'] = $row['ustid'];
$data['Auftragsnummer'] = $row['auftrag'];
$comma = ""; $data['Auftragsnummer'] = ($row['auftrag']!=0)?$row['auftrag']:'';
foreach ($datev_buchungsstapel_definition as $key => $value) {
if (!isset($data[$value])) { $csv .= $this->create_line($datev_buchungsstapel_definition,$data);
$data[$value] = '';
}
$csv .= $comma.'"'.$data[$value].'"';
$comma = ";";
}
$csv .= "\r\n";
} }
} }
@@ -591,6 +635,21 @@ class Exportbuchhaltung
$csv = mb_convert_encoding($csv, "ISO-8859-1", "UTF-8"); $csv = mb_convert_encoding($csv, "ISO-8859-1", "UTF-8");
return($csv); return($csv);
} }
function create_line($definition, $data) : string {
$csv = "";
$comma = "";
foreach ($definition as $key => $value) {
if (!isset($data[$value])) {
$data[$value] = '';
}
$csv .= $comma.'"'.$data[$value].'"';
$comma = ";";
}
$csv .= "\r\n";
return($csv);
}
} }
/* /*
File diff suppressed because it is too large Load Diff
+41 -6
View File
@@ -706,9 +706,12 @@ class Firmendaten {
$n2 = 'adressefreifeld'.$i.'spalte'; $n2 = 'adressefreifeld'.$i.'spalte';
$v1 = $this->app->Secure->GetPOST($n1); $v1 = $this->app->Secure->GetPOST($n1);
$v2 = $this->app->Secure->GetPOST($n2); $v2 = $this->app->Secure->GetPOST($n2);
$this->app->DB->Update("UPDATE firmendaten SET /*$this->app->DB->Update("UPDATE firmendaten SET
$n1 = '".$v1."', $n2 = '".$v2."' $n1 = '".$v1."', $n2 = '".$v2."'
WHERE firma='$id' LIMIT 1"); WHERE firma='$id' LIMIT 1");*/
$this->app->erp->FirmendatenSet($n1,$v1);
$this->app->erp->FirmendatenSet($n2,$v2);
if(isset($firmendaten_werte_spalten)) { if(isset($firmendaten_werte_spalten)) {
if(isset($firmendaten_werte_spalten[$n1]) && $firmendaten_werte_spalten[$n1]['wert'] != $v1) { if(isset($firmendaten_werte_spalten[$n1]) && $firmendaten_werte_spalten[$n1]['wert'] != $v1) {
@@ -746,9 +749,12 @@ class Firmendaten {
$n2 = 'projektfreifeld'.$i.'spalte'; $n2 = 'projektfreifeld'.$i.'spalte';
$v1 = $this->app->Secure->GetPOST($n1); $v1 = $this->app->Secure->GetPOST($n1);
$v2 = $this->app->Secure->GetPOST($n2); $v2 = $this->app->Secure->GetPOST($n2);
$this->app->DB->Update("UPDATE firmendaten SET /* $this->app->DB->Update("UPDATE firmendaten SET
$n1 = '".$v1."', $n2 = '".$v2."' $n1 = '".$v1."', $n2 = '".$v2."'
WHERE firma='$id' LIMIT 1"); WHERE firma='$id' LIMIT 1"); */
$this->app->erp->FirmendatenSet($n1,$v1);
$this->app->erp->FirmendatenSet($n2,$v2);
if(isset($firmendaten_werte_spalten)) { if(isset($firmendaten_werte_spalten)) {
if(isset($firmendaten_werte_spalten[$n1]) && $firmendaten_werte_spalten[$n1]['wert'] != $v1) { if(isset($firmendaten_werte_spalten[$n1]) && $firmendaten_werte_spalten[$n1]['wert'] != $v1) {
@@ -783,6 +789,8 @@ class Firmendaten {
} }
$toupdate = null; $toupdate = null;
/*
for($in = 1; $in <= 40; $in++) { for($in = 1; $in <= 40; $in++) {
$toupdate[] = 'freifeld'.$in; $toupdate[] = 'freifeld'.$in;
} }
@@ -800,7 +808,20 @@ class Firmendaten {
} }
$sql2 = "UPDATE firmendaten SET ".implode(',',$sql2a)." WHERE firma = '$id' LIMIT 1"; $sql2 = "UPDATE firmendaten SET ".implode(',',$sql2a)." WHERE firma = '$id' LIMIT 1";
unset($sql2a); unset($sql2a);
$this->app->DB->Update($sql2); $this->app->DB->Update($sql2);*/
for($in = 1; $in <= 40; $in++) {
$field = 'freifeld'.$in;
$this->app->erp->FirmendatenSet($field,$this->app->Secure->GetPOST($field));
}
for($in = 1; $in <= 20; $in++) {
$field = 'projektfreifeld'.$in;
$this->app->erp->FirmendatenSet($field,$this->app->Secure->GetPOST($field));
$field = 'adressefreifeld'.$in;
$this->app->erp->FirmendatenSet($field,$this->app->Secure->GetPOST($field));
}
if($this->app->DB->error()) { if($this->app->DB->error()) {
foreach($toupdate as $v) { foreach($toupdate as $v) {
$data[$v] = $this->app->Secure->GetPOST($v); $data[$v] = $this->app->Secure->GetPOST($v);
@@ -1022,7 +1043,7 @@ class Firmendaten {
'arbeitsnachweis_header','arbeitsnachweis_footer','provisionsgutschrift_header','provisionsgutschrift_footer','proformarechnung_header','proformarechnung_footer','eu_lieferung_vermerk','export_lieferung_vermerk' 'arbeitsnachweis_header','arbeitsnachweis_footer','provisionsgutschrift_header','provisionsgutschrift_footer','proformarechnung_header','proformarechnung_footer','eu_lieferung_vermerk','export_lieferung_vermerk'
,'wareneingang_kamera_waage','layout_iconbar','passwort','host','port','mailssl','signatur','email','absendername','bcc1','bcc2','bcc3' ,'wareneingang_kamera_waage','layout_iconbar','passwort','host','port','mailssl','signatur','email','absendername','bcc1','bcc2','bcc3'
,'firmenfarbe','name','strasse','plz','ort','steuernummer','projekt','steuer_positionen_export','tabsnavigationfarbe','tabsnavigationfarbeschrift' ,'firmenfarbe','name','strasse','plz','ort','steuernummer','projekt','steuer_positionen_export','tabsnavigationfarbe','tabsnavigationfarbeschrift'
,"buchhaltung_berater","buchhaltung_mandant","buchhaltung_wj_beginn","buchhaltung_sachkontenlaenge" ,"buchhaltung_berater","buchhaltung_mandant","buchhaltung_wj_beginn","buchhaltung_sachkontenlaenge", "fibu_buchungen_startdatum", "rechnung_skonto_kontorahmen"
); );
if(isset($sql2a)){ if(isset($sql2a)){
@@ -1358,6 +1379,11 @@ class Firmendaten {
} }
$this->app->YUI->AutoComplete('steuersatz_normal','steuersatz',1); $this->app->YUI->AutoComplete('steuersatz_normal','steuersatz',1);
$this->app->YUI->AutoComplete('steuersatz_ermaessigt','steuersatz',1); $this->app->YUI->AutoComplete('steuersatz_ermaessigt','steuersatz',1);
$this->app->YUI->DatePicker('fibu_buchungen_startdatum');
$this->app->YUI->AutoComplete('rechnung_skonto_kontorahmen', 'sachkonto');
$this->app->Tpl->Parse('PAGE','firmendaten.tpl'); $this->app->Tpl->Parse('PAGE','firmendaten.tpl');
} }
@@ -1821,6 +1847,12 @@ class Firmendaten {
if(!empty($data[0]['taxfromdoctypesettings'])) { if(!empty($data[0]['taxfromdoctypesettings'])) {
$this->app->Tpl->Set('OPTIONTAXFROMDOCTYPESETTINGS', ' selected="selected" '); $this->app->Tpl->Set('OPTIONTAXFROMDOCTYPESETTINGS', ' selected="selected" ');
} }
// Fibu
$this->app->Tpl->Set('FIBU_BUCHUNGEN_STARTDATUM', $this->app->erp->ReplaceDatum(false,$data[0]['fibu_buchungen_startdatum'],false));
$this->app->Tpl->Set('RECHNUNG_SKONTO_KONTORAHMEN', $this->app->erp->ReplaceKontorahmen(false,$data[0]['rechnung_skonto_kontorahmen']));
} }
} }
@@ -2261,6 +2293,9 @@ class Firmendaten {
$data['buchhaltung_wj_beginn'] = ($this->app->Secure->POST["buchhaltung_wj_beginn"]); $data['buchhaltung_wj_beginn'] = ($this->app->Secure->POST["buchhaltung_wj_beginn"]);
$data['buchhaltung_sachkontenlaenge'] = ($this->app->Secure->POST["buchhaltung_sachkontenlaenge"]); $data['buchhaltung_sachkontenlaenge'] = ($this->app->Secure->POST["buchhaltung_sachkontenlaenge"]);
$data['fibu_buchungen_startdatum'] = $this->app->erp->ReplaceDatum(true,$this->app->Secure->POST["fibu_buchungen_startdatum"],false);
$data['rechnung_skonto_kontorahmen'] = $this->app->erp->ReplaceKontorahmen(true,$this->app->Secure->POST["rechnung_skonto_kontorahmen"]);
return $data; return $data;
} }
+112 -109
View File
@@ -620,6 +620,8 @@ class Gutschrift extends GenGutschrift
$tmp3->DisplayNew('PDFARCHIV','Men&uuml;','noAction'); $tmp3->DisplayNew('PDFARCHIV','Men&uuml;','noAction');
} }
$this->app->Tpl->Add('ZAHLUNGEN',$this->GutschriftZahlung(true));
if($parsetarget=='') { if($parsetarget=='') {
$this->app->Tpl->Output('gutschrift_minidetail.tpl'); $this->app->Tpl->Output('gutschrift_minidetail.tpl');
$this->app->ExitXentral(); $this->app->ExitXentral();
@@ -648,6 +650,7 @@ class Gutschrift extends GenGutschrift
/** /**
* Build the html output for minidetail containing the payments
* @param bool $return * @param bool $return
* *
* @return string * @return string
@@ -656,101 +659,36 @@ class Gutschrift extends GenGutschrift
{ {
$id = $this->app->Secure->GetGET('id'); $id = $this->app->Secure->GetGET('id');
$gutschriftArr = $this->app->DB->SelectArr( $zahlungen = $this->app->erp->GetZahlungen($id,'gutschrift');
"SELECT DATE_FORMAT(datum,'%d.%m.%Y') as datum, belegnr, soll, waehrung, rechnungid if (!empty($zahlungen)) {
FROM gutschrift WHERE id='$id' LIMIT 1" $et = new EasyTable($this->app);
);
$waehrung = empty($gutschriftArr)?'EUR':$gutschriftArr[0]['waehrung'];
if(!$waehrung) {
$waehrung = 'EUR';
}
$rechnungid = empty($gutschriftArr)?0: $gutschriftArr[0]['rechnungid']; $et->headings = array('Datum','Beleg','Betrag','W&auml;hrung');
$auftragid = $rechnungid <= 0?0:$this->app->DB->Select( foreach ($zahlungen as $zahlung) {
sprintf( $row = array(
'SELECT `auftragid` FROM `rechnung` WHERE `id` = %d LIMIT 1', $zahlung['datum'],
$rechnungid "<a href=\"index.php?module=".$zahlung['doc_typ']."&action=edit&id=".$zahlung['doc_id']."\">
) ".ucfirst($zahlung['doc_typ'])."
); ".$zahlung['doc_info']."
$eingang ="<tr><td colspan=\"3\"><b>Zahlungen</b></td></tr>"; </a>",
$zahlung['betrag'],
$zahlung['waehrung']
);
$et->AddRow($row);
}
$salden = $this->app->erp->GetSaldenDokument($id,'gutschrift');
$eingang .="<tr><td class=auftrag_cell>".$gutschriftArr[0]['datum'] foreach ($salden as $saldo) {
."</td><td class=auftrag_cell>GS ".$gutschriftArr[0]['belegnr'] $row = array(
."</td><td class=auftrag_cell align=right>".$this->app->erp->EUR($gutschriftArr[0]['soll']) '',
." $waehrung</td></tr>"; '<b>Saldo</b>',
"<b>".$saldo['betrag']."</b>",
$eingangArr = $this->app->DB->SelectArr( "<b>".$saldo['waehrung']."</b>"
"SELECT ko.bezeichnung as konto, DATE_FORMAT(ke.datum,'%d.%m.%Y') as datum, k.id as kontoauszuege, );
ke.betrag as betrag, k.id as zeile,k.waehrung $et->AddRow($row);
FROM kontoauszuege_zahlungseingang ke }
LEFT JOIN kontoauszuege k ON ke.kontoauszuege=k.id return($et->DisplayNew('return',""));
LEFT JOIN konten ko ON k.konto=ko.id
WHERE (ke.objekt='gutschrift' AND ke.parameter='$id')
OR (ke.objekt='auftrag' AND ke.parameter='$auftragid' AND ke.parameter>0)
OR (ke.objekt='rechnung' AND ke.parameter='$rechnungid' AND ke.parameter>0)"
);
$ceingangArr = empty($eingangArr)?0:(!empty($eingangArr)?count($eingangArr):0);
for($i=0;$i<$ceingangArr;$i++) {
$waehrung = 'EUR';
if($eingangArr[$i]['waehrung']) {
$waehrung = $eingangArr[$i]['waehrung'];
}
$eingang .="<tr><td class=auftrag_cell>".$eingangArr[$i]['datum']
."</td><td class=auftrag_cell>".$eingangArr[$i]['konto']
."&nbsp;(<a href=\"index.php?module=zahlungseingang&action=editzeile&id="
.$eingangArr[$i]['zeile']."\">zur Buchung</a>)</td><td class=auftrag_cell align=right>"
.$this->app->erp->EUR($eingangArr[$i]['betrag'])
." $waehrung</td></tr>";
}
// gutschriften zu dieser rechnung anzeigen
/*
$gutschriften = $this->app->DB->SelectArr("SELECT belegnr, DATE_FORMAT(datum,'%d.%m.%Y') as datum,soll FROM gutschrift WHERE rechnungid='$id'");
for($i=0;$i<(!empty($gutschriften)?count($gutschriften):0);$i++)
$eingang .="<tr><td class=auftrag_cell>".$gutschriften[$i]['datum']."</td><td class=auftrag_cell>GS ".$gutschriften[$i]['belegnr']."</td><td class=auftrag_cell align=right>".$this->app->erp->EUR($gutschriften[$i]['soll'])." EUR</td></tr>";
*/
$ausgang = '';
$ausgangArr = $this->app->DB->SelectArr(
"SELECT ko.bezeichnung as konto, DATE_FORMAT(ke.datum,'%d.%m.%Y') as datum, ke.betrag as betrag,
k.id as zeile,k.waehrung
FROM kontoauszuege_zahlungsausgang ke
LEFT JOIN kontoauszuege k ON ke.kontoauszuege=k.id
LEFT JOIN konten ko ON k.konto=ko.id
WHERE (ke.objekt='gutschrift' AND ke.parameter='$id')
OR (ke.objekt='rechnung' AND ke.parameter='$rechnungid' AND ke.parameter>0)
OR (ke.objekt='auftrag' AND ke.parameter='$auftragid' AND ke.parameter>0)"
);
$cAusgangArr = empty($ausgangArr)?0:(!empty($ausgangArr)?count($ausgangArr):0);
for($i=0;$i<$cAusgangArr;$i++) {
$waehrung = 'EUR';
if($ausgangArr[$i]['waehrung']) {
$waehrung = $ausgangArr[$i]['waehrung'];
}
$ausgang .="<tr><td class=auftrag_cell>".$ausgangArr[$i]['datum']."</td><td class=auftrag_cell>"
.$ausgangArr[$i]['konto']."&nbsp;(<a href=\"index.php?module=zahlungseingang&action=editzeile&id="
.$ausgangArr[$i]['zeile']."\">zur Buchung</a>)</td><td class=auftrag_cell align=right>"
.$this->app->erp->EUR($ausgangArr[$i]['betrag'])
." $waehrung</td></tr>";
}
$saldo = $this->app->erp->EUR($this->app->erp->GutschriftSaldo($id));
if($saldo < 0) {
$saldo = "<b style=\"color:red\">$saldo</b>";
}
$waehrung = $this->app->DB->Select("SELECT waehrung FROM gutschrift WHERE id = '$id' LIMIT 1");
if(!$waehrung) {
$waehrung = 'EUR';
}
$ausgang .="<tr><td class=auftrag_cell></td><td class=auftrag_cell align=right>Saldo</td><td class=auftrag_cell align=right>$saldo $waehrung</td></tr>";
if($return) {
return "<table width=100% border=0 class=auftrag_cell cellpadding=0 cellspacing=0>".$eingang." ".$ausgang."</table>";
} }
} }
@@ -774,17 +712,32 @@ class Gutschrift extends GenGutschrift
$showDefault = true; $showDefault = true;
$this->app->Tpl->Set('TABTEXT','Freigabe'); $this->app->Tpl->Set('TABTEXT','Freigabe');
$this->app->erp->GutschriftNeuberechnen($id); $this->app->erp->GutschriftNeuberechnen($id);
$this->app->erp->CheckVertrieb($id,'gutschrift'); $this->app->erp->CheckVertrieb($id,'gutschrift');
$this->app->erp->CheckBearbeiter($id,'gutschrift'); $this->app->erp->CheckBearbeiter($id,'gutschrift');
$doctype = 'gutschrift'; $doctype = 'gutschrift';
$sql = "SELECT belegnr, rechnungid FROM gutschrift WHERE id='$id' LIMIT 1";
$result = $this->app->DB->SelectArr($sql);
$belegnr = $result[0]['belegnr'];
$rechnungid = $result[0]['rechnungid'];
$name = $this->app->DB->Select("SELECT a.name FROM gutschrift b LEFT JOIN adresse a ON a.id=b.adresse WHERE b.id='$id' LIMIT 1");
$summe = $this->app->DB->Select("SELECT soll FROM gutschrift WHERE id='$id' LIMIT 1");
$waehrung = $this->app->DB->Select("SELECT waehrung FROM gutschrift_position WHERE gutschrift='$id' LIMIT 1");
if(empty($intern)){ if(empty($intern)){
$this->app->erp->RunHook('beleg_freigabe', 4, $doctype, $id, $allowedFrm, $showDefault); $this->app->erp->RunHook('beleg_freigabe', 4, $doctype, $id, $allowedFrm, $showDefault);
} }
if($allowedFrm && $freigabe==$id) { if($allowedFrm && $freigabe==$id) {
$belegnr = $this->app->DB->Select("SELECT belegnr FROM gutschrift WHERE id='$id' LIMIT 1");
if($belegnr=='') { if($belegnr=='') {
$this->app->erp->BelegFreigabe('gutschrift',$id); $this->app->erp->BelegFreigabe('gutschrift',$id);
// Create fibu_buchung
$gegen_rechnung = $this->app->Secure->GetGET('gegen_rechnung');
if ($gegen_rechnung && $rechnungid > 0) {
$this->app->erp->fibu_buchungen_buchen('gutschrift', $id, 'rechnung', $rechnungid, -$summe, $waehrung, date("Y-m-d"), 'Verrechnung');
}
if($intern) { if($intern) {
return 1; return 1;
} }
@@ -798,14 +751,16 @@ class Gutschrift extends GenGutschrift
$this->app->Location->execute("index.php?module=gutschrift&action=edit&id=$id&msg=$msg"); $this->app->Location->execute("index.php?module=gutschrift&action=edit&id=$id&msg=$msg");
} }
if($showDefault){ if($showDefault){
$name = $this->app->DB->Select("SELECT a.name FROM gutschrift b LEFT JOIN adresse a ON a.id=b.adresse WHERE b.id='$id' LIMIT 1"); if ($rechnungid > 0) {
$summe = $this->app->DB->Select("SELECT soll FROM gutschrift WHERE id='$id' LIMIT 1"); $input_html = "<input type=\"button\" value=\"Freigabe ohne Rechnung\" onclick=\"window.location.href='index.php?module=gutschrift&action=freigabe&id=$id&freigabe=$id&gegen_rechnung=0'\">"
$waehrung = $this->app->DB->Select("SELECT waehrung FROM gutschrift_position ."<input type=\"button\" value=\"Freigabe gegen Rechnung\" onclick=\"window.location.href='index.php?module=gutschrift&action=freigabe&id=$id&freigabe=$id&gegen_rechnung=1'\">";
WHERE gutschrift='$id' LIMIT 1"); } else {
$input_html = "<input type=\"button\" value=\"Freigabe Rechnung\" onclick=\"window.location.href='index.php?module=gutschrift&action=freigabe&id=$id&freigabe=$id'\">";
}
$this->app->Tpl->Set('TAB1', "<div class=\"info\">Soll die Gutschrift an <b>$name</b> im Wert von <b>$summe $waehrung</b> $this->app->Tpl->Set('TAB1', "<div class=\"info\">Soll die Gutschrift an <b>$name</b> im Wert von <b>$summe $waehrung</b>
jetzt freigegeben werden? <input type=\"button\" value=\"Freigabe\" onclick=\"window.location.href='index.php?module=gutschrift&action=freigabe&id=$id&freigabe=$id'\"> jetzt freigegeben werden? ".
</div>"); $input_html.
"</div>");
} }
$this->GutschriftMenu(); $this->GutschriftMenu();
$this->app->Tpl->Parse('PAGE','tabview.tpl'); $this->app->Tpl->Parse('PAGE','tabview.tpl');
@@ -1176,7 +1131,6 @@ class Gutschrift extends GenGutschrift
$this->app->erp->CheckBearbeiter($id,"gutschrift"); $this->app->erp->CheckBearbeiter($id,"gutschrift");
$this->app->erp->CheckBuchhaltung($id,"gutschrift"); $this->app->erp->CheckBuchhaltung($id,"gutschrift");
$this->app->erp->GutschriftNeuberechnen($id); $this->app->erp->GutschriftNeuberechnen($id);
$this->app->erp->DisableVerband(); $this->app->erp->DisableVerband();
@@ -1185,14 +1139,11 @@ class Gutschrift extends GenGutschrift
$this->app->Tpl->Set('ICONMENU',$this->GutschriftIconMenu($id)); $this->app->Tpl->Set('ICONMENU',$this->GutschriftIconMenu($id));
$this->app->Tpl->Set('ICONMENU2',$this->GutschriftIconMenu($id,2)); $this->app->Tpl->Set('ICONMENU2',$this->GutschriftIconMenu($id,2));
$belegnr = $this->app->DB->Select("SELECT belegnr FROM gutschrift WHERE id='$id' LIMIT 1"); $belegnr = $this->app->DB->Select("SELECT belegnr FROM gutschrift WHERE id='$id' LIMIT 1");
$nummer = $this->app->DB->Select("SELECT belegnr FROM gutschrift WHERE id='$id' LIMIT 1"); $nummer = $this->app->DB->Select("SELECT belegnr FROM gutschrift WHERE id='$id' LIMIT 1");
$kundennummer = $this->app->DB->Select("SELECT kundennummer FROM gutschrift WHERE id='$id' LIMIT 1"); $kundennummer = $this->app->DB->Select("SELECT kundennummer FROM gutschrift WHERE id='$id' LIMIT 1");
$adresse = $this->app->DB->Select("SELECT adresse FROM gutschrift WHERE id='$id' LIMIT 1"); $adresse = $this->app->DB->Select("SELECT adresse FROM gutschrift WHERE id='$id' LIMIT 1");
$status= $this->app->DB->Select("SELECT status FROM gutschrift WHERE id='$id' LIMIT 1"); $status= $this->app->DB->Select("SELECT status FROM gutschrift WHERE id='$id' LIMIT 1");
$schreibschutz= $this->app->DB->Select("SELECT schreibschutz FROM gutschrift WHERE id='$id' LIMIT 1"); $schreibschutz= $this->app->DB->Select("SELECT schreibschutz FROM gutschrift WHERE id='$id' LIMIT 1");
if($status !== 'angelegt' && $status !== 'angelegta' && $status !== 'a') if($status !== 'angelegt' && $status !== 'angelegta' && $status !== 'a')
@@ -1241,7 +1192,12 @@ class Gutschrift extends GenGutschrift
if($zahlungsweise=="einzugsermaechtigung" || $zahlungsweise=="lastschrift") $this->app->Tpl->Set('EINZUGSERMAECHTIGUNG',""); if($zahlungsweise=="einzugsermaechtigung" || $zahlungsweise=="lastschrift") $this->app->Tpl->Set('EINZUGSERMAECHTIGUNG',"");
if($zahlungsweise=="vorkasse" || $zahlungsweise=="kreditkarte" || $zahlungsweise=="paypal" || $zahlungsweise=="bar") $this->app->Tpl->Set('VORKASSE',""); if($zahlungsweise=="vorkasse" || $zahlungsweise=="kreditkarte" || $zahlungsweise=="paypal" || $zahlungsweise=="bar") $this->app->Tpl->Set('VORKASSE',"");
$zahlungsinfo = $this->app->DB->SelectArr("SELECT zahlungsstatus, ".$this->app->erp->FormatMenge('soll*(-1)',2)." as betrag FROM gutschrift WHERE id='$id' LIMIT 1");
$this->app->Tpl->Set('ZAHLUNGSSTATUS_DB',$zahlungsinfo[0]['zahlungsstatus']);
$this->app->Tpl->Set('SOLL',$zahlungsinfo[0]['betrag']);
$ist = $this->app->erp->EUR($this->app->erp->GetSaldoDokument($id,'gutschrift')['betrag']);
$this->app->Tpl->Set('ISTDB',$ist);
if($schreibschutz=="1" && $this->app->erp->RechteVorhanden("gutschrift","schreibschutz")) if($schreibschutz=="1" && $this->app->erp->RechteVorhanden("gutschrift","schreibschutz"))
{ {
@@ -1249,11 +1205,24 @@ class Gutschrift extends GenGutschrift
// $this->app->erp->CommonReadonly(); // $this->app->erp->CommonReadonly();
} }
if($schreibschutz=="1") if($schreibschutz=="1") {
$this->app->erp->CommonReadonly(); $this->app->erp->CommonReadonly();
}
if($schreibschutz=='1' && $this->app->erp->RechteVorhanden('gutschrift','edit'))
{
$this->app->erp->RemoveReadonly('zahlungsstatus');
if ($aktion = $this->app->Secure->GetPOST('speichern') == 'Speichern') {
$zahlungsstatus = $this->app->Secure->GetPOST('zahlungsstatus');
$this->app->DB->Update("UPDATE gutschrift SET zahlungsstatus='".$zahlungsstatus."' WHERE id='$id' LIMIT 1");
}
}
$rechnungid = $this->app->DB->Select("SELECT rechnungid FROM gutschrift WHERE id='$id' LIMIT 1"); $rechnungid = $this->app->DB->Select("SELECT rechnungid FROM gutschrift WHERE id='$id' LIMIT 1");
$rechnungid = $this->app->DB->Select("SELECT id FROM rechnung WHERE id='$rechnungid' AND belegnr!='' LIMIT 1"); $rechnungid = $this->app->DB->Select("SELECT id FROM rechnung WHERE id='$rechnungid' AND belegnr!='' LIMIT 1");
$alle_gutschriften = $this->app->DB->SelectArr("SELECT id,belegnr FROM gutschrift WHERE rechnungid='$rechnungid' AND rechnungid>0"); $alle_gutschriften = $this->app->DB->SelectArr("SELECT id,belegnr FROM gutschrift WHERE rechnungid='$rechnungid' AND rechnungid>0");
if (!is_null($alle_gutschriften)) { if (!is_null($alle_gutschriften)) {
@@ -1445,6 +1414,8 @@ class Gutschrift extends GenGutschrift
{ {
$this->app->Tpl->Set('UEBERSCHRIFT', 'Gutschriften'); $this->app->Tpl->Set('UEBERSCHRIFT', 'Gutschriften');
$this->app->DB->Update("UPDATE gutschrift SET zahlungsstatus='offen' WHERE zahlungsstatus=''");
if($this->app->Secure->GetPOST('ausfuehren') && $this->app->erp->RechteVorhanden('gutschrift', 'edit')) { if($this->app->Secure->GetPOST('ausfuehren') && $this->app->erp->RechteVorhanden('gutschrift', 'edit')) {
$drucker = $this->app->Secure->GetPOST('seldrucker'); $drucker = $this->app->Secure->GetPOST('seldrucker');
$aktion = $this->app->Secure->GetPOST('sel_aktion'); $aktion = $this->app->Secure->GetPOST('sel_aktion');
@@ -1463,7 +1434,13 @@ class Gutschrift extends GenGutschrift
$ids = array_unique($ids); $ids = array_unique($ids);
switch($aktion) { switch($aktion) {
case 'erledigtam': case 'bezahlt':
$this->app->DB->Update("UPDATE gutschrift SET zahlungsstatus='bezahlt' WHERE id IN (".implode(', ',$ids).')');
break;
case 'offen':
$this->app->DB->Update("UPDATE gutschrift SET zahlungsstatus='offen' WHERE id IN (".implode(', ',$ids).')');
break;
/* case 'erledigtam':
if(!empty($ids)){ if(!empty($ids)){
$this->app->DB->Update( $this->app->DB->Update(
sprintf( sprintf(
@@ -1488,7 +1465,7 @@ class Gutschrift extends GenGutschrift
) )
); );
} }
break; break;*/
case 'mail': case 'mail':
$returnOrders = empty($ids)?[]:$this->app->DB->SelectArr( $returnOrders = empty($ids)?[]:$this->app->DB->SelectArr(
sprintf( sprintf(
@@ -1682,6 +1659,28 @@ class Gutschrift extends GenGutschrift
} }
} }
// refresh all open items
$openids = $this->app->DB->SelectArr("SELECT id, waehrung from gutschrift WHERE zahlungsstatus != 'bezahlt'");
foreach ($openids as $openid) {
$saldo = $this->app->erp->GetSaldoDokument($openid['id'],'gutschrift');
if (!empty($saldo)) {
if ($saldo['waehrung'] == $openid['waehrung']) {
$sql = "UPDATE
gutschrift
SET
ist = ".$saldo['betrag']."+soll,
zahlungsstatus = IF(".$saldo['betrag']." = 0,'bezahlt','offen')
WHERE id=".$openid['id'];
$this->app->DB->Update($sql);
}
}
else {
$this->app->DB->Update("UPDATE gutschrift SET ist = null WHERE id=".$openid['id']);
}
}
$backurl = $this->app->Secure->GetGET('backurl'); $backurl = $this->app->Secure->GetGET('backurl');
$backurl = $this->app->erp->base64_url_decode($backurl); $backurl = $this->app->erp->base64_url_decode($backurl);
@@ -1770,6 +1769,10 @@ class Gutschrift extends GenGutschrift
$this->app->YUI->TableSearch('TAB1','gutschriften'); $this->app->YUI->TableSearch('TAB1','gutschriften');
$this->app->YUI->TableSearch('TAB3','gutschrifteninbearbeitung'); $this->app->YUI->TableSearch('TAB3','gutschrifteninbearbeitung');
if($this->app->erp->RechteVorhanden('rechnung', 'manuellbezahltmarkiert')){
$this->app->Tpl->Set('ALSBEZAHLTMARKIEREN', '<option value="bezahlt">{|als bezahlt markieren|}</option>');
}
$this->app->Tpl->Set( $this->app->Tpl->Set(
'SELDRUCKER', 'SELDRUCKER',
$this->app->erp->GetSelectDrucker($this->app->User->GetParameter('rechnung_list_drucker')) $this->app->erp->GetSelectDrucker($this->app->User->GetParameter('rechnung_list_drucker'))
+178 -14
View File
@@ -1030,7 +1030,7 @@ class Importvorlage extends GenImportvorlage {
if (!move_uploaded_file($_FILES['userfile']['tmp_name'], $stueckliste_csv)) { if (!move_uploaded_file($_FILES['userfile']['tmp_name'], $stueckliste_csv)) {
//$importfilename = $_FILES['userfile']['name']; //$importfilename = $_FILES['userfile']['name'];
$msg = $this->app->erp->base64_url_encode("<div class=\"error\">Die Datei konnte nicht ge&ouml;ffnet werden. Eventuell ist die Datei zu gro&szlig; oder die Schreibrechte stimmen nicht!</div> "); $msg = $this->app->erp->base64_url_encode("<div class=\"error\">Die Datei '".$stueckliste_csv."' konnte nicht ge&ouml;ffnet werden. Eventuell ist die Datei zu gro&szlig; oder die Schreibrechte stimmen nicht!</div> ");
$this->app->Location->execute("index.php?module=importvorlage&action=import&id=$id&msg=$msg"); $this->app->Location->execute("index.php?module=importvorlage&action=import&id=$id&msg=$msg");
} }
@@ -1419,7 +1419,7 @@ class Importvorlage extends GenImportvorlage {
$zeitstempel = time(); $zeitstempel = time();
$number_of_rows = empty($tmp['cmd'])?0:count($tmp['cmd']); $number_of_rows = empty($tmp['cmd'])?0:count($tmp['cmd']);
$number_of_rows = $number_of_rows + 2; // $number_of_rows = $number_of_rows + 2; // ?!?!
if($isCronjob) { if($isCronjob) {
$this->app->DB->Update( $this->app->DB->Update(
@@ -5079,6 +5079,145 @@ class Importvorlage extends GenImportvorlage {
} }
break; break;
case 'kontoauszug':
$allowed_fields = array('konto','buchung','betrag','betrag2','waehrung','buchungstext','buchungstext2','buchungstext3','buchungstext4');
$error = false;
// Create a row dataset (without checked and cmd)
$update_sql = "";
$row = array();
$comma = "";
foreach ($tmp as $key => $value) {
if ($key != 'cmd' && $key != 'checked') {
if (in_array($key,$allowed_fields)) {
$row[$key] = $value[$i];
$comma = ", ";
} else {
$msg .= "Feld nicht korrekt: ".$key.".<br>";
$error = true;
}
}
}
if (!$error) {
// Collect texts
$buchungstext = "";
$comma = "";
foreach ($row as $key => $value) {
if (str_starts_with($key,'buchungstext')) {
if (!empty($value)) {
$buchungstext .= $comma.$value;
$comma = ", ";
}
unset($row[$key]);
}
}
$row['buchungstext'] = $buchungstext;
$row['soll'] = $row['betrag'];
unset($row['betrag']);
if (empty($row['soll'])) {
$row['soll'] = $row['betrag2'];
}
unset($row['betrag2']);
$row['soll'] = $this->app->erp->ReplaceBetrag(true,$row['soll']);
$row['buchung'] = $this->app->erp->ReplaceDatum(true,$row['buchung'],false);
// Calculate hash
$hash_fields = array('buchung','soll','waehrung','buchungstext');
$hash_text = "";
foreach($hash_fields as $hash_field) {
$hash_text .= $row[$hash_field];
}
$row['pruefsumme'] = md5($hash_text);
$sql = "SELECT id FROM konten WHERE kurzbezeichnung ='".$row['konto']."' LIMIT 1";
$kontoid = $this->app->DB->SelectArr($sql);
if (!empty($kontoid)) {
$row['konto'] = $kontoid[0]['id'];
$row['importdatum'] = date("Y-m-d H:i:s");
$sql = "SELECT pruefsumme FROM kontoauszuege WHERE pruefsumme='".$row['pruefsumme']."' AND konto ='".$row['konto']."' AND importfehler IS NULL";
$result = $this->app->DB->SelectArr($sql);
if (!empty($result)) {
$msg .= "Doppelter Eintrag (nicht importiert): ".$row['buchungstext']."<br>";
} else {
$sql = "INSERT INTO kontoauszuege (".
implode(", ",array_keys($row)).
") VALUES ('".
implode("', '",array_values($row)).
"')";
$result = $this->app->DB->Update($sql);
}
} else {
$msg .= "Konto nicht gefunden: ".$row['konto'].".<br>";
}
}
break;
case 'stueckliste':
$allowed_fields = array('stuecklistevonartikel','artikel','menge','art','referenz','layer','wert','bauform','xpos','ypos','zachse','place');
// Create a row dataset (without checked and cmd)
$row = array();
$error_text = "";
$error = $this->create_row_set($tmp, $i, $allowed_fields, $row, $error_text);
if ($error !== false) {
$sql = "SELECT id FROM artikel WHERE stueckliste = 1 AND nummer = '".$row['stuecklistevonartikel']."'";
$von_id = $this->app->DB->SelectArr($sql);
if (empty($von_id)) {
$msg .= "Fehlerhafter 'Stueckliste von'-Artikel \"".$row['stuecklistevonartikel']."\"<br>";
break;
}
$row['stuecklistevonartikel'] = $von_id[0]['id'];
$sql = "SELECT id FROM artikel WHERE nummer = '".$row['artikel']."'";
$artikel_id = $this->app->DB->SelectArr($sql);
if (empty($artikel_id)) {
$msg .= "Fehlerhafter Artikel \"".$row['artikel']."\"<br>";
break;
}
$row['artikel'] = $artikel_id[0]['id'];
if(empty($row['menge'])) {
$row['menge'] = 1;
}
if(empty($row['art'])) {
$row['art'] = 'et';
}
if(empty($row['place']) || $row['place'] == 'DNP') {
$row['place'] = 'DNP';
} else {
$row['place'] = 'DP';
}
$sql = "INSERT INTO stueckliste (".
implode(", ",array_keys($row)).
") VALUES ('".
implode("', '",array_values($row)).
"')";
$result = $this->app->DB->Update($sql);
} else if(!$first_checked) {
$first_checked = true;
$msg .= $error_text;
}
break;
} }
// HERE END OF PROCESSING THE ROWS switch($ziel); // HERE END OF PROCESSING THE ROWS switch($ziel);
@@ -5107,19 +5246,21 @@ class Importvorlage extends GenImportvorlage {
break; break;
} }
} }
} // Loop
if($return) {
if($returnids) {
return $ids;
}
return $number_of_rows;
} }
if($return) {
if($returnids) { if (empty($msg)) {
return $ids; $msg=$this->app->erp->base64_url_encode("<div class=\"info\">Import durchgef&uuml;hrt.</div>");
} $this->app->Location->execute("index.php?module=importvorlage&action=import&id=$id&msg=$msg");
return $number_of_rows; } else {
} $msg=$this->app->erp->base64_url_encode("<div class=\"error\">".$msg."</div>");
if($ziel==='zeiterfassung' || $ziel==='wiedervorlage' || $ziel==='notizen') { $this->app->Location->execute("index.php?module=importvorlage&action=import&id=$id&msg=$msg");
$msg=$this->app->erp->base64_url_encode("<div class=\"info\">Import durchgef&uuml;hrt.</div>"); }
$this->app->Location->execute("index.php?module=importvorlage&action=import&id=$id&msg=$msg");
}
$msg=$this->app->erp->base64_url_encode("<div class=\"info\">Import durchgef&uuml;hrt.</div>");
$this->app->Location->execute("index.php?module=importvorlage&action=import&id=$id&msg=$msg");
} }
/** /**
@@ -6164,5 +6305,28 @@ class Importvorlage extends GenImportvorlage {
return $normalizedDate; return $normalizedDate;
} }
/*
* Create a cleaned row set
* Return true if ok, else see error_message
*/
private function create_row_set(array $tmp, $pos, array $allowed_fields, array &$result_row, string &$error_message) : bool {
$result_ok = true;
$result_row = array();
$error_message = "";
foreach ($tmp as $key => $value) {
if ($key != 'cmd' && $key != 'checked') {
if (in_array($key,$allowed_fields)) {
$result_row[$key] = $value[$pos];
} else {
$error_message .= "Feld nicht korrekt: ".$key.".<br>";
$result_ok = false;
}
}
}
return($result_ok);
}
} }
+1 -1
View File
@@ -1148,7 +1148,7 @@ class Kalender {
// Force user if empty // Force user if empty
if ($data[0]['adresseintern'] == 0) { if ($data[0]['adresseintern'] == 0) {
$data[0]['adresseintern'] = $this->app->User->GetID(); $data[0]['adresseintern'] = $this->app->User->GetAdresse();
} }
$data[0]['adresseintern'] = $this->app->DB->Select("SELECT CONCAT(a.id,' ',a.name) FROM adresse a WHERE a.id='" . $data[0]['adresseintern'] . "' AND a.geloescht=0 LIMIT 1"); $data[0]['adresseintern'] = $this->app->DB->Select("SELECT CONCAT(a.id,' ',a.name) FROM adresse a WHERE a.id='" . $data[0]['adresseintern'] . "' AND a.geloescht=0 LIMIT 1");
+349
View File
@@ -0,0 +1,349 @@
<?php
/*
* Copyright (c) 2022 OpenXE project
*/
use Xentral\Components\Database\Exception\QueryFailureException;
class Konten {
function __construct($app, $intern = false) {
$this->app = $app;
if ($intern)
return;
$this->app->ActionHandlerInit($this);
$this->app->ActionHandler("list", "konten_list");
$this->app->ActionHandler("create", "konten_edit"); // This automatically adds a "New" button
$this->app->ActionHandler("edit", "konten_edit");
$this->app->ActionHandler("delete", "konten_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 "konten_list":
$allowed['konten_list'] = array('list');
$heading = array('','','Bezeichnung', 'Kurzbezeichnung', 'Typ', 'Projekt', 'Aktiv','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('k.id','k.id','k.bezeichnung', 'k.kurzbezeichnung', 'k.type', 'p.abkuerzung', ' k.aktiv','k.id');
$searchsql = array('k.bezeichnung', 'k.kurzbezeichnung', 'k.datevkonto', 'k.blz', 'k.konto', 'k.swift', 'k.iban', 'k.inhaber', 'k.firma','p.abkuerzung');
$defaultorder = 1;
$defaultorderdesc = 0;
$dropnbox = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`, CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',k.id,'\" />') AS `auswahl`";
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" . "<a href=\"index.php?module=konten&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=konten&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
k.id,
$dropnbox,
k.bezeichnung,
k.kurzbezeichnung,
k.type,
p.abkuerzung,
k.aktiv,
k.id
FROM
konten k
LEFT JOIN
projekt p
ON
p.id = k.projekt ";
$where = " k.aktiv = 1 ";
// Toggle filters
$app->Tpl->Add('JQUERYREADY', "$('#archiv').click( function() { fnFilterColumn1( 0 ); } );");
for ($r = 1;$r <= 1;$r++) {
$app->Tpl->Add('JAVASCRIPT', '
function fnFilterColumn' . $r . ' ( i )
{
if(oMoreData' . $r . $name . '==1)
oMoreData' . $r . $name . ' = 0;
else
oMoreData' . $r . $name . ' = 1;
$(\'#' . $name . '\').dataTable().fnFilter(
\'\',
i,
0,0
);
}
');
}
$more_data1 = $app->Secure->GetGET("more_data1");
if ($more_data1 == 1) {
$where .= " OR k.aktiv <> 1";
} else {
}
$count = "SELECT count(DISTINCT id) FROM konten k WHERE $where";
// $groupby = "";
break;
}
$erg = false;
foreach ($erlaubtevars as $k => $v) {
if (isset($$v)) {
$erg[$v] = $$v;
}
}
return $erg;
}
function konten_list() {
$this->app->erp->MenuEintrag("index.php?module=konten&action=list", "&Uuml;bersicht");
$this->app->erp->MenuEintrag("index.php?module=konten&action=create", "Neu anlegen");
$this->app->erp->MenuEintrag("index.php", "Zur&uuml;ck");
$this->app->YUI->TableSearch('TAB1', 'konten_list', "show", "", "", basename(__FILE__), __CLASS__);
$this->app->Tpl->Parse('PAGE', "konten_list.tpl");
}
public function konten_delete() {
$id = (int) $this->app->Secure->GetGET('id');
$this->app->DB->Delete("UPDATE `konten` SET `aktiv` = 0 WHERE `id` = '{$id}'");
$this->app->Tpl->Set('MESSAGE', "<div class=\"info\">Der Eintrag wurde deaktiviert.</div>");
$this->konten_list();
}
/*
* Edit konten item
* If id is empty, create a new one
*/
function konten_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);
$this->app->erp->MenuEintrag("index.php?module=konten&action=edit&id=$id", "Details");
$this->app->erp->MenuEintrag("index.php?module=konten&action=list", "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';
}
if ($submit != '')
{
// Write to database
// Add checks here
$input['projekt'] = $this->app->erp->ReplaceProjekt(true,$input['projekt'],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 konten (".$columns.") VALUES (".$values.") ON DUPLICATE KEY UPDATE ".$update;
// echo($sql);
$this->app->DB->Update($sql);
if ($id == 'NULL') {
$msg = $this->app->erp->base64_url_encode("<div class=\"success\">Das Element wurde erfolgreich angelegt.</div>");
header("Location: index.php?module=konten&action=list&msg=$msg");
} else {
$this->app->Tpl->Set('MESSAGE', "<div class=\"success\">Die Einstellungen wurden erfolgreich &uuml;bernommen.</div>");
}
}
// Load values again from database
$dropnbox = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`, CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',k.id,'\" />') AS `auswahl`";
$result = $this->app->DB->SelectArr("SELECT SQL_CALC_FOUND_ROWS k.id, $dropnbox, k.bezeichnung, k.kurzbezeichnung, k.type, k.erstezeile, k.datevkonto, k.blz, k.konto, k.swift, k.iban, k.lastschrift, k.hbci, k.hbcikennung, k.inhaber, k.aktiv, k.keineemail, k.firma, k.schreibbar, k.importletztenzeilenignorieren, k.liveimport, k.liveimport_passwort, k.liveimport_online, k.importtrennzeichen, k.codierung, k.importerstezeilenummer, k.importdatenmaskierung, k.importnullbytes, k.glaeubiger, k.geloescht, k.projekt, k.saldo_summieren, k.saldo_betrag, k.saldo_datum, k.importfelddatum, k.importfelddatumformat, k.importfelddatumformatausgabe, k.importfeldbetrag, k.importfeldbetragformat, k.importfeldbuchungstext, k.importfeldbuchungstextformat, k.importfeldwaehrung, k.importfeldwaehrungformat, k.importfeldhabensollkennung, k.importfeldkennunghaben, k.importfeldkennungsoll, k.importextrahabensoll, k.importfeldhaben, k.importfeldsoll, k.cronjobaktiv, k.cronjobverbuchen, k.last_import, k.importperiode_in_hours, k.id FROM konten k"." WHERE 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('projekt','projektname',1);
$this->app->Tpl->Set('PROJEKT',$this->app->erp->ReplaceProjekt(false,$result[0]['projekt'],false));
$this->app->Tpl->Set('AKTIV',$result[0]['aktiv']==1?'checked':'');
$this->app->Tpl->Set('KEINEEMAIL',$result[0]['keineemail']==1?'checked':'');
$this->app->Tpl->Set('SCHREIBBAR',$result[0]['schreibbar']==1?'checked':'');
$this->app->Tpl->Set('LASTSCHRIFT',$result[0]['lastschrift']==1?'checked':'');
$this->app->Tpl->Set('SALDO_SUMMIEREN',$result[0]['saldo_summieren']==1?'checked':'');
$this->app->Tpl->Parse('PAGE', "konten_edit.tpl");
}
/**
* Get all paramters from html form and save into $input
*/
public function GetInput(): array {
$input = array();
//$input['EMAIL'] = $this->app->Secure->GetPOST('email');
$input['bezeichnung'] = $this->app->Secure->GetPOST('bezeichnung');
$input['kurzbezeichnung'] = $this->app->Secure->GetPOST('kurzbezeichnung');
$input['type'] = $this->app->Secure->GetPOST('type');
$input['erstezeile'] = $this->app->Secure->GetPOST('erstezeile');
$input['datevkonto'] = $this->app->Secure->GetPOST('datevkonto');
$input['blz'] = $this->app->Secure->GetPOST('blz');
$input['konto'] = $this->app->Secure->GetPOST('konto');
$input['swift'] = $this->app->Secure->GetPOST('swift');
$input['iban'] = $this->app->Secure->GetPOST('iban');
$input['lastschrift'] = $this->app->Secure->GetPOST('lastschrift');
$input['hbci'] = $this->app->Secure->GetPOST('hbci');
$input['hbcikennung'] = $this->app->Secure->GetPOST('hbcikennung');
$input['inhaber'] = $this->app->Secure->GetPOST('inhaber');
$input['aktiv'] = $this->app->Secure->GetPOST('aktiv');
$input['keineemail'] = $this->app->Secure->GetPOST('keineemail');
$input['firma'] = $this->app->Secure->GetPOST('firma');
$input['schreibbar'] = $this->app->Secure->GetPOST('schreibbar');
$input['importletztenzeilenignorieren'] = $this->app->Secure->GetPOST('importletztenzeilenignorieren');
$input['liveimport'] = $this->app->Secure->GetPOST('liveimport');
$input['liveimport_passwort'] = $this->app->Secure->GetPOST('liveimport_passwort');
$input['liveimport_online'] = $this->app->Secure->GetPOST('liveimport_online');
$input['importtrennzeichen'] = $this->app->Secure->GetPOST('importtrennzeichen');
$input['codierung'] = $this->app->Secure->GetPOST('codierung');
$input['importerstezeilenummer'] = $this->app->Secure->GetPOST('importerstezeilenummer');
$input['importdatenmaskierung'] = $this->app->Secure->GetPOST('importdatenmaskierung');
$input['importnullbytes'] = $this->app->Secure->GetPOST('importnullbytes');
$input['glaeubiger'] = $this->app->Secure->GetPOST('glaeubiger');
$input['geloescht'] = $this->app->Secure->GetPOST('geloescht');
$input['projekt'] = $this->app->Secure->GetPOST('projekt');
$input['saldo_summieren'] = $this->app->Secure->GetPOST('saldo_summieren');
$input['saldo_betrag'] = $this->app->Secure->GetPOST('saldo_betrag');
$input['saldo_datum'] = $this->app->Secure->GetPOST('saldo_datum');
$input['importfelddatum'] = $this->app->Secure->GetPOST('importfelddatum');
$input['importfelddatumformat'] = $this->app->Secure->GetPOST('importfelddatumformat');
$input['importfelddatumformatausgabe'] = $this->app->Secure->GetPOST('importfelddatumformatausgabe');
$input['importfeldbetrag'] = $this->app->Secure->GetPOST('importfeldbetrag');
$input['importfeldbetragformat'] = $this->app->Secure->GetPOST('importfeldbetragformat');
$input['importfeldbuchungstext'] = $this->app->Secure->GetPOST('importfeldbuchungstext');
$input['importfeldbuchungstextformat'] = $this->app->Secure->GetPOST('importfeldbuchungstextformat');
$input['importfeldwaehrung'] = $this->app->Secure->GetPOST('importfeldwaehrung');
$input['importfeldwaehrungformat'] = $this->app->Secure->GetPOST('importfeldwaehrungformat');
$input['importfeldhabensollkennung'] = $this->app->Secure->GetPOST('importfeldhabensollkennung');
$input['importfeldkennunghaben'] = $this->app->Secure->GetPOST('importfeldkennunghaben');
$input['importfeldkennungsoll'] = $this->app->Secure->GetPOST('importfeldkennungsoll');
$input['importextrahabensoll'] = $this->app->Secure->GetPOST('importextrahabensoll');
$input['importfeldhaben'] = $this->app->Secure->GetPOST('importfeldhaben');
$input['importfeldsoll'] = $this->app->Secure->GetPOST('importfeldsoll');
$input['cronjobaktiv'] = $this->app->Secure->GetPOST('cronjobaktiv');
$input['cronjobverbuchen'] = $this->app->Secure->GetPOST('cronjobverbuchen');
$input['last_import'] = $this->app->Secure->GetPOST('last_import');
$input['importperiode_in_hours'] = $this->app->Secure->GetPOST('importperiode_in_hours');
return $input;
}
/*
* Set all fields in the page corresponding to $input
*/
function SetInput($input) {
// $this->app->Tpl->Set('EMAIL', $input['email']);
$this->app->Tpl->Set('BEZEICHNUNG', $input['bezeichnung']);
$this->app->Tpl->Set('KURZBEZEICHNUNG', $input['kurzbezeichnung']);
$this->app->Tpl->Set('TYPE', $input['type']);
$this->app->Tpl->Set('ERSTEZEILE', $input['erstezeile']);
$this->app->Tpl->Set('DATEVKONTO', $input['datevkonto']);
$this->app->Tpl->Set('BLZ', $input['blz']);
$this->app->Tpl->Set('KONTO', $input['konto']);
$this->app->Tpl->Set('SWIFT', $input['swift']);
$this->app->Tpl->Set('IBAN', $input['iban']);
$this->app->Tpl->Set('LASTSCHRIFT', $input['lastschrift']);
$this->app->Tpl->Set('HBCI', $input['hbci']);
$this->app->Tpl->Set('HBCIKENNUNG', $input['hbcikennung']);
$this->app->Tpl->Set('INHABER', $input['inhaber']);
$this->app->Tpl->Set('AKTIV', $input['aktiv']);
$this->app->Tpl->Set('KEINEEMAIL', $input['keineemail']);
$this->app->Tpl->Set('FIRMA', $input['firma']);
$this->app->Tpl->Set('SCHREIBBAR', $input['schreibbar']);
$this->app->Tpl->Set('IMPORTLETZTENZEILENIGNORIEREN', $input['importletztenzeilenignorieren']);
$this->app->Tpl->Set('LIVEIMPORT', $input['liveimport']);
$this->app->Tpl->Set('LIVEIMPORT_PASSWORT', $input['liveimport_passwort']);
$this->app->Tpl->Set('LIVEIMPORT_ONLINE', $input['liveimport_online']);
$this->app->Tpl->Set('IMPORTTRENNZEICHEN', $input['importtrennzeichen']);
$this->app->Tpl->Set('CODIERUNG', $input['codierung']);
$this->app->Tpl->Set('IMPORTERSTEZEILENUMMER', $input['importerstezeilenummer']);
$this->app->Tpl->Set('IMPORTDATENMASKIERUNG', $input['importdatenmaskierung']);
$this->app->Tpl->Set('IMPORTNULLBYTES', $input['importnullbytes']);
$this->app->Tpl->Set('GLAEUBIGER', $input['glaeubiger']);
$this->app->Tpl->Set('GELOESCHT', $input['geloescht']);
$this->app->Tpl->Set('PROJEKT', $input['projekt']);
$this->app->Tpl->Set('SALDO_SUMMIEREN', $input['saldo_summieren']);
$this->app->Tpl->Set('SALDO_BETRAG', $input['saldo_betrag']);
$this->app->Tpl->Set('SALDO_DATUM', $input['saldo_datum']);
$this->app->Tpl->Set('IMPORTFELDDATUM', $input['importfelddatum']);
$this->app->Tpl->Set('IMPORTFELDDATUMFORMAT', $input['importfelddatumformat']);
$this->app->Tpl->Set('IMPORTFELDDATUMFORMATAUSGABE', $input['importfelddatumformatausgabe']);
$this->app->Tpl->Set('IMPORTFELDBETRAG', $input['importfeldbetrag']);
$this->app->Tpl->Set('IMPORTFELDBETRAGFORMAT', $input['importfeldbetragformat']);
$this->app->Tpl->Set('IMPORTFELDBUCHUNGSTEXT', $input['importfeldbuchungstext']);
$this->app->Tpl->Set('IMPORTFELDBUCHUNGSTEXTFORMAT', $input['importfeldbuchungstextformat']);
$this->app->Tpl->Set('IMPORTFELDWAEHRUNG', $input['importfeldwaehrung']);
$this->app->Tpl->Set('IMPORTFELDWAEHRUNGFORMAT', $input['importfeldwaehrungformat']);
$this->app->Tpl->Set('IMPORTFELDHABENSOLLKENNUNG', $input['importfeldhabensollkennung']);
$this->app->Tpl->Set('IMPORTFELDKENNUNGHABEN', $input['importfeldkennunghaben']);
$this->app->Tpl->Set('IMPORTFELDKENNUNGSOLL', $input['importfeldkennungsoll']);
$this->app->Tpl->Set('IMPORTEXTRAHABENSOLL', $input['importextrahabensoll']);
$this->app->Tpl->Set('IMPORTFELDHABEN', $input['importfeldhaben']);
$this->app->Tpl->Set('IMPORTFELDSOLL', $input['importfeldsoll']);
$this->app->Tpl->Set('CRONJOBAKTIV', $input['cronjobaktiv']);
$this->app->Tpl->Set('CRONJOBVERBUCHEN', $input['cronjobverbuchen']);
$this->app->Tpl->Set('LAST_IMPORT', $input['last_import']);
$this->app->Tpl->Set('IMPORTPERIODE_IN_HOURS', $input['importperiode_in_hours']);
}
}
+539
View File
@@ -0,0 +1,539 @@
<?php
/*
* Copyright (c) 2022 OpenXE project
*/
use Xentral\Components\Database\Exception\QueryFailureException;
class Kontoauszuege {
function __construct($app, $intern = false) {
$this->app = $app;
if ($intern)
return;
$this->app->ActionHandlerInit($this);
$this->app->ActionHandler("list", "kontoauszuege_konto_list");
$this->app->ActionHandler("listentries", "kontoauszuege_list");
// $this->app->ActionHandler("create", "kontoauszuege_edit"); // This automatically adds a "New" button
$this->app->ActionHandler("edit", "kontoauszuege_edit");
$this->app->ActionHandler("delete", "kontoauszuege_delete");
$this->app->DefaultActionHandler("list");
$this->app->ActionHandlerListen($app);
}
public function Install() {
/* Fill out manually later */
}
function TableSearch(&$app, $name, $erlaubtevars) {
switch ($name) {
case "kontoauszuege_konto_list":
$allowed['konten_list'] = array('list');
$heading = array('Bezeichnung', 'Kurzbezeichnung', 'Typ', 'Kontostand','Letzter Import', '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); sdds
$findcols = array('k.bezeichnung', 'k.kurzbezeichnung', 'k.type', 'k.kontostand','ka.datum', 'k.id');
$searchsql = array('k.bezeichnung', 'k.kurzbezeichnung', 'k.datevkonto', 'k.blz', 'k.konto', 'k.swift', 'k.iban', 'k.inhaber', 'k.firma','p.abkuerzung');
$defaultorder = 1;
$defaultorderdesc = 0;
// $sumcol = array(5);
$dropnbox = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`, CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',k.id,'\" />') AS `auswahl`";
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" . "<a href=\"index.php?module=kontoauszuege&action=listentries&kid=%value%\"><img src=\"./themes/{$app->Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"></a></td></tr></table>";
$saldolink = array (
'<a href=\"index.php?module=fibu_buchungen&action=zuordnen&typ=kontoauszuege',
'">',
['sql' => $this->app->erp->FormatMenge('SUM(COALESCE(fb.betrag,0))',2)],
'</a>'
);
$sql = "SELECT
k.id,
k.bezeichnung,
k.kurzbezeichnung,
".$this->app->erp->FormatUCfirst('k.type').",
".$this->app->erp->FormatMenge('SUM(COALESCE(ka.soll,0))+k.saldo_betrag',2)." AS kontostand,
".$this->app->erp->FormatDatetime("MIN(ka.importdatum)")." AS datum,
k.id
FROM
konten k
LEFT JOIN kontoauszuege ka ON
k.id = ka.konto";
$where = " k.aktiv = 1 AND ka.importfehler IS NULL ";
// Toggle filters
$app->Tpl->Add('JQUERYREADY', "$('#archiv').click( function() { fnFilterColumn1( 0 ); } );");
for ($r = 1;$r <= 1;$r++) {
$app->Tpl->Add('JAVASCRIPT', '
function fnFilterColumn' . $r . ' ( i )
{
if(oMoreData' . $r . $name . '==1)
oMoreData' . $r . $name . ' = 0;
else
oMoreData' . $r . $name . ' = 1;
$(\'#' . $name . '\').dataTable().fnFilter(
\'\',
i,
0,0
);
}
');
}
$more_data1 = $app->Secure->GetGET("more_data1");
if ($more_data1 == 1) {
$where .= " OR k.aktiv <> 1";
} else {
}
// echo($sql);
// $count = "SELECT count(DISTINCT id) FROM konten k WHERE $where";
$groupby = " GROUP BY k.id";
break;
case "kontoauszuege_list":
$allowed['kontoauszuege_list'] = array('list');
$kontoid = $this->app->User->getParameter('kontoauszuege_konto_id');
$onlysaldo = $this->app->User->getParameter('kontoauszuege_only_saldo');
$heading = array('','', 'Importdatum', 'Konto', 'Datum', 'Betrag', 'Waehrung', 'Buchungstext','Interne Bemerkung', 'Saldo', 'Men&uuml;');
$width = array('1%','1%', '1%', '10%', '1%', '1%', '1%', '20%', '20%', '1%', '1%'); // Fill out manually later
// columns that are aligned right (numbers etc)
$alignright = array(6);
$sumcol = array(10);
$findcols = array('q.id','q.id','q.kurzbezeichnung', 'q.importdatum', 'q.buchung', 'q.soll', 'q.waehrung', 'q.buchungstext','q.internebemerkung','q.saldo');
$searchsql = array('q.kurzbezeichnung', 'q.buchung', 'q.soll', 'q.buchungstext','q.internebemerkung');
$defaultorder = 1;
$defaultorderdesc = 0;
$dropnbox = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`, CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',k.id,'\" />') AS `auswahl`";
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" . "<a href=\"index.php?module=kontoauszuege&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=kontoauszuege&action=delete&kid=".$kontoid."&onlysaldo=".$onlysaldo."&id=%value%\");>" . "<img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\"></a>" . "</td></tr></table>";
// Toggle filters
$app->Tpl->Add('JQUERYREADY', "$('#importfehler').click( function() { fnFilterColumn1( 0 ); } );");
for ($r = 1;$r <= 4;$r++) {
$app->Tpl->Add('JAVASCRIPT', '
function fnFilterColumn' . $r . ' ( i )
{
if(oMoreData' . $r . $name . '==1)
oMoreData' . $r . $name . ' = 0;
else
oMoreData' . $r . $name . ' = 1;
$(\'#' . $name . '\').dataTable().fnFilter(
\'\',
i,
0,0
);
}
');
}
$more_data1 = $app->Secure->GetGET("more_data1");
if ($more_data1 == 1) {
$subwhere .= "";
} else {
$subwhere .= " AND k.importfehler IS NULL ";
}
// END Toggle filters
$sql = "SELECT SQL_CALC_FOUND_ROWS * FROM ( SELECT
k.id,
$dropnbox,
".$app->erp->FormatDateTimeShort('k.importdatum')." AS importdatum,
(SELECT kurzbezeichnung FROM konten WHERE konten.id = k.konto) as kurzbezeichnung,
".$app->erp->FormatDate('k.buchung')." as buchung,
IF(
k.importfehler,
CONCAT(
'<del>',
".$app->erp->FormatMenge('(k.soll)',2).",
'</del>'
),
".$app->erp->FormatMenge('(k.soll)',2)."),
k.waehrung,
k.buchungstext,
k.internebemerkung,
".$app->erp->FormatMenge('SUM(fb.betrag)',2)." AS saldo,
k.id as menuid,
SUM(fb.betrag) AS saldonum
FROM kontoauszuege k
LEFT JOIN fibu_buchungen_alle fb ON
fb.id = k.id AND fb.typ = 'kontoauszuege'
WHERE k.konto = ".$kontoid.$subwhere."
GROUP BY k.id ) AS q
";
$where = "1";
if ($onlysaldo) {
$where .= " AND saldonum != 0";
}
// $count = "SELECT count(DISTINCT id) FROM kontoauszuege k WHERE $where";
// $groupby = "";
// echo($sql." WHERE ".$where." ".$groupby);
break;
case "kontoauszuege_salden":
$allowed['kontoauszuege_list'] = array('list');
$kontoid = $this->app->User->getParameter('kontoauszuege_konto_id');
$onlysaldo = $this->app->User->getParameter('kontoauszuege_only_saldo');
$heading = array('','', 'Buchungstext', 'Betrag', 'Waehrung', 'Betrag zuordnen', 'Beleg', 'ID','Beleg-Nr.','', 'Men&uuml;');
$width = array('1%','1%', '20%', '1%', '1%', '1%', '1%', '1%','1%', '1%','1%');
// columns that are aligned right (numbers etc)
$alignright = array(6);
$sumcol = array(10);
$findcols = array('q.id','q.id','q.konto', 'q.importdatum', 'q.buchung', 'q.soll', 'q.waehrung', 'q.buchungstext','q.internebemerkung','q.saldo');
$searchsql = array('q.konto', 'q.buchung', 'q.soll', 'q.buchungstext','q.internebemerkung');
$defaultorder = 1;
$defaultorderdesc = 0;
$dropnbox = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`, CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',q.id,'\"',if(b.doc_belegnr IS NOT NULL,'checked',''),' />') AS `auswahl`";
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" . "<a href=\"index.php?module=kontoauszuege&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=kontoauszuege&action=delete&kid=".$kontoid."&onlysaldo=".$onlysaldo."&id=%value%\");>" . "<img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\"></a>" . "</td></tr></table>";
$sql = "SELECT
".$this->app->erp->FormatUCfirst('typ')."
SUM(betrag)
FROM `fibu_buchungen_alle`
";
$where = "1";
if ($onlysaldo) {
$where .= " AND q.saldonum != 0";
}
// $count = "SELECT count(DISTINCT id) FROM kontoauszuege k WHERE $where";
$groupby = "GROUP BY typ";
// echo($sql." WHERE ".$where." ".$groupby);
break;
}
$erg = false;
foreach ($erlaubtevars as $k => $v) {
if (isset($$v)) {
$erg[$v] = $$v;
}
}
return $erg;
}
function kontoauszuege_konto_list() {
$this->app->erp->MenuEintrag("index.php?module=kontoauszuege&action=list", "&Uuml;bersicht");
// $this->app->erp->MenuEintrag("index.php?module=kontoauszuege&action=create", "Neu anlegen");
$this->app->erp->MenuEintrag("index.php", "Zur&uuml;ck");
$this->app->YUI->TableSearch('TAB1', 'kontoauszuege_konto_list', "show", "", "", basename(__FILE__), __CLASS__);
$this->app->Tpl->Parse('PAGE', "kontoauszuege_konto_list.tpl");
}
function kontoauszuege_mark_as_error(int $id) : ?string {
$sql = "SELECT id FROM fibu_buchungen_alle WHERE CONCAT(doc_typ,doc_id) <> CONCAT('kontoauszuege','".$id."') AND typ = 'kontoauszuege' AND id = ".$id;
$result = $this->app->DB->SelectArr($sql);
if (!empty($result)) {
return("Es existieren Buchungen, Eintrag wurde nicht als Importfehler markiert!");
} else {
$this->app->DB->Delete("UPDATE `kontoauszuege` SET importfehler = 1 WHERE `id` = '{$id}'");
return("Der Eintrag wurde als Importfehler markiert.");
}
return(null);
}
function kontoauszuege_list() {
// Process multi action
$auswahl = $this->app->Secure->GetPOST('auswahl');
$selectedIds = [];
if(!empty($auswahl)) {
foreach($auswahl as $selectedId) {
$selectedId = (int)$selectedId;
if($selectedId > 0) {
$selectedIds[] = $selectedId;
}
}
$submit = $this->app->Secure->GetPOST('ausfuehren');
if ($submit == 'Importfehler') {
$message = "";
foreach ($selectedIds as $selectedId) {
$result = $this->kontoauszuege_mark_as_error($selectedId);
if ($result) {
$message = $result;
}
}
if ($message) {
$this->app->Tpl->Set('MESSAGE', "<div class=\"error\">".$message."</div>");
} else {
$this->app->Tpl->Set('MESSAGE', "<div class=\"warning\">Eintr&auml;ge wurden als Importfehler markiert.</div>");
}
}
}
$this->app->erp->MenuEintrag("index.php?module=kontoauszuege&action=list", "&Uuml;bersicht");
// $this->app->erp->MenuEintrag("index.php?module=kontoauszuege&action=create", "Neu anlegen");
$this->app->erp->MenuEintrag("index.php", "Zur&uuml;ck");
$kontoid = $this->app->Secure->GetGET('kid');
$this->app->User->SetParameter('kontoauszuege_konto_id', $kontoid);
$onlysaldo = $this->app->Secure->GetGET('onlysaldo');
$this->app->User->SetParameter('kontoauszuege_only_saldo', $onlysaldo);
if ($onlysaldo) {
$this->app->Tpl->Set('INFO','Nicht zugeordnete Posten');
}
$this->app->YUI->TableSearch('TAB1', 'kontoauszuege_list', "show", "", "", basename(__FILE__), __CLASS__);
$this->app->Tpl->Parse('PAGE', "kontoauszuege_list.tpl");
}
public function kontoauszuege_delete() {
$id = (int) $this->app->Secure->GetGET('id');
$result = $this->kontoauszuege_mark_as_error($id);
if ($result) {
$this->app->Tpl->Set('MESSAGE', "<div class=\"error\">".$result."</div>");
} else {
$this->app->Tpl->Set('MESSAGE', "<div class=\"warning\">Der Eintrag wurde als Importfehler markiert.</div>");
}
$this->kontoauszuege_list();
}
/*
* Edit kontoauszuege item
* If id is empty, create a new one
*/
function kontoauszuege_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);
$this->app->erp->MenuEintrag("index.php?module=kontoauszuege&action=edit&id=$id", "Details");
$this->app->erp->MenuEintrag("index.php?module=kontoauszuege&action=list", "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';
} */
if ($submit != '')
{
// Write to database
// Add checks here
$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 kontoauszuege (".$columns.") VALUES (".$values.") ON DUPLICATE KEY UPDATE ".$update;
// echo($sql);
$this->app->DB->Update($sql);
if ($id == 'NULL') {
$msg = $this->app->erp->base64_url_encode("<div class=\"success\">Das Element wurde erfolgreich angelegt.</div>");
header("Location: index.php?module=kontoauszuege&action=list&msg=$msg");
} else {
$this->app->Tpl->Set('MESSAGE', "<div class=\"success\">Die Einstellungen wurden erfolgreich &uuml;bernommen.</div>");
}
}
// Load values again from database
$dropnbox = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`, CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',k.id,'\" />') AS `auswahl`";
$result = $this->app->DB->SelectArr("SELECT SQL_CALC_FOUND_ROWS k.id, $dropnbox, k.konto, k.buchung, k.originalbuchung, k.vorgang, k.originalvorgang, k.soll, k.originalsoll, k.haben, k.originalhaben, k.gebuehr, k.originalgebuehr, k.waehrung, k.originalwaehrung, k.fertig, k.datev_abgeschlossen, k.buchungstext, k.gegenkonto, k.belegfeld1, k.bearbeiter, k.mailbenachrichtigung, k.pruefsumme, k.kostenstelle, k.importgroup, k.diff, k.diffangelegt, k.internebemerkung, k.importfehler, k.parent, k.sort, k.doctype, k.doctypeid, k.vorauswahltyp, k.vorauswahlparameter, k.klaerfall, k.klaergrund, k.bezugtyp, k.bezugparameter, k.vorauswahlvorschlag, k.id FROM kontoauszuege k"." WHERE 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);
*/
$sql = "SELECT kurzbezeichnung FROM konten WHERE id=".$result[0]['konto'];
$konto = $this->app->DB->Select($sql);
$this->app->Tpl->Set('KONTO', $konto);
$this->app->Tpl->Set('BUCHUNG', $this->app->erp->ReplaceDatum(false,$result[0]['buchung'],false));
$this->app->Tpl->Set('SOLL', $this->app->erp->ReplaceBetrag(false,$result[0]['soll'],false));
$this->app->Tpl->Parse('PAGE', "kontoauszuege_edit.tpl");
}
/**
* Get all paramters from html form and save into $input
*/
public function GetInput(): array {
$input = array();
//$input['EMAIL'] = $this->app->Secure->GetPOST('email');
/* $input['konto'] = $this->app->Secure->GetPOST('konto');
$input['buchung'] = $this->app->Secure->GetPOST('buchung');
$input['originalbuchung'] = $this->app->Secure->GetPOST('originalbuchung');
$input['vorgang'] = $this->app->Secure->GetPOST('vorgang');
$input['originalvorgang'] = $this->app->Secure->GetPOST('originalvorgang');
$input['soll'] = $this->app->Secure->GetPOST('soll');
$input['originalsoll'] = $this->app->Secure->GetPOST('originalsoll');
$input['haben'] = $this->app->Secure->GetPOST('haben');
$input['originalhaben'] = $this->app->Secure->GetPOST('originalhaben');
$input['gebuehr'] = $this->app->Secure->GetPOST('gebuehr');
$input['originalgebuehr'] = $this->app->Secure->GetPOST('originalgebuehr');
$input['waehrung'] = $this->app->Secure->GetPOST('waehrung');
$input['originalwaehrung'] = $this->app->Secure->GetPOST('originalwaehrung');
$input['fertig'] = $this->app->Secure->GetPOST('fertig');
$input['datev_abgeschlossen'] = $this->app->Secure->GetPOST('datev_abgeschlossen');
$input['buchungstext'] = $this->app->Secure->GetPOST('buchungstext');
$input['gegenkonto'] = $this->app->Secure->GetPOST('gegenkonto');
$input['belegfeld1'] = $this->app->Secure->GetPOST('belegfeld1');
$input['bearbeiter'] = $this->app->Secure->GetPOST('bearbeiter');
$input['mailbenachrichtigung'] = $this->app->Secure->GetPOST('mailbenachrichtigung');
$input['pruefsumme'] = $this->app->Secure->GetPOST('pruefsumme');
$input['kostenstelle'] = $this->app->Secure->GetPOST('kostenstelle');
$input['importgroup'] = $this->app->Secure->GetPOST('importgroup');
$input['diff'] = $this->app->Secure->GetPOST('diff');
$input['diffangelegt'] = $this->app->Secure->GetPOST('diffangelegt');
*/ $input['internebemerkung'] = $this->app->Secure->GetPOST('internebemerkung');
/* $input['importfehler'] = $this->app->Secure->GetPOST('importfehler');
$input['parent'] = $this->app->Secure->GetPOST('parent');
$input['sort'] = $this->app->Secure->GetPOST('sort');
$input['doctype'] = $this->app->Secure->GetPOST('doctype');
$input['doctypeid'] = $this->app->Secure->GetPOST('doctypeid');
$input['vorauswahltyp'] = $this->app->Secure->GetPOST('vorauswahltyp');
$input['vorauswahlparameter'] = $this->app->Secure->GetPOST('vorauswahlparameter');
$input['klaerfall'] = $this->app->Secure->GetPOST('klaerfall');
$input['klaergrund'] = $this->app->Secure->GetPOST('klaergrund');
$input['bezugtyp'] = $this->app->Secure->GetPOST('bezugtyp');
$input['bezugparameter'] = $this->app->Secure->GetPOST('bezugparameter');
$input['vorauswahlvorschlag'] = $this->app->Secure->GetPOST('vorauswahlvorschlag');*/
return $input;
}
/*
* Set all fields in the page corresponding to $input
*/
function SetInput($input) {
// $this->app->Tpl->Set('EMAIL', $input['email']);
$this->app->Tpl->Set('KONTO', $input['konto']);
$this->app->Tpl->Set('BUCHUNG', $input['buchung']);
$this->app->Tpl->Set('ORIGINALBUCHUNG', $input['originalbuchung']);
$this->app->Tpl->Set('VORGANG', $input['vorgang']);
$this->app->Tpl->Set('ORIGINALVORGANG', $input['originalvorgang']);
$this->app->Tpl->Set('SOLL', $input['soll']);
$this->app->Tpl->Set('ORIGINALSOLL', $input['originalsoll']);
$this->app->Tpl->Set('HABEN', $input['haben']);
$this->app->Tpl->Set('ORIGINALHABEN', $input['originalhaben']);
$this->app->Tpl->Set('GEBUEHR', $input['gebuehr']);
$this->app->Tpl->Set('ORIGINALGEBUEHR', $input['originalgebuehr']);
$this->app->Tpl->Set('WAEHRUNG', $input['waehrung']);
$this->app->Tpl->Set('ORIGINALWAEHRUNG', $input['originalwaehrung']);
$this->app->Tpl->Set('FERTIG', $input['fertig']);
$this->app->Tpl->Set('DATEV_ABGESCHLOSSEN', $input['datev_abgeschlossen']);
$this->app->Tpl->Set('BUCHUNGSTEXT', $input['buchungstext']);
$this->app->Tpl->Set('GEGENKONTO', $input['gegenkonto']);
$this->app->Tpl->Set('BELEGFELD1', $input['belegfeld1']);
$this->app->Tpl->Set('BEARBEITER', $input['bearbeiter']);
$this->app->Tpl->Set('MAILBENACHRICHTIGUNG', $input['mailbenachrichtigung']);
$this->app->Tpl->Set('PRUEFSUMME', $input['pruefsumme']);
$this->app->Tpl->Set('KOSTENSTELLE', $input['kostenstelle']);
$this->app->Tpl->Set('IMPORTGROUP', $input['importgroup']);
$this->app->Tpl->Set('DIFF', $input['diff']);
$this->app->Tpl->Set('DIFFANGELEGT', $input['diffangelegt']);
$this->app->Tpl->Set('INTERNEBEMERKUNG', $input['internebemerkung']);
$this->app->Tpl->Set('IMPORTFEHLER', $input['importfehler']);
$this->app->Tpl->Set('PARENT', $input['parent']);
$this->app->Tpl->Set('SORT', $input['sort']);
$this->app->Tpl->Set('DOCTYPE', $input['doctype']);
$this->app->Tpl->Set('DOCTYPEID', $input['doctypeid']);
$this->app->Tpl->Set('VORAUSWAHLTYP', $input['vorauswahltyp']);
$this->app->Tpl->Set('VORAUSWAHLPARAMETER', $input['vorauswahlparameter']);
$this->app->Tpl->Set('KLAERFALL', $input['klaerfall']);
$this->app->Tpl->Set('KLAERGRUND', $input['klaergrund']);
$this->app->Tpl->Set('BEZUGTYP', $input['bezugtyp']);
$this->app->Tpl->Set('BEZUGPARAMETER', $input['bezugparameter']);
$this->app->Tpl->Set('VORAUSWAHLVORSCHLAG', $input['vorauswahlvorschlag']);
}
}
+15 -6
View File
@@ -451,7 +451,7 @@ class Lager extends GenLager {
FROM FROM
einkaufspreise minek einkaufspreise minek
WHERE WHERE
einkaufspreise.artikel = minek.artikel AND DATE( einkaufspreise.geloescht != 1 AND einkaufspreise.artikel = minek.artikel AND DATE(
REPLACE REPLACE
( (
COALESCE(gueltig_bis, '9999-12-31'), COALESCE(gueltig_bis, '9999-12-31'),
@@ -482,7 +482,17 @@ class Lager extends GenLager {
) )
) >= DATE('".$datum."') ) >= DATE('".$datum."')
) )
) ) AND DATE(
REPLACE
(
COALESCE(
einkaufspreise.gueltig_bis,
'9999-12-31'
),
'0000-00-00',
'9999-12-31'
)
) >= DATE('".$datum."')
GROUP BY GROUP BY
artikel, artikel,
waehrung waehrung
@@ -637,6 +647,7 @@ class Lager extends GenLager {
$heading[] = 'Reserviert&nbsp;<sup>*</sup>'; $heading[] = 'Reserviert&nbsp;<sup>*</sup>';
$heading[] = 'Men&uuml;'; $heading[] = 'Men&uuml;';
$width[] = '10%';
$width[] = '10%'; $width[] = '10%';
$width[] = '10%'; $width[] = '10%';
$width[] = '1%'; $width[] = '1%';
@@ -657,7 +668,6 @@ class Lager extends GenLager {
$sql .= "lp.kurzbezeichnung,p.abkuerzung, $sql .= "lp.kurzbezeichnung,p.abkuerzung,
".$app->erp->FormatMenge("ifnull(lpi.menge,0)")." as fmenge , ".$app->erp->FormatMenge("ifnull(lpi.menge,0)")." as fmenge ,
".$app->erp->FormatMenge("IFNULL(mengemhd, ifnull(mengecharge,0))")." as fmengecharge ,
".$app->erp->FormatMenge("IFNULL(lpi2.gmenge,0) - IFNULL(r.reserviert,0)")." as verkaufbare, ".$app->erp->FormatMenge("IFNULL(lpi2.gmenge,0) - IFNULL(r.reserviert,0)")." as verkaufbare,
".$app->erp->FormatMenge("IFNULL(r.reserviert,0)")." as reserviert, ".$app->erp->FormatMenge("IFNULL(r.reserviert,0)")." as reserviert,
a.id "; a.id ";
@@ -695,7 +705,6 @@ class Lager extends GenLager {
}else{ }else{
$sql .= "lp.kurzbezeichnung,p.abkuerzung, $sql .= "lp.kurzbezeichnung,p.abkuerzung,
".$app->erp->FormatMenge("ifnull(lpi.menge,0)")." as fmenge , ".$app->erp->FormatMenge("ifnull(lpi.menge,0)")." as fmenge ,
'' as mengecharge,
".$app->erp->FormatMenge("IFNULL(lpi2.gmenge,0) - IFNULL(r.reserviert,0)")." as verkaufbare, ".$app->erp->FormatMenge("IFNULL(r.reserviert,0)")." as reserviert, a.id "; ".$app->erp->FormatMenge("IFNULL(lpi2.gmenge,0) - IFNULL(r.reserviert,0)")." as verkaufbare, ".$app->erp->FormatMenge("IFNULL(r.reserviert,0)")." as reserviert, a.id ";
$sql .= " $sql .= "
@@ -715,7 +724,7 @@ class Lager extends GenLager {
if($more_data1) { if($more_data1) {
$sql = "SELECT SQL_CALC_FOUND_ROWS a.id, a.nummer,a.name_de,"; $sql = "SELECT SQL_CALC_FOUND_ROWS a.id, a.nummer,a.name_de,";
$sql .= "'-',p.abkuerzung,'0' as menge,'0' as mengecharge, '0' as verkaufbare, ".$app->erp->FormatMenge("IFNULL(r.reserviert,0)")." as reserviert, a.id $sql .= "'-',p.abkuerzung,'0' as menge, '0' as verkaufbare, ".$app->erp->FormatMenge("IFNULL(r.reserviert,0)")." as reserviert, a.id
FROM artikel AS `a` FROM artikel AS `a`
LEFT JOIN (SELECT lpi.artikel, lp.kurzbezeichnung FROM `lager_platz_inhalt` AS `lpi` LEFT JOIN `lager_platz` AS `lp` ON lp.id=lpi.lager_platz GROUP BY lpi.artikel) AS `lp` ON lp.artikel=a.id LEFT JOIN (SELECT lpi.artikel, lp.kurzbezeichnung FROM `lager_platz_inhalt` AS `lpi` LEFT JOIN `lager_platz` AS `lp` ON lp.id=lpi.lager_platz GROUP BY lpi.artikel) AS `lp` ON lp.artikel=a.id
LEFT JOIN (SELECT lr.artikel, SUM(lr.menge) AS `reserviert` FROM `lager_reserviert` AS `lr` GROUP BY lr.artikel) r ON r.artikel=a.id LEFT JOIN (SELECT lr.artikel, SUM(lr.menge) AS `reserviert` FROM `lager_reserviert` AS `lr` GROUP BY lr.artikel) r ON r.artikel=a.id
@@ -2545,7 +2554,7 @@ class Lager extends GenLager {
$name_de = $this->app->DB->Select("SELECT name_de FROM artikel WHERE nummer='{$nummer}' AND geloescht!=1 AND lagerartikel=1 LIMIT 1"); $name_de = $this->app->DB->Select("SELECT name_de FROM artikel WHERE nummer='{$nummer}' AND geloescht!=1 AND lagerartikel=1 LIMIT 1");
$einheit = $this->app->DB->Select("SELECT einheit FROM artikel WHERE nummer='{$nummer}' AND geloescht!=1 AND lagerartikel=1 LIMIT 1"); $einheit = $this->app->DB->Select("SELECT einheit FROM artikel WHERE nummer='{$nummer}' AND geloescht!=1 AND lagerartikel=1 LIMIT 1");
$seriennummer = $this->app->DB->Select("SELECT seriennummer FROM artikel WHERE nummer='{$nummer}' AND geloescht!=1 AND lagerartikel=1 LIMIT 1"); $seriennummer = $this->app->DB->Select("SELECT seriennummern FROM artikel WHERE nummer='{$nummer}' AND geloescht!=1 AND lagerartikel=1 LIMIT 1");
if($seriennummer === 'keine') { if($seriennummer === 'keine') {
$seriennummer = ''; $seriennummer = '';
} }
+721
View File
@@ -0,0 +1,721 @@
<?php
/*
* Copyright (c) 2022 OpenXE project
*/
use Xentral\Components\Database\Exception\QueryFailureException;
class Mahnwesen {
function __construct($app, $intern = false) {
$this->app = $app;
if ($intern)
return;
$this->app->ActionHandlerInit($this);
$this->app->ActionHandler("list", "mahnwesen_list");
$this->app->ActionHandler("create", "mahnwesen_edit"); // This automatically adds a "New" button
$this->app->ActionHandler("edit", "mahnwesen_edit");
$this->app->ActionHandler("einstellungen", "mahnwesen_einstellungen");
$this->app->ActionHandler("delete", "mahnwesen_delete");
$this->app->DefaultActionHandler("list");
$this->app->ActionHandlerListen($app);
}
public function Install() {
/* Fill out manually later */
}
public function TableSearch($app, $name, $erlaubtevars) {
switch ($name) {
case "mahnwesen_list":
$extended_mysql55 = ",'de_DE'";
$allowed['mahnwesen_list'] = array('list');
$heading = array('', '', 'Rechnung', 'Vom', 'Kd-Nr.', 'Kunde', 'Land', 'Projekt', 'Zahlung', 'Betrag (brutto)', 'W&auml;hrung', 'Zahlstatus', 'Differenz', 'Status','F&auml;llig am','Tage','Mahnstufe','Brief','E-Mail','Gemahnt','Mahn-Datum','Sperre','Interne Bemerkung','Men&uuml;');
$width = array('1%','1%','01%', '01%', '01%', '05%', '01%', '01%', '01%', '01%', '01%', '01%', '01%', '01%', '01%', '01%', '01%', '01%', '01%', '01%', '01%', '01%', '20%', '1%'); // Fill out manually later
// columns that are aligned right (numbers etc)
// $alignright = array(4,5,6,7,8);
$faellig_datum = "DATE_ADD(r.datum, INTERVAL r.zahlungszieltage DAY)";
$faellig_tage = "DATEDIFF(CURRENT_DATE,DATE_ADD(r.datum, INTERVAL r.zahlungszieltage DAY))";
$mahn_druck = "if(m.druck,'Ja','')";
$mahn_mail = "if(m.mail,'Ja','')";
$mahn_versendet = "if(r.versendet_mahnwesen,'Ja','')";
$findcols = array('r.id','r.id','r.belegnr', 'r.datum', 'r.kundennummer','r.name', 'r.land','p.abkuerzung','r.zahlungsweise','r.soll','r.waehrung','r.zahlungsstatus','r.soll','r.status',$faellig_datum,$faellig_tage,'m.name',$mahn_druck,$mahn_mail,$mahn_versendet,'mahnwesen_datum');
$searchsql = array('r.belegnr', 'r.name', $faellig_datum, 'r.kundennummer');
$defaultorder = 1;
$defaultorderdesc = 0;
$dropnbox = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`, CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',r.id,'\" />') AS `auswahl`";
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" . "<a href=\"index.php?module=rechnung&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
r.id,
$dropnbox,
r.belegnr,
".$app->erp->FormatDateShort('r.datum')." as vom,
if(r.kundennummer <> '',r.kundennummer,adr.kundennummer),
CONCAT(" . $app->erp->MarkerUseredit("r.name", "r.useredittimestamp") . ", if(r.internebezeichnung!='',CONCAT('<br><i style=color:#999>',r.internebezeichnung,'</i>'),'')) as kunde,
r.land as land,
p.abkuerzung as projekt,
r.zahlungsweise as zahlungsweise,
FORMAT(r.soll,2{$extended_mysql55} ) as soll,
ifnull(r.waehrung,'EUR'),
r.zahlungsstatus as zahlung,
if(r.soll-r.ist!=0 AND r.ist > 0,FORMAT(r.ist-r.soll,2{$extended_mysql55}),FORMAT((r.soll-r.ist)*-1,2{$extended_mysql55})) as fehlt,
if(r.status = 'storniert' AND r.teilstorno = 1,'TEILSTORNO',UPPER(r.status)) as status,
".$app->erp->FormatDateShort($faellig_datum)." as faellig_datum,
if(".$faellig_tage.">0,".$faellig_tage.",'') as faellig_tage,
m.name,
".$mahn_druck.",
".$mahn_mail.",
".$mahn_versendet.",
if(mahnwesen_datum <> '0000-00-00',".$app->erp->FormatDateShort('mahnwesen_datum').",''),
if(r.mahnwesen_gesperrt,'Ja',''),
REPLACE(r.mahnwesen_internebemerkung,'\r\n','<br> '),
r.id
FROM rechnung r LEFT JOIN projekt p ON p.id=r.projekt LEFT JOIN adresse adr ON r.adresse=adr.id LEFT JOIN auftrag au ON au.id = r.auftragid LEFT JOIN mahnwesen m ON r.mahnwesen = m.id";
$where = " r.belegnr <> ''";
// Toggle filters
$this->app->Tpl->Add('JQUERYREADY', "$('#zu_mahnen').click( function() { fnFilterColumn1( 0 ); } );");
$this->app->Tpl->Add('JQUERYREADY', "$('#inkl_bezahlte').click( function() { fnFilterColumn2( 0 ); } );");
$this->app->Tpl->Add('JQUERYREADY', "$('#inkl_gesperrte').click( function() { fnFilterColumn3( 0 ); } );");
for ($r = 1;$r <= 3;$r++) {
$this->app->Tpl->Add('JAVASCRIPT', '
function fnFilterColumn' . $r . ' ( i )
{
if(oMoreData' . $r . $name . '==1)
oMoreData' . $r . $name . ' = 0;
else
oMoreData' . $r . $name . ' = 1;
$(\'#' . $name . '\').dataTable().fnFilter(
\'\',
i,
0,0
);
}
');
}
$more_data1 = $app->Secure->GetGET("more_data1");
if ($more_data1 == 1) {
$where .= " AND NOT r.versendet_mahnwesen AND r.mahnwesen <> ''";
} else {
}
$more_data2 = $app->Secure->GetGET("more_data2");
if ($more_data2 == 1) {
} else {
$where .= " AND r.zahlungsstatus <> 'bezahlt' ";
}
$more_data3 = $app->Secure->GetGET("more_data3");
if ($more_data3 == 1) {
}
else {
$where .= " AND NOT r.mahnwesen_gesperrt ";
}
// END Toggle filters
$count = "SELECT count(DISTINCT id) FROM rechnung r WHERE $where";
// $groupby = "";
break;
case "mahnwesen_einstellungen":
$allowed['mahnwesen_list'] = array('list');
$heading = array('', 'Tage', 'Name', 'Gebuehr', 'E-Mail', 'Druck', '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('m.id', 'm.tage','m.name', 'm.gebuehr', 'm.mail','m.druck');
$searchsql = array('m.name','m.tage', 'm.gebuehr', 'm.versandmethode');
$defaultorder = 1;
$defaultorderdesc = 1;
$dropnbox = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`";
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" . "<a href=\"index.php?module=mahnwesen&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=mahnwesen&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
m.id,
$dropnbox,
m.tage,
m.name,
".$this->app->erp->FormatMenge('m.gebuehr',2).",
if(m.mail,'Ja',''),
if(m.druck,'Ja',''),
m.id FROM mahnwesen m";
$where = "1";
$count = "SELECT count(DISTINCT id) FROM mahnwesen WHERE $where";
// $groupby = "";
break;
}
$erg = false;
foreach ($erlaubtevars as $k => $v) {
if (isset($$v)) {
$erg[$v] = $$v;
}
}
return $erg;
}
function mahnwesen_list() {
$this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=list", "&Uuml;bersicht");
// $this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=create", "Neu anlegen");
// $this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=einstellungen", "Einstellungen");
if($this->app->Secure->GetPOST('mahnstufe_berechnen') && $this->app->erp->RechteVorhanden('rechnung', 'edit')) {
$this->app->erp->rechnung_zahlstatus_berechnen();
$sql = "
SELECT
r.id, r.mahnwesen, rid_mid.mahnwesen_neu
FROM
rechnung r
INNER JOIN
(
SELECT
id_tage.id,
m.id AS mahnwesen_neu
FROM
mahnwesen m
INNER JOIN(
SELECT
id,
MAX(tage) AS tage
FROM
(
SELECT
r.id,
m.tage
FROM
rechnung r
INNER JOIN mahnwesen m ON
DATEDIFF(
CURRENT_DATE,
DATE_ADD(
r.datum,
INTERVAL r.zahlungszieltage DAY
)
) > m.tage
WHERE
r.zahlungsstatus = 'offen'
ORDER BY
`r`.`id` ASC
) temp
GROUP BY
id
) id_tage
ON
m.tage = id_tage.tage
) rid_mid
ON r.id = rid_mid.id
";
$offene_rechnungen = $this->app->DB->SelectArr($sql);
foreach ($offene_rechnungen as $offene_rechnung) {
if ($offene_rechnung['mahnwesen'] != $offene_rechnung['mahnwesen_neu']) {
$sql = "UPDATE rechnung set mahnwesen = ".$offene_rechnung['mahnwesen_neu'].", versendet_mahnwesen = 0 WHERE id = ".$offene_rechnung['id'];
$this->app->DB->Update($sql);
}
}
}
if($this->app->Secure->GetPOST('sel_aktion') && $this->app->erp->RechteVorhanden('rechnung', 'edit'))
{
$drucker = $this->app->Secure->GetPOST('seldrucker');
$aktion = $this->app->Secure->GetPOST('sel_aktion');
$auswahl = $this->app->Secure->GetPOST('auswahl');
if($drucker > 0) {
$this->app->erp->BriefpapierHintergrundDisable($drucker);
}
if(is_array($auswahl)) {
foreach($auswahl as $auswahlKey => $auswahlValue) {
if((int)$auswahlValue > 0) {
$auswahl[$auswahlKey] = (int)$auswahlValue;
}
else {
unset($auswahl[$auswahlKey]);
}
}
switch($aktion)
{
case 'bezahlt':
$this->app->DB->Update("UPDATE rechnung SET zahlungsstatus='bezahlt', bezahlt_am = now(), mahnwesenfestsetzen='1',mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,'\r\n','Manuell als bezahlt markiert am ".date('d.m.Y')."') WHERE id IN (".implode(', ',$auswahl).')');
break;
case 'offen':
$this->app->DB->Update("UPDATE rechnung SET zahlungsstatus='offen',bezahlt_am = NULL, mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,'\r\n','Manuell als bezahlt entfernt am ".date('d.m.Y')."') WHERE id IN (".implode(', ',$auswahl).')');
break;
case 'mahnung_reset':
$sql = "UPDATE rechnung SET mahnwesen='', versendet_mahnwesen ='', mahnwesen_datum = '0000-00-00' WHERE id IN (".implode(', ',$auswahl).')';
$this->app->DB->Update($sql);
break;
case 'mahnen':
$mails = 0;
$drucke = 0;
foreach ($auswahl as $rechnung_id) {
$mahnung = $this->MahnwesenMessage($rechnung_id);
// Check first
if (empty($mahnung)) {
continue;
}
if ($mahnung['mail'] && empty($mahnung['rechnung']['email'])) {
$msg .= "<div class=\"error\">Keine E-Mail-Adresse hinterlegt bei Rechnung ".$mahnung['rechnung']['belegnr'].".</div>";
continue;
}
if ($mahnung['druck']) {
$drucker = $this->app->Secure->GetPOST('seldrucker');
if($drucker > 0) {
$this->app->erp->BriefpapierHintergrundDisable($drucker);
} else {
$msg .= "<div class=\"error\">Kein Drucker gew&auml;hlt.</div>";
break;
}
}
// Create PDF
if(class_exists('RechnungPDFCustom')) {
$Brief = new RechnungPDFCustom($this->app,$projekt);
}
else {
$Brief = new RechnungPDF($this->app,$projekt);
}
$Brief->GetRechnung($rechnung_id,$mahnung['betreff'],0,null,$mahnung['body']);
$tmpfile = $Brief->displayTMP();
$fileid = $this->app->erp->CreateDatei($Brief->filename,$mahnung['betreff'],"","",$tmpfile,$this->app->User->GetName());
if ($mahnung['druck']) {
$this->app->printer->Drucken($drucker,$tmpfile);
$this->MahnungCRM('brief',$mahnung['rechnung'], $mahnung['betreff'], $mahnung['body'],$fileid,$Brief->filename);
$this->app->erp->RechnungProtokoll($rechnung_id,'Mahnung gedruckt');
$drucke++;
}
if ($mahnung['mail']) {
$senderName = $this->app->User->GetName()." (".$this->app->erp->GetFirmaAbsender().")";
$senderAddress = $this->app->erp->GetFirmaMail();
// function MailSend($from,$from_name,$to,$to_name,$betreff,$text,$files="",$projekt="",$signature=true,$cc="",$bcc="", $system = false)
$result = $this->app->erp->MailSend(
$senderAddress,
$senderName,
$mahnung['rechnung']['email'],
$mahnung['rechnung']['email'],
htmlentities($mahnung['betreff']),
htmlentities($mahnung['body']),
[$tmpfile],
$mahnung['rechnung']['projekt'],
true,
$cc,
'',
true
);
if ($result = 0) {
$msg .= "<div class=\"error\">Fehler beim E-Mail-Versand bei Rechnung ".$mahnung['rechnung']['belegnr'].".</div>";
continue;
}
$this->MahnungCRM('email',$mahnung['rechnung'], $mahnung['betreff'], $mahnung['body'],$fileid,$Brief->filename);
$this->app->erp->RechnungProtokoll($rechnung_id,'Mahnung versendet');
$mails++;
}
unlink($tmpfile);
$sql = "UPDATE rechnung set mahnwesen_datum = CURRENT_DATE, versendet_mahnwesen = 1 WHERE id IN (".implode(', ',$auswahl).')';
$this->app->DB->Update($sql);
}
$msg .= "<div class=\"success\">$mails E-Mails versendet, $drucke Dokumente gedruckt.</div>";
break;
}
}
} // ende ausfuehren
if (!empty($msg)) {
$this->app->Tpl->Set('MESSAGE', $msg);
}
if($this->app->erp->RechteVorhanden('rechnung', 'manuellbezahltmarkiert')){
$this->app->Tpl->Set('ALSBEZAHLTMARKIEREN', '<option value="bezahlt">{|als bezahlt markieren|}</option>');
}
$this->app->Tpl->Set('SELDRUCKER', $this->app->erp->GetSelectDrucker($this->app->User->GetParameter('rechnung_list_drucker')));
$this->app->YUI->TableSearch('TAB1', 'mahnwesen_list', "show", "", "", basename(__FILE__), __CLASS__);
$this->app->Tpl->Parse('PAGE', "mahnwesen_list.tpl");
}
function mahnwesen_einstellungen() {
$this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=einstellungen", "&Uuml;bersicht");
$this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=create", "Neu anlegen");
$this->app->erp->MenuEintrag("index.php?module=einstellungen&action=list", "Zur&uuml;ck");
$this->app->erp->Headlines('Mahnwesen Einstellungen');
$this->app->YUI->TableSearch('TAB1', 'mahnwesen_einstellungen', "show", "", "", basename(__FILE__), __CLASS__);
$this->app->Tpl->Parse('PAGE', "mahnwesen_einstellungen.tpl");
}
public function mahnwesen_delete() {
$id = (int) $this->app->Secure->GetGET('id');
$this->app->DB->Delete("DELETE FROM `mahnwesen` WHERE `id` = '{$id}'");
$this->app->Tpl->Set('MESSAGE', "<div class=\"error\">Der Eintrag wurde gel&ouml;scht.</div>");
$this->mahnwesen_einstellungen();
}
/*
* Edit mahnwesen item
* If id is empty, create a new one
*/
function mahnwesen_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);
$this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=edit&id=$id", "Details");
$this->app->erp->MenuEintrag("index.php?module=mahnwesen&action=einstellungen", "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';
}
if ($submit != '')
{
// Write to database
// Add checks here
$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 mahnwesen (".$columns.") VALUES (".$values.") ON DUPLICATE KEY UPDATE ".$update;
$this->app->DB->Update($sql);
if ($id == 'NULL') {
$msg = $this->app->erp->base64_url_encode("<div class=\"success\">Das Element wurde erfolgreich angelegt.</div>");
header("Location: index.php?module=mahnwesen&action=einstellungen&msg=$msg");
} else {
$this->app->Tpl->Set('MESSAGE', "<div class=\"success\">Die Einstellungen wurden erfolgreich &uuml;bernommen.</div>");
}
}
// Load values again from database
$dropnbox = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`, CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',m.id,'\" />') AS `auswahl`";
$result = $this->app->DB->SelectArr("SELECT SQL_CALC_FOUND_ROWS m.id, $dropnbox, m.name, m.tage, m.gebuehr, m.mail, m.druck, m.id FROM mahnwesen m"." WHERE 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->Tpl->Set('MAIL', $result[0]['mail']?'checked':'');
$this->app->Tpl->Set('DRUCK', $result[0]['druck']?'checked':'');
$this->app->Tpl->Parse('PAGE', "mahnwesen_edit.tpl");
}
/**
* Get all paramters from html form and save into $input
*/
public function GetInput(): array {
$input = array();
$input['name'] = $this->app->Secure->GetPOST('name');
$input['tage'] = $this->app->Secure->GetPOST('tage');
$input['gebuehr'] = $this->app->Secure->GetPOST('gebuehr');
$input['mail'] = $this->app->Secure->GetPOST('mail')?'1':'0';
$input['druck'] = $this->app->Secure->GetPOST('druck')?'1':'0';
return $input;
}
/*
* Set all fields in the page corresponding to $input
*/
function SetInput($input) {
$this->app->Tpl->Set('NAME', $input['name']);
$this->app->Tpl->Set('TAGE', $input['tage']);
$this->app->Tpl->Set('GEBUEHR', $input['gebuehr']);
$this->app->Tpl->Set('MAIL', $input['mail']);
$this->app->Tpl->Set('DRUCK', $input['druck']);
}
/*
* Constuct the Mahnwesen message according to GeschäftsbriefVorlage
* Returns Array (string betreff, string body, boolean mail, boolean druck, array rechnung)
*/
function MahnwesenMessage($rechnung_id) {
$sql = "SELECT
r.*,
".$this->app->erp->FormatDate('datum')." datum,
".$this->app->erp->FormatDate('CURRENT_DATE')." heute,
m.name as mahn_name,
m.tage as mahn_tage,
m.gebuehr as mahn_gebuehr,
m.mail as mahn_mail,
m.druck as mahn_druck
FROM
rechnung r
INNER JOIN
mahnwesen m
ON
r.mahnwesen = m.id WHERE r.id = ".$rechnung_id." LIMIT 1";
$rechnungarr = $this->app->DB->SelectArr($sql)[0];
if (empty($rechnungarr)) {
return;
}
$adresse = $rechnungarr['adresse'];
if($sprache==''){
$sprache = $rechnungarr['sprache'];
}
if($sprache==''){
$sprache = $this->app->DB->Select("SELECT sprache FROM adresse WHERE id='$adresse' LIMIT 1");
}
$kundennummer = $rechnungarr['kundennummer'];
$projekt = $rechnungarr['projekt'];
$auftrag= $rechnungarr['auftrag'];
$buchhaltung= $rechnungarr['buchhaltung'];
$lieferschein = $rechnungarr['lieferschein'];
$lieferscheinid = $lieferschein;
if($lieferscheinid){
$lieferschein = $this->app->DB->Select("SELECT belegnr FROM lieferschein WHERE id='$lieferschein' LIMIT 1");
}else{
$lieferschein = '';
}
$bestellbestaetigung = $rechnungarr['kundennummer'];
$datum = $rechnungarr['datum_de'];
$datum_sql = $rechnungarr['datum'];
$belegnr = $rechnungarr['belegnr'];
$doppel = $rechnungarr['doppel'];
$freitext = $rechnungarr['freitext'];
$ustid = $rechnungarr['ustid'];
$soll = $rechnungarr['soll'];
$ist = $rechnungarr['ist'];
$land = $rechnungarr['land'];
$mahnwesen_datum = $rechnungarr['mahnwesen_datum'];
$mahnwesen_datum_deutsch = $rechnungarr['mahnwesen_datum_de'];
$zahlungsweise = $rechnungarr['zahlungsweise'];
$zahlungsstatus = $rechnungarr['zahlungsstatus'];
$zahlungszieltage = $rechnungarr['zahlungszieltage'];
$zahlungszieltageskonto = $rechnungarr['zahlungszieltageskonto'];
$zahlungszielskonto = $rechnungarr['zahlungszielskonto'];
$waehrung = $rechnungarr['waehrung'];
$zahlungdatum = $this->app->DB->Select("SELECT DATE_FORMAT(DATE_ADD(datum, INTERVAL $zahlungszieltage DAY),'%d.%m.%Y') FROM rechnung WHERE id='$rechnung_id' LIMIT 1");
if($_datum!=null)
{
$mahnwesen_datum = $this->app->String->Convert($_datum,'%1.%2.%3','%3-%2-%1');
$mahnwesen_datum_deutsch = $_datum;
}
$zahlungsweise = strtolower($zahlungsweise);
/*
if($als=='zahlungserinnerung')
{
$body = $this->GetGeschaeftsBriefText("MahnwesenZahlungserinnerung",$sprache,$projekt,"rechnung",$rechnung_id);
$tage = $this->GetKonfiguration('mahnwesen_m1_tage');
}
else if($als=='mahnung1')
{
$body = $this->GetGeschaeftsBriefText("MahnwesenMahnung1",$sprache,$projekt,"rechnung",$rechnung_id);
$mahngebuehr = $this->GetKonfiguration('mahnwesen_m1_gebuehr');
$tage = $this->GetKonfiguration('mahnwesen_m2_tage');
}
else if($als=='mahnung2')
{
$body = $this->GetGeschaeftsBriefText("MahnwesenMahnung2",$sprache,$projekt,"rechnung",$rechnung_id);
$tage = $this->GetKonfiguration('mahnwesen_m3_tage');
$mahngebuehr = $this->GetKonfiguration('mahnwesen_m2_gebuehr');
}
else if($als=='mahnung3')
{
$body = $this->GetGeschaeftsBriefText("MahnwesenMahnung3",$sprache,$projekt,"rechnung",$rechnung_id);
$tage = $this->GetKonfiguration('mahnwesen_ik_tage');
$mahngebuehr = $this->GetKonfiguration('mahnwesen_m3_gebuehr');
}
else if($als=='inkasso')
{
$body = $this->GetGeschaeftsBriefText("MahnwesenInkasso",$sprache,$projekt,"rechnung",$rechnung_id);
//$tage = $this->GetKonfiguration("mahnwesen_ik_tage");
$tage = 3; //eigentlich vorbei
$mahngebuehr = $this->GetKonfiguration('mahnwesen_ik_gebuehr');
}
else
{
$body = $this->app->erp->Beschriftung("dokument_anschreiben");
} */
$betreff = $this->app->erp->GetGeschaeftsBriefBetreff($rechnungarr['mahn_name'],$sprache,$projekt,"rechnung",$rechnung_id);
$body = $this->app->erp->GetGeschaeftsBriefText($rechnungarr['mahn_name'],$sprache,$projekt,"rechnung",$rechnung_id);
if (empty($betreff) || empty($body)) {
throw new QueryFailureException("Geschaeftsbrief-Vorlage nicht gefunden: ''".$rechnungarr['mahn_name']."'");
}
$offen = $this->app->erp->GetSaldoDokument($rechnung_id, 'rechnung');
if($tage <=0) $tage = 0;
/* $datummahnung= $this->app->DB->Select("SELECT DATE_FORMAT(DATE_ADD('$mahnwesen_datum', INTERVAL $tage DAY),'%d.%m.%Y')");
$datumrechnungzahlungsziel= $this->app->DB->Select("SELECT DATE_FORMAT(DATE_ADD('$datum_sql', INTERVAL $zahlungszieltage DAY),'%d.%m.%Y')");
$tage_ze = $zahlungszieltage + $this->GetKonfiguration('mahnwesen_m1_tage');
$datumzahlungserinnerung= $this->app->DB->Select("SELECT DATE_FORMAT(DATE_ADD('$datum_sql', INTERVAL $tage_ze DAY),'%d.%m.%Y')");*/
// checkstamp $this->CheckStamp("jhdskKUHsiusakiakuhsd"); // errechnet aus laufzeit und kundenid // wenn es nicht drinnen ist darf es nicht gehen
/*
if($mahngebuehr=='' || !is_numeric($mahngebuehr))
$mahngebuehr = 0;
//$offen= '11,23';
$body = str_replace('{RECHNUNG}',$belegnr,$body);
$body = str_replace('{BELEGNR}',$belegnr,$body);
$body = str_replace('{DATUMRECHNUNG}',$datum,$body);
$body = str_replace('{TAGE}',$tage,$body);
$body = str_replace('{OFFEN}',$this->app->erp->formatMoney(-$offen['betrag'],$offen['waehrung']),$body);
$body = str_replace('{SOLL}',$this->app->erp->formatMoney($soll,$waehrung),$body);
$body = str_replace('{SUMME}',$this->app->erp->formatMoney($soll - $ist + $mahngebuehr,$waehrung),$body);
$body = str_replace('{IST}',$this->app->erp->formatMoney($ist,$waehrung),$body);
$body = str_replace('{DATUM}',$datummahnung,$body);
$body = str_replace('{MAHNGEBUEHR}',$this->app->erp->formatMoney($mahngebuehr,$waehrung),$body);
$body = str_replace('{OFFENMITMAHNGEBUEHR}',$this->app->erp->formatMoney($mahngebuehr + $soll - $ist,$waehrung),$body);
$body = str_replace('{MAHNDATUM}',$mahnwesen_datum_deutsch,$body);
// Im Protokoll suchen Datum von Zahlungserinnerung, Mahnung 1, Mahnung 2, Mahnung 3
$mahnung1 = $this->app->DB->Select("SELECT DATE_FORMAT(zeit,'%d.%m.%Y') FROM rechnung_protokoll WHERE rechnung='$rechnung_id'
AND grund LIKE 'Mahnung1 versendet%' ORDER by Zeit DESC LIMIT 1");
$mahnung2 = $this->app->DB->Select("SELECT DATE_FORMAT(zeit,'%d.%m.%Y') FROM rechnung_protokoll WHERE rechnung='$rechnung_id'
AND grund LIKE 'Mahnung2 versendet%' ORDER by Zeit DESC LIMIT 1");
$mahnung3 = $this->app->DB->Select("SELECT DATE_FORMAT(zeit,'%d.%m.%Y') FROM rechnung_protokoll WHERE rechnung='$rechnung_id'
AND grund LIKE 'Mahnung3 versendet%' ORDER by Zeit DESC LIMIT 1");
$body = str_replace('{DATUMMAHNUNG1}',$mahnung1,$body);
$body = str_replace('{DATUMMAHNUNG2}',$mahnung2,$body);
$body = str_replace('{DATUMMAHNUNG3}',$mahnung3,$body);
$body = str_replace('{DATUMZAHLUNGSERINNERUNGFAELLIG}',$datumzahlungserinnerung,$body);
$body = str_replace('{DATUMZAHLUNGSERINNERUNG}',$datumzahlungserinnerung,$body);
$body = str_replace('{DATUMRECHNUNGZAHLUNGSZIEL}',$datumrechnungzahlungsziel,$body);*/
$mapping = [
'rechnung' => $belegnr,
'belegnr' => $belegnr,
'datum' => $datum_sql,
'offen' => $this->app->erp->EUR(-$offen['betrag'])." ".$offen['waehrung'],
'mahngebuehr' => $this->app->erp->EUR($rechnungarr['mahn_gebuehr']),
'heute' => $rechnungarr['heute']
];
$betreff = $this->app->erp->ParseVars($mapping,$betreff);
$body = $this->app->erp->ParseVars($mapping,$body);
$body = $this->app->erp->ParseUserVars('rechnung',$rechnung_id,$body);
return(array(
'betreff' => $betreff,
'body' => $body,
'mail' => $rechnungarr['mahn_mail'] != 0,
'druck' => $rechnungarr['mahn_druck'] != 0,
'adresse' => $rechnungarr['adresse'],
'empfaenger' => $rechnungarr['email'],
'projekt' => $rechnungarr['projekt'],
'rechnung' => $rechnungarr
));
}
/*
* Create CRM entry for mahnung
* typ = brief, email
*/
function MahnungCRM(string $typ, array $rechnung, $betreff, $text, $fileid, $filename) {
$data = array();
$data['typ'] = $typ;
$data['projekt'] = $rechnung['projekt'];
$data['datum'] = date('Y-m-d');
$data['uhrzeit'] = date('Y-m-d H:i:s');
$data['user'] = $rechnung['adresse'];
$data['an'] = $rechnung['name'];
$data['adresse'] = $rechnung['strasse'];
$data['plz'] = $rechnung['plz'];
$data['ort'] = $rechnung['ort'];
$data['betreff'] = $betreff;
$data['content'] = $text;
$data['email_an'] = $rechnung['email'];
$data['sent'] = 1;
$crm_id = $this->app->erp->DokumentCreate($data,$this->app->User->GetAdresse());
$this->app->erp->AddDateiStichwort($fileid,'anhang','dokument',$crm_id);
}
}
+15 -12
View File
@@ -49,11 +49,16 @@ class Produktion {
$width = array('1%','1%','10%'); // Fill out manually later $width = array('1%','1%','10%'); // Fill out manually later
// $findcols = array('p.datum', 'p.art', 'p.projekt', 'p.belegnr', 'p.internet', 'p.bearbeiter', 'p.angebot', 'p.freitext', 'p.internebemerkung', 'p.status', 'p.adresse', 'p.name', 'p.abteilung', 'p.unterabteilung', 'p.strasse', 'p.adresszusatz', 'p.ansprechpartner', 'p.plz', 'p.ort', 'p.land', 'p.ustid', 'p.ust_befreit', 'p.ust_inner', 'p.email', 'p.telefon', 'p.telefax', 'p.betreff', 'p.kundennummer', 'p.versandart', 'p.vertrieb', 'p.zahlungsweise', 'p.zahlungszieltage', 'p.zahlungszieltageskonto', 'p.zahlungszielskonto', 'p.bank_inhaber', 'p.bank_institut', 'p.bank_blz', 'p.bank_konto', 'p.kreditkarte_typ', 'p.kreditkarte_inhaber', 'p.kreditkarte_nummer', 'p.kreditkarte_pruefnummer', 'p.kreditkarte_monat', 'p.kreditkarte_jahr', 'p.firma', 'p.versendet', 'p.versendet_am', 'p.versendet_per', 'p.versendet_durch', 'p.autoversand', 'p.keinporto', 'p.keinestornomail', 'p.abweichendelieferadresse', 'p.liefername', 'p.lieferabteilung', 'p.lieferunterabteilung', 'p.lieferland', 'p.lieferstrasse', 'p.lieferort', 'p.lieferplz', 'p.lieferadresszusatz', 'p.lieferansprechpartner', 'p.packstation_inhaber', 'p.packstation_station', 'p.packstation_ident', 'p.packstation_plz', 'p.packstation_ort', 'p.autofreigabe', 'p.freigabe', 'p.nachbesserung', 'p.gesamtsumme', 'p.inbearbeitung', 'p.abgeschlossen', 'p.nachlieferung', 'p.lager_ok', 'p.porto_ok', 'p.ust_ok', 'p.check_ok', 'p.vorkasse_ok', 'p.nachnahme_ok', 'p.reserviert_ok', 'p.bestellt_ok', 'p.zeit_ok', 'p.versand_ok', 'p.partnerid', 'p.folgebestaetigung', 'p.zahlungsmail', 'p.stornogrund', 'p.stornosonstiges', 'p.stornorueckzahlung', 'p.stornobetrag', 'p.stornobankinhaber', 'p.stornobankkonto', 'p.stornobankblz', 'p.stornobankbank', 'p.stornogutschrift', 'p.stornogutschriftbeleg', 'p.stornowareerhalten', 'p.stornomanuellebearbeitung', 'p.stornokommentar', 'p.stornobezahlt', 'p.stornobezahltam', 'p.stornobezahltvon', 'p.stornoabgeschlossen', 'p.stornorueckzahlungper', 'p.stornowareerhaltenretour', 'p.partnerausgezahlt', 'p.partnerausgezahltam', 'p.kennen', 'p.logdatei', 'p.bezeichnung', 'p.datumproduktion', 'p.anschreiben', 'p.usereditid', 'p.useredittimestamp', 'p.steuersatz_normal', 'p.steuersatz_zwischen', 'p.steuersatz_ermaessigt', 'p.steuersatz_starkermaessigt', 'p.steuersatz_dienstleistung', 'p.waehrung', 'p.schreibschutz', 'p.pdfarchiviert', 'p.pdfarchiviertversion', 'p.typ', 'p.reservierart', 'p.auslagerart', 'p.projektfiliale', 'p.datumauslieferung', 'p.datumbereitstellung', 'p.unterlistenexplodieren', 'p.charge', 'p.arbeitsschrittetextanzeigen', 'p.einlagern_ok', 'p.auslagern_ok', 'p.mhd', 'p.auftragmengenanpassen', 'p.internebezeichnung', 'p.mengeoriginal', 'p.teilproduktionvon', 'p.teilproduktionnummer', 'p.parent', 'p.parentnummer', 'p.bearbeiterid', 'p.mengeausschuss', 'p.mengeerfolgreich', 'p.abschlussbemerkung', 'p.auftragid', 'p.funktionstest', 'p.seriennummer_erstellen', 'p.unterseriennummern_erfassen', 'p.datumproduktionende', 'p.standardlager'); $bezeichnung = "CONCAT (
$findcols = array('p.id','p.id','p.belegnr','p.kundennummer','p.name','p.datum','a.name_de','soll','ist', 'zeit_geplant','zeit_geplant', 'projekt','p.status','icons','id'); IFNULL((SELECT CONCAT(a.name_de,' (',a.nummer,')','<br>') FROM artikel a INNER JOIN produktion_position pp ON pp.artikel = a.id WHERE pp.stuecklistestufe = 1 AND pp.produktion = p.id LIMIT 1),''),
CONCAT('<i>',internebezeichnung,'</i>')
)";
// $searchsql = array('p.datum', 'p.art', 'p.projekt', 'p.belegnr', 'p.internet', 'p.bearbeiter', 'p.angebot', 'p.freitext', 'p.internebemerkung', 'p.status', 'p.adresse', 'p.name', 'p.abteilung', 'p.unterabteilung', 'p.strasse', 'p.adresszusatz', 'p.ansprechpartner', 'p.plz', 'p.ort', 'p.land', 'p.ustid', 'p.ust_befreit', 'p.ust_inner', 'p.email', 'p.telefon', 'p.telefax', 'p.betreff', 'p.kundennummer', 'p.versandart', 'p.vertrieb', 'p.zahlungsweise', 'p.zahlungszieltage', 'p.zahlungszieltageskonto', 'p.zahlungszielskonto', 'p.bank_inhaber', 'p.bank_institut', 'p.bank_blz', 'p.bank_konto', 'p.kreditkarte_typ', 'p.kreditkarte_inhaber', 'p.kreditkarte_nummer', 'p.kreditkarte_pruefnummer', 'p.kreditkarte_monat', 'p.kreditkarte_jahr', 'p.firma', 'p.versendet', 'p.versendet_am', 'p.versendet_per', 'p.versendet_durch', 'p.autoversand', 'p.keinporto', 'p.keinestornomail', 'p.abweichendelieferadresse', 'p.liefername', 'p.lieferabteilung', 'p.lieferunterabteilung', 'p.lieferland', 'p.lieferstrasse', 'p.lieferort', 'p.lieferplz', 'p.lieferadresszusatz', 'p.lieferansprechpartner', 'p.packstation_inhaber', 'p.packstation_station', 'p.packstation_ident', 'p.packstation_plz', 'p.packstation_ort', 'p.autofreigabe', 'p.freigabe', 'p.nachbesserung', 'p.gesamtsumme', 'p.inbearbeitung', 'p.abgeschlossen', 'p.nachlieferung', 'p.lager_ok', 'p.porto_ok', 'p.ust_ok', 'p.check_ok', 'p.vorkasse_ok', 'p.nachnahme_ok', 'p.reserviert_ok', 'p.bestellt_ok', 'p.zeit_ok', 'p.versand_ok', 'p.partnerid', 'p.folgebestaetigung', 'p.zahlungsmail', 'p.stornogrund', 'p.stornosonstiges', 'p.stornorueckzahlung', 'p.stornobetrag', 'p.stornobankinhaber', 'p.stornobankkonto', 'p.stornobankblz', 'p.stornobankbank', 'p.stornogutschrift', 'p.stornogutschriftbeleg', 'p.stornowareerhalten', 'p.stornomanuellebearbeitung', 'p.stornokommentar', 'p.stornobezahlt', 'p.stornobezahltam', 'p.stornobezahltvon', 'p.stornoabgeschlossen', 'p.stornorueckzahlungper', 'p.stornowareerhaltenretour', 'p.partnerausgezahlt', 'p.partnerausgezahltam', 'p.kennen', 'p.logdatei', 'p.bezeichnung', 'p.datumproduktion', 'p.anschreiben', 'p.usereditid', 'p.useredittimestamp', 'p.steuersatz_normal', 'p.steuersatz_zwischen', 'p.steuersatz_ermaessigt', 'p.steuersatz_starkermaessigt', 'p.steuersatz_dienstleistung', 'p.waehrung', 'p.schreibschutz', 'p.pdfarchiviert', 'p.pdfarchiviertversion', 'p.typ', 'p.reservierart', 'p.auslagerart', 'p.projektfiliale', 'p.datumauslieferung', 'p.datumbereitstellung', 'p.unterlistenexplodieren', 'p.charge', 'p.arbeitsschrittetextanzeigen', 'p.einlagern_ok', 'p.auslagern_ok', 'p.mhd', 'p.auftragmengenanpassen', 'p.internebezeichnung', 'p.mengeoriginal', 'p.teilproduktionvon', 'p.teilproduktionnummer', 'p.parent', 'p.parentnummer', 'p.bearbeiterid', 'p.mengeausschuss', 'p.mengeerfolgreich', 'p.abschlussbemerkung', 'p.auftragid', 'p.funktionstest', 'p.seriennummer_erstellen', 'p.unterseriennummern_erfassen', 'p.datumproduktionende', 'p.standardlager'); $adresse = "(SELECT name FROM adresse WHERE kundennummer = p.kundennummer AND p.kundennummer != 0 LIMIT 1)";
$searchsql = array('p.datum', 'p.art', 'p.projekt', 'p.belegnr', 'p.internet', 'p.bearbeiter', 'p.angebot', 'p.freitext', 'p.internebemerkung', 'p.status', 'p.adresse', 'p.name', 'p.abteilung', 'p.unterabteilung', 'p.strasse', 'p.adresszusatz', 'p.ansprechpartner', 'p.plz', 'p.ort', 'p.land', 'p.ustid', 'p.ust_befreit', 'p.ust_inner', 'p.email', 'p.telefon', 'p.telefax', 'p.betreff', 'p.kundennummer', 'p.versandart', 'p.vertrieb', 'p.zahlungsweise', 'p.zahlungszieltage', 'p.zahlungszieltageskonto', 'p.zahlungszielskonto', 'p.bank_inhaber', 'p.bank_institut', 'p.bank_blz', 'p.bank_konto', 'p.kreditkarte_typ', 'p.kreditkarte_inhaber', 'p.kreditkarte_nummer', 'p.kreditkarte_pruefnummer', 'p.kreditkarte_monat', 'p.kreditkarte_jahr', 'p.firma', 'p.versendet', 'p.versendet_am', 'p.versendet_per', 'p.versendet_durch', 'p.autoversand', 'p.keinporto', 'p.keinestornomail', 'p.abweichendelieferadresse', 'p.liefername', 'p.lieferabteilung', 'p.lieferunterabteilung', 'p.lieferland', 'p.lieferstrasse', 'p.lieferort', 'p.lieferplz', 'p.lieferadresszusatz', 'p.lieferansprechpartner', 'p.packstation_inhaber', 'p.packstation_station', 'p.packstation_ident', 'p.packstation_plz', 'p.packstation_ort', 'p.autofreigabe', 'p.freigabe', 'p.nachbesserung', 'p.gesamtsumme', 'p.inbearbeitung', 'p.abgeschlossen', 'p.nachlieferung', 'p.lager_ok', 'p.porto_ok', 'p.ust_ok', 'p.check_ok', 'p.vorkasse_ok', 'p.nachnahme_ok', 'p.reserviert_ok', 'p.bestellt_ok', 'p.zeit_ok', 'p.versand_ok', 'p.partnerid', 'p.folgebestaetigung', 'p.zahlungsmail', 'p.stornogrund', 'p.stornosonstiges', 'p.stornorueckzahlung', 'p.stornobetrag', 'p.stornobankinhaber', 'p.stornobankkonto', 'p.stornobankblz', 'p.stornobankbank', 'p.stornogutschrift', 'p.stornogutschriftbeleg', 'p.stornowareerhalten', 'p.stornomanuellebearbeitung', 'p.stornokommentar', 'p.stornobezahlt', 'p.stornobezahltam', 'p.stornobezahltvon', 'p.stornoabgeschlossen', 'p.stornorueckzahlungper', 'p.stornowareerhaltenretour', 'p.partnerausgezahlt', 'p.partnerausgezahltam', 'p.kennen', 'p.logdatei', 'p.bezeichnung', 'p.datumproduktion', 'p.anschreiben', 'p.usereditid', 'p.useredittimestamp', 'p.steuersatz_normal', 'p.steuersatz_zwischen', 'p.steuersatz_ermaessigt', 'p.steuersatz_starkermaessigt', 'p.steuersatz_dienstleistung', 'p.waehrung', 'p.schreibschutz', 'p.pdfarchiviert', 'p.pdfarchiviertversion', 'p.typ', 'p.reservierart', 'p.auslagerart', 'p.projektfiliale', 'p.datumauslieferung', 'p.datumbereitstellung', 'p.unterlistenexplodieren', 'p.charge', 'p.arbeitsschrittetextanzeigen', 'p.einlagern_ok', 'p.auslagern_ok', 'p.mhd', 'p.auftragmengenanpassen', 'p.internebezeichnung', 'p.mengeoriginal', 'p.teilproduktionvon', 'p.teilproduktionnummer', 'p.parent', 'p.parentnummer', 'p.bearbeiterid', 'p.mengeausschuss', 'p.mengeerfolgreich', 'p.abschlussbemerkung', 'p.auftragid', 'p.funktionstest', 'p.seriennummer_erstellen', 'p.unterseriennummern_erfassen', 'p.datumproduktionende', 'p.standardlager');
$findcols = array('p.id','p.id','p.belegnr','p.kundennummer',$adresse,'p.datum',$bezeichnung,'soll','ist', 'zeit_geplant','zeit_geplant', 'projekt','p.status','icons','id');
$searchsql = array('p.belegnr','p.kundennummer','p.name',$bezeichnung);
$defaultorder = 1; $defaultorder = 1;
$defaultorderdesc = 0; $defaultorderdesc = 0;
@@ -73,13 +78,10 @@ class Produktion {
$dropnbox, $dropnbox,
p.belegnr, p.belegnr,
p.kundennummer, p.kundennummer,
(SELECT name FROM adresse WHERE kundennummer = p.kundennummer AND p.kundennummer != 0 LIMIT 1) as name, ".$adresse." as name,
DATE_FORMAT(datum,'%d.%m.%Y') as datum, DATE_FORMAT(datum,'%d.%m.%Y') as datum,
CONCAT ( ".$bezeichnung." as bezeichnung,
IFNULL((SELECT CONCAT(a.name_de,' (',a.nummer,')','<br>') FROM artikel a INNER JOIN produktion_position pp ON pp.artikel = a.id WHERE pp.stuecklistestufe = 1 AND pp.produktion = p.id LIMIT 1),''),
CONCAT('<i>',internebezeichnung,'</i>')
) as bezeichnung,
FORMAT((SELECT SUM(menge) FROM produktion_position pp WHERE pp.produktion = p.id AND pp.stuecklistestufe = 1),0,'de_DE') as soll, FORMAT((SELECT SUM(menge) FROM produktion_position pp WHERE pp.produktion = p.id AND pp.stuecklistestufe = 1),0,'de_DE') as soll,
FORMAT(p.mengeerfolgreich,0,'de_DE') as ist, FORMAT(p.mengeerfolgreich,0,'de_DE') as ist,
@@ -298,7 +300,7 @@ class Produktion {
) as lager, ) as lager,
FORMAT ((SELECT SUM(menge) FROM lager_reserviert r WHERE r.lager_platz = $standardlager AND r.artikel = p.artikel AND r.objekt = 'produktion' AND r.parameter = $id),0,'de_DE') as reserviert, FORMAT ((SELECT SUM(menge) FROM lager_reserviert r WHERE r.lager_platz = $standardlager AND r.artikel = p.artikel AND r.objekt = 'produktion' AND r.parameter = $id),0,'de_DE') as reserviert,
FORMAT(SUM(p.menge),0,'de_DE') as menge, FORMAT(SUM(p.menge),0,'de_DE') as menge,
FORMAT(p.geliefert_menge,0,'de_DE') as geliefert_menge, FORMAT(SUM(p.geliefert_menge),0,'de_DE') as geliefert_menge,
p.id p.id
FROM produktion_position p"; FROM produktion_position p";
@@ -584,8 +586,8 @@ class Produktion {
$sql = "UPDATE produktion SET status = 'gestartet' WHERE id=$id"; $sql = "UPDATE produktion SET status = 'gestartet' WHERE id=$id";
$this->app->DB->Update($sql); $this->app->DB->Update($sql);
$sql = "SELECT pp.id, pp.artikel, pp.menge, pp.geliefert_menge, pp.stuecklistestufe, a.lagerartikel FROM produktion_position pp INNER JOIN artikel a ON a.id = pp.artikel WHERE pp.produktion=$id"; $sql = "SELECT pp.id, pp.artikel, pp.menge, pp.geliefert_menge, pp.stuecklistestufe, a.lagerartikel FROM produktion_position pp INNER JOIN artikel a ON a.id = pp.artikel WHERE pp.produktion=$id";
$material = $this->app->DB->SelectArr($sql); $material = $this->app->DB->SelectArr($sql);
foreach ($material as $material_position) { foreach ($material as $material_position) {
@@ -606,6 +608,7 @@ class Produktion {
// Update position // Update position
$sql = "UPDATE produktion_position SET geliefert_menge = geliefert_menge + $menge_artikel_auslagern WHERE id = ".$material_position['id']; $sql = "UPDATE produktion_position SET geliefert_menge = geliefert_menge + $menge_artikel_auslagern WHERE id = ".$material_position['id'];
$this->app->DB->Update($sql); $this->app->DB->Update($sql);
} }
+149 -51
View File
@@ -236,13 +236,6 @@ class Rechnung extends GenRechnung
$this->app->Location->execute("index.php?module=rechnung&action=edit&id=$id&msg=$msg"); $this->app->Location->execute("index.php?module=rechnung&action=edit&id=$id&msg=$msg");
} }
function RechnungMahnwesen()
{
}
function RechnungLastschriftWdh() function RechnungLastschriftWdh()
{ {
@@ -283,7 +276,7 @@ class Rechnung extends GenRechnung
$this->app->erp->RechnungProtokoll($invoiceId,'Rechnung manuell als bezahlt entfernt'); $this->app->erp->RechnungProtokoll($invoiceId,'Rechnung manuell als bezahlt entfernt');
$this->app->DB->Update( $this->app->DB->Update(
"UPDATE rechnung "UPDATE rechnung
SET zahlungsstatus='offen',bezahlt_am = NULL, ist='0', SET zahlungsstatus='offen',bezahlt_am = NULL,
mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,'\r\n','Manuell als bezahlt entfernt am ".date('d.m.Y')."') mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,'\r\n','Manuell als bezahlt entfernt am ".date('d.m.Y')."')
WHERE id='$invoiceId'" WHERE id='$invoiceId'"
); );
@@ -305,7 +298,7 @@ class Rechnung extends GenRechnung
$id = $this->app->Secure->GetGET('id'); $id = $this->app->Secure->GetGET('id');
$this->app->erp->RechnungProtokoll($id,'Rechnung Stornierung rückgängig gemacht'); $this->app->erp->RechnungProtokoll($id,'Rechnung Stornierung rückgängig gemacht');
$this->app->DB->Update("UPDATE rechnung SET status='freigegeben',zahlungsstatus='offen',schreibschutz=0,bezahlt_am = NULL, ist='0',mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,'\r\n','Rechnung Stornierung rückgängig gemacht ".date('d.m.Y')."') WHERE id='$id'"); $this->app->DB->Update("UPDATE rechnung SET status='freigegeben',zahlungsstatus='offen',schreibschutz=0,bezahlt_am = NULL, mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,'\r\n','Rechnung Stornierung rückgängig gemacht ".date('d.m.Y')."') WHERE id='$id'");
$this->app->Location->execute("index.php?module=rechnung&action=edit&id=$id"); $this->app->Location->execute("index.php?module=rechnung&action=edit&id=$id");
} }
@@ -324,7 +317,7 @@ class Rechnung extends GenRechnung
$this->app->DB->Update( $this->app->DB->Update(
"UPDATE rechnung "UPDATE rechnung
SET zahlungsstatus='bezahlt',bezahlt_am = now(), ist=soll,mahnwesenfestsetzen='1', SET zahlungsstatus='bezahlt',bezahlt_am = now(), mahnwesenfestsetzen='1',
mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,'\r\n','Manuell als bezahlt markiert am ".date('d.m.Y')."') mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,'\r\n','Manuell als bezahlt markiert am ".date('d.m.Y')."')
WHERE id='$invoiceId'" WHERE id='$invoiceId'"
); );
@@ -642,7 +635,7 @@ class Rechnung extends GenRechnung
$this->app->Tpl->Set('PROJEKT', $projekt); $this->app->Tpl->Set('PROJEKT', $projekt);
} }
$this->app->Tpl->Set('ZAHLWEISE',$auftragArr[0]['zahlungsweise']); $this->app->Tpl->Set('ZAHLWEISE',ucfirst($auftragArr[0]['zahlungsweise']));
$this->app->Tpl->Set('STATUS',($auftragArr[0]['status'] === 'storniert' && $auftragArr[0]['teilstorno'] == 1?'teilstorniert':$auftragArr[0]['status'])); $this->app->Tpl->Set('STATUS',($auftragArr[0]['status'] === 'storniert' && $auftragArr[0]['teilstorno'] == 1?'teilstorniert':$auftragArr[0]['status']));
$this->app->Tpl->Set('IHREBESTELLNUMMER',$auftragArr[0]['ihrebestellnummer']); $this->app->Tpl->Set('IHREBESTELLNUMMER',$auftragArr[0]['ihrebestellnummer']);
@@ -651,7 +644,10 @@ class Rechnung extends GenRechnung
if($auftragArr[0]['mahnwesen']=='') { if($auftragArr[0]['mahnwesen']=='') {
$auftragArr[0]['mahnwesen']='-'; $auftragArr[0]['mahnwesen']='-';
} }
$this->app->Tpl->Set('MAHNWESEN',$auftragArr[0]['mahnwesen']);
$mahnwesen_name = $this->app->DB->SelectArr("SELECT name FROM mahnwesen WHERE id='".$auftragArr[0]['mahnwesen']."' LIMIT 1")[0]['name'];
$this->app->Tpl->Set('MAHNWESEN',$mahnwesen_name);
if($auftragArr[0]['mahnwesen_datum']=='0000-00-00') { if($auftragArr[0]['mahnwesen_datum']=='0000-00-00') {
$auftragArr[0]['mahnwesen_datum']='-'; $auftragArr[0]['mahnwesen_datum']='-';
} }
@@ -888,28 +884,7 @@ class Rechnung extends GenRechnung
$this->app->Tpl->Set('ANGEBOTTEXT',"Das Angebot wird bearbeitet und wurde noch nicht freigegeben und abgesendet!"); $this->app->Tpl->Set('ANGEBOTTEXT',"Das Angebot wird bearbeitet und wurde noch nicht freigegeben und abgesendet!");
} }
$this->app->Tpl->Set('ZAHLUNGEN',$this->RechnungZahlung(true));
$this->app->Tpl->Set('ZAHLUNGEN',"<table width=100% border=0 class=auftrag_cell cellpadding=0 cellspacing=0>Erst ab Version Enterprise verf&uuml;gbar</table>");
if (!is_null($gutschrift)) {
if((!empty($gutschrift)?count($gutschrift):0) > 0)
$this->app->Tpl->Add('ZAHLUNGEN',"<div class=\"info\">Zu dieser Rechnung existiert eine Gutschrift!</div>");
else {
if($auftragArr[0]['zahlungsstatus']!="bezahlt")
$this->app->Tpl->Add('ZAHLUNGEN',"<div class=\"warning\">Diese Rechnung ist noch nicht komplett bezahlt!</div>");
else
{
if(!empty($auftragArr[0]['bezahlt_am']) && $auftragArr[0]['bezahlt_am'] != '0000-00-00')
{
$this->app->Tpl->Add('ZAHLUNGEN',"<div class=\"success\">Diese Rechnung wurde am ".$this->app->String->Convert($auftragArr[0]['bezahlt_am'],"%1-%2-%3","%3.%2.%1")." bezahlt.</div>");
}else{
$this->app->Tpl->Add('ZAHLUNGEN',"<div class=\"success\">Diese Rechnung ist bezahlt.</div>");
}
}
}
}
$this->app->Tpl->Set('RECHNUNGADRESSE',$this->Rechnungsadresse($auftragArr[0]['id'])); $this->app->Tpl->Set('RECHNUNGADRESSE',$this->Rechnungsadresse($auftragArr[0]['id']));
@@ -917,7 +892,7 @@ class Rechnung extends GenRechnung
$tmp->Query("SELECT zeit,bearbeiter,grund FROM rechnung_protokoll WHERE rechnung='$id' ORDER by zeit DESC",0,""); $tmp->Query("SELECT zeit,bearbeiter,grund FROM rechnung_protokoll WHERE rechnung='$id' ORDER by zeit DESC",0,"");
$tmp->DisplayNew('PROTOKOLL',"Protokoll","noAction"); $tmp->DisplayNew('PROTOKOLL',"Protokoll","noAction");
/*
$query = $this->app->DB->SelectArr("SELECT zeit,bearbeiter,grund FROM rechnung_protokoll WHERE rechnung='$id' ORDER by zeit"); $query = $this->app->DB->SelectArr("SELECT zeit,bearbeiter,grund FROM rechnung_protokoll WHERE rechnung='$id' ORDER by zeit");
if($query) if($query)
{ {
@@ -933,12 +908,12 @@ class Rechnung extends GenRechnung
{ {
$tmp2 = new EasyTable($this->app); $tmp2 = new EasyTable($this->app);
$tmp2->Query("SELECT concat('<a href=\"index.php?module=mahnwesen&action=mahnpdf&id=',rechnung,'&datum=',DATE_FORMAT(zeit,'%d.%m.%Y'),'&mahnwesen=',LOWER(LEFT(grund,LOCATE(' ',grund))),'\"><img src=\"themes/{$this->app->Conf->WFconf[defaulttheme]}/images/pdf.svg\" border=\"0\"></a>') as PDF, Date(zeit) as Datum, bearbeiter,grund FROM rechnung_protokoll WHERE rechnung='$id' AND zeit >= '".$zeit."' ORDER by zeit DESC"); $tmp2->Query("SELECT concat('<a href=\"index.php?module=mahnwesen&action=mahnpdf&id=',rechnung,'&datum=',DATE_FORMAT(zeit,'%d.%m.%Y'),'&mahnwesen=',LOWER(LEFT(grund,LOCATE(' ',grund))),'\"><img src=\"themes/{$this->app->Conf->WFconf['defaulttheme']}/images/pdf.svg\" border=\"0\"></a>') as PDF, Date(zeit) as Datum, bearbeiter,grund FROM rechnung_protokoll WHERE rechnung='$id' AND zeit >= '".$zeit."' ORDER by zeit DESC");
$tmp2->DisplayNew('MAHNPROTOKOLL',"Protokoll","noAction"); $tmp2->DisplayNew('MAHNPROTOKOLL',"Protokoll","noAction");
} }
} }*/
if(class_exists('RechnungPDFCustom')) if(class_exists('RechnungPDFCustom'))
{ {
@@ -1582,6 +1557,9 @@ class Rechnung extends GenRechnung
$this->app->erp->RechnungNeuberechnen($id); $this->app->erp->RechnungNeuberechnen($id);
} }
// ALWAYS
$this->app->erp->RechnungNeuberechnen($id);
if($cmd === 'dadown') if($cmd === 'dadown')
{ {
$erg['status'] = 0; $erg['status'] = 0;
@@ -1766,9 +1744,8 @@ class Rechnung extends GenRechnung
$this->app->Tpl->Set('VORKASSE',''); $this->app->Tpl->Set('VORKASSE','');
} }
$ist = $this->app->erp->EUR($this->app->erp->GetSaldoDokument($id,'rechnung')['betrag']);
$saldo=$this->app->DB->Select("SELECT ist-skonto_gegeben FROM rechnung WHERE id='$id'"); $this->app->Tpl->Set('ISTDB',$ist);
$this->app->Tpl->Set('LIVEIST',"$saldo");
if($schreibschutz=="1" && $this->app->erp->RechteVorhanden('rechnung','schreibschutz')) if($schreibschutz=="1" && $this->app->erp->RechteVorhanden('rechnung','schreibschutz'))
{ {
@@ -1788,10 +1765,13 @@ class Rechnung extends GenRechnung
$this->app->erp->RemoveReadonly('mahnwesenfestsetzen'); $this->app->erp->RemoveReadonly('mahnwesenfestsetzen');
$this->app->erp->RemoveReadonly('mahnwesen'); $this->app->erp->RemoveReadonly('mahnwesen');
$this->app->erp->RemoveReadonly('bezahlt_am'); $this->app->erp->RemoveReadonly('bezahlt_am');
/*
'ist' should not be edited manually
$this->app->erp->RemoveReadonly('ist'); $this->app->erp->RemoveReadonly('ist');
if($this->app->erp->Firmendaten('mahnwesenmitkontoabgleich')!='1' || $this->app->DB->Select("SELECT mahnwesenfestsetzen FROM rechnung WHERE id='$id' LIMIT 1")==1) if($this->app->erp->Firmendaten('mahnwesenmitkontoabgleich')!='1' || $this->app->DB->Select("SELECT mahnwesenfestsetzen FROM rechnung WHERE id='$id' LIMIT 1")==1)
$this->app->erp->RemoveReadonly('ist'); $this->app->erp->RemoveReadonly('ist');*/
//$auftrag= $this->app->DB->Select("SELECT auftrag FROM rechnung WHERE id='$id' LIMIT 1"); //$auftrag= $this->app->DB->Select("SELECT auftrag FROM rechnung WHERE id='$id' LIMIT 1");
@@ -1812,8 +1792,10 @@ class Rechnung extends GenRechnung
} }
$speichern = $this->app->Secure->GetPOST('speichern'); $speichern = $this->app->Secure->GetPOST('speichern');
if($speichern!='' && $this->app->erp->RechteVorhanden('rechnung','mahnwesen')) if($speichern!='' && $this->app->erp->RechteVorhanden('rechnung','mahnwesen'))
{ {
$mahnwesen_datum = $this->app->Secure->GetPOST('mahnwesen_datum'); $mahnwesen_datum = $this->app->Secure->GetPOST('mahnwesen_datum');
$bezahlt_am = $this->app->Secure->GetPOST('bezahlt_am'); $bezahlt_am = $this->app->Secure->GetPOST('bezahlt_am');
$mahnwesen_gesperrt = $this->app->Secure->GetPOST('mahnwesen_gesperrt'); $mahnwesen_gesperrt = $this->app->Secure->GetPOST('mahnwesen_gesperrt');
@@ -1837,19 +1819,18 @@ class Rechnung extends GenRechnung
if($bezahlt_am=='--')$bezahlt_am='0000-00-00'; if($bezahlt_am=='--')$bezahlt_am='0000-00-00';
$alte_mahnstufe = $this->app->DB->Select("SELECT mahnwesen FROM rechnung WHERE id='$id' LIMIT 1"); $alte_mahnstufe = $this->app->DB->Select("SELECT mahnwesen FROM rechnung WHERE id='$id' LIMIT 1");
if($alte_mahnstufe!=$mahnwesen) $versendet=0; else $versendet=1; if($alte_mahnstufe!=$mahnwesen) $versendet=0;
if($mahnwesenfestsetzen=='1') /* if($mahnwesenfestsetzen=='1')
{ {*/
$this->app->DB->Update("UPDATE rechnung SET mahnwesen_internebemerkung='$mahnwesen_internebemerkung',zahlungsstatus='$zahlungsstatus',versendet_mahnwesen='$versendet', $this->app->DB->Update("UPDATE rechnung SET mahnwesen_internebemerkung='$mahnwesen_internebemerkung',zahlungsstatus='$zahlungsstatus',versendet_mahnwesen='$versendet',
mahnwesen_gesperrt='$mahnwesen_gesperrt',mahnwesen_datum='$mahnwesen_datum', mahnwesenfestsetzen='$mahnwesenfestsetzen',internebemerkung='$internebemerkung', mahnwesen_gesperrt='$mahnwesen_gesperrt',mahnwesen_datum='$mahnwesen_datum', mahnwesenfestsetzen='$mahnwesenfestsetzen',internebemerkung='$internebemerkung',
mahnwesen='$mahnwesen',ist='$ist',skonto_gegeben='$skonto_gegeben',bezahlt_am='$bezahlt_am' WHERE id='$id' LIMIT 1"); mahnwesen='$mahnwesen',skonto_gegeben='$skonto_gegeben',bezahlt_am='$bezahlt_am' WHERE id='$id' LIMIT 1");
} else { /* } else {
$this->app->DB->Update("UPDATE rechnung SET mahnwesen='$mahnwesen', mahnwesenfestsetzen='$mahnwesenfestsetzen', mahnwesen_internebemerkung='$mahnwesen_internebemerkung', mahnwesen_gesperrt='$mahnwesen_gesperrt',mahnwesen_datum='$mahnwesen_datum' WHERE id='$id' LIMIT 1"); $this->app->DB->Update("UPDATE rechnung SET mahnwesen='$mahnwesen', mahnwesenfestsetzen='$mahnwesenfestsetzen', mahnwesen_internebemerkung='$mahnwesen_internebemerkung', mahnwesen_gesperrt='$mahnwesen_gesperrt',mahnwesen_datum='$mahnwesen_datum' WHERE id='$id' LIMIT 1");
} }*/
} }
if($status=='') if($status=='')
$this->app->DB->Update("UPDATE rechnung SET status='angelegt' WHERE id='$id' LIMIT 1"); $this->app->DB->Update("UPDATE rechnung SET status='angelegt' WHERE id='$id' LIMIT 1");
@@ -1962,6 +1943,7 @@ class Rechnung extends GenRechnung
' &uuml;berein <input type="submit" name="resetextsoll" value="Festgeschriebene Summe zur&uuml;cksetzen" /></div></form>' ' &uuml;berein <input type="submit" name="resetextsoll" value="Festgeschriebene Summe zur&uuml;cksetzen" /></div></form>'
); );
} }
parent::RechnungEdit(); parent::RechnungEdit();
if($id > 0 && $this->app->DB->Select( if($id > 0 && $this->app->DB->Select(
sprintf( sprintf(
@@ -2076,6 +2058,7 @@ class Rechnung extends GenRechnung
public function RechnungList() public function RechnungList()
{ {
$this->app->DB->Update("UPDATE rechnung SET zahlungsstatus='offen' WHERE zahlungsstatus=''"); $this->app->DB->Update("UPDATE rechnung SET zahlungsstatus='offen' WHERE zahlungsstatus=''");
if($this->app->Secure->GetPOST('ausfuehren') && $this->app->erp->RechteVorhanden('rechnung', 'edit')) if($this->app->Secure->GetPOST('ausfuehren') && $this->app->erp->RechteVorhanden('rechnung', 'edit'))
@@ -2098,10 +2081,10 @@ class Rechnung extends GenRechnung
switch($aktion) switch($aktion)
{ {
case 'bezahlt': case 'bezahlt':
$this->app->DB->Update("UPDATE rechnung SET zahlungsstatus='bezahlt', bezahlt_am = now(), ist=soll,mahnwesenfestsetzen='1',mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,'\r\n','Manuell als bezahlt markiert am ".date('d.m.Y')."') WHERE id IN (".implode(', ',$auswahl).')'); $this->app->DB->Update("UPDATE rechnung SET zahlungsstatus='bezahlt', bezahlt_am = now(), mahnwesenfestsetzen='1',mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,'\r\n','Manuell als bezahlt markiert am ".date('d.m.Y')."') WHERE id IN (".implode(', ',$auswahl).')');
break; break;
case 'offen': case 'offen':
$this->app->DB->Update("UPDATE rechnung SET zahlungsstatus='offen',bezahlt_am = NULL, ist='0',mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,'\r\n','Manuell als bezahlt entfernt am ".date('d.m.Y')."') WHERE id IN (".implode(', ',$auswahl).')'); $this->app->DB->Update("UPDATE rechnung SET zahlungsstatus='offen',bezahlt_am = NULL, mahnwesen_internebemerkung=CONCAT(mahnwesen_internebemerkung,'\r\n','Manuell als bezahlt entfernt am ".date('d.m.Y')."') WHERE id IN (".implode(', ',$auswahl).')');
break; break;
case 'mail': case 'mail':
$auswahl = $this->app->DB->SelectFirstCols( $auswahl = $this->app->DB->SelectFirstCols(
@@ -2256,6 +2239,10 @@ class Rechnung extends GenRechnung
break; break;
} }
} }
} // ende ausfuehren
if($this->app->Secure->GetPOST('zahlungsstatus_berechnen') && $this->app->erp->RechteVorhanden('rechnung', 'edit')) {
$this->rechnung_zahlstatus_berechnen();
} }
$this->app->Tpl->Set('UEBERSCHRIFT','Rechnungen'); $this->app->Tpl->Set('UEBERSCHRIFT','Rechnungen');
@@ -2265,7 +2252,6 @@ class Rechnung extends GenRechnung
$this->app->erp->MenuEintrag('index.php?module=rechnung&action=list','&Uuml;bersicht'); $this->app->erp->MenuEintrag('index.php?module=rechnung&action=list','&Uuml;bersicht');
$this->app->erp->MenuEintrag('index.php?module=rechnung&action=create','Neue Rechnung anlegen'); $this->app->erp->MenuEintrag('index.php?module=rechnung&action=create','Neue Rechnung anlegen');
if(strlen($backurl)>5){ if(strlen($backurl)>5){
$this->app->erp->MenuEintrag("$backurl", 'Zur&uuml;ck'); $this->app->erp->MenuEintrag("$backurl", 'Zur&uuml;ck');
} }
@@ -2712,4 +2698,116 @@ class Rechnung extends GenRechnung
return $this->app->DB->GetInsertID(); return $this->app->DB->GetInsertID();
} }
/**
* Build the html output for minidetail containing the payments
* @param bool $return
*
* @return string
*/
function RechnungZahlung($return=false)
{
$id = $this->app->Secure->GetGET('id');
$zahlungen = $this->app->erp->GetZahlungen($id,'rechnung');
if (!empty($zahlungen)) {
$et = new EasyTable($this->app);
$et->headings = array('Datum','Beleg','Betrag','W&auml;hrung');
foreach ($zahlungen as $zahlung) {
$row = array(
$zahlung['datum'],
"<a href=\"index.php?module=".$zahlung['doc_typ']."&action=edit&id=".$zahlung['doc_id']."\">
".ucfirst($zahlung['doc_typ'])."
".$zahlung['doc_info']."
</a>",
$zahlung['betrag'],
$zahlung['waehrung']
);
$et->AddRow($row);
}
$salden = $this->app->erp->GetSaldenDokument($id,'rechnung');
foreach ($salden as $saldo) {
$row = array(
'',
'<b>Saldo</b>',
"<b>".$saldo['betrag']."</b>",
"<b>".$saldo['waehrung']."</b>"
);
$et->AddRow($row);
}
return($et->DisplayNew('return',""));
}
}
/*
* Recalculate the payments status with skonto
*/
function rechnung_zahlstatus_berechnen() {
// START RECALCULATE
$this->app->erp->fibu_rebuild_tables();
$offene_rechnungen = $this->app->DB->SelectArr(" SELECT
id,
soll,
waehrung,
datum,
zahlungszieltage,
DATE_ADD(datum, INTERVAL zahlungszieltage DAY) as zieldatum,
CURRENT_DATE > DATE_ADD(datum, INTERVAL zahlungszieltage DAY) as faellig,
zahlungszielskonto,
TRUNCATE(soll*(1-(zahlungszielskonto/100)),2) as skontosoll,
zahlungszieltageskonto,
DATE_ADD(datum, INTERVAL zahlungszieltageskonto DAY) as zieldatumskonto
FROM
rechnung
WHERE
belegnr <> '' AND zahlungsstatus = 'offen'
");
foreach ($offene_rechnungen as $offene_rechnung) {
$saldo = $this->app->erp->GetSaldoDokument($offene_rechnung['id'],'rechnung');
if (!empty($saldo)) {
if ($saldo['waehrung'] == $offene_rechnung['waehrung']) {
$offene_rechnung['ist'] = $offene_rechnung['soll']+$saldo['betrag'];
// Check for skonto
$skontorelevante_zahlungen = $this->app->erp->GetSaldoDokument($offene_rechnung['id'],'rechnung','zubuchung',$offene_rechnung['zieldatumskonto'])['betrag'];
$zielkonforme_zahlungen = $this->app->erp->GetSaldoDokument($offene_rechnung['id'],'rechnung','zubuchung',$offene_rechnung['zieldatum'])['betrag'];
// Check overall value
if ($saldo['betrag'] == 0) {
// ok -> will be marked as paid
} else if ($skontorelevante_zahlungen >= $offene_rechnung['skontosoll']) {
// Skonto ok -> book difference
$sachkonto = $this->app->erp->Firmendaten('rechnung_skonto_kontorahmen');
if (!empty($sachkonto)) {
$this->app->erp->fibu_buchungen_buchen('rechnung',$offene_rechnung['id'],'kontorahmen',$sachkonto,-$saldo['betrag'],$offene_rechnung['waehrung'],date('Y-m-d'),'');
$offene_rechnung['ist'] = $offene_rechnung['soll'];
} else {
}
} else if ($offene_rechnung['faellig']) {
// Overdue
} else {
// Not due
}
// Update rechnung
$sql = "UPDATE
rechnung
SET
ist = ".$saldo['betrag']."+soll,
zahlungsstatus = IF(".$saldo['betrag']." = 0,'bezahlt','offen')
WHERE id=".$offene_rechnung['id'];
$this->app->DB->Update($sql);
}
}
else {
$this->app->DB->Update("UPDATE rechnung SET ist = null WHERE id=".$offene_rechnung['id']);
}
}
$this->app->erp->fibu_rebuild_tables();
// END RECALCULATE
}
} }
+4 -4
View File
@@ -1113,10 +1113,10 @@ class Report
{ {
$filterCategory = $this->request->getPost('filter_category', ''); $filterCategory = $this->request->getPost('filter_category', '');
$filterTerm = $this->request->getPost('filter_term', ''); $filterTerm = $this->request->getPost('filter_term', '');
$filterOnlyOwn = $this->request->post->getBool('filter_own', false); $filterexcludeReadOnly = $this->request->post->getBool('filter_own', false);
$filterOnlyFavorites = $this->request->post->getBool('filter_favorites', false); $filterOnlyFavorites = $this->request->post->getBool('filter_favorites', false);
try { try {
$html= $this->getTileView($filterCategory, $filterTerm, $filterOnlyOwn, $filterOnlyFavorites); $html= $this->getTileView($filterCategory, $filterTerm, !$filterexcludeReadOnly, $filterOnlyFavorites);
$response = new JsonResponse(['success' => true, 'html' => $html]); $response = new JsonResponse(['success' => true, 'html' => $html]);
} catch (Exception $e) { } catch (Exception $e) {
$response = new Response($e->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR); $response = new Response($e->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
@@ -1176,14 +1176,14 @@ class Report
* *
* @return string tiles html * @return string tiles html
*/ */
protected function getTileView($category = '', $searchTerm = '', $onlyOwn = false, $onlyFavs = false) protected function getTileView($category = '', $searchTerm = '', $excludeReadOnly = true, $onlyFavs = false)
{ {
try { try {
$reportList = $this->gateway->getReportList( $reportList = $this->gateway->getReportList(
$category, $category,
$searchTerm, $searchTerm,
$this->app->User->GetID(), $this->app->User->GetID(),
$onlyOwn, $excludeReadOnly,
$onlyFavs $onlyFavs
); );
} catch (Exception $e) { } catch (Exception $e) {
+8 -5
View File
@@ -133,7 +133,6 @@ class Systemhealth {
$cmd = $this->app->Secure->GetGET('cmd'); $cmd = $this->app->Secure->GetGET('cmd');
if($cmd === 'reset') { if($cmd === 'reset') {
$id = $this->app->Secure->GetPOST('id'); $id = $this->app->Secure->GetPOST('id');
try { try {
$this->service->resetStatus($id); $this->service->resetStatus($id);
$status = 1; $status = 1;
@@ -141,6 +140,7 @@ class Systemhealth {
catch(Exception $e) { catch(Exception $e) {
$status = 0; $status = 0;
} }
$this->fillEntries();
header('Content-Type: application/json'); header('Content-Type: application/json');
echo json_encode(['status' => $status]); echo json_encode(['status' => $status]);
$this->app->ExitXentral(); $this->app->ExitXentral();
@@ -461,9 +461,9 @@ class Systemhealth {
public function fillEntries() public function fillEntries()
{ {
$phpVersion = substr(PHP_VERSION,0,3); $phpVersion = substr(PHP_VERSION,0,3);
if($phpVersion < 7.2) { if($phpVersion < 8) {
$status = 'warning'; $status = 'warning';
$phpVersion = 'Ab Xentral 20.2 benötigen Sie mind. PHP 7.2 (aktuell '.$phpVersion $phpVersion = 'OpenXE benötigt mind. PHP 8 (aktuell '.$phpVersion
.'). <a href="https://xentral.com/akademie-faq/systemvoraussetzungen-hd-ich-erhalte-den-hinweis-die-fehlermeldung-ab-xentral-20-1-benotigen-sie-min-php-7-2-aktuell-was-ist-zu-tun" target="_blank">Hilfe</a>'; .'). <a href="https://xentral.com/akademie-faq/systemvoraussetzungen-hd-ich-erhalte-den-hinweis-die-fehlermeldung-ab-xentral-20-1-benotigen-sie-min-php-7-2-aktuell-was-ist-zu-tun" target="_blank">Hilfe</a>';
} }
else { else {
@@ -483,7 +483,10 @@ class Systemhealth {
} }
elseif($dbType === 'mariadb') { elseif($dbType === 'mariadb') {
$status = 'warning'; $status = 'warning';
if($dbVersion >= 10.2) {
$dbVersionArr = explode('.',$dbVersion);
if($dbVersionArr[0] >= 10 && !($dbVersionArr[1] < 2)) {
$status = 'ok'; $status = 'ok';
} }
$mysqlVersion = 'MariaDB '.$dbVersion; $mysqlVersion = 'MariaDB '.$dbVersion;
@@ -503,7 +506,7 @@ class Systemhealth {
//@todo select version() >= 10.2 mariadb + update.php prüfung //@todo select version() >= 10.2 mariadb + update.php prüfung
$this->changeStatus('database', 'db_version', $status, $mysqlVersion); $this->changeStatus('database', 'db_version', $status, $mysqlVersion);
if($status === 'warning') { if($status === 'warning') {
$mysqlVersion = 'Ab Xentral 20.2 benötigen Sie mind. MySQL 5.7 / MariaDb 10.2 (aktuell '.$mysqlVersion $mysqlVersion = 'OpenXE benötigt mind. MySQL 5.7 / MariaDb 10.2 (aktuell '.$mysqlVersion
.'). <a href="https://xentral.com/akademie-faq/systemvoraussetzungen-hd-ich-erhalte-den-hinweis-die-fehlermeldung-ab-xentral-20-1-benotigen-sie-min-mysql-5-7-aktuell-was-muss-ich-tun" target="_blank">Hilfe</a>'; .'). <a href="https://xentral.com/akademie-faq/systemvoraussetzungen-hd-ich-erhalte-den-hinweis-die-fehlermeldung-ab-xentral-20-1-benotigen-sie-min-mysql-5-7-aktuell-was-muss-ich-tun" target="_blank">Hilfe</a>';
} }
$this->changeStatus('database', 'db_version_min', $status, $mysqlVersion); $this->changeStatus('database', 'db_version_min', $status, $mysqlVersion);
+28 -2
View File
@@ -313,6 +313,10 @@ class Ticket {
// Clear this first // Clear this first
$this->app->Tpl->Set('NACHRICHT_ANHANG',""); $this->app->Tpl->Set('NACHRICHT_ANHANG',"");
if (empty($message['betreff'])) {
$message['betreff'] = "...";
}
// Xentral 20 compatibility // Xentral 20 compatibility
if ($message['textausgang'] != '') { if ($message['textausgang'] != '') {
// Sent message // Sent message
@@ -341,7 +345,7 @@ class Ticket {
} }
$this->app->Tpl->Set("NACHRICHT_BETREFF",htmlentities($message['betreff']." (Entwurf)")); $this->app->Tpl->Set("NACHRICHT_BETREFF",htmlentities($message['betreff']." (Entwurf)"));
} else { } else {
$this->app->Tpl->Set("NACHRICHT_BETREFF",'<a href="index.php?module=ticket&action=text&mid='.$message['id'].'" target="_blank">'.htmlentities($message['betreff']).'</a>'); $this->app->Tpl->Set("NACHRICHT_BETREFF",'<a href="index.php?module=ticket&action=text&mid='.$message['id'].'&insecure=1" target="_blank">'.htmlentities($message['betreff']).'</a>');
} }
$this->app->Tpl->Set("NACHRICHT_SENDER",htmlentities($message['verfasser']." <".$message['mail_replyto'].">")); $this->app->Tpl->Set("NACHRICHT_SENDER",htmlentities($message['verfasser']." <".$message['mail_replyto'].">"));
$this->app->Tpl->Set("NACHRICHT_RECIPIENTS",htmlentities($message['mail'])); $this->app->Tpl->Set("NACHRICHT_RECIPIENTS",htmlentities($message['mail']));
@@ -407,6 +411,12 @@ class Ticket {
} }
if ($insecure) { if ($insecure) {
// Adjust cid images
$attachments = $this->app->erp->GetDateiSubjektObjekt('Anhang','Ticket',$mid);
foreach($attachments as $attachment) {
$filename = $this->app->erp->GetDateiName($attachment);
$messages[0]['text'] = str_replace($filename,'index.php?module=dateien&action=send&id='.$attachment,$messages[0]['text']);
}
$this->app->Tpl->Set("TEXT",$messages[0]['text']); $this->app->Tpl->Set("TEXT",$messages[0]['text']);
} else { } else {
@@ -480,6 +490,22 @@ class Ticket {
$input['warteschlange'] = explode(" ",$input['warteschlange'])[0]; // Just the label $input['warteschlange'] = explode(" ",$input['warteschlange'])[0]; // Just the label
$input['zeit'] = date('Y-m-d H:i:s', time()); $input['zeit'] = date('Y-m-d H:i:s', time());
$tags = explode(',',$input['tags']);
// Replace multiple '!' and '?'
foreach ($tags as &$tag) {
$pos = strpos($tag, '?');
if ($pos !== false) {
$tag = substr($tag,0,$pos+1) . str_replace('?','',substr($tag,$pos+1));
}
$tag = preg_replace("/([?!])\\1+/", "$1", $tag);
}
$input['tags'] = implode(',',$tags);
$input['tags'] = str_replace(' ?','?',$input['tags']);
$input['tags'] = str_replace(' !','!',$input['tags']);
$input['tags'] = str_replace('?!','?',$input['tags']);
$input['tags'] = str_replace('!?','?',$input['tags']);
$columns = "id, "; $columns = "id, ";
$values = "$id, "; $values = "$id, ";
$update = ""; $update = "";
@@ -805,7 +831,7 @@ class Ticket {
// Attachments // Attachments
$files = $this->app->erp->GetDateiSubjektObjektDateiname('Anhang','Ticket',$drafted_messages[0]['id'],""); $files = $this->app->erp->GetDateiSubjektObjektDateiname('Anhang','Ticket',$drafted_messages[0]['id'],"");
$pattern = '/[a-z0-9_\-\+\.]+@[a-z0-9\-]+\.([a-z]{2,63})(?:\.[a-z]{2})?/i'; $pattern = '/[a-z0-9_\-\+\.]+@[a-z0-9\-]+\.([a-z]{2,63})(?:\.[a-z]{2,63})?/i';
preg_match_all($pattern, $drafted_messages[0]['mail'], $matches); preg_match_all($pattern, $drafted_messages[0]['mail'], $matches);
$to = $matches[0]; $to = $matches[0];
+21 -14
View File
@@ -10,7 +10,7 @@
/* /*
**** 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 * Xentral (c) Xentral ERP Software GmbH, Fuggerstrasse 11, D-86150 Augsburg, * Germany 2019
* *
* This file is licensed under the Embedded Projects General Public License *Version 3.1. * This file is licensed under the Embedded Projects General Public License *Version 3.1.
* *
@@ -190,12 +190,14 @@ class Versandarten {
)) ))
$error[] = 'Typ ist bereits für eine andere Versandart vergeben'; $error[] = 'Typ ist bereits für eine andere Versandart vergeben';
foreach ($obj->AdditionalSettings() as $k => $v) { if ($obj !== null) {
$form[$k] = $this->app->Secure->GetPOST($k); foreach ($obj->AdditionalSettings() as $k => $v) {
} $form[$k] = $this->app->Secure->GetPOST($k);
$error = array_merge($error, $obj->ValidateSettings($form)); }
foreach ($obj->AdditionalSettings() as $k => $v) { $error = array_merge($error, $obj->ValidateSettings($form));
$json[$k] = $form[$k]; foreach ($obj->AdditionalSettings() as $k => $v) {
$json[$k] = $form[$k];
}
} }
$json = json_encode($json ?? null); $json = json_encode($json ?? null);
@@ -241,7 +243,7 @@ class Versandarten {
$form['paketmarke_drucker'] = $daten['paketmarke_drucker']; $form['paketmarke_drucker'] = $daten['paketmarke_drucker'];
} }
$obj->RenderAdditionalSettings('MODULESETTINGS', $form); $obj?->RenderAdditionalSettings('MODULESETTINGS', $form);
$this->app->Tpl->addSelect('EXPORT_DRUCKER', 'export_drucker', 'export_drucker', $this->app->Tpl->addSelect('EXPORT_DRUCKER', 'export_drucker', 'export_drucker',
$this->getPrinterByModule($obj, false), $form['export_drucker']); $this->getPrinterByModule($obj, false), $form['export_drucker']);
@@ -266,7 +268,7 @@ class Versandarten {
'geschaeftsbrief_vorlage', $geschaeftsbrief_vorlagen, $daten['geschaeftsbrief_vorlage']); 'geschaeftsbrief_vorlage', $geschaeftsbrief_vorlagen, $daten['geschaeftsbrief_vorlage']);
$this->app->Tpl->addSelect('SELMODUL', 'modul', 'modul', $this->app->Tpl->addSelect('SELMODUL', 'modul', 'modul',
$this->VersandartenSelModul(), $form['modul']); $this->VersandartenSelModul(true), $form['modul']);
$this->app->Tpl->Set('BEZEICHNUNG', $form['bezeichnung']); $this->app->Tpl->Set('BEZEICHNUNG', $form['bezeichnung']);
$this->app->Tpl->Set('TYPE', $form['type']); $this->app->Tpl->Set('TYPE', $form['type']);
$this->app->Tpl->Set('PROJEKT', $form['projekt']); $this->app->Tpl->Set('PROJEKT', $form['projekt']);
@@ -278,11 +280,11 @@ class Versandarten {
$this->app->Tpl->Parse('PAGE', 'versandarten_edit.tpl'); $this->app->Tpl->Parse('PAGE', 'versandarten_edit.tpl');
} }
protected function getPrinterByModule(Versanddienstleister $obj, bool $includeLabelPrinter = true): array protected function getPrinterByModule(?Versanddienstleister $obj, bool $includeLabelPrinter = true): array
{ {
$printer = $this->app->erp->GetDrucker(); $printer = $this->app->erp->GetDrucker();
if ($includeLabelPrinter && $obj->isEtikettenDrucker()) { if ($includeLabelPrinter && $obj?->isEtikettenDrucker()) {
$labelPrinter = $this->app->erp->GetEtikettendrucker(); $labelPrinter = $this->app->erp->GetEtikettendrucker();
$printer = array_merge($printer ?? [], $labelPrinter ?? []); $printer = array_merge($printer ?? [], $labelPrinter ?? []);
} }
@@ -711,7 +713,7 @@ class Versandarten {
return $this->HandleSaveAssistantAjaxAction(); return $this->HandleSaveAssistantAjaxAction();
} }
$modulelist = $this->VersandartenSelModul(); $modulelist = $this->VersandartenSelModul(true);
$auswahlmodul = $this->app->Secure->GetGET('auswahl'); $auswahlmodul = $this->app->Secure->GetGET('auswahl');
if($auswahlmodul && isset($modulelist[$auswahlmodul])) { if($auswahlmodul && isset($modulelist[$auswahlmodul])) {
@@ -757,7 +759,7 @@ class Versandarten {
* @param string $module * @param string $module
* @param int $moduleId * @param int $moduleId
* *
* @return mixed|null * @return ?Versanddienstleister
*/ */
public function loadModule(string $module, int $moduleId = 0) : ?Versanddienstleister public function loadModule(string $module, int $moduleId = 0) : ?Versanddienstleister
{ {
@@ -789,9 +791,12 @@ class Versandarten {
* Retrieve all Versandarten from lib/versandarten/ * Retrieve all Versandarten from lib/versandarten/
* @return array * @return array
*/ */
function VersandartenSelModul() : array function VersandartenSelModul(bool $addEmpty = false) : array
{ {
$result = []; $result = [];
if ($addEmpty)
$result[''] = '';
$pfad = dirname(__DIR__).'/lib/versandarten'; $pfad = dirname(__DIR__).'/lib/versandarten';
if(!is_dir($pfad)) if(!is_dir($pfad))
return $result; return $result;
@@ -821,6 +826,8 @@ class Versandarten {
continue; continue;
$obj = $this->loadModule($modul); $obj = $this->loadModule($modul);
if ($obj === null)
continue;
$result[$modul] = $obj->name ?? ucfirst($modul); $result[$modul] = $obj->name ?? ucfirst($modul);
unset($obj); unset($obj);
} }
+46 -15
View File
@@ -999,7 +999,7 @@ $lagerartikel = "";
LEFT JOIN bestellung on bestellung_position.bestellung = bestellung.id LEFT JOIN bestellung on bestellung_position.bestellung = bestellung.id
where paketannahme = $id GROUP BY bestellung_position, paketdistribution.artikel) as p";*/ where paketannahme = $id GROUP BY bestellung_position, paketdistribution.artikel) as p";*/
$sql = "SELECT p.nummer,p.lieferantnummer, p.nummer, p.bestellbezug, p.name, p.menge, p.bemerkung from $sql = "SELECT SQL_CALC_FOUND_ROWS p.nummer,p.lieferantnummer, p.nummer, p.bestellbezug, p.name, p.menge, p.bemerkung from
(SELECT bestellung.belegnr as bestellbezug, bestellung_position.bestellnummer as lieferantnummer ,artikel.nummer as nummer, artikel.name_de as name, ".$this->app->erp->FormatMenge("paketdistribution.menge")." as menge, paketdistribution.bemerkung (SELECT bestellung.belegnr as bestellbezug, bestellung_position.bestellnummer as lieferantnummer ,artikel.nummer as nummer, artikel.name_de as name, ".$this->app->erp->FormatMenge("paketdistribution.menge")." as menge, paketdistribution.bemerkung
FROM paketdistribution FROM paketdistribution
INNER JOIN artikel ON artikel.id = paketdistribution.artikel INNER JOIN artikel ON artikel.id = paketdistribution.artikel
@@ -1008,7 +1008,7 @@ $lagerartikel = "";
where paketannahme = $id) as p"; where paketannahme = $id) as p";
$where = ""; $where = "";
$count = "SELECT count(DISTINCT artikel) FROM paketdistribution p WHERE paketannahme = $id"; $count = "SELECT count(DISTINCT id) FROM paketdistribution p WHERE paketannahme = $id";
// $groupby = ""; // $groupby = "";
break; break;
@@ -1032,16 +1032,20 @@ $lagerartikel = "";
// $groupby = ""; // $groupby = "";
*/ */
$allowed['paketannahme_list'] = array('list'); $allowed['paketannahme_list'] = array('list');
$heading = array('Paket-Nr.','Datum','Status','Name', 'Kunde', 'Lieferant','LS-Nr.','RE-Nr.', 'Bearbeiter','Bemerkung', 'Men&uuml;'); $heading = array('','Paket-Nr.','Datum','Status','Name', 'Kunde', 'Lieferant','Bestellung','LS-Nr.','RE-Nr.', 'Bearbeiter','Bemerkung', 'Men&uuml;');
$width = array('5%','10%','10%','10%','10%','10%','10%','10%','10%'); // Fill out manually later $width = array('1%','5%','10%','10%','10%','10%','10%','10%','10%','10%','10%'); // Fill out manually later
$drop = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`";
$findcols = array( $findcols = array(
'paketannahme.id',
'paketannahme.id', 'paketannahme.id',
'paketannahme.datum', 'paketannahme.datum',
'paketannahme.status', 'paketannahme.status',
'adresse.name', 'adresse.name',
'adresse.kundennummer', 'adresse.kundennummer',
'adresse.lieferantennummer', 'adresse.lieferantennummer',
'bestellung.belegnr',
'paketannahme.lsnr', 'paketannahme.lsnr',
'paketannahme.renr', 'paketannahme.renr',
'paketannahme.bearbeiter', 'paketannahme.bearbeiter',
@@ -1055,6 +1059,7 @@ $lagerartikel = "";
'adresse.name', 'adresse.name',
'adresse.kundennummer', 'adresse.kundennummer',
'adresse.lieferantennummer', 'adresse.lieferantennummer',
'bestellung.belegnr',
'paketannahme.lsnr', 'paketannahme.lsnr',
'paketannahme.renr', 'paketannahme.renr',
'paketannahme.bearbeiter', 'paketannahme.bearbeiter',
@@ -1067,12 +1072,14 @@ $lagerartikel = "";
$sql = "SELECT SQL_CALC_FOUND_ROWS $sql = "SELECT SQL_CALC_FOUND_ROWS
paketannahme.id, paketannahme.id,
".$drop.",
paketannahme.id, paketannahme.id,
DATE_FORMAT(paketannahme.datum, '%d.%m.%Y %H:%i'), DATE_FORMAT(paketannahme.datum, '%d.%m.%Y %H:%i'),
paketannahme.status, paketannahme.status,
adresse.name, adresse.name,
adresse.kundennummer, adresse.kundennummer,
adresse.lieferantennummer, adresse.lieferantennummer,
GROUP_CONCAT(DISTINCT bestellung.belegnr),
paketannahme.lsnr, paketannahme.lsnr,
paketannahme.renr, paketannahme.renr,
paketannahme.bearbeiter, paketannahme.bearbeiter,
@@ -1080,14 +1087,23 @@ $lagerartikel = "";
paketannahme.id paketannahme.id
FROM paketannahme FROM paketannahme
INNER JOIN adresse INNER JOIN adresse
ON paketannahme.adresse = adresse.id"; ON paketannahme.adresse = adresse.id
LEFT JOIN paketdistribution
ON paketannahme.id = paketdistribution.paketannahme
LEFT JOIN bestellung_position
ON paketdistribution.bestellung_position = bestellung_position.id
LEFT JOIN bestellung
ON bestellung.id = bestellung_position.bestellung";
$where = "1"; $where = "1";
$count = "SELECT count(paketannahme.id) FROM paketannahme $count = "SELECT count(paketannahme.id) FROM paketannahme
INNER JOIN adresse INNER JOIN adresse
ON paketannahme.adresse = adresse.id"; ON paketannahme.adresse = adresse.id";
// $groupby = ""; $groupby = "GROUP BY paketannahme.id";
$moreinfo = true; // Allow drop down details
$menucol = 1; // For moredata
break; break;
} }
@@ -1703,6 +1719,8 @@ $lagerartikel = "";
$renr = $this->app->Secure->GetPOST('renr'); $renr = $this->app->Secure->GetPOST('renr');
$bemerkung = $this->app->Secure->GetPOST('bemerkung'); $bemerkung = $this->app->Secure->GetPOST('bemerkung');
$bemerkung = str_replace(array('\r\n', '\r', '\n'), "\n", $bemerkung);
// Load from DB // Load from DB
if (($lsnr == '' && $renr == '' && $bemerkung == '') && $id != '') { if (($lsnr == '' && $renr == '' && $bemerkung == '') && $id != '') {
$fields = $this->app->DB->SelectArr( $fields = $this->app->DB->SelectArr(
@@ -1820,13 +1838,16 @@ $lagerartikel = "";
} }
} }
$sql =sprintf(
$adresse= $this->app->DB->Select( 'SELECT `adresse`,%s FROM `paketannahme` WHERE `id` = %d LIMIT 1',
sprintf( $this->app->erp->FormatDate('datum','datum'),
'SELECT `adresse` FROM `paketannahme` WHERE `id` = %d LIMIT 1',
$id $id
) );
);
$paketannahme = $this->app->DB->SelectArr($sql)[0];
$adresse = $paketannahme['adresse'];
$datum = $paketannahme['datum'];
$addressRow = empty($adresse)?null: $this->app->DB->SelectRow( $addressRow = empty($adresse)?null: $this->app->DB->SelectRow(
sprintf( sprintf(
@@ -1878,7 +1899,7 @@ $lagerartikel = "";
if (!empty($addressRow['name'])) { if (!empty($addressRow['name'])) {
$this->app->Tpl->Set('LEGENDE',"Paket <b>Nr.$id</b> erfassen f&uuml;r Adresse '".$addressRow['name']."':"); $this->app->Tpl->Set('LEGENDE',"Paket <b>Nr.$id</b> vom $datum erfassen f&uuml;r Adresse '".$addressRow['name']."':");
} }
$this->app->Tpl->Add('TAB1_SECOND',"<br><h1>Paketinhalt (eingebucht):</h1><br>"); $this->app->Tpl->Add('TAB1_SECOND',"<br><h1>Paketinhalt (eingebucht):</h1><br>");
@@ -1956,9 +1977,19 @@ $lagerartikel = "";
$this->app->ExitXentral(); $this->app->ExitXentral();
} }
$table = new EasyTable($this->app); $table = new EasyTable($this->app);
$table->Query("SELECT a.nummer, LEFT(a.name_de,30) as artikel, trim(lb.menge)+0 as menge FROM lager_bewegung lb /*$table->Query("SELECT a.nummer, a.name_de as artikel, trim(lb.menge)+0 as menge FROM lager_bewegung lb
LEFT JOIN artikel a ON lb.artikel=a.id LEFT JOIN artikel a ON lb.artikel=a.id
WHERE lb.paketannahme='$id' ORDER by a.nummer"); WHERE lb.paketannahme='$id' ORDER by a.nummer");
*/
/* See tablesearch... */
$table->Query("SELECT SQL_CALC_FOUND_ROWS p.nummer,p.lieferantnummer, p.nummer, p.bestellbezug, p.name, p.menge, p.bemerkung from
(SELECT bestellung.belegnr as bestellbezug, bestellung_position.bestellnummer as lieferantnummer ,artikel.nummer as nummer, artikel.name_de as name, ".$this->app->erp->FormatMenge("paketdistribution.menge")." as menge, paketdistribution.bemerkung
FROM paketdistribution
INNER JOIN artikel ON artikel.id = paketdistribution.artikel
LEFT JOIN bestellung_position ON bestellung_position = bestellung_position.id
LEFT JOIN bestellung on bestellung_position.bestellung = bestellung.id
where paketannahme = $id) as p");
$this->app->Tpl->Set('MD5', md5(microtime(true))); $this->app->Tpl->Set('MD5', md5(microtime(true)));
$this->app->Tpl->Set('ID', $id); $this->app->Tpl->Set('ID', $id);
$arr = $this->app->DB->SelectRow("SELECT * FROM paketannahme WHERE id = '$id' LIMIT 1"); $arr = $this->app->DB->SelectRow("SELECT * FROM paketannahme WHERE id = '$id' LIMIT 1");
@@ -1972,7 +2003,7 @@ $lagerartikel = "";
$this->app->Tpl->Set('RENR', $arr['renr']); $this->app->Tpl->Set('RENR', $arr['renr']);
$this->app->Tpl->Set('LSNR', $arr['lsnr']); $this->app->Tpl->Set('LSNR', $arr['lsnr']);
} }
$table->DisplayNew('ARTIKEL','Menge','noAction'); $table->DisplayNew('ARTIKEL','Bemerkung','noAction');
$this->app->Tpl->Output('wareneingang_minidetail.tpl'); $this->app->Tpl->Output('wareneingang_minidetail.tpl');
$this->app->ExitXentral(); $this->app->ExitXentral();
} }
+6 -15
View File
@@ -2241,7 +2241,7 @@ $this->app->Tpl->Add('TODOFORUSER',"<tr><td width=\"90%\">".$tmp[$i]['aufgabe'].
$this->app->Tpl->Add('TAB1',"Sie benutzen die kommerzielle Version von Xentral. Alle Rechte vorbehalten. Beachten Sie die Nutzungsbedinungen.<br><br>&copy; Copyright by Xentral ERP Software GmbH Augsburg"); $this->app->Tpl->Add('TAB1',"Sie benutzen die kommerzielle Version von Xentral. Alle Rechte vorbehalten. Beachten Sie die Nutzungsbedinungen.<br><br>&copy; Copyright by Xentral ERP Software GmbH Augsburg");
} }
else { else {
$this->app->Tpl->Add('TAB1','OpenXE is free open source software under AGPL-3.0 license, based on <a href="https://xentral.com" target="_blank">Xentral®</a> by Xentral&nbsp;ERP&nbsp;Software&nbsp;GmbH.<br><br><div class="info"><img src="themes/new/images/Xentral_ERP_Logo-200.png"><br>Das Logo und der Link zur Homepage <a href="https://xentral.biz" target=\_blank\>https://xentral.biz</a> d&uuml;rfen nicht entfernt werden.</div><br>&copy; Copyright by OpenXE project & Xentral ERP Software GmbH Augsburg'); $this->app->Tpl->Add('TAB1','OpenXE is free open source software under AGPL/EGPL license, based on <a href="https://xentral.com" target="_blank">Xentral®</a> by Xentral&nbsp;ERP&nbsp;Software&nbsp;GmbH.<br><br><div class="info"><img src="themes/new/images/Xentral_ERP_Logo-200.png"><br>Das Logo und der Link zur Homepage <a href="https://xentral.biz" target=\_blank\>https://xentral.biz</a> d&uuml;rfen nicht entfernt werden.</div><br>&copy; Copyright by OpenXE project & Xentral ERP Software GmbH Augsburg');
} }
if($this->app->erp->isIoncube() && method_exists($this->app->erp, 'IoncubeProperty')) if($this->app->erp->isIoncube() && method_exists($this->app->erp, 'IoncubeProperty'))
@@ -3034,18 +3034,12 @@ $this->app->Tpl->Add('TODOFORUSER',"<tr><td width=\"90%\">".$tmp[$i]['aufgabe'].
} }
} }
*/ */
$subHeadline = 'Es kann nun losgehen.';
if($isAdminAdmin && !empty(erpAPI::Ioncube_Property('isdevelopmentversion'))) {
$subHeadline = 'Es handelt sich hier um eine Development-Version.
Diese ist nicht für den produktiven Einsatz gedacht.';
}
/** @var SystemTemplates $systemTemplates */ if($isAdminAdmin) {
$showExampleImport = !empty(erpAPI::Ioncube_Property('testlizenz')) $subHeadline = 'Bitte nach der Installation das <a href="index.php?module=upgrade" target="_blank">Datenbank-Upgrade</a> durchführen.';
&& !empty(erpAPI::Ioncube_Property('iscloud')) } else {
&& $this->app->erp->RechteVorhanden('systemtemplate', 'list') $subHeadline = 'Es kann nun losgehen.';
&& ($systemTemplates = $this->app->loadModule('systemtemplates')) !== null }
&& $systemTemplates->canInstallExampleData(false);
$lastPage = [ $lastPage = [
'type' => 'defaultPage', 'type' => 'defaultPage',
@@ -3062,9 +3056,6 @@ $this->app->Tpl->Add('TODOFORUSER',"<tr><td width=\"90%\">".$tmp[$i]['aufgabe'].
if($showExampleImport) { if($showExampleImport) {
$lastPage['subHeadline'] .= '<br /><a href="index.php?module=systemtemplates&action=list">Beispieldaten einspielen</a>'; $lastPage['subHeadline'] .= '<br /><a href="index.php?module=systemtemplates&action=list">Beispieldaten einspielen</a>';
} }
if($isAdminAdmin && $this->app->erp->ModulVorhanden('learningdashboard')){
$lastPage['ctaButtons']['link'] = 'index.php?module=learningdashboard&action=list';
}
$pages[] = $lastPage; $pages[] = $lastPage;
-7
View File
@@ -1,7 +0,0 @@
<?php
// autoload.php @generated by Composer
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInitbdcab6487556631ed3c158e0e8422e44::getLoader();
@@ -1,445 +0,0 @@
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\Autoload;
/**
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
*
* $loader = new \Composer\Autoload\ClassLoader();
*
* // register classes with namespaces
* $loader->add('Symfony\Component', __DIR__.'/component');
* $loader->add('Symfony', __DIR__.'/framework');
*
* // activate the autoloader
* $loader->register();
*
* // to enable searching the include path (eg. for PEAR packages)
* $loader->setUseIncludePath(true);
*
* In this example, if you try to use a class in the Symfony\Component
* namespace or one of its children (Symfony\Component\Console for instance),
* the autoloader will first look for the class under the component/
* directory, and it will then fallback to the framework/ directory if not
* found before giving up.
*
* This class is loosely based on the Symfony UniversalClassLoader.
*
* @author Fabien Potencier <fabien@symfony.com>
* @author Jordi Boggiano <j.boggiano@seld.be>
* @see http://www.php-fig.org/psr/psr-0/
* @see http://www.php-fig.org/psr/psr-4/
*/
class ClassLoader
{
// PSR-4
private $prefixLengthsPsr4 = array();
private $prefixDirsPsr4 = array();
private $fallbackDirsPsr4 = array();
// PSR-0
private $prefixesPsr0 = array();
private $fallbackDirsPsr0 = array();
private $useIncludePath = false;
private $classMap = array();
private $classMapAuthoritative = false;
private $missingClasses = array();
private $apcuPrefix;
public function getPrefixes()
{
if (!empty($this->prefixesPsr0)) {
return call_user_func_array('array_merge', $this->prefixesPsr0);
}
return array();
}
public function getPrefixesPsr4()
{
return $this->prefixDirsPsr4;
}
public function getFallbackDirs()
{
return $this->fallbackDirsPsr0;
}
public function getFallbackDirsPsr4()
{
return $this->fallbackDirsPsr4;
}
public function getClassMap()
{
return $this->classMap;
}
/**
* @param array $classMap Class to filename map
*/
public function addClassMap(array $classMap)
{
if ($this->classMap) {
$this->classMap = array_merge($this->classMap, $classMap);
} else {
$this->classMap = $classMap;
}
}
/**
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
* @param string $prefix The prefix
* @param array|string $paths The PSR-0 root directories
* @param bool $prepend Whether to prepend the directories
*/
public function add($prefix, $paths, $prepend = false)
{
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
(array) $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
(array) $paths
);
}
return;
}
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
$this->prefixesPsr0[$first][$prefix] = (array) $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
(array) $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
(array) $paths
);
}
}
/**
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param array|string $paths The PSR-4 base directories
* @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
(array) $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
(array) $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
// Register directories for a new namespace.
$length = strlen($prefix);
if ('\\' !== $prefix[$length - 1]) {
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
$this->prefixDirsPsr4[$prefix] = (array) $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
(array) $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
(array) $paths
);
}
}
/**
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
* @param string $prefix The prefix
* @param array|string $paths The PSR-0 base directories
*/
public function set($prefix, $paths)
{
if (!$prefix) {
$this->fallbackDirsPsr0 = (array) $paths;
} else {
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
}
}
/**
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param array|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*/
public function setPsr4($prefix, $paths)
{
if (!$prefix) {
$this->fallbackDirsPsr4 = (array) $paths;
} else {
$length = strlen($prefix);
if ('\\' !== $prefix[$length - 1]) {
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
$this->prefixDirsPsr4[$prefix] = (array) $paths;
}
}
/**
* Turns on searching the include path for class files.
*
* @param bool $useIncludePath
*/
public function setUseIncludePath($useIncludePath)
{
$this->useIncludePath = $useIncludePath;
}
/**
* Can be used to check if the autoloader uses the include path to check
* for classes.
*
* @return bool
*/
public function getUseIncludePath()
{
return $this->useIncludePath;
}
/**
* Turns off searching the prefix and fallback directories for classes
* that have not been registered with the class map.
*
* @param bool $classMapAuthoritative
*/
public function setClassMapAuthoritative($classMapAuthoritative)
{
$this->classMapAuthoritative = $classMapAuthoritative;
}
/**
* Should class lookup fail if not found in the current class map?
*
* @return bool
*/
public function isClassMapAuthoritative()
{
return $this->classMapAuthoritative;
}
/**
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
*
* @param string|null $apcuPrefix
*/
public function setApcuPrefix($apcuPrefix)
{
$this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
}
/**
* The APCu prefix in use, or null if APCu caching is not enabled.
*
* @return string|null
*/
public function getApcuPrefix()
{
return $this->apcuPrefix;
}
/**
* Registers this instance as an autoloader.
*
* @param bool $prepend Whether to prepend the autoloader or not
*/
public function register($prepend = false)
{
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
}
/**
* Unregisters this instance as an autoloader.
*/
public function unregister()
{
spl_autoload_unregister(array($this, 'loadClass'));
}
/**
* Loads the given class or interface.
*
* @param string $class The name of the class
* @return bool|null True if loaded, null otherwise
*/
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
includeFile($file);
return true;
}
}
/**
* Finds the path to the file where the class is defined.
*
* @param string $class The name of the class
*
* @return string|false The path if found, false otherwise
*/
public function findFile($class)
{
// class map lookup
if (isset($this->classMap[$class])) {
return $this->classMap[$class];
}
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
return false;
}
if (null !== $this->apcuPrefix) {
$file = apcu_fetch($this->apcuPrefix.$class, $hit);
if ($hit) {
return $file;
}
}
$file = $this->findFileWithExtension($class, '.php');
// Search for Hack files if we are running on HHVM
if (false === $file && defined('HHVM_VERSION')) {
$file = $this->findFileWithExtension($class, '.hh');
}
if (null !== $this->apcuPrefix) {
apcu_add($this->apcuPrefix.$class, $file);
}
if (false === $file) {
// Remember that this class does not exist.
$this->missingClasses[$class] = true;
}
return $file;
}
private function findFileWithExtension($class, $ext)
{
// PSR-4 lookup
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
$first = $class[0];
if (isset($this->prefixLengthsPsr4[$first])) {
$subPath = $class;
while (false !== $lastPos = strrpos($subPath, '\\')) {
$subPath = substr($subPath, 0, $lastPos);
$search = $subPath.'\\';
if (isset($this->prefixDirsPsr4[$search])) {
foreach ($this->prefixDirsPsr4[$search] as $dir) {
$length = $this->prefixLengthsPsr4[$first][$search];
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
return $file;
}
}
}
}
}
// PSR-4 fallback dirs
foreach ($this->fallbackDirsPsr4 as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
return $file;
}
}
// PSR-0 lookup
if (false !== $pos = strrpos($class, '\\')) {
// namespaced class name
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
} else {
// PEAR-like class name
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
}
if (isset($this->prefixesPsr0[$first])) {
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
if (0 === strpos($class, $prefix)) {
foreach ($dirs as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
return $file;
}
}
}
}
}
// PSR-0 fallback dirs
foreach ($this->fallbackDirsPsr0 as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
return $file;
}
}
// PSR-0 include paths.
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
return $file;
}
return false;
}
}
/**
* Scope isolated include.
*
* Prevents access to $this/self from included files.
*/
function includeFile($file)
{
include $file;
}
-21
View File
@@ -1,21 +0,0 @@
Copyright (c) Nils Adermann, Jordi Boggiano
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
@@ -1,9 +0,0 @@
<?php
// autoload_classmap.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
);
@@ -1,10 +0,0 @@
<?php
// autoload_namespaces.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'Fhp' => array($vendorDir . '/mschindler83/fints-hbci-php/lib'),
);
@@ -1,47 +0,0 @@
<?php
// autoload_real.php @generated by Composer
class ComposerAutoloaderInitbdcab6487556631ed3c158e0e8422e44
{
private static $loader;
public static function loadClassLoader($class)
{
if ('Composer\Autoload\ClassLoader' === $class) {
require __DIR__ . '/ClassLoader.php';
}
}
public static function getLoader()
{
if (null !== self::$loader) {
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInitbdcab6487556631ed3c158e0e8422e44', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
spl_autoload_unregister(array('ComposerAutoloaderInitbdcab6487556631ed3c158e0e8422e44', 'loadClassLoader'));
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
if ($useStaticLoader) {
require_once __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInitbdcab6487556631ed3c158e0e8422e44::getInitializer($loader));
} else {
$map = require __DIR__ . '/autoload_namespaces.php';
foreach ($map as $namespace => $path) {
$loader->set($namespace, $path);
}
$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
$loader->addClassMap($classMap);
}
}
$loader->register(true);
return $loader;
}
}
@@ -1,26 +0,0 @@
<?php
// autoload_static.php @generated by Composer
namespace Composer\Autoload;
class ComposerStaticInitbdcab6487556631ed3c158e0e8422e44
{
public static $prefixesPsr0 = array (
'F' =>
array (
'Fhp' =>
array (
0 => 'plugins/fints-hbci-php/vendor/mschindler83/fints-hbci-php/lib'
)
),
);
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixesPsr0 = ComposerStaticInitbdcab6487556631ed3c158e0e8422e44::$prefixesPsr0;
}, null, ClassLoader::class);
}
}
@@ -1,88 +0,0 @@
[
{
"name": "psr/log",
"version": "1.0.2",
"version_normalized": "1.0.2.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
"reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
"reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"time": "2016-10-10T12:19:37+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"Psr\\Log\\": "Psr/Log/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
}
],
"description": "Common interface for logging libraries",
"homepage": "https://github.com/php-fig/log",
"keywords": [
"log",
"psr",
"psr-3"
]
},
{
"name": "mschindler83/fints-hbci-php",
"version": "1.0.4",
"version_normalized": "1.0.4.0",
"source": {
"type": "git",
"url": "https://github.com/mschindler83/fints-hbci-php.git",
"reference": "e58cb825c178d4c39a8974a9dd93abbc8094551f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/mschindler83/fints-hbci-php/zipball/e58cb825c178d4c39a8974a9dd93abbc8094551f",
"reference": "e58cb825c178d4c39a8974a9dd93abbc8094551f",
"shasum": ""
},
"require": {
"php": ">=5.3.2",
"psr/log": "~1.0"
},
"suggest": {
"monolog/monolog": "Allow sending log messages to a variety of different handlers"
},
"time": "2017-02-15T13:48:21+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
"psr-0": {
"Fhp": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "PHP Library for the protocols fints and hbci",
"homepage": "http://fints-hbci-php.markus-schindler.de"
}
]
File diff suppressed because it is too large Load Diff
@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2016 Markus Schindler <mail@markus-schindler.de>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -1,40 +0,0 @@
# FinTS HBCI PHP
[![Build Status](https://travis-ci.org/mschindler83/fints-hbci-php.svg?branch=master)](https://travis-ci.org/mschindler83/fints-hbci-php)
[![Latest Stable Version](https://poser.pugx.org/mschindler83/fints-hbci-php/v/stable)](https://packagist.org/packages/mschindler83/fints-hbci-php)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/mschindler83/fints-hbci-php/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/mschindler83/fints-hbci-php/?branch=master)
[![Monthly Downloads](https://poser.pugx.org/mschindler83/fints-hbci-php/d/monthly)](https://packagist.org/packages/mschindler83/fints-hbci-php)
[![License](https://poser.pugx.org/mschindler83/fints-hbci-php/license)](https://packagist.org/packages/mschindler83/fints-hbci-php)
A PHP library implementing the basics of the FinTS / HBCI protocol.
It can be used to fetch the balance of connected bank accounts and for fetching bank statements of accounts.
## Getting Started
Install via composer:
composer require mschindler83/fints-hbci-php
## How to use it
You can have a look at the "Samples" folder in this repository.
Just fill in the required data beginning from line 13 to 17 and run the script.
You can find the server information of your bank here:
https://www.hbci-zka.de/institute/institut_auswahl.htm
## Contribute
### Bank compatibility
This library can only work stable with *YOUR* help!
As I'm very limited in testing different banks it would be good to get some feedback from you all.
Feel free to create PR's for the [COMPATIBILITY.md](COMPATIBILITY.md) file where you can update the list of working banks.
### Code Style
If you plan to contribute to this library, please ensure that you stick with the PSR coding rules as close as you can (At least PSR-0 to PSR-4).
You can find the PHP Standard Recommendations [here](http://www.php-fig.org/psr/)
### Have fun!
@@ -1,18 +0,0 @@
<?php
namespace Fhp\Adapter;
use Fhp\Message\AbstractMessage;
/**
* Interface AdapterInterface
* @package Fhp\Adapter
*/
interface AdapterInterface
{
/**
* @param AbstractMessage $message
* @return string
*/
public function send(AbstractMessage $message);
}
@@ -1,106 +0,0 @@
<?php
namespace Fhp\Adapter;
use Fhp\Adapter\Exception\AdapterException;
use Fhp\Adapter\Exception\CurlException;
use Fhp\Message\AbstractMessage;
/**
* Class Curl
* @package Fhp\Adapter
*/
class Curl implements AdapterInterface
{
/**
* @var string
*/
protected $host;
/**
* @var int
*/
protected $port;
/**
* @var resource
*/
protected $curlHandle;
/**
* @var mixed
*/
protected $lastResponseInfo;
/**
* Curl constructor.
*
* @param string $host
* @param int $port
* @throws AdapterException
* @throws CurlException
*/
public function __construct($host, $port)
{
if (!is_integer($port) || (int) $port <= 0) {
throw new AdapterException('Invalid port number');
}
$this->host = (string) $host;
$this->port = (int) $port;
$this->curlHandle = curl_init();
curl_setopt($this->curlHandle, CURLOPT_SSLVERSION, 1);
curl_setopt($this->curlHandle, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($this->curlHandle, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($this->curlHandle, CURLOPT_USERAGENT, "FHP-lib");
curl_setopt($this->curlHandle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($this->curlHandle, CURLOPT_URL, $this->host);
curl_setopt($this->curlHandle, CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($this->curlHandle, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($this->curlHandle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($this->curlHandle, CURLOPT_ENCODING, '');
curl_setopt($this->curlHandle, CURLOPT_MAXREDIRS, 0);
curl_setopt($this->curlHandle, CURLOPT_TIMEOUT, 30);
curl_setopt($this->curlHandle, CURLOPT_HTTPHEADER, array("cache-control: no-cache", 'Content-Type: text/plain'));
}
/**
* @param AbstractMessage $message
* @return string
* @throws CurlException
*/
public function send(AbstractMessage $message)
{
curl_setopt($this->curlHandle, CURLOPT_POSTFIELDS, base64_encode($message->toString()));
$response = curl_exec($this->curlHandle);
$this->lastResponseInfo = curl_getinfo($this->curlHandle);
if (false === $response) {
throw new CurlException(
'Failed connection to ' . $this->host . ': ' . curl_error($this->curlHandle),
curl_errno($this->curlHandle),
null,
$this->lastResponseInfo
);
}
$statusCode = curl_getinfo($this->curlHandle, CURLINFO_HTTP_CODE);
if ($statusCode < 200 || $statusCode > 299) {
throw new CurlException('Bad response with status code ' . $statusCode, 0, null, $this->lastResponseInfo);
}
return base64_decode($response);
}
/**
* Gets curl info for last request / response.
*
* @return mixed
*/
public function getLastResponseInfo()
{
return $this->lastResponseInfo;
}
}
@@ -1,56 +0,0 @@
<?php
namespace Fhp\Adapter;
use Fhp\Adapter\Exception\AdapterException;
use Fhp\Message\AbstractMessage;
/**
* Class Debug Adapter.
*
* Use it to debug requests.
*
* @package Fhp\Adapter
*/
class Debug implements AdapterInterface
{
/**
* @var string
*/
protected $host;
/**
* @var int
*/
protected $port;
/**
* Debug constructor.
*
* @param $host
* @param $port
* @throws AdapterException
*/
public function __construct($host, $port)
{
if (!is_integer($port) || (int) $port <= 0) {
throw new AdapterException('Invalid port number');
}
$this->host = (string) $host;
$this->port = (int) $port;
}
/**
* Should return a dummy response body.
*
* @param AbstractMessage $message
* @return string
*/
public function send(AbstractMessage $message)
{
/* @todo Implement me
* return file_get_contents(__DIR__ . '/../../../develop/accounts_response.txt');
*/
}
}

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