app=$app; if(empty($this->app->erp)){ $this->app->erp = $this; } $this->firstlogtime = microtime(true); $this->logtime = microtime(true); if(defined('SCRIPT_START_TIME')) { $this->firstlogtime = SCRIPT_START_TIME; } $this->cache = null; $this->menuquery = null; $this->BriefpapierHintergrunddisable = false; } /** * @param string $category * @param string $name * @param string $status * @param string $message */ public function setSystemHealth($category, $name, $status, $message = '') { /** @var Systemhealth $obj */ $obj = $this->LoadModul('systemhealth'); if(empty($obj)) { return; } $obj->changeStatus($category, $name, $status, $message); } public function loadCronjobObj() { $dbName = $this->app->Conf->WFdbname; /** @var Prozessstarter cronjobObj */ if(empty($this->cronjobObj) || empty($this->cronjobObjDb) || $this->cronjobObjDb !== $dbName) { $this->cronjobObj = $this->app->loadModule('prozessstarter', true); $this->cronjobObjDb = $this->app->Conf->WFdbname; } } /** * @param string $status * @param null|int $prozessstarter */ public function ProzessstarterStatus($status, $prozessstarter = null) { $this->loadCronjobObj(); if(empty($this->cronjobObj)) { return; } if(method_exists($this->cronjobObj,'setCronjobStatus')) { $this->cronjobObj->setCronjobStatus($status, $prozessstarter); } } /** * @param array $output * @param array $task */ public function checkCronjobMemory($output, $task) { $this->loadCronjobObj(); if(method_exists($this->cronjobObj,'checkCronjobMemory')) { $this->cronjobObj->checkCronjobMemory($output, $task); } } public function checkIfCronjobRunning($uid, $task) { $this->loadCronjobObj(); if(method_exists($this->cronjobObj,'checkIfCronjobRunning')) { $this->cronjobObj->checkIfCronjobRunning($uid, $task); } } public function checkCronjobRunning($uid, $task) { $this->loadCronjobObj(); if(empty($this->cronjobObj)) { return; } if(method_exists($this->cronjobObj,'checkCronjobRunning')) { return $this->cronjobObj->checkCronjobRunning($uid, $task); } return true; } public function closeAndLogCronjob($uid, $fromStarter2 = false) { $this->loadCronjobObj(); if(method_exists($this->cronjobObj,'closeAndLogCronjob')) { $this->cronjobObj->closeAndLogCronjob($uid, $fromStarter2); } } public function setCronjobRunning($uid, $task = null, $active = true) { $this->loadCronjobObj(); if(empty($this->cronjobObj)) { return; } if(method_exists($this->cronjobObj,'setCronjobRunning')) { $this->cronjobObj->setCronjobRunning($uid, $task, $active); } } // @bruno public function TrackingCSV($datei, $versand, $append = false, $uebertragung = 0) { if((int)$versand <= 0 || $datei == ''){ return false; } $arr = $this->app->DB->SelectRow("SELECT ".($uebertragung?" am.id_ext as auftragextid, ":"")." v.tracking, l.belegnr, if(ifnull(l.sprache,'') = '',ifnull(a.sprache,''),l.sprache) as tracking_sprache, l.name, v.versandart FROM versand v INNER JOIN lieferschein l ON v.lieferschein = l.id AND v.id = '$versand' LEFT JOIN auftrag a ON l.auftragid = a.id ".($uebertragung?" LEFT JOIN api_mapping am ON am.tabelle = 'auftrag' AND am.uebertragung_account = '$uebertragung' AND id_int = a.id ":"")." LIMIT 1"); if($arr) { $file_ex = @is_file($datei); $handle = @fopen($datei, $append?'a':'w'); if($handle) { if(!$append || !$file_ex) { $output = ""; foreach($arr as $k => $v)$output .= $k.';'; $output .= "\r\n"; fputs($handle, $output); } $output = ""; foreach($arr as $k2 => $v2) { $output .= '"'.$v2.'"'.';'; } $output .= "\r\n"; fputs($handle, $output); fclose($handle); return true; } } return false; } /** * @bruno Prüfen ob es weg kann * * @deprecated * * @param $beleg * * @return void */ public function checkPDFClass($beleg) { if(empty($beleg)) { return; } $classcustom = ucfirst($beleg).'PDFCustom'; $class = ucfirst($beleg).'PDF'; if(class_exists($classcustom) || class_exists($class) || !file_exists(__DIR__.'/dokumente/class.'.$beleg.'.php')){ return; } if(!defined('FPDF_FONTPATH')){ define('FPDF_FONTPATH',__DIR__.'/pdf/font/'); } if(!class_exists('FPDFWAWISION')) { if(file_exists(dirname(dirname(__DIR__)).'/conf/user_defined.php')){ include_once dirname(dirname(__DIR__)).'/conf/user_defined.php'; } if(defined('USEFPDF3') && USEFPDF3 && file_exists(__DIR__ .'/pdf/fpdf_3.php')) { require_once __DIR__ .'/pdf/fpdf_3.php'; } else if(defined('USEFPDF2') && USEFPDF2 && file_exists(__DIR__ .'/pdf/fpdf_2.php')) { require_once __DIR__ .'/pdf/fpdf_2.php'; } else { require_once __DIR__ .'/pdf/fpdf.php'; } } if(!class_exists('PDF_EPS')){ include_once __DIR__.'/pdf/fpdf_final.php'; } if(!class_exists('SuperFPDF')){ require_once __DIR__.'/dokumente/class.superfpdf.php'; } if(!class_exists('Briefpapier')) { if(file_exists(__DIR__.'/dokumente/class.briefpapier_custom.php')) { require_once __DIR__.'/dokumente/class.briefpapier_custom.php'; }else{ require_once __DIR__.'/dokumente/class.briefpapier.php'; } } if(file_exists(__DIR__.'/dokumente/class.'.$beleg.'_custom.php')) { include_once __DIR__.'/dokumente/class.'.$beleg.'_custom.php'; }elseif(file_exists(__DIR__.'/dokumente/class.'.$beleg.'.php')) { include_once __DIR__.'/dokumente/class.'.$beleg.'.php'; } if(!class_exists('image')){ require __DIR__ . '/class.image.php'; } } function ArtikelUebertragen($datei, $artikelarr, $uebertragung = 0) { /** @var Uebertragungen $obj */ $obj = $this->app->erp->LoadModul('uebertragungen'); if(!empty($obj) && method_exists($obj, 'ArtikelUebertragen')) { return $obj->ArtikelUebertragen($datei, $artikelarr, $uebertragung); } return false; } /** @deprecated */ function LagerzahlenCSV($datei, $artikel, $lager = 0, $lager_platz = 0, $append = false) { if((int)$artikel <= 0 || $datei == '')return false; if($lager || $lager_platz) { $artikelarr = $this->app->DB->SelectRow("SELECT art.nummer, art.herstellernummer, art.ean, ifnull(lag.menge,0) as lager_menge_total, lag.lager_platz FROM artikel art LEFT JOIN ( SELECT lpi.artikel,lp.kurzbezeichnung as lager_platz, trim(ifnull(sum(lpi.menge),0))+0 as menge FROM lager_platz_inhalt lpi INNER JOIN lager_platz lp ON lpi.lager_platz = lp.id AND lp.geloescht = 0 ".($lager_platz?" AND lp.id = '$lager_platz' ":"")." ".($lager?" AND lp.lager = '$lager' ":"")." WHERE lpi.artikel = '$artikel' GROUP BY lp.id ) lag ON art.id = lag.artikel WHERE art.id = '$artikel' LIMIT 1"); }else{ $artikelarr = $this->app->DB->SelectRow("SELECT art.nummer, art.herstellernummer, art.ean FROM artikel art WHERE art.id = '$artikel' LIMIT 1"); if($artikelarr)$artikelarr['lager_menge_total'] = floor($this->ArtikelAnzahlVerkaufbar($artikel)); } if($artikelarr){ $file_ex = @is_file($datei); $handle = @fopen($datei, $append?'a':'w'); if($handle) { if(!$append || !$file_ex) { $output = ""; foreach($artikelarr as $k => $v)$output .= $k.';'; $output .= "\r\n"; fputs($handle, $output); } $output = ""; foreach($artikelarr as $k2 => $v2) { $output .= '"'.$v2.'"'.';'; } $output .= "\r\n"; fputs($handle, $output); fclose($handle); return true; } } return false; } // @todo function Belegeexport($datei, $doctype, $doctypeid, $append = false, $optionen = null) { if($doctype == '' || (int)$doctypeid <= 0 || $datei == '') { return false; } $arr = [ 'adresse','artikel','art','status','beleg_status','beleg_datum','beleg_lieferdatum','beleg_tatsaechlicheslieferdatum','beleg_versandart','beleg_zahlungsweise','beleg_belegnr','beleg_hauptbelegnr','beleg_kundennummer','beleg_name','beleg_abteilung', 'beleg_unterabteilung','beleg_adresszusatz','beleg_ansprechpartner','beleg_telefon','beleg_email','beleg_land','beleg_strasse','beleg_plz','beleg_ort','beleg_projekt','beleg_aktion', 'beleg_internebemerkung','beleg_internebezeichnung','beleg_freitext','beleg_ihrebestellnummer','beleg_lieferbedingung','beleg_art','artikel_nummer','artikel_bezeichnung','artikel_beschreibung', 'artikel_menge','artikel_preis','artikel_rabatt','artikel_waehrung','artikel_lieferdatum','artikel_sort','artikel_umsatzsteuer','artikel_einheit','artikel_zolltarifnummer', 'artikel_herkunftsland','artikel_artikelnummerkunde', 'artikel_freifeld1','artikel_freifeld2','artikel_freifeld3','artikel_freifeld4','artikel_freifeld5','artikel_freifeld6','artikel_freifeld7','artikel_freifeld8','artikel_freifeld9','artikel_freifeld10', 'artikel_freifeld11','artikel_freifeld12','artikel_freifeld13','artikel_freifeld14','artikel_freifeld15','artikel_freifeld16','artikel_freifeld17','artikel_freifeld18','artikel_freifeld19','artikel_freifeld20','artikel_freifeld21','artikel_freifeld22','artikel_freifeld23','artikel_freifeld24','artikel_freifeld25','artikel_freifeld26','artikel_freifeld27','artikel_freifeld28','artikel_freifeld29','artikel_freifeld30','artikel_freifeld31','artikel_freifeld32','artikel_freifeld33','artikel_freifeld34','artikel_freifeld35','artikel_freifeld36','artikel_freifeld37','artikel_freifeld38','artikel_freifeld39','artikel_freifeld40', 'beleg_unterlistenexplodieren' ]; if($doctype === 'bestellung') { $arr[] = 'beleg_lieferantennummer'; } $colsa[] = 't.adresse'; if($doctype !== 'verbindlichkeit'){ $colsa[] = 'p.artikel'; } $colsa[] = 'pr.abkuerzung as beleg_projekt'; if(isset($optionen['art']) && $optionen['art'] != '') { $colsa[] = "'".$optionen['art']."' as art"; } else{ $colsa[] = "'$doctype' as art"; } $checkfields = $this->app->DB->SelectRow("SELECT * FROM $doctype LIMIT 1"); $checkfieldsposition = $doctype === 'verbindlichkeit' ?null: $this->app->DB->SelectRow("SELECT * FROM ".$doctype."_position LIMIT 1"); foreach($arr as $v) { if(strpos($v,'beleg_') === 0) { $k = substr($v, 6); if($k !== 'projekt' && $k !== 'hauptbelegnr') { if(($k !== 'tatsaechlicheslieferdatum' && $k !== 'aktion' && $k !== 'art' && $k !== 'ihrebestellnummer') || $doctype === 'auftrag') { if(($doctype !== 'auftrag' && $doctype !== 'lieferschein') || $k !== 'lieferdatum') { if(array_key_exists($k,$checkfields)) { $colsa[] = 't.'.$k.' as '.$v; } } } } } elseif(strpos($v,'artikel_') === 0) { $k = substr($v, 8); if($k !== 'preisfuermenge' || $doctype === 'auftrag') { if(($k !== 'rabatt' || ($doctype !== 'bestellung' && $doctype !== 'lieferschein' && $doctype !== 'retoure' && $doctype!=='produktion')) && (($k !== 'preis' && $k !== 'waehrung' && $k !== 'umsatzsteuer') || ($doctype !== 'lieferschein' && $doctype!=='produktion' && $doctype !== 'retoure'))) { if($doctype === 'bestellung' && $k === 'nummer') { $k = 'bestellnummer'; } if($doctype === 'bestellung' && $k === 'bezeichnung') { $k = 'bezeichnunglieferant'; } if($doctype === 'verbindlichkeit') { $colsa[] = " '' as " . $v; continue; } if(array_key_exists($k,$checkfieldsposition) && $k !== 'projekt') { if($k=='preis') { $colsa[] = $this->app->erp->FormatPreis('p.'.$k).' as '.$v; } else if($k=='menge') { $colsa[] = $this->app->erp->FormatMenge('p.'.$k).' as '.$v; } else { $colsa[] = 'p.' . $k . ' as ' . $v; } } } } } } if($doctype === 'auftrag') { $colsa[] = 't2.belegnr as beleg_hauptbelegnr'; } if($doctype !== 'verbindlichkeit') { $colsa[] = " art.ean as artikel_ean "; } $colsa[] = "'1' as artikel_preisfuermenge "; $cols = implode(',', $colsa); switch($doctype) { case 'verbindlichkeit': $arr = $this->app->DB->SelectArr( sprintf( "SELECT %s FROM `verbindlichkeit` AS `t` LEFT JOIN `projekt` AS `pr` ON t.projekt = pr.id WHERE t.id = %d", $cols, $doctypeid ) ); break; case 'auftrag': $arr = $this->app->DB->SelectArr( sprintf( "SELECT %s FROM `auftrag` AS `t` INNER JOIN `auftrag_position` AS `p` ON t.id = p.auftrag INNER JOIN `artikel` AS `art` ON p.artikel = art.id LEFT JOIN `projekt` AS `pr` ON t.projekt = pr.id LEFT JOIN `auftrag` AS `t2` ON t.teillieferungvon = t2.id WHERE t.id = %d", $cols, $doctypeid ) ); break; default: $arr = $this->app->DB->SelectArr( sprintf( "SELECT %s FROM `%s` AS `t` INNER JOIN `%s` AS `p` ON t.id = p.%s INNER JOIN `artikel` AS `art` ON p.artikel = art.id LEFT JOIN `projekt` AS `pr` ON t.projekt = pr.id WHERE t.id = %d", $cols, $doctype, $doctype.'_position',$doctype, $doctypeid ) ); break; } if($arr) { $file_ex = @is_file($datei); $handle = @fopen($datei, $append?'a':'w'); if($handle) { if(!$append || !$file_ex) { $output = ''; foreach($arr[0] as $k => $v) { $output .= $k.';'; } $output .= "\r\n"; fwrite($handle, $output); } $output = ''; foreach($arr as $k => $v) { foreach($v as $k2 => $v2) { if(($k2 === 'belegnr' || $k2 === 'beleg_belegnr')) { if($k > 0) { if((isset($optionen['new']) && $optionen['new'] ) || $v2 == '' || !(isset($optionen['noparent']) && $optionen['noparent'])){ $v2 = 'PARENT'; } } else { if(isset($optionen['new']) && $optionen['new']) { $v2 = 'NEW'; } } } $v3 = str_replace(array('ü','ö','ä','Ü','Ö','Ä','ß','"'),array('ü','ö','ä','Ü','Ö','Ä','ß','"'.'"'),$v2); if(isset($optionen['nowrap'])) { $v3 = str_replace(array("\r","\n"),'', $v3); } $output .= '"'.$v3.'"'.';'; } $output .= "\r\n"; } fwrite($handle, $output); fclose($handle); return true; } } return false; } // $app->Module()->Warehouse()->Gateway()->isConsumptionWarehouseAvailable() // $app->Warehouse()-> function Verbrauchslagervorhanden() { if(is_null($this->verbrauchslagervorhanden)) { $this->verbrauchslagervorhanden = $this->app->DB->Select("SELECT id FROM lager_platz WHERE verbrauchslager = 1 LIMIT 1")?true:false; } return $this->verbrauchslagervorhanden; } public function ExitWawi($status = 0) { if(method_exists($this->app, 'ExitXentral')) { $this->app->ExitXentral($status); } exit($status); } // @refactor Module OrderPicking public function GetNextKommissionierung($bezeichnung = '') { $this->app->DB->Insert("INSERT INTO kommissionierung (bearbeiter, bezeichnung) values ('".$this->app->DB->real_escape_string($this->app->User->GetName())."','".$bezeichnung."')"); return $this->app->DB->GetInsertID(); } // @refactor in DevTools function LogWithTime($message, $json = false) { if(defined('SCRIPT_START_TIME')) { $akttime = microtime(true); $aktmemory = number_format(memory_get_usage()/1024.0/1024.0,2); $peakmemory = number_format(memory_get_peak_usage()/1024.0/1024.0,2); $runtime = number_format($akttime - $this->logtime,3); $runtimeall = number_format($akttime - $this->firstlogtime,3); $this->LogFile('Time all '.$runtimeall."s last: ".$runtime."s Memakt:".$aktmemory."MB peak:".$peakmemory."MB ".$this->app->DB->real_escape_string( $json?json_encode($message):$message)); $this->logtime = $akttime; } } /** * @deprecated Secure-Klasse verwenden * * @param $data * * @return mixed|null|string|string[] */ function xss_clean($data) { // Fix &entity\n; $data = str_replace(array('&','<','>'), array('&amp;','&lt;','&gt;'), $data); $data = preg_replace('/(&#*\w+)[\x00-\x20]+;/u', '$1;', $data); $data = preg_replace('/(&#x*[0-9A-F]+);*/iu', '$1;', $data); $data = html_entity_decode($data, ENT_COMPAT, 'UTF-8'); // Remove any attribute starting with "on" or xmlns $data = preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu', '$1>', $data); // Remove javascript: and vbscript: protocols $data = preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2nojavascript...', $data); $data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $data); $data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $data); // Only works in IE: $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i', '$1>', $data); $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i', '$1>', $data); $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data); // Remove namespaced elements (we do not need them) $data = preg_replace('#]*+>#i', '', $data); do { // Remove really unwanted tags $old_data = $data; $data = preg_replace('#]*+>#i', '', $data); } while ($old_data !== $data); return $data; } // @refactor in Benutzer Modul /** * @return array */ public function getEncModullist() { if(file_exists(__DIR__.'/modulliste.php')) { $erg = []; include __DIR__.'/modulliste.php'; return $erg; } return []; } /** * @deprecated * * @return bool */ function checkLicense() { return true; } // @refactor LicenceManager Komponente final public function isIoncube() { if(empty(erpAPI::$license)) { erpAPI::Ioncube_Property(''); } return !empty(erpAPI::$license); } // @refactor LicenceManager Komponente static function Ioncube_Property($key = '') { if(!class_exists('License')) { if(is_file(dirname(dirname(__DIR__)).'/phpwf/plugins/class.license.php')) { include(dirname(dirname(__DIR__)).'/phpwf/plugins/class.license.php'); } } if(class_exists('License')) { if(!erpAPI::$license) { erpAPI::$license = new License(); } } if(erpAPI::$license) { return erpAPI::$license->getProperty($key); } if(function_exists('ioncube_license_properties')) { if(!self::$ioncubeproperties) { self::$ioncubeproperties = ioncube_license_properties(); } $data = self::$ioncubeproperties; if($data && is_array($data) && isset($data[$key]) && is_array($data[$key]) && isset($data[$key]['value'])) { $value = $data[$key]['value']; return $value; } } return false; } // @refactor LicenceManager Komponente static function Ioncube_getMaxUser() { return erpAPI::Ioncube_Property('maxuser'); } // @refactor LicenceManager Komponente static function Ioncube_getMaxLightusers() { return erpAPI::Ioncube_Property('maxlightuser'); } // @refactor LicenceManager Komponente static function Ioncube_getMaxLightusersRights() { $rechte = (int)erpAPI::Ioncube_Property('maxlightuserrights'); if($rechte < 5) { $rechte = 30; } return $rechte; } // @refactor LicenceManager Komponente static function Ioncube_BenutzervorlageAnzahlLightuser(&$app, $vorlage) { if(!isset($app->DB)) { return; } return $app->DB->Select("SELECT count(id) FROM `user` WHERE activ = 1 AND type = 'lightuser' AND vorlage = '$vorlage'"); } // @refactor LicenceManager Komponente static function Ioncube_LightuserRechteanzahl($app, $id, $type = 'user') { if(!isset($app->DB)) { return false; } if($type === 'vorlage') { $id = $app->DB->Select("SELECT id FROM `uservorlage` WHERE bezeichnung <> '' AND bezeichnung = '".$app->DB->real_escape_string($id)."' LIMIT 1"); } $id = (int)$id; if($id <= 0) { return false; } if($type === 'vorlage') { if(!$app->DB->Select("SELECT id FROM `uservorlage` WHERE id = '$id' LIMIT 1")) { return false; } return $app->DB->Select("SELECT count(DISTINCT module, action) FROM `uservorlagerights` WHERE vorlage = '$id' AND permission = 1"); } if(!$app->DB->Select("SELECT id FROM `user` WHERE id = '$id' LIMIT 1")) { return false; } return $app->DB->Select("SELECT count(DISTINCT module, action) FROM `userrights` WHERE `user` = '$id' AND permission = 1"); } // @refactor LicenceManager Komponente static function Ioncube_HasExpired() { return erpAPI::Ioncube_Property('expdate') && (int)erpAPI::Ioncube_Property('expdate') < time(); } // @refactor LicenceManager Komponente static function Ioncube_ExpireInDays() { if(function_exists('ioncube_file_info')) { if(erpAPI::Ioncube_Property('expdate')) { return round(((int)erpAPI::Ioncube_Property('expdate')-time())/86400); } } return false; } // @refactor LicenceManager Komponente static function Ioncube_BeforeExpire() { if(false === erpAPI::Ioncube_ExpireInDays()) { return false; } return erpAPI::Ioncube_ExpireInDays() < 42; } // @refactor LicenceManager Komponente static function Ioncube_ExpireDate($format = 'd.m.Y') { if(function_exists('ioncube_file_info')) { $dat = erpAPI::Ioncube_Property('expdate'); if(!$dat) { return false; } return date($format,(int)$dat); } return false; } // @refactor LicenceManager Komponente final function GetIoncubeServerList() { $ret = null; $i = 1; while($check = $this->IoncubeProperty('servername'.$i)) { $ret[] = $check; $i++; } return $ret; } // @refactor LicenceManager Komponente /** * @return bool */ final function ServerOK() { $servername = (isset($_SERVER['SERVER_NAME']) && $_SERVER['SERVER_NAME'] != '')?$_SERVER['SERVER_NAME']:(isset($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:''); $serverlist = $this->GetIoncubeServerList(); if(!$serverlist) { return true; } foreach($serverlist as $check) { if($servername == $check) { return true; } } return false; } // @refactor LicenceManager Komponente final function IoncubeProperty($key) { if(!class_exists('License')) { if(is_file(dirname(dirname(__DIR__)).'/phpwf/plugins/class.license.php')) { include(dirname(dirname(__DIR__)).'/phpwf/plugins/class.license.php'); } } if(class_exists('License')) { if(!erpAPI::$license)erpAPI::$license = new License(); } if(erpAPI::$license)return erpAPI::$license->getProperty($key); if(method_exists('erpAPI','Ioncube_Property'))return erpAPI::Ioncube_Property($key); if(function_exists('ioncube_license_properties')) { $data = ioncube_license_properties(); if($data && isset($data[$key]) && isset($data[$key]['value']))return $data[$key]['value']; } return false; } // @refactor LicenceManager Komponente final function IoncubegetMaxUser() { return $this->IoncubeProperty('maxuser'); } // @refactor LicenceManager Komponente final function IoncubeHasExpired() { if($this->IoncubeProperty('expdate')) { if((int)$this->IoncubeProperty('expdate') < time())return true; } return false; if(function_exists('ioncube_license_has_expired'))return ioncube_license_has_expired(); return false; } // @refactor LicenceManager Komponente final function IoncubeServerOK() { if(function_exists('ioncube_license_matches_server'))return ioncube_license_matches_server(); return true; } // @refactor LicenceManager Komponente final function IoncubeExpireInDays() { if(function_exists('ioncube_file_info')) { if($this->IoncubeProperty('expdate'))return round(((int)$this->IoncubeProperty('expdate')-time())/86400); } return false; } // @refactor LicenceManager Komponente final function IoncubeBeforeExpire() { if(false === $this->IoncubeExpireInDays())return false; return $this->IoncubeExpireInDays() < 42; } // @refactor LicenceManager Komponente final function IoncubeExpireDate($format = 'd.m.Y') { if(function_exists('ioncube_file_info')) { $dat = $this->IoncubeProperty('expdate'); if(!$dat) { return false; } return date($format,(int)$dat); } return false; } /** * @return array|null */ public function getAppList() { if(!isset($this->appList[$this->app->Conf->WFdbname])) { $this->appList[$this->app->Conf->WFdbname] = $this->app->getAppList(); } return $this->appList[$this->app->Conf->WFdbname]; } // @refactor LicenceManager Komponente function ModuleBenutzeranzahlLizenzFehler($add = '', $typ = 'module', $vorlage = 0) { if(!method_exists($this->app->erp, 'IoncubeProperty')) { return null; } if($typ === 'module') { if(strpos($add, 'shopimporter_') === 0) { return null; } if($add === 'welcome' || $add === 'api' || $add === 'ajax') { return null; } $anz = (int)$this->IoncubeProperty('moduleanzX'.str_replace('_','X',$add)); if($anz > 1) { $anzadmin = (int)$this->app->DB->Select("SELECT count(id) FROM `user` WHERE activ = 1 AND type = 'admin'"); $rechte = (int)$this->app->DB->Select("SELECT count(u.i) FROM `user` u INNER JOIN (SELECT DISTINCT `user` FROM `userrights` WHERE module = '$add' AND permission = 1) ur ON u.id = ur.`user` WHERE activ = 1 AND type <> 'admin' "); if($anzadmin + $rechte + 1 > $anz) { return array('Error'=> 'Es '.($anz > 1?'sind':'ist').' nur '.$anz.' User für das Modul '.ucfirst($add).' lizenziert, es werden aber '.($anzadmin + $rechte + 1).' benötigt'); } } return null; } if($typ === 'vorlage' && $vorlage) { if(strpos($add, 'shopimporter_') === 0) { return null; } if($add === 'welcome' || $add === 'api' || $add === 'ajax') { return null; } $anz = (int)$this->IoncubeProperty('moduleanzX'.str_replace('_','X',$add)); if($anz > 1) { $anzadmin = (int)$this->app->DB->Select("SELECT count(id) FROM `user` WHERE activ = 1 AND type = 'admin'"); $bezeichnung = $this->app->DB->Select("SELECT bezeichnung FROM uservorlage WHERE id = '$vorlage' LIMIT 1"); if($bezeichnung == '') { return null; } $rechte = (int)$this->app->DB->Select("SELECT count(u.i) FROM `user` u INNER JOIN (SELECT DISTINCT `user` FROM `userrights` WHERE module = '$add' AND permission = 1) ur ON u.id = ur.`user` WHERE activ = 1 AND type <> 'admin' AND vorlage != '".$this->app->DB->real_escape_string($bezeichnung)."' "); $neueuser = (int)$this->app->DB->Select("SELECT count(u.id) FROM `user` u WHERE activ = 1 AND type <> 'admin' AND vorlage = '".$this->app->DB->real_escape_string($bezeichnung)."' "); if($anzadmin + $rechte + $neueuser > $anz) { return array('Error'=> 'Es '.($anz > 1?'sind':'ist').' nur '.$anz.' User für das Modul '.ucfirst($add).' lizenziert, es werden aber '.($anzadmin + $rechte + $neueuser).' benötigt'); } } } return null; } // @refactor LicenceManager Komponente function OnlineshopsLizenzFehler($add = '') { if(!method_exists($this->app->erp, 'IoncubeProperty')) { return false; } $shops = $this->app->DB->SelectArr("SELECT shoptyp,modulename FROM shopexport WHERE aktiv = 1 AND (shoptyp = 'intern' OR shoptyp = 'custom') AND modulename <> '' ORDER BY modulename"); if(!$shops) { return false; } $counts = null; foreach($shops as $shop) { if($shop['shoptyp'] === 'intern') { $modulename = $shop['modulename']; }else{ if(preg_match_all('/(.*)\_(\d+).php/i',$shop['modulename'],$erg)) { $modulename = $erg[1][0]; }else $modulename = ''; } if($modulename != '') { if(!isset($counts[$modulename]))$counts[$modulename] = 0; $counts[$modulename]++; } } if($add != '') { if(substr($add,-4) === '.php') { if(preg_match_all('/(.*)\_(\d+).php/i',$add,$erg)) { $add = $erg[1][0]; }else { $add = ''; } } } if($add != '') { if(!isset($counts[$add])) { $counts[$add] = 0; } $counts[$add]++; } if($counts) { foreach($counts as $k => $v) { if($v <= 1) { continue; } $anz = (int)$this->IoncubeProperty('moduleanzX'.str_replace('_','X',$k)); if($anz > 0 && $anz < $v) { return array('Error'=> 'Es '.($anz > 1?'sind':'ist').' nur '.$anz.' Importer des Typs '.ucfirst(str_replace('shopimporter_','',$k)).' lizenziert'); } } } return false; } function getApps() { /** @var Appstore $obj */ $obj = $this->LoadModul('appstore'); if(!empty($obj) && method_exists($obj,'getAppsList')) { return $obj->getAppsList(); } return null; } function StartseiteMenu() { /** @var Welcome $obj */ $obj = $this->LoadModul('welcome'); if(!empty($obj) && method_exists($obj,'StartseiteMenu')) { $obj->StartseiteMenu(); } } function EventAPIAdd($eventname,$parameter,$module,$action,$kommentar="", $api = 0) { /** @var Api $obj */ $obj = $this->LoadModul('api'); if(!empty($obj) && method_exists($obj,'EventAPIAdd')) { return $obj->EventAPIAdd($eventname,$parameter,$module,$action,$kommentar, $api); } } function EventCall($id) { /** @var Api $obj */ $obj = $this->LoadModul('api'); if(!empty($obj) && method_exists($obj,'EventCall')) { return $obj->EventCall($id); } } function EventSendRequest($methodname,$xml,$hash,$parameter="",&$result_body="", $api = 0) { /** @var Api $obj */ $obj = $this->LoadModul('api'); if(!empty($obj) && method_exists($obj,'EventSendRequest')) { return $obj->EventSendRequest($methodname,$xml,$hash,$parameter,$result_body, $api); } } // @refactor Hook Komponente function RemoveNavigationHook($module, $action = null) { if(empty($module)) { return; } if($action) { $this->app->DB->Delete("DELETE FROM `hook_navigation` WHERE `module` = '".$this->app->DB->real_escape_string($module)."' AND `action` = '".$this->app->DB->real_escape_string($action)."'"); }else{ $this->app->DB->Delete("DELETE FROM `hook_navigation` WHERE `module` = '".$this->app->DB->real_escape_string($module)."'"); } } /** * @param string $table * @param string $uniqeCol */ public function repairNullIds($table, $uniqeCol = 'name') { $doppelteids = $this->app->DB->SelectArr( sprintf( 'SELECT `id`, count(*) as `co` FROM `%s` GROUP BY `id` HAVING COUNT(*) > 1', $table ) ); if(empty($doppelteids)) { $this->CheckAlterTable(sprintf("ALTER TABLE `%s` ADD PRIMARY KEY(`id`);", $table)); $maxid = 1+(int)$this->app->DB->Select(sprintf("SELECT max(id) FROM `%s`", $table)); $this->CheckAlterTable( sprintf( "ALTER TABLE `%s` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=%d", $table, $maxid ) ); return; } foreach($doppelteids as $val) { $maxid = 1+(int)$this->app->DB->Select( sprintf("SELECT max(id) FROM `%s`", $table) ); if(empty($uniqeCol)) { for($i = 1; $i <= $val['co']; $i++) { $this->app->DB->Update( sprintf( 'UPDATE `%s` SET `id` = %d WHERE `id` = %d LIMIT 1', $table, $maxid, $val['id'] ) ); } continue; } $doppelte = $this->app->DB->SelectArr( sprintf('SELECT * FROM `%s` WHERE id = %d', $table, $val['id']) ); foreach($doppelte as $row) { $this->app->DB->Update( sprintf( "UPDATE `%s` SET id = %d WHERE id = %d AND `%s` = '%s' LIMIT 1", $table, $maxid, $val['id'], $uniqeCol, $val[$uniqeCol] ) ); $maxid++; } } $this->CheckAlterTable(sprintf("ALTER TABLE `%s` ADD PRIMARY KEY(`id`);", $table)); $maxid = 1+(int)$this->app->DB->Select(sprintf("SELECT max(id) FROM `%s`", $table)); $this->CheckAlterTable( sprintf( "ALTER TABLE `%s` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=%d", $table, $maxid ) ); } // @refactor Hook Komponente function RegisterNavigationHook($module, $action, $first, $sec, $aftersec = '', $position = 0) { if(empty($module) || empty($action) || (String)$first === '') { return; } $check = $this->app->DB->SelectRow( "SELECT hn.id FROM `hook_navigation` AS `hn` WHERE hn.module = '".$this->app->DB->real_escape_string($module)."' AND hn.action = '".$this->app->DB->real_escape_string($action)."' ORDER by hn.aktiv DESC LIMIT 1" ); if(!empty($check) && $check['id'] == 0) { $this->repairNullIds('hook_navigation'); $check = $this->app->DB->SelectRow( "SELECT hn.id FROM `hook_navigation` AS `hn` WHERE hn.module = '".$this->app->DB->real_escape_string($module)."' AND hn.action = '".$this->app->DB->real_escape_string($action)."' ORDER by hn.aktiv DESC LIMIT 1" ); } if($check) { $this->app->DB->Update("UPDATE `hook_navigation` SET `aktiv` = 1, `first` = '".$this->app->DB->real_escape_string($first)."', `sec` = '".$this->app->DB->real_escape_string($sec)."', `aftersec` = '".$this->app->DB->real_escape_string($aftersec)."', `position` = '".$this->app->DB->real_escape_string($position)."' WHERE `id` = ".(int)$check['id'].' LIMIT 1'); } else { $this->app->DB->Insert("INSERT INTO `hook_navigation` (`module`, `action`, `first`, `sec`, `aftersec`, `position`, `aktiv`) VALUES ('".$this->app->DB->real_escape_string($module)."','".$this->app->DB->real_escape_string($action)."', '".$this->app->DB->real_escape_string($first)."','".$this->app->DB->real_escape_string($sec)."','".$this->app->DB->real_escape_string($aftersec)."','".$this->app->DB->real_escape_string($position)."','1') "); } } // @refactor Hook Komponente /** * @param array $menu */ public function NavigationHooks(&$menu) { $hook_navigation = $this->app->DB->SelectArr( "SELECT hn.* FROM `hook_navigation` AS `hn` WHERE hn.aktiv = 1 AND hn.first != '' AND hn.module != '' AND hn.action != '' ORDER BY hn.first, hn.aftersec DESC, hn.position, hn.sec" ); if(!$hook_navigation) { return; } if($hook_navigation[0]['id'] === 0) { $this->repairNullIds('hook_navigation'); $hook_navigation = $this->app->DB->SelectArr( "SELECT hn.* FROM `hook_navigation` AS `hn` WHERE hn.aktiv = 1 AND hn.first != '' AND hn.module != '' AND hn.action != '' ORDER BY hn.first, hn.aftersec DESC, hn.position, hn.sec" ); } foreach($menu as $k => $v) { if(isset($v['first'])) { $first[$v['first'][0]] = $k; } } foreach($hook_navigation as $k => $v) { if($k > 0 && $v['id'] > 0 && !empty($hook_navigation[$k-1]) && $hook_navigation[$k-1]['id'] > 0) { if( $v['module'] === $hook_navigation[$k-1]['module'] && $v['action'] === $hook_navigation[$k-1]['action'] && $v['sec'] === $hook_navigation[$k-1]['sec'] && $v['first'] === $hook_navigation[$k-1]['first'] && $v['aftersec'] === $hook_navigation[$k-1]['aftersec'] ) { $this->app->DB->Delete(sprintf('DELETE FROM `hook_navigation` WHERE `id` = %d LIMIT 1', $v['id'])); unset($hook_navigation[$k]); continue; } } if(!$this->RechteVorhanden($v['module'], $v['action'])) { continue; } if($v['sec'] !== '' || !isset($first[$v['first']])) { if($v['sec'] == '') { $menu[] = array('first'=>array($v['first'], $v['module'],$v['action'])); $first[$v['first']] = (!empty($menu)?count($menu):0)-1; } elseif($v['sec'] != '' && !isset($first[$v['first']])){ $menu[] = array('first'=>array($v['first'], '',''),'sec'=>array(array($v['sec'],$v['module'],$v['action']))); $first[$v['first']] = (!empty($menu)?count($menu):0)-1; } else{ if(isset($menu[$first[$v['first']]])) { if($v['aftersec']) { if(empty($menu[$first[$v['first']]]['sec'])) { $ind = 0; $menu[$first[$v['first']]]['sec'][$ind] = array($v['sec'],$v['module'],$v['action']); } else{ $found = false; foreach($menu[$first[$v['first']]]['sec'] as $k2 => $v2) { if($v2[0] == $v['aftersec']) { $c = count($menu[$first[$v['first']]]['sec']); for($k3 = $c; $k3 > $k2; $k3--) { $menu[$first[$v['first']]]['sec'][$k3] = $menu[$first[$v['first']]]['sec'][$k3-1]; } $ind = $k2 + 1; $menu[$first[$v['first']]]['sec'][$ind] = array($v['sec'],$v['module'],$v['action']); $found = true; break; } } if(!$found) { $ind = empty($menu[$first[$v['first']]]['sec'])?0:count($menu[$first[$v['first']]]['sec']); $menu[$first[$v['first']]]['sec'][$ind] = array($v['sec'],$v['module'],$v['action']); } } } else{ $ind = empty($menu[$first[$v['first']]]['sec'])?0:count($menu[$first[$v['first']]]['sec']); $menu[$first[$v['first']]]['sec'][$ind] = array($v['sec'],$v['module'],$v['action']); } } } } } } // @refactor ModuleRenderer Komponente /** * @param string $headline * @param string $headline1 * @param string|array $headline2 */ public function Headlines($headline = '', $headline1 = '', $headline2 = '') { if($headline) { $this->kurzueberschrift = $headline; $this->app->Tpl->Set('KURZUEBERSCHRIFT', $headline); } if($headline1) { $this->kurzueberschrift1 = htmlspecialchars($headline1); $this->app->Tpl->Set('KURZUEBERSCHRIFT1', ' '.$headline1); } if($this->kurzueberschrift && $this->backlink && $this->kurzueberschrift1) { $this->app->Tpl->Set('KURZUEBERSCHRIFT', ''.$this->kurzueberschrift.''); } if($headline2) { if(is_string($headline2)) { $this->kurzueberschrift2 = ' '.(stripos($headline2,'')?$headline2:htmlspecialchars($headline2)).''; $this->app->Tpl->Set('KURZUEBERSCHRIFT2', $this->kurzueberschrift2); } elseif(is_array($headline2)) { $this->kurzueberschrift2 = ' '; $first = true; foreach($headline2 as $k => $v) { if((String)$v !== '') { if(!$first) { $this->kurzueberschrift2 .= ' '; } $first = false; if(!is_numeric($k)) { $this->kurzueberschrift2 .= $k.' '; } $this->kurzueberschrift2 .= ''.htmlspecialchars($v).''; } } $this->app->Tpl->Add('KURZUEBERSCHRIFT2', $this->kurzueberschrift2); } } if(empty($headline) && !empty($this->kurzueberschrift)) { $headline = $this->kurzueberschrift; } if(empty($headline1) && !empty($this->kurzueberschrift1)) { $headline1 = $this->kurzueberschrift1; } $this->RunHook('HeadLines', 3, $headline, $headline1, $headline2); } function generateHash($id = 0) { /** @var Api $obj */ $obj = $this->LoadModul('api'); if(!empty($obj) && method_exists($obj,'generateHashFromApi')) { return $obj->generateHashFromApi($id); } return ''; } function XMLGruppe($id, $cdata = false) { /** @var Api $obj */ $obj = $this->LoadModul('api'); if(!empty($obj) && method_exists($obj,'XMLGruppe')) { return $obj->XMLGruppe($id, $cdata); } return ''; } function XMLAdresseKontakt($id, $cdata = false) { /** @var Api $obj */ $obj = $this->LoadModul('api'); if(!empty($obj) && method_exists($obj,'XMLAdresseKontakt')) { return $obj->XMLAdresseKontakt($id, $cdata); } return ''; } function XMLAdresse($id, $cdata = false) { /** @var Api $obj */ $obj = $this->LoadModul('api'); if(!empty($obj) && method_exists($obj,'XMLAdresse')) { return $obj->XMLAdresse($id, $cdata); } } function XMLAuftrag($id, $doctype = 'auftrag', $cdata = false) { /** @var Api $obj */ $obj = $this->LoadModul('api'); if(!empty($obj) && method_exists($obj,'XMLAuftrag')) { return $obj->XMLAuftrag($id,$doctype, $cdata); } return ''; } function XMLBenutzer($id, $cdata = false) { /** @var Api $obj */ $obj = $this->LoadModul('api'); if(!empty($obj) && method_exists($obj,'XMLBenutzer')) { return $obj->XMLBenutzer($id, $cdata); } } function XMLAdresseAccounts($filter=array(), $cdata = false) { /** @var Api $obj */ $obj = $this->LoadModul('api'); if(!empty($obj) && method_exists($obj,'XMLAdresseAccounts')) { return $obj->XMLAdresseAccounts($filter, $cdata); } } function XMLBerichte($id, $cdata = false){ /** @var Api $obj */ $obj = $this->LoadModul('api'); if(!empty($obj) && method_exists($obj,'XMLBerichte')) { return $obj->XMLBerichte($id, $cdata); } } function XMLArtikelkontingente($filter=array(), $cdata = false) { /** @var Api $obj */ $obj = $this->LoadModul('api'); if(!empty($obj) && method_exists($obj,'XMLArtikelkontingente')) { return $obj->XMLArtikelkontingente($filter, $cdata); } } // @refactor PhysicalDimension Komponente function GetGewichtbezeichnung() { $gewichtbezeichnung = $this->Firmendaten('gewichtbezeichnung'); if((String)$gewichtbezeichnung !== '')return $gewichtbezeichnung; return 'kg'; } // @refactor PhysicalDimension Komponente function GewichtzuKgFaktor() { $faktor = (float)str_replace(',',',',$this->Firmendaten('gewichtzukgfaktor')); if($faktor > 0)return $faktor; return 1; } // @refactor DbHelper Komponente function FormatGewicht($spalte) { return 'concat('.$spalte.",' ".$this->GetGewichtbezeichnung()."')"; } // @refactor DbHelper Komponente function FormatPreis($spalte, $stellen = null, $punkt = false) { if(is_null($stellen))return "if(trim(round( $spalte *100))+0 <> trim($spalte*100)+0, format($spalte, length( trim($spalte)+0)-length(round($spalte))-1 ".($punkt?"":" ,'de_DE'")."),format($spalte,2".($punkt?"":" ,'de_DE'")."))"; return "format($spalte,$stellen".($punkt?"":" ,'de_DE'").")"; } /** * @deprecated * * @param $value * * @return mixed */ function FromFormatZahlToDB($value) { $poskomma = strrpos($value, ','); $pospunkt = strrpos($value, '.'); if($poskomma === false) { return $value; } if($pospunkt === false) { return str_replace(',','.', $value); } if($poskomma > $pospunkt) { return str_replace(['.', ','], ['', '.'], $value); } return str_replace(',','', $value); } // @refactor Formater Komponente function number_format_variable($value, $stellen = null) { if(is_null($stellen)) { $ret = rtrim(number_format($value,8,',','.'),'0'); if(substr($ret,-1) === ',') { $ret .= '0'; } return $ret; } return number_format($value, $stellen,',','.'); } // @refactor DbHelper Komponente function BelegnummerSortierung($prefix = '') { $belegnummersortierungint = $this->Firmendaten('belegnummersortierungint'); if($belegnummersortierungint) { if($prefix == '') { return 'cast(belegnr as UNSIGNED)'; } return 'cast('.$prefix.'.belegnr as UNSIGNED)'; } if($prefix == '') { return 'belegnr'; } return $prefix.'.'.'belegnr'; } // @refactor DbHelper Komponente function FormatMenge($spalte, $decimals = 0) { return ('FORMAT('.$spalte.','.$decimals.',\'de_DE\')'); // 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) { if (empty($alias)) { return($text); } else { return ($text." as `$alias`"); } } // @refactor DbHelper Komponente function FormatDate(string $spalte, string $alias = null) { return $this->add_alias("DATE_FORMAT($spalte,'%d.%m.%Y')", $alias); } // @refactor DbHelper Komponente function FormatDateShort(string $spalte, string $alias = null) { return $this->add_alias("DATE_FORMAT($spalte,'%d.%m.%y')", $alias); } // @refactor DbHelper Komponente function FormatDateTimeShort(string $spalte, string $alias = null) { return $this->add_alias("DATE_FORMAT($spalte,'%d.%m.%y %H:%i')", $alias); } // @refactor DbHelper Komponente function FormatDateTime(string $spalte, string $alias = null) { return $this->add_alias("DATE_FORMAT($spalte,'%d.%m.%Y %H:%i:%s')", $alias); } public function XMLExportVorlage($id,$filter=array(), $cdata = false) { /** @var Api $obj */ $obj = $this->LoadModul('api'); if(!empty($obj) && method_exists($obj,'XMLExportVorlage')) { return $obj->XMLExportVorlage($id, $filter, $cdata); } } /** * Es werden Werte nur hinzugefuegt falls der Wert noch nicht existiert bzw. leer ist * * @refactor in ShopImporter Module * * @param int $shop Shopid * @param int $artikel Artikelid * @param array $arr Array zum Einfuegen / Updaten * @param bool $escape Werte werden fuer DB escaped * * @return bool wenn Daten OK true sonst falsch */ public function AddShopArtikelIfEmpty($shop, $artikel, $arr, $escape = true) { if(empty($artikel) || empty($shop) || empty($arr)){ return false; } $bearbeiter = $this->GetBearbeiter(true); $oldarr = array(); $old = $this->app->DB->SelectArr("SELECT min(id) as id, name,wert FROM shopexport_artikel WHERE shopid = '$shop' AND artikel = '$artikel' GROUP BY name,wert"); if(!empty($old)) { foreach($old as $v) { $oldarr[$v['name']] = array('id'=>$v['id'],'wert'=>$v['wert']); } } foreach($arr as $k => $v) { if($k) { $check = !empty($oldarr[$k])?$oldarr[$k]['id']:0; if(!$check) { $this->app->DB->Insert("INSERT INTO shopexport_artikel (shopid, artikel, name) VALUES ('$shop','$artikel','".$this->app->DB->real_escape_string($k)."')"); $new = $this->app->DB->GetInsertID(); $check = $new; }else{ $new = null; } if(!empty($new) || ($oldarr[$k]['wert'] != $v && empty($oldarr[$k]['wert']))){ if($escape){ $this->app->DB->Update("UPDATE shopexport_artikel SET bearbeiter = '$bearbeiter', wert = '" . $this->app->DB->real_escape_string($v) . "' WHERE id = '$check' LIMIT 1"); }else{ $this->app->DB->Update("UPDATE shopexport_artikel SET bearbeiter = '$bearbeiter', wert = '$v' WHERE id = '$check' LIMIT 1"); } } } } return true; } /** * @deprecated * @refactor in User Klasse * * @param bool $escaped wenn true real_escaped zurueck * * @return string gibt Username oder Cronjob zurueck */ public function GetBearbeiter($escaped = false) { $bearbeiter = 'Cronjob'; if(!empty($this->app->User) && method_exists($this->app->User,'GetName')) { $bearbeiter = $this->app->User->GetName(); if($escaped) { $bearbeiter = $this->app->DB->real_escape_string($bearbeiter); } } return $bearbeiter; } /** * @refactor in ShopImport Module * * @param int $shop Shopid * @param int $artikel Artikelid * @param array $arr Array das Geaendert / Eingefuegt werden soll * @param bool $escape Escapen fuer DB * * @return bool */ public function SaveShopArtikel($shop, $artikel, $arr, $escape = true) { if(empty($artikel) || empty($shop) || empty($arr)){ return false; } $bearbeiter = $this->GetBearbeiter(true); $oldarr = array(); $old = $this->app->DB->SelectArr( sprintf( "SELECT MIN(id) as id, MAX(id) AS `maxid`, `name`, `wert` FROM `shopexport_artikel` WHERE `shopid` = %d AND `artikel` = %d GROUP BY `name`, `wert`", $shop, $artikel ) ); if(!empty($old)) { foreach($old as $v) { $oldarr[ $this->app->DB->real_escape_string($v['name']) ] = array('id'=>$v['id'],'wert'=>$v['wert'],'maxid' => $v['maxid']); } } foreach($arr as $k => $v) { if(empty($k)) { continue; } $nameForDb = $k; $valueForDb = $v; if($escape){ $nameForDb = $this->app->DB->real_escape_string($k); $valueForDb = $this->app->DB->real_escape_string($v); } $check = !empty($oldarr[$k])?$oldarr[$k]['id']:0; $new = null; if(!$check) { $this->app->DB->Insert( sprintf( "INSERT INTO `shopexport_artikel` (shopid, artikel, `name`,wert) VALUES (%d,%d,'%s','%s')", $shop, $artikel, $nameForDb, $valueForDb ) ); $new = $this->app->DB->GetInsertID(); } if($check && (!empty($new) || $oldarr[$k]['wert'] != $v)) { $this->app->DB->Delete( sprintf( "DELETE FROM `shopexport_artikel` WHERE `artikel` = %d AND `shopid` = %d AND `name` = '%s' AND `id` <> %d", $artikel, $shop, $nameForDb, $check ) ); $this->app->DB->Update( "UPDATE shopexport_artikel SET bearbeiter = '$bearbeiter', wert = '$valueForDb' WHERE id = '$check' LIMIT 1" ); } elseif($check && $oldarr[$k]['id'] != $oldarr[$k]['maxid']) { $this->app->DB->Delete( sprintf( "DELETE FROM `shopexport_artikel` WHERE `artikel` = %d AND `shopid` = %d AND `name` = '%s' AND `id` <> %d", $artikel, $shop, $nameForDb, $check ) ); } } return true; } // @refactor in Placetel Module function GetPhoneLink($adresse=0,$ansprechpartner=0,$telefon="") { $username = $this->app->User->GetUsername(); $accounts = $this->app->erp->GetKonfiguration("placetel_list_accounts"); $tmp = explode(PHP_EOL,trim($accounts)); $sipuid = false; if($this->app->erp->RechteVorhanden('placetel','call')) { $this->app->Tpl->Set('JSPLACETEL',' function call(id, dummy) { $.ajax({ url: \'index.php?module=placetel&action=call&id=\'+id, type: \'POST\', dataType: \'json\', data: {}, success: function(data) { if(data) { } } }); } '); $ctmp = !empty($tmp)?count($tmp):0; for($i=0;$i<$ctmp;$i++) { $subtmp = explode(':',trim($tmp[$i])); if((!empty($subtmp)?count($subtmp):0)>0) { $subtmp[0] = trim($subtmp[0]); $subtmp[1] = !empty($subtmp[1])?trim($subtmp[1]):''; if($subtmp[0]==$username) { $sipuid = $subtmp[1]; break; } } } } if($ansprechpartner <=0) { $typ = $this->app->DB->Select("SELECT if(telefon='$telefon' AND telefon!='','1',if(mobil='$telefon' AND mobil!='','2','')) FROM adresse WHERE id='$adresse' LIMIT 1"); if($typ==1 OR $typ==2){ $typid = $adresse; } } else { $typ = $this->app->DB->Select("SELECT if(telefon='$telefon' AND telefon!='','3',if(mobil='$telefon' AND mobil!='','4','')) FROM ansprechpartner WHERE id='$ansprechpartner' LIMIT 1"); if($typ==3 OR $typ==4){ $typid = $ansprechpartner; } } // 1 = telefon adresse, 2 = mobil adresse, 3 telefon ansprechpartner, 4 mobil ansprechpartner if($telefon!='') { $telefon = str_replace('/','',$telefon); $telefon = str_replace(' ','',$telefon); if($sipuid) { return "app->Conf->WFconf['defaulttheme']."/images/phone.png\" class=\"iconininput\" alt=\"anrufen\" />"; } return "app->Conf->WFconf['defaulttheme']."/images/phone.png\" class=\"iconininput\" alt=\"anrufen\" />"; } } public function GetArtikelunterbaumids($id, &$arr, $lvl = 0) { /** @var Artikelbaum $obj */ $obj = $this->LoadModul('artikelbaum'); if(!empty($obj) && method_exists($obj, 'getArticleSubtreeIds')) { $obj->getArticleSubtreeIds($id, $arr, $lvl); } } // @refactor in Shopimport Module public function GetShopArtikel($shop, $artikel, $name = '') { $ret = null; if((int)$artikel <= 0 || (int)$shop <= 0){ return $ret; } $arr = $this->app->DB->SelectArr('SELECT `name`, `wert` FROM shopexport_artikel WHERE shopid = '.(int)$shop.' AND artikel = '.(int)$artikel." AND name <> ''".(!empty($name)?" AND name = '".$this->app->DB->real_escape_string($name)."' ":'')); if(!empty($arr)) { foreach($arr as $v){ $ret[$v['name']] = $v['wert']; } } if(!empty($name)) { return !empty($ret[$name])?$ret[$name]:''; } return $ret; } public function XMLArtikel($id, $api = 0) { /** @var Api $obj */ $obj = $this->LoadModul('api'); if(!empty($obj) && method_exists($obj,'XMLArtikel')) { return $obj->XMLArtikel($id, $api); } } // @refactor in Uservorlage Modul function AbgleichBenutzerVorlagen($userid=0, $vorlage = 0, $module = '', $action = '') { $bezeichnung = ''; if($vorlage != 0) { $bezeichnung = $this->app->DB->Select("SELECT bezeichnung FROM uservorlage WHERE id = '$vorlage' LIMIT 1"); } if($userid == 0 && $vorlag > 0 && $module != '' && $action != '') { $permission = $this->app->DB->Select("SELECT permission FROM uservorlagerights WHERE vorlage = '".$id_vorlage."' AND module = '$module' AND action = '$action' LIMIT 1"); } // alle vorlagen ind ei Leute kopieren if($userid<=0){ $user = $this->app->DB->SelectArr("SELECT * FROM user" . ($bezeichnung != '' ? " WHERE vorlage like '$bezeichnung' " : '')); } else{ $user = $this->app->DB->SelectArr("SELECT * FROM user WHERE id='$userid'"); } $startzeit = microtime(true); $cuser = !empty($user)?count($user):0; $grantingUserId = $this->app->User->GetID(); $grantingUserName = $this->app->DB->Select("SELECT username FROM user WHERE id=$grantingUserId"); $userPermission = $this->app->Container->get('UserPermissionService'); for($i=0;$i<$cuser;$i++) { $user[$i]['vorlage'] = strtolower($user[$i]['vorlage']); if($vorlage) { $id_vorlage = $vorlage; }else{ $id_vorlage = $this->app->DB->Select("SELECT id FROM uservorlage WHERE bezeichnung LIKE '".$user[$i]['vorlage']."' LIMIT 1"); } if($id_vorlage == $vorlage || $vorlage == 0) { $receivingUserId = $user[$i]['id']; $receivingUserName = $this->app->DB->Select("SELECT username FROM user WHERE id=$receivingUserId"); // neue eintraege if($userid == 0 && $vorlag > 0 && $module != '' && $action != '') { $this->app->DB->Delete("DELETE FROM userrights WHERE user = '".$user[$i]['id']."' AND module='$module' AND action = '$action'"); try { $userPermission->log($grantingUserId,$grantingUserName,$receivingUserId,$receivingUserName,$module,$action,false); }catch (Exception $ex){ $this->app->erp->LogFile('Fehler bei Zuweisung Rechtehistore',$ex->getMessage()); } $this->app->DB->Insert("INSERT INTO userrights (user, module, action, permission) VALUES ('".$user[$i]['id']."','$module','$action','$permission')"); try { $userPermission->log($grantingUserId,$grantingUserName,$receivingUserId,$receivingUserName,$module,$action,true); }catch (Exception $ex){ $this->app->erp->LogFile('Fehler bei Zuweisung Rechtehistore',$ex->getMessage()); } }else{ $permissions = $this->app->DB->SelectArr("SELECT module, action,permission FROM uservorlagerights WHERE vorlage = '".$id_vorlage."' ".($module != ''?" AND module = '$module' ":"").($action != ''?" AND action = '$action'":'')); foreach($permissions as $permission){ try { $userPermission->log($grantingUserId,$grantingUserName,$receivingUserId,$receivingUserName,$permission['module'],$permission['action'],$permission['permission']); }catch (Exception $ex){ $this->app->erp->LogFile('Fehler bei Zuweisung Rechtehistore',$ex->getMessage()); } } $this->app->DB->Update("REPLACE INTO userrights (user, module,action,permission) (SELECT '".$user[$i]['id']."',module, action,permission FROM uservorlagerights WHERE vorlage = '".$id_vorlage."' ".($module != ''?" AND module = '$module' ":"").($action != ''?" AND action = '$action'":'').") "); $neuesquery = $this->app->DB->Query("Select * from userrights where user = ".$user[$i]['id']." ".($module != ''?" AND module = '$module' ":"").($action != ''?" AND action = '$action'":'')." order by module, action, id desc"); if($neuesquery) { $aktmodule = false; $aktaction = false; while($v = $this->app->DB->Fetch_Array($neuesquery)) { if($aktaction != $v['action'] || $aktmodule != $v['module']) { $aktaction = $v['action']; $aktmodule = $v['module']; } else { $this->app->DB->Delete("DELETE FROM userrights where id = ".$v['id']); } } $this->app->DB->free($neuesquery); } } } } } // @refactor in Poll Komponente (oder Welcome Modul) // @refactor replace stringcleaner? also validate options_json function UserEvent($invisible = false) { /** @var \Xentral\Modules\SystemNotification\Service\NotificationInterface $notifyService */ $notifyService= $this->app->Container->get('NotificationService'); /** @var \Xentral\Modules\SystemNotification\Gateway\NotificationGateway $notifyGateway */ $notifyGateway = $this->app->Container->get('NotificationGateway'); $messages = $notifyGateway->findByUserId($this->app->User->GetID(), 0, 5); $result = array(); if((!empty($messages)?count($messages):0) > 0) { $cleaner = new Stringcleaner($this->app); foreach ($messages as $message) { // xss prevention $message['title'] = $cleaner->CleanString($message['title'], 'nojs'); $message['message'] = $cleaner->CleanString($message['message'], 'nojs'); $message['options'] = []; $messageOptions = !empty($message['options_json']) ? json_decode($message['options_json'], true) : null; if (!empty($messageOptions['id'])) { $message['options']['id'] = strip_tags($messageOptions['id']); } if (!empty($messageOptions['buttons'])) { $message['options']['buttons'] = []; foreach ($messageOptions['buttons'] as $messageButton) { $messageButtonAttrs = []; foreach ($messageButton as $buttonAttrName => $buttonAttrValue) { if ($buttonAttrName === 'link') { $messageButtonAttrs[htmlspecialchars($buttonAttrName)] = $cleaner->CleanString($buttonAttrValue, 'nojs'); } else{ $messageButtonAttrs[htmlspecialchars($buttonAttrName)] = htmlspecialchars($buttonAttrValue); } } $message['options']['buttons'][] = $messageButtonAttrs; } } // END xss prevention $result[] = [ 'event' => 'notification', 'type' => $message['type'], 'title' => $message['title'], 'message' => $message['message'], 'options' => !empty($message['options']) ? $message['options'] : null, 'priority' => (int)$message['priority'] === 1, ]; // Delete processed messages $notifyService->delete($message['id']); } } if($this->app->erp->RechteVorhanden('chat','list')) { $userId = $this->app->User->GetID(); $registrierDatum = $this->app->DB->Select("SELECT u.logdatei FROM `user` AS u WHERE u.id='".$userId."'"); $ungelesenOeffentlich = (int)$this->app->DB->Select( "SELECT COUNT(c.id) FROM chat AS c LEFT JOIN chat_gelesen AS g ON c.id = g.message AND (g.user = '".$userId."' OR g.user = 0) WHERE c.user_to='0' AND c.zeitstempel > '".$registrierDatum."' AND g.id IS NULL" ); $ungelesenPrivat = (int)$this->app->DB->Select( "SELECT COUNT(c.id) FROM chat AS c INNER JOIN `user` AS u ON c.user_from = u.id LEFT JOIN chat_gelesen AS g ON c.id = g.message WHERE u.activ = 1 AND c.user_to='".$userId."' AND g.id IS NULL" ); $anzchat = $ungelesenOeffentlich + $ungelesenPrivat; if($anzchat>0) { $result[] = array('event'=>'chatbox','sound'=>0, 'message'=>$anzchat); } } if((!empty($result)?count($result):0)>0){ return $result; } return false; } /** * @deprecated * * @param bool $delete * * @return array|void */ function UserEventNachrichten($delete = false) { $user = (int)$this->app->User->GetID(); if(!$user)return; $adresse = (int)$this->app->DB->Select("SELECT adresse FROM user WHERE id = '".$user."' LIMIT 1"); if($adresse) { $_gruppen = $this->app->DB->SelectArr("SELECT distinct parameter as gruppe FROM adresse_rolle WHERE adresse = '$adresse' AND subjekt = 'Mitglied' AND (bis = '0000-00-00' OR bis >= date(now())) AND parameter > 0"); if($_gruppen) { foreach($_gruppen as $gruppe) { $gruppen[] = " b.gruppe = '".(int)$gruppe['gruppe']."' "; } } } if(!empty($gruppen)) { $subwhere = implode(' OR ',$gruppen); $nachrichten = $this->app->DB->SelectArr("SELECT b.* FROM boxnachrichten b WHERE (b.user = '$user' OR ($subwhere)) AND (ablaufzeit = 0 OR TIME_TO_SEC( TIMEDIFF( now(), zeitstempel ) <= ablaufzeit ) ) ORDER BY ablaufzeit > 0 DESC, prio DESC, zeitstempel"); }else{ $nachrichten = $this->app->DB->SelectArr("SELECT b.* FROM boxnachrichten b WHERE user = '$user' AND (ablaufzeit = 0 OR TIME_TO_SEC( TIMEDIFF( now(), zeitstempel ) <= ablaufzeit ) ) ORDER BY ablaufzeit > 0 DESC, prio DESC, zeitstempel"); } if($nachrichten) { if($delete)$this->app->DB->Delete("DELETE from boxnachrichten WHERE id = '".$nachrichten[0]['id']."' LIMIT 1"); return array('anzahl'=>(!empty($nachrichten)?count($nachrichten):0),'nachricht'=>reset($nachrichten)); } return array('anzahl'=>0); } /** * @deprecated * * @param $user * @param $gruppe * @param $bezeichnung * @param string $nachricht * @param int $prio * @param int $ablaufzeit * @param int $beep * @param string $objekt * @param int $parameter * @param bool $delete * * @return void */ function AddUserGruppenNachricht($user, $gruppe, $bezeichnung, $nachricht = '', $prio = 0,$ablaufzeit = 0, $beep = 0, $objekt = '', $parameter = 0, $delete = false) { $parameter = (int)$parameter; $beep = (int)$beep; $objekt = $this->app->DB->real_escape_string($objekt); if($delete == true) { if(!empty($objekt) && !empty($parameter))$this->app->DB->Delete("DELETE FROM boxnachrichten WHERE objekt like '".$objekt."' AND parameter = '$parameter' "); return; } if($delete && is_numeric($delete)) { $delete = (int)$delete; $this->app->DB->Delete("DELETE FROM boxnachrichten WHERE id = '$delete' LIMIT 1"); return; } $user = (int)$user; $gruppe = (int)$gruppe; $prio = (int)$prio; $ablaufzeit = (int)$ablaufzeit; $bezeichnung = $this->app->DB->real_escape_string($bezeichnung); $nachricht = $this->app->DB->real_escape_string($nachricht); $this->app->DB->Insert("INSERT INTO boxnachrichten (user, gruppe, bezeichnung, nachricht, prio, ablaufzeit, objekt, parameter, beep) VALUES ( '$user','$gruppe','$bezeichnung','$nachricht','$prio','$ablaufzeit','$objekt','$parameter','$beep' )"); return $this->app->DB->GetInsertID(); } // @refactor FileLock Komponente function ProzessLock($name) { $fp = @fopen($this->GetTMP()."lock_". $name . '.lock', 'w+'); if($fp) { if (flock($fp, LOCK_EX)) { ftruncate($fp, 0); fwrite($fp, "Write something here\n"); return $fp; } @fclose($fp); } return false; } // @refactor FileLock Komponente function ProzessUnlock($fp) { if(gettype($fp) != 'resource') return; fflush($fp); // leere Ausgabepuffer bevor die Sperre frei gegeben wird flock($fp, LOCK_UN); // Gib Sperre frei fclose($fp); } // @refactor Formater Komponente function ConvertToBytes($tmp) { $tmp = trim($tmp); $last = strtolower($tmp[strlen($tmp)-1]); switch($last) { case 'g': $tmp *= 1024; case 'm': $tmp *= 1024; case 'k': $tmp *= 1024; } return $tmp; } // @refactor SystemInformation Komponente function MaxUploadFileSize() { //select maximum upload size $max_upload = $this->ConvertToBytes(ini_get('upload_max_filesize')); $max_post = $this->ConvertToBytes(ini_get('post_max_size')); $memory_limit = $this->ConvertToBytes(ini_get('memory_limit')); return min($max_upload, $max_post, $memory_limit); } // @refactor Document Komponente public function GetSpracheBeleg($type, $id) { if(!empty($this->sprachen) && !empty($this->sprachen[$type]) && !empty($this->sprachen[$type][$id])) { return $this->sprachen[$type][$id]; } $docArr = $this->app->DB->SelectRow(sprintf('SELECT sprache, adresse FROM `%s` WHERE id = %d', $type, $id)); $sprache = !empty($docArr)?$docArr['sprache']:$this->app->DB->Select("SELECT sprache FROM $type WHERE id='$id' LIMIT 1"); if($sprache=='') { $adresse = !empty($docArr)?$docArr['adresse']:$this->app->DB->Select("SELECT adresse FROM $type WHERE id='$id' LIMIT 1"); $sprache = $this->app->DB->Select("SELECT sprache FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); } if($sprache=='') { $sprache="de"; } $this->sprachen[$type][$id] = $sprache; return $sprache; } public function GetSpracheBelegISO($type, $id) { $language = $this->GetSpracheBeleg($type, $id); if(strlen($language) > 2) { $language = $this->app->DB->Select("SELECT iso FROM sprachen WHERE alias='$language' ORDER by aktiv=1 LIMIT 1"); } return $language; } // @refactor Document Komponente function BelegVersand($typ,$id,$versandart,$drucker="") { if($typ!="rechnung" && $typ!="angebot" && $typ!="auftrag" && $typ!="gutschrift" && $typ!="lieferschein" && $typ!="reisekosten") return; if($versandart!="email" && $versandart!="brief") return; $projekt = $this->app->DB->Select("SELECT projekt FROM $typ WHERE id='$id' LIMIT 1"); $name = $this->app->DB->Select("SELECT name FROM $typ WHERE id='$id' LIMIT 1"); $email = $this->app->DB->Select("SELECT email FROM $typ WHERE id='$id' LIMIT 1"); $adresse = $this->app->DB->Select("SELECT adresse FROM $typ WHERE id='$id' LIMIT 1"); // pruefe ob immer per per Papier oder immer per mail $rechnung_papier = $this->app->DB->Select("SELECT rechnung_papier FROM adresse WHERE id='$adresse' LIMIT 1"); $rechnung_permail = $this->app->DB->Select("SELECT rechnung_permail FROM adresse WHERE id='$adresse' LIMIT 1"); $rechnung_anzahlpapier = $this->app->DB->Select("SELECT rechnung_anzahlpapier FROM adresse WHERE id='$adresse' LIMIT 1"); if($rechnung_papier=="1" && $typ=="rechnung") $versandart="brief"; if($rechnung_permail=="1" && $typ=="rechnung") $versandart="email"; $sprache = $this->app->DB->Select("SELECT sprache FROM $typ WHERE id='$id' LIMIT 1"); if($sprache=="") $sprache = $this->app->DB->Select("SELECT sprache FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); if($sprache=='') { $sprache='deutsch'; } $emailtext = $this->Geschaeftsbriefvorlage($sprache,$typ,$projekt,$name,$id); $idvorlage = $this->GetGeschaeftsBriefID($typ,$sprache,$projekt); $footer = $this->Grussformel($projekt,$sprache); if($footer!="") $emailtext['text'] = $emailtext['text']."\r\n".$footer; $this->BriefpapierHintergrundDisable($drucker); switch($typ) { case "rechnung": $this->app->erp->BriefpapierHintergrunddisable = $versandart === 'email'?true:!$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('RechnungPDFCustom')) { $Brief = new RechnungPDFCustom($this->app,$projekt); }else{ $Brief = new RechnungPDF($this->app,$projekt); } $Brief->GetRechnung($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); unlink($tmpfile); $this->app->erp->BriefpapierHintergrunddisable = $versandart === 'email'?false:!$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('RechnungPDFCustom')) { $Brief = new RechnungPDFCustom($this->app,$projekt); }else{ $Brief = new RechnungPDF($this->app,$projekt); } $Brief->GetRechnung($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); break; case "angebot": $this->app->erp->BriefpapierHintergrunddisable = $versandart === 'email'?true:!$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('AngebotPDFCustom')) { $Brief = new AngebotPDFCustom($this->app,$projekt); }else{ $Brief = new AngebotPDF($this->app,$projekt); } $Brief->GetAngebot($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); unlink($tmpfile); $this->app->erp->BriefpapierHintergrunddisable = $versandart === 'email'?false:!$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('AngebotPDFCustom')) { $Brief = new AngebotPDFCustom($this->app,$projekt); }else{ $Brief = new AngebotPDF($this->app,$projekt); } $Brief->GetAngebot($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); break; case "auftrag": $this->app->erp->BriefpapierHintergrunddisable = $versandart === 'email'?true:!$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('AuftragPDFCustom')) { $Brief = new AuftragPDFCustom($this->app,$projekt); }else{ $Brief = new AuftragPDF($this->app,$projekt); } $Brief->GetAuftrag($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); unlink($tmpfile); $this->app->erp->BriefpapierHintergrunddisable = $versandart === 'email'?false:!$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('AuftragPDFCustom')) { $Brief = new AuftragPDFCustom($this->app,$projekt); }else{ $Brief = new AuftragPDF($this->app,$projekt); } $Brief->GetAuftrag($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); break; case "bestellung": $this->app->erp->BriefpapierHintergrunddisable = $versandart === 'email'?true:!$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('BestellungPDFCustom')) { $Brief = new BestellungPDFCustom($this->app,$projekt); }else{ $Brief = new BestellungPDF($this->app,$projekt); } $Brief->GetBestellung($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); unlink($tmpfile); $this->app->erp->BriefpapierHintergrunddisable = $versandart === 'email'?false:!$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('BestellungPDFCustom')) { $Brief = new BestellungPDFCustom($this->app,$projekt); }else{ $Brief = new BestellungPDF($this->app,$projekt); } $Brief->GetBestellung($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); break; case "preisanfrage": $this->app->erp->BriefpapierHintergrunddisable = $versandart === 'email'?true:!$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('PreisanfragePDFCustom')) { $Brief = new PreisanfragePDFCustom($this->app,$projekt); }else{ $Brief = new PreisanfragePDF($this->app,$projekt); } $Brief->GetPreisanfrage($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); unlink($tmpfile); $this->app->erp->BriefpapierHintergrunddisable = $versandart === 'email'?false:!$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('PreisanfragePDFCustom')) { $Brief = new PreisanfragePDFCustom($this->app,$projekt); }else{ $Brief = new PreisanfragePDF($this->app,$projekt); } $Brief->GetPreisanfrage($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); break; case "produktion": $this->app->erp->BriefpapierHintergrunddisable = $versandart === 'email'?true:!$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('ProduktionPDFCustom')) { $Brief = new ProduktionPDFCustom($this->app,$projekt); }else{ $Brief = new ProduktionPDF($this->app,$projekt); } $Brief->GetProduktion($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); unlink($tmpfile); $this->app->erp->BriefpapierHintergrunddisable = $versandart === 'email'?false:!$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('ProduktionPDFCustom')) { $Brief = new ProduktionPDFCustom($this->app,$projekt); }else{ $Brief = new ProduktionPDF($this->app,$projekt); } $Brief->GetProduktion($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); break; } if($rechnung_anzahlpapier > 1 && $typ==='rechnung' && $versandart==='brief') { for($ra_i=0;$ra_i<$rechnung_anzahlpapier;$ra_i++) { $sendtmp[]=$tmpfile; } } else { $sendtmp = array($tmpfile); } //$this->LogFile("BelegeVersand T $typ I $id V $versandart Email $email Name $name betreff ".$emailtext['betreff']); if($drucker<0) $drucker = $this->app->DB->Select("SELECT standarddrucker FROM user WHERE id='".$this->app->User->GetID()."' LIMIT 1"); else $drucker = $this->app->DB->Select("SELECT id FROM drucker WHERE id='".$drucker."' LIMIT 1"); if($drucker <=0) $drucker = $this->Firmendaten('standardversanddrucker'); if($versandart==='email') { if(!$this->isHTML($emailtext['text'])){ $emailtext['text'] = nl2br($emailtext['text']);//str_replace("\r\n", "
", $emailtext['text']); } if( in_array( $typ, ['auftrag', 'rechnung','gutschrift','angebot','bestellung','retoure','proformarechnung','lieferschein'] ) ) { $dateien = [$tmpfile]; if($typ === 'auftrag'){ $stichwoerter = $this->app->DB->SelectArr("SELECT * FROM datei_stichwoerter WHERE objekt='geschaeftsbrief_vorlagen' AND parameter='$idvorlage' AND parameter > 0"); if($stichwoerter){ foreach ($stichwoerter as $v) { $dateiname = str_replace(' ', '_', $this->app->erp->GetDateiName($v['datei'])); if($dateiname){ $dateiinhalt = $this->app->erp->GetDatei($v['datei']); if($handle = fopen(rtrim($this->app->erp->GetTMP(), '/') . "/" . $dateiname, "wb")){ fwrite($handle, $dateiinhalt); fclose($handle); $dateien[] = rtrim($this->app->erp->GetTMP(), '/') . "/" . $dateiname; $dateienIds[] = $v['datei']; } } } } } $stichwoerterAnhaenge = $this->app->DB->SelectArr("SELECT * FROM datei_stichwoerter WHERE subjekt = 'Anhang' AND objekt = '$typ' AND parameter = '$id' AND parameter > 0"); if($stichwoerterAnhaenge) { foreach($stichwoerterAnhaenge as $v) { $dateiname = str_replace(' ','_',$this->app->erp->GetDateiName($v['datei'])); if($dateiname && !in_array($v['datei'], $dateienIds)) { $dateiinhalt = $this->app->erp->GetDatei($v['datei']); if($handle = fopen (rtrim($this->app->erp->GetTMP(),'/')."/".$dateiname, "wb")) { fwrite($handle, $dateiinhalt); fclose($handle); $dateien[] = rtrim($this->app->erp->GetTMP(),'/')."/".$dateiname; } } } } $this->DokumentSend($adresse,$typ, $id, $versandart,$emailtext['betreff'],$emailtext['text'],$dateien,"","",$projekt,$email, $name); if($dateien && (!empty($dateien)?count($dateien):0) > 1) { for($i = 1; $i < (!empty($dateien)?count($dateien):0); $i++) { if(@is_file($dateien[$i])){ @unlink($dateien[$i]); } } } }else{ $this->DokumentSend($adresse,$typ, $id, $versandart,$emailtext['betreff'],$emailtext['text'],array($tmpfile),"","",$projekt,$email, $name); } } else{ $this->DokumentSend($adresse, $typ, $id, $versandart, $emailtext['betreff'], $emailtext['text'], $sendtmp, $drucker, "", $projekt, $email, $name); } if($this->Firmendaten("belegeinanhang")=="1") { $fileid = $this->CreateDateiWithStichwort($tmpfile, $module,'','',$tmpfile, $this->app->User->GetName() ,$typ,$typ, $id, "",false); } /* $fileid = $this->CreateDatei($tmpfile,$module,"","",$tmpfile,$this->app->User->GetName()); $this->AddDateiStichwort($fileid,$typ,$typ,$id,false); */ $ansprechpartner = $name." <".$email.">"; $this->app->DB->Insert("INSERT INTO dokumente_send (id,dokument,zeit,bearbeiter,adresse,parameter,art,betreff,text,projekt,ansprechpartner,versendet,dateiid) VALUES ('','$typ',NOW(),'".$this->app->User->GetName()."', '$adresse','$id','$versandart','".$emailtext['betreff']."','".$emailtext['text']."','$projekt','$ansprechpartner',1,'$fileid')"); unlink($tmpfile); if($typ==='rechnung' || $typ==='angebot' || $typ==='gutschrift') { if($typ === 'rechnung') { $this->closeInvoice($id,'freigegeben'); } $this->app->DB->Update("UPDATE $typ SET status='versendet' WHERE id='$id' AND status='freigegeben' LIMIT 1"); } $this->app->DB->Update("UPDATE $typ SET versendet=1, versendet_am=NOW(), versendet_per='$versandart',versendet_durch='".$this->app->User->GetName()."',schreibschutz='1' WHERE id='$id' LIMIT 1"); $this->BriefpapierHintergrundEnable(); switch($typ) { case "angebot": $this->AngebotProtokoll($id,"Angebot versendet"); break; case "auftrag": $this->AuftragProtokoll($id,"Auftrag versendet"); break; case "rechnung": $this->RechnungProtokoll($id,"Rechnung versendet"); break; case "lieferschein": $this->LieferscheinProtokoll($id,"Lieferschein versendet"); break; case "gutschrift": $this->GutschriftProtokoll($id,"Gutschrift versendet"); break; case "reisekosten": $this->ReisekostenProtokoll($id,"Reisekosten versendet"); break; case "proformarechnung": $this->ProformarechnungProtokoll($id,"Proformarechnung versendet"); break; } } // @refactor DocumentPdf Komponente public function PDFArchivieren($type,$id, $force = false) { $id = (int)$id; if($id <= 0){ return false; } $types = array("auftrag","angebot","rechnung","lieferschein","gutschrift","bestellung","reisekosten","anfrage","preisanfrage","proformarechnung","arbeitsnachweis"); if(!in_array($type, $types)){ return false; } $class = ucfirst($type).'PDFCustom'; if(!class_exists($class)){ $class = ucfirst($type).'PDF'; } if(class_exists($class)) { $projekt = $this->app->DB->Select("SELECT projekt FROM $type WHERE id = '$id' LIMIT 1"); $Brief = new $class($this->app,$projekt); $get = 'Get'.ucfirst($type); if(method_exists($Brief, $get)) { $tmpfile = ''; try { $Brief->$get($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument($force, $force); unlink($tmpfile); $tmpfile = ''; } catch(Exception $e) { if($tmpfile !== '' && is_file($tmpfile)) { unlink($tmpfile); $tmpfile = ''; } $this->LogFile($this->app->DB->real_escape_string($e->getMessage())); return false; } $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; try { $Brief = new $class($this->app, $projekt); $Brief->$get($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument($force, $force); unlink($tmpfile); $tmpfile = ''; } catch(Exception $e) { if($tmpfile !== '' && is_file($tmpfile)) { unlink($tmpfile); } $this->LogFile($this->app->DB->real_escape_string($e->getMessage())); $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; return false; } $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if($force) { $this->app->DB->Update("UPDATE `{$type}` SET `zuarchivieren` = 0 WHERE `id` = {$id}"); } return true; } } return false; } // @refactor in Location Klasse function UrlOrigin($s, $use_forwarded_host=false) { $ssl = (!empty($s['HTTPS']) && $s['HTTPS'] == 'on') ? true:false; $sp = strtolower($s['SERVER_PROTOCOL']); $protocol = substr($sp, 0, strpos($sp, '/')) . (($ssl) ? 's' : ''); $port = $s['SERVER_PORT']; $port = ((!$ssl && $port=='80') || ($ssl && $port=='443')) ? '' : ':'.$port; $host = ($use_forwarded_host && isset($s['HTTP_X_FORWARDED_HOST'])) ? $s['HTTP_X_FORWARDED_HOST'] : (isset($s['HTTP_HOST']) ? $s['HTTP_HOST'] : null); $host = isset($host) ? $host : $s['SERVER_NAME'] . $port; $path = str_replace('/index.php','',$s['SCRIPT_NAME']); return $protocol . '://' . $host.$path; } // @refactor Formater Komponente function ZeitInStundenMinuten($number, $format = "%h:%i") { $number = str_replace(",",'.',$number); $h = floor($number); $i = round(($number - $h) * 60); $h = str_pad($h, 2, "0", STR_PAD_LEFT); $i = str_pad($i, 2, "0", STR_PAD_LEFT); $format = preg_replace("/%h/", $h, $format); $format = preg_replace("/%i/", $i, $format); return $format; } // @refactor Formater Komponente /** * @param string $text * * @return string */ public function UmlauteEntfernen($text) { $text = $this->ReadyForPDF($text); $text = str_replace ("ä", "ae", $text); $text = str_replace ("Ä", "Ae", $text); $text = str_replace ("ö", "oe", $text); $text = str_replace ("Ö", "Oe", $text); $text = str_replace ("ü", "ue", $text); $text = str_replace ("Ü", "Ue", $text); $text = str_replace ("ß", "ss", $text); $text = str_replace( array('ü','Ü','ä','Ä','ö','Ö','ß'), array('ue','Ue','ae','Ae','oe','Oe','ss'), $text ); $text = str_replace ("&", "u", $text); $text = str_replace ("`", "", $text); $text = str_replace ("'", "", $text); return $text; } // @refactor DbHelper Komponente function Stroke($fieldstroke, $field) { return "if(" . $fieldstroke . ",CONCAT(''," . $field . ",'')," . $field . ")"; } // @refactor DbHelper Komponente // creates a CONCAT sql statement with strings or sql expressions // Use like this: ConcatSQL(' 'id','>','click here'); 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 function Dateinamen($text) { $text = $this->UmlauteEntfernen($text); $text = str_replace(' ', '_', $text); $text = preg_replace('#[^-_.A-Za-z0-9]#', '', $text); return $text; } // @refactor in Dateien Modul function AnzahlDateien($objekt,$id) { return $this->app->DB->Select("SELECT COUNT(ds.id) FROM datei_stichwoerter ds INNER JOIN datei d ON d.id = ds.datei WHERE ds.objekt='$objekt' AND ds.parameter='$id' AND d.geloescht <> 1"); } // @refactor in Service Modul function AnzahlOffeneSupport() { return 0; } // @refactor in Aufgaben Modul function AnzahlOffeneAufgaben() { return (int)$this->app->DB->Select("SELECT COUNT(a.id) FROM aufgabe a WHERE (a.adresse='" . $this->app->User->GetAdresse() . "') AND a.startdatum='0000-00-00' AND a.status!='abgeschlossen' AND ( abgabe_bis='0000-00-00' OR abgabe_bis<=NOW())"); } public function AnzahlOffeneTickets($eigene=true) { 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); } // @refactor UiHelper Komponente function UserDevice() { return 'desktop'; } // @refactor in Acl oder Login Modul function Startseite($weiterleitung = "") { if($this->app->User->GetID()!="") { if($this->UserDevice()=="desktop") { $startseite = (string)$weiterleitung !== ''?'':$this->app->DB->Select("SELECT startseite FROM user WHERE id='".$this->app->User->GetID()."' LIMIT 1"); $startseite = $this->ReadyForPDF($startseite); if(strpos($startseite,'action=logout') !== false && strpos($startseite,'module=welcome') !== false) { $startseite= ''; } // wenn die GPS Stechuhr da ist if((string)$weiterleitung !== '') { header("Location: $weiterleitung"); } elseif($startseite!=''){ $this->app->Location->execute((String)$startseite); } else{ header("Location: index.php?module=welcome&action=start"); } exit; } else { header("Location: index.php?module=welcome&action=start"); exit; } } header("Location: index.php?module=welcome&action=login"); exit; } // @refactor in Kalender Modul @prüfen function getFirstDayOfWeek($year, $weeknr) { $offset = date('w', mktime(0,0,0,1,1,$year)); $offset = ($offset < 5) ? 1-$offset : 8-$offset; $monday = mktime(0,0,0,1,1+$offset,$year); return date('Y-m-d',strtotime('+' . ($weeknr - 1) . ' weeks', $monday)); } // @refactor in SystemInformation Modul function IsWindows() { return strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'; } /** * Returns the absolute path to installation directory; without trailing slash * * @return string */ public function GetRootPath() { return dirname(dirname(__DIR__)); } // @refactor in SystemInformation Modul function GetTMP() { $userdata = $this->app->Conf->WFuserdata; $dbname = $this->app->Conf->WFdbname; if ($this->IsWindows()) { $tmp = $userdata."\\tmp\\".$dbname."\\"; } else { $tmp = $userdata."/tmp/".$dbname."/"; } $tmp = str_replace('//','/',$tmp); if(!is_dir($tmp)){ mkdir($tmp, 0777, true); } return $tmp; } // @refactor in SystemInformation Modul function GetUSERDATA() { return $this->app->Conf->WFuserdata; } /** @deprecated */ function RetoureSeriennummernberechnen($id) { } function LieferscheinSeriennummernberechnen($id) { /** @var Seriennummern $obj */ $obj = $this->LoadModul('seriennummern'); if(!empty($obj) && method_exists($obj, 'LieferscheinSeriennummernberechnen')) { $obj->LieferscheinSeriennummernberechnen($id); } } // @refactor in Lager Modul function ArtikelAnzahlLagerPlatzMitSperre($artikel,$lager_platz) { $result = $this->app->DB->Select("SELECT SUM(lpi.menge) FROM lager_platz_inhalt lpi LEFT JOIN lager_platz lp ON lp.id=lpi.lager_platz WHERE lpi.artikel='$artikel' AND lpi.lager_platz='$lager_platz'"); if($result <=0) $result=0; return $result; } // @refactor LagerBeleg Modul function LieferscheinEinlagern($id,$grund="Lieferschein Einlagern", $lpiids = null) { if(!$id)return; $belegnr = $this->app->DB->Select("SELECT belegnr FROM lieferschein WHERE id = '$id' LIMIT 1"); $bearbeiter = ''; if(isset($this->app->User) && $this->app->User && method_exists($this->app->User,'GetName'))$bearbeiter = $this->app->User->GetName(); $objekt_lager_platz = $this->app->DB->SelectArr("SELECT olp.id, olp.menge, olp.lager_platz, olp.artikel, olp.parameter, lp.id as lpid FROM lieferschein_position lp INNER JOIN objekt_lager_platz olp ON lp.id = olp.parameter AND olp.objekt = 'lieferschein' AND lp.lieferschein = '$id'"); if($objekt_lager_platz) { $projekt = $this->app->DB->Select("SELECT projekt FROM lieferschein WHERE id = '$id' LIMIT 1"); foreach($objekt_lager_platz as $olp) { $lpiid = null; if(isset($lpiids[$olp['lpid']]))$lpiid = $lpiids[$olp['lpid']]; $this->app->erp->LagerEinlagern($olp['artikel'],$olp['menge'],$olp['lager_platz'],$projekt, "Stornierung Lieferschein $belegnr",$bearbeiter,"",'lieferschein', $id, $lpiid); $beleg_chargesnmhd = $this->app->DB->SelectArr("SELECT * FROM `beleg_chargesnmhd` WEHRE doctype = 'lieferschein' AND doctypeid = '$id' AND pos = '".$olp['parameter']."'"); $seriennummern = $this->app->DB->SelectArr("SELECT * FROM seriennummern WHERE lieferschein = '$id' AND lieferscheinpos = '".$olp['parameter']."'"); if($seriennummern) { foreach($seriennummern as $sn) { $belegesnarr['sn'][] = array('menge'=>1, 'value'=>$sn['seriennummer'],'table'=>'seriennummern','id'=>$sn['id']); } } if($beleg_chargesnmhd) { $belegesnarr = null; foreach($beleg_chargesnmhd as $bc) { $belegesnarr[$bc['typ']][] = array('menge'=>$bc['menge'], 'value'=>$bc['wert'],'table'=>'beleg_chargesnmhd','id'=>$bc['id']); } } if(isset($belegesnarr['sn'])) { foreach($belegesnarr['sn'] as $v) { if(isset($belegesnarr['charge']) && isset($belegesnarr['mhd'])) { $charge = ''; $mhd = ''; foreach($belegesnarr['charge'] as $k2 => $v2) { if($v2['menge'] > 1) { $charge = $v2['value']; $belegesnarr['charge'][$k2]['menge'] -= 1; break; }elseif($v2['menge'] == 1) { $charge = $v2['value']; unset($belegesnarr['charge'][$k2]); break; } } foreach($belegesnarr['mhd'] as $k2 => $v2) { if($v2['menge'] > 1) { $mhd = $v2['value']; $belegesnarr['mhd'][$k2]['menge'] -= 1; break; }elseif($v2['menge'] == 1) { $mhd = $v2['value']; unset($belegesnarr['mhd'][$k2]); break; } } if(isset($v['table']) && $v['table'] == 'seriennummern' && !empty($v['id'])) { $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1"); }elseif(isset($v['table']) && $v['table'] == 'beleg_chargesnmhd' && !empty($v['id'])){ $this->app->DB->Delete("DELETE FROM beleg_chargesnmhd WHERE id = '".$v['id']."' LIMIT 1"); } if(method_exists($this->app->erp,'AddSeriennummerLager'))$this->app->erp->AddSeriennummerLager($olp['artikel'], $olp['lager_platz'], $v['value'],"Stornierung Lieferschein $belegnr", "", $mhd, $charge,'lieferschein', $id); if(method_exists($this->app->erp,'AddMindesthaltbarkeitsdatumLagerOhneBewegung'))$this->app->erp->AddMindesthaltbarkeitsdatumLagerOhneBewegung($olp['artikel'], 1,$olp['lager_platz'], $mhd, $charge); if(method_exists($this->app->erp,'AddChargeLagerOhneBewegung'))$this->app->erp->AddChargeLagerOhneBewegung($olp['artikel'],1, $olp['lager_platz'],$mhd,$charge,$grund); }elseif(isset($belegesnarr['charge'])) { $charge = ''; $mhd = ''; foreach($belegesnarr['charge'] as $k2 => $v2) { if($v2['menge'] > 1) { $charge = $v2['value']; $belegesnarr['charge'][$k2]['menge'] -= 1; break; }elseif($v2['menge'] == 1) { $charge = $v2['value']; unset($belegesnarr['charge'][$k2]); break; } } if(isset($v['table']) && $v['table'] == 'seriennummern' && !empty($v['id'])) { $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1"); }elseif(isset($v['table']) && $v['table'] == 'beleg_chargesnmhd' && !empty($v['id'])){ $this->app->DB->Delete("DELETE FROM beleg_chargesnmhd WHERE id = '".$v['id']."' LIMIT 1"); } if(method_exists($this->app->erp,'AddSeriennummerLager'))$this->app->erp->AddSeriennummerLager($olp['artikel'],1, $olp['lager_platz'], $v['value'],$grund, "", $mhd, $charge,'lieferschein', $id); if(method_exists($this->app->erp,'AddChargeLagerOhneBewegung'))$this->app->erp->AddChargeLagerOhneBewegung($olp['artikel'], 1,$olp['lager_platz'],$mhd,$charge,"", 'lieferschein', $id,$grund); }elseif(isset($belegesnarr['mhd'])) { $charge = ''; $mhd = ''; foreach($belegesnarr['mhd'] as $k2 => $v2) { if($v2['menge'] > 1) { $mhd = $v2['value']; $belegesnarr['mhd'][$k2]['menge'] -= 1; break; }elseif($v2['menge'] == 1) { $mhd = $v2['value']; unset($belegesnarr['mhd'][$k2]); break; } } if(isset($v['table']) && $v['table'] == 'seriennummern' && !empty($v['id'])) { $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1"); }elseif(isset($v['table']) && $v['table'] == 'beleg_chargesnmhd' && !empty($v['id'])){ $this->app->DB->Delete("DELETE FROM beleg_chargesnmhd WHERE id = '".$v['id']."' LIMIT 1"); } if(method_exists($this->app->erp,'AddSeriennummerLager'))$this->app->erp->AddSeriennummerLager($olp['artikel'], $olp['lager_platz'], $v['value'],$grund, "", $mhd, $charge); if(method_exists($this->app->erp,'AddMindesthaltbarkeitsdatumLagerOhneBewegung'))$this->app->erp->AddMindesthaltbarkeitsdatumLagerOhneBewegung($olp['artikel'],1, $olp['lager_platz'], $mhd, $charge, "", "lieferschein", $id, $grund); }else{ if(isset($v['table']) && $v['table'] == 'seriennummern' && !empty($v['id'])) { $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1"); }elseif(isset($v['table']) && $v['table'] == 'beleg_chargesnmhd' && !empty($v['id'])){ $this->app->DB->Delete("DELETE FROM beleg_chargesnmhd WHERE id = '".$v['id']."' LIMIT 1"); } if(method_exists($this->app->erp,'AddSeriennummerLager'))$this->app->erp->AddSeriennummerLager($olp['artikel'], $olp['lager_platz'], $v['value'],$grund, "", $mhd, $charge); } } }else{ if(isset($belegesnarr['charge']) && isset($belegesnarr['mhd'])) { foreach($belegesnarr['charge'] as $v2) { $nochmenge = $v2['value']; foreach($belegesnarr['mhd'] as $k3 => $v3) { if($nochmenge <= 0)break; if($nochmenge == $v3['menge']) { $mhd = $v3['value']; $charge = $v2['value']; if(method_exists($this->app->erp,'AddMindesthaltbarkeitsdatumLagerOhneBewegung'))$this->app->erp->AddMindesthaltbarkeitsdatumLagerOhneBewegung($olp['artikel'], $nochmenge,$olp['lager_platz'], $mhd, $charge, "", "lieferschein", $id, $grund); if(method_exists($this->app->erp,'AddChargeLagerOhneBewegung'))$this->app->erp->AddChargeLagerOhneBewegung($olp['artikel'],$nochmenge, $olp['lager_platz'],$mhd,$charge,"", 'lieferschein', $id,$grund); unset($belegesnarr['mhd'][$k3]); break; }elseif($nochmenge > $v3['menge']) { $mhd = $v3['value']; $charge = $v2['value']; if(method_exists($this->app->erp,'AddMindesthaltbarkeitsdatumLagerOhneBewegung'))$this->app->erp->AddMindesthaltbarkeitsdatumLagerOhneBewegung($olp['artikel'], $v3['menge'],$olp['lager_platz'], $mhd, $charge, "", "lieferschein", $id, $grund); if(method_exists($this->app->erp,'AddChargeLagerOhneBewegung'))$this->app->erp->AddChargeLagerOhneBewegung($olp['artikel'],$v3['menge'], $olp['lager_platz'],$mhd,$charge,"", 'lieferschein', $id,$grund); unset($belegesnarr['mhd'][$k3]); $nochmenge -= $v3['menge']; }elseif($nochmenge < $v3['menge']) { $mhd = $v3['value']; $charge = $v2['value']; if(method_exists($this->app->erp,'AddMindesthaltbarkeitsdatumLagerOhneBewegung'))$this->app->erp->AddMindesthaltbarkeitsdatumLagerOhneBewegung($olp['artikel'], $nochmenge,$olp['lager_platz'], $mhd, $charge, "", "lieferschein", $id, $grund); if(method_exists($this->app->erp,'AddChargeLagerOhneBewegung'))$this->app->erp->AddChargeLagerOhneBewegung($olp['artikel'],$nochmenge, $olp['lager_platz'],$mhd,$charge,"", 'lieferschein', $id,$grund); $belegesnarr['mhd'][$k3]['menge'] -= $nochmenge; break; } } } }elseif($belegesnarr['charge']) { foreach($belegesnarr['charge'] as $v2) { if(method_exists($this->app->erp,'AddChargeLagerOhneBewegung'))$this->app->erp->AddChargeLagerOhneBewegung($olp['artikel'],$v2['menge'], $olp['lager_platz'],'',$v2['value'],"", 'lieferschein', $id,$grund); } }elseif($belegesnarr['mhd']) { if(method_exists($this->app->erp,'AddMindesthaltbarkeitsdatumLagerOhneBewegung'))$this->app->erp->AddMindesthaltbarkeitsdatumLagerOhneBewegung($olp['artikel'],$v2['menge'], $olp['lager_platz'], $v2['value'], "", "lieferschein", $id, $grund); } } $this->app->DB->Delete("DELETE FROM objekt_lager_platz WHERE id = '".$olp['id']."' LIMIT 1"); } } } // @refactor LagerBeleg Modul // Returns Array: // storageMovements => array('lager_platz', 'artikel', 'menge'); function LieferscheinAuslagern($lieferschein,$anzeige_lagerplaetze_in_lieferschein=false, $standardlager = 0, $belegtyp = 'lieferschein', $chargenmhdnachprojekt = 0, $forceseriennummerngeliefertsetzen = false,$nurrestmenge = false, $lager_platz_vpe = 0, $lpiid = 0, $simulieren = false) { if($lieferschein <= 0) { return; } if(!$anzeige_lagerplaetze_in_lieferschein) { $anzeige_lagerplaetze_in_lieferschein = true; } $artikelarr = $this->app->DB->SelectArr( sprintf( "SELECT * FROM `%s` WHERE `%s` = %d ORDER BY sort", $belegtyp.'_position', $belegtyp, (int)$lieferschein ) ); $belegarr = $this->app->DB->SelectRow( sprintf( 'SELECT * FROM `%s` WHERE id=%d LIMIT 1', $belegtyp, (int)$lieferschein ) ); $kommissionskonsignationslager = 0; if($belegtyp === 'lieferschein'){ $kommissionskonsignationslager = $belegarr['kommissionskonsignationslager']; } $chargenerfassen = 0; $mhderfassen = 0; $seriennummernerfassen = 0; $kommissionierverfahren = ''; $projekt = 0; $belegnr = ''; if(!empty($belegarr)) { $projekt = (int)$belegarr['projekt']; $projektarr = $this->app->DB->SelectRow( sprintf( 'SELECT * FROM projekt WHERE id = %d LIMIT 1', $projekt ) ); if(!empty($projektarr)) { $chargenerfassen = $projektarr['chargenerfassen']; $mhderfassen = $projektarr['mhderfassen']; $seriennummernerfassen = $projektarr['seriennummernerfassen']; if(!empty($projektarr['multiorderpicking']) && $this->ModulVorhanden('multiorderpicking')) { $chargenerfassen = 1; $mhderfassen = 1; $seriennummernerfassen = 1; } $kommissionierverfahren = $projektarr['kommissionierverfahren']; } $belegnr = $belegarr['belegnr']; } $chargenauslagern = 1; $mhdauslagern = 1; $seriennummernauslagern = 1; if($chargenmhdnachprojekt && $chargenerfassen){ $chargenauslagern = 0; } if($chargenmhdnachprojekt && $mhderfassen){ $mhdauslagern = 0; } if($chargenmhdnachprojekt && $seriennummernerfassen && $kommissionierverfahren !== 'kommissionierverfahren'){ $seriennummernauslagern = 0; } $sortreihenfolge = 'ASC'; if($belegtyp === 'produktion') { $sortreihenfolge = 'DESC'; } if($belegtyp === 'produktion') { if($standardlager > 0 && !$this->app->DB->Select( sprintf( "SELECT id FROM lager WHERE id = %d AND bezeichnung <> '' AND IFNULL(geloescht,0) = 0 LIMIT 1", (int)$standardlager) ) ) { $standardlager = (int)$this->app->DB->Select( sprintf( "SELECT l.id FROM projekt AS p INNER JOIN lager AS l ON p.standardlagerproduktion = l.id WHERE p.id = %d AND l.bezeichnung <> '' AND IFNULL(l.geloescht,0) = 0 LIMIT 1", (int)$projekt ) ); } } else{ if($standardlager > 0 && !$this->app->DB->Select( sprintf( "SELECT id FROM lager WHERE id = %d AND bezeichnung <> '' AND IFNULL(geloescht,0) = 0 LIMIT 1", (int)$standardlager) )){ $standardlager = (int)$this->app->DB->Select( sprintf( "SELECT l.id FROM projekt AS p INNER JOIN lager AS l ON p.standardlager = l.id WHERE p.id = %d AND l.bezeichnung <> '' AND IFNULL(l.geloescht,0) = 0 LIMIT 1", $projekt ) ); } } if($standardlager == 0) { if($projekt > 0){ $projektlager = $this->app->DB->Select("SELECT projektlager FROM projekt WHERE id='$projekt'"); } } $storageLocations = []; $storageMovements = []; $cartikel = $artikelarr?count($artikelarr):0; for($i= ($belegtyp==='produktion'?1:0) ;$i<$cartikel;$i++) { $beschreibung = $artikelarr[$i]['beschreibung']; $artikel = $artikelarr[$i]['artikel']; $menge = $artikelarr[$i]['menge']; if($nurrestmenge && $belegtyp=='produktion') { $menge = $artikelarr[$i]['menge'] - $artikelarr[$i]['geliefert_menge']; } $subid = $artikelarr[$i]['id']; $lager_string = ''; $arcticleRow = $this->app->DB->SelectRow( sprintf( "SELECT lagerartikel, mindesthaltbarkeitsdatum, chargenverwaltung, seriennummern FROM artikel WHERE id=%d LIMIT 1", (int)$artikel ) ); $lagerartikel = $arcticleRow['lagerartikel']; $seriennummern = $arcticleRow['seriennummern'] === 'keine'?'':$arcticleRow['seriennummern']; $regal = 0; $sperrlagerWhere = ' lp.sperrlager <> 1 '; if($belegtyp=='produktion') { $sperrlagerWhere = ' (lp.sperrlager <> 1 OR lp.allowproduction = 1) '; } if($lagerartikel > 0) { $this->LagerArtikelZusammenfassen($artikel); // lager platz suchen eins abziehen und namen in lieferschein // kleinster lager leer machen $regal = 0; $timeout=0; $restmenge = $menge; $lager_string = ''; $mindesthaltbarkeitsdatum = $arcticleRow['mindesthaltbarkeitsdatum']; $chargenverwaltung = $arcticleRow['chargenverwaltung']; while($restmenge > 0) { $timeout++; if($restmenge <= 0){ break; } //if($timeout > 1000) break; $extraorder = ''; $maxAuslagern = $restmenge; if(!empty($seriennummern) && $belegtyp !== 'produktion') { $snDeliveryNoteStorage = $this->app->DB->SelectArr( sprintf( 'SELECT bc.lagerplatz AS storage_location_id, COUNT(bc.id) - IFNULL(olp.menge, 0) AS amount FROM `beleg_chargesnmhd` AS bc LEFT JOIN ( SELECT SUM(menge) AS menge, lager_platz FROM `objekt_lager_platz` WHERE objekt = \'lieferschein\' AND parameter = %d GROUP BY lager_platz ) AS olp ON bc.lagerplatz = olp.lager_platz WHERE bc.type = \'sn\' AND bc.doctype = \'lieferschein\' AND bc.doctypeid = %d AND bc.pos = %d AND bc.wert <> \'\' GROUP BY bc.lagerplatz HAVING amount > 0 ORDER BY COUNT(bc.id) - IFNULL(olp.menge, 0) = %f DESC, COUNT(bc.id) - IFNULL(olp.menge, 0) ', (int)$subid, (int)$lieferschein, (int)$subid, (float)$restmenge ) ); if(!empty($snDeliveryNoteStorage)) { $extraorder = sprintf(' lpi.lager_platz = %d DESC, ', $snDeliveryNoteStorage[0]['storage_location_id']); if($snDeliveryNoteStorage[0]['amount'] < $restmenge && $snDeliveryNoteStorage[0]['amount'] > 0 && (!empty($snDeliveryNoteStorage)?count($snDeliveryNoteStorage):0) > 1) { $maxAuslagern = $snDeliveryNoteStorage[0]['amount']; } } } $this->app->erp->RunHook('lieferscheinauslagern', 6, $belegtyp, $subid, $artikel, $mindesthaltbarkeitsdatum, $chargenverwaltung, $extraorder); if($mindesthaltbarkeitsdatum) { if($standardlager > 0) { $lager_max = $this->app->DB->SelectArr( sprintf( "SELECT lpi.lager_platz, if(lpi.menge > lm.menge, lm.menge,lpi.menge) as menge, lpi.id FROM lager_platz_inhalt AS lpi INNER JOIN lager_platz AS lp ON lpi.lager_platz=lp.id AND lp.id <> %d INNER JOIN lager AS `lag` ON `lag`.id=lp.lager INNER JOIN ( SELECT lager_platz, sum(menge) as menge,min(mhddatum) as mhddatum FROM lager_mindesthaltbarkeitsdatum WHERE artikel = %d GROUP BY lager_platz ) AS lm ON lp.id = lm.lager_platz WHERE lpi.artikel=%d AND lpi.menge > 0 ".($lpiid?'':' AND lp.autolagersperre!=1 AND '.$sperrlagerWhere)." AND `lag`.id='$standardlager' ORDER by ".($lpiid?" lpi.id = '$lpiid' DESC, ":'')." ".($lager_platz_vpe?" lpi.lager_platz_vpe = '$lager_platz_vpe' DESC, ":'')." `lag`.id='$standardlager' DESC, $extraorder lm.mhddatum ASC, lpi.menge $sortreihenfolge LIMIT 1", (int)$kommissionskonsignationslager,(int)$artikel, (int)$artikel ) ); if(!$lager_max) { $lager_max = $this->app->DB->SelectArr( sprintf( "SELECT lpi.lager_platz, lpi.menge, lpi.id FROM lager_platz_inhalt AS lpi INNER JOIN lager_platz AS lp ON lpi.lager_platz=lp.id INNER JOIN lager AS `lag` ON `lag`.id=lp.lager LEFT JOIN lager_mindesthaltbarkeitsdatum lm ON lm.artikel=lpi.artikel AND lp.id = lm.lager_platz WHERE lpi.artikel=%d AND lpi.menge > 0 ".($lpiid?'':' AND lp.autolagersperre!=1 AND '.$sperrlagerWhere)." AND `lag`.id='$standardlager' ORDER by ".($lpiid?" lpi.id = '$lpiid' DESC, ":'')." ".($lager_platz_vpe?" lpi.lager_platz_vpe = '$lager_platz_vpe' DESC, ":'')." lag.id='$standardlager' DESC, $extraorder lm.mhddatum ASC, lpi.menge $sortreihenfolge LIMIT 1", (int)$artikel ) ); } } elseif($projektlager > 0) { // Hole nach und nach bis alles da ist $lager_max = $this->app->DB->SelectArr( "SELECT lpi.lager_platz, if(lpi.menge > lm.menge, lm.menge,lpi.menge) as menge,lpi.id FROM lager_platz_inhalt AS lpi INNER JOIN lager_platz AS lp ON lpi.lager_platz=lp.id AND lp.id <> '$kommissionskonsignationslager' INNER JOIN lager AS `lag` ON `lag`.id=lp.lager INNER JOIN ( SELECT lager_platz, sum(menge) as menge,min(mhddatum) as mhddatum FROM lager_mindesthaltbarkeitsdatum WHERE artikel = '$artikel' AND menge > 0 GROUP BY lager_platz ) AS lm ON lp.id = lm.lager_platz WHERE lpi.artikel='$artikel' AND lpi.menge > 0 ".($lpiid?'':' AND lp.autolagersperre!=1 AND '.$sperrlagerWhere)." AND `lag`.projekt='$projekt' ORDER BY ".($lpiid?" lpi.id = '$lpiid' DESC, ":'')." ".($lager_platz_vpe?" lpi.lager_platz_vpe = '$lager_platz_vpe' DESC, ":'')." $extraorder lm.mhddatum ASC, lpi.menge $sortreihenfolge LIMIT 1" ); if(!$lager_max) { $lager_max = $this->app->DB->SelectArr( "SELECT lpi.lager_platz, lpi.menge,lpi.id FROM lager_platz_inhalt AS lpi INNER JOIN lager_platz AS lp ON lpi.lager_platz=lp.id INNER JOIN lager AS `lag` ON `lag`.id=lp.lager LEFT JOIN lager_mindesthaltbarkeitsdatum AS lm ON lm.artikel=lpi.artikel AND lp.id = lm.lager_platz WHERE lpi.artikel='$artikel' AND lpi.menge > 0 ".($lpiid?'':' AND lp.autolagersperre!=1 AND '.$sperrlagerWhere)." AND `lag`.projekt='$projekt' ORDER BY ".($lpiid?" lpi.id = '$lpiid' DESC, ":'')." ".($lager_platz_vpe?" lpi.lager_platz_vpe = '$lager_platz_vpe' DESC, ":'')." $extraorder lm.mhddatum ASC, lpi.menge $sortreihenfolge LIMIT 1"); } } else { // Hole nach und nach bis alles da ist $lager_max = $this->app->DB->SelectArr( sprintf( "SELECT lpi.lager_platz, if(lpi.menge > lm.menge, lm.menge,lpi.menge) as menge,lpi.id FROM lager_platz_inhalt AS lpi INNER JOIN lager_platz lp ON lpi.lager_platz=lp.id AND lp.id <> '$kommissionskonsignationslager' INNER JOIN ( SELECT lager_platz, sum(menge) as menge,min(mhddatum) as mhddatum FROM lager_mindesthaltbarkeitsdatum WHERE artikel = %d AND menge > 0 GROUP BY lager_platz ) AS lm ON lp.id = lm.lager_platz WHERE lpi.artikel=%d AND lpi.menge > 0 ".($lpiid?'':' AND lp.autolagersperre!=1 AND '.$sperrlagerWhere)." ORDER by ".($lpiid?" lpi.id = '$lpiid' DESC, ":'')." ".($lager_platz_vpe?" lpi.lager_platz_vpe = '$lager_platz_vpe' DESC, ":'')." $extraorder lm.mhddatum ASC, lpi.menge $sortreihenfolge LIMIT 1", (int)$artikel, (int)$artikel ) ); if(!$lager_max) { $lager_max = $this->app->DB->SelectArr("SELECT lpi.lager_platz, lpi.menge,lpi.id FROM lager_platz_inhalt AS lpi INNER JOIN lager_platz AS lp ON lpi.lager_platz=lp.id INNER JOIN lager_mindesthaltbarkeitsdatum AS lm ON lm.artikel=lpi.artikel AND lp.id = lm.lager_platz WHERE lpi.artikel='$artikel' AND lpi.menge > 0 ".($lpiid?'':' AND lp.autolagersperre!=1 AND '.$sperrlagerWhere)." ORDER by ".($lpiid?" lpi.id = '$lpiid' DESC, ":'')." ".($lager_platz_vpe?" lpi.lager_platz_vpe = '$lager_platz_vpe' DESC, ":'')." $extraorder lm.mhddatum ASC, lpi.menge $sortreihenfolge LIMIT 1" ); } } } else { if($chargenverwaltung) { if($standardlager > 0) { $lager_max = $this->app->DB->SelectArr( "SELECT lpi.lager_platz, if(lpi.menge > lm.menge, lm.menge,lpi.menge) as menge,lpi.id FROM lager_platz_inhalt AS lpi INNER JOIN lager_platz AS lp ON lpi.lager_platz=lp.id INNER JOIN lager AS `lag` ON `lag`.id=lp.lager INNER JOIN ( SELECT lager_platz, sum(menge) as menge FROM lager_charge WHERE artikel = '$artikel' AND menge > 0 GROUP BY lager_platz ) AS lm ON lp.id = lm.lager_platz WHERE lpi.artikel='$artikel' AND lpi.menge > 0 ".($lpiid?'':' AND lp.autolagersperre!=1 AND '.$sperrlagerWhere)." AND `lag`.id='$standardlager' ORDER BY ".($lpiid?" lpi.id = '$lpiid' DESC, ":'')." ".($lager_platz_vpe?" lpi.lager_platz_vpe = '$lager_platz_vpe' DESC, ":'')." `lag`.id='$standardlager' DESC, $extraorder lpi.menge $sortreihenfolge LIMIT 1" ); if(!$lager_max) { $lager_max = $this->app->DB->SelectArr( "SELECT lpi.lager_platz, lpi.menge,lpi.id FROM lager_platz_inhalt AS lpi INNER JOIN lager_platz AS lp ON lpi.lager_platz=lp.id INNER JOIN lager AS `lag` ON `lag`.id=lp.lager WHERE lpi.artikel='$artikel' AND lpi.menge > 0 ".($lpiid?'':' AND lp.autolagersperre!=1 AND '.$sperrlagerWhere)." AND `lag`.id='$standardlager' ORDER BY ".($lpiid?" lpi.id = '$lpiid' DESC, ":'')." ".($lager_platz_vpe?" lpi.lager_platz_vpe = '$lager_platz_vpe' DESC, ":'')." `lag`.id='$standardlager' DESC, $extraorder lpi.menge $sortreihenfolge LIMIT 1" ); } } elseif($projektlager > 0){ $lager_max = $this->app->DB->SelectArr( "SELECT lpi.lager_platz, if(lpi.menge > lm.menge, lm.menge,lpi.menge) as menge,lpi.id FROM lager_platz_inhalt AS lpi INNER JOIN lager_platz AS lp ON lpi.lager_platz=lp.id AND lp.id <> '$kommissionskonsignationslager' INNER JOIN lager AS `lag` ON `lag`.id=lp.lager INNER JOIN ( SELECT lager_platz, sum(menge) as menge FROM lager_charge WHERE artikel = '$artikel' AND menge > 0 GROUP BY lager_platz ) AS lm ON lp.id = lm.lager_platz WHERE lpi.artikel='$artikel' AND lpi.menge > 0 ".($lpiid?'':' AND lp.autolagersperre!=1 AND '.$sperrlagerWhere)." AND `lag`.projekt='$projekt' ORDER BY ".($lpiid?" lpi.id = '$lpiid' DESC, ":'')." ".($lager_platz_vpe?" lpi.lager_platz_vpe = '$lager_platz_vpe' DESC, ":'')." $extraorder lpi.menge $sortreihenfolge LIMIT 1" ); if(!$lager_max) { $lager_max = $this->app->DB->SelectArr( "SELECT lpi.lager_platz, lpi.menge,lpi.id FROM lager_platz_inhalt AS lpi INNER JOIN lager_platz AS lp ON lpi.lager_platz=lp.id AND lp.id <> '$kommissionskonsignationslager' INNER JOIN lager AS `lag` ON `lag`.id=lp.lager WHERE lpi.artikel='$artikel' AND lpi.menge > 0 ".($lpiid?'':' AND lp.autolagersperre!=1 AND '.$sperrlagerWhere)." AND `lag`.projekt='$projekt' ORDER BY ".($lpiid?" lpi.id = '$lpiid' DESC, ":'')." ".($lager_platz_vpe?" lpi.lager_platz_vpe = '$lager_platz_vpe' DESC, ":'')." $extraorder lpi.menge $sortreihenfolge LIMIT 1" ); } } else { $lager_max = $this->app->DB->SelectArr( "SELECT lpi.lager_platz, if(lpi.menge > lm.menge, lm.menge,lpi.menge) as menge,lpi.id FROM lager_platz_inhalt AS lpi INNER JOIN lager_platz AS lp ON lpi.lager_platz=lp.id AND lp.id <> '$kommissionskonsignationslager' INNER JOIN ( SELECT lager_platz, sum(menge) as menge FROM lager_charge WHERE artikel = '$artikel' AND menge > 0 GROUP BY lager_platz ) AS lm ON lp.id = lm.lager_platz WHERE lpi.artikel='$artikel' AND lpi.menge > 0 ".($lpiid?'':' AND lp.autolagersperre!=1 AND '.$sperrlagerWhere)." ORDER BY ".($lpiid?" lpi.id = '$lpiid' DESC, ":'')." ".($lager_platz_vpe?" lpi.lager_platz_vpe = '$lager_platz_vpe' DESC, ":'')." $extraorder lpi.menge $sortreihenfolge LIMIT 1" ); if(!$lager_max) { $lager_max = $this->app->DB->SelectArr( "SELECT lpi.lager_platz, lpi.menge,lpi.id FROM lager_platz_inhalt AS lpi INNER JOIN lager_platz AS lp ON lpi.lager_platz=lp.id AND lp.id <> '$kommissionskonsignationslager' WHERE lpi.artikel='$artikel' AND lpi.menge > 0 ".($lpiid?'':' AND lp.autolagersperre!=1 AND '.$sperrlagerWhere)." ORDER BY ".($lpiid?" lpi.id = '$lpiid' DESC, ":'')." ".($lager_platz_vpe?" lpi.lager_platz_vpe = '$lager_platz_vpe' DESC, ":'')." $extraorder lpi.menge $sortreihenfolge LIMIT 1" ); } } } else{ if($standardlager > 0) { $lager_max = $this->app->DB->SelectArr( "SELECT lpi.lager_platz, lpi.menge,lpi.id FROM lager_platz_inhalt AS lpi INNER JOIN lager_platz AS lp ON lpi.lager_platz=lp.id AND lp.id <> '$kommissionskonsignationslager' INNER JOIN lager AS `lag` ON `lag`.id=lp.lager WHERE lpi.artikel='$artikel' AND lpi.menge > 0 ".($lpiid?'':' AND lp.autolagersperre!=1 AND '.$sperrlagerWhere)." AND `lag`.id='$standardlager' ORDER BY ".($lpiid?" lpi.id = '$lpiid' DESC, ":'')." ".($lager_platz_vpe?" lpi.lager_platz_vpe = '$lager_platz_vpe' DESC, ":'')." `lag`.id='$standardlager' DESC, $extraorder lpi.menge $sortreihenfolge LIMIT 1" ); } elseif($projektlager > 0) { $lager_max = $this->app->DB->SelectArr( "SELECT lpi.lager_platz, lpi.menge,lpi.id FROM lager_platz_inhalt AS lpi INNER JOIN lager_platz AS lp ON lpi.lager_platz=lp.id AND lp.id <> '$kommissionskonsignationslager' INNER JOIN lager AS `lag` ON `lag`.id=lp.lager WHERE lpi.artikel='$artikel' AND lpi.menge > 0 ".($lpiid?'':' AND lp.autolagersperre!=1 AND '.$sperrlagerWhere)." AND `lag`.projekt='$projekt' ORDER BY ".($lpiid?" lpi.id = '$lpiid' DESC, ":'')." ".($lager_platz_vpe?" lpi.lager_platz_vpe = '$lager_platz_vpe' DESC, ":'')." $extraorder lpi.menge $sortreihenfolge LIMIT 1" ); } else { $lager_max = $this->app->DB->SelectArr( "SELECT lpi.lager_platz, lpi.menge,lpi.id FROM lager_platz_inhalt AS lpi INNER JOIN lager_platz AS lp ON lpi.lager_platz=lp.id AND lp.id <> '$kommissionskonsignationslager' WHERE lpi.artikel='$artikel' AND lpi.menge > 0 ".($lpiid?'':' AND lp.autolagersperre!=1 AND '.$sperrlagerWhere)." ORDER BY ".($lpiid?" lpi.id = '$lpiid' DESC, ":'')." ".($lager_platz_vpe?" lpi.lager_platz_vpe = '$lager_platz_vpe' DESC, ":'')." $extraorder lpi.menge $sortreihenfolge LIMIT 1" ); } } } if(!$lager_max){ break; } if((round($maxAuslagern,8) > round($lager_max[0]['menge'],8)) && ($lager_max[0]['menge'] > 0)) { // es werden mehr gebraucht als im lager sind $menge_auslagern = $lager_max[0]['menge']; } else if( ($lager_max[0]['menge'] >= $maxAuslagern) && ($maxAuslagern > 0) ) { // es sind genuegend lager $menge_auslagern = $maxAuslagern; } else { break; } $storageMovements[] = array('lager_platz' => $lager_max[0]['lager_platz'], 'artikel' => $artikel,'menge' => $menge_auslagern); if (!$simulieren) { $this->LagerAuslagernRegal($artikel,$lager_max[0]['lager_platz'],$menge_auslagern,$projekt,ucfirst($belegtyp)." $belegnr","",$belegtyp,$lieferschein, $lager_max[0]['lager_platz_vpe'], $lager_max[0]['id']); $storageLocations[] = $lager_max[0]['lager_platz']; if($anzeige_lagerplaetze_in_lieferschein){ $this->LagerAuslagernText($artikel, $subid, $lager_max[0]['lager_platz'], $menge_auslagern, $belegtyp); } else { $this->LagerAuslagernObjektLagerPlatz($artikel, $subid, $lager_max[0]['lager_platz'], $menge_auslagern, $belegtyp); } $regal_name = $this->app->DB->Select("SELECT kurzbezeichnung FROM lager_platz WHERE id='".$lager_max[0]['lager_platz']."' LIMIT 1"); $lager_string .= $regal_name."(".(float)$menge_auslagern.") "; if(!$nurrestmenge){ $this->LagerAuslagernRegalMHDCHARGESRN($artikel,$lager_max[0]['lager_platz'],$menge_auslagern,$projekt,ucfirst($belegtyp)." $belegnr","",$belegtyp,$lieferschein,$subid, $chargenauslagern, $mhdauslagern, $seriennummernauslagern); } } $restmenge = round($restmenge - $menge_auslagern, 8); } } if (!$simulieren) { $geliefert = $menge; if($nurrestmenge && $belegtyp=='produktion') { $geliefert = $menge + $artikelarr[$i]['geliefert_menge']; } $artikelhatseriennummer = $this->app->DB->Select("SELECT seriennummern FROM artikel WHERE id='".$artikel."' LIMIT 1"); if($belegtyp == 'produktion') { $this->app->DB->Update("UPDATE ".$belegtyp."_position SET geliefert_menge='$geliefert', geliefert = 1 WHERE id='$subid' LIMIT 1"); }else{ if($belegtyp=="lieferschein") { $auftragposid=$this->app->DB->Select("SELECT auftrag_position_id FROM lieferschein_position WHERE id='$subid'"); if($auftragposid>0) { $this->app->DB->Update("UPDATE auftrag_position SET geliefert_menge='$geliefert' WHERE id='$auftragposid' LIMIT 1"); } } if($seriennummernerfassen=='1' && ($artikelhatseriennummer=='vomprodukteinlagern' || $artikelhatseriennummer=='vomprodukt' || $artikelhatseriennummer=='eigene')) { // wenn Seriennummer erfasst werden soll //if($anzeige_lagerplaetze_in_lieferschein) //{ //$this->app->DB->Update("UPDATE ".$belegtyp."_position SET beschreibung='$beschreibung' WHERE id='$subid' LIMIT 1"); //neue datenstruktur //} if($forceseriennummerngeliefertsetzen)$this->app->DB->Update("UPDATE ".$belegtyp."_position SET geliefert='$geliefert' WHERE id='$subid' LIMIT 1"); } else { //wenn nicht //if($anzeige_lagerplaetze_in_lieferschein) // $this->app->DB->Update("UPDATE ".$belegtyp."_position SET geliefert='$geliefert',beschreibung='$beschreibung' WHERE id='$subid' LIMIT 1"); //else $this->app->DB->Update("UPDATE ".$belegtyp."_position SET geliefert='$geliefert' WHERE id='$subid' LIMIT 1"); } } } // simulieren } // for loop if (!$simulieren) { if(!empty($storageLocations)) { $this->addStorageCountry($belegtyp, $lieferschein, $storageLocations); } $this->app->DB->Delete("DELETE FROM lager_reserviert WHERE objekt = '$belegtyp' AND parameter = '$lieferschein'"); if($belegtyp == '' || $belegtyp === 'lieferschein') { $auftragid = $this->app->DB->Select("SELECT auftragid FROM $belegtyp WHERE id='$lieferschein'"); if($auftragid){ $this->app->DB->Delete("DELETE FROM lager_reserviert WHERE objekt = 'auftrag' AND parameter = '$auftragid'"); } $this->RunHook('erpapi_lieferschein_auslagern', 1, $lieferschein); $this->LieferscheinProtokoll($lieferschein,"Lieferschein ausgelagert"); } } return(array('storageMovements' => $storageMovements)); } /** * @param string $doctype * @param int $doctypeId * @param array $storageLocations */ public function addStorageCountry($doctype, $doctypeId, $storageLocations) { if($doctype === 'lieferschein') { $order = $this->app->DB->SelectRow( sprintf( "SELECT o.id, o.schreibschutz FROM lieferschein AS dn INNER JOIN auftrag AS o ON dn.auftragid = o.id AND o.belegnr <> '' WHERE dn.id = %d AND o.`storage_country` = '' AND o.shop = 0 ORDER BY o.status <> 'storniert' DESC", $doctypeId ) ); if(!empty($order)) { $country = $this->app->DB->Select( sprintf( "SELECT adr.land FROM lager_platz AS lp INNER JOIN lager AS l ON lp.lager = l.id INNER JOIN adresse adr ON IF(l.adresse > 0, l.adresse, lp.adresse) = adr.id AND adr.land <> '' AND adr.land <> '%s' WHERE lp.id IN (%s) LIMIT 1", $this->app->DB->real_escape_string($this->app->erp->Firmendaten('land')), implode(',', array_unique($storageLocations)) ) ); if(!empty($country)) { $this->app->DB->Update( sprintf( "UPDATE auftrag SET storage_country = '%s', zuarchivieren = 0, schreibschutz = 0 WHERE id = %d AND storage_country = ''", $this->app->DB->real_escape_string($country), $order['id'] ) ); if($this->app->DB->affected_rows() > 0) { $this->app->erp->ANABREGSNeuberechnen($order['id'], 'auftrag'); if($order['schreibschutz']) { $this->app->erp->PDFArchivieren('auftrag', $order['id'], true); } $invoice = $this->app->DB->SelectRow( sprintf( "SELECT id,storage_country, schreibschutz FROM rechnung WHERE auftragid = %d AND status <> 'storniert' ORDER BY id DESC LIMIT 1", $order['id'] ) ); if(!empty($invoice) && empty($invoice['storage_country'])) { $this->app->DB->Update( sprintf( "UPDATE rechnung SET storage_country = '%s', zuarchivieren = 0, schreibschutz = 0 WHERE id = %d AND storage_country = ''", $this->app->DB->real_escape_string($country), $invoice['id'] ) ); $this->app->erp->ANABREGSNeuberechnen($invoice['id'], 'rechnung'); if($invoice['schreibschutz']) { $this->app->erp->PDFArchivieren('rechunng', $invoice['id'], true); } } } } } } } // @refactor in Artikel Modul function artikelnummerscan($artikel) { $hauptprojekt = (int)$this->app->erp->Firmendaten('projekt'); $haupteanherstellerscanerlauben = $this->app->DB->Select("SELECT eanherstellerscanerlauben FROM projekt WHERE id = '$hauptprojekt' LIMIT 1"); $subwhere = ""; if($haupteanherstellerscanerlauben)$subwhere = 'or isnull(p.id)'; $artikelnummer = $this->app->erp->FirstTillSpace($artikel); $artikelid = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='$artikelnummer' AND geloescht!=1 LIMIT 1"); if(!$artikelid)$artikelid = $this->app->DB->Select("SELECT art.id FROM artikel art LEFT JOIN projekt p ON art.projekt = p.id WHERE (p.eanherstellerscanerlauben = 1 $subwhere) AND art.ean='$artikelnummer' AND art.ean != '' AND art.geloescht!=1 LIMIT 1"); if(!$artikelid)$artikelid = $this->app->DB->Select("SELECT art.id FROM artikel art LEFT JOIN projekt p ON art.projekt = p.id WHERE (p.eanherstellerscanerlauben = 1 $subwhere) AND art.herstellernummer='$artikelnummer' AND art.herstellernummer != '' AND art.geloescht!=1 LIMIT 1"); $this->RunHook('artikelnummerscan',2, $artikel, $artikelid); return $artikelid; } // @refactor in TemplateMessge Komponente function AddTplMsg($message) { if(!isset($this->app->User))return; if(!method_exists($this->app->User,'GetID'))return; $user = (int)$this->app->User->GetID(); $this->app->DB->Insert("INSERT INTO `templatemessage` (`message`, `user`, `zeitstempel`) VALUES ('".$this->app->DB->real_escape_string($message)."','$user',now())"); return $this->app->DB->GetInsertID(); } // @refactor in TemplateMessge Komponente function GetTmpMessageOut() { if(isset($this->app->Secure) && $this->app->Secure && method_exists($this->app->Secure, 'GetGET')) { $msgid = (int)$this->app->Secure->GetGET('msgid'); if($msgid)return $this->base64_url_decode($this->GetTplMessage($msgid)); return $this->base64_url_decode($this->app->Secure->GetGET('msg')); } return ''; } // @refactor in TemplateMessge Komponente function GetTplMessage($id) { if(!isset($this->app->User))return; if(!method_exists($this->app->User,'GetID'))return; $user = (int)$this->app->User->GetID(); return $this->app->DB->Select("SELECT `message` FROM `templatemessage` WHERE `user` = '$user' AND id = '$id' LIMIT 1"); } // @refactor in TemplateMessge Komponente function base64_url_encode($input) { return strtr(base64_encode($input), '+/=', '-_,'); } // @refactor in TemplateMessge Komponente function base64_url_decode($input) { return base64_decode(strtr($input, '-_,', '+/=')); } // @refactor in Session Klasse function ClearCookies() { if((!empty($_COOKIE)?count($_COOKIE):0) > 0) { foreach($_COOKIE as $key=>$value) { if($key!=str_replace("SpryMedia","",$key)) setcookie ($key, time() - 3600); } } } /** @deprecated */ function ManuelEcho($text) { echo $this->ClearDataBeforeOutput($text); exit; } // @refactor Formater Komponente function ClearDataBeforeOutput($text, $replaceEmptyFormAction = true) { if ((bool)$replaceEmptyFormAction === true) { $text = str_replace('form action=""','form action="#"',$text); } $text = str_replace('NONBLOCKINGZERO','',$text); $text = str_replace("'","'",$text); return $text; } function AdresseAnschriftString($id,$ansprechpartner=false) { /** @var Adresse $obj */ $obj = $this->LoadModul('adresse'); if(!empty($obj) && method_exists($obj, 'AdresseAnschriftString')) { return $obj->AdresseAnschriftString($id,$ansprechpartner); } return ''; } // @refactor BelegPositionen Widget function EinkaufspreiseTabelle($artikel, $divid = '') { if($this->RechteVorhanden('artikel','einkauf')) { $table = new EasyTable($this->app); $table->Query("SELECT if(CHAR_LENGTH(adr.name) > 20, CONCAT(SUBSTRING(adr.name,1,20),'...'), adr.name) as adrname, if(CHAR_LENGTH(e.bestellnummer) > 20, CONCAT(SUBSTRING(e.bestellnummer,1,20),'...'), e.bestellnummer) as bestellnummer, trim(e.ab_menge)+0 as ab, ". $this->FormatPreis("e.preis")." as preis, e.waehrung FROM einkaufspreise e LEFT JOIN adresse adr ON e.adresse = adr.id WHERE e.artikel = '$artikel' AND (e.gueltig_bis = '0000-00-00' OR isnull(e.gueltig_bis) OR gueltig_bis >= now() ) ORDER BY adrname, ab_menge"); return '

Einkaufspreise

'. $table->DisplayNew('return','Währung','noAction').' '; } return ''; } /** @deprecated */ function DokumentAbschickenPopup() { $module = $this->app->Secure->GetGET("module"); return "var horizontalPadding = 30; var verticalPadding = 30; $(''); /*$this->app->Tpl->Add('INLINEHELP','
'.$heading.'
');*/ } if(isset($inline[$module][$action]['weitereyoutube'])) { if(isset($inline[$module][$action]['weitereyoutube'][0])) { $weitereyoutube = $inline[$module][$action]['weitereyoutube']; }else{ $weitereyoutube[0] = $inline[$module][$action]['weitereyoutube']; } $this->app->Tpl->Add( 'INLINEHELP', '
' .((!empty($weitereyoutube)?count($weitereyoutube):0) > 2?'':'') .'
' ); foreach($weitereyoutube as $k => $v) { $objiframes['youtubeifr'.$k] = 'https://www.youtube.com/embed/'.$v['youtube'].'?rel=0'; $this->app->Tpl->Add( 'INLINEHELP', '
'.$v['titel'].'
' ); } $this->app->Tpl->Add( 'INLINEHELP', '
' .((!empty($weitereyoutube)?count($weitereyoutube):0) > 2?'
':'') .'
' ); } if(isset($inline[$module][$action]['description'])) { $this->app->Tpl->Add('INLINEHELP','
'.$inline[$module][$action]['description'].'
'); } if(!empty($inline[$module][$action]['extradescription'])) { preg_match_all( '//', $inline[$module][$action]['extradescription'], $pregerg ); if(!empty($pregerg) && !empty($pregerg[0])) { foreach($pregerg[0] as $pregKey => $pregVal) { $inline[$module][$action]['extradescription'] = str_replace( $pregVal, '', $inline[$module][$action]['extradescription'] ); } } $this->app->Tpl->Add('INLINEHELP','
'.$inline[$module][$action]['extradescription'].'
'); } if(!empty($inline[$module][$action]['site2'])) { $this->app->Tpl->Add( 'INLINEHEL2',$inline[$module][$action]['site2'] ); } if(isset($inline[$module][$action]['link']) || !empty($inline[$module][$action]['extralinks']) || !empty($inline[$module][$action]['extralinks3'])) { $inlinehelplink = true; $this->app->Tpl->Add( 'INLINEHELPLINK','
' ); if(isset($inline[$module][$action]['link'])) { $this->app->Tpl->Add( 'INLINEHELPLINK', '' ); } if(!empty($inline[$module][$action]['extralinks'])) { foreach($inline[$module][$action]['extralinks'] as $eLink => $eValue) { if(is_numeric($eLink)) { $this->app->Tpl->Add( 'INLINEHELPLINK', '' ); } else { $this->app->Tpl->Add( 'INLINEHELPLINK', '' ); } } } if(!empty($inline[$module][$action]['extralinks3'])) { foreach($inline[$module][$action]['extralinks3'] as $eLink => $eValue) { if(is_numeric($eLink)) { $this->app->Tpl->Add( 'INLINEHELP3', '' ); } else { $this->app->Tpl->Add( 'INLINEHELP3', '' ); } } } $this->app->Tpl->Add( 'INLINEHELPLINK','
' ); } $this->app->Tpl->Add('INLINEHELP',''); $include = true; if(is_string($inline[$module][$action])) { $this->app->Tpl->Set('INLINEHELP',$inline[$module][$action]); } } if(!$inlinehelplink) { //$this->app->Tpl->Add('INLINEHELPLINK','
'); $this->app->Tpl->Add('TABSPRINT', ' ' ); }else { $this->app->Tpl->Add('TABSPRINT', ' ' ); } $this->app->Tpl->Add('SCRIPTJAVASCRIPT',' '); if($this->app->User->GetParameter('tooltipinline_autoopen')) { $this->app->Tpl->Add('INLINEHELPOPEN', ' class="inlineautoopen" '); } $phone = str_replace(['-',' '],'', erpAPI::Ioncube_Property('phone_smb')); if(empty($phone)) { $this->app->Tpl->Set('BEFORESUPPORTPHONE', ''); } else { $this->app->Tpl->Set('SUPPORTPHONENUMBER', $phone); $sipuid = $this->app->erp->ModulVorhanden('sipgate') && $this->app->erp->GetPlacetelSipuid(); if(!empty($sipuid)) { $this->app->Tpl->Set('SIPGATEACTIVE', 1); $this->app->Tpl->Set('SUPPORTPHONENUMBERLINK', '#'); } else{ $this->app->Tpl->Set('SUPPORTPHONENUMBERLINK', 'tel://'.$phone); } } $this->app->Tpl->Parse('PAGE','tooltipinline.tpl'); } /** * @param array $faqs * @param string $target */ public function showInlineFaq($faqs, $target = 'INLINEHELP2') { $html = '
'; if(!empty($faqs)) { foreach($faqs as $faq) { $html .= '

'.$faq['question'].'

'.$faq['answer'].'
'; } } $html .= '
'; $this->app->Tpl->Add($target, $html); } /**@deprected**/ function HelpIcon() { $module = $this->app->Secure->GetGET("module"); $action = $this->app->Secure->GetGET("action"); } /**@deprected**/ function PrinterIcon() { // $this->app->Tpl->Add('TABSPRINT'," "); } // @refactor Auftrag Modul function SaldoAdresseAuftrag($adresse) { return $this->app->DB->Select("SELECT SUM(gesamtsumme) FROM auftrag WHERE adresse='$adresse' AND status='freigegeben' LIMIT 1"); } // @refactor Adresse Modul function UmsatzAdresseAuftragJahr($adresse) { return $this->app->DB->Select("SELECT SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1))) FROM auftrag_position ap LEFT JOIN auftrag a ON ap.auftrag=a.id WHERE (a.status='freigegeben' OR a.status='abgeschlossen') AND DATE_FORMAT(a.datum,'%Y')=DATE_FORMAT(NOW(),'%Y') AND a.adresse='$adresse'"); //"SELECT SUM(gesamtsumme) FROM auftrag WHERE adresse='$adresse' AND status='freigegeben' // AND DATE_FORMAT(datum,'%Y')=DATE_FORMAT(NOW(),'%Y') LIMIT 1"); } // @refactor Adresse Modul function UmsatzAdresseRechnungJahr($adresse) { return $this->app->DB->Select("SELECT SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1))) FROM rechnung_position ap LEFT JOIN rechnung a ON ap.rechnung=a.id WHERE (a.status='freigegeben' OR a.status='abgeschlossen' OR a.status='versendet') AND DATE_FORMAT(a.datum,'%Y')=DATE_FORMAT(NOW(),'%Y') AND a.adresse='$adresse'"); } // @refactor Adresse Modul function SaldoAdresse($adresse) { return $this->KundenSaldo($adresse); } // @refactor Adresse Modul public function KundenSaldo($adresse){ if(!is_numeric($adresse) || $adresse <= 0){ return 0; } $rechnungs = $this->app->DB->Select("SELECT IFNULL(SUM(soll-ist),0) FROM rechnung WHERE status != 'angelegt' AND zahlungsstatus != 'bezahlt' AND adresse = '$adresse'"); $gutschrifts = $this->app->DB->Select("SELECT IFNULL(SUM(soll-ist),0) FROM gutschrift WHERE status != 'angelegt' AND (manuell_vorabbezahlt = '0000-00-00' OR manuell_vorabbezahlt IS NULL) AND zahlungsstatus != 'bezahlt' AND adresse = '$adresse'"); $kundensaldo = $rechnungs - $gutschrifts; $kundensaldo = round($kundensaldo, 2); return $kundensaldo; } // @refactor Produktion Modul function genLvl($id, $typ = '') { if($typ !== 'produktion') { return; } } // @refactor Auftrag Modul function AuftragExplodieren($auftrag,$typ="", $listeexplodieren = null) { if($typ==='produktion') { } else { $auftraege = $this->app->DB->SelectRow("SELECT * FROM auftrag WHERE (status='freigegeben' OR status='angelegt') AND id='$auftrag'"); $projektlager = 0; } $adresse = $auftraege['adresse']; $projekt = $auftraege['projekt']; $status= $auftraege['status']; /** * Die nächsten vier Zeilen zur projektabhängigen Stücklistenanpassung */ if($projekt > 0) { if (!$listeexplodieren && ($this->app->DB->Select("SELECT autostuecklistenanpassung FROM projekt WHERE id='$projekt' LIMIT 1")) == 0) { return; } if($typ !== 'produktion') { $projektlager = $this->app->DB->Select("SELECT id FROM projekt WHERE id = $projekt AND projektlager = 1 LIMIT 1"); } } if($status!=='freigegeben' && $status!=='angelegt'){ return; } if($typ==='produktion') { } else { if($listeexplodieren) { $swhere = null; foreach($listeexplodieren as $v) { $swhere[] = " ap.id = '$v' "; } $swhere = ' ('.implode(' OR ', $swhere).') '; $artikelarr= $this->app->DB->SelectArr( "SELECT ap.* ,art.lagerartikel, art.keineeinzelartikelanzeigen,art.juststueckliste,art.stueckliste FROM auftrag_position AS ap LEFT JOIN artikel AS art ON ap.artikel = art.id WHERE ap.auftrag='$auftrag' AND (ap.geliefert_menge < ap.menge AND ap.geliefert=0) AND $swhere"); } else { $artikelarr= $this->app->DB->SelectArr( "SELECT ap.* ,art.lagerartikel, art.keineeinzelartikelanzeigen,art.juststueckliste,art.stueckliste FROM auftrag_position AS ap LEFT JOIN artikel AS art ON ap.artikel = art.id WHERE ap.auftrag='$auftrag' AND (ap.geliefert_menge < ap.menge AND ap.geliefert=0)" ); } } $treffer=0; // Lager Check $positionen_vorhanden = 0; $artikelzaehlen=0; $changed = false; if($artikelarr) { for($k=0;$k<(!empty($artikelarr)?count($artikelarr):0); $k++) { $menge = $artikelarr[$k]['menge'] - $artikelarr[$k]['geliefert_menge']; $artikel = $artikelarr[$k]['artikel']; $artikel_position_id = $artikelarr[$k]['id']; // pruefe artikel 12 menge 4 $lagerartikel = $artikelarr[$k]['lagerartikel']; $keineeinzelartikelanzeigen = $artikelarr[$k]['keineeinzelartikelanzeigen']; //if($artikelarr[$k][nummer]!="200000" && $artikelarr[$k][nummer]!="200001" && $artikelarr[$k][nummer]!="200002" && $lagerartikel==1) //if($lagerartikel==1) //if($artikelarr[$k][nummer]!="200000" && $artikelarr[$k][nummer]!="200001" && $artikelarr[$k][nummer]!="200002" ) { //echo "Artikel $artikel Menge $menge"; // schaue ob es ein JUST Stuecklisten artikel ist der nicht explodiert ist $just_stueckliste = $artikelarr[$k]['juststueckliste']; if($typ==='produktion') { } else { $explodiert = $artikelarr[$k]['explodiert']; $menge = $artikelarr[$k]['menge']; $sort = $artikelarr[$k]['sort']; if($changed) { $positionRow = $this->app->DB->SelectRow(sprintf('SELECT explodiert,menge,sort FROM auftrag_position WHERE id=%d LIMIT 1', (int)$artikel_position_id)); $explodiert = $positionRow['explodiert']; $menge = $positionRow['menge']; $sort = $positionRow['sort']; } if($listeexplodieren && in_array($artikel_position_id, $listeexplodieren)) { $just_stueckliste = 1; } $waehrung = $this->app->DB->real_escape_string($artikelarr[$k]['waehrung']);// $this->app->DB->real_escape_string($this->app->DB->Select("SELECT waehrung FROM auftrag_position WHERE id = '$artikel_position_id' LIMIT 1")); if($just_stueckliste && !$explodiert && ($preproducedpartlist = $this->getPreproducedPartlistFromArticle($artikel)) && (($partlistsellable = $this->ArtikelAnzahlVerkaufbar($preproducedpartlist, $projektlager)) > 0) && round($partlistsellable,7) >= round($menge,7)) { $preproducednummer = $this->app->DB->real_escape_string($this->app->DB->Select("SELECT nummer FROM artikel WHERE id = $preproducedpartlist")); $changed = true; if(round($partlistsellable,7) >= round($menge,7)){ $just_stueckliste = 0; $lagerartikel = 1; $this->app->DB->Update("UPDATE auftrag_position SET artikel = $preproducedpartlist,nummer = '$preproducednummer' WHERE id = " . $artikel_position_id); $this->app->DB->Update( sprintf( 'UPDATE `artikel` SET `laststorage_changed` = NOW() WHERE `id` = %d', $preproducedpartlist ) ); $order_obj = $this->app->erp->LoadModul('auftrag'); if(!empty($order_obj) && method_exists($order_obj,'removeExplodedArticles')){ $order_obj->removeExplodedArticles($auftrag, $artikel_position_id); } }else{ $preproducedart = $artikelarr[$k]; $preproducedart['sort'] = $sort; $preproducedart['menge'] = $partlistsellable; $preproducedart['artikel'] = $preproducedpartlist; $preproducedart['nummer'] = $preproducednummer; if(is_null($preproducedart['steuersatz'])) { $preproducedart['steuersatz'] = -1; } unset($preproducedart['id']); $preproducedart['id'] = $this->app->DB->InsertArr('auftrag_position','id',$preproducedart,true); $sort++; $this->app->DB->Update("UPDATE auftrag_position SET menge = menge - $partlistsellable,sort = $sort WHERE id = " . $artikel_position_id); $this->app->DB->Update( sprintf( 'UPDATE `artikel` SET `laststorage_changed` = NOW() WHERE `id` = %d', $preproducedpartlist ) ); } $this->app->DB->Update( sprintf( 'UPDATE `artikel` SET `laststorage_changed` = NOW() WHERE `id` = %d', $artikel ) ); } } //$artikel_von_stueckliste = $this->app->DB->SelectArr("SELECT * FROM stueckliste WHERE stuecklistevonartikel='$artikel' AND art!='it' AND art!='bt'"); // mengen anpassung /* // Dieses Feature stammt aus uralten Zeiten von WaWision - habs heute enternt 30.12.2018 BS da wenn man an der Stückliste was anpasst das auch dann so bleiben soll if($just_stueckliste=="1" && $explodiert=="1")// && $max=="9898989") { foreach($artikel_von_stueckliste as $key=>$value) { $menge_st =$value['menge']*$menge; if($typ=="produktion") { } else { $this->app->DB->Update("UPDATE auftrag_position SET menge='{$menge_st}' WHERE explodiert_parent='$artikel_position_id' AND artikel='{$value['artikel']}'"); } } } */ // darunter war ein else if if($just_stueckliste=="1" && $explodiert=="0") { $checklieferkette = 0; if($typ === 'auftrag'){ $checklieferkette = $this->app->DB->Select("SELECT id FROM lieferkette_bestellung WHERE belegtyp='auftrag' AND belegid='$auftrag' LIMIT 1"); } if($checklieferkette > 0){ $artikel_von_stueckliste = $this->app->DB->SelectArr( "SELECT s.*, art.nummer AS artnummer,art.projekt AS artprojekt FROM stueckliste AS s INNER JOIN artikel AS art ON s.artikel = art.id WHERE s.stuecklistevonartikel='$artikel' AND s.art!='it' AND s.art!='bt'" ); } else{ $artikel_von_stueckliste = $this->app->DB->SelectArr( "SELECT s.*, art.nummer AS artnummer,art.projekt AS artprojekt FROM stueckliste AS s INNER JOIN artikel AS art ON s.artikel = art.id WHERE s.stuecklistevonartikel='$artikel'" ); } $treffer++; $changed = true; //hole artikel von stueckliste // schiebe alle artikel nach hinten $erhoehe_sort = !empty($artikel_von_stueckliste)?count($artikel_von_stueckliste):0; if($typ==='produktion') { } else { $this->app->DB->Update("UPDATE auftrag_position SET sort=sort+$erhoehe_sort WHERE auftrag='$auftrag' AND sort > $sort"); } if(!empty($artikel_von_stueckliste)){ foreach ($artikel_von_stueckliste as $key => $value) { $sort++; $nummer = $value['artnummer']; $projekt_artikel = $value['artprojekt']; if($projekt_artikel > 0) $projekt = $projekt_artikel; if($typ === 'produktion'){ }else{ $explodiert_id = $this->AddAuftragPositionNummer($auftrag, $nummer, $value['menge'] * $menge, $projekt, 1, false, "", array('forceartikelid' => $value['artikel'])); $this->app->DB->Update( sprintf( 'UPDATE `artikel` SET `laststorage_changed` = NOW() WHERE `id` = %d', $artikel ) ); if($waehrung != '') $this->app->DB->Update("UPDATE auftrag_position SET waehrung='" . $waehrung . "' WHERE id='$explodiert_id' LIMIT 1"); $this->app->DB->Update("UPDATE auftrag_position SET einkaufspreis='0',einkaufspreisurspruenglich=0 WHERE id='$explodiert_id' AND preis=0"); $this->app->DB->Update("UPDATE auftrag_position SET ausblenden_im_pdf='" . ($keineeinzelartikelanzeigen == 1 ? 1 : 0) . "' WHERE id='$explodiert_id' "); $this->app->DB->Update("UPDATE auftrag_position SET explodiert_parent='$artikel_position_id',sort='$sort',ohnepreis=1 WHERE id='$explodiert_id' LIMIT 1"); if($this->app->DB->Select("SELECT id FROM artikel WHERE id = '" . $value['artikel'] . "' AND (juststueckliste = 1 " . ($listeexplodieren ? " OR stueckliste = 1 " : '') . ") LIMIT 1")) $this->app->DB->Update("UPDATE auftrag_position SET explodiert = 1 WHERE id='$explodiert_id' LIMIT 1"); if($this->Firmendaten('auftragexplodieren_unterstuecklisten')) $this->app->DB->Update("UPDATE auftrag_position SET explodiert = 0 WHERE id = '$explodiert_id' LIMIT 1"); $this->app->DB->Update("UPDATE `beleg_zwischenpositionen` SET pos = pos + 1 WHERE doctype = 'auftrag' AND doctypeid = '$auftrag' AND pos >= '" . ($sort - 1) . "' "); } } } // MLM wenn mlm und der artikel explodiert ist alle punkte platt machen if($typ==='auftrag' && $this->Firmendaten('modul_mlm')=='1') { $this->app->DB->Update("UPDATE auftrag_position SET mlmdirektpraemie=0, bonuspunkte=0,punkte=0 WHERE explodiert_parent='$artikel_position_id'"); } if($typ==='produktion') { } else { $this->app->DB->Update("UPDATE auftrag_position SET explodiert='1' WHERE id='$artikel_position_id' LIMIT 1"); } } } } } if($typ==='produktion'){ $this->ANABREGSNeuberechnen($auftrag, 'produktion'); } if($typ==='auftrag'){ $this->ANABREGSNeuberechnen($auftrag, 'auftrag'); } } // @refactor Auftrag Modul public function AuftragEinzelnBerechnen($auftrag,$festreservieren=false) { if($auftrag <=0) { return; } $this->AuftragExplodieren($auftrag); $this->BerechneDeckungsbeitrag($auftrag,"auftrag"); $auftragarr = $this->app->DB->SelectRow("SELECT projekt,internet FROM auftrag WHERE id = '$auftrag' LIMIT 1"); if(empty($auftragarr)) { return; } /* $internet = $auftragarr['internet'];//$this->app->DB->Select("SELECT internet FROM auftrag WHERE id = '$auftrag' LIMIT 1"); if(empty($internet)){ $this->LoadSteuersaetzeWaehrung($auftrag,'auftrag'); }*/ // reservieren nur wenn es manuell gemacht wurde oder im auftrag fest steht $projekt = $auftragarr['projekt']; $reservierung = $this->Projektdaten($auftragarr['projekt'], 'reservierung');// $this->app->DB->Select("SELECT reservierung FROM projekt WHERE id='$projekt' LIMIT 1"); if($reservierung=="1" || $festreservieren){ $this->AuftragReservieren($auftrag); } $this->AuftragAutoversandBerechnen($auftrag); } // @refactor Auftrag Modul function AuftragAutoversandBerechnen($auftrag) { $toleranz = (float)str_replace(',','.', $this->app->erp->GetKonfiguration('zahlungseingang_toleranz')); if($toleranz < 0)$toleranz = 0; $auftraege = $this->app->DB->SelectArr("SELECT * FROM auftrag WHERE id='$auftrag'"); $adresse = $auftraege[0]['adresse']; $artikelarr= $this->app->DB->SelectArr("SELECT ap.id, ap.artikel, ap.menge, ap.geliefert_menge, art.lagerartikel as artlagerartikel FROM auftrag_position ap LEFT JOIN artikel art ON ap.artikel = art.id WHERE ap.auftrag='$auftrag' AND ap.geliefert_menge < ap.menge AND ap.geliefert=0"); //pruefe ob es mindestens eine reservierung gibt $reservierte = $this->app->DB->Select("SELECT COUNT(id) FROM lager_reserviert WHERE adresse='$adresse' AND datum>=NOW() AND objekt!='lieferschein'"); if($reservierte >0 && $auftraege[0]['reserviert_ok'] != 1) { $this->app->DB->Update("UPDATE auftrag SET reserviert_ok='1' WHERE id='$auftrag' LIMIT 1"); } elseif($reservierte <= 0 && $auftraege[0]['reserviert_ok'] != 0) { $this->app->DB->Update("UPDATE auftrag SET reserviert_ok='0' WHERE id='$auftrag' LIMIT 1"); } // liefertermin $liefertermincheck = $this->app->DB->Select("SELECT id FROM auftrag WHERE (tatsaechlicheslieferdatum<=NOW() OR tatsaechlicheslieferdatum IS NULL OR tatsaechlicheslieferdatum='0000-00-00') AND id='$auftrag'"); if($liefertermincheck >0 && $auftraege[0]['liefertermin_ok'] != 1) { $this->app->DB->Update("UPDATE auftrag SET liefertermin_ok='1' WHERE id='$auftrag' LIMIT 1"); } elseif($liefertermincheck <= 0 && $auftraege[0]['liefertermin_ok'] != 0) { $this->app->DB->Update("UPDATE auftrag SET liefertermin_ok='0' WHERE id='$auftrag' LIMIT 1"); } //liefersperre $liefersperre = $this->app->DB->Select("SELECT liefersperre FROM adresse WHERE id='$adresse'"); if($liefersperre >0 && $auftraege[0]['liefersperre_ok'] != 0) { $this->app->DB->Update("UPDATE auftrag SET liefersperre_ok='0' WHERE id='$auftrag' LIMIT 1"); } elseif($liefersperre <= 0 && $auftraege[0]['liefersperre_ok'] != 1){ $this->app->DB->Update("UPDATE auftrag SET liefersperre_ok='1' WHERE id='$auftrag' LIMIT 1"); } //kreditlimit $kreditlimit_freigabe = $auftraege[0]['kreditlimit_freigabe'] ;// $this->app->DB->Select("SELECT kreditlimit_freigabe FROM auftrag WHERE id='$auftrag' LIMIT 1"); $setKreditLimitOk = $kreditlimit_freigabe=='1' || $this->KundeHatZR($adresse) || $this->KreditlimitCheck($adresse)==true; if($setKreditLimitOk && $auftraege[0]['kreditlimit_ok'] != 1) { $this->app->DB->Update("UPDATE auftrag SET kreditlimit_ok='1' WHERE id='$auftrag' LIMIT 1"); } elseif(!$setKreditLimitOk && $auftraege[0]['kreditlimit_ok'] != 0) { $this->app->DB->Update("UPDATE auftrag SET kreditlimit_ok='0' WHERE id='$auftrag' LIMIT 1"); } if($auftraege[0]['ust_ok'] != 1 && ($auftraege[0]['ust_befreit']==0 || ($auftraege[0]['ust_befreit']==1 && $auftraege[0]['ustid']==''))) { $this->app->DB->Update("UPDATE auftrag SET ust_ok='1' WHERE id='$auftrag' LIMIT 1"); } // Lager Check $positionen_vorhanden = 0; $artikelzaehlen=0; $cartikelarr = $artikelarr?count($artikelarr):0; for($k=0;$k<$cartikelarr; $k++) { $menge = $artikelarr[$k]['menge'] - $artikelarr[$k]['geliefert_menge']; $artikel = $artikelarr[$k]['artikel']; $artikel_position_id = $artikelarr[$k]['id']; $lagerartikel = $artikelarr[$k]['artlagerartikel']; if($lagerartikel==1) { // wenn artikel oefters im Auftrag nehme gesamte summe her $gesamte_menge_im_auftrag= $this->app->DB->Select("SELECT SUM(menge-geliefert_menge) FROM auftrag_position WHERE auftrag='$auftrag' AND artikel='$artikel'"); if($gesamte_menge_im_auftrag > $menge) { $menge = $gesamte_menge_im_auftrag; } $artikelzaehlen++; if($this->LagerCheck($adresse,$artikel,$menge,"auftrag",$auftrag)>0) { $positionen_vorhanden++; } elseif($positionen_vorhanden > 0) { break; } //else { if($auftrag==314) {echo "Artikel $artikel Menge $menge";exit;} } } } $projekt = $this->app->DB->Select("SELECT projekt FROM auftrag WHERE id='$auftrag' LIMIT 1"); $this->app->DB->Update("UPDATE auftrag SET teillieferung_moeglich='0' WHERE id='$auftrag' LIMIT 1"); //echo "$positionen_vorhanden $artikelzaehlen
"; if($positionen_vorhanden==$artikelzaehlen){ $this->app->DB->Update("UPDATE auftrag SET lager_ok='1' WHERE id='$auftrag' LIMIT 1"); } else { $kommissionierverfahren = $this->app->DB->Select("SELECT kommissionierverfahren FROM projekt WHERE id = '$projekt' LIMIT 1"); if($kommissionierverfahren == 'rechnungsmail') { $this->app->DB->Update("UPDATE auftrag SET lager_ok='1' WHERE id='$auftrag' LIMIT 1"); }else{ $this->app->DB->Update("UPDATE auftrag SET lager_ok='0' WHERE id='$auftrag' LIMIT 1"); } if($positionen_vorhanden > 0 && $artikelzaehlen > 0) { $this->app->DB->Update("UPDATE auftrag SET teillieferung_moeglich='1' WHERE id='$auftrag' LIMIT 1"); } } // projekt check start $projektcheck = 0; $projektcheckname = 0; $projektportocheck = 0; $projektnachnahmecheck = 0; $projektarr = empty($projekt)?null:$this->app->DB->SelectRow("SELECT * FROM projekt WHERE id='$projekt' LIMIT 1"); if(!empty($projektarr)){ $projektcheck = $projektarr['checkok']; $projektcheckname = $projektarr['checkname']; $projektportocheck = $projektarr['portocheck']; $projektnachnahmecheck = $projektarr['nachnahmecheck']; } $altercheck = $this->app->DB->Select("SELECT check_ok FROM auftrag WHERE id='$auftrag' LIMIT 1"); if($projektcheck=='1' && @is_file(dirname(__FILE__)."/../plugins/class.".$projektcheckname.".php")) { //echo "projekt check $projektcheckname notwendig"; if(file_exists(dirname(__DIR__).'/plugins/class.'.$projektcheckname.'.php') && !class_exists('unishop')) { include_once dirname(__DIR__).'/plugins/class.'.$projektcheckname.'.php'; } if(class_exists('unishop')){ $tmp = new unishop($this->app); if($tmp->CheckOK($auftrag)) { $this->app->DB->Update("UPDATE auftrag SET check_ok='1' WHERE id='$auftrag' LIMIT 1"); } else{ $this->app->DB->Update("UPDATE auftrag SET check_ok='0' WHERE id='$auftrag' LIMIT 1"); } }else{ $this->app->DB->Update("UPDATE auftrag SET check_ok='1' WHERE id='$auftrag' LIMIT 1"); } } else{ $this->app->DB->Update("UPDATE auftrag SET check_ok='1' WHERE id='$auftrag' LIMIT 1"); } $this->RunHook('auftragcheck', 2, $auftrag, $altercheck); // autopruefung anstubsen //$this->AutoUSTPruefung($adresse); // UST Check // pruefe adresse 23 ust innerhalb 3 tagen vorhanden? wenn nicht schaue ob selber ordern kann wenn ja ordern und auf gruen $ustprf = $this->app->DB->Select("SELECT id FROM ustprf WHERE DATE_FORMAT(datum_online,'%Y-%m-%d')=DATE_FORMAT(NOW(),'%Y-%m-%d') AND adresse='$adresse' AND status='erfolgreich' LIMIT 1"); $ustid = ''; $ust_befreit = ''; $land = ''; $auftragarr = $this->app->DB->SelectRow("SELECT * FROM auftrag WHERE id='$auftrag' LIMIT 1"); if(!empty($auftragarr)){ $ustid = $auftragarr['ustid']; $ust_befreit = $auftragarr['ust_befreit']; $land = $auftragarr['land']; } if($auftragarr['ust_ok'] != 1 && ($ust_befreit==0 || ($ust_befreit==1 && $ustid==''))) { $this->app->DB->Update("UPDATE auftrag SET ust_ok='1' WHERE id='$auftrag' LIMIT 1"); } // Porto Check // sind versandkosten im auftrag $porto = $this->app->DB->Select("SELECT 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 AND a.id=ap.artikel LIMIT 1"); $keinporto = 0; $selbstabholer = ''; $projekt = 0; $checkkeinportocheck = 0; if(!empty($auftragarr)) { $keinporto = $auftragarr['keinporto']; $selbstabholer = $auftragarr['versandart']; $projekt = $auftragarr['projekt']; // portocheck bei projekt $checkkeinportocheck = $this->app->DB->Select("SELECT keinportocheck FROM versandarten WHERE type = '".$this->app->DB->real_escape_string($auftragarr['versandart'])."' AND (projekt = '$projekt' OR projekt = 0) ORDER BY projekt = '$projekt' DESC LIMIT 1"); } if($selbstabholer=='selbstabholer' || $selbstabholer=='keinversand' || $checkkeinportocheck=="1") { $keinporto=1; } if($projektportocheck==1) { if($porto > 0){ $this->app->DB->Update("UPDATE auftrag SET porto_ok='1' WHERE id='$auftrag' LIMIT 1"); } else{ $portoFreeLimit = (double) $this->app->DB->Select("SELECT portofreiab FROM adresse WHERE id={$adresse} LIMIT 1"); $parcelValue = (double) $auftragarr['gesamtsumme']; if(!empty($portoFreeLimit) && !empty($parcelValue) && $parcelValue > $portoFreeLimit){ $this->app->DB->Update("UPDATE auftrag SET porto_ok='1' WHERE id='$auftrag' LIMIT 1"); }else{ $this->app->DB->Update("UPDATE auftrag SET porto_ok='0' WHERE id='$auftrag' LIMIT 1"); } } } else { //projekt hat kein portocheck porto ist immer ok $this->app->DB->Update("UPDATE auftrag SET porto_ok='1' WHERE id='$auftrag' LIMIT 1"); } if($keinporto==1 || $selbstabholer=='selbstabholer') { $this->app->DB->Update("UPDATE auftrag SET porto_ok='1' WHERE id='$auftrag' LIMIT 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 $auftrag_ist_vorkasse = false; $summe_eingang = 0; $auftrag_gesamtsumme = 0; $zahlungsweise = ''; $vorabbezahltmarkieren = 0; if(!empty($auftragarr)) { $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"); $vorabbezahltmarkieren = $auftragarr['vorabbezahltmarkieren'];// $this->app->DB->Select("SELECT vorabbezahltmarkieren FROM auftrag WHERE id='$auftrag' LIMIT 1"); $waehrung = $auftragarr['waehrung']; } $zahlungsweise = strtolower($zahlungsweise); // Check behaviour $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') { $auftrag_ist_vorkasse = true; } } else if ($zahlungsweise == 'vorkasse') { $auftrag_ist_vorkasse = true; } // Check fibu_buchungen saldo $saldo = $this->app->erp->GetSaldoDokument($auftrag,'auftrag'); if (!empty($saldo)) { if ($saldo['waehrung'] == $waehrung && $saldo['betrag'] >= $auftrag_gesamtsumme) { $saldo_ok = true; } } // Decide condition if ($auftrag_ist_vorkasse && !$saldo_ok && !$vorabbezahltmarkieren) { $vorkasse_ok = '0'; } else { $vorkasse_ok = '1'; } $this->app->DB->Update("UPDATE auftrag SET vorkasse_ok='$vorkasse_ok' WHERE id='$auftrag'"); //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 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 AND a.id=ap.artikel"); if($zahlungsweise=="nachnahme" && $nachnahme <2 && $projektnachnahmecheck==1){ $this->app->DB->Update("UPDATE auftrag SET nachnahme_ok='0' WHERE id='$auftrag' LIMIT 1"); } else{ $this->app->DB->Update("UPDATE auftrag SET nachnahme_ok='1' WHERE id='$auftrag' LIMIT 1"); } $lieferungtrotzsperre = $this->app->DB->Select("SELECT lieferungtrotzsperre FROM auftrag WHERE id='$auftrag' LIMIT 1"); if($lieferungtrotzsperre==1){ $this->app->DB->Update("UPDATE auftrag SET liefersperre_ok='1' WHERE id='$auftrag' LIMIT 1"); } } // @refactor Lieferschein Modul public function LieferscheinCheck($lieferschein) { $obj = $this->LoadModul('lieferschein'); if(!empty($obj) && method_exists($obj, 'LieferscheinCheck')){ return $obj->LieferscheinCheck($lieferschein); } } // @refactor Formater Komponente public function EUR($betrag) { return number_format($betrag,2,',','.'); } // @refactor Adresse Modul public function KreditlimitCheck($adresse) { if($adresse <= 0) { return true; } $kreditlimit = $this->app->DB->Select("SELECT kreditlimit FROM adresse WHERE id='$adresse' LIMIT 1"); if($kreditlimit <=0) { return true; } // offene Rechnungen $rechnungen = $this->SaldoAdresse($adresse); $auftraege = $this->SaldoAdresseAuftrag($adresse); return $kreditlimit >= ($rechnungen+$auftraege); } // @refactor FormHelper Komponente public function ReplaceBetrag($db,$value,$fromform = null) { // wenn ziel datenbank if($db) { // wenn . und , vorhanden dann entferne punkt $pos_punkt = strrpos($value, '.'); $pos_komma = strrpos($value, ','); if(($pos_punkt !== false) && ($pos_komma !== false)){ if($pos_punkt < $pos_komma){ $value = str_replace('.', '', $value); }else{ $value = str_replace(',', '', $value); } } return str_replace(',','.',$value); } // wenn ziel formular if ($value != "") { //return $abkuerzung; if($value == round((float) $value, 2)) { return number_format((float)$value,2,',',''); } } return rtrim(str_replace('.',',',$value),'0'); } // @refactor FormHelper Komponente function ReplaceAdresse($db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(!$fromform) { $dbformat = 1; $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT CONCAT(id,' ',name) FROM adresse WHERE id='$id' AND geloescht=0 LIMIT 1"); }else{ $abkuerzung = ''; } } else { $dbformat = 0; $abkuerzung = $value; $tmp = trim($value); $rest = explode(" ",$tmp); $rest = $rest[0]; $id = $this->app->DB->Select("SELECT id FROM adresse WHERE id='$rest' AND geloescht=0 LIMIT 1"); if($id <=0) $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular return $abkuerzung; } // @refactor FormHelper Komponente function ReplaceMitarbeiter($db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(!$fromform) { $dbformat = 1; $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT CONCAT(mitarbeiternummer,' ',name) FROM adresse WHERE id='$id' AND geloescht=0 LIMIT 1"); }else{ $abkuerzung = ''; } } else { $dbformat = 0; $abkuerzung = $value; $tmp = trim($value); $rest = explode(" ",$tmp); $rest = $rest[0]; $id = $this->app->DB->Select("SELECT id FROM adresse WHERE mitarbeiternummer='$rest' AND mitarbeiternummer!='' AND geloescht=0 LIMIT 1"); if($id <=0) $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular return $abkuerzung; } // @refactor FormHelper Komponente function ReplaceGruppenKategorien($db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(!$fromform) { $dbformat = 1; $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT CONCAT(id,' ',bezeichnung) as name FROM gruppen_kategorien WHERE id='$id' LIMIT 1"); }else{ $abkuerzung = ''; } } else { $dbformat = 0; $abkuerzung = $value; // wenn nummer keine DB id ist! $tmp = trim($value); $rest = explode(" ",$tmp); $rest = (int)$rest[0]; $id = $this->app->DB->Select("SELECT id FROM gruppen_kategorien WHERE id='$rest' LIMIT 1"); if($id <=0) $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular return $abkuerzung; } public function ReplacePreisgruppe($db,$value,$fromform) { $dbformat = 0; if(!$fromform) { $dbformat = 1; $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT CONCAT(g.kennziffer,' ',g.name) as name FROM gruppen g WHERE id='$id' LIMIT 1"); }else{ $abkuerzung =''; } if($id==0 || $id=='') { $abkuerzung =''; } } else { $dbformat = 0; $abkuerzung = $value; // wenn nummer keine DB id ist! $tmp = trim($value); $rest = explode(" ",$tmp); $rest = $rest[0]; $id = $this->app->DB->Select("SELECT id FROM gruppen AS g WHERE (CONCAT(g.kennziffer,' ',g.name)='$value' OR g.kennziffer = '$rest') AND (g.name!='' OR g.kennziffer != '') AND g.art = 'preisgruppe' AND g.aktiv=1 LIMIT 1"); if($id <=0) $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular return $abkuerzung; } // @refactor FormHelper Komponente function ReplaceArtikel($db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(!$fromform) { $dbformat = 1; $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT CONCAT(nummer,' ',name_de) as name FROM artikel WHERE id='$id' AND geloescht=0 LIMIT 1"); }else{ $abkuerzung =''; } if($id==0 || $id=="") $abkuerzung =""; } else { $dbformat = 0; $abkuerzung = $value; // wenn nummer keine DB id ist! $tmp = trim($value); $rest = explode(" ",$tmp); $rest = $rest[0]; $id = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='$rest' AND nummer!='' AND geloescht=0 LIMIT 1"); if($id <=0) $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular return $abkuerzung; } // @refactor Formater Komponente function FormatMengeBetrag($value) { if(strpos($value,'.') !== false) { $pos = strpos($value,'.'); $value = rtrim($value,'0'); if(strlen($value) <= $pos + 2) { $value .= '0'; } if(strlen($value) <= $pos + 2) { $value .= '0'; } }else { $value .= '.00'; } if($value[0] === '.') { $value = '0'.$value; } return $value; } // @refactor FormHelper Komponente function ReplaceMengeBetrag($db,$value,$fromform) { $dbformat = 0; if(strpos($value,'.') > 0) { $dbformat = 1; } // wenn ziel datenbank if($db) { if($dbformat) { return $value; } if($value!=''){ return str_replace(',', '.', $value); } return ''; } // wenn ziel formular $value = str_replace('.',',',$this->FormatMengeBetrag($value)); if($dbformat) { if($value!='') { return $value; } return ''; } return $value; } // @refactor FormHelper Komponente function ReplaceMenge($db,$value,$fromform) { $tcheck = str_replace(',','.',$value); if($tcheck < 0) { return 1; } $dbformat = 0; if(strpos($value,'.') > 0) { $dbformat = 1; } // wenn ziel datenbank if($db) { if($dbformat) { return $value; } if($value!=''){ return str_replace(',', '.', $value); } return ''; } // wenn ziel formular if(strpos($value,'.') !== false) { $value = rtrim(rtrim($value,'0'),'.'); if($value[0] === '.') { $value = '0'.$value; } } if($dbformat) { if($value!='') { return str_replace('.',',',$value); } return ''; } return $value; } // @refactor FormHelper Komponente function ReplaceDecimal($db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(strpos($value,'.') > 0) { $dbformat = 1; } // wenn ziel datenbank if($db) { if($dbformat) { return $value; } if($value!=''){ return str_replace(',', '.', $value); } return ''; } // wenn ziel formular if($dbformat) { if($value!='') { return $value; } return ''; } return $value; } // @refactor FormHelper Komponente function ReplaceZeit($db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(strlen($value) > 5) $dbformat = 1; // wenn ziel datenbank if($db) { if($dbformat) return $value; else return $this->app->String->Convert($value,"%1:%2","%1:%2:00"); } // wenn ziel formular else { if($dbformat) return $this->app->String->Convert($value,"%1:%2:%3","%1:%2"); else return $value; } } // @refactor FormHelper Komponente function ReplaceDatum($db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(strpos($value,'-') > 0) $dbformat = 1; // wenn ziel datenbank if($db) { if($dbformat) { return $value; } if($value!=''){ return $this->app->String->Convert($value, "%1.%2.%3", "%3-%2-%1"); } return ''; } // wenn ziel formular if($dbformat) { if($value!='') { return $this->app->String->Convert($value,'%1-%2-%3','%3.%2.%1'); } return ''; } return $value; } // @refactor FormHelper Komponente function ReplacePreisanfrage($db,$value,$fromform) { return $this->ReplaceANABRELSGSBE("preisanfrage",$db,$value,$fromform); } // @refactor FormHelper Komponente function ReplaceAngebot($db,$value,$fromform) { return $this->ReplaceANABRELSGSBE("angebot",$db,$value,$fromform); } // @refactor FormHelper Komponente function ReplaceLieferschein($db,$value,$fromform) { return $this->ReplaceANABRELSGSBE("lieferschein",$db,$value,$fromform); } // @refactor FormHelper Komponente function ReplaceAuftrag($db,$value,$fromform) { return $this->ReplaceANABRELSGSBE("auftrag",$db,$value,$fromform); } // @refactor FormHelper Komponente function ReplaceRechnung($db,$value,$fromform) { return $this->ReplaceANABRELSGSBE("rechnung",$db,$value,$fromform); } function ReplaceVerbindlichkeit($db,$value,$fromform) { return $this->ReplaceANABRELSGSBE("verbindlichkeit",$db,$value,$fromform); } function ReplaceRetoure($db,$value,$fromform) { return $this->ReplaceANABRELSGSBE('retoure',$db,$value,$fromform); } // @refactor FormHelper Komponente function ReplaceBestellung($db,$value,$fromform) { return $this->ReplaceANABRELSGSBE("bestellung",$db,$value,$fromform); } // @refactor FormHelper Komponente function ReplaceANABRELSGSBE($table,$db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(!$fromform) { $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT belegnr as name FROM $table WHERE id='$id' LIMIT 1"); }else{ $abkuerzung = ''; } } else { $abkuerzung = $value; $tmp = explode(' ', trim($value)); $tmp = reset($tmp); $id = $this->app->DB->Select("SELECT id FROM $table WHERE belegnr='$tmp' AND belegnr!='' LIMIT 1"); if ($id <=0) { $id=0; $abkuerzung = ''; } else { $abkuerzung = $tmp; } } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular else { return $abkuerzung; } } // @refactor FormHelper Komponente function ReplaceLagerPlatz($db, $value, $fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(!$fromform) { $dbformat = 1; $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT kurzbezeichnung FROM lager_platz WHERE id ='$id' LIMIT 1"); }else{ $abkuerzung = ''; } } else { $dbformat = 0; $abkuerzung = $value; $id = $this->app->DB->Select("SELECT id FROM lager_platz WHERE kurzbezeichnung LIKE '$value' AND kurzbezeichnung!='' LIMIT 1"); if($id <=0) $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular return $abkuerzung; } // @refactor FormHelper Komponente function ReplaceLager($db, $value, $fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(!$fromform) { $dbformat = 1; $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT bezeichnung FROM lager WHERE id ='$id' LIMIT 1"); }else{ $abkuerzung = ''; } } else { $dbformat = 0; $abkuerzung = $value; $id = $this->app->DB->Select("SELECT id FROM lager WHERE bezeichnung LIKE '$value' AND bezeichnung!='' LIMIT 1"); if($id <=0) $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular else { return $abkuerzung; } } // @refactor FormHelper Komponente function ReplaceKasse($db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(!$fromform) { $dbformat = 1; $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT bezeichnung FROM konten WHERE id ='$id' LIMIT 1"); }else{ $abkuerzung = ''; } } else { $dbformat = 0; $abkuerzung = $value; $id = $this->app->DB->Select("SELECT id FROM konten WHERE bezeichnung LIKE '$value' AND bezeichnung!='' LIMIT 1"); if($id <=0) $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular else { return $abkuerzung; } } // @refactor FormHelper Komponente function ReplaceKostenstelle($db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(!$fromform) { $dbformat = 1; $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT CONCAT(nummer,' ',beschreibung) FROM kostenstelle WHERE nummer='$id' LIMIT 1"); }else{ $abkuerzung = ''; } } else { $dbformat = 0; $abkuerzung = $value; $id = $this->app->DB->Select("SELECT nummer FROM kostenstelle WHERE CONCAT(nummer,' ',beschreibung)='$value' AND CONCAT(nummer,' ',beschreibung)!='' LIMIT 1"); if($id <=0) $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular else { return $abkuerzung; } } // @refactor FormHelper Komponente function ReplaceGruppe($db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(!$fromform) { $dbformat = 1; $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT CONCAT(name,' ',kennziffer) as name FROM gruppen WHERE id='$id' LIMIT 1"); }else{ $abkuerzung = ''; } } else { $dbformat = 0; $abkuerzung = $value; $id = $this->app->DB->Select("SELECT id FROM gruppen WHERE CONCAT(name,' ',kennziffer)='$value' OR (kennziffer='$value' AND kennziffer!='') LIMIT 1"); if($id <=0) $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular else { return $abkuerzung; } } // @refactor FormHelper Komponente function ReplaceWiedervorlageStages($db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(!$fromform) { $dbformat = 1; $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT CONCAT(id,' ',kurzbezeichnung,' (',name,')') FROM wiedervorlage_stages WHERE id='$id' LIMIT 1"); }else{ $abkuerzung = ''; } } else { $dbformat = 0; $tmp = trim($value); $rest = explode(" ",$tmp); $rest = $rest[0]; $id = $this->app->DB->Select("SELECT id FROM wiedervorlage_stages WHERE id='$rest' LIMIT 1"); if($value=='') $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular else { return $abkuerzung; } } // @refactor FormHelper Komponente function ReplaceArbeitspaket($db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(!$fromform) { $dbformat = 1; $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT CONCAT(a.id,' ',p.abkuerzung,' ',a.aufgabe) FROM arbeitspaket a LEFT JOIN projekt p ON a.projekt=p.id WHERE a.id='$id' LIMIT 1"); }else{ $abkuerzung = ''; } } else { $dbformat = 0; $tmp = trim($value); $rest = explode(" ",$tmp); $rest = $rest[0]; $id = $this->app->DB->Select("SELECT id FROM arbeitspaket WHERE id='$rest' LIMIT 1"); if($value=='') $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular else { return $abkuerzung; } } // @refactor FormHelper Komponente function ReplaceProjektNameDyn($db, $value, $fromform) { $dbformat = 0; if(!$fromform) { $dbformat = 1; $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT CONCAT(abkuerzung,' ',name) FROM projekt WHERE id='$id' LIMIT 1"); }else{ $abkuerzung = ''; } } else { $dbformat = 0; $abkuerzung = $value; $id = $this->app->DB->Select("SELECT id FROM projekt WHERE CONCAT(abkuerzung,' ',name)='$value' AND abkuerzung!='' LIMIT 1"); if($id != '') { $value = explode(' ', $value); $value = reset($value); $id = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='$value' AND abkuerzung!='' LIMIT 1"); } if($value=='') $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular return $abkuerzung; } // @refactor FormHelper Komponente function ReplaceProjektName($db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(!$fromform) { $dbformat = 1; $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT CONCAT(abkuerzung,' ',name) FROM projekt WHERE id='$id' LIMIT 1"); }else{ $abkuerzung=''; } } else { $dbformat = 0; $abkuerzung = $value; $id = $this->app->DB->Select("SELECT id FROM projekt WHERE CONCAT(abkuerzung,' ',name)='$value' AND abkuerzung!='' LIMIT 1"); if($value=='') $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular else { return $abkuerzung; } } // @refactor FormHelper Komponente function ReplaceProjekt($db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(!$fromform) { $dbformat = 1; $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT abkuerzung FROM projekt WHERE id='$id' LIMIT 1"); }else{ $abkuerzung = ''; } } else { $dbformat = 0; $abkuerzung = $value; $id = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='$value' AND abkuerzung!='' LIMIT 1"); if($value=='') $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular else { return $abkuerzung; } } // @refactor FormHelper Komponente function ReplaceLieferantennummer($db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(!$fromform) { // wenn es eine id ist! $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT lieferantennummer as name FROM adresse WHERE id='$id' AND geloescht=0 LIMIT 1"); }else{ $abkuerzung = ''; } if($id==0 || $id=="") $abkuerzung =""; } else { $rmodule = $this->app->Secure->GetGET("module"); $raction = $this->app->Secure->GetGET("action"); $rid = (int)$this->app->Secure->GetGET("id"); $pruefemodule = array('artikel','auftrag','angebot','rechnung','lieferschein','gutschrift','bestellung'); $filter_projekt = false; if($raction == 'edit' && $rid && in_array($rmodule, $pruefemodule)) { $projekt = $this->app->DB->Select("SELECT projekt FROM $rmodule WHERE id = '$rid' LIMIT 1"); if($projekt) { $eigenernummernkreis = $this->app->DB->Select("SELECT eigenernummernkreis FROM projekt WHERE id = '$projekt' LIMIT 1"); //if($eigenernummernkreis) $filter_projekt = $projekt; } } $abkuerzung = $value; $tmp = trim($value); $rest = explode(" ",$tmp); $rest = $rest[0]; $id = $this->app->DB->Select("SELECT id FROM adresse WHERE lieferantennummer='$rest' AND lieferantennummer!='' AND geloescht=0 ORDER BY ".($filter_projekt?" projekt = '$filter_projekt' DESC, ":"")." projekt LIMIT 1"); if($id <=0) $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular else { return $abkuerzung; } } // @refactor Formater Komponente function FirstTillSpace($string) { $tmp = trim($string); $rest = explode(" ",$tmp); return $rest[0]; } // @refactor FormHelper Komponente function ReplaceKundennummer($db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(!$fromform) { // wenn es eine id ist! $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT kundennummer as name FROM adresse WHERE id='$id' AND geloescht=0 LIMIT 1"); }else{ $abkuerzung = ''; } } else { $rmodule = $this->app->Secure->GetGET("module"); $raction = $this->app->Secure->GetGET("action"); $rid = (int)$this->app->Secure->GetGET("id"); $pruefemodule = array('artikel','auftrag','angebot','rechnung','lieferschein','gutschrift','bestellung','produktion'); $filter_projekt = 0; if($raction == 'edit' && $rid && in_array($rmodule, $pruefemodule)) { $projekt = $this->app->DB->Select("SELECT projekt FROM $rmodule WHERE id = '$rid' LIMIT 1"); if($projekt) { $eigenernummernkreis = $this->app->DB->Select("SELECT eigenernummernkreis FROM projekt WHERE id = '$projekt' LIMIT 1"); //if($eigenernummernkreis) $filter_projekt = $projekt; } } $abkuerzung = $value; $tmp = trim($value); //$rest = substr($tmp, 0, 5); $rest = explode(" ",$tmp); $rest = $rest[0]; $id = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer='$rest' AND kundennummer!='' AND geloescht=0 ORDER BY ".($filter_projekt?" projekt = '$filter_projekt' DESC, ":"")." projekt LIMIT 1"); if($id <=0) $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular else { return $abkuerzung; } } // @refactor FormHelper Komponente function ReplaceKunde($db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(!$fromform) { $dbformat = 1; $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT CONCAT(kundennummer,' ',name) as name FROM adresse WHERE id='$id' AND geloescht=0 LIMIT 1"); }else{ $abkuerzung = ''; } } else { $rmodule = $this->app->Secure->GetGET("module"); $raction = $this->app->Secure->GetGET("action"); $rid = (int)$this->app->Secure->GetGET("id"); $pruefemodule = array('artikel','auftrag','angebot','rechnung','lieferschein','gutschrift','bestellung'); $filter_projekt = false; if($raction == 'edit' && $rid && in_array($rmodule, $pruefemodule)) { $projekt = $this->app->DB->Select("SELECT projekt FROM $rmodule WHERE id = '$rid' LIMIT 1"); if($projekt) { $eigenernummernkreis = $this->app->DB->Select("SELECT eigenernummernkreis FROM projekt WHERE id = '$projekt' LIMIT 1"); //if($eigenernummernkreis) $filter_projekt = $projekt; } } $dbformat = 0; $abkuerzung = $value; $tmp = trim($value); $rest = explode(" ",$tmp); $rest = $rest[0]; $id = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer='$rest' AND kundennummer!='' AND geloescht=0 ORDER BY ".($filter_projekt?" projekt = '$filter_projekt' DESC, ":"")." projekt LIMIT 1"); if($id <=0) $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular else { return $abkuerzung; } } // @refactor FormHelper Komponente function ReplaceSteuersatz($db,$value,$fromform) { if($db) { if($value === "" || $value === null)return -1; return str_replace(',','.', $value); }else{ if($value < 0)return ""; return str_replace('.',',', $value);; } } // @refactor FormHelper Komponente function ReplaceSteuergruppe($db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(!$fromform) { $dbformat = 1; $id = $value; if($id > 0){ // Removed, table does not exist $abkuerzung = $this->app->DB->Select("SELECT bezeichnung FROM steuerregelngruppe WHERE id='$id' LIMIT 1"); }else{ $abkuerzung = ''; } } else { $dbformat = 0; $value = $this->app->DB->real_escape_string($value); // Removed, table does not exist $id = $this->app->DB->Select("SELECT id FROM steuerregelngruppe WHERE bezeichnung = '$value' ORDER BY aktiv = 1 DESC LIMIT 1"); if($id <=0) $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular else { return $abkuerzung; } } 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 function ReplaceLieferant($db,$value,$fromform) { //value muss hier vom format ueberprueft werden $dbformat = 0; if(!$fromform) { $dbformat = 1; $id = $value; if($id > 0){ $abkuerzung = $this->app->DB->Select("SELECT CONCAT(lieferantennummer,' ',name) as name FROM adresse WHERE id='$id' AND geloescht=0 LIMIT 1"); }else{ $abkuerzung = ''; } } else { $rmodule = $this->app->Secure->GetGET("module"); $raction = $this->app->Secure->GetGET("action"); $rid = (int)$this->app->Secure->GetGET("id"); $pruefemodule = array('artikel','auftrag','angebot','rechnung','lieferschein','gutschrift','bestellung'); $filter_projekt = false; if($raction == 'edit' && $rid && in_array($rmodule, $pruefemodule)) { $projekt = $this->app->DB->Select("SELECT projekt FROM $rmodule WHERE id = '$rid' LIMIT 1"); if($projekt) { $eigenernummernkreis = $this->app->DB->Select("SELECT eigenernummernkreis FROM projekt WHERE id = '$projekt' LIMIT 1"); //if($eigenernummernkreis) $filter_projekt = $projekt; } } $dbformat = 0; $abkuerzung = $value; $tmp = trim($value); $rest = explode(" ",$tmp); $rest = $rest[0]; $id = $this->app->DB->Select("SELECT id FROM adresse WHERE lieferantennummer='$rest' AND lieferantennummer!='' AND geloescht=0 ORDER BY ".($filter_projekt?" projekt = '$filter_projekt' DESC, ":"")." projekt LIMIT 1"); if($id <=0) $id=0; } // wenn ziel datenbank if($db) { return $id; } // wenn ziel formular else { return $abkuerzung; } } /**@depreacated */ function CheckSamePage() { $id = $this->app->Secure->GetGET("id"); $check_id = strstr($_SERVER['HTTP_REFERER'], 'id='); if($check_id!="id=".$id) return true; else return false; } /** * @depreacated * @refactor Artikel Modul */ function SeitenSperrAuswahl($ueberschrift,$meldung) { /* $this->app->Tpl->Set(SPERRMELDUNG, '$("a#inline").fancybox({ \'modal\': true, \'autoDimensions\': false, \'width\': 500, \'height\': 300 }); $(\'#inline\').click();'); $this->app->Tpl->Set(SPERRMELDUNGNACHRICHT,'

'.$ueberschrift.'


von Benedikt Sauter

'.$meldung.'


Jetzt Zurück zum letzten Schritt |  Bitte Fenster dennoch freigeben
'); */ $this->app->Tpl->Set('SPERRMELDUNG', ' // a workaround for a flaw in the demo system (http://dev.jqueryui.com/ticket/4375), ignore! $( "#dialog:ui-dialog" ).dialog( "destroy" ); $( "#dialog-message" ).dialog({ modal: true, buttons: { Ok: function() { $( this ).dialog( "close" ); } } }); '); $this->app->Tpl->Set('SPERRMELDUNGNACHRICHT','

'.$meldung.'

'); } /**@depreacated */ function SeitenSperrInfo($meldung) { $this->app->Tpl->Set('SPERRMELDUNG', '$("a#inline").fancybox({ \'hideOnContentClick\': true, \'autoDimensions\': false, \'width\': 500, \'height\': 300 }); $(\'#inline\').click();'); $this->app->Tpl->Set('SPERRMELDUNGNACHRICHT','

Infomeldung




'.$meldung.'
'); } // @refactor Artikel Modul function AddArtikel($felder) { $this->app->DB->Insert("INSERT INTO artikel (id) VALUES ('')"); $id = $this->app->DB->GetInsertID(); if($felder['firma']<=0) $felder['firma'] = $this->app->DB->Select("SELECT MAX(f.id) FROM firma f INNER JOIN firmendaten fd ON f.id = fd.firma LIMIT 1"); if($felder['firma']<=0) $felder['firma'] = $this->app->DB->Select("SELECT MAX(firma) FROM firmendaten LIMIT 1"); if($felder['projekt']<=0) $felder['projekt'] = $this->app->DB->Select("SELECT standardprojekt FROM firma WHERE id='".$felder['firma']."' LIMIT 1"); if($felder['firma']<=0) $felder['firma']=1; if($felder['projekt']<=0) $felder['projekt']=1; // so starten, dass alle uebertragen werden if($felder['cache_lagerplatzinhaltmenge']<=0) $felder['cache_lagerplatzinhaltmenge']=-999; if(!empty($felder['anhang'])) { if(!is_array($felder['anhang'])){ $data = $felder['anhang']; $felder['anhang'] = []; $felder['anhang'][] = ['datei' => $data, 'endung' => '', 'name' =>'']; } foreach ($felder['anhang'] as $anhang){ $dateiname = trim($anhang['name']); if(empty($dateiname)){ $dateiname = $this->app->DB->Select("SELECT nummer FROM artikel WHERE id ='$id'"); } $fileid = $this->addBase64Bild($anhang['datei'],$dateiname,$anhang['endung']); if(!empty($fileid)){ $this->AddDateiStichwort($fileid, 'Bild', 'artikel', $id); } } unset($felder['anhang']); } $this->app->DB->UpdateArr("artikel",$id,"id",$felder); return $id; } public function addBase64Bild($base64datei,$name = '',$endung = '',$titel='Anhang'){ $decodedData = @base64_decode($base64datei); $tmpdatei = $this->app->erp->GetTMP().'anhangtmp'.microtime(true); file_put_contents($tmpdatei ,$decodedData); if(empty($endung)){ $mimetype = explode('/',mime_content_type($tmpdatei)); switch ($mimetype[0]){ case 'image': if(strpos($mimetype[1],'jpg') !== false || strpos($mimetype[1],'jpeg') !== false){ $endung = 'jpg'; } if(strpos($mimetype[1],'png') !== false){ $endung = 'png'; } if(strpos($mimetype[1],'bmp') !== false){ $endung = 'bmp'; } break; case 'text': if(strpos($mimetype[1],'plain') !== false){ $endung = 'txt'; } if(strpos($mimetype[1],'php') !== false){ $endung = 'php'; } break; default: $endung = 'pdf'; break; } } $datei = $this->app->Conf->WFuserdata.'/'.md5($name.'.'.$endung.microtime(true)); move_uploaded_file($tmpdatei,$datei); $fileid = 0; if(file_put_contents($datei,$decodedData)) { if(@is_file($datei) && @filesize($datei)) { $fileid = $this->CreateDatei($name.'.'.$endung, $titel, '', '', $datei, $this->app->User->GetName()); unlink($datei); } } return $fileid; } // @refactor API Modul function SetzteSperreAPIArtikelPreise($artikel) { $this->app->DB->Update("UPDATE verkaufspreise SET apichange=0 WHERE artikel=$artikel"); //$this->app->DB->Update("UPDATE einkaufspreise SET apichange=0 WHERE artikel=$artikel"); } // @refactor API Modul function EntferneSperreAPIArtikelPreise($artikel) { $this->app->DB->Update("UPDATE verkaufspreise SET gueltig_bis=DATE_SUB(NOW(),INTERVAL 1 DAY) WHERE apichange!=1 AND artikel=$artikel"); //$this->app->DB->Update("UPDATE einkaufspreise SET gueltig_bis=DATE_SUB(NOW(),INTERVAL 1 DAY) WHERE apichange!=1 AND artikel=$artikel"); } // @refactor Artikel Modul function AddVerkaufspreisGruppe($artikel,$abmenge,$gruppe,$preis,$waehrung="EUR",$kundenartikelnummer="", $gueltig_ab = null, $interner_kommentar = null, $gueltig_bis = null) { if($abmenge<=0)$abmenge=1; $gruppe = $this->app->DB->Select("SELECT id FROM gruppen WHERE id='$gruppe' LIMIT 1"); if($gruppe <=0) return; $gueltigabwhere = 'curdate()'; if($gueltig_ab)$gueltigabwhere = "'$gueltig_ab'"; if($gruppe > 0) $check = $this->app->DB->Select("SELECT id FROM verkaufspreise WHERE ab_menge='".$abmenge."' AND gruppe='".$gruppe."' AND artikel='$artikel' AND art='Gruppe' AND (gueltig_bis='0000-00-00' OR gueltig_bis >= $gueltigabwhere) AND geloescht!='1' AND adresse <= 0 LIMIT 1"); else $check = $this->app->DB->Select("SELECT id FROM verkaufspreise WHERE ab_menge='".$abmenge."' AND (gruppe='' OR gruppe='0') AND artikel='$artikel' AND art='Gruppe' AND (gueltig_bis='0000-00-00' OR gueltig_bis >= $gueltigabwhere) AND geloescht!='1' AND adresse <= 0 LIMIT 1"); // soll man preis als ungueltig markieren? if($check > 0) { // noch nie dagewesen jetzt anlegen // ist der preis anders? $preis_alt = $this->app->DB->Select("SELECT preis FROM verkaufspreise WHERE id='$check' LIMIT 1"); if($preis!=$preis_alt) { $this->app->DB->Update("UPDATE verkaufspreise SET gueltig_bis=DATE_SUB($gueltigabwhere,INTERVAL 1 DAY),apichange=1 WHERE id='$check' LIMIT 1"); $this->app->DB->Insert("INSERT INTO verkaufspreise (id,gruppe,artikel,angelegt_am, ab_menge,waehrung,preis,firma,kundenartikelnummer,adresse,art,apichange,logdatei) VALUES ('','$gruppe','$artikel',NOW(),'$abmenge','$waehrung','$preis','".$this->app->User->GetFirma()."','".$kundenartikelnummer."',0,'Gruppe',1,now())"); $insid = $this->app->DB->GetInsertID(); if($waehrung !== 'EUR' && $waehrung !== ''){ $kurs = $this->app->erp->GetWaehrungUmrechnungskurs('EUR', $waehrung, true); }else{ $kurs = -1; $kursdatum = 'NULL'; } if($kurs !== false){ if($kurs !== -1){ $kursdatum = "'" . date('Y-m-d') . "'"; } $this->app->DB->Update("UPDATE verkaufspreise SET kurs = $kurs, kursdatum = $kursdatum WHERE id = $insid LIMIT 1"); } if($gueltig_ab)$this->app->DB->Update("UPDATE verkaufspreise SET gueltig_ab = '$gueltig_ab' WHERE id = '$insid' LIMIT 1"); if($interner_kommentar)$this->app->DB->Update("UPDATE verkaufspreise SET bemerkung = '".$this->app->DB->real_escape_string($interner_kommentar)."' WHERE id = '$insid' LIMIT 1"); } else { // nur attribute update if($kundenartikelnummer!="") { $this->app->DB->Update("UPDATE verkaufspreise SET kundenartikelnummer='$kundenartikelnummer', apichange=1 WHERE id='$check' LIMIT 1"); } else { $this->app->DB->Update("UPDATE verkaufspreise SET apichange=1 WHERE id='$check' LIMIT 1"); } if($interner_kommentar)$this->app->DB->Update("UPDATE verkaufspreise SET bemerkung = '".$this->app->DB->real_escape_string($interner_kommentar)."' WHERE id = '$check' LIMIT 1"); } } else { $this->app->DB->Insert("INSERT INTO verkaufspreise (id,gruppe,artikel,angelegt_am, ab_menge,waehrung,preis,firma,kundenartikelnummer,adresse,art,apichange) VALUES ('','$gruppe','$artikel',NOW(),'$abmenge','$waehrung','$preis','".$this->app->User->GetFirma()."','".$kundenartikelnummer."',0,'Gruppe',1)"); $insid = $this->app->DB->GetInsertID(); if($waehrung !== 'EUR' && $waehrung !== ''){ $kurs = $this->app->erp->GetWaehrungUmrechnungskurs('EUR', $waehrung, true); }else{ $kurs = false; } if($kurs !== false){ if($kurs !== -1){ $kursdatum = "'" . date('Y-m-d') . "'"; } $this->app->DB->Update("UPDATE verkaufspreise SET kurs = $kurs, kursdatum = $kursdatum WHERE id = $insid LIMIT 1"); } if($gueltig_ab)$this->app->DB->Update("UPDATE verkaufspreise SET gueltig_ab = '".$this->app->DB->real_escape_string($gueltig_ab)."' WHERE id = '$insid' LIMIT 1"); if($gueltig_bis)$this->app->DB->Update("UPDATE verkaufspreise SET gueltig_bis = '".$this->app->DB->real_escape_string($gueltig_bis)."' WHERE id = '$insid' LIMIT 1"); if($interner_kommentar)$this->app->DB->Update("UPDATE verkaufspreise SET bemerkung = '".$this->app->DB->real_escape_string($interner_kommentar)."' WHERE id = '$insid' LIMIT 1"); } } // @refactor Artikel Modul function AddVerkaufspreis($artikel,$abmenge,$adresse,$preis,$waehrung="EUR",$kundenartikelnummer="", $gruppe = null, $gueltig_ab = null, $interner_kommentar = null, $gueltig_bis = null) { if($adresse==="") return false; if($abmenge<=0)$abmenge=1; if($adresse > 0) { $adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE id='$adresse' LIMIT 1"); if($adresse <=0) return false; } if($waehrung == "EUR") { $where = " AND (waehrung = '' OR waehrung = 'EUR') "; }else{ $where = " AND waehrung = '".$waehrung."' "; } $gueltigabwhere = 'curdate()'; if($gueltig_ab)$gueltigabwhere = "'$gueltig_ab'"; $preis = round($preis,8); if($adresse > 0) $check = $this->app->DB->Select("SELECT id FROM verkaufspreise WHERE ab_menge=".$abmenge." ".$where." AND adresse=".$adresse." AND artikel=$artikel AND art='Kunde' AND (gueltig_bis='0000-00-00' OR gueltig_bis >= $gueltigabwhere) AND (gueltig_ab='0000-00-00' OR gueltig_ab <= $gueltigabwhere) AND geloescht!='1' ".($gruppe?" AND gruppe = '$gruppe' ":'')." LIMIT 1"); else $check = $this->app->DB->Select("SELECT id FROM verkaufspreise WHERE ab_menge=".$abmenge." ".$where." AND (adresse='' OR adresse=0) AND artikel=$artikel AND art='Kunde' AND (gueltig_bis='0000-00-00' OR gueltig_bis >= $gueltigabwhere) AND (gueltig_ab='0000-00-00' OR gueltig_ab <= $gueltigabwhere) AND geloescht!=1 ".($gruppe?" AND gruppe = '$gruppe' ":'')." LIMIT 1"); // soll man preis als ungueltig markieren? if($check > 0) { // noch nie dagewesen jetzt anlegen // ist der preis anders? $preis_alt = $this->app->DB->Select("SELECT preis FROM verkaufspreise WHERE id='$check' LIMIT 1"); if($preis!=$preis_alt) { $this->app->DB->Update("UPDATE verkaufspreise SET gueltig_bis=DATE_SUB($gueltigabwhere,INTERVAL 1 DAY),apichange=1 WHERE id='$check' LIMIT 1"); $this->app->DB->Insert("INSERT INTO verkaufspreise (id,adresse,artikel,angelegt_am, ab_menge,waehrung,preis,firma,kundenartikelnummer,art,apichange,logdatei) VALUES ('','$adresse','$artikel',NOW(),'$abmenge','$waehrung','$preis','1','".$kundenartikelnummer."','Kunde',1,now())"); $insid = $this->app->DB->GetInsertID(); if($waehrung !== 'EUR' && $waehrung !== ''){ $kurs = $this->app->erp->GetWaehrungUmrechnungskurs('EUR', $waehrung, true); }else{ $kurs = -1; $kursdatum = 'NULL'; } if($kurs !== false){ if($kurs !== -1){ $kursdatum = "'" . date('Y-m-d') . "'"; } $this->app->DB->Update("UPDATE verkaufspreise SET kurs = $kurs, kursdatum = $kursdatum WHERE id = $insid LIMIT 1"); } if($gueltig_ab)$this->app->DB->Update("UPDATE verkaufspreise SET gueltig_ab = '$gueltig_ab' WHERE id = '$insid' LIMIT 1"); $this->ObjektProtokoll('verkaufspreise',$insid,'AddVerkaufspreis',"Verkaufspreis von $preis_alt nach $preis ge&auuml;ndert"); if($gruppe) { $this->app->DB->Update("UPDATE verkaufspreise set gruppe = '".$gruppe."' where id = '".$insid."'"); } if($gueltig_bis)$this->app->DB->Update("UPDATE verkaufspreise SET gueltig_bis = '".$this->app->DB->real_escape_string($gueltig_bis)."' WHERE id = '$insid' LIMIT 1"); if($interner_kommentar)$this->app->DB->Update("UPDATE verkaufspreise SET bemerkung = '".$this->app->DB->real_escape_string($interner_kommentar)."' WHERE id = '$insid' LIMIT 1"); return $insid; } else { // nur attribute update if($kundenartikelnummer!="") { $this->app->DB->Update("UPDATE verkaufspreise SET kundenartikelnummer='$kundenartikelnummer',apichange=1 WHERE id='$check' LIMIT 1"); $this->ObjektProtokoll('verkaufspreise',$check,'AddVerkaufspreis',"Kundenartikelnummer ge&auuml;ndert"); } else { $this->app->DB->Update("UPDATE verkaufspreise SET apichange=1 WHERE id='$check' LIMIT 1"); } if($interner_kommentar)$this->app->DB->Update("UPDATE verkaufspreise SET bemerkung = '".$this->app->DB->real_escape_string($interner_kommentar)."' WHERE id = '$check' LIMIT 1"); } return $check; } else { $this->app->DB->Insert("INSERT INTO verkaufspreise (id,adresse,artikel,angelegt_am, ab_menge,waehrung,preis,firma,kundenartikelnummer,art,apichange,logdatei) VALUES ('','$adresse','$artikel',NOW(),'$abmenge','$waehrung','$preis','1','".$kundenartikelnummer."','Kunde',1,now())"); $insid = $this->app->DB->GetInsertID(); if($waehrung !== 'EUR' && $waehrung !== ''){ $kurs = $this->app->erp->GetWaehrungUmrechnungskurs('EUR', $waehrung, true); }else{ $kurs = false; } if($kurs !== false){ $kursdatum = "'" . date('Y-m-d') . "'"; $this->app->DB->Update("UPDATE verkaufspreise SET kurs = $kurs, kursdatum = $kursdatum WHERE id = $insid LIMIT 1"); } if($gueltig_ab)$this->app->DB->Update("UPDATE verkaufspreise SET gueltig_ab = '".$this->app->DB->real_escape_string($gueltig_ab)."' WHERE id = '$insid' LIMIT 1"); if($gueltig_bis)$this->app->DB->Update("UPDATE verkaufspreise SET gueltig_bis = '".$this->app->DB->real_escape_string($gueltig_bis)."' WHERE id = '$insid' LIMIT 1"); if($gruppe) { $this->app->DB->Update("UPDATE verkaufspreise set gruppe = '".$gruppe."' where id = '".$insid."'"); } if($interner_kommentar)$this->app->DB->Update("UPDATE verkaufspreise SET bemerkung = '".$this->app->DB->real_escape_string($interner_kommentar)."' WHERE id = '$insid' LIMIT 1"); $this->ObjektProtokoll('verkaufspreise',$insid,'AddVerkaufspreis',"Verkaufspreis angelegt"); return $insid; } } // @refactor Artikel Modul function AddEinkaufspreis($artikel,$abmenge,$adresse,$bestellnummer,$bezeichnunglieferant,$preis,$waehrung="",$vpe="", $testebestellnummer = false, $interner_kommentar = null) { if($abmenge<=0) $abmenge=1; if($waehrung=="") $waehrung="EUR"; if($waehrung == "EUR") { $where = " AND (waehrung = '' OR waehrung = 'EUR') "; }else{ $where = " AND waehrung = '".$waehrung."' "; } if($testebestellnummer && $bestellnummer)$where = " AND bestellnummer = '".addslashes($bestellnummer)."' "; $check = $this->app->DB->Select("SELECT id FROM einkaufspreise WHERE ab_menge='".$abmenge."' AND adresse='".$adresse."' AND artikel='$artikel' AND (gueltig_bis='0000-00-00' OR gueltig_bis >= NOW()) AND geloescht!='1' ".$where." LIMIT 1"); // soll man preis als ungueltig markieren? if($check > 0) { // noch nie dagewesen jetzt anlegen // ist der preis anders? $preis_alt = $this->app->DB->Select("SELECT preis FROM einkaufspreise WHERE id='$check' LIMIT 1"); if($preis!=$preis_alt) { $this->app->DB->Update("UPDATE einkaufspreise SET gueltig_bis=DATE_SUB(NOW(),INTERVAL 1 DAY),apichange=1 WHERE id='$check' LIMIT 1"); //$this->AddEinkaufspreis($artikel,$abmenge,$adresse,$bestellnummer,$bezeichnunglieferant,$preis,$waehrung); $this->app->DB->Insert("INSERT INTO einkaufspreise (id,adresse,artikel,bestellnummer,bezeichnunglieferant, preis_anfrage_vom, ab_menge,waehrung,preis,firma,vpe,apichange,logdatei) VALUES ('','$adresse','$artikel','$bestellnummer','$bezeichnunglieferant',NOW(),'$abmenge','$waehrung','$preis','".$this->app->User->GetFirma()."','$vpe',1, now())"); if($interner_kommentar)$this->app->DB->Update("UPDATE einkaufspreise SET bemerkung = '".$this->app->DB->real_escape_string($interner_kommentar)."' WHERE id = '$insid' LIMIT 1"); $insid = $this->app->DB->GetInsertID(); $this->ObjektProtokoll('einkaufspreise',$insid,'AddEinkaufspreis',"Einkaufspreis von $preis_alt nach $preis ge&auuml;ndert"); return $insid; } else { $this->app->DB->Update("UPDATE einkaufspreise SET bestellnummer='$bestellnummer', bezeichnunglieferant='$bezeichnunglieferant',apichange=1, logdatei = now() WHERE id='$check' LIMIT 1"); $this->ObjektProtokoll('einkaufspreise',$check,'AddEinkaufspreis',"Einkaufspreis ge&auuml;ndert"); if($interner_kommentar)$this->app->DB->Update("UPDATE einkaufspreise SET bemerkung = '".$this->app->DB->real_escape_string($interner_kommentar)."' WHERE id = '$check' LIMIT 1"); return $check; } } else { //$this->AddEinkaufspreis($artikel,$abmenge,$adresse,$bestellnummer,$bezeichnunglieferant,$preis,$waehrung); $this->app->DB->Insert("INSERT INTO einkaufspreise (id,adresse,artikel,bestellnummer,bezeichnunglieferant, preis_anfrage_vom, ab_menge,waehrung,preis,firma,vpe,apichange, logdatei) VALUES ('','$adresse','$artikel','$bestellnummer','$bezeichnunglieferant',NOW(),'$abmenge','$waehrung','$preis','".$this->app->User->GetFirma()."','$vpe',1,now())"); $insid = $this->app->DB->GetInsertID(); if($interner_kommentar)$this->app->DB->Update("UPDATE einkaufspreise SET bemerkung = '".$this->app->DB->real_escape_string($interner_kommentar)."' WHERE id = '$insid' LIMIT 1"); $this->ObjektProtokoll('einkaufspreise',$insid,'AddEinkaufspreis',"Einkaufspreis angelegt"); return $insid; } } // @refactor Artikel Modul function EinkaufspreisBetrag($artikel,$menge,$lieferant,$projekt='') { if(!$menge) { $menge = 1; } $id = $artikel; $adresse = $lieferant; $ek = $this->app->DB->Select("SELECT preis FROM einkaufspreise WHERE artikel='$id' AND adresse='$adresse' AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') AND ab_menge <= $menge order by ab_menge desc LIMIT 1"); if($ek) { return $ek; } return $this->app->DB->Select("SELECT preis FROM einkaufspreise WHERE artikel='$id' AND adresse='$adresse' AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') order by ab_menge ASC LIMIT 1"); } // @refactor Artikel Modul function Einkaufspreis($artikel,$menge,$lieferant,$projekt="") { $id = $artikel; $adresse = $lieferant; $ek = $this->app->DB->Select("SELECT id FROM einkaufspreise WHERE artikel='$id' AND adresse='$adresse' AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') AND ab_menge <= $menge order by ab_menge desc LIMIT 1"); if($ek) { return $ek; } return $this->app->DB->Select("SELECT id FROM einkaufspreise WHERE artikel='$id' AND adresse='$adresse' AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') order by ab_menge LIMIT 1"); } // @refactor Bestellung Modul function ArtikelBestellung($artikel, $format = false, $ohnebestellauftrag = false) { $summe_in_bestellung = $this->app->DB->Select("SELECT ".($format?"trim(SUM(bp.menge-bp.geliefert))+0":"SUM(bp.menge-bp.geliefert)")." FROM bestellung_position bp LEFT JOIN bestellung b ON b.id=bp.bestellung WHERE bp.artikel='$artikel' ".($ohnebestellauftrag?" AND bp.auftrag_position_id = 0 ":"")." AND bp.geliefert < bp.menge AND (bp.abgeschlossen IS NULL OR bp.abgeschlossen!=1) AND b.status!='abgeschlossen' AND b.status!='freigegeben' AND b.status!='angelegt' AND b.status!='storniert'"); if($summe_in_bestellung <= 0) return 0; return $summe_in_bestellung; } // @refactor Bestellung Modul function ArtikelBestellungNichtVersendet($artikel, $format = false, $ohnebestellauftrag = false) { //$summe_in_bestellung = $this->app->DB->Select("SELECT SUM(bp.menge-bp.geliefert) FROM bestellung_position bp WHERE bp.artikel='$artikel' AND bp.geliefert < bp.menge AND bp.abgeschlossen!='1'"); $summe_in_bestellung = $this->app->DB->Select("SELECT ".($format?"trim(SUM(bp.menge-bp.geliefert))+0":"SUM(bp.menge-bp.geliefert)")." FROM bestellung_position bp LEFT JOIN bestellung b ON b.id=bp.bestellung WHERE bp.artikel='$artikel' ".($ohnebestellauftrag?" AND bp.auftrag_position_id = 0 ":"")." AND bp.geliefert < bp.menge AND (bp.abgeschlossen IS NULL OR bp.abgeschlossen!=1) AND (b.status='freigegeben' OR b.status='angelegt')"); if($summe_in_bestellung <= 0) return 0; return $summe_in_bestellung; } // @refactor Bestellung Modul function ArtikelVerkaufGesamt($artikel, $format = false) { if($format) { $summe_im_auftrag = $this->app->DB->Select("SELECT trim(SUM(menge))+0 FROM auftrag_position ap LEFT JOIN auftrag a ON a.id=ap.auftrag WHERE ap.artikel='$artikel' AND a.status='abgeschlossen'"); if($summe_im_auftrag<=0) $summe_im_auftrag=0; return $summe_im_auftrag; } $summe_im_auftrag = $this->app->DB->Select("SELECT SUM(menge) FROM auftrag_position ap LEFT JOIN auftrag a ON a.id=ap.auftrag WHERE ap.artikel='$artikel' AND a.status='abgeschlossen'"); if($summe_im_auftrag<=0) $summe_im_auftrag=0; return $summe_im_auftrag; } // @refactor Bestellung Modul function ReserviertAuftrag($artikel, $von = null, $bis = null, $ohnebestellung = false) { return $this->app->DB->Select("SELECT trim(SUM(ifnull(r.menge,0)))+0 FROM lager_reserviert r INNER JOIN (SELECT ap.auftrag, ap.artikel, sum(ap.menge) as menge FROM auftrag_position ap ".($ohnebestellung?" LEFT JOIN bestellung_position bp ON ap.id = bp.auftrag_position_id ":"")." INNER JOIN auftrag a ON a.id=ap.auftrag WHERE ap.artikel='$artikel' ".($ohnebestellung?" AND isnull(bp.id) ":"")." AND a.status='freigegeben' ".($auftrag?" AND ap.auftrag = '$auftrag' ":"")."" .($von && $von != '0000-00-00'?" AND a.datum >= '$von' ":"") .($bis && $bis != '0000-00-00'?" AND a.datum <= '$bis' ":"")." GROUP BY ap.auftrag, ap.artikel) ab ON r.parameter = ab.auftrag AND r.artikel = '$artikel' AND r.objekt = 'auftrag'" ); } // @refactor Bestellung Modul function ReserviertLieferschein($artikel, $von = null, $bis = null) { return $this->app->DB->Select("SELECT trim(SUM(ifnull(r.menge,0)))+0 FROM `lager_reserviert` AS `r` INNER JOIN (SELECT lp.lieferschein, lp.artikel, sum(lp.menge) as `menge` FROM `lieferschein_position` AS `lp` INNER JOIN `lieferschein` AS `l` ON l.id = lp.lieferschein WHERE lp.artikel = '$artikel' AND l.status = 'freigegeben'" .($von && $von != '0000-00-00'?" AND a.datum >= '$von' ":"") .($bis && $bis != '0000-00-00'?" AND a.datum <= '$bis' ":"")." GROUP BY lp.lieferschein, lp.artikel) AS `lb` ON r.parameter = lb.lieferschein AND r.artikel = '$artikel' AND r.objekt = 'lieferschein'" ); } // @refactor Bestellung Modul function ReserviertAuftragLiefertermin($artikel, $von = null, $bis = null, $ohnebestellung = false) { return $this->app->DB->Select("SELECT trim(SUM(ifnull(r.menge,0)))+0 FROM lager_reserviert r INNER JOIN (SELECT ap.auftrag, ap.artikel, sum(ap.menge) as menge FROM auftrag_position ap ".($ohnebestellung?" LEFT JOIN bestellung_position bp ON ap.id = bp.auftrag_position_id ":"")." INNER JOIN auftrag a ON a.id=ap.auftrag WHERE ap.artikel='$artikel' ".($ohnebestellung?" AND isnull(bp.id) ":"")." AND a.status='freigegeben' ".($auftrag?" AND ap.auftrag = '$auftrag' ":"")."" .($von && $von != '0000-00-00'?" AND a.datum >= '$von' ":"") .($bis && $bis != '0000-00-00'?" AND a.datum <= '$bis' AND (ifnull(ap.lieferdatum,'0000-00-00') = '0000-00-00' OR ifnull(ap.lieferdatum,'0000-00-00') <= '$bis') AND (ifnull(a.tatsaechlicheslieferdatum,'0000-00-00') = '0000-00-00' OR ifnull(a.tatsaechlicheslieferdatum,'0000-00-00') <= '$bis') AND (ifnull(a.lieferdatum,'0000-00-00') = '0000-00-00' OR ifnull(a.lieferdatum,'0000-00-00') <= '$bis') ":"")." GROUP BY ap.auftrag, ap.artikel) ab ON r.parameter = ab.auftrag AND r.artikel = '$artikel' AND r.objekt = 'auftrag'" ); } // @refactor Bestellung Modul function ArtikelImAuftragLiefertermin($artikel, $format = false, $von = null, $bis = null, $auftrag = 0, $ohnebestellung = false) { return $this->app->DB->Select("SELECT ".($format?"trim(SUM(menge))+0":"sum(menge)")." FROM auftrag_position ap LEFT JOIN auftrag a ON a.id=ap.auftrag ".($ohnebestellung?" LEFT JOIN bestellung_position bp ON ap.id = bp.auftrag_position_id ":"")." WHERE ap.artikel='$artikel' ".($ohnebestellung?" AND isnull(bp.id) ":"")." AND a.status='freigegeben' ".($auftrag?" AND ap.auftrag = '$auftrag' ":"")."" .($von && $von != '0000-00-00'?" AND a.datum >= '$von' ":"") .($bis && $bis != '0000-00-00'?" AND a.datum <= '$bis' AND (ifnull(ap.lieferdatum,'0000-00-00') = '0000-00-00' OR ifnull(ap.lieferdatum,'0000-00-00') <= '$bis') AND (ifnull(a.tatsaechlicheslieferdatum,'0000-00-00') = '0000-00-00' OR ifnull(a.tatsaechlicheslieferdatum,'0000-00-00') <= '$bis') AND (ifnull(a.lieferdatum,'0000-00-00') = '0000-00-00' OR ifnull(a.lieferdatum,'0000-00-00') <= '$bis') ":"") ); return $summe_im_auftrag; } // @refactor Bestellung Modul function ArtikelImAuftrag($artikel, $format = false, $von = null, $bis = null, $auftrag = 0, $ohnebestellung = false) { return $this->app->DB->Select("SELECT ".($format?"trim(SUM(ap.menge))+0":"SUM(ap.menge)")." FROM auftrag_position ap ".($ohnebestellung?" LEFT JOIN bestellung_position bp ON ap.id = bp.auftrag_position_id ":"")." LEFT JOIN auftrag a ON a.id=ap.auftrag WHERE ap.artikel='$artikel' ".($ohnebestellung?" AND isnull(bp.id) ":"")." AND a.status='freigegeben' ".($auftrag?" AND ap.auftrag = '$auftrag' ":"")." " .($von && $von != '0000-00-00'?" AND a.datum >= '$von' ":"") .($bis && $bis != '0000-00-00'?" AND a.datum <= '$bis' ":"") ); } // @refactor Bestellung Modul function ArtikelImAuftragStuecklisteLiefertermin($artikel, $format = false, $von = null, $bis = null, $auftrag = 0, $ohnebestellung = false) { return $this->app->DB->Select("SELECT ".($format?"trim(SUM(ap.menge * s.menge))+0":"SUM(ap.menge * s.menge)")." FROM auftrag_position ap ".($ohnebestellung?" LEFT JOIN bestellung_position bp ON ap.id = bp.auftrag_position_id ":"")." INNER JOIN auftrag a ON a.id=ap.auftrag INNER JOIN stueckliste s ON ap.artikel = s.stuecklistevonartikel INNER JOIN artikel a2 ON a2.id = s.stuecklistevonartikel WHERE s.artikel='$artikel' ".($ohnebestellung?" AND isnull(bp.id) ":"")." AND a.status='freigegeben' AND a2.produktion = 1 ".($auftrag?" AND ap.auftrag = '$auftrag' ":"")." " .($von && $von != '0000-00-00'?" AND a.datum >= '$von' ":"") .($bis && $bis != '0000-00-00'?" AND a.datum <= '$bis' AND (ifnull(ap.lieferdatum,'0000-00-00') = '0000-00-00' OR ifnull(ap.lieferdatum,'0000-00-00') <= '$bis') AND (ifnull(a.tatsaechlicheslieferdatum,'0000-00-00') = '0000-00-00' OR ifnull(a.tatsaechlicheslieferdatum,'0000-00-00') <= '$bis') AND (ifnull(a.lieferdatum,'0000-00-00') = '0000-00-00' OR ifnull(a.lieferdatum,'0000-00-00') <= '$bis') ":"") ); return $summe_im_auftrag; } // @refactor Bestellung Modul function ArtikelImAuftragStueckliste($artikel, $format = false, $von = null, $bis = null, $auftrag = 0, $ohnebestellung = false) { return $this->app->DB->Select("SELECT ".($format?" trim(SUM(ap.menge * s.menge))+0 ":" SUM(ap.menge * s.menge) ")." FROM auftrag_position ap ".($ohnebestellung?" LEFT JOIN bestellung_position bp ON ap.id = bp.auftrag_position_id ":"")." INNER JOIN auftrag a ON a.id=ap.auftrag INNER JOIN stueckliste s ON ap.artikel = s.stuecklistevonartikel INNER JOIN artikel a2 ON a2.id = s.stuecklistevonartikel WHERE s.artikel='$artikel' ".($ohnebestellung?" AND isnull(bp.id) ":"")." AND a.status='freigegeben' AND a2.produktion = 1 ".($auftrag?" AND ap.auftrag = '$auftrag' ":"")."" .($von && $von != '0000-00-00'?" AND a.datum >= '$von' ":"") .($bis && $bis != '0000-00-00'?" AND a.datum <= '$bis' ":"") ); } // @refactor Lager Modul function ArtikelImLagerPlatz($artikel,$lager_platz, $format = false) { if(!$lager_platz)return 0; if($format)return $this->app->DB->Select("SELECT trim(SUM(menge))+0 FROM lager_platz_inhalt WHERE artikel='$artikel' AND lager_platz='$lager_platz'"); $summe_im_lager = $this->app->DB->Select("SELECT SUM(menge) FROM lager_platz_inhalt WHERE artikel='$artikel' AND lager_platz='$lager_platz'"); return $summe_im_lager; } // @refactor Lager Modul public function ArtikelImLager($artikel, $format = false) { if($format){ return $this->app->DB->Select("SELECT trim(SUM(menge))+0 FROM lager_platz_inhalt WHERE artikel='$artikel'"); } $summe_im_lager = $this->app->DB->Select("SELECT SUM(menge) FROM lager_platz_inhalt WHERE artikel='$artikel'"); return $summe_im_lager; } // @refactor Lager Modul public function ArtikelImLagerOhneSperrlager($artikel, $format = false) { if($format){ return $this->app->DB->Select("SELECT trim(ifnull(SUM(lpi.menge),0))+0 FROM lager_platz_inhalt lpi INNER JOIN lager_platz lp ON lpi.lager_platz = lp.id AND (ifnull(lp.sperrlager,0) = 0 OR lp.allowproduction) WHERE lpi.artikel='$artikel'"); } $summe_im_lager = $this->app->DB->Select("SELECT ifnull(SUM(lpi.menge),0) FROM lager_platz_inhalt lpi INNER JOIN lager_platz lp ON lpi.lager_platz = lp.id AND ifnull(lp.sperrlager,0) = 0 WHERE lpi.artikel='$artikel'"); return $summe_im_lager; } function VerbindlichkeitErweiterteBestellung($id) { /** @var Verbindlichkeit $obj */ $obj = $this->app->erp->LoadModul('verbindlichkeit'); if(!empty($obj) && method_exists($obj, 'VerbindlichkeitErweiterteBestellung')) { return $obj->VerbindlichkeitErweiterteBestellung($id); } return []; } /** * @deprecated * @refactor Verbindlichkeit Modul */ function BestellungErweiterteVerbindlichkeiten($id) { for($i=1;$i<=15;$i++) { $alleids[] = $this->app->DB->SelectArr("SELECT id, bestellung{$i}betrag as betrag FROM verbindlichkeit WHERE bestellung$i='$id'"); } for($i=0;$i<(!empty($alleids)?count($alleids):0);$i++) { for($ij=0;$ijapp->erp->LoadModul('verbindlichkeit'); if(!empty($obj) && method_exists($obj, 'BestellungErweiterteVerbindlichkeitenNeu')) { return $obj->BestellungErweiterteVerbindlichkeitenNeu($id); } return []; } function get_emails ($str) { $emails = array(); $pattern="/([\s]*)([_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*([ ]+|)@([ ]+|)([a-zA-Z0-9-]+\.)+([a-zA-Z]{2,}))([\s]*)/i"; //preg_match_all("/\b\w+\@w+[\-\.\w+]+\b/", $str, $output); preg_match_all($pattern, $str, $output); foreach($output[0] as $email) array_push ($emails, trim(strtolower($email))); if ((!empty($emails)?count($emails):0) >= 1) return $emails; else return false; } /**@deprecated */ function AufragZuDTA($auftrag,$rechnung="1") { $arr = $this->app->DB->Select("SELECT belegnr, bank_inhaber, bank_konto, bank_blz, gesamtsumme, adresse, name FROM auftrag WHERE id='$auftrag'"); if($rechnung=="1") { $arr[0]['vz1'] = "RE ".$this->app->DB->Select("SELECT belegnr FROM rechnung WHERE auftrag='{$arr[0]['belegnr']}' LIMIT 1"); } else $arr[0]['vz1'] = ""; $this->app->DB->Insert("INSERT INTO dta (id,adresse,datum,name,konto,blz,betrag,vz1,firma) VALUES('','{$arr[0]['adresse']}',NOW(),'{$arr[0]['name']}','{$arr[0]['konto']}','{$arr[0]['blz']}','{$arr[0]['betrag']}','{$arr[0]['vz1']}','".$this->app->User->GetFirma()."')"); } //@refactor versanddiestleister Modul function TrackingNummerAnpassen($projekt,$tracking) { if($this->Projektdaten($projekt,"tracking_substr_length") > 0) $tracking = substr($tracking,$this->Projektdaten($projekt,"tracking_substr_start"),$this->Projektdaten($projekt,"tracking_substr_length")); else $tracking = substr($tracking,$this->Projektdaten($projekt,"tracking_substr_start")); //TODO anpassung, damit die Nummer an schluss entfernt wird $kundennummerdpd = $this->app->DB->Select("SELECT dpdkundennr FROM projekt WHERE id='$projekt' LIMIT 1"); if($this->Projektdaten($projekt,"tracking_remove_kundennummer") =="1") $tracking = str_replace($kundennummerdpd,"",$tracking); return $tracking; } //@refactor versanddiestleister Modul function PaketmarkeGewichtForm($anzahl, $standardkg, $mindestgewicht = 0) { $mitwaage = false; $mindestgewicht = (float)$mindestgewicht; if($this->app->erp->Firmendaten('paketmarke_mit_waage')) { $mitwaage = $this->app->DB->Select("SELECT seriennummer FROM adapterbox WHERE verwendenals = 'waage' AND seriennummer <> '' LIMIT 1"); } if($anzahl==1) { $i=1; $this->app->Tpl->Add('GEWICHT','Gewicht: in kg'); if($mitwaage) { $this->app->Tpl->Add('GEWICHT',' '); $this->app->Tpl->Set('SERIENNUMMER', $mitwaage); $this->app->Tpl->Set('MINDESTGEWICHT', $mindestgewicht); $this->app->Tpl->Parse('GEWICHT', 'paketmarke_waage.tpl'); } $this->app->Tpl->Add('GEWICHT',''); } else { for($i=1;$i<=$anzahl;$i++) { $this->app->Tpl->Add('GEWICHT','Gewicht: in kg'); if($mitwaage) { $this->app->Tpl->Add('GEWICHT',' '); $this->app->Tpl->Set('SERIENNUMMER', $mitwaage); $this->app->Tpl->Set('MINDESTGEWICHT', $mindestgewicht); if($i == 1)$this->app->Tpl->Parse('GEWICHT', 'paketmarke_waage.tpl'); } $this->app->Tpl->Add('GEWICHT',''); } } } //@refactor versanddiestleister Modul function VersandartMindestgewicht($id=0) { $gewicht = $this->LieferscheinNettoGewicht($id); $versandart =""; $projekt=0; $intraship_weightinkg=0; $gewicht /= $this->GewichtzuKgFaktor(); if($id > 0) { $versandart = $this->app->DB->Select("SELECT versandart FROM lieferschein WHERE id='$id' LIMIT 1"); $projekt = $this->app->DB->Select("SELECT projekt FROM lieferschein WHERE id='$id' LIMIT 1"); $intraship_weightinkg = $this->app->DB->Select("SELECT intraship_weightinkg FROM projekt WHERE id='$projekt' LIMIT 1"); $versandart = strtolower($versandart); $modul = $this->app->DB->SelectArr("SELECT id, modul FROM `versandarten` WHERE aktiv = 1 AND ausprojekt = 0 AND modul <> '' AND type = '".$this->app->DB->real_escape_string($versandart)."' AND geloescht = 0 AND (projekt = 0 OR projekt = '$projekt') ORDER by projekt = '$projekt' DESC LIMIT 1"); if($modul && @is_file(dirname(__FILE__).'/versandarten/'.$modul[0]['modul'].'.php')) { $obj = $this->LoadVersandModul($modul[0]['modul'], $modul[0]['id']); if($obj){ if(method_exists($obj, 'VersandartMindestgewicht')) $mindestgewicht = $obj->VersandartMindestgewicht(); return $mindestgewicht > $gewicht ? $mindestgewicht : $gewicht; } } } if(($versandart=="dhl" || $versandart=="versandunternehmen") && $intraship_weightinkg > 0 && $gewicht <=0) return $intraship_weightinkg; else if ($gewicht > 0) return $gewicht; else return 2; } //@refactor ApplicationCore function LoadVersandModul(string $modul, int $id): Versanddienstleister { /** @var Versandarten $versandarten */ $versandarten = $this->app->loadModule('versandarten'); return $versandarten->loadModule($modul, $id); } //@refactor versanddiestleister Modul function ExtractStreetnumber($street) { $address = trim($street); $number = preg_replace('/^.*?(\d+).*$/i', '$1', $address); // suche erstes vorkommen $pos = strpos($address,$number); if($pos === 0) { $result = substr($address, 0, strpos($address ,' ')); }else{ $result = substr ( $address, $pos); } return $result; } //@refactor versanddiestleister Modul function RetoureNettoGewicht($id) { return $this->LieferscheinNettoGewicht($id, 'retoure'); } //@refactor versanddiestleister Modul /** * @param int $id * @param string $doctype * * @return float|int */ public function LieferscheinNettoGewicht($id=0, $doctype = 'lieferschein') { if($id <= 0) { return 0; } if($this->Firmendaten('stuecklistegewichtnurartikel')!='1') { $nettogewicht = $this->app->DB->Select( "SELECT SUM(REPLACE(a.gewicht,',','.')*ap.menge) FROM ".$doctype."_position ap INNER JOIN artikel a ON ap.artikel=a.id WHERE ap.".$doctype."='$id'"); } else { $nettogewicht = $this->app->DB->Select( "SELECT SUM(REPLACE(if(a2.gewicht > 0,0,a.gewicht),',','.')*ap.menge) FROM ".$doctype."_position ap INNER JOIN artikel a ON ap.artikel=a.id LEFT JOIN ".$doctype."_position ap2 ON ap2.id=ap.explodiert_parent LEFT JOIN artikel a2 ON a2.id=ap2.artikel WHERE ap.".$doctype."='$id'" ); } if($nettogewicht > 0){ return round($nettogewicht, 2); } return 0; } //@refactor versanddiestleister Modul /** * @param int $id * * @return float|int */ public function AuftragNettoGewicht($id=0) { if($id <= 0) { return 0; } if($this->Firmendaten('stuecklistegewichtnurartikel')!='1') { $nettogewicht = $this->app->DB->Select( "SELECT SUM(REPLACE(a.gewicht,',','.')*ap.menge) FROM auftrag_position ap INNER JOIN artikel a ON ap.artikel=a.id WHERE ap.auftrag='$id'" ); } else { $nettogewicht = $this->app->DB->Select( "SELECT SUM(REPLACE(if(a2.gewicht > 0,0,a.gewicht),',','.')*ap.menge) FROM auftrag_position ap INNER JOIN artikel a ON ap.artikel=a.id LEFT JOIN auftrag_position ap2 ON ap2.id=ap.explodiert_parent LEFT JOIN artikel a2 ON a2.id=ap2.artikel WHERE ap.auftrag='$id'" ); } if($nettogewicht > 0){ return round($nettogewicht, 2); } return 0; } function BestellungNettoGewicht($id=0){ if($id <= 0) { return 0; } if($this->Firmendaten('stuecklistegewichtnurartikel')!='1') { $nettogewicht = $this->app->DB->Select( "SELECT SUM(REPLACE(a.gewicht,',','.')*bp.menge) FROM bestellung_position bp INNER JOIN artikel a ON bp.artikel=a.id WHERE bp.bestellung='$id'"); } else { $nettogewicht = $this->app->DB->Select( "SELECT SUM(REPLACE(if(a2.gewicht > 0,0,a.gewicht),',','.')*bp.menge) FROM bestellung_position bp INNER JOIN artikel a ON bp.artikel=a.id LEFT JOIN bestellung_position bp2 ON bp2.id=bp.explodiert_parent LEFT JOIN artikel a2 ON a2.id=bp2.artikel WHERE bp.bestellung='$id'" ); } if($nettogewicht > 0){ return round($nettogewicht, 2); } return 0; } function AngebotNettoGewicht($id=0){ if($id <= 0) { return 0; } if($this->Firmendaten('stuecklistegewichtnurartikel')!='1') { $nettogewicht = $this->app->DB->Select( "SELECT SUM(REPLACE(a.gewicht,',','.')*ap.menge) FROM angebot_position ap INNER JOIN artikel a ON ap.artikel=a.id WHERE ap.angebot='$id'" ); } else { $nettogewicht = $this->app->DB->Select( "SELECT SUM(REPLACE(if(a2.gewicht > 0,0,a.gewicht),',','.')*ap.menge) FROM angebot_position ap INNER JOIN artikel a ON ap.artikel=a.id LEFT JOIN angebot_position ap2 ON ap2.id=ap.explodiert_parent LEFT JOIN artikel a2 ON a2.id=ap2.artikel WHERE ap.angebot='$id'" ); } if($nettogewicht > 0){ return round($nettogewicht, 2); } return 0; } //@refactor versanddiestleister Modul public function ProformarechnungNettoGewicht($id=0,$round=true) { if($id <= 0) { return 0; } if($this->Firmendaten('stuecklistegewichtnurartikel')!='1') { $nettogewicht = $this->app->DB->Select( "SELECT SUM(REPLACE(a.gewicht,',','.')*prp.menge) FROM proformarechnung_position prp INNER JOIN artikel a ON prp.artikel=a.id WHERE prp.proformarechnung='$id'" ); } else { $nettogewicht = $this->app->DB->Select( "SELECT SUM(REPLACE(if(a2.gewicht > 0,0,a.gewicht),',','.')*ap.menge) FROM proformarechnung_position ap INNER JOIN artikel a ON ap.artikel=a.id LEFT JOIN proformarechnung_position ap2 ON ap2.id=ap.explodiert_parent_artikel LEFT JOIN artikel a2 ON a2.id=ap2.artikel WHERE ap.proformarechnung='$id'" ); } if($nettogewicht > 0) { if($round){ return round($nettogewicht,2); } return $nettogewicht; } return 0; } //@refactor Exportvorlage Modul function Gegenkonto($ust_befreit,$ustid='', $doctype = '', $doctypeId = 0) { /** @var Buchhaltungexport $buchhaltungexport */ $buchhaltungexport = $this->app->loadModule('buchhaltungexport', false); if($buchhaltungexport !== null && method_exists($buchhaltungexport, 'Gegenkonto')) { return $buchhaltungexport->Gegenkonto($ust_befreit, $ustid, $doctype, $doctypeId); } switch($ust_befreit) { case 0: $tmp['gegenkonto']=$this->Firmendaten("steuer_erloese_inland_normal"); break; case 1: if($ustid=="") { $tmp['gegenkonto']=$this->Firmendaten("steuer_erloese_inland_eunormal"); } else { $tmp['gegenkonto']=$this->Firmendaten("steuer_erloese_inland_innergemeinschaftlich"); } break; case 2: $tmp['gegenkonto']=$this->Firmendaten("steuer_erloese_inland_export"); break; case 3: $tmp['gegenkonto']=$this->Firmendaten("steuer_erloese_inland_nichtsteuerbar"); break; default: //TODO echo "FEHLER!"; exit; } if($tmp['gegenkonto']=="") { $tmp['gegenkonto']=$this->Firmendaten("steuer_standardkonto"); } return $tmp['gegenkonto']; } /** * @deprecated Use the setValue() function in SystemConfigModule instead
* Retrieve data with the getValue() and tryGetValue() functions
* Mind the additional namespace parameter * * @param string $name * @param mixed $value */ public function SetKonfigurationValue($name,$value) { $this->app->DB->Delete( sprintf( "DELETE FROM konfiguration WHERE name='%s'", $name ) ); $this->app->DB->Insert( sprintf( "INSERT INTO konfiguration (name,wert,firma,adresse) VALUES ('%s','%s',%d,%d)", $name, $value, isset($this->app->User) && method_exists($this->app->User, 'GetFirma')?$this->app->User->GetFirma():1, isset($this->app->User) && method_exists($this->app->User, 'GetAdresse')?$this->app->User->GetAdresse():0 ) ); } /** * @deprecated Use the NOT COMPATIBLE setValue() function in SystemConfigModule instead
* Retrieve data with the getValue() and tryGetValue() functions
* Mind the additional namespace parameter * * @param string $name * @param bool $dezimal */ function SetKonfiguration($name,$dezimal=false) { $this->app->DB->Delete("DELETE FROM konfiguration WHERE name='$name' LIMIT 1"); if($dezimal) $value = str_replace(',','.',$this->app->Secure->GetPOST($name)); else $value = $this->app->Secure->GetPOST($name); $this->app->DB->Insert("INSERT INTO konfiguration (name,wert,firma,adresse) VALUES ('$name','$value','".$this->app->User->GetFirma()."','".$this->app->User->GetAdresse()."')"); } /** * @deprecated Use the tryGetLegacyValue() function in SystemConfigModule instead * * @param string $name * * @return string|bool */ function GetKonfiguration($name) { return $this->app->DB->Select("SELECT wert FROM konfiguration WHERE name='$name' LIMIT 1");// AND firma='".$this->app->User->GetFirma()."' LIMIT 1"); } /** * @param bool $active * @param string $type */ public function setMaintainance($active = true, $type = 'backup') { $tags = json_encode('update'); if(!$active) { if($this->GetKonfiguration('update_maintenance') == '0') { return; } $this->SetKonfigurationValue('update_maintenance', 0); $this->SetKonfigurationValue('update_maintenance_mode', ''); //$this->app->DB->Delete("DELETE FROM notification_message WHERE tags = '$tags'"); return; } if($type !== 'backup') { return; //@todo } $this->SetKonfigurationValue('update_maintenance_mode', $type); if($this->GetKonfiguration('update_maintenance') == '1') { $this->SetKonfigurationValue('update_maintenance_time', time()); return; } /* $this->app->DB->Insert( "INSERT INTO notification_message (user_id, type, title, message, tags, options_json, priority, created_at) SELECT u.id, 'warning', 'laufender Backup-Prozess', 'Bitte schließen Sie Ihre Aufgaben','$tags','',1,NOW() FROM `user` AS `u` INNER JOIN `useronline` AS `uo` on u.id = uo.user_id AND uo.login = 1" );*/ $this->SetKonfigurationValue('update_maintenance_time', time()); $this->SetKonfigurationValue('update_maintenance', 1); } //@refactor Folgebestaetigung Modul function Folgebestaetigung($adresse) { $sperre = $this->app->DB->Select("SELECT folgebestaetigungsperre FROM adresse WHERE id='$adresse' LIMIT 1"); if($sperre=="1") return 1; // hole alle freigebeben auftraege $auftragarr = $this->app->DB->SelectArr("SELECT id,belegnr,ihrebestellnummer,DATE_FORMAT(datum,'%d.%m.%Y') as datum2, DATE_FORMAT(lieferdatum,'%d.%m.%Y') as lieferdatum2, liefertermin_ok FROM auftrag WHERE adresse='$adresse' AND status='freigegeben' AND (lager_ok!=1 OR liefertermin_ok!=1) ORDER by lieferdatum"); $to = $this->app->DB->Select("SELECT email FROM adresse WHERE id='$adresse' LIMIT 1"); $to_name = $this->app->DB->Select("SELECT name FROM adresse WHERE id='$adresse' LIMIT 1"); for($iauftrag=0;$iauftrag<(!empty($auftragarr)?count($auftragarr):0);$iauftrag++) { $auftrag = $auftragarr[$iauftrag]['id']; $projekt = $this->app->DB->Select("SELECT projekt FROM auftrag WHERE id='$auftrag' LIMIT 1"); $folgebestaetigung = $this->app->DB->Select("SELECT folgebestaetigung FROM projekt WHERE id='$projekt' LIMIT 1"); if($folgebestaetigung!=1) continue; if($auftragarr[$iauftrag]['lieferdatum2']=="00.00.0000") $auftragarr[$iauftrag]['lieferdatum2'] = $this->app->erp->Beschriftung("dokument_lieferdatum_sofort"); if($auftragarr[$iauftrag]['liefertermin_ok']!="1") { $artikeltabelleliefertermin .= "
-Auftrag ".$auftragarr[$iauftrag]['belegnr']." vom ".$auftragarr[$iauftrag]['datum2']." Bestellung/Kommission: ".$auftragarr[$iauftrag]['ihrebestellnummer']." (geplanter Liefertermin: ".$auftragarr[$iauftrag]['lieferdatum2'].")
"; } else { $artikeltabelle .= "
-Auftrag ".$auftragarr[$iauftrag]['belegnr']." vom ".$auftragarr[$iauftrag]['datum2']." Bestellung/Kommission: ".$auftragarr[$iauftrag]['ihrebestellnummer']." (geplanter Liefertermin: ".$auftragarr[$iauftrag]['lieferdatum2'].")
"; } //$to = $this->app->DB->Select("SELECT email FROM auftrag WHERE id='$auftrag' LIMIT 1"); //$to_name = $this->app->DB->Select("SELECT name FROM auftrag WHERE id='$auftrag' LIMIT 1"); $arr = $this->app->DB->SelectArr("SELECT ap.nummer, ap.bezeichnung, ap.menge, (SELECT SUM(lp.menge) FROM lager_platz_inhalt lp WHERE lp.artikel=ap.artikel) as lager, (SELECT SUM(lr.menge) FROM lager_reserviert lr WHERE lr.artikel=ap.artikel AND lr.datum>=NOW() AND lr.objekt!='lieferschein') as reserviert, if(((SELECT SUM(lp.menge) FROM lager_platz_inhalt lp WHERE lp.artikel=ap.artikel) - (SELECT SUM(lr.menge) FROM lager_reserviert lr WHERE lr.artikel=ap.artikel AND lr.datum>=NOW() AND lr.objekt!='lieferschein') - ap.menge)>=0,'', ((SELECT SUM(lp.menge) FROM lager_platz_inhalt lp WHERE lp.artikel=ap.artikel) - (SELECT SUM(lr.menge) FROM lager_reserviert lr WHERE lr.artikel=ap.artikel AND lr.datum>=NOW() AND lr.objekt!='lieferschein') - ap.menge) ) as fehlend FROM auftrag_position ap LEFT JOIN artikel a ON a.id=ap.artikel WHERE ap.auftrag='$auftrag' AND a.lagerartikel=1"); foreach($arr as $value) { $artikel = $value['bezeichnung']; $nummer = $value['nummer']; $menge = $value['menge']; $lager = $value['lager']; $reserviert= $value['reserviert']; if(($lager-$reserviert < $menge) && $auftragarr[$iauftrag]['liefertermin_ok']=="1") { $artikeltabelle .= "--Artikel: ".$artikel." (Nummer: $nummer) Menge: ".$menge."
"; } else { $artikeltabelleliefertermin .= "--Artikel: ".$artikel." (Nummer: $nummer) Menge: ".$menge."
"; } } } if($artikeltabelle!="") $artikeltabelle ="Rückstand:

".$artikeltabelle."

"; if($artikeltabelleliefertermin!="") $artikeltabelle .="Offene Aufträge:

".$artikeltabelleliefertermin; $artikeltabelle = $this->ReadyForPDF($artikeltabelle); if($artikeltabelle!="") { $text = $this->GetGeschaeftsBriefText('Folgebestaetigung',$sprache, $projekt,"",$auftrag); $betreff = $this->GetGeschaeftsBriefBetreff('Folgebestaetigung', $sprache,$projekt,"auftrag",$auftrag); if($text == "") { $text = 'Lieber Kunde, anbei übersenden wir Ihnen eine Liste mit den aktuell offenen Aufträgen (Rückstand und Aufträge mit Liefertermin): '.$artikeltabelle.' Bei Fragen zu Lieferungen wenden Sie sich gerne an unser Kundensupport-Center.'; $betreff = "Folgebestätigung für offene Aufträge"; } else { $text = str_replace('{ARTIKELTABELLE}',$artikeltabelle,$text); } if($to!="" && $to_name!="") $this->MailSend($this->GetFirmaMail(),$this->GetFirmaAbsender(),$to,$to_name,$betreff,$text,"",$projekt); //echo $text; } } // prueft datei anhang aus geschaeftsbriefvorlagen, wenn diese fehlen werden die ergänzt //@refactor Geschaeftsbrief_vorlagen Modul function GeschaeftsBriefAnhang($subjekt,$sprache="",$projekt="",$dokument="",$dokumentid="") { if($dokument!="") { $abweichend = $this->app->DB->Select("SELECT abweichendebezeichnung FROM $dokument WHERE id='$dokumentid' LIMIT 1"); if($abweichend>0 && !preg_match('/_Abweichend/',$subjekt)) { $idvorlage = $this->GetGeschaeftsBriefID($subjekt."_Abweichend",$sprache,$projekt); } } if($idvorlage <=0) $idvorlage = $this->GetGeschaeftsBriefID($subjekt,$sprache,$projekt); $stichwoerter = $this->app->DB->SelectArr("SELECT * FROM datei_stichwoerter WHERE objekt='geschaeftsbrief_vorlagen' AND parameter='$idvorlage' AND parameter > 0"); $cstichwoerter = !empty($stichwoerter)?count($stichwoerter):0; $tmpresult = array(); for($i=0;$i<$cstichwoerter;$i++) { $check = $this->app->DB->Select("SELECT id FROM datei_stichwoerter WHERE datei='".$stichwoerter[$i]['datei']."' AND objekt LIKE '$subjekt' AND parameter='$dokumentid' LIMIT 1"); if($check<=0) { if($dokument!="") { $this->app->DB->Insert("INSERT INTO datei_stichwoerter (id,datei,subjekt,objekt,parameter) VALUES ('','".$stichwoerter[$i]['datei']."','".$stichwoerter[$i]['subjekt']."','$subjekt',$dokumentid)"); } else { $tmpresult[] = $stichwoerter[$i]['datei']; } } } return $tmpresult; } //@refactor Geschaeftsbrief_vorlagen Modul function GetGeschaeftsBriefText($subjekt,$sprache='',$projekt='',$dokument='',$dokumentid=0) { $text = ''; if ($dokument != '') { $dbcheck = $this->app->DB->Select("SHOW TABLES LIKE '$dokument'"); if (!empty($dbcheck)) { $abweichend = $this->app->DB->Select("SELECT abweichendebezeichnung FROM $dokument WHERE id='$dokumentid' LIMIT 1"); } if($abweichend>0 && !preg_match('/_Abweichend/',$subjekt)) { $text = $this->GetGeschaeftsBriefText($subjekt."_Abweichend",$sprache,$projekt,$dokument,$dokumentid); } } if($text=='') { if($sprache==''){ $sprache = 'deutsch'; } if($projekt > 0){ $text = $this->app->DB->Select("SELECT text FROM geschaeftsbrief_vorlagen WHERE subjekt='$subjekt' AND sprache='$sprache' AND projekt='$projekt' LIMIT 1"); } if($text == ''){ $text = $this->app->DB->Select("SELECT text FROM geschaeftsbrief_vorlagen WHERE subjekt='$subjekt' AND sprache='$sprache' AND (projekt='0' OR projekt='') LIMIT 1"); } if($text == ''){ $text = $this->app->DB->Select("SELECT text FROM geschaeftsbrief_vorlagen WHERE subjekt='$subjekt' AND sprache='$sprache' LIMIT 1"); } if($text == ''){ $text = $this->app->DB->Select("SELECT text FROM geschaeftsbrief_vorlagen WHERE subjekt='$subjekt' LIMIT 1"); } } $text = str_replace('{FIRMA}',$this->Firmendaten("name"),$text); return $text; } //@refactor Geschaeftsbrief_vorlagen Modul function GetGeschaeftsBriefBetreff($subjekt,$sprache="",$projekt="",$dokument="",$dokumentid=0) { $text = ''; if ($dokument != '') { $dbcheck = $this->app->DB->Select("SHOW TABLES LIKE '$dokument'"); if ($dbcheck) { $abweichend = $this->app->DB->Select("SELECT abweichendebezeichnung FROM $dokument WHERE id='$dokumentid' LIMIT 1"); } if($abweichend>0 && !preg_match('/_Abweichend/',$subjekt)) { $text = $this->GetGeschaeftsBriefBetreff($subjekt."_Abweichend",$sprache,$projekt,$dokument,$dokumentid); } } if($text=="") { if($sprache=="") $sprache = "deutsch"; if($projekt > 0) $text = $this->app->DB->Select("SELECT betreff FROM geschaeftsbrief_vorlagen WHERE subjekt='$subjekt' AND sprache='$sprache' AND projekt='$projekt' LIMIT 1"); if($text == "") $text = $this->app->DB->Select("SELECT betreff FROM geschaeftsbrief_vorlagen WHERE subjekt='$subjekt' AND sprache='$sprache' AND (projekt='0' OR projekt='') LIMIT 1"); if($text == "") $text = $this->app->DB->Select("SELECT betreff FROM geschaeftsbrief_vorlagen WHERE subjekt='$subjekt' AND sprache='$sprache' LIMIT 1"); if($text == "") $text = $this->app->DB->Select("SELECT betreff FROM geschaeftsbrief_vorlagen WHERE subjekt='$subjekt' LIMIT 1"); } $text = str_replace('{FIRMA}',$this->Firmendaten("name"),$text); return $text; } //@refactor Geschaeftsbrief_vorlagen Modul function GetGeschaeftsBriefID($subjekt,$sprache="",$projekt="") { if($sprache=="") $sprache = "deutsch"; if($projekt > 0) $id = $this->app->DB->Select("SELECT id FROM geschaeftsbrief_vorlagen WHERE subjekt='$subjekt' AND sprache='$sprache' AND projekt='$projekt' LIMIT 1"); if($id == "") $id = $this->app->DB->Select("SELECT id FROM geschaeftsbrief_vorlagen WHERE subjekt='$subjekt' AND sprache='$sprache' AND (projekt='0' OR projekt='') LIMIT 1"); if($id == "") $id = $this->app->DB->Select("SELECT id FROM geschaeftsbrief_vorlagen WHERE subjekt='$subjekt' AND sprache='$sprache' LIMIT 1"); if($id == "") $text = $this->app->DB->Select("SELECT id FROM geschaeftsbrief_vorlagen WHERE subjekt='$subjekt' LIMIT 1"); return $id; } public function Stornomail($auftrag) { if($auftrag > 0){ $auftragarr = $this->app->DB->SelectRow("SELECT adresse,projekt,email,name,belegnr,keinestornomail,sprache FROM auftrag WHERE id='$auftrag' LIMIT 1"); } if(empty($auftragarr)) { return; } $adresse = $auftragarr['adresse']; $projekt = $auftragarr['projekt']; $stornomail = $this->app->DB->Select("SELECT stornomail FROM projekt WHERE id='$projekt' LIMIT 1"); // KEINE STORNOMAIL if($stornomail!=1){ return; } $to = $auftragarr['email']; $to_name = $auftragarr['name']; $parameter = $auftrag; $belegnr = $auftragarr['belegnr']; $keinestornomail = $auftragarr['keinestornomail']; if($belegnr !='' && $keinestornomail==0) { $sprache = $auftragarr['sprache']; if($sprache == '') { //$adresse = $this->app->DB->Select("SELECT adresse FROM auftrag WHERE id = '$auftrag' LIMIT 1"); if($adresse > 0){ $sprache = $this->app->DB->Select("SELECT sprache FROM adresse WHERE id = '$adresse' LIMIT 1"); } if($sprache == ''){ $sprache = 'deutsch'; } } $text = $this->GetGeschaeftsBriefText('Stornierung',$sprache, $projekt,"",$auftrag); $betreff = $this->GetGeschaeftsBriefBetreff('Stornierung', $sprache,$projekt,"auftrag",$auftrag); if($sprache != 'deutsch' && ($text == '' || $betreff == '')) { $text = $this->GetGeschaeftsBriefText('Stornierung','deutsch',$projekt,"auftrag",$auftrag); $betreff = $this->GetGeschaeftsBriefBetreff('Stornierung','deutsch',$projekt,"auftrag",$auftrag); } $text = $this->ParseUserVars('auftrag',$auftrag,$text); $betreff = $this->ParseUserVars('auftrag',$auftrag,$betreff); if($to!='' && $to_name!=''){ $this->MailSend($this->GetFirmaMail(), $this->GetFirmaAbsender(), $to, $to_name, $betreff, $text, "", $projekt); } } } public function ExportlinkZahlungsmail() { $exports = $this->app->DB->SelectArr("SELECT * FROM exportlink_sent WHERE mail='0'"); $cexports = !empty($exports)?count($exports):0; for($i=0;$i<$cexports;$i++) //for($i=0;$i<5;$i++) { // mail $adresse = $exports[$i]['adresse']; $reg= $exports[$i]['reg']; $artikelid = $exports[$i]['objekt']; $to = $this->app->DB->Select("SELECT email FROM adresse WHERE id='$adresse' LIMIT 1"); $to_name = $this->app->DB->Select("SELECT name FROM adresse WHERE id='$adresse' LIMIT 1"); $artikel = $this->app->DB->Select("SELECT name_de FROM artikel WHERE id='$artikelid' LIMIT 1"); $sprache = $this->app->DB->Select("SELECT sprache FROM adresse WHERE id = '$adresse' LIMIT 1"); if($sprache == '')$sprache = 'deutsch'; $projekt=1; $text = $this->GetGeschaeftsBriefText('AlternativArtikel',$sprache, $projekt); $betreff = $this->GetGeschaeftsBriefBetreff('AlternativArtikel', $sprache,$projekt); if($sprache != 'deutsch' && ($text == '' || $betreff == '')) { $text = $this->GetGeschaeftsBriefText('AlternativArtikel','deutsch',$projekt); $betreff = $this->GetGeschaeftsBriefBetreff('AlternativArtikel','deutsch',$projekt); } $betreff = str_replace('[ARTIKEL]',$artikel,$betreff); $text= str_replace('[ARTIKEL]',$artikel,$text); $text = str_replace('[AUFTRAG]',$auftrag,$text); $text = str_replace('[REG]',$reg,$text); $this->MailSend($this->GetFirmaMail(),$this->GetFirmaAbsender(),$to,$to_name,$betreff,$text,"",$projekt); echo $to_name." <".$to.">\r\n"; $this->app->DB->Update("UPDATE exportlink_sent SET mail=1 WHERE reg='$reg' LIMIT 1"); } } public function AuftragZahlungsmail($id='',$force=0) { if(!is_numeric($id)){ $id = $this->app->Secure->GetGET('id'); } else { $intern=1; } if($id > 0) { $auftragarr = $this->app->DB->SelectRow("SELECT belegnr,adresse,gesamtsumme,projekt FROM auftrag WHERE id='$id' LIMIT 1"); } if(!empty($auftragarr)){ $belegnr = $auftragarr['belegnr']; $adresse = $auftragarr['adresse']; $summeimauftrag = 0; $auftragssumme = $auftragarr['gesamtsumme']; $projekt = $auftragarr['projekt']; if($projekt > 0 && $auftragssumme > 0){ $projektarr = $this->app->DB->SelectRow("SELECT zahlungserinnerung,zahlungsmailbedinungen FROM projekt WHERE id='$projekt' LIMIT 1"); } if(!empty($projektarr)) { $zahlungsmail = $projektarr['zahlungserinnerung']; if($zahlungsmail){ $zahlungsmailbedinungen = $projektarr['zahlungsmailbedinungen']; // sind vorbedingungen erfuellt? $vorbedinungen = 0; if(preg_match('/lager_ok/', $zahlungsmailbedinungen)){ $lager_ok = $this->app->DB->Select("SELECT lager_ok FROM auftrag WHERE id='$id' LIMIT 1"); if($lager_ok == 0) $vorbedinungen++; } // Kundencheck if(preg_match('/check_ok/', $zahlungsmailbedinungen)){ $check_ok = $this->app->DB->Select("SELECT check_ok FROM auftrag WHERE id='$id' LIMIT 1"); if($check_ok == 0) $vorbedinungen++; } //echo "zahlungsmail $zahlungsmail $vorbedinungen $auftragssumme $belegnr\r\n "; if(($zahlungsmail > 0) && ($vorbedinungen == 0) && ($auftragssumme > 0) && ($id > 0)){ //echo "verschickt"; $this->Zahlungsmail($adresse, $auftragssumme - $summeimauftrag, $id, $force); } } } } if($intern!=1) { header("Location: index.php?module=auftrag&action=edit&id=$id"); exit; } } function KalenderMail($event,$betreff="",$text="",$emailcc="") { /** @var Kalender $obj */ $obj = $this->LoadModul('kalender'); if(!empty($obj) && method_exists($obj,'KalenderMail')) { return $obj->KalenderMail($event,$betreff,$text,$emailcc); } } function AufgabenMail($aufgabe,$vorabankuendigung=false) { /** @var Aufgaben $obj */ $obj = $this->LoadModul('aufgaben'); if(!empty($obj) && method_exists($obj,'sendAufgabenMail')) { return $obj->sendAufgabenMail($aufgabe,$vorabankuendigung); } } function Zahlungsmail($adresse,$rest="",$auftragid="",$force=0) { if(!is_numeric($auftragid)) return; $to = $this->app->DB->Select("SELECT email FROM auftrag WHERE id='$auftragid' LIMIT 1"); $to_name = $this->app->DB->Select("SELECT name FROM auftrag WHERE id='$auftragid' LIMIT 1"); //$to = ""; //DEBUG $belegnr = $this->app->DB->Select("SELECT belegnr FROM auftrag WHERE id='$auftragid' LIMIT 1"); $internetnummer = $this->app->DB->Select("SELECT internet FROM auftrag WHERE id='$auftragid' LIMIT 1"); $projekt = $this->app->DB->Select("SELECT projekt FROM auftrag WHERE id='$auftragid' LIMIT 1"); $zahlungsmail = $this->app->DB->Select("SELECT zahlungserinnerung FROM projekt WHERE id='$projekt' LIMIT 1"); $zahlungsmailcounter = (int)$this->app->DB->Select("SELECT zahlungsmailcounter FROM auftrag WHERE id='$auftragid' LIMIT 1"); $check_adresse = $this->app->DB->Select("SELECT adresse FROM auftrag WHERE id='$auftragid' LIMIT 1"); $sprache = $this->app->DB->Select("SELECT sprache FROM auftrag WHERE id = '$auftragid' LIMIT 1"); if($sprache == '') { $adresse = $this->app->DB->Select("SELECT adresse FROM auftrag WHERE id = '$auftragid' LIMIT 1"); $sprache = $this->app->DB->Select("SELECT sprache FROM adresse WHERE id = '$adresse' LIMIT 1"); if($sprache == '')$sprache = 'deutsch'; } // wenn der auftrag dem Kunden nicht gehört //if($adresse!=$check_adresse) return; $gesamt = $this->app->DB->Select("SELECT gesamtsumme FROM auftrag WHERE id='$auftragid' LIMIT 1"); $zahlungok = false; if($rest!="") { //Falls projekt mail vorhanden sonst globalen firmen standard if($gesamt-$rest==0) { $text = $this->GetGeschaeftsBriefText('ZahlungMiss',$sprache,$projekt,"auftrag",$auftragid); $betreff = $this->GetGeschaeftsBriefBetreff('ZahlungMiss',$sprache,$projekt,"auftrag",$auftragid); if($sprache != 'deutsch' && ($text == '' || $betreff == '')) { $text = $this->GetGeschaeftsBriefText('ZahlungMiss','deutsch',$projekt,"auftrag",$auftragid); $betreff = $this->GetGeschaeftsBriefBetreff('ZahlungMiss','deutsch',$projekt,"auftrag",$auftragid); } } else { $text = $this->GetGeschaeftsBriefText('ZahlungDiff',$sprache,$projekt,"auftrag",$auftragid); $betreff = $this->GetGeschaeftsBriefBetreff('ZahlungDiff',$sprache,$projekt,"auftrag",$auftragid); if($sprache != 'deutsch' && ($text == '' || $betreff == '')) { $text = $this->GetGeschaeftsBriefText('ZahlungDiff','deutsch',$projekt,"auftrag",$auftragid); $betreff = $this->GetGeschaeftsBriefBetreff('ZahlungDiff','deutsch',$projekt,"auftrag",$auftragid); } } $rest = number_format($rest, 2, ',', '.'); $text= str_replace('{REST}',$rest,$text); $betreff = str_replace('{FIRMA}',$this->Firmendaten("name"),$betreff); $text = str_replace('{FIRMA}',$this->Firmendaten("name"),$text); if($internetnummer>0) $text= str_replace('{AUFTRAG}',$internetnummer,$text); else $text= str_replace('{AUFTRAG}',$belegnr,$text); $text= str_replace('{INTERNET}',$internetnummer,$text); $text= str_replace('{GESAMT}',$this->app->DB->Select("SELECT gesamtsumme FROM auftrag WHERE id='$auftragid' LIMIT 1"),$text); $gesamtsummecheck = $rest; $text= str_replace('{DATUM}',$this->app->DB->Select("SELECT DATE_FORMAT(datum,'%d.%m.%Y') FROM auftrag WHERE id='$auftragid' LIMIT 1"),$text); } else { //TODO nette mail wenn kunde keine vorkasse macht, warum er das nicht macht etc. $zahlungok = true; $text = $this->GetGeschaeftsBriefText('ZahlungOK',$sprache,$projekt,"auftrag",$auftragid); $betreff = $this->GetGeschaeftsBriefBetreff('ZahlungOK',$sprache,$projekt); if($sprache != 'deutsch' && ($text == '' || $betreff == '')) { $text = $this->GetGeschaeftsBriefText('ZahlungOK','deutsch',$projekt,"auftrag",$auftragid); $betreff = $this->GetGeschaeftsBriefBetreff('ZahlungOK','deutsch',$projekt,"auftrag",$auftragid); } $gesamtsumme = $this->app->DB->Select("SELECT gesamtsumme FROM auftrag WHERE id='$auftragid' LIMIT 1"); $text= str_replace('{AUFTRAG}',$belegnr,$text); $betreff= str_replace('{AUFTRAG}',$belegnr,$betreff); $text= str_replace('{GESAMT}',$gesamtsumme,$text); $betreff= str_replace('{GESAMT}',$gesamtsumme,$betreff); $gesamtsummecheck = $gesamtsumme; $text= str_replace('{DATUM}',$this->app->DB->Select("SELECT DATE_FORMAT(datum,'%d.%m.%Y') FROM kontoauszuege_zahlungseingang WHERE objekt='auftrag' AND parameter='$auftragid' LIMIT 1"),$text); $betreff= str_replace('{DATUM}',$this->app->DB->Select("SELECT DATE_FORMAT(datum,'%d.%m.%Y') FROM kontoauszuege_zahlungseingang WHERE objekt='auftrag' AND parameter='$auftragid' LIMIT 1"),$betreff); $zahlungok = true; } $text = $this->ParseUserVars("auftrag",$auftragid,$text); $betreff = $this->ParseUserVars("auftrag",$auftragid,$betreff); $mahnwesen_erinnerungsmail = (String)$this->app->erp->GetKonfiguration("mahnwesen_erinnerungsmail"); if($mahnwesen_erinnerungsmail === '') { $mahnwesen_erinnerungsmail = 1; } $mahnwesen_klaerungsmail = (String)$this->app->erp->GetKonfiguration("mahnwesen_klaerungsmail"); if($mahnwesen_klaerungsmail === '') { $mahnwesen_klaerungsmail = 1; } $mahnwesen_skontomail = (String)$this->app->erp->GetKonfiguration("mahnwesen_skontomail"); if($mahnwesen_skontomail === '') { $mahnwesen_skontomail = 1; } $mahnwesen_zahlungserinnerungtage = (String)$this->app->erp->GetKonfiguration("mahnwesen_zahlungserinnerungtage"); if($mahnwesen_zahlungserinnerungtage === '') { $mahnwesen_zahlungserinnerungtage = 6; } $mahnwesen_klaerungsmailtage = (String)$this->app->erp->GetKonfiguration("mahnwesen_klaerungsmailtage"); if($mahnwesen_klaerungsmailtage === '') { $mahnwesen_klaerungsmailtage = 11; } $zahlungsmailauftrag = $this->app->DB->Select("SELECT zahlungsmail FROM auftrag WHERE id='$auftragid' LIMIT 1"); if($zahlungsmailauftrag=="") $zahlungsmailauftrag = "0000-00-00"; if($zahlungsmailauftrag == "0000-00-00") { $tmpzahlungsmailauftrag = $this->app->DB->Select("SELECT datum FROM auftrag WHERE id='$auftragid' LIMIT 1"); } else { $tmpzahlungsmailauftrag = $zahlungsmailauftrag; } //$tage = ceil((mktime($zahlungsmailauftrag) - time())/60/60/24); $tage = $this->app->DB->Select("SELECT DATEDIFF(NOW(),'$tmpzahlungsmailauftrag')"); $schwelle = (String)$this->app->erp->GetKonfiguration("mahnwesen_schwelle"); if($schwelle === '') { $schwelle = 1; } $schwelle = (float)str_replace(',','.',$schwelle); if($schwelle < 0)$schwelle = 0; if( $to!="" && $to_name!="" && $zahlungsmail=="1" && ( $tage > $mahnwesen_klaerungsmailtage || $tage > $mahnwesen_zahlungserinnerungtage || $tmpzahlungsmailauftrag=="0000-00-00" || ($zahlungok && $zahlungsmailauftrag != '00000-00-00') || $force==1 ) ) { $zahlungsmailcounter++; $this->app->DB->Update("UPDATE auftrag SET zahlungsmail=NOW(),zahlungsmailcounter='$zahlungsmailcounter' WHERE id='$auftragid' LIMIT 1"); // wenn differenz groesser als ein EUR if($gesamtsummecheck>=$schwelle)// && $zahlungsmailcounter > 1) { if($zahlungok && $zahlungsmailauftrag != '00000-00-00')$zahlungsmailcounter--; if($zahlungsmailcounter<2) { if($mahnwesen_erinnerungsmail){ $this->MailSend($this->GetFirmaMail(),$this->GetFirmaAbsender(),$to,$to_name,$betreff,$text,"",$projekt); $this->DokumentCreateQuick($adresse,$betreff,$text,$projekt); } } // automatisch Reservierungen entfernen elseif(!$zahlungok) { if($tage > $mahnwesen_klaerungsmailtage) { if($mahnwesen_klaerungsmail){ $this->MailSend($this->GetFirmaMail(), $this->GetFirmaAbsender(), $this->GetFirmaMail(), "Buchhaltung", "Meldung fuer Buchhaltung: Offenen Auftrag $belegnr klären oder stornieren", $text, "", $projekt); } $this->app->DB->Update("UPDATE auftrag SET zahlungsmail=NOW(),zahlungsmailcounter='3' WHERE id='$auftragid' LIMIT 1"); }else{ $this->app->DB->Update("UPDATE auftrag SET zahlungsmail=NOW(),zahlungsmailcounter='1' WHERE id='$auftragid' LIMIT 1"); } } } else { if($mahnwesen_skontomail)$this->MailSend($this->GetFirmaMail(),$this->GetFirmaAbsender(),$this->GetFirmaMail(),"Buchhaltung","Meldung fuer Buchhaltung: Bitte Skonto geben",$text,"",$projekt); } } } public function Rechnungsmail($id, $fromautoversand = true) { if(!$id){ return; } $rechnungarr = $this->app->DB->SelectRow( "SELECT adresse, email, name,belegnr,projekt,sprache,schreibschutz,zuarchivieren FROM rechnung WHERE id='$id' LIMIT 1" ); if(empty($rechnungarr)) { return; } if(!empty($rechnungarr['schreibschutz']) && !empty($rechnungarr['zuarchivieren'])) { $this->app->erp->PDFArchivieren('rechnung', $id, true); } $adresse = $rechnungarr['adresse']; $to = $rechnungarr['email']; $to_name = $rechnungarr['name']; $belegnr = $rechnungarr['belegnr']; $projekt = $rechnungarr['projekt']; $sprache = $rechnungarr['sprache']; if($sprache=='' && $adresse > 0) { $sprache = $this->app->DB->Select("SELECT sprache FROM adresse WHERE id='$adresse' LIMIT 1"); } if($sprache==''){ $sprache='deutsch'; } $text = $this->GetGeschaeftsBriefText('Rechnung',$sprache,$projekt,"rechnung",$id); $betreff = $this->GetGeschaeftsBriefBetreff('Rechnung',$sprache,$projekt,"rechnung",$id); $this->GeschaeftsBriefAnhang('Rechnung',$sprache,$projekt,"rechnung",$id); if((String)$text === '' && $sprache !== 'deutsch') { $sprache = 'deutsch'; $text = $this->GetGeschaeftsBriefText('Rechnung',$sprache,$projekt,"rechnung",$id); $betreff = $this->GetGeschaeftsBriefBetreff('Rechnung',$sprache,$projekt,"rechnung",$id); } $text = $this->ParseUserVars('rechnung',$id,$text); // heute mal wieder rein 21.12.2017 BS $betreff = $this->ParseUserVars('rechnung',$id,$betreff); // 19.01.2018 eingefuegt BW if($id > 0) { $this->app->erp->BriefpapierHintergrunddisable = false; if(class_exists('RechnungPDFCustom')) { $Brief = new RechnungPDFCustom($this->app,$projekt); }else{ $Brief = new RechnungPDF($this->app,$projekt); } $Brief->GetRechnung($id); $arrtmpfile[] = $Brief->displayTMP(); if(!$Brief->DocumentArchiviert()) { $Brief->ArchiviereDocument(true, true); } $md5arr[] = @md5_file($arrtmpfile[(!empty($arrtmpfile)?count($arrtmpfile):0)-1]); // anhaenge automatisch mitversenden $resultdateien = $this->app->DB->SelectArr("SELECT datei FROM datei_stichwoerter WHERE objekt LIKE 'Rechnung' AND parameter='$id'"); $cResultdateien = !empty($resultdateien)?count($resultdateien):0; for($ri=0;$ri<$cResultdateien;$ri++) { $dateiname = str_replace(' ','_',$this->app->erp->GetDateiName($resultdateien[$ri]['datei'])); if($dateiname) { $dateiinhalt = $this->app->erp->GetDatei($resultdateien[$ri]['datei']); if($handle = fopen (rtrim($this->app->erp->GetTMP(),'/')."/".$dateiname, "wb")) { fwrite($handle, $dateiinhalt); fclose($handle); if(!in_array(rtrim($this->app->erp->GetTMP(),'/')."/".$dateiname, $arrtmpfile)) { $md5tmp = @md5_file(rtrim($this->app->erp->GetTMP(),'/')."/".$dateiname); if(!in_array($md5tmp, $md5arr)) { $md5arr[] = $md5tmp; $arrtmpfile[] = rtrim($this->app->erp->GetTMP(),'/')."/".$dateiname; } } } } } //$this->DokumentSendShow(TAB1,"rechnung",$rechnung,$adresse); // temp datei wieder loeschen if($to != '') { $result = $this->MailSend($this->GetFirmaMail(),$this->GetFirmaAbsender(),$to,$to_name,$betreff,$text,$arrtmpfile,$projekt); $this->DokumentCreateQuick($adresse,$betreff,$text,$projekt); }else{ $result = false; } //$tmpfilearray = array($arrtmpfile); $this->RunHook('rechnungsmail',5, $id,$betreff,$text,$arrtmpfile, $fromautoversand); $rechnung_cc = $this->app->DB->Select("SELECT rechnung_cc FROM adresse WHERE id = '$adresse' LIMIT 1"); if($rechnung_cc != '') { $this->MailSend($this->GetFirmaMail(),$this->GetFirmaAbsender(),$rechnung_cc,$to_name,$betreff,$text,$arrtmpfile,$projekt); } foreach($arrtmpfile as $key=>$_tmpfile) { unlink($_tmpfile); } $betreff = $this->app->DB->real_escape_string($betreff); $text = $this->app->DB->real_escape_string($text); $to_name = $this->app->DB->real_escape_string($to_name); // als versendet markieren $this->closeInvoice($id); //$this->app->DB->Update("UPDATE rechnung SET status='versendet', versendet='1',schreibschutz='1' WHERE id='$id' LIMIT 1"); if($result) { $this->RechnungProtokoll($id,'Rechnung versendet'); $betreff = $this->app->DB->real_escape_string($betreff); $text = $this->app->DB->real_escape_string($text); $to_name = $this->app->DB->real_escape_string($to_name); // als versendet markieren $this->app->DB->Update("UPDATE rechnung SET versendet='1',schreibschutz='1' WHERE id='$id' LIMIT 1"); $this->app->DB->Update("UPDATE rechnung SET status='versendet' WHERE status!='storniert' AND id='$id' LIMIT 1"); $this->app->DB->Insert("INSERT INTO dokumente_send (dokument,zeit,bearbeiter,adresse,parameter,art,betreff,text,projekt,ansprechpartner,versendet,dateiid) VALUES ('rechnung',NOW(),'".$this->app->User->GetName()."', '$adresse','$id','email','$betreff','$text','$projekt','$to_name',1,'0')"); } } } public function closeInvoice($invoiceId, $status = '') { $invoiceArr = $this->app->DB->SelectRow(sprintf('SELECT status FROM rechnung WHERE id = %d', $invoiceId)); if(empty($invoiceArr) || (!empty($status) && $status !== $invoiceArr['status'])) { return; } if($invoiceArr['status'] !== 'versendet') { $this->RunHook('closeInvoice',1, $invoiceId); } $this->app->DB->Update(sprintf("UPDATE rechnung SET versendet=1,schreibschutz=1 WHERE id=%d LIMIT 1",$invoiceId)); $this->app->DB->Update(sprintf("UPDATE rechnung SET status='versendet' WHERE status!='storniert' AND id=%d LIMIT 1",$invoiceId)); } function DokumentAbschicken() { $id = $this->app->Secure->GetGET('id'); $cmd = $this->app->Secure->GetGET("cmd"); $sid = $this->app->Secure->GetGET("sid"); $type = $this->app->Secure->GetGET("type"); if($cmd=="getvorlage") { $doc = $this->app->DB->SelectRow("SELECT sprache, projekt, abweichendebezeichnung FROM $type WHERE id='$sid' LIMIT 1"); $data = $this->app->erp->Geschaeftsbriefvorlage($doc['sprache'],$type,$doc['projekt'],"Angebot".($doc['abweichendebezeichnung']=="1"?'_Abweichend':''),$sid); $footer = $this->Grussformel($doc['projekt'],$doc['sprache']); if($footer!="") $data['text'] = $data['text']."\r\n".$footer; if(!empty($data)) { echo json_encode(array('subject'=>$data['betreff'],'body'=>$data['text'],'status'=>1)); } else { echo json_encode(array('status'=>0)); } $this->app->ExitXentral(); } $frame = $this->app->Secure->GetGET('frame'); $typ = $this->app->Secure->GetGET('module'); if($frame!='') { echo ""; $this->app->ExitXentral(); } $this->app->BuildNavigation=false; $this->app->Tpl->Set('TABTEXT',"Abschicken"); $docRow = $this->app->DB->SelectRow( sprintf( 'SELECT status, adresse, projekt FROM `%s` WHERE id=%d LIMIT 1', $typ, (int)$id ) ); $status = $docRow['status']; $adresse = $docRow['adresse']; $projekt = $docRow['projekt']; if($projekt=='' || $projekt==0){ $projekt = $this->app->DB->Select("SELECT projekt FROM adresse WHERE id='$adresse' LIMIT 1"); } if($status !=='angelegt') { $this->DokumentMask('TAB1',$typ,$id,$adresse,$projekt); } else { switch($typ) { case "rechnung": $this->app->Tpl->Set('TAB1',"
Die Rechnung wurde noch nicht freigegeben!
"); break; case "angebot": $this->app->Tpl->Set('TAB1',"
Das Angebot wurde noch nicht freigegeben!
"); break; case "auftrag": $this->app->Tpl->Set('TAB1',"
Der Auftrag wurde noch nicht freigegeben!
"); break; case "lieferschein": $this->app->Tpl->Set('TAB1',"
Der Lieferschein wurde noch nicht freigegeben!
"); break; case "retoure": $this->app->Tpl->Set('TAB1',"
Die Retoure wurde noch nicht freigegeben!
"); break; case "bestellung": $this->app->Tpl->Set('TAB1',"
Die Bestellung wurde noch nicht freigegeben!
"); break; case "gutschrift": $this->app->Tpl->Set('TAB1',"
Die Gutschrift wurde noch nicht freigegeben!
"); break; case "arbeitsnachweis": $this->app->Tpl->Set('TAB1',"
Der Arbeitsnachweis wurde noch nicht freigegeben!
"); break; case "preisanfrage": $this->app->Tpl->Set('TAB1',"
Die Preisanfrage wurde noch nicht freigegeben!
"); break; case "proformarechnung": $this->app->Tpl->Set('TAB1',"
Die Proformarechnung wurde noch nicht freigegeben!
"); break; case "produktion": $this->app->Tpl->Set('TAB1',"
Die Produktion wurde noch nicht freigegeben!
"); break; } $target = 'TAB1'; $this->RunHook('DokumentAbschickenMeldungAngelegt', 3, $typ, $id, $target); } $this->app->Tpl->Set('ID',$id); $this->app->Tpl->Parse('PAGE','emptytab.tpl'); } /** * @param int $id * * @return string * */ public function GetTrackingRawLink($id) { return $this->GetTrackinglink($id, true); } /** * @param int $id * @param bool $returnRaw * * @return string */ public function GetTrackinglink($id, $returnRaw = false) { if($id > 0) { $versandarr = $this->app->DB->SelectRow("SELECT * FROM versand WHERE id='$id' LIMIT 1"); } if(empty($versandarr)) { return ''; } $adresse = $versandarr['adresse']; $lieferscheinid = $versandarr['lieferschein']; if($lieferscheinid > 0){ $lieferscheinarr = $this->app->DB->SelectRow("SELECT auftragid,projekt FROM lieferschein WHERE id='$lieferscheinid' LIMIT 1"); } if(!empty($lieferscheinarr)) { $auftrag = $lieferscheinarr['auftragid']; $projekt = $lieferscheinarr['projekt']; }else{ $auftrag = 0; $projekt = 0; } $auftragarr = $this->app->DB->SelectRow("SELECT belegnr,internet,ihrebestellnummer,DATE_FORMAT(datum,'%d.%m.%Y') as datum_de FROM auftrag WHERE id='$auftrag' LIMIT 1"); if(!empty($auftragarr)){ $auftragbelegnr = $auftragarr['belegnr']; $auftraginternet = $auftragarr['internet']; $ihrebestellnummer = $auftragarr['ihrebestellnummer']; $auftragdatum = $auftragarr['datum_de']; }else{ $auftragbelegnr = ''; $auftraginternet = ''; $ihrebestellnummer = ''; $auftragdatum = ''; } $tracking = $versandarr['tracking']; $versandunternehmen = $versandarr['versandunternehmen']; // FIX fuer selbstabholer Mail $versandart = $versandarr['versandart']; if($versandart=='selbstabholer') { $versandunternehmen='selbstabholer'; } if($versandunternehmen=='dhl' || $versandunternehmen=="dhlpremium" || $versandunternehmen=="intraship"){ $versandmodul = false; } $typ = $versandunternehmen; if($typ === ''){ $typ = $versandart; } //$versandartenmodul = $this->app->DB->SelectArr("SELECT id, modul FROM versanddienstleister WHERE aktiv = 1 AND modul = '".$this->app->DB->real_escape_string($typ)."' AND (projekt = 0 OR projekt = '$projekt') ORDER BY projekt DESC LIMIT 1"); $versandartenmodul = $this->app->DB->SelectArr("SELECT * FROM versandarten WHERE aktiv = 1 AND ausprojekt = 0 AND modul != '' AND type = '".$this->app->DB->real_escape_string($typ)."' AND modul != '' AND (projekt = 0 OR projekt = '$projekt') ORDER BY projekt DESC LIMIT 1"); $standard = true; if($versandartenmodul && @is_file(dirname(__FILE__).'/versandarten/'.$versandartenmodul[0]['modul'].'.php')) { $obj = $this->LoadVersandModul($versandartenmodul[0]['modul'], $versandartenmodul[0]['id']); if(!empty($obj) && method_exists($obj, 'Trackinglink')) { if($obj->Trackinglink($tracking, $notsend, $link, $rawlink)) { if($returnRaw) { return $rawlink; } return $link; } } }elseif($versandartenmodul2 = $this->app->DB->SelectArr("SELECT * FROM versandarten WHERE aktiv = 1 AND ausprojekt = 0 AND type = '".$this->app->DB->real_escape_string($typ)."' AND (projekt = 0 OR projekt = '$projekt') ORDER BY projekt DESC LIMIT 1")) { $obj = $this->LoadVersandModul($versandartenmodul2[0]['modul'], $versandartenmodul2[0]['id']); if(!empty($obj) && method_exists($obj, 'Trackinglink')) { if($obj->Trackinglink($tracking, $notsend, $link, $rawlink)) { if($returnRaw) { return $rawlink; } return $link; } } } if(!$versandmodul && $standard) { if($versandunternehmen=="dhl" || $versandunternehmen=="dhlpremium" || $versandunternehmen=="intraship") { return 'http://nolp.dhl.de/nextt-online-public/set_identcodes.do?lang=de&idc='.$tracking; } else if ($versandunternehmen=="logoix") { return 'http://www.logoix.com/cgi-bin/tnt.pl?q='.$tracking; } else if ($versandunternehmen=="dpd") { return 'https://tracking.dpd.de/parcelstatus/?locale=de_DE&query='.$tracking; } else if ($versandunternehmen=="gls") { return 'https://www.gls-group.eu/276-I-PORTAL-WEB/content/GLS/DE03/DE/5004.htm?txtRefNo='.$tracking; } } } /** * @param int $id */ public function VersandAbschluss($id) { if($id > 0) { $versandarr = $this->app->DB->SelectRow("SELECT * FROM versand WHERE id='$id' LIMIT 1"); } if(empty($versandarr)) { return; } $adresse = $versandarr['adresse']; $lieferscheinid = $versandarr['lieferschein']; $rechnung = $versandarr['rechnung']; $rechnungarr = $rechnung <=0?null: $this->app->DB->SelectRow( "SELECT zahlungsweise,projekt FROM rechnung WHERE id='$rechnung' LIMIT 1" ); $rechnung_zahlweise = empty($rechnungarr)?'':$rechnungarr['zahlungsweise']; $rechnung_projekt = empty($rechnungarr)?0:$rechnungarr['projekt']; $lieferscheinarr = $lieferscheinid <= 0?null: $this->app->DB->SelectRow( "SELECT auftragid,projekt FROM lieferschein WHERE id='$lieferscheinid' LIMIT 1" ); $auftrag = empty($lieferscheinarr)?0: $this->app->DB->Select( "SELECT auftragid FROM lieferschein WHERE id='$lieferscheinid' LIMIT 1" ); $auftragarr = $auftrag <= 0?null:$this->app->DB->SelectRow( "SELECT * FROM auftrag WHERE id='$auftrag' LIMIT 1" ); if(!$rechnung && $auftrag) { //Fallback Zahlungsweise auf Auftrag $rechnung_zahlweise = $auftragarr['zahlungsweise']; $rechnung_projekt = $auftragarr['projekt']; } $auftragbelegnr = empty($auftragarr)?'': $auftragarr['belegnr']; $auftraginternet = empty($auftragarr)?'':$auftragarr['internet']; $ihrebestellnummer = empty($auftragarr)?'':$auftragarr['ihrebestellnummer']; $projekt = empty($lieferscheinarr)?0: $lieferscheinarr['projekt']; // wenn shop dann rueckmelden $shop = empty($auftragarr)?0:$auftragarr['shop']; $auftragabgleich = $shop <= 0?0: $this->app->DB->Select( "SELECT auftragabgleich FROM shopexport WHERE id='$shop' LIMIT 1" ); //Reservierungen löschen if($lieferscheinid>0) { $this->app->DB->Delete( "DELETE FROM lager_reserviert WHERE objekt='lieferschein' AND parameter='$lieferscheinid'" ); } if($auftrag <= 0) { return; } $this->app->DB->Delete( "DELETE FROM lager_reserviert WHERE objekt='auftrag' AND parameter='$auftrag'" ); if($shop > 0 && $auftragabgleich=='1') { try { $this->app->remote->RemoteUpdateAuftrag($shop, $auftrag); } catch(Exception $e) { $this->AuftragProtokoll($auftag, 'Shoprückmeldung fehlgeschlagen'); } } try { $this->sendPaymentStatus($id, $rechnung_zahlweise, $auftrag, $projekt, $rechnung_projekt); } catch(Exception $e) { } } /** * @param int $id VersandId * @param string|null $rechnung_zahlweise * @param int|null $auftrag * @param int|null $projekt DeliveryNote ProjectId * @param int|null $rechnung_projekt */ public function sendPaymentStatus( $id, $rechnung_zahlweise = null, $auftrag = null, $projekt = null, $rechnung_projekt = null ) { if($auftrag === null) { $versandarr = $this->app->DB->SelectRow( sprintf( 'SELECT rechnung,lieferschein FROM versand WHERE id = %d', $id ) ); $lieferscheinid = $versandarr['lieferschein']; $rechnung = $versandarr['rechnung']; $rechnungarr = $rechnung <=0?null: $this->app->DB->SelectRow( "SELECT zahlungsweise,projekt FROM rechnung WHERE id='$rechnung' LIMIT 1" ); $rechnung_zahlweise = empty($rechnungarr)?'':$rechnungarr['zahlungsweise']; $rechnung_projekt = empty($rechnungarr)?0:$rechnungarr['projekt']; $lieferscheinarr = $lieferscheinid <= 0?null: $this->app->DB->SelectRow( "SELECT auftragid,projekt FROM lieferschein WHERE id='$lieferscheinid' LIMIT 1" ); $auftrag = empty($lieferscheinarr)?0: $this->app->DB->Select( "SELECT auftragid FROM lieferschein WHERE id='$lieferscheinid' LIMIT 1" ); $auftragarr = $auftrag <= 0?null:$this->app->DB->SelectRow( "SELECT * FROM auftrag WHERE id='$auftrag' LIMIT 1" ); if(!$rechnung && $auftrag) { //Fallback Zahlungsweise auf Auftrag $rechnung_zahlweise = $auftragarr['zahlungsweise']; $rechnung_projekt = $auftragarr['projekt']; } } if(empty($rechnung_zahlweise)) { return; } try { if($zahlungsweisenmodule = $this->app->DB->SelectArr( "SELECT id, modul FROM zahlungsweisen WHERE type = '" . $this->app->DB->real_escape_string($rechnung_zahlweise) . "' AND modul <> '' AND (projekt = '$projekt' OR projekt = 0) ORDER BY projekt = '$projekt' DESC LIMIT 1 ")){ foreach ($zahlungsweisenmodule as $zahlungsweisenmodul) { $_zahlungsweisenmodul = preg_replace('/[^a-zA-Z0-9\_]/', '', $zahlungsweisenmodul['modul']); if(!$_zahlungsweisenmodul){ continue; } if(!file_exists(__DIR__ . '/zahlungsweisen/' . $_zahlungsweisenmodul . '.php')){ continue; } $class = 'Zahlungsweise_' . $_zahlungsweisenmodul; if(!class_exists($class)){ include_once __DIR__ . '/zahlungsweisen/' . $_zahlungsweisenmodul . '.php'; } if(!class_exists($class)){ continue; } $obj = new $class($this->app, $zahlungsweisenmodul['id']); if($obj && method_exists($obj, 'ZahlungFreigeben')){ $obj->ZahlungFreigeben($auftrag, $id); } return; } } } catch(Exception $e) { } } public function Versandmail($id, $tracking_link = null, $sprache = null, $tracking = '', $forceautoversand = false, $autoversand = true) { // $text = $this->app->DB->Select("SELECT text FROM geschaeftsbrief_vorlagen WHERE subjekt='Versand' AND sprache='deutsch' LIMIT 1"); // $betreff = $this->app->DB->Select("SELECT betreff FROM geschaeftsbrief_vorlagen WHERE subjekt='Versand' AND sprache='deutsch' LIMIT 1"); if($id > 0){ $versandarr = $this->app->DB->SelectRow("SELECT * FROM versand WHERE id='$id' LIMIT 1"); } if(empty($versandarr)) { return; } $adresse = $versandarr['adresse']; if($adresse > 0) { $adressearr = $this->app->DB->SelectRow("SELECT * FROM adresse WHERE id = $adresse LIMIT 1"); } $lieferscheinid = $versandarr['lieferschein']; if($lieferscheinid > 0){ $lieferscheinarr = $this->app->DB->SelectRow("SELECT * FROM lieferschein WHERE id='$lieferscheinid' LIMIT 1"); } if(!empty($lieferscheinarr)){ $auftrag = $lieferscheinarr['auftragid']; }else{ $auftrag = 0; } if($auftrag > 0) { $auftragarr = $this->app->DB->SelectRow("SELECT email,name,belegnr,internet,ihrebestellnummer,sprache,DATE_FORMAT(datum,'%d.%m.%Y') as datum_de FROM auftrag WHERE id='$auftrag' LIMIT 1"); } if(!empty($auftragarr)) { $auftragbelegnr = $auftragarr['belegnr']; $auftraginternet = $auftragarr['internet']; $ihrebestellnummer = $auftragarr['ihrebestellnummer']; $auftragdatum = $auftragarr['datum_de']; }else{ $auftragbelegnr = ''; $auftraginternet = ''; $ihrebestellnummer = ''; $auftragdatum = ''; } if(!empty($lieferscheinarr)){ $projekt = $lieferscheinarr['projekt'];//$this->app->DB->Select("SELECT projekt FROM lieferschein WHERE id='$lieferscheinid' LIMIT 1"); }else{ $projekt = 0; } if(is_null($sprache)){ if(!empty($auftragarr)){ $sprache = $auftragarr['sprache']; }else{ $sprache = ''; } } if(!empty($auftragarr)){ $to = $auftragarr['email']; $to_name = $auftragarr['name']; }else{ $to = ''; $to_name = ''; } if($to==''){ if(!empty($adressearr)){ $to = $adressearr['email']; } } if($to_name==''){ if(!empty($adressearr)){ $to_name = $adressearr['name']; } } if(!$sprache){ if(!empty($adressearr)){ $sprache = $adressearr['sprache']; } } if($sprache == ''){ $sprache = 'deutsch'; } $text = $this->GetGeschaeftsBriefText('Versand',(!is_null($sprache) && $sprache?$sprache:'deutsch'),$projekt); $betreff = $this->GetGeschaeftsBriefBetreff('Versand',(!is_null($sprache) && $sprache?$sprache:'deutsch'),$projekt); if(((String)$text === "" || (String)$betreff === '') && (!is_null($sprache) && $sprache?$sprache:'deutsch') != 'deutsch') { $text = $this->GetGeschaeftsBriefText('Versand','deutsch',$projekt); $betreff = $this->GetGeschaeftsBriefBetreff('Versand','deutsch',$projekt); } // wenn Ansprechpartner if(!empty($lieferscheinarr)){ $to_lieferschein_name = $lieferscheinarr['ansprechpartner']; $to_lieferschein_email = $lieferscheinarr['email']; }else{ $to_lieferschein_name = ''; $to_lieferschein_email = ''; } if($to_lieferschein_email!=''){ $to = $to_lieferschein_email; if($to_lieferschein_name!=''){ $to_name = $to_lieferschein_name; } } if(!empty($adressearr)){ $trackingsperre = $adressearr['trackingsperre']; }else{ $trackingsperre = 0; } $tracking = $versandarr['tracking']; $keinetrackingmail = $versandarr['keinetrackingmail']; $versandunternehmen = $versandarr['versandunternehmen']; // FIX fuer selbstabholer Mail $versandart = $versandarr['versandart']; if($versandart=='selbstabholer') { $versandunternehmen='selbstabholer'; } $text = str_replace('{BELEGNR}',$auftragbelegnr,$text); $betreff = str_replace('{BELEGNR}',$auftragbelegnr,$betreff); $text = str_replace('{AUFTRAGDATUM}',$auftragdatum,$text); $betreff = str_replace('{AUFTRAGDATUM}',$auftragdatum,$betreff); $text = str_replace('{INTERNET}',$auftraginternet,$text); $betreff = str_replace('{INTERNET}',$auftraginternet,$betreff); $text = str_replace('{IHREBESTELLNUMMER}',$ihrebestellnummer,$text); $betreff = str_replace('{IHREBESTELLNUMMER}',$ihrebestellnummer,$betreff); if(!is_null($tracking_link) && $tracking_link)$text = str_replace('{VERSAND}',$tracking_link.(($tracking && strpos($tracking_link,$tracking) === false)?' ('.$tracking.')':''),$text); if($versandunternehmen=="dhl" || $versandunternehmen=="dhlpremium" || $versandunternehmen=="intraship") $versandmodul = false; if(!$this->isHTML($text)){ $text = str_replace("\r\n", "
", $text); } $typ = $versandunternehmen; if($typ === ''){ $typ = $versandart; } //$versandartenmodul = $this->app->DB->SelectArr("SELECT id, modul FROM versanddienstleister WHERE aktiv = 1 AND modul = '".$this->app->DB->real_escape_string($typ)."' AND (projekt = 0 OR projekt = '$projekt') ORDER BY projekt DESC LIMIT 1"); $versandartenmodul = $this->app->DB->SelectArr("SELECT * FROM versandarten WHERE aktiv = 1 AND ausprojekt = 0 AND modul != '' AND type = '".$this->app->DB->real_escape_string($typ)."' AND modul != '' AND (projekt = 0 OR projekt = '$projekt') ORDER BY projekt DESC LIMIT 1"); $standard = true; if($versandartenmodul && @is_file(dirname(__FILE__).'/versandarten/'.$versandartenmodul[0]['modul'].'.php')) { if($versandartenmodul[0]['versandmail'] == -1) { $notsend = 1; } elseif($versandartenmodul[0]['versandmail'] && $versandartenmodul[0]['geschaeftsbrief_vorlage']) { $subjekt = $this->app->DB->Select("SELECT subjekt FROM geschaeftsbrief_vorlagen WHERE id = '".$versandartenmodul[0]['geschaeftsbrief_vorlage']."' LIMIT 1"); $text = $this->GetGeschaeftsBriefText($subjekt,(!is_null($sprache) && $sprache?$sprache:'deutsch'),$projekt); $betreff = $this->GetGeschaeftsBriefBetreff($subjekt,(!is_null($sprache) && $sprache?$sprache:'deutsch'),$projekt); if(((String)$text === '' || (String)$betreff === '') && (!is_null($sprache) && $sprache?$sprache:'deutsch') != 'deutsch') { $text = $this->GetGeschaeftsBriefText($subjekt,'deutsch',$projekt); $betreff = $this->GetGeschaeftsBriefBetreff($subjekt,'deutsch',$projekt); } $text = str_replace('{BELEGNR}',$auftragbelegnr,$text); $betreff = str_replace('{BELEGNR}',$auftragbelegnr,$betreff); $text = str_replace('{AUFTRAGDATUM}',$auftragdatum,$text); $betreff = str_replace('{AUFTRAGDATUM}',$auftragdatum,$betreff); $text = str_replace('{INTERNET}',$auftraginternet,$text); $betreff = str_replace('{INTERNET}',$auftraginternet,$betreff); $text = str_replace('{IHREBESTELLNUMMER}',$ihrebestellnummer,$text); $betreff = str_replace('{IHREBESTELLNUMMER}',$ihrebestellnummer,$betreff); if(!is_null($tracking_link) && $tracking_link)$text = str_replace('{VERSAND}',$tracking_link.(($tracking && strpos($tracking_link,$tracking) === false)?' ('.$tracking.')':''),$text); } $obj = $this->LoadVersandModul($versandartenmodul[0]['modul'], $versandartenmodul[0]['id']); $class_name = 'Versandart_'.$versandartenmodul[0]['modul']; if(!empty($obj) && method_exists($obj, 'Trackinglink')) { if($obj->Trackinglink($tracking, $notsend, $link, $rawlink)) { $versandpakete = $this->app->DB->SelectArr("SELECT tracking FROM versandpakete WHERE versand = '$id' AND tracking <> '' ORDER BY nr"); if($versandpakete) { foreach($versandpakete as $kv => $vv) { $obj->Trackinglink($vv['tracking'], $tmpnotsend, $tmplink, $tmprawlink); $link .= ', '.$vv['tracking'].' ('.$tmprawlink.')'; $tracking .= ', '.$vv['tracking']; } } $text = str_replace('{VERSAND}', $link ,$text); $text = str_replace('{VERSANDTYPE}', $versandartenmodul[0]['type'] ,$text); $text = str_replace('{VERSANDBEZEICHNUNG}', $versandartenmodul[0]['bezeichnung'] ,$text); $text = str_replace('{TRACKINGNUMMER}', $tracking,$text); $versandmodul = true; } } }elseif($versandartenmodul2 = $this->app->DB->SelectArr("SELECT * FROM versandarten WHERE aktiv = 1 AND ausprojekt = 0 AND type = '".$this->app->DB->real_escape_string($typ)."' AND (projekt = 0 OR projekt = '$projekt') ORDER BY projekt DESC LIMIT 1")) { if($versandartenmodul2[0]['versandmail'] == -1) { $notsend = 1; } elseif($versandartenmodul2[0]['versandmail'] && $versandartenmodul2[0]['geschaeftsbrief_vorlage']) { $standard = false; $subjekt = $this->app->DB->Select("SELECT subjekt FROM geschaeftsbrief_vorlagen WHERE id = '".$versandartenmodul2[0]['geschaeftsbrief_vorlage']."' LIMIT 1"); $text = $this->GetGeschaeftsBriefText($subjekt,(!is_null($sprache) && $sprache?$sprache:'deutsch'),$projekt); $betreff = $this->GetGeschaeftsBriefBetreff($subjekt,(!is_null($sprache) && $sprache?$sprache:'deutsch'),$projekt); if(((String)$text === "" || (String)$betreff === '') && (!is_null($sprache) && $sprache?$sprache:'deutsch') != 'deutsch') { $text = $this->GetGeschaeftsBriefText($subjekt,'deutsch',$projekt); $betreff = $this->GetGeschaeftsBriefBetreff($subjekt,'deutsch',$projekt); } $text = str_replace('{BELEGNR}',$auftragbelegnr,$text); $betreff = str_replace('{BELEGNR}',$auftragbelegnr,$betreff); $text = str_replace('{INTERNET}',$auftraginternet,$text); $betreff = str_replace('{INTERNET}',$auftraginternet,$betreff); $text = str_replace('{AUFTRAGDATUM}',$auftragdatum,$text); $betreff = str_replace('{AUFTRAGDATUM}',$auftragdatum,$betreff); $text = str_replace('{VERSANDTYPE}', $versandartenmodul2[0]['type'] ,$text); $text = str_replace('{IHREBESTELLNUMMER}',$ihrebestellnummer,$text); $betreff = str_replace('{IHREBESTELLNUMMER}',$ihrebestellnummer,$betreff); if(!is_null($tracking_link) && $tracking_link)$text = str_replace('{VERSAND}',$tracking_link.(($tracking && strpos($tracking_link,$tracking) === false)?' ('.$tracking.')':''),$text); $notsend = 0; } } if(!$versandmodul && $standard) { if(strtolower($versandunternehmen)=='dhl' || strtolower($versandunternehmen)=='dhlpremium' || strtolower($versandunternehmen)=="intraship") { $text = str_replace('{VERSAND}','DHL Versand: '.$tracking.' (http://nolp.dhl.de/nextt-online-public/set_identcodes.do?lang=de&idc='.$tracking.')',$text); $notsend = 0; } else if (strtolower($versandunternehmen)=='logoix') { $text = str_replace('{VERSAND}','LogoiX Versand: '.$tracking.' (http://www.logoix.com/cgi-bin/tnt.pl?q='.$tracking.')',$text); $notsend = 0; } else if (strtolower($versandunternehmen)=='dpd') { $text = str_replace('{VERSAND}','DPD Versand: '.$tracking.' (https://tracking.dpd.de/parcelstatus/?locale=de_DE&query='.$tracking.')',$text); $notsend = 0; } else if (strtolower($versandunternehmen)=='gls') { $text = str_replace('{VERSAND}','GLS Versand: '.$tracking.' (https://www.gls-group.eu/276-I-PORTAL-WEB/content/GLS/DE03/DE/5004.htm?txtRefNo='.$tracking.'&txtAction=71000 )',$text); $notsend = 0; } else if (strtolower($versandunternehmen)=='rma') { $notsend = 1; } else if(strtolower($versandunternehmen)=='selbstabholer') { $notsend = 0; // selbstabholer $text = $this->GetGeschaeftsBriefText('Selbstabholer',$sprache,$projekt); $betreff = $this->GetGeschaeftsBriefBetreff('Selbstabholer',$sprache,$projekt); if(((String)$text === '' || (String)$betreff === '') && $sprache != 'deutsch') { $text = $this->GetGeschaeftsBriefText('Selbstabholer','deutsch',$projekt); $betreff = $this->GetGeschaeftsBriefBetreff('Selbstabholer','deutsch',$projekt); } //$text = $this->app->DB->Select("SELECT text FROM geschaeftsbrief_vorlagen WHERE subjekt='Selbstabholer' AND sprache='deutsch' LIMIT 1"); $text = str_replace('{VERSAND}','',$text); // nur wenn option gesetzt ist $selbstabholermail = $this->app->DB->Select("SELECT selbstabholermail FROM projekt WHERE id='$projekt' LIMIT 1"); if($selbstabholermail!='1') { $notsend = 1; } } else { // bei allen anderen lieferarten keine mail $notsend = $forceautoversand?0:1; } } if(!(!$versandmodul && $standard && strtolower($versandunternehmen)=='selbstabholer')) { if(!$forceautoversand && $this->Projektdaten($projekt,"automailversandbestaetigung")!='1'){ $notsend = 1; } } $text = str_replace('{NAME}',$to_name,$text); $text = str_replace('{VERSAND}', '' ,$text); if(!empty($versandart)){ $text = str_replace('{VERSANDTYPE}', $versandart, $text); } $text = $this->app->erp->ParseUserVars('auftrag',$auftrag,$text); $betreff = $this->app->erp->ParseUserVars('auftrag',$auftrag,$betreff); if($lieferscheinid > 0) { $text = $this->app->erp->ParseUserVars('lieferschein',$lieferscheinid,$text); $betreff = $this->app->erp->ParseUserVars('lieferschein',$lieferscheinid,$betreff); } if($to!='' && $to_name!='' && $trackingsperre!=1 && $notsend==0 && $keinetrackingmail!=1) { $this->MailSend($this->GetFirmaMail(),$this->GetFirmaAbsender(),$to,$to_name,$betreff,$text,"",$projekt); $this->DokumentCreateQuick($adresse, $betreff, $text, $projekt); $this->app->DB->Insert("INSERT INTO auftrag_protokoll (auftrag, zeit, bearbeiter, grund) values ('$auftrag',now(),'".(isset($this->app->User)?$this->app->DB->real_escape_string($this->app->User->GetName()):'Cronjob')."','Versandmail verschickt')"); $dateien = null; $this->RunHook('versandmail', 5, $auftrag, $betreff, $text, $dateien, $autoversand); } } function DokumentCreateQuick($adresse,$betreff,$text,$projekt) { $data['adresse'] = $adresse; $data['betreff'] = $betreff; $data['content'] = $text; $data['projekt'] = $projekt; $this->DokumentCreate($data); } function DokumentCreate($data,$adressefromuser=0) { if($adressefromuser > 0) { if($data['bearbeiter']=="") $data['bearbeiter'] = $this->app->DB->Select("SELECT name FROM adresse WHERE id='$adressefromuser' AND id > 0 LIMIT 1"); } $this->app->DB->Insert(' INSERT INTO dokumente SET adresse_from = "' . $adressefromuser . '", adresse_to = "' . $data['user'] . '", typ = "' . $data['typ'] . '", von = "' . $data['von'] . '", firma = "' . $data['firma'] . '", ansprechpartner = "' . $data['ansprechpartner'] . '", internebezeichnung = "' . $data['internebezeichnung'] . '", an = "' . $data['an'] . '", email_an = "' . $data['email_an'] . '", email_cc = "' . $data['email_cc'] . '", email_bcc = "' . $data['email_bcc'] . '", firma_an = "' . $data['firma_an'] . '", adresse = "' . $data['adresse'] . '", plz = "' . $data['plz'] . '", ort = "' . $data['ort'] . '", land = "' . $data['land'] . '", datum = NOW(), betreff = "' . $data['betreff'] . '", content = "' . $data['content'] . '", signatur = "' . $data['signatur'] . '", send_as = "' . $data['send_as'] . '", email = "' . $data['email'] . '", printer = "' . $data['printer'] . '", fax = "' . $data['fax'] . '", created = NOW(), uhrzeit = "' . $data['uhrzeit'] . '", projekt = "' . $data['projekt'] . '", bearbeiter = "' . $data['bearbeiter'] . '", sent = "' . $data['sent'] . '" '); return $this->app->DB->GetInsertID(); } /** * @param int $projekt * @param string $feld * * @return mixed|null */ function Projektdaten($projekt,$feld) { return $projekt <= 0?null:$this->app->DB->Select( sprintf( 'SELECT `%s` FROM projekt WHERE id=%d LIMIT 1', $feld, $projekt ) ); } function DumpVar($variable) { ob_start(); var_dump($variable); $result = ob_get_clean(); file_put_contents($this->GetTMP()."log", "$result\r\n", FILE_APPEND | LOCK_EX); } function VarAsString($variable) { ob_start(); var_dump($variable); $result = ob_get_clean(); return $result; } function ImportvorlageLog($importvorlage,$zeitstempel,$tabelle,$datensatz,$ersterdatensatz="0") { $this->app->DB->Insert("INSERT INTO importvorlage_log (id,importvorlage,zeitstempel,user,tabelle,datensatz,ersterdatensatz) VALUES ('','$importvorlage',FROM_UNIXTIME($zeitstempel),'".$this->app->User->GetID()."', '$tabelle','$datensatz','$ersterdatensatz')"); } function ImportvorlageLogDelete($zeitstempel) { $tmp = $this->app->DB->SelectArr("SELECT * FROM importvorlage_log WHERE zeitstempel='$zeitstempel' AND user='".$this->app->User->GetID()."'"); for($i=0;$i<(!empty($tmp)?count($tmp):0);$i++) { $datensatz = $tmp[$i]['datensatz']; switch($tmp[$i]['tabelle']) { case "adresse": if($tmp[$i]['ersterdatensatz']=="1") { //naechste zu vergebene nummer richtig setzten $tmp_adresse = $this->app->DB->SelectArr("SELECT * FROM adresse WHERE id='$datensatz' LIMIT 1"); $eigenernummernkreis = $this->app->DB->Select("SELECT eigenernummernkreis FROM projekt WHERE id='".$tmp_adresse[0]['projekt']."' LIMIT 1"); if($eigenernummernkreis=="1") { if($tmp_adresse[0]['kundennummer']!="" && $tmp_adresse[0]['kundennummer']!="0") { $this->app->DB->Update("UPDATE projekt SET next_kundennummer='".$tmp_adresse[0]['kundennummer']."' WHERE id='".$tmp_adresse[0]['projekt']."' LIMIT 1"); } if($tmp_adresse[0]['lieferantennummer']!="" && $tmp_adresse[0]['lieferantennummer']!="0") { $this->app->DB->Update("UPDATE projekt SET next_lieferantennummer='".$tmp_adresse[0]['lieferantennummer']."' WHERE id='".$tmp_adresse[0]['projekt']."' LIMIT 1"); } if($tmp_adresse[0]['mitarbeiternummer']!="" && $tmp_adresse[0]['mitarbeiternummer']!="0") { $this->app->DB->Update("UPDATE projekt SET next_mitarbeiternummer='".$tmp_adresse[0]['mitarbeiternummer']."' WHERE id='".$tmp_adresse[0]['projekt']."' LIMIT 1"); } } else { if($tmp_adresse[0]['kundennummer']!="" && $tmp_adresse[0]['kundennummer']!="0") { $this->FirmendatenSet("next_kundennummer",$tmp_adresse[0]['kundennummer']); } if($tmp_adresse[0]['lieferantennummer']!="" && $tmp_adresse[0]['lieferantennummer']!="0") { $this->FirmendatenSet("next_lieferantennummer",$tmp_adresse[0]['lieferantennummer']); } if($tmp_adresse[0]['mitarbeiternummer']!="" && $tmp_adresse[0]['mitarbeiternummer']!="0") { $this->FirmendatenSet("next_mitarbeiternummer",$tmp_adresse[0]['mitarbeiternummer']); } } } $this->app->DB->Delete("DELETE FROM adresse WHERE id='$datensatz'"); $this->app->DB->Delete("DELETE FROM ansprechpartner WHERE adresse='$datensatz'"); $this->app->DB->Delete("DELETE FROM lieferadressen WHERE adresse='$datensatz'"); $this->app->DB->Delete("DELETE FROM adresse_rolle WHERE adresse='$datensatz'"); break; case "artikel": break; case "einkaufspreise": break; } $this->app->DB->Delete("DELETE FROM importvorlage_log WHERE id='".$tmp[$i]['id']."'"); } } function CreatePath($path) { if (file_exists($path)) { return true; } $nextDirectoryPath = substr($path, 0, strrpos($path, '/', -2) + 1 ); if($this->CreatePath($nextDirectoryPath) && is_writable($nextDirectoryPath)) { return mkdir($path); } return false; } function ObjektProtokoll($objekt,$id,$action_long,$meldung="") { $bearbeiter = (isset($this->app->User) && $this->app->User && method_exists($this->app->User, 'GetName'))?$this->app->User->GetName():'Import / Cronjob'; $this->app->DB->Insert("INSERT INTO objekt_protokoll (id,objekt,objektid,meldung,zeitstempel,bearbeiter,action_long) VALUES ('','$objekt','$id','$meldung',NOW(),'$bearbeiter','$action_long')"); } function InternesEvent($userid,$meldung,$type="",$sound=0) { //Cronjobs does not have an userid (prevent Exception) if((int)$userid <= 0) { return false; } /** @var \Xentral\Modules\SystemNotification\Service\NotificationServiceInterface $notification */ if(empty($this->app->Container) || empty($userid)) { return false; } $notification = $this->app->Container->get('NotificationService'); if (!in_array($type, $notification->getValidTypes(), true)) { $type = 'default'; } return $notification->create($userid, $type, 'Hinweis', $meldung, (bool)$sound); } function EventMitSystemLog($userid, $meldung, $level=-1,$dump="", $type = "", $sound=0, $module="", $action="",$functionname="") { $this->SystemLog($meldung, $level, $dump, $module, $action, $functionname); $this->InternesEvent($userid, $meldung, $type, $sound); } function SystemLog($meldung="",$level=0,$dump="",$module="",$action="",$functionname="") { /** @var Systemlog $obj */ $obj = $this->app->erp->LoadModul('systemlog'); if(!empty($obj) && method_exists($obj, 'addSystemLog')){ return $obj->addSystemLog($meldung,$level,$dump,$module,$action,$functionname); } return 0; } function Protokoll($meldung="",$dump="",$module="",$action="",$functionname="") { /** @var Protokoll $obj */ $obj = $this->app->erp->LoadModul('protokoll'); if(!empty($obj) && method_exists($obj, 'addProtokoll')){ return $obj->addProtokoll($meldung,$dump,$module,$action,$functionname); } return 0; } function LogRamAndTime($meldung) { if(self::$lasttime == 0)self::$lasttime = microtime(true); $akttime = microtime(true); $this->LogFile( addslashes((memory_get_peak_usage(true) >> 20). " MB ".(round($akttime - self::$lasttime ,3) )." sek ".$meldung)); } function LogFile($meldung,$dump="",$module="",$action="",$functionname="") { $obj = $this->LoadModul('logfile'); if(!empty($obj) && method_exists($obj,'addLogFile')) { return $obj->addLogFile($meldung,$dump,$module,$action,$functionname); } return null; } function KundeUpdate($adresse,$typ,$name,$abteilung,$unterabteilung,$ansprechpartner,$adresszusatz,$strasse,$land,$plz,$ort,$email,$telefon,$telefax,$ustid,$partner,$projekt) { //echo "Upate"; $fields = array('typ','name','abteilung','unterabteilung','ansprechpartner','adresszusatz','strasse','land','plz', 'ort','email','telefon','telefax','ustid','partner','projekt'); foreach($fields as $key) { $check = $this->app->DB->Select("SELECT $key FROM adresse WHERE id='$adresse' LIMIT 1"); if($check!=${$key}) { $this->app->DB->Update("UPDATE adresse SET $key='".${$key}."' WHERE id='$adresse' LIMIT 1"); $logfile = $this->app->DB->Select("SELECT `logfile` FROM adresse WHERE id='$adresse' LIMIT 1"); $this->app->DB->Update("UPDATE adresse SET `logfile`='".$logfile." Update Feld $key alt:$check neu:".${$key}.";' WHERE id='$adresse' LIMIT 1"); } } return $adresse; } function KundeAnlegen($typ,$name,$abteilung,$unterabteilung,$ansprechpartner,$adresszusatz,$strasse,$land,$plz,$ort,$email,$telefon,$telefax,$ustid,$partner,$projekt, $bundesstaat='', $rechnung_bundesstaat='') { $name = $this->app->DB->real_escape_string($name); $abteilung = $this->app->DB->real_escape_string($abteilung); $unterabteilung = $this->app->DB->real_escape_string($unterabteilung); $ansprechpartner = $this->app->DB->real_escape_string($ansprechpartner); $adresszusatz = $this->app->DB->real_escape_string($adresszusatz); $strasse = $this->app->DB->real_escape_string($strasse); $land = $this->app->DB->real_escape_string($land); $plz = $this->app->DB->real_escape_string($plz); $ort = $this->app->DB->real_escape_string($ort); $email = $this->app->DB->real_escape_string($email); $telefon = $this->app->DB->real_escape_string($telefon); $telefax = $this->app->DB->real_escape_string($telefax); $ustid = $this->app->DB->real_escape_string($ustid); $partner = $this->app->DB->real_escape_string($partner); $bundesstaat = $this->app->DB->real_escape_string($bundesstaat); $rechnung_bundesstaat = $this->app->DB->real_escape_string($rechnung_bundesstaat); $this->app->DB->Insert("INSERT INTO adresse (id,typ,name,abteilung,unterabteilung,ansprechpartner,adresszusatz,strasse,land,plz,ort,email,telefon,telefax,ustid,partner,projekt,firma,bundesstaat,rechnung_bundesstaat) VALUES('','$typ','$name','$abteilung','$unterabteilung','$ansprechpartner','$adresszusatz','$strasse','$land','$plz','$ort','$email','$telefon','$telefax','$ustid','$partner','$projekt','".$this->app->User->GetFirma()."','$bundesstaat','$rechnung_bundesstaat')"); $adresse = $this->app->DB->GetInsertID(); $this->ObjektProtokoll("adresse",$adresse,"adresse_create","Adresse angelegt"); $zahlungsweise = $this->Firmendaten('zahlungsweise'); if($zahlungsweise)$this->app->DB->Update("UPDATE adresse SET zahlungsweise = '".$this->app->DB->real_escape_string($zahlungsweise)."' WHERE id = '$adresse' LIMIT 1"); if($zahlungsweise == 'rechnung') { $zahlungszieltage = $this->Firmendaten('zahlungszieltage'); $zahlungszieltageskonto = $this->Firmendaten('zahlungszieltageskonto'); $zahlungszielskonto = $this->Firmendaten('zahlungszielskonto'); if($zahlungsweise)$this->app->DB->Update("UPDATE adresse SET zahlungszieltage = '".$this->app->DB->real_escape_string($zahlungszieltage)."', zahlungszielskonto = '".$this->app->DB->real_escape_string($zahlungszielskonto)."', zahlungszieltageskonto = '".$this->app->DB->real_escape_string($zahlungszieltageskonto)."' WHERE id = '$adresse' LIMIT 1"); } $ust_befreit = $this->AdresseUSTCheck($adresse); $this->app->DB->Update("UPDATE adresse SET ust_befreit='$ust_befreit' WHERE id=$adresse"); //adresse Kundennummer verpassen $this->KundennummerVergeben($adresse); $this->AddRolleZuAdresse($adresse, "Kunde", "von", "Projekt", $projekt); return $adresse; } function IstEU($land) { if($land==$this->Firmendaten("land")) return false; foreach($this->GetUSTEU() as $euland) { if($land==$euland) return true; } return false; } function Steuerbefreit($land,$ustid) { if($land==$this->Firmendaten("land")) return false; foreach($this->GetUSTEU() as $euland) { if($land==$euland && $ustid!="") return true; else if ($land==$euland && $ustid=="") return false; } // alle anderen laender sind export! return true; } /** * @param int $artikel * @param null|array|int $parents * * @return bool */ public function IstRohstoffeZirkel($artikel, $parents = null) { if($parents !== null && is_numeric($parents)) { $parents = [$parents]; } if(is_array($parents) && (!empty($parents)?count($parents):0) > 0) { if(in_array($artikel, $parents)) { return $artikel; } } $parents[] = $artikel; $stueckliste = $this->app->DB->SelectArr( sprintf( 'SELECT DISTINCT s.artikel FROM rohstoffe AS s INNER JOIN artikel AS a ON s.artikel = a.id WHERE s.rohstoffvonartikel = %d AND a.geloescht <> 1', $artikel ) ); if(empty($stueckliste)) { return false; } foreach($stueckliste as $art) { if($art['artikel'] == $artikel) { return true; } if($this->IstRohstoffeZirkel($art['artikel'], $parents)) { return true; } } return false; } /** * @param int $artikel * @param null|int|array $parents * * @return bool */ public function IstStuecklistenZirkel($artikel, $parents = null) { if($parents !== null && is_numeric($parents)) { $parents = [$parents]; } if(is_array($parents) && (!empty($parents)?count($parents):0) > 0) { if(in_array($artikel, $parents)) { return $artikel; } } $parents[] = $artikel; $stueckliste = $this->app->DB->SelectArr( sprintf( 'SELECT DISTINCT s.artikel FROM stueckliste AS s INNER JOIN artikel AS a ON s.artikel = a.id WHERE s.stuecklistevonartikel = %d AND a.geloescht <> 1', $artikel ) ); if(empty($stueckliste)) { return false; } foreach($stueckliste as $art) { if($art['artikel'] == $artikel) { return true; } if($this->IstStuecklistenZirkel($art['artikel'], $parents)) { return true; } } return false; } /** * @param string $wert * @param int|array $artikel * @param null|int|array $shop * * @return array|mixed|null */ public function GetArtikelShopEinstellung($wert, $artikel, $shop = null) { $shopKorrekturwert = null; if(is_array($shop)) { $shopKorrekturwert = $shop; $shop = $shop['id']; } $shop = (int)$shop; if(is_array($artikel)) { $res = $artikel; $artikel = $artikel['id']; } $artikel = (int)$artikel; if($artikel <= 0) { return null; } if(empty($res)) { $res = $this->app->DB->SelectRow( sprintf('SELECT * FROM artikel WHERE id = %d LIMIT 1', $artikel) ); } if(empty($res)) { return null; } if($shop) { $artikelarr = $this->app->DB->SelectRow( sprintf( 'SELECT * FROM artikel_onlineshops WHERE artikel = %d AND aktiv = 1 AND shop = %d AND ausartikel = 0 LIMIT 1', $artikel, $shop ) ); if(!empty($artikelarr)) { foreach($artikelarr as $k => $v) { if(!is_numeric($k) && $k !== 'id' && $k !== 'shop' && $k !== 'artikel'){ $res[$k] = $v; } } } if($wert == '' || $wert === 'lagerkorrekturwert') { if($shopKorrekturwert === null) { $shopKorrekturwert = $this->app->DB->SelectRow( sprintf( 'SELECT lagerkorrekturwert,ueberschreibe_lagerkorrekturwert FROM shopexport WHERE id = %d', $shop ) ); } if(!empty($shopKorrekturwert['ueberschreibe_lagerkorrekturwert'])) { $res['lagerkorrekturwert'] = $shopKorrekturwert['lagerkorrekturwert']; } } } if($wert == '') { return $res; } if(isset($res[$wert])) { return $res[$wert]; } return null; } /** * @param int|array $artikel * * @return array|null */ public function GetArtikelshops($artikel) { if(is_array($artikel)) { $artikelarr = $artikel; $artikel = $artikel['id']; } $artikel = (int)$artikel; if($artikel <= 0) { return null; } $shops = $this->app->DB->SelectArr( sprintf( 'SELECT `shop`, `aktiv` FROM `artikel_onlineshops` WHERE `artikel` = %d', $artikel ) ); if(empty($shops)) { if(empty($artikelarr)) { $artikelarr = $this->app->DB->SelectRow( sprintf( 'SELECT `shop`, `shop2`, `shop3` FROM `artikel` WHERE `id` = %d LIMIT 1', $artikel ) ); } if(empty($artikelarr)) { return null; } $shops = null; if(!empty($artikelarr['shop'])){ $shops[] = $artikelarr['shop']; } if(!empty($artikelarr['shop2'])){ $shops[] = $artikelarr['shop2']; } if(!empty($artikelarr['shop3'])){ $shops[] = $artikelarr['shop3']; } return $shops; } $res = null; foreach($shops as $shop) { if(empty($shop['aktiv'])) { continue; } if(empty($res) || !in_array($shop['shop'], $res)) { $res[] = $shop['shop']; } } return $res; } function CheckShopTabelle($artikel) { $artikel = (int)$artikel; if($artikel <= 0){ return; } $artikelarr = $this->app->DB->SelectRow("SELECT * FROM artikel WHERE id = '$artikel' LIMIT 1"); if(empty($artikelarr)){ return; } $shops = null; if($artikelarr['shop']){ $shops[] = $artikelarr['shop']; } if($artikelarr['shop2']){ $shops[] = $artikelarr['shop2']; } if($artikelarr['shop3']){ $shops[] = $artikelarr['shop3']; } if(!$shops){ return; } $artikelarr['autolagerlampe'] = 0; $felder = array( 'lagerkorrekturwert', 'pseudolager', 'autolagerlampe', 'restmenge', 'lieferzeitmanuell', 'pseudopreis', 'generierenummerbeioption', 'variante_kopie', 'unikat', 'unikatbeikopie', 'autoabgeleicherlaubt' ); foreach($felder as $feld){ if(isset($artikelarr[$feld]) && !empty($artikelarr[$feld])) { $inhalt[] = " '".$this->app->DB->real_escape_string($artikelarr[$feld])."' "; } else { $inhalt[] = " '' "; } } foreach($shops as $shop) { if(!$this->app->DB->Select("SELECT id FROM artikel_onlineshops WHERE artikel = '$artikel' AND shop = '$shop' LIMIT 1")) { $this->app->DB->Insert("INSERT INTO artikel_onlineshops (artikel, shop, aktiv, ausartikel,".implode(', ', $felder).") VALUES ('$artikel','$shop','1','1',".implode(', ', $inhalt).")"); if(!$this->app->DB->error()) { //$this->app->DB->Update("UPDATE artikel SET shop = 0 WHERE artikel = '$artikel' AND shop = '$shop' LIMIT 1"); //$this->app->DB->Update("UPDATE artikel SET shop2 = 0 WHERE artikel = '$artikel' AND shop2 = '$shop' LIMIT 1"); //$this->app->DB->Update("UPDATE artikel SET shop3 = 0 WHERE artikel = '$artikel' AND shop3 = '$shop' LIMIT 1"); } } } } function CopyArtikelVariante($artikel,$artikelvon, $optionen, $stuecklistenelement = 0, $option = "") { $art = $artikelvon; if($stuecklistenelement)$art = $stuecklistenelement; if($artikel != $artikelvon || $stuecklistenelement > 0) { $eks = $this->app->DB->SelectArr("SELECT * FROM einkaufspreise WHERE artikel = '$artikel'"); if(!$eks) { $this->app->DB->Insert("INSERT into einkaufspreise (artikel, adresse, objekt, projekt, preis, waehrung,ab_menge, vpe, gueltig_bis, lieferzeit_standard,bezeichnunglieferant, bestellnummer) SELECT '".$artikel."', adresse, objekt, projekt, preis, waehrung,ab_menge, vpe, gueltig_bis,lieferzeit_standard,bezeichnunglieferant, bestellnummer FROM einkaufspreise WHERE artikel = '".$art."' AND geloescht <> 1 AND (isnull(gueltig_bis) OR gueltig_bis = '0000-00-00' OR gueltig_bis > now())"); } } if($artikel != $artikelvon) { $stueckliste = $this->app->DB->SelectArr("SELECT s.*, a.variante_kopie FROM stueckliste s INNER JOIN artikel a ON a.id = s.artikel WHERE stuecklistevonartikel = '$artikelvon'"); if($stueckliste) { foreach($stueckliste as $stueck) { if($stueck['variante_kopie']) { $idnew = $this->app->DB->MysqlCopyRow("artikel","id",$stueck['artikel']); $this->KopiereArtikelDateistichwoerter($stueck['artikel'], $idnew); $this->KopiereArtikelEigenschaften($stueck['artikel'], $idnew); $nummer = $this->GetNextArtikelnummer('produkt',1,(int)$this->app->DB->Select("SELECT projekt FROM artikel WHERE id = '".$stueck['artikel']."' LIMIT 1")); $this->app->DB->Update("UPDATE artikel SET variante = 1 , variante_von = '".$stueck['artikel']."' WHERE id = '$idnew' LIMIT 1"); if($nummer)$this->app->DB->Update("UPDATE artikel SET nummer = '$nummer' WHERE id = '$idnew' LIMIT 1"); $this->ObjektProtokoll("artikel", $idnew, "artikel_create", "Shopimport: Automatisch Kopie angelegt"); if($optionen)$this->app->DB->Update("UPDATE artikel SET anabregs_text = '".$optionen."', anabregs_text_en ='".$optionen."' WHERE id = '$idnew' LIMIT 1"); $this->app->DB->Insert("INSERT INTO stueckliste (stuecklistevonartikel, artikel, sort, referenz, place, layer, menge, firma, wert,bauform) SELECT '$artikel', '$idnew', sort, referenz, place, layer, menge, firma, wert,bauform FROM stueckliste WHERE id = '".$stueck['id']."'"); $this->CopyArtikelVariante($idnew, $stueck['artikel'], $stueck['artikel']); }else{ $check = $this->app->DB->Select("SELECT id FROM stueckliste WHERE artikel = '".$stueck['artikel']."' AND stuecklistevonartikel = '".$artikel."' LIMIT 1"); if(!$check) { $this->app->DB->Insert("INSERT INTO stueckliste (stuecklistevonartikel, artikel, sort, referenz, place, layer, menge, firma, wert,bauform) SELECT '$artikel', artikel, sort, referenz, place, layer, menge, firma, wert,bauform FROM stueckliste WHERE id = '".$stueck['id']."'"); } } } } } } function GetArticleIDFromShopnumber($shop, $nummer, $herstellernummerUeberspringen = false) { $extart = $this->app->DB->Select("SELECT artikelnummernummerkreis FROM shopexport WHERE id = '$shop'"); $projekt = $this->app->DB->Select("SELECT projekt FROM shopexport WHERE id = '$shop'"); $eigenernummernkreis = $this->app->DB->Select("SELECT eigenernummernkreis FROM projekt WHERE id='$projekt' LIMIT 1"); if($multiprojekt=='1' || !$eigenernummernkreis){ $j_id = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='$nummer' AND IFNULL(geloescht,0) = 0 AND IFNULL(intern_gesperrt,0) = 0 LIMIT 1"); } else{ $j_id = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='$nummer' AND projekt='$projekt' AND IFNULL(geloescht,0) = 0 AND IFNULL(intern_gesperrt,0) = 0 LIMIT 1"); } if($j_id){ return $j_id; } $multiprojekt = $this->app->DB->Select("SELECT multiprojekt FROM shopexport WHERE id='$shop' LIMIT 1"); if(!$j_id) { if($multiprojekt=='1' || !$eigenernummernkreis) $j_id = $this->app->DB->Select("SELECT id FROM artikel WHERE ean='$nummer' AND nummer <> 'DEL' AND IFNULL(geloescht,0) = 0 ORDER BY IFNULL(intern_gesperrt,0) = 0 DESC LIMIT 1"); //TODO BENE else $j_id = $this->app->DB->Select("SELECT id FROM artikel WHERE ean='$nummer' AND nummer <> 'DEL' AND projekt='$projekt' AND IFNULL(geloescht,0) = 0 ORDER BY IFNULL(intern_gesperrt,0) = 0 DESC LIMIT 1"); //TODO BENE if($j_id) { return $j_id; } } if($herstellernummerUeberspringen){ return false; } if(!$j_id) { if($multiprojekt=='1' || !$eigenernummernkreis) $j_id = $this->app->DB->Select("SELECT id FROM artikel WHERE herstellernummer='$nummer' AND nummer <> 'DEL' AND IFNULL(geloescht,0) = 0 ORDER BY IFNULL(intern_gesperrt,0) = 0 DESC LIMIT 1"); //TODO BENE else $j_id = $this->app->DB->Select("SELECT id FROM artikel WHERE herstellernummer='$nummer' AND nummer <> 'DEL' AND projekt='$projekt' AND IFNULL(geloescht,0) = 0 ORDER BY IFNULL(intern_gesperrt,0) = 0 DESC LIMIT 1"); //TODO BENE if($j_id) { return $j_id; } } } /** * @param int $auftrag * @param string $zahlungsstatus * * @throws Exception */ public function ImportUpdateZahlungsstatus($auftrag, $zahlungsstatus = 'bezahlt') { $arr = $this->app->DB->SelectRow( sprintf( "SELECT a.shop, a.shopextid,s.modulename,s.shoptyp FROM auftrag AS a INNER JOIN shopexport AS s ON a.shop = s.id AND s.aktiv = 1 AND s.demomodus = 0 AND s.auftragabgleich = 1 AND (s.shoptyp = 'intern' OR s.shoptyp = 'custom') LEFT JOIN shopexport_zahlungsstatus sz ON a.shopextid = sz.auftrag WHERE a.id = %d AND isnull(sz.id) AND a.shop <> 0 AND a.shopextid <> '' LIMIT 1", $auftrag ) ); if(empty($arr)) { return; } $obj = null; if($arr['shoptyp'] === 'custom') { $file = dirname(__DIR__) . '/plugins/external/shopimporter/'.$arr['modulename']; $classa = explode('_',str_replace('_'.$arr['shop'].'.php','', $arr['modulename'])); foreach($classa as $k => $v) { $classa[$k] = ucfirst($v); } $class = implode('_', $classa); if(file_exists($file)) { if(!class_exists($class)) { include_once $file; } if(class_exists($class)){ $obj = new $class($this->app, true); } } } else { $obj = $this->app->erp->LoadModul($arr['modulename']); } if($obj) { if(method_exists($obj, 'EinstellungenStruktur')) { $struktur = $obj->EinstellungenStruktur(); if(isset($struktur['functions']) && $struktur['functions'] && in_array('updatezahlungsstatus', $struktur['functions'])) { $erg = $this->app->remote->RemoteCommand( $arr['shop'], 'updatezahlungsstatus', array('auftrag'=>$arr['shopextid'],'zahlungsstatus'=>$zahlungsstatus) ); if($erg === 'ok') { $this->app->DB->Insert( sprintf( "INSERT INTO shopexport_zahlungsstatus (shop, auftrag, status) VALUES (%d,'%s','%s')", $arr['shop'], $this->app->DB->real_escape_string($arr['shopextid']), $this->app->DB->real_escape_string($zahlungsstatus) ) ); } return; } } } $this->app->DB->Insert( sprintf( "INSERT INTO shopexport_zahlungsstatus (shop, auftrag, status) VALUES (%d,'%s','')", $arr['shop'], $this->app->DB->real_escape_string($arr['shopextid']) ) ); } function getTaxRatesFromShopOrder($shopid, $warenkorb, $articlearray) { $taxrates = array(); if(!empty($warenkorb['steuersatz_normal'])) { if(!in_array($warenkorb['steuersatz_normal'], $taxrates)) { $taxrates[] = $warenkorb['steuersatz_normal']; } if(!in_array($warenkorb['steuersatz_ermaessigt'], $taxrates)) { $taxrates[] = $warenkorb['steuersatz_ermaessigt']; } if(!empty($articlearray)) { foreach($articlearray as $k => $position) { if(!empty($position['steuersatz']) && is_numeric($position['steuersatz']) && !in_array($position['steuersatz'], $taxrates) ) { $taxrates[] = $position['steuersatz']; } } } } if(!empty($warenkorb['lieferland'])) { $country = $warenkorb['lieferland']; }elseif(!empty($warenkorb['land'])) { $country = $warenkorb['land']; }else{ $country = ''; } if(!empty($country)) { $taxes = array(); $this->RunHook('getTaxRatesFromShopOrder',2 , $country, $taxes); if(!empty($taxes)) { $taxrates = array_merge($taxrates, $taxes); } } return $taxrates; } function ImportAuftrag($adresse,$warenkorb,$projekt,$shop="",$auftrag=0) { $this->RunHook('ImportAuftragBefore',4, $adresse,$warenkorb,$projekt,$shop); if(!empty($this->app->stringcleaner)){ $this->app->stringcleaner->XMLArray_clean($warenkorb); } $explodieren = true; $shopexportArr = $this->app->DB->SelectRow( sprintf( 'SELECT * FROM shopexport WHERE id = %d LIMIT 1', (int)$shop ) ); $angeboteanlegen = $shopexportArr['angeboteanlegen']; $doctype = 'auftrag'; if(isset($warenkorb['benutzergruppe'])){ $gruppenid = $this->app->DB->Select("SELECT id FROM gruppen WHERE kennziffer ='".$warenkorb['benutzergruppekuerzel']."'"); if(isset($warenkorb['benutzergruppeanlegen']) && $gruppenid < 1){ if(!$gruppenid){ $this->app->DB->Insert("INSERT INTO gruppen (name, art, kennziffer, dta_mail_text, dtavariablen, zahlungszielskonto, zahlungszieltageskonto,webid, aktiv) VALUES ('".$warenkorb['benutzergruppe']."','gruppe','".$warenkorb['benutzergruppekuerzel']."','','',0,0,0,1)"); } $gruppenid = $this->app->DB->GetInsertID(); } if($gruppenid){ if(!$this->app->DB->Select("SELECT id FROM adresse_rolle WHERE adresse='$adresse' AND projekt='$projekt' AND subjekt='Mitglied' AND praedikat='von' AND objekt='Gruppe' AND parameter='$gruppenid' LIMIT 1")){ $this->app->DB->Insert("INSERT INTO adresse_rolle (adresse, projekt, subjekt, praedikat, objekt, parameter, von, bis) VALUES ('$adresse', '$projekt', 'Mitglied', 'von', 'Gruppe', '$gruppenid', 'CURRENT_DATE', '0000-00-00')"); } } } if(!empty($warenkorb['doctype']) && $warenkorb['doctype']==='angebot'){ $angeboteanlegen = 1; } if($shopexportArr['lastschriftdatenueberschreiben'] && isset($warenkorb['bankverbindung']) && is_array($warenkorb['bankverbindung'])){ $anweisung = array(); if(isset($warenkorb['bankverbindung']['inhaber'])){ $anweisung[] = "inhaber='".$this->app->DB->real_escape_string($warenkorb['bankverbindung']['inhaber'])."'"; } if(isset($warenkorb['bankverbindung']['bank'])){ $anweisung[] = "bank='".$this->app->DB->real_escape_string($warenkorb['bankverbindung']['bank'])."'"; } if(isset($warenkorb['bankverbindung']['iban'])){ $anweisung[] = "iban='".$this->app->DB->real_escape_string($warenkorb['bankverbindung']['iban'])."'"; } if(isset($warenkorb['bankverbindung']['bic'])){ $anweisung[] = "swift='".$this->app->DB->real_escape_string($warenkorb['bankverbindung']['bic'])."'"; } if(isset($warenkorb['bankverbindung']['firmensepa'])){ $anweisung[] = "firmensepa='".$this->app->DB->real_escape_string($warenkorb['bankverbindung']['firmensepa'])."'"; } if(isset($warenkorb['bankverbindung']['mandatsreferenzhinweis'])){ $anweisung[] = "mandatsreferenzhinweis='".$this->app->DB->real_escape_string($warenkorb['bankverbindung']['mandatsreferenzhinweis'])."'"; } if(isset($warenkorb['bankverbindung']['mandatsreferenzdatum'])){ $anweisung[] = "mandatsreferenzdatum='".$this->app->DB->real_escape_string($warenkorb['bankverbindung']['mandatsreferenzdatum'])."'"; } if(isset($warenkorb['bankverbindung']['mandatsreferenz'])){ $anweisung[] = "mandatsreferenz='".$this->app->DB->real_escape_string($warenkorb['bankverbindung']['mandatsreferenz'])."'"; } if((!empty($anweisung)?count($anweisung):0) > 0){ $this->app->DB->Update('UPDATE adresse SET '.implode(', ',$anweisung)." WHERE id='$adresse'"); } } if($angeboteanlegen) { $doctype = 'angebot'; } if(empty($auftrag)){ if($angeboteanlegen) { $auftrag = $this->CreateAngebot(); }else{ $auftrag = $this->CreateAuftrag(); } } if($shopexportArr['rabatteportofestschreiben']) { $this->app->DB->Update("UPDATE $doctype SET rabatteportofestschreiben = 1 WHERE id = '$auftrag' LIMIT 1"); } if($doctype === 'angebot') { $this->AngebotProtokoll($auftrag,'Angebot importiert vom Shop'); }else{ $this->AuftragProtokoll($auftrag,'Auftrag importiert vom Shop'); } if(isset($warenkorb['subshop']) && $warenkorb['subshop']) { $subshopprojekt = $this->app->DB->Select("SELECT projekt FROM shopexport_subshop WHERE shop = '$shop' AND aktiv = 1 AND subshopkennung = '".$this->app->DB->real_escape_string($warenkorb['subshop'])."' LIMIT 1"); if($subshopprojekt && $this->app->DB->Select("SELECT id FROM projekt WHERE id = '$subshopprojekt' AND geloescht <> 1 LIMIT 1")){ $projekt = $subshopprojekt; } } $portocheck = $this->app->DB->Select("SELECT portocheck FROM projekt WHERE id = '$projekt'"); if(isset($warenkorb['projekt']) && $warenkorb['projekt'] && is_numeric($warenkorb['projekt'])) { if($this->app->DB->Select("SELECT id FROM projekt WHERE id = '".(int)$warenkorb['projekt']."' AND geloescht <> 1 LIMIT 1")) { $projekt = $warenkorb['projekt']; $warenkorbprojekt = $warenkorb['projekt']; } } $demomodus = $shopexportArr['demomodus']; if($doctype === 'angebot') { $this->LoadAngebotStandardwerte($auftrag,$adresse); }else{ $this->LoadAuftragStandardwerte($auftrag,$adresse); } $vertriebid = $this->app->DB->Select("SELECT vertrieb FROM adresse WHERE id = '$adresse' LIMIT 1"); $this->app->DB->Update("UPDATE $doctype SET vertriebid = '$vertriebid' WHERE id = '$auftrag' LIMIT 1"); $vertrieb = ''; if($vertriebid){ $vertrieb = $this->app->DB->real_escape_string($this->app->DB->Select("SELECT name FROM adresse WHERE id = '$vertriebid' LIMIT 1")); } if(strpos($warenkorb['gesamtsumme'],',')!==false) { $warenkorb['gesamtsumme'] = str_replace(',','.',$warenkorb['gesamtsumme']); } if(!$this->CheckDateValidate($warenkorb['lieferdatum'])) { $warenkorb['lieferdatum']=''; } if($warenkorb['lieferung']=='' || $warenkorb['lieferung']==='versandunternehmen'){ $versand = $this->Firmendaten('versandart'); } else{ $versand = $warenkorb['lieferung']; } $versandarten = $this->GetVersandartAuftrag($projekt); if (empty($versandarten) || !array_key_exists($versand, $versandarten)){ $versand = $this->Firmendaten('versandart'); } $bekannteversandart = $this->GetVersandartAuftrag($projekt); if(!isset($bekannteversandart[$warenkorb['lieferung']])) { $versand = $this->Firmendaten('versandart'); } $versandartenmapping = $shopexportArr['versandartenmapping']; $zahlungsweisenmapping = $shopexportArr['zahlungsweisenmapping']; $positionsteuersaetzeerlauben = $shopexportArr['positionsteuersaetzeerlauben']; $steuerfreilieferlandexport = $shopexportArr['steuerfreilieferlandexport']; $fastlane = 0; $autoversandvonMapping = false; if($versandartenmapping) { $extrasel = ''; $lieferung1 = $this->app->DB->real_escape_string($warenkorb['lieferung']); $lieferung2 = $this->app->DB->real_escape_string($this->app->erp->ConvertForDBUTF8($warenkorb['lieferung'])); if($lieferung2 !== '' && $lieferung2 != $lieferung1){ $extrasel .= " OR versandart_shop = '$lieferung2' "; } $lieferung3 = $this->app->DB->real_escape_string($this->app->erp->ConvertForDB($warenkorb['lieferung'])); if($lieferung3 !== '' && $lieferung3 != $lieferung1){ $extrasel .= " OR versandart_shop = '$lieferung3' "; } $versandarten = $this->app->DB->SelectArr("SELECT * FROM shopexport_versandarten WHERE aktiv = 1 AND shop = '$shop' AND versandart_wawision <> '' AND (versandart_shop = '".$this->app->DB->real_escape_string($warenkorb['lieferung'])."' $extrasel)"); if(!empty($versandarten)) { $found = false; foreach($versandarten as $vers) { $land = !empty($warenkorb['lieferadresse_land'])?$warenkorb['lieferadresse_land']:$warenkorb['land']; if(!$land){ $land = $this->Firmendaten("land"); } if(strpos($vers['land'],$land) !== false) { $versand = $vers['versandart_wawision']; $warenkorb['autoversand'] = $vers['autoversand']; $autoversandvonMapping = true; if($vers['fastlane'] == 1) { $fastlane = 1; } $found = true; break; } } if(!$found) { //Fallback foreach($versandarten as $vers) { if($vers['land'] == '') { $versand = $vers['versandart_wawision']; $warenkorb['autoversand'] = $vers['autoversand']; $autoversandvonMapping = true; $found = true; if($vers['fastlane'] == 1) { $fastlane = 1; } break; } } } if(!$found) { $versandarten2 = $this->app->DB->SelectArr("SELECT * FROM shopexport_versandarten WHERE aktiv = 1 AND shop = '$shop' AND versandart_wawision <> '' AND versandart_shop = ''"); foreach($versandarten2 as $vers) { $land = !empty($warenkorb['lieferadresse_land'])?$warenkorb['lieferadresse_land']:$warenkorb['land']; if(!$land){ $land = $this->Firmendaten('land'); } if(strpos($vers['land'],$land) !== false) { $versand = $vers['versandart_wawision']; $warenkorb['autoversand'] = $vers['autoversand']; $autoversandvonMapping = true; $found = true; if($vers['fastlane'] == 1) { $fastlane = 1; } break; } } if(!$found) { //Fallback foreach($versandarten2 as $vers) { if($vers['land'] == '') { $versand = $vers['versandart_wawision']; $warenkorb['autoversand'] = $vers['autoversand']; $autoversandvonMapping = true; $found = true; if($vers['fastlane'] == 1) { $fastlane = 1; } break; } } } } }else{ $checkversand = $this->app->DB->Select("SELECT id FROM shopexport_versandarten WHERE shop = '$shop' AND versandart_shop = '".$this->app->DB->real_escape_string($warenkorb['lieferung'])."' LIMIT 1"); if(!$checkversand) { $this->app->DB->Insert("INSERT INTO shopexport_versandarten (shop, versandart_shop, aktiv) values ('$shop','".$this->app->DB->real_escape_string($warenkorb['lieferung'])."',0)"); } } } $empfaengerLand = $warenkorb['land']; if(!empty($warenkorb['lieferadresse_name']) && !empty($warenkorb['lieferadresse_land']) && ( $warenkorb['lieferadresse_name'] !== $warenkorb['name'] || $warenkorb['lieferadresse_land'] !== $warenkorb['land'] || $warenkorb['lieferadresse_strasse'] !== $warenkorb['strasse'] || $warenkorb['lieferadresse_ort'] !== $warenkorb['ort'] || $warenkorb['lieferadresse_plz'] !== $warenkorb['plz'] ) ) { $warenkorb['abweichendelieferadresse']=1; if($steuerfreilieferlandexport && !empty($warenkorb['lieferadresse_land'])){ $empfaengerLand = $warenkorb['lieferadresse_land']; } } $ust_befreit=0; if(!empty($empfaengerLand) && $empfaengerLand !== $this->Firmendaten("land")) { if($this->IstEU($empfaengerLand)){ $ust_befreit=1; } if($this->Export($empfaengerLand)){ $ust_befreit=2; } } if(isset($warenkorb['ust_befreit']) && is_numeric($warenkorb['ust_befreit'])) { $warenkorb_ustbefreit = (int)$warenkorb['ust_befreit']; if($warenkorb_ustbefreit >= 0 && $warenkorb_ustbefreit <= 3){ $ust_befreit = $warenkorb_ustbefreit; } } if(isset($warenkorb['fastlane'])) { $fastlane = $warenkorb['fastlane']; } if($fastlane) { $fastlane = 1; }else{ $fastlane = 0; } $warenkorb['zahlungsweise'] = str_replace(array('ü','Ü','ä','Ä','ö','Ö','ß'),array('ü','Ü','ä','Ä','ö','Ö','ß'), $warenkorb['zahlungsweise']); if($zahlungsweisenmapping) { $extrasel = ""; $zahlungsweise1 = $this->app->DB->real_escape_string($warenkorb['zahlungsweise']); $zahlungsweise2 = $this->app->DB->real_escape_string($this->app->erp->ConvertForDBUTF8($warenkorb['zahlungsweise'])); if($zahlungsweise2 !== '' && $zahlungsweise2 != $zahlungsweise1)$extrasel .= " OR zahlweise_shop = '$zahlungsweise2' "; $zahlungsweise3 = $this->app->DB->real_escape_string($this->app->erp->ConvertForDB($warenkorb['zahlungsweise'])); if($zahlungsweise3 !== '' && $zahlungsweise3 != $zahlungsweise1)$extrasel .= " OR zahlweise_shop = '$zahlungsweise3' "; $shopexport_zahlweisen = $this->app->DB->SelectArr("SELECT * FROM shopexport_zahlweisen WHERE shop='$shop' AND aktiv = 1 AND zahlweise_wawision <> '' AND (zahlweise_shop = '".$this->app->DB->real_escape_string($warenkorb['zahlungsweise'])."' $extrasel )"); if(!$shopexport_zahlweisen) { if($warenkorb['zahlungsweise']=="secupay_creditcard") $warenkorb['zahlungsweise']="secupay"; if($warenkorb['zahlungsweise']=="Amazoncba") $warenkorb['zahlungsweise']="amazon"; if($warenkorb['zahlungsweise'] == 'sofort_sofortueberweisung')$warenkorb['zahlungsweise'] = 'sofortueberweisung'; $shopexport_zahlweisen = $this->app->DB->SelectArr("SELECT * FROM shopexport_zahlweisen WHERE aktiv = 1 AND shop='$shop' AND zahlweise_shop = '".$this->app->DB->real_escape_string($warenkorb['zahlungsweise'])."'"); if(!$shopexport_zahlweisen) { $checkzahl = $this->app->DB->Select("SELECT id FROM shopexport_zahlweisen WHERE shop = '$shop' and zahlweise_shop = '".$this->app->DB->real_escape_string($warenkorb['zahlungsweise'])."' LIMIT 1"); if(!$checkzahl) { $this->app->DB->Insert("INSERT INTO shopexport_zahlweisen (shop, zahlweise_shop, aktiv) values ('$shop','".$this->app->DB->real_escape_string($warenkorb['zahlungsweise'])."',0)"); } } } $found = false; if($shopexport_zahlweisen) { foreach($shopexport_zahlweisen as $zahlung) { $warenkorb['zahlungsweise'] = $zahlung['zahlweise_wawision']; $warenkorb['vorabbezahltmarkieren'] = $zahlung['vorabbezahltmarkieren']; if(!$zahlung['autoversand']){ $warenkorb['autoversand'] = 0; } if($zahlung['keinerechnung']){ $warenkorb['auftragsart'] = 'lieferung'; } if($zahlung['fastlane'] == 1) { $fastlane = 1; } $found = true; break; } } if(!$found) { $shopexport_zahlweisen2 = $this->app->DB->SelectArr("SELECT * FROM shopexport_zahlweisen WHERE shop='$shop' AND aktiv = 1 AND zahlweise_wawision <> '' AND zahlweise_shop = ''"); if($shopexport_zahlweisen2) { foreach($shopexport_zahlweisen2 as $zahlung) { $warenkorb['zahlungsweise'] = $zahlung['zahlweise_wawision']; $warenkorb['vorabbezahltmarkieren'] = $zahlung['vorabbezahltmarkieren']; if(!$zahlung['autoversand']){ $warenkorb['autoversand'] = 0; } if($zahlung['keinerechnung']){ $warenkorb['auftragsart'] = 'lieferung'; } if($zahlung['fastlane'] == 1) { $fastlane = 1; } $found = true; break; } } } if($warenkorb['zahlungsweise']==='bar') { $versand = 'selbstabholer'; } }else{ if($warenkorb['zahlungsweise'] === 'secupay_creditcard') { $warenkorb['zahlungsweise']='secupay'; } if($warenkorb['zahlungsweise'] === 'Amazoncba') { $warenkorb['zahlungsweise']='amazon'; } if($warenkorb['zahlungsweise'] === 'sofort_sofortueberweisung'){ $warenkorb['zahlungsweise'] = 'sofortueberweisung'; } $bekanntezahlungsweisen = $this->GetZahlungsweise(); if(!isset($bekanntezahlungsweisen[$warenkorb['zahlungsweise']])) { $warenkorb['zahlungsweise'] = $this->Firmendaten("zahlungsweise"); } if($warenkorb['zahlungsweise']==='bar') { $versand = 'selbstabholer'; } $vorabbezahltmarkieren_ohnevorkasse_bar = $shopexportArr['vorabbezahltmarkieren_ohnevorkasse_bar']; if($vorabbezahltmarkieren_ohnevorkasse_bar=='1' && ($warenkorb['zahlungsweise']!=='rechnung' && $warenkorb['zahlungsweise']!=='nachnahme' && $warenkorb['zahlungsweise']!=='sofortueberweisung' && $warenkorb['zahlungsweise']!=='bar' && $warenkorb['zahlungsweise']!=='vorkasse' && $warenkorb['zahlungsweise']!=='paypal')) { $warenkorb['vorabbezahltmarkieren']='1'; } if(empty($warenkorb['vorabbezahltmarkieren']) || $warenkorb['vorabbezahltmarkieren']!='1') { $warenkorb['vorabbezahltmarkieren']='0'; } } switch($shopexportArr['autoversandoption']){ case 'rechnungundlieferschein': $warenkorb['auftragsart'] = 'standardauftrag'; break; case 'nurrechnung': $warenkorb['auftragsart'] = 'rechnung'; break; case 'nurlieferschein': $warenkorb['auftragsart'] = 'lieferung'; break; } if(!empty($warenkorb['lieferadresse_name'])){ $warenkorb['abweichendelieferadresse'] = '1'; } else{ $warenkorb['abweichendelieferadresse'] = '0'; } //belegnummer fuer auftrag erzeugen $belegnr = (String)$this->app->DB->Select("SELECT belegnr FROM $doctype WHERE id = '$auftrag' LIMIT 1"); if($belegnr === '' || $belegnr === '0') { if((String)$demomodus === '1' || $doctype === 'angebot') { $belegnr = ""; $demomodus = 1; }else{ $belegnr = $this->GetNextNummer($doctype,$projekt,$auftrag); } } if($warenkorb['bestellnummer']!='') { $warenkorb['bestellnummer'] = 'Ihre Bestellnummer: '.$warenkorb['bestellnummer']; } if(!isset($warenkorb['aktion'])) { $warenkorb['aktion'] = ""; } if(isset($warenkorb['aktionscode']) && $warenkorb['aktionscode']!="") { $warenkorb['aktion'] = $warenkorb['aktionscode']; } $shopfreitext = $shopexportArr['freitext']; if($shopfreitext === 'freitext' && !empty($warenkorb['internebemerkung'])) { if(empty($warenkorb['freitext'])) { $warenkorb['freitext'] = $warenkorb['internebemerkung']; }else{ $warenkorb['freitext'] .= "\n".$warenkorb['internebemerkung']; } $warenkorb['internebemerkung'] = ''; if(!empty($warenkorb['internebemerkung'])) { $warenkorb['internebemerkung'] = ''; } }elseif($shopfreitext === 'internebemerkung' && !empty($warenkorb['freitext'])) { if(empty($warenkorb['internebemerkung'])) { $warenkorb['internebemerkung'] = $warenkorb['freitext']; }else{ $warenkorb['internebemerkung'] .= "\n".$warenkorb['freitext']; } $warenkorb['freitext'] = ''; } $checksprache = $this->app->DB->Select("SELECT sprache FROM shopexport_sprachen WHERE shop = '$shop' AND (projekt = '$projekt' OR projekt = 0) AND (land = '".(isset($warenkorb['land'])?$warenkorb['land']:$this->app->erp->Firmendaten('land'))."' OR land = '') ORDER BY projekt = '$projekt' DESC, land = '".$warenkorb['land']."' DESC LIMIT 1 "); if(!isset($warenkorb['kunde_sprache']) || !$warenkorb['kunde_sprache']){ $warenkorb['kunde_sprache'] = $checksprache; } if($warenkorb['bestellnummer']!=''){ $warenkorb['freitext'] .= "\r\n" . $warenkorb['bestellnummer']; } $escapearr = array('ansprechpartner','lieferadresse_name', 'lieferadresse_strasse','lieferadresse_unterabteilung','lieferadresse_abteilung','lieferadresse_ansprechpartner','lieferadresse_ort','lieferadresse_adresszusatz','freitext'); foreach($escapearr as $k) { if(isset($warenkorb[$k])){ $warenkorb[$k] = $this->app->DB->real_escape_string($warenkorb[$k]); } } if($doctype === 'angebot'){ $this->app->DB->Update("UPDATE angebot SET anfrage = '".$this->app->DB->real_escape_string($warenkorb['onlinebestellnummer'])."' WHERE id = '$auftrag' LIMIT 1"); } $this->app->DB->Update("UPDATE $doctype SET belegnr='$belegnr', datum='{$warenkorb['bestelldatum']}', lieferdatum='{$warenkorb['lieferdatum']}', ustid='{$warenkorb['ustid']}', ust_befreit='{$ust_befreit}', internet='{$warenkorb['onlinebestellnummer']}', transaktionsnummer='{$warenkorb['transaktionsnummer']}', aktion='{$warenkorb['aktion']}', versandart='{$versand}', vertrieb='{$vertrieb}', zahlungsweise='{$warenkorb['zahlungsweise']}', freitext='{$warenkorb['freitext']}', bank_inhaber='{$warenkorb['kontoinhaber']}', bank_institut='{$warenkorb['bank']}', bank_blz='{$warenkorb['blz']}', bank_konto='{$warenkorb['kontonummer']}', ".($doctype !== 'angebot'?"vorabbezahltmarkieren='{$warenkorb['vorabbezahltmarkieren']}',":'')." autoversand='1', abweichendelieferadresse='{$warenkorb['abweichendelieferadresse']}', ansprechpartner='{$warenkorb['ansprechpartner']}', liefername='{$warenkorb['lieferadresse_name']}', lieferland='{$warenkorb['lieferadresse_land']}', lieferstrasse='{$warenkorb['lieferadresse_strasse']}', lieferabteilung='{$warenkorb['lieferadresse_abteilung']}', lieferunterabteilung='{$warenkorb['lieferadresse_unterabteilung']}', lieferansprechpartner='{$warenkorb['lieferadresse_ansprechpartner']}', lieferort='{$warenkorb['lieferadresse_ort']}', lieferplz='{$warenkorb['lieferadresse_plz']}', liefertitel='{$warenkorb['lieferadresse_titel']}', lieferemail='{$warenkorb['lieferadresse_email']}', lieferadresszusatz='{$warenkorb['lieferadresse_adresszusatz']}', packstation_inhaber='{$warenkorb['packstation_inhaber']}', packstation_station='{$warenkorb['packstation_nummer']}', packstation_ident='{$warenkorb['packstation_postidentnummer']}', packstation_plz='{$warenkorb['packstation_plz']}', packstation_ort='{$warenkorb['packstation_ort']}', ".($doctype !== 'angebot'?"partnerid='{$warenkorb['affiliate_ref']}',":'')." ".($doctype !== 'angebot'?"kennen='{$warenkorb['kennen']}',":'')." status=".((String)$demomodus === '1'?"'angelegt'":"'freigegeben'").", projekt='$projekt', shop='$shop', zahlungszielskonto = 0, bodyzusatz='{$warenkorb['bodyzusatz']}', gesamtsumme='{$warenkorb['gesamtsumme']}' WHERE id='$auftrag' LIMIT 1"); if(!empty($warenkorb['angebot']) && $warenkorb['angebot']!='') { $angebotid = $this->app->DB->Select("SELECT id FROM angebot WHERE belegnr='".$this->app->DB->real_escape_string($warenkorb['angebot'])."' AND belegnr!='' LIMIT 1"); if($angebotid > 0) { $this->app->DB->Update("UPDATE angebot SET auftrag='$belegnr', auftragid='$auftrag' WHERE id='$angebotid' LIMIT 1"); $this->app->DB->Update("UPDATE auftrag SET angebot='".$this->app->DB->real_escape_string($warenkorb['angebot'])."', angebotid='$angebotid' WHERE id='$auftrag' LIMIT 1"); } } if($projekt && $doctype === 'auftrag') { $bevorzugteslager = $this->app->DB->Select("SELECT l.id FROM projekt p INNER JOIN lager l ON p.standardlager = l.id WHERE p.id = '$projekt' LIMIT 1"); if($bevorzugteslager){ $this->app->DB->Update("UPDATE auftrag SET standardlager = '$bevorzugteslager' WHERE id='$auftrag' LIMIT 1"); } } if($doctype === 'auftrag' && isset($warenkorb['ust_ok']) && (string)$warenkorb['ust_ok'] === '0') { $this->app->DB->Update( sprintf( 'UPDATE `auftrag` SET `ust_ok` = 0 WHERE `id` = %d', $auftrag ) ); } if($this->app->DB->error()) { $this->app->DB->Update("UPDATE $doctype SET versandart='{$versand}' WHERE id='$auftrag'"); $this->app->DB->Update("UPDATE $doctype SET datum='{$warenkorb['bestelldatum']}' WHERE id='$auftrag'"); $this->app->DB->Update("UPDATE $doctype SET shop='$shop' WHERE id='$auftrag'"); $this->app->DB->Update("UPDATE $doctype SET zahlungsweise='{$warenkorb['zahlungsweise']}' WHERE id='$auftrag' LIMIT 1"); } $this->app->DB->Update("UPDATE $doctype SET name = '".$this->app->DB->real_escape_string($warenkorb['name'])."' ,strasse = '".$this->app->DB->real_escape_string($warenkorb['strasse'])."' ,plz = '".$this->app->DB->real_escape_string($warenkorb['plz'])."' ,ort = '".$this->app->DB->real_escape_string($warenkorb['ort'])."' ,land = '".$this->app->DB->real_escape_string($warenkorb['land'])."' ,abteilung = '".$this->app->DB->real_escape_string($warenkorb['abteilung'])."' ,unterabteilung= '".$this->app->DB->real_escape_string($warenkorb['unterabteilung'])."' ,ansprechpartner= '".$warenkorb['ansprechpartner']."' ,adresszusatz= '".$this->app->DB->real_escape_string($warenkorb['adresszusatz'])."' ,email= '".$this->app->DB->real_escape_string($warenkorb['email'])."' ,telefon= '".$this->app->DB->real_escape_string($warenkorb['telefon'])."' ,telefax= '".$this->app->DB->real_escape_string($warenkorb['telefax'])."' WHERE id='$auftrag' LIMIT 1"); if(!empty($warenkorb['anrede'])){ $query = sprintf("UPDATE `%s` SET `typ` = '%s' WHERE `id` = %d", $doctype, $this->app->DB->real_escape_string($warenkorb['anrede']), $auftrag); $this->app->DB->Update($query); } if($warenkorb['ustid']){ $this->app->DB->Update("UPDATE $doctype SET ustid= '" . $this->app->DB->real_escape_string($warenkorb['ustid']) . "' WHERE id='$auftrag' LIMIT 1"); } if(!empty($warenkorb['abweichendelieferadresse'])){ $abweichendeUstId = ''; if(!empty($warenkorb['lieferadresse_ustid'])){ $abweichendeUstId = $warenkorb['lieferadresse_ustid']; } $this->app->DB->Update("UPDATE $doctype SET ustid= '".$this->app->DB->real_escape_string($abweichendeUstId)."' WHERE id='$auftrag' LIMIT 1"); } if($shopexportArr['vertrieb']) { $vertriebname = $this->app->DB->SelectRow( sprintf( 'SELECT id, name FROM adresse WHERE id = %d AND geloescht <> 1', $shopexportArr['vertrieb'] ) ); if($vertriebname && $doctype === 'angebot'){ $this->app->DB->Update( sprintf( "UPDATE angebot SET vertriebid = %d, vertrieb = '%s' WHERE id = %d", $shopexportArr['vertrieb'], $this->app->DB->real_escape_string($vertriebname['name']), $auftrag ) ); } elseif($vertriebname && $doctype !== 'angebot') { $this->app->DB->Update( sprintf( "UPDATE auftrag SET vertriebid = %d, vertrieb = '%s' WHERE id = %d", $shopexportArr['vertrieb'], $this->app->DB->real_escape_string($vertriebname['name']), $auftrag ) ); } } if($fastlane) { $this->app->DB->Update("UPDATE $doctype SET fastlane= 1 WHERE id='$auftrag' LIMIT 1"); } if(isset($warenkorb['auftragsart'])){ $this->app->DB->Update("UPDATE $doctype SET art = '{$warenkorb['auftragsart']}' WHERE id='$auftrag'"); } if(!empty($warenkorb['bundesland'])){ $this->app->DB->Update("UPDATE $doctype SET bundesland = '".$this->app->DB->real_escape_string($warenkorb['bundesland'])."' WHERE id = '$auftrag' LIMIT 1"); } if($this->app->erp->ModulVorhanden('bundesstaaten')) { if(!empty($warenkorb['bundesstaat'])) { $bundesstaat = $this->app->DB->Select("SELECT iso FROM `bundesstaaten` WHERE land = '".$this->app->DB->real_escape_string($warenkorb['land'])."' AND (iso = '".$this->app->DB->real_escape_string($warenkorb['bundesstaat'])."' OR bundesstaat = '".$this->app->DB->real_escape_string($warenkorb['bundesstaat'])."') AND aktiv = 1 LIMIT 1"); if($bundesstaat != ''){ $this->app->DB->Update("UPDATE $doctype SET bundesstaat = '".$this->app->DB->real_escape_string($bundesstaat)."' WHERE id = '$auftrag' LIMIT 1"); } } if(!empty($warenkorb['lieferbundesstaat'])) { $bundesstaat = $this->app->DB->Select("SELECT iso FROM `bundesstaaten` WHERE land = '".$this->app->DB->real_escape_string($warenkorb['lieferland'])."' AND (iso = '".$this->app->DB->real_escape_string($warenkorb['lieferadresse_bundesstaat'])."' OR bundesstaat = '".$this->app->DB->real_escape_string($warenkorb['lieferadresse_bundesstaat'])."') AND aktiv = 1 LIMIT 1"); if($bundesstaat != ''){ $this->app->DB->Update("UPDATE $doctype SET lieferbundesstaat = '".$this->app->DB->real_escape_string($bundesstaat)."' WHERE id = '$auftrag' LIMIT 1"); } } } $keinautoversandwegenkommentar = false; if((!empty($warenkorb['freitext']) || !empty($warenkorb['internebemerkung'])) && $shopexportArr['autoversandbeikommentardeaktivieren']){ $keinautoversandwegenkommentar = true; } if((isset($warenkorb['autoversand']) && $warenkorb['autoversand'] == '0') || $keinautoversandwegenkommentar){ $this->app->DB->Update("UPDATE $doctype SET autoversand='0' WHERE id='$auftrag'"); } if(!empty($warenkorb['autoversandueberschreiben']) && $warenkorb['autoversandueberschreiben'] == '1'){ $this->app->DB->Update("UPDATE $doctype SET autoversand='1' WHERE id='$auftrag'"); } if(!empty($warenkorb['internebemerkung'])){ $this->app->DB->Update("UPDATE $doctype set internebemerkung = '".$this->app->DB->real_escape_string( $warenkorb['internebemerkung'])."' WHERE id = '$auftrag' LIMIT 1"); } if(!empty($warenkorb['internebezeichnung'])){ $this->app->DB->Update("UPDATE $doctype set internebezeichnung = '".$this->app->DB->real_escape_string( $warenkorb['internebezeichnung'])."' WHERE id = '$auftrag' LIMIT 1"); } if($this->app->DB->Select("SELECT `ust_ok` FROM `shopexport` WHERE `id` = '{$shop}' LIMIT 1")){ $this->app->DB->Update("UPDATE `{$doctype}` SET `ust_ok` = 1 WHERE `id` = '{$auftrag}' LIMIT 1"); }elseif(isset($warenkorb['ust_ok']) && $warenkorb['ust_ok'] == '1'){ $this->app->DB->Update("UPDATE `{$doctype}` SET `ust_ok` = 1 WHERE `id` = '{$auftrag}' LIMIT 1"); }elseif($doctype === 'auftrag'){ $this->app->DB->Update("UPDATE `{$doctype}` SET `ust_ok` = 0 WHERE `id` = '{$auftrag}' LIMIT 1"); } if($warenkorb['zahlungsweise'] === 'rechnung') { $fromstandard = true; $adressezahlungsweise = $this->app->DB->SelectRow("SELECT * FROM adresse WHERE id = '$adresse' LIMIT 1"); if($adressezahlungsweise) { if($adressezahlungsweise['zahlungsweise'] === 'rechnung' && $adressezahlungsweise['zahlungszieltage'] > 0){ $fromstandard = false; } } if($fromstandard) { $this->app->DB->Update("UPDATE $doctype SET zahlungszielskonto='".(float)$this->Firmendaten('zahlungszielskonto')."', zahlungszieltage='".(float)$this->Firmendaten('zahlungszieltage')."', zahlungszieltageskonto='".(float)$this->Firmendaten('zahlungszieltageskonto')."' WHERE id='$auftrag' LIMIT 1"); } } if(!empty($warenkorb['kunde_sprache'])) { $this->app->DB->Update("UPDATE $doctype SET sprache = '".$this->app->DB->real_escape_string($warenkorb['kunde_sprache'])."' WHERE id = '$auftrag' LIMIT 1"); if(!$this->app->DB->Select("SELECT adressennichtueberschreiben FROM shopexport WHERE id = '$shop' LIMIT 1")) { $adresse = $this->app->DB->Select("SELECT adresse FROM $doctype WHERE id = '$auftrag' LIMIT 1"); if('' === (String)$this->app->DB->Select("SELECT sprache FROM adresse WHERE id = '$adresse' LIMIT 1")) { $this->app->DB->Update("UPDATE adresse SET sprache = '".$this->app->DB->real_escape_string($warenkorb['kunde_sprache'])."' WHERE id = '$adresse' LIMIT 1"); } } } if(!empty($warenkorb['anhang'])) { if(!is_array($warenkorb['anhang'])){ $data = $warenkorb['anhang']; $warenkorb['anhang'] = []; $warenkorb['anhang'][] = ['datei' => $data, 'endung' => '']; } foreach ($warenkorb['anhang'] as $anhang){ $endung = ltrim($anhang['endung'],'.'); $dateilabel = 'Anhang'; $decodedData = @base64_decode($anhang['datei']); $tmpdatei = $this->app->erp->GetTMP().'anhangtmp'.microtime(true); file_put_contents($tmpdatei ,$decodedData); if(empty($endung)){ $mimetype = explode('/',mime_content_type($tmpdatei)); switch ($mimetype[0]){ case 'image': if(strpos($mimetype[1],'jpg') !== false || strpos($mimetype[1],'jpeg') !== false){ $endung = 'jpg'; } if(strpos($mimetype[1],'png') !== false){ $endung = 'png'; } if(strpos($mimetype[1],'bmp') !== false){ $endung = 'bmp'; } break; case 'text': if(strpos($mimetype[1],'plain') !== false){ $endung = 'txt'; } if(strpos($mimetype[1],'php') !== false){ $endung = 'php'; } break; default: $endung = 'pdf'; break; } } $datei = $this->app->Conf->WFuserdata.'/'.md5($warenkorb['onlinebestellnummer'].'.'.$endung.microtime(true)); move_uploaded_file($tmpdatei,$datei); if(file_put_contents($datei,$decodedData)) { if(@is_file($datei) && @filesize($datei)) { if(!empty(trim($anhang['name']))){ $dateilabel = $this->app->DB->real_escape_string(trim($anhang['name'])); } $fileid = $this->CreateDatei($warenkorb['onlinebestellnummer'].'.'.$endung, $dateilabel, '', '', $datei, $this->app->User->GetName()); $this->AddDateiStichwort($fileid, 'anhang', $doctype, $auftrag); unlink($datei); } } } } if(isset($warenkorb['zahlungszielskonto'])){ $this->app->DB->Update("UPDATE $doctype SET zahlungszielskonto = '".(float)(str_replace(',','.',$warenkorb['zahlungszielskonto']))."' WHERE id = '$auftrag' LIMIT 1"); } if(isset($warenkorb['zahlungszieltage'])){ $this->app->DB->Update("UPDATE $doctype SET zahlungszieltage = '".(int)($warenkorb['zahlungszieltage'])."' WHERE id = '$auftrag' LIMIT 1"); } if(isset($warenkorb['zahlungszieltageskonto'])){ $this->app->DB->Update("UPDATE $doctype SET zahlungszieltageskonto = '".(int)($warenkorb['zahlungszieltageskonto'])."' WHERE id = '$auftrag' LIMIT 1"); } if(isset($warenkorb['steuersatz_normal']) && (float)str_replace(',','.',$warenkorb['steuersatz_normal']) > 1){ $this->app->DB->Update("UPDATE $doctype SET steuersatz_normal = '".(float)(str_replace(',','.',$warenkorb['steuersatz_normal']))."' WHERE id = '$auftrag' LIMIT 1"); } if(isset($warenkorb['steuersatz_ermaessigt']) && (float)str_replace(',','.',$warenkorb['steuersatz_ermaessigt']) > 1){ $this->app->DB->Update("UPDATE $doctype SET steuersatz_ermaessigt = '".(float)(str_replace(',','.',$warenkorb['steuersatz_ermaessigt']))."' WHERE id = '$auftrag' LIMIT 1"); } $this->RunHook('import_auftrag_tax_changed',2, $doctype, $auftrag); if(isset($warenkorb['steuersatz_normal']) && (float)str_replace(',','.',$warenkorb['steuersatz_normal']) > 1){ $warenkorb['steuersatz_normal'] = $this->app->DB->Select("SELECT steuersatz_normal FROM $doctype WHERE id = $auftrag LIMIT 1"); } if(isset($warenkorb['steuersatz_ermaessigt']) && (float)str_replace(',','.',$warenkorb['steuersatz_ermaessigt']) > 1){ $warenkorb['steuersatz_ermaessigt'] = $this->app->DB->Select("SELECT steuersatz_ermaessigt FROM $doctype WHERE id = $auftrag LIMIT 1"); } $this->RunHook('import_auftrag_tax_changed',2, $doctype, $auftrag); if(isset($warenkorb['steuersatz_normal']) && (float)str_replace(',','.',$warenkorb['steuersatz_normal']) > 1){ $warenkorb['steuersatz_normal'] = $this->app->DB->Select("SELECT steuersatz_normal FROM $doctype WHERE id = $auftrag LIMIT 1"); } if(isset($warenkorb['steuersatz_ermaessigt']) && (float)str_replace(',','.',$warenkorb['steuersatz_ermaessigt']) > 1){ $warenkorb['steuersatz_ermaessigt'] = $this->app->DB->Select("SELECT steuersatz_ermaessigt FROM $doctype WHERE id = $auftrag LIMIT 1"); } $waehrung = 'EUR'; if(!empty($warenkorb['waehrung'])) { $waehrung = $this->app->DB->real_escape_string(trim(strtoupper($warenkorb['waehrung']))); if(!$waehrung) { $waehrung = 'EUR'; } else{ $this->app->DB->Update("UPDATE $doctype SET waehrung = '$waehrung' WHERE id = '$auftrag' LIMIT 1"); } } if(isset($warenkorb['auftragsart']) && $warenkorb['auftragsart']){ $this->app->DB->Update("UPDATE $doctype SET art = '".$this->app->DB->real_escape_string($warenkorb['auftragsart'])."' WHERE id = '$auftrag' LIMIT 1"); } if($shop){ $shoptyp = $shopexportArr['typ']; $artikelimport = $shopexportArr['artikelimport']; $artikelimporteinzeln = $shopexportArr['artikelimporteinzeln']; $projekt = $shopexportArr['projekt']; if(!empty($subshopprojekt)){ $projekt = $subshopprojekt; } if(!empty($warenkorbprojekt)){ $projekt = $warenkorbprojekt; } $multiprojekt = $shopexportArr['multiprojekt']; $artikelnummernummerkreis = $shopexportArr['artikelnummernummerkreis']; $shopbezeichnung = $shopexportArr['bezeichnung']; $stuecklisteergaenzen = $shopexportArr['stuecklisteergaenzen']; $artikeltexteuebernehmen = $shopexportArr['artikeltexteuebernehmen']; } if($waehrung !== 'EUR') { $this->LoadKurs($auftrag, $doctype, $projekt); } if($doctype === 'auftrag'){ $this->RunHook('ImportAuftrag', 4, $auftrag, $shop, $warenkorb, $projekt); } if(isset($warenkorb['vertrieb'])){ $this->app->DB->Update("UPDATE $doctype SET vertrieb = '".$warenkorb['vertrieb']."' WHERE id = '$auftrag' LIMIT 1"); } if(isset($warenkorb['vertriebid']) && $warenkorb['vertriebid'] > 0){ $this->app->DB->Update("UPDATE $doctype SET vertriebid = '".$warenkorb['vertriebid']."' WHERE id = '$auftrag' LIMIT 1"); } if(empty($warenkorb['steuerfrei']) && !empty($warenkorb['checksteuerfrei'])) { if($doctype === 'angebot' && !$this->AngebotMitUmsatzeuer($auftrag)) { $warenkorb['steuerfrei'] = 1; }elseif($doctype === 'auftrag' && !$this->AuftragMitUmsatzsteuer($auftrag)) { $warenkorb['steuerfrei'] = 1; } } $parentcount = []; $rabattpositionen = array(); if(!empty($warenkorb['articlelist'])){ foreach ($warenkorb['articlelist'] as $key => $value) {//Leerzeichen entfernen in Artikelnummern unset($warenkorb['articlelist'][$key]['databaseId']); if(isset($warenkorb['articlelist'][$key]['articleid'])){ $warenkorb['articlelist'][$key]['articleid'] = trim($value['articleid']); } if(isset($warenkorb['articlelist'][$key]['variante_von'])){ $warenkorb['articlelist'][$key]['variante_von'] = trim($value['variante_von']); } } //Stücklisten mit einem Element auflösen foreach ($warenkorb['articlelist'] as $key => $value) { if($stuecklisteergaenzen){ $warenkorb['articlelist'][$key]['stuecklisteergaenzen'] = true; } if(isset($value['posid']) && $value['posid']) { $posids[$value['posid']] = $key; } if(isset($value['parentid']) && $value['parentid']){ if(empty($parentcount) || !isset($parentcount[$value['parentid']])){ $parentcount[$value['parentid']] = 0; } $parentcount[$value['parentid']]++; } } } //if(true || !$stuecklisteergaenzen) if(true) { if(!empty($parentcount)) { foreach($parentcount as $k => $v) { if($v == 1 && isset($posids[$k])) { foreach($warenkorb['articlelist'] as $key=>$value) { if(isset($value['parentid']) && $value['parentid'] && $value['parentid'] == $k) { if(isset($warenkorb['articlelist'][$posids[$k]]['options']) && $warenkorb['articlelist'][$posids[$k]]['options']) { $warenkorb['articlelist'][$key]['options'] = (isset($warenkorb['articlelist'][$key]['options']) && $warenkorb['articlelist'][$key]['options']?$warenkorb['articlelist'][$key]['options'].' ':'').$warenkorb['articlelist'][$posids[$k]]['options']; } if((isset($warenkorb['articlelist'][$posids[$k]]['price']) && $warenkorb['articlelist'][$posids[$k]]['price'] != 0) || (isset($warenkorb['articlelist'][$posids[$k]]['price_netto']) && $warenkorb['articlelist'][$posids[$k]]['price_netto'] != 0)) { if(isset($warenkorb['articlelist'][$posids[$k]]['price'])){ $warenkorb['articlelist'][$key]['price'] = $warenkorb['articlelist'][$posids[$k]]['price']; } if(isset($warenkorb['articlelist'][$posids[$k]]['price_netto'])){ $warenkorb['articlelist'][$key]['price_netto'] = $warenkorb['articlelist'][$posids[$k]]['price_netto']; } $warenkorb['articlelist'][$key]['quantity'] = $warenkorb['articlelist'][$posids[$k]]['quantity']; } if(isset($warenkorb['articlelist'][$posids[$k]]['steuersatz'])) { $warenkorb['articlelist'][$key]['steuersatz'] = $warenkorb['articlelist'][$posids[$k]]['steuersatz']; } unset($warenkorb['articlelist'][$key]['parentid']); unset($warenkorb['articlelist'][$posids[$k]]); } } } } } } if(!empty($parentcount)) { foreach($parentcount as $k => $v) { if($v > 1 && isset($posids[$k])) { if(((isset($warenkorb['articlelist'][$posids[$k]]['price']) && $warenkorb['articlelist'][$posids[$k]]['price'] > 0) || (isset($warenkorb['articlelist'][$posids[$k]]['price_netto']) && $warenkorb['articlelist'][$posids[$k]]['price_netto'] > 0))){ foreach($warenkorb['articlelist'] as $key=>$value) { if(isset($value['parentid']) && $value['parentid'] && $value['parentid'] == $k && ((isset($value['price']) && $value['price'] > 0) || (isset($value['price_netto']) && $value['price_netto'] > 0)) ) { $warenkorb['articlelist'][$key]['price'] = 0; $warenkorb['articlelist'][$key]['price_netto'] = 0; } } } } } } if(isset($warenkorb['gutscheincode'])){ $voucher = $this->app->DB->SelectRow( sprintf("SELECT v.id,v.agent_address_id, a.name AS agent_name, v.commission_rate, v.voucher_code FROM voucher v JOIN adresse a ON a.id=v.agent_address_id WHERE v.voucher_code<>'' AND v.voucher_code='%s' AND (v.project_id=0 OR v.project_id='%s') AND a.geloescht<>1 LIMIT 1", $warenkorb['gutscheincode'],$projekt)); if(!empty($voucher['id'])){ $this->app->DB->Insert(sprintf("INSERT INTO commission_rate_receipt (doctype_id,doctype,commission_rate,notice) VALUES ('%s','%s','%s','%s')",$auftrag,$doctype,$voucher['commission_rate'],'Kommission für Gutschein: '.$voucher['voucher_code'])); $this->app->DB->Update(sprintf("UPDATE $doctype SET vertrieb='%s', vertriebid='%s' WHERE id=%s", $voucher['agent_name'],$voucher['agent_address_id'],$auftrag)); } } //artikelpositionen buchen foreach($warenkorb['articlelist'] as $key=>$value) { $value['articleid'] = trim($value['articleid']); if(isset($varj_id)){ unset($varj_id); } if(!isset($warenkorb['articlelist'][$key]['ignorieren'])) { // wenn es das produkt in dem projekt gibt $artikelimporteinzelngesetzt = $this->app->DB->Select("SELECT autoabgleicherlaubt FROM artikel WHERE nummer='{$value['articleid']}' AND projekt='$projekt' LIMIT 1"); // pruefe ob auftrag auf anderes projekt gestellt werden muss if($multiprojekt=="1") { $artikelprojekt = $this->app->DB->Select("SELECT projekt FROM artikel WHERE nummer='{$value['articleid']}' LIMIT 1");// AND //TODO BENE if($artikelprojekt > 0) { $projekt = $artikelprojekt; } } else{ $artikelprojekt = $this->app->DB->Select("SELECT projekt FROM artikel WHERE nummer='{$value['articleid']}' AND projekt='$projekt' LIMIT 1");// AND //TODO BENE } $zwangsprojekt = $this->app->DB->Select("SELECT shopzwangsprojekt FROM projekt WHERE id='$artikelprojekt' LIMIT 1"); if($zwangsprojekt==1) { $this->app->DB->Update("UPDATE $doctype SET projekt='$artikelprojekt' WHERE id='$auftrag'"); } $extart = $shopexportArr['artikelnummernummerkreis']; $eigenernummernkreis = $this->app->DB->Select("SELECT eigenernummernkreis FROM projekt WHERE id='$projekt' LIMIT 1"); //$j_id = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='{$value[articleid]}' AND (shop='$shop' OR shop2='$shop' OR shop3='$shop') LIMIT 1"); $j_id = null; if(!empty($value['fremdnummer'])) { $j_id = $this->app->DB->Select("SELECT a.id FROM artikelnummer_fremdnummern af INNER JOIN artikel a on af.artikel = a.id WHERE af.nummer='{$value['fremdnummer']}' AND af.aktiv = 1 AND af.nummer <> '' AND (a.projekt='$projekt' OR af.shopid = '$shop') AND a.nummer <> 'DEL' AND IFNULL(a.geloescht,0) = 0 ORDER BY af.shopid = '$shop' DESC,IFNULL(a.intern_gesperrt,0) = 0 DESC, af.id LIMIT 1"); } if(empty($j_id)){ if($multiprojekt == '1' || !$eigenernummernkreis){ $j_id = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='{$value['articleid']}' AND IFNULL(intern_gesperrt,0) = 0 AND IFNULL(geloescht,0) = 0 LIMIT 1"); //TODO BENE }else{ $j_id = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='{$value['articleid']}' AND IFNULL(intern_gesperrt,0) = 0 AND IFNULL(geloescht,0) = 0 AND projekt='$projekt' LIMIT 1"); //TODO BENE } } if(!$j_id) { if($multiprojekt=='1' || !$eigenernummernkreis){ $j_id = $this->app->DB->Select("SELECT id FROM artikel WHERE herstellernummer='{$value['articleid']}' AND nummer <> 'DEL' AND IFNULL(geloescht,0) = 0 ORDER BY IFNULL(intern_gesperrt,0) = 0 DESC LIMIT 1"); //TODO BENE } else{ $j_id = $this->app->DB->Select("SELECT id FROM artikel WHERE herstellernummer='{$value['articleid']}' AND nummer <> 'DEL' AND projekt='$projekt' AND IFNULL(geloescht,0) = 0 ORDER BY IFNULL(intern_gesperrt,0) = 0 DESC LIMIT 1"); //TODO BENE } } if(!$j_id) { if($multiprojekt=='1' || !$eigenernummernkreis){ $j_id = $this->app->DB->Select("SELECT id FROM artikel WHERE ean='{$value['articleid']}' AND nummer <> 'DEL' AND IFNULL(geloescht,0) = 0 ORDER BY IFNULL(intern_gesperrt,0) = 0 DESC LIMIT 1"); //TODO BENE } else{ $j_id = $this->app->DB->Select("SELECT id FROM artikel WHERE ean='{$value['articleid']}' AND nummer <> 'DEL' AND projekt='$projekt' AND IFNULL(geloescht,0) = 0 ORDER BY IFNULL(intern_gesperrt,0) = 0 DESC LIMIT 1"); //TODO BENE } } $check = false; if($j_id) { $check = $this->app->DB->Select("SELECT id FROM verkaufspreise WHERE artikel='$j_id' AND (gueltig_bis='0000-00-00' OR gueltig_bis >=NOW()) AND ab_menge=1 AND ((objekt='Standard' AND adresse=0) OR (objekt='' AND adresse=0)) AND geloescht=0 LIMIT 1"); } if($eigenernummernkreis) { $j_umsatzsteuer = $this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id = '$j_id' LIMIT 1"); } else { $j_umsatzsteuer = $this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id = '$j_id' LIMIT 1"); } if($artikelimport || ($artikelimporteinzeln && $artikelimporteinzelngesetzt)) { if(isset($value['umsatzsteuer'])) { $j_umsatzsteuer = $value['umsatzsteuer']; }elseif(isset($value['steuersatz'])) { if(round((float)str_replace(',','.',$value['steuersatz']),2) == 7 || round(1+round((float)str_replace(',','.',$value['steuersatz']),2)/100,2) == round($this->GetSteuersatzErmaessigt(true,$auftrag,$doctype),2)) { $j_umsatzsteuer="ermaessigt"; } if(round((float)str_replace(',','.',$value['steuersatz']),2) == 19 || round(1+round((float)str_replace(',','.',$value['steuersatz']),2)/100,2) == round($this->GetSteuersatzNormal(true,$auftrag,$doctype),2)) { $j_umsatzsteuer="normal"; } } if(isset($value['variante_von']) && $value['variante_von'] && $value['variante_von'] != $value['articleid']) { $value['variante_von'] = trim($value['variante_von']); if($multiprojekt=='1' || !$eigenernummernkreis){ $varj_id = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='{$value['variante_von']}' AND IFNULL(geloescht,0) = 0 AND IFNULL(intern_gesperrt,0) = 0 LIMIT 1"); } else{ $varj_id = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='{$value['variante_von']}' AND IFNULL(geloescht,0) = 0 AND projekt='$projekt' AND IFNULL(intern_gesperrt,0) = 0 LIMIT 1"); } if(!$varj_id) { if($multiprojekt=='1' || !$eigenernummernkreis){ $varj_id = $this->app->DB->Select("SELECT id FROM artikel WHERE herstellernummer='{$value['variante_von']}' AND nummer <> 'DEL' AND IFNULL(geloescht,0) = 0 ORDER BY IFNULL(intern_gesperrt,0) = 0 DESC LIMIT 1"); } else{ $varj_id = $this->app->DB->Select("SELECT id FROM artikel WHERE herstellernummer='{$value['variante_von']}' AND nummer <> 'DEL' AND projekt='$projekt' AND IFNULL(geloescht,0) = 0 ORDER BY IFNULL(intern_gesperrt,0) = 0 DESC LIMIT 1"); } } if(!$varj_id) { if($multiprojekt=='1' || !$eigenernummernkreis){ $varj_id = $this->app->DB->Select("SELECT id FROM artikel WHERE ean='{$value['variante_von']}' AND nummer <> 'DEL' AND IFNULL(geloescht,0) = 0 ORDER BY IFNULL(intern_gesperrt,0) = 0 DESC LIMIT 1"); } else{ $varj_id = $this->app->DB->Select("SELECT id FROM artikel WHERE ean='{$value['variante_von']}' AND nummer <> 'DEL' AND projekt='$projekt' AND IFNULL(geloescht,0) = 0 ORDER BY IFNULL(intern_gesperrt,0) = 0 DESC LIMIT 1"); } } if(!$varj_id) { $dataart = []; if($artikelnummernummerkreis) { $variante_von = $value['variante_von']; $value['variante_von'] = $this->GetNextArtikelnummer('produkt', 1, $projekt); } $dataart['nummer'] = $value['variante_von']; $dataart['generierenummerbeioption'] = 1; //$dataart['variante'] = 1; $dataart['projekt'] = $projekt; $dataart['art'] = 'produkt'; if(isset($this->app->User)) { $dataart['firma'] = $this->app->User->GetFirma(); }else { $dataart['firma'] = 1; } if($j_umsatzsteuer==='ermaessigt'){ $dataart['umsatzsteuer'] = 'ermaessigt'; } if($j_umsatzsteuer==='befreit'){ $dataart['umsatzsteuer'] = 'befreit'; } $dataart['name_de'] = $value['variantename']; $dataart['kurztext_de'] = $value['variantekurztext_de']; if(isset($value['serviceartikel'])){ $dataart['serviceartikel'] = $value['serviceartikel']; } if(isset($value['lagerartikel'])){ $dataart['lagerartikel'] = $value['lagerartikel']; } if(isset($value['anhang'])){ $dataart['anhang'] = $value['anhang']; } //$dataart['anabregs_text'] = $value['varianteanabregs_text']; $dataart['metakeywords_de'] = $value['variantemetakeywords_de']; $dataart['metadescription_de'] = $value['variantemetadescription_de']; $varj_id = $this->AddArtikel($dataart); $this->app->erp->ObjektProtokoll('artikel', $varj_id, 'artikel_create','Shopimport: Atikelvariante erstellt'); $this->AddVerkaufspreis($varj_id, 1, 0, $value['varianteprice']); $value['articleid'] = $this->GetNextArtikelnummer("produkt", 1, $projekt); } else { $warenkorb['articlelist'][$key]['lagerartikel'] = $this->app->DB->Select("SELECT lagerartikel FROM artikel WHERE id = '$varj_id' LIMIT 1"); $generierenummerbeioption = $this->app->DB->Select("SELECT generierenummerbeioption from artikel where id = '$varj_id' LIMIT 1"); //$generierenummerbeioption = 1; if($generierenummerbeioption) { $value['generierenummerbeioption'] = true; $value['articleid'] = $this->GetNextArtikelnummer('produkt', 1, $projekt); } } } if(empty($value['name']) && !empty($value['name_de'])){ $value['name'] = $value['name_de']; } if($warenkorb['steuerfrei']==1) { if($j_umsatzsteuer==='ermaessigt') { $ap = $this->AddPositionManuellPreisNummer($doctype,$auftrag, $projekt, $value['articleid'],$value['quantity'],$value['name'], isset($value['price_netto'])?$value['price_netto']:$value['price'],'ermaessigt',$value['rabatt'],$shop,$waehrung, $warenkorb['articlelist'][$key],$warenkorb['articlelist']); }elseif($j_umsatzsteuer==="befreit"){ $ap = $this->AddPositionManuellPreisNummer($doctype,$auftrag, $projekt, $value['articleid'],$value['quantity'],$value['name'], isset($value['price_netto'])?$value['price_netto']:$value['price'],'befreit',$value['rabatt'],$shop,$waehrung, $warenkorb['articlelist'][$key],$warenkorb['articlelist']); } else { $ap = $this->AddPositionManuellPreisNummer($doctype,$auftrag, $projekt, $value['articleid'],$value['quantity'],$value['name'], isset($value['price_netto'])?$value['price_netto']:$value['price'],'normal',$value['rabatt'],$shop,$waehrung, $warenkorb['articlelist'][$key],$warenkorb['articlelist']); } } else { if($j_umsatzsteuer==='ermaessigt') { $ap = $this->AddPositionManuellPreisNummer($doctype,$auftrag, $projekt, $value['articleid'],$value['quantity'],$value['name'], isset($value['price_netto'])?$value['price_netto']:($value['price']/$this->GetSteuersatzErmaessigt(true,$auftrag,$doctype)),"ermaessigt",$value['rabatt'],$shop,$waehrung, $warenkorb['articlelist'][$key],$warenkorb['articlelist']); if($positionsteuersaetzeerlauben && !empty($warenkorb['steuersatz_ermaessigt']) && !isset($value['steuersatz'])) { $this->app->DB->Update("UPDATE $doctype"."_position SET steuersatz = ".$warenkorb['steuersatz_ermaessigt']." WHERE id = '$ap' LIMIT 1"); } }elseif($j_umsatzsteuer==='befreit') { $ap = $this->AddPositionManuellPreisNummer($doctype,$auftrag, $projekt, $value['articleid'],$value['quantity'],$value['name'], isset($value['price_netto'])?$value['price_netto']:($value['price']),'befreit',$value['rabatt'],$shop,$waehrung, $warenkorb['articlelist'][$key],$warenkorb['articlelist']); } else { $ap = $this->AddPositionManuellPreisNummer($doctype,$auftrag, $projekt, $value['articleid'],$value['quantity'],$value['name'], isset($value['price_netto'])?$value['price_netto']:($value['price']/$this->GetSteuersatzNormal(true,$auftrag,$doctype)),"normal",$value['rabatt'],$shop,$waehrung, $warenkorb['articlelist'][$key],$warenkorb['articlelist']); if($positionsteuersaetzeerlauben && !empty($warenkorb['steuersatz_normal']) && !isset($value['steuersatz'])) { $this->app->DB->Update("UPDATE $doctype"."_position SET steuersatz = ".$warenkorb['steuersatz_normal']." WHERE id = '$ap' LIMIT 1"); } } } if(!empty($ap)){ $warenkorb['articlelist'][$key]['databaseId'] = $ap; } if(!empty($ap) && isset($value['rabatt'])){ $rabattpositionen[$ap] = $value['rabatt']; } if(empty($ap)){ $this->LogFile('Fehler '.$value['articleid']); } if(isset($artap)){ unset($artap); } if(!empty($ap)) { if(isset($value['webid'])){ $this->app->DB->Update("UPDATE $doctype"."_position SET webid = '".$this->app->DB->real_escape_string($value['webid'])."' WHERE id = '$ap' LIMIT 1"); } $artap = $this->app->DB->Select("SELECT artikel FROM $doctype"."_position WHERE id = '$ap' LIMIT 1"); $this->CopyArtikelVariante($artap, ($varj_id?$varj_id:$artap),isset($value['options']) && !empty($value['options'])?$value['options']:(isset($value['anabregs_text'])?$value['anabregs_text']:'')); if($positionsteuersaetzeerlauben && isset($value['steuersatz']) && is_numeric($value['steuersatz'])){ $this->app->DB->Update("UPDATE $doctype"."_position SET steuersatz = ".$value['steuersatz']." WHERE id = '$ap' LIMIT 1"); } if(isset($value['anhang'])){ if(!is_array($value['anhang'])){ $data = $value['anhang']; $value['anhang'] = []; $value['anhang'][] = ['datei' => $data, 'endung' => '', 'name' =>'', 'typ' => '', 'titel' => '']; } foreach ($value['anhang'] as $anhang){ $dateiname = trim($anhang['name']); if(empty($dateiname)){ $dateiname = $this->app->DB->Select("SELECT sort FROM $doctype"."_position WHERE id=$ap"); } $typ = trim($anhang['typ']); if(empty($typ)){ $typ = 'Bild'; } $titel = trim($anhang['titel']); if(empty($titel)){ $titel = 'Anhang'; } $fileid = $this->addBase64Bild($anhang['datei'],$dateiname,$anhang['endung'],$titel); if(!empty($fileid)){ $this->AddDateiStichwort($fileid, $typ, $doctype, $auftrag, false, $ap, 'position'); } } } } if(!empty($value['variante_von']) && !empty($varj_id)) { if($artap) { $lieferant = $this->app->DB->Select("SELECT adresse FROM artikel WHERE id = '$varj_id' LIMIT 1"); if($lieferant) { $this->app->DB->Update("UPDATE artikel set adresse = '$lieferant' WHERE id = '$artap' LIMIT 1"); $this->AddEinkaufspreis($artap,1,$lieferant, $value['articleid'], $value['name'],0); } $lagerpl = $this->app->DB->Select("SELECT lager_platz FROM artikel WHERE id = '$varj_id' LIMIT 1"); $produktion = $this->app->DB->Select("SELECT produktion FROM artikel WHERE id = '$varj_id' LIMIT 1"); if($produktion){ $this->app->DB->Update("UPDATE artikel set produktion = '1' WHERE id = '$artap' LIMIT 1"); } $stueckliste = $this->app->DB->Select("SELECT stueckliste FROM artikel WHERE id = '$varj_id' LIMIT 1"); if($stueckliste){ $this->app->DB->Update("UPDATE artikel set stueckliste = '1' WHERE id = '$artap' LIMIT 1"); } if($lagerpl){ $this->app->DB->Update("UPDATE artikel set lager_platz = '$lagerpl' WHERE id = '$artap' LIMIT 1"); } $this->app->DB->Update("UPDATE artikel set variante = 1, variante_von = '$varj_id' WHERE id = '$artap' LIMIT 1"); } } $ueberspringe = true; foreach($warenkorb['articlelist'] as $key2=>$value2) { if($ueberspringe) { if($key == $key2)$ueberspringe = false; }else{ if(isset($value['posid'])) { if(isset($value2['parentid']) && $value2['parentid'] == $value['posid']) { $warenkorb['articlelist'][$key2]['parentap'] = $ap; $explodieren = false; } } } } } else if ($check > 0) { // standardpreis aus wawision verwenden $anummer = $this->app->DB->Select("SELECT nummer FROM artikel WHERE id = '$j_id' LIMIT 1"); if(!empty($anummer)){ $value['articleid'] = $anummer; } $ap = $this->AddAuftragPositionNummer($auftrag,$value['articleid'],$value['quantity'],$projekt,"",true, $doctype, $warenkorb['articlelist'][$key]); if(isset($value['webid'])){ $this->app->DB->Update("UPDATE $doctype"."_position SET webid = '".$this->app->DB->real_escape_string($value['webid'])."' WHERE id = '$ap' LIMIT 1"); } $ueberspringe = true; foreach($warenkorb['articlelist'] as $key2=>$value2) { if($ueberspringe) { if($key == $key2){ $ueberspringe = false; } }else{ if(isset($value['posid'])) { if(isset($value2['parentid']) && $value2['parentid'] == $value['posid']) { $warenkorb['articlelist'][$key2]['parentap'] = $ap; } } } } } else { // fehler if($doctype !== 'angebot') { $this->AuftragProtokoll($auftrag,"Artikel nach Import nicht in interner Datenbank gefunden (Artikel: $j_nummer $j_name Menge: $j_menge Preis: $j_preis) bzw. kein Verkaufspreis vorhanden. Bitte prüfen Sie den Haken Automatischer Abgleich in der Shopschnittstelle"); }else{ $this->AngebotProtokoll($auftrag,"Artikel nach Import nicht in interner Datenbank gefunden (Artikel: $j_nummer $j_name Menge: $j_menge Preis: $j_preis) bzw. kein Verkaufspreis vorhanden. Bitte prüfen Sie den Haken Automatischer Abgleich in der Shopschnittstelle"); } } if(!empty($ap) && !empty($value['artikeldaten'])){ $artap = $this->app->DB->Select("SELECT artikel FROM $doctype"."_position WHERE id = '$ap' LIMIT 1"); unset($value['artikeldaten']['id'],$value['artikeldaten']['nummer']); foreach($value['artikeldaten'] as $feldname => $wert){ $query = sprintf("UPDATE artikel SET %s='%s' WHERE id=%d", $this->app->DB->real_escape_string($feldname), $this->app->DB->real_escape_string($wert), $artap); $this->app->DB->Update($query); } } } } foreach ($warenkorb['articlelist'] as $item){ $commands = []; if(empty($item['databaseId'])){ continue; } if(isset($item['parentInCart']) && !empty($warenkorb['articlelist'][$item['parentInCart']]['databaseId'])){ $query = sprintf('UPDATE `%s_position` SET `explodiert` = 1 WHERE `id` = %d', $doctype, $warenkorb['articlelist'][$item['parentInCart']]['databaseId']); $this->app->DB->Update($query); $commands[] = sprintf('`explodiert_parent` = %d', $warenkorb['articlelist'][$item['parentInCart']]['databaseId']); } if(!empty($item['hidePrice'])){ $commands[] = '`ohnepreis` = 1'; } if(!empty($commands)){ $query = sprintf('UPDATE `%s_position` SET %s WHERE `id` = %d', $doctype, implode(', ', $commands), $item['databaseId']); $this->app->DB->Update($query); } } if(!empty($warenkorb['versandkostenbrutto']) && empty($warenkorb['versandkostennetto']) && !empty($warenkorb['autoversandsteuer']) && empty($warenkorb['portosteuersatz'])) { if($doctype !== 'angebot'){ $positions = $this->app->DB->SelectArr( sprintf( "SELECT IFNULL(steuersatz,-1) as steuersatz, umsatzsteuer FROM auftrag_position WHERE preis > 0 AND auftrag = %d GROUP BY steuersatz, umsatzsteuer", $auftrag ) ); } else { $positions = $this->app->DB->SelectArr( sprintf( "SELECT IFNULL(steuersatz,-1) as steuersatz, umsatzsteuer FROM angebot_position WHERE preis > 0 AND angebot = %d GROUP BY steuersatz, umsatzsteuer", $auftrag ) ); } if(!empty($positions) && (!empty($positions)?count($positions):0) === 1 && $positions[0]['steuersatz'] < 0 && $positions[0]['umsatzsteuer'] === 'ermaessigt' ) { $warenkorb['portosteuersatz'] = 'ermaessigt'; } } if($shoptyp!=='wawision') { if($warenkorb['zahlungsweise']==='nachnahme') { $artikelnachnahme = $shopexportArr['artikelnachnahme']; $artikelnachnahme_extraartikel = $shopexportArr['artikelnachnahme_extraartikel']; $nachnahme = $this->app->DB->Select("SELECT name_de FROM artikel WHERE id='$artikelnachnahme' LIMIT 1"); $umsatzsteuer_nachnahme = $this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id='$artikelnachnahme' LIMIT 1"); $nachnahmepreis = $this->GetVerkaufspreis($artikelnachnahme,1); if($umsatzsteuer_nachnahme!=='ermaessigt' && $umsatzsteuer_nachnahme!=='befreit') { $umsatzsteuer_nachnahme='normal'; } if(isset($warenkorb['nachnahmepreisnetto'])) { $nachnahmepreis = str_replace(',','.',$warenkorb['nachnahmepreisnetto']); }elseif($warenkorb['nachnahmepreis']) { if($umsatzsteuer_nachnahme==='ermaessigt') { $nachnahmepreis = str_replace(',','.',$warenkorb['nachnahmepreis'])/$this->GetSteuersatzErmaessigt(true,$auftrag,$doctype); }elseif($umsatzsteuer_nachnahme==='befreit') { $nachnahmepreis = str_replace(',','.',$warenkorb['nachnahmepreis']); }else{ $nachnahmepreis = str_replace(',','.',$warenkorb['nachnahmepreis'])/$this->GetSteuersatzNormal(true,$auftrag,$doctype); } } //$warenkorb['zahlungsgebuehr'] //TODO if($artikelnachnahme_extraartikel==1) { $tmpposid = $this->AddPositionManuellPreis($doctype,$auftrag, $artikelnachnahme,1,$nachnahme,$nachnahmepreis,$umsatzsteuer_nachnahme,0,$waehrung); if($tmpposid>0) { $this->app->DB->Update("UPDATE $doctype"."_position SET keinrabatterlaubt=1 WHERE id='$tmpposid' LIMIT 1"); if(isset($warenkorb['nachnahmepreisnetto']) || isset($warenkorb['nachnahmepreis'])){ $nachnahmepreis = 0; } } } } else { $nachnahmepreis=0; } //porto und nachnahme $artikelporto = $shopexportArr['artikelporto']; $artikelportoermaessigt = $shopexportArr['artikelportoermaessigt']; if( $artikelportoermaessigt && isset($warenkorb['portosteuersatz']) && $warenkorb['portosteuersatz'] === 'ermaessigt') { $artikelporto = $artikelportoermaessigt; } if(empty($artikelporto) && $this->app->DB->Select("SELECT portoartikelanlegen FROM shopexport WHERE id = '$shop' LIMIT 1")) { if($warenkorb['versandkostennetto'] != 0 || $warenkorb['versandkostenbrutto'] != 0 || $portocheck == 1){ $portoartikelarr = array('projekt'=>$projekt,'porto'=>1, 'lagerartikel'=>0,'name_de'=>'Porto','umsatzsteuer'=>'normal'); $artikelporto = $this->app->erp->InsertUpdateArtikel($portoartikelarr); if($artikelporto){ $this->app->DB->Update("UPDATE shopexport SET artikelporto = '$artikelporto' WHERE id = '$shop' AND artikelporto = 0 LIMIT 1"); } } } $umsatzsteuer_porto = $this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id='$artikelporto' LIMIT 1"); $versandname = ''; if(isset($warenkorb['kunde_sprache']) && $warenkorb['kunde_sprache']){ if($warenkorb['kunde_sprache'] === 'englisch') { $versandname = $this->app->DB->Select("SELECT name_en FROM artikel WHERE id = '$artikelporto'"); } } else{ if($this->app->DB->Select("SELECT adr.id FROM $doctype auf INNER JOIN adresse adr ON auf.adresse = adr.id AND adr.sprache = 'englisch' WHERE auf.id = '$auftrag' LIMIT 1")) { $versandname = $this->app->DB->Select("SELECT name_en FROM artikel WHERE id = '$artikelporto'"); } } if($versandname === ''){ $versandname = $this->app->DB->Select("SELECT name_de FROM artikel WHERE id = '$artikelporto'"); } $sprachen = $this->GetAdressSprachen(); $belegsprache = $this->app->DB->Select("SELECT sprache FROM $doctype WHERE id = '$auftrag'"); if(array_key_exists($belegsprache, $sprachen)){ $belegsprache = $sprachen[$belegsprache]; } $uebersetztername = $this->app->DB->Select("SELECT name FROM artikel_texte WHERE artikel='$artikelporto' AND sprache='$belegsprache' AND aktiv='1' AND (shop=0 OR shop='$shop') ORDER BY shop DESC LIMIT 1"); if($uebersetztername != ''){ $versandname = $uebersetztername; } $rabattartikel = $shopexportArr['artikelrabatt']; $rabattname = ''; if(isset($warenkorb['kunde_sprache']) && $warenkorb['kunde_sprache']){ if($warenkorb['kunde_sprache'] === 'englisch') { $rabattname = (String)$this->app->DB->Select("SELECT name_en FROM artikel WHERE id = '$rabattartikel'"); } } else{ if($this->app->DB->Select("SELECT adr.id FROM $doctype auf INNER JOIN adresse adr ON auf.adresse = adr.id AND adr.sprache = 'englisch' WHERE auf.id = '$auftrag' LIMIT 1")) { $rabattname = (String)$this->app->DB->Select("SELECT name_en FROM artikel WHERE id = '$rabattartikel'"); } } if($rabattname === ''){ $rabattname = $this->app->DB->Select("SELECT name_de FROM artikel WHERE id = '$rabattartikel'"); } $uebersetztername = $this->app->DB->Select("SELECT name FROM artikel_texte WHERE artikel='$rabattartikel' AND sprache='$belegsprache' AND aktiv='1' AND (shop=0 OR shop='$shop') ORDER BY shop DESC LIMIT 1"); if($uebersetztername != ''){ $rabattname = $uebersetztername; } $umsatzsteuer_rabatt = $this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id='$rabattartikel' LIMIT 1"); $rabattsteuer = $this->app->DB->Select("SELECT artikelrabattsteuer FROM shopexport WHERE id = '$shop' LIMIT 1"); if($this->app->DB->error()){ $rabattsteuer = -1; } if(isset($warenkorb['rabattsteuer']) && is_numeric($warenkorb['rabattsteuer'])){ $rabattsteuer = $warenkorb['rabattsteuer']; } //$this->DumpVar("Fall Porto Preis ".$warenkorb[versandkostennetto]); if(!empty($warenkorb['rabattname'])){ $rabattname = $warenkorb['rabattname']; } if(isset($warenkorb['rabattnetto'])) { $tmpposid = $this->AddPositionManuellPreis($doctype,$auftrag, $rabattartikel,1,$rabattname,$warenkorb['rabattnetto'],$umsatzsteuer_rabatt,0,$waehrung); }elseif(isset($warenkorb['rabattbrutto'])) { $rabattbrutto = $warenkorb['rabattbrutto']; if(isset($warenkorb['rabattsteuer']) && is_numeric($warenkorb['rabattsteuer'])){ $rabattsteuer = $warenkorb['rabattsteuer']; } if($warenkorb['steuerfrei'] == '1') { $rabattsteuer = 0; } if($umsatzsteuer_rabatt==='ermaessigt') { $rabattsteuerAdd = $rabattsteuer < 0?$this->GetSteuersatzErmaessigt(true,$auftrag,$doctype):(1+$rabattsteuer/100); $tmpposid = $this->AddPositionManuellPreis($doctype,$auftrag, $rabattartikel,1,$rabattname,$warenkorb['rabattbrutto']/$rabattsteuerAdd,$umsatzsteuer_rabatt,0,$waehrung); }elseif($umsatzsteuer_rabatt==='befreit') { $rabattsteuerAdd = $rabattsteuer < 0?1:(1+$rabattsteuer/100); $tmpposid = $this->AddPositionManuellPreis($doctype,$auftrag, $rabattartikel,1,$rabattname,$warenkorb['rabattbrutto']/$rabattsteuerAdd,$umsatzsteuer_rabatt,0,$waehrung); }else{ $rabattsteuerAdd = $rabattsteuer < 0?$this->GetSteuersatzNormal(true,$auftrag,$doctype):(1+$rabattsteuer/100); $tmpposid = $this->AddPositionManuellPreis($doctype,$auftrag, $rabattartikel,1,$rabattname,$warenkorb['rabattbrutto']/$rabattsteuerAdd,$umsatzsteuer_rabatt,0,$waehrung); } } if($rabattsteuer >= 0){ $this->app->DB->Update("UPDATE $doctype"."_position SET steuersatz = '$rabattsteuer' WHERE id = '$tmpposid' LIMIT 1"); } if(isset($warenkorb['rabattsteuer']) && is_numeric($warenkorb['rabattsteuer'])){ $this->app->DB->Update("UPDATE $doctype"."_position SET steuersatz = '".$warenkorb['rabattsteuer']."' WHERE id = '$tmpposid' LIMIT 1"); if($warenkorb['rabattsteuer'] > 0){ $ermaessigt = !empty($warenkorb['steuersatz_ermaessigt']) ? $warenkorb['steuersatz_ermaessigt'] : $this->app->DB->Select("SELECT steuersatz_ermaessigt FROM $doctype WHERE id = $auftrag"); $normal = !empty($warenkorb['steuersatz_normal']) ? $warenkorb['steuersatz_normal'] : $this->app->DB->Select("SELECT steuersatz_normal FROM $doctype WHERE id = $auftrag"); if($warenkorb['rabattsteuer'] == $ermaessigt){ $this->app->DB->Update("UPDATE $doctype" . "_position SET umsatzsteuer = 'ermaessigt' WHERE id = '$tmpposid' LIMIT 1"); }elseif($warenkorb['rabattsteuer'] == $normal){ $this->app->DB->Update("UPDATE $doctype" . "_position SET umsatzsteuer = 'normal' WHERE id = '$tmpposid' LIMIT 1"); } }elseif($warenkorb['rabattsteuer'] == 0) { $this->app->DB->Update("UPDATE $doctype" . "_position SET umsatzsteuer = 'befreit' WHERE id = '$tmpposid' LIMIT 1"); } } if($umsatzsteuer_porto!=='ermaessigt') { $umsatzsteuer_porto='normal'; } $umsatzsteuer_porto2 = $umsatzsteuer_porto; if(!empty($warenkorb['portosteuersatz']) && $artikelnachnahme_extraartikel!='1' && $warenkorb['portosteuersatz'] === 'ermaessigt') { $umsatzsteuer_porto2 = 'ermaessigt'; }elseif(!empty($warenkorb['portosteuersatz']) && $artikelnachnahme_extraartikel!='1' && $warenkorb['portosteuersatz'] === 'normal') { $umsatzsteuer_porto2 = 'normal'; } //if($this->Steuerbefreit($warenkorb['land'],$warenkorb['ustid'])) if($warenkorb['versandkostennetto'] != 0 || $warenkorb['versandkostenbrutto'] != 0 || $portocheck == 1) { if($warenkorb['steuerfrei']=='1') { if($artikelnachnahme_extraartikel=='1'){ $tmpposid = $this->AddPositionManuellPreis($doctype, $auftrag, $artikelporto, 1, $versandname, (isset($warenkorb['versandkostennetto']) ? $warenkorb['versandkostennetto'] : $warenkorb['versandkostenbrutto']) - $nachnahmepreis, $umsatzsteuer_porto, 0, $waehrung); } else{ $tmpposid = $this->AddPositionManuellPreis($doctype, $auftrag, $artikelporto, 1, $versandname, isset($warenkorb['versandkostennetto']) ? $warenkorb['versandkostennetto'] : $warenkorb['versandkostenbrutto'], $umsatzsteuer_porto, 0, $waehrung); } } else { if($positionsteuersaetzeerlauben && isset($warenkorb['versandkostensteuersatz']) && is_numeric($warenkorb['versandkostensteuersatz'])) { if($artikelnachnahme_extraartikel=='1') { $tmpposid = $this->AddPositionManuellPreis($doctype,$auftrag, $artikelporto,1,$versandname, (isset($warenkorb['versandkostennetto'])?$warenkorb['versandkostennetto']:($warenkorb['versandkostenbrutto']/(1+$warenkorb['versandkostensteuersatz']/100)))- $nachnahmepreis,$umsatzsteuer_porto,0,$waehrung); } else { $tmpposid = $this->AddPositionManuellPreis($doctype,$auftrag, $artikelporto,1,$versandname, (isset($warenkorb['versandkostennetto'])?$warenkorb['versandkostennetto']:($warenkorb['versandkostenbrutto']/(1+$warenkorb['versandkostensteuersatz']/100))),$umsatzsteuer_porto,0,$waehrung); } if($tmpposid) { $this->app->DB->Update("UPDATE $doctype"."_position SET steuersatz = ".$warenkorb['versandkostensteuersatz']." WHERE id = ".$tmpposid); } }elseif($umsatzsteuer_porto2==='ermaessigt') { if($artikelnachnahme_extraartikel=='1') { $tmpposid = $this->AddPositionManuellPreis($doctype,$auftrag, $artikelporto,1,$versandname, (isset($warenkorb['versandkostennetto'])?$warenkorb['versandkostennetto']:($warenkorb['versandkostenbrutto']/$this->GetSteuersatzErmaessigt(true,$auftrag,$doctype)))- $nachnahmepreis,$umsatzsteuer_porto,0,$waehrung); } else { $tmpposid = $this->AddPositionManuellPreis($doctype,$auftrag, $artikelporto,1,$versandname, (isset($warenkorb['versandkostennetto'])?$warenkorb['versandkostennetto']:($warenkorb['versandkostenbrutto']/$this->GetSteuersatzErmaessigt(true,$auftrag,$doctype))),$umsatzsteuer_porto,0,$waehrung); if($umsatzsteuer_porto2 !== $umsatzsteuer_porto) { $this->app->DB->Update("UPDATE $doctype"."_position SET umsatzsteuer = 'ermaessigt' WHERE id = ".$tmpposid); } } }elseif($umsatzsteuer_porto==='befreit'){ if($artikelnachnahme_extraartikel=='1') { $tmpposid = $this->AddPositionManuellPreis($doctype,$auftrag, $artikelporto,1,$versandname, (isset($warenkorb['versandkostennetto'])?$warenkorb['versandkostennetto']:($warenkorb['versandkostenbrutto']))- $nachnahmepreis,$umsatzsteuer_porto,0,$waehrung); } else { $tmpposid = $this->AddPositionManuellPreis($doctype,$auftrag, $artikelporto,1,$versandname, (isset($warenkorb['versandkostennetto'])?$warenkorb['versandkostennetto']:($warenkorb['versandkostenbrutto'])),$umsatzsteuer_porto,0,$waehrung); } } else { //normal if($artikelnachnahme_extraartikel=='1') { $tmpposid = $this->AddPositionManuellPreis($doctype,$auftrag, $artikelporto,1,$versandname, (isset($warenkorb['versandkostennetto'])?$warenkorb['versandkostennetto']:($warenkorb['versandkostenbrutto']/$this->GetSteuersatzNormal(true,$auftrag,$doctype)))- $nachnahmepreis,$umsatzsteuer_porto,0,$waehrung); } else { $tmpposid = $this->AddPositionManuellPreis($doctype,$auftrag, $artikelporto,1,$versandname, (isset($warenkorb['versandkostennetto'])?$warenkorb['versandkostennetto']:($warenkorb['versandkostenbrutto']/$this->GetSteuersatzNormal(true,$auftrag,$doctype))),$umsatzsteuer_porto,0,$waehrung); if($umsatzsteuer_porto2 !== $umsatzsteuer_porto) { $this->app->DB->Update("UPDATE $doctype"."_position SET umsatzsteuer = 'normal' WHERE id = ".$tmpposid); } } } } } // wenn versandkostennbrutto = 0 und versandkostennetto > 0 TODO neu ausrechnen if($tmpposid>0) { $this->app->DB->Update("UPDATE $doctype"."_position SET keinrabatterlaubt=1 WHERE id='$tmpposid' LIMIT 1"); if(isset($warenkorb['versandkostenbeschreibung'])){ $this->app->DB->Update("UPDATE $doctype" . "_position SET beschreibung='" . $this->app->DB->real_escape_string($warenkorb['versandkostenbeschreibung']) . "' WHERE id='$tmpposid' LIMIT 1"); } } } if($waehrung && $waehrung !== 'EUR'){ $this->app->DB->Update("UPDATE $doctype"."_position SET waehrung='$waehrung' WHERE $doctype='$auftrag' "); } $shoptyp=''; if(isset($warenkorb['wawisionpreise']) && $warenkorb['wawisionpreise']) { $wpositionen = $this->app->DB->SelectArr("SELECT * FROM $doctype"."_position WHERE auftrag = '$auftrag'"); if(!empty($wpositionen)) { $adresse = $this->app->DB->Select("SELECT adresse FROM $doctype WHERE id = '$auftrag' LIMIT 1"); foreach($wpositionen as $wpos) { $pr = $this->GetVerkaufspreis($wpos['artikel'], $wpos['menge'], $adresse); if($pr){ $this->app->DB->Update("UPDATE $doctype"."_position SET preis = '$pr' WHERE id = '".$wpos['id']."' LIMIT 1"); } } } } if(!empty($artikelimport)){ $this->app->DB->Update("UPDATE $doctype"."_position set rabatt = 0, keinrabatterlaubt = 1, grundrabatt = 0, rabattsync = 1 WHERE $doctype = '$auftrag'"); } if(!empty($rabattpositionen)){ foreach ($rabattpositionen as $key => $value) { $this->app->DB->Update("UPDATE $doctype" . "_position SET rabatt='$value' WHERE id='$key'"); } } // wenn reservierung aktiviert ist if($doctype !== 'angebot') { $reservierung = $this->app->DB->Select( sprintf( "SELECT pr.reservierung FROM `projekt` AS `pr` INNER JOIN `auftrag` AS `o` ON o.projekt = pr.id WHERE o.id = %d LIMIT 1", $auftrag ) ); if((int)$reservierung >= 1) { $this->AuftragReservieren($auftrag); } $this->AuftragNeuberechnen($auftrag); $this->AuftragEinzelnBerechnen($auftrag); $this->app->DB->Update(" UPDATE auftrag a INNER JOIN adresse adr ON a.lieferant = adr.id SET a.lieferantkdrnummer = if(a.lieferantennummer <> '',a.lieferantennummer,adr.lieferantennummer) WHERE a.lieferantkdrnummer = '' AND a.lieferantenauftrag = 1 AND a.id = '$auftrag' "); $this->app->DB->Update(" UPDATE auftrag a INNER JOIN adresse adr ON a.adresse = adr.id SET a.lieferantkdrnummer = if(a.kundennummer <> '',a.kundennummer, adr.kundennummer) WHERE a.lieferantkdrnummer = '' AND a.lieferantenauftrag = 0 AND a.id = '$auftrag' "); if(!empty($warenkorb['auftragsstatus'])){ if($warenkorb['auftragsstatus'] === 'abgeschlossen'){ $this->app->DB->Update("UPDATE auftrag SET status = 'abgeschlossen', schreibschutz = 1 WHERE id = '$auftrag' LIMIT 1"); } if($warenkorb['auftragsstatus'] === 'unbezahlt'){ $this->app->DB->Insert("INSERT INTO shopimport_checkorder (shop_id, order_id, ext_order) VALUES ('$shop','$auftrag','".$warenkorb['auftrag']."')"); $this->app->erp->AuftragProtokoll($auftrag, 'Kaufabwicklung noch nicht abgeschlossen'); } } $this->app->DB->Update( "UPDATE artikel art INNER JOIN auftrag_position ap ON art.id = ap.artikel AND ap.auftrag = '$auftrag' SET art.cache_lagerplatzinhaltmenge = -999" ); $this->app->DB->Update( sprintf( 'UPDATE artikel_onlineshops AS ao INNER JOIN auftrag_position AS ap ON ao.artikel = ap.artikel SET ao.storage_cache = -999, ao.pseudostorage_cache = -999 WHERE ao.shop = %d AND ap.auftrag = %d', $shop,$auftrag ) ); $differenz = $this->app->DB->Select( sprintf( 'SELECT gesamtbetragfestsetzendifferenz FROM shopexport WHERE id = %d LIMIT 1', (int)$shop ) ); if($this->app->DB->Select("SELECT gesamtbetragfestsetzen FROM shopexport WHERE id = '$shop' LIMIT 1")) { $gesamtsumme = $this->app->DB->Select("SELECT gesamtsumme FROM auftrag WHERE id = '$auftrag' LIMIT 1"); if(abs($gesamtsumme - $warenkorb['gesamtsumme']) <= $differenz) { $this->app->DB->Update("UPDATE auftrag SET extsoll = '".$warenkorb['gesamtsumme']."', gesamtsumme = '".$warenkorb['gesamtsumme']."' WHERE id = '$auftrag' LIMIT 1"); } } if(!empty($warenkorb['bestelldatum']) && strtotime($warenkorb['bestelldatum']) > 1) { $this->app->DB->Update("UPDATE auftrag SET datum = '".$this->app->DB->real_escape_string($warenkorb['bestelldatum'])."' WHERE belegnr <> '' AND id = ".$auftrag); } if(!$autoversandvonMapping && $this->app->DB->Select( sprintf( 'SELECT pr.deactivateautoshipping FROM auftrag a INNER JOIN projekt AS pr ON a.projekt = pr.id WHERE a.id = %d AND a.autoversand = 1', $auftrag ) ) ) { $this->app->DB->Update( sprintf( 'UPDATE auftrag SET autoversand = 0 WHERE id = %d', $auftrag ) ); } if(!empty($warenkorb['gesamtsumme'])) { $gesamtsumme = $this->app->DB->Select( sprintf( 'SELECT gesamtsumme FROM auftrag WHERE id = %d LIMIT 1', $auftrag ) ); if($gesamtsumme != 0 && abs( round((float)$warenkorb['gesamtsumme'] - (float)$gesamtsumme, 2) ) > round((float)$differenz, 2) ) { $this->app->DB->Update( sprintf( 'UPDATE auftrag SET autoversand = 0 WHERE id = %d LIMIT 1', (int)$auftrag ) ); $this->AuftragProtokoll($auftrag, 'Online-Shop Differenz erkannt'); } } }else{ $this->AngebotNeuberechnen($auftrag); $this->BelegFreigabe('angebot', $auftrag); if(!empty($warenkorb['bestelldatum']) && strtotime($warenkorb['bestelldatum']) > 1) { $this->app->DB->Update("UPDATE angebot SET datum = '".$this->app->DB->real_escape_string($warenkorb['bestelldatum'])."' WHERE id = ".$auftrag); } } return $auftrag; } function KundennummerVergeben($adresse,$projekt="") { $id = $adresse; $kundennummer = $this->app->DB->Select("SELECT kundennummer FROM adresse WHERE id='$id' AND geloescht=0 LIMIT 1"); $tmp_data_adresse = $this->app->DB->SelectRow("SELECT * FROM adresse WHERE id='$id' AND geloescht=0 LIMIT 1"); if($projekt=="") $projekt = $this->app->DB->Select("SELECT projekt FROM adresse WHERE id='$id' AND geloescht=0 LIMIT 1"); if($kundennummer==0 || $kundennummer==""){ // pruefe ob rolle kunden vorhanden $check = $this->app->DB->Select("SELECT adresse FROM adresse_rolle WHERE adresse='$id' AND subjekt='Kunde' LIMIT 1"); if($check!="") { $kundennummer = $this->GetNextKundennummer($projekt,$tmp_data_adresse); $this->ObjektProtokoll("adresse",$id,"adresse_next_kundennummer","Kundennummer erhalten: $kundennummer"); $this->app->DB->Update("UPDATE adresse SET kundennummer='$kundennummer' WHERE id='$id' AND (kundennummer='0' OR kundennummer='') LIMIT 1"); return $kundennummer; } } } function CheckDateValidate($input="0000-00-00") { $inputa = explode('-', $input); if((!empty($inputa)?count($inputa):0) == 3 && strlen($inputa[1]) == 2 && strlen($inputa[2]) == 2 && strlen($inputa[0]) == 4 && checkdate($inputa[1],$inputa[2],$inputa[0])) { return true; } $date_format = 'Y-m-d'; $input = trim($input); $time = strtotime($input); $is_valid = date($date_format, $time) == $input; return $is_valid; } function AdresseUSTCheck($adresse) { //wenn land DE $land = $this->app->DB->Select("SELECT land FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); if($land ==$this->Firmendaten("land") || $land=="") return 0; foreach($this->GetUSTEU() as $euland) { if($land==$euland) return 1; } // alle anderen laender sind export! return 2; } function AutoUSTPruefung($adresse) { // schaue obs heute bereits eine pruefung gegeben hat die erfolgreich war $ustcheck = $this->app->DB->Select("SELECT id FROM ustprf WHERE DATE_FORMAT(datum_online,'%Y-%m-%d')=DATE_FORMAT(NOW(),'%Y-%m-%d') AND status='erfolgreich' AND adresse='$adresse' LIMIT 1"); if($ustcheck>0 && is_numeric($ustcheck)) return 1; $name = $this->app->DB->Select("SELECT name FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); $ustid = $this->app->DB->Select("SELECT ustid FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); $land = $this->app->DB->Select("SELECT land FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); $ort = $this->app->DB->Select("SELECT ort FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); $plz = $this->app->DB->Select("SELECT plz FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); $strasse = $this->app->DB->Select("SELECT strasse FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); if($land==$this->Firmendaten("land") || $ustid=="") return 0; $ustcheck = $this->app->DB->Select("SELECT id FROM ustprf WHERE status='' AND adresse='$adresse' LIMIT 1"); if(!($ustcheck>0 && is_numeric($ustcheck))) { $this->app->DB->Insert("INSERT INTO ustprf (id,adresse,name,ustid,land,ort,plz,rechtsform,strasse,datum_online,bearbeiter) VALUES('','$adresse','$name','$ustid','$land','$ort','$plz','$rechtsform','$strasse',NOW(),'".$this->app->User->GetName()."')"); $ustprf_id = $this->app->DB->GetInsertID(); } else $ustprf_id = $ustcheck; //$this->app->DB->Insert('INSERT INTO ustprf_protokoll (ustprf_id, zeit, bemerkung, bearbeiter) VALUES ('.$ustprf_id.',"'.date("Y-m-d H:i:s").'","AUTO Prüfung gestartet", "'.$this->app->User->GetName().'")'); $ustid = str_replace(" ","",$ustid); $ust = $ustid; $result = 0; $UstStatus = $this->CheckUst("DE263136143", $ust, $name, $ort, $strasse, $plz, $druck="nein"); if(is_array($UstStatus)) { $tmp = new USTID(); $msg = $tmp->errormessages($UstStatus['ERROR_CODE']); if($UstStatus['ERROR_CODE']==200) { $this->app->DB->Delete("DELETE FROM ustprf_protokoll WHERE ustprf_id='$ustprf_id' AND bemerkung='UST gültig aber Name, Ort oder PLZ wird anders geschrieben'"); $this->app->DB->Insert('INSERT INTO ustprf_protokoll (ustprf_id, zeit, bemerkung, bearbeiter) VALUES ('.$ustprf_id.',"'.date("Y-m-d H:i:s").'","UST gültig aber Name, Ort oder PLZ wird anders geschrieben", "'.$this->app->User->GetName().'")'); } else $this->app->DB->Insert('INSERT INTO ustprf_protokoll (ustprf_id, zeit, bemerkung, bearbeiter) VALUES ('.$ustprf_id.',"'.date("Y-m-d H:i:s").'","'.$UstStatus['ERROR_CODE'].'('.$msg.')", "'.$this->app->User->GetName().'")'); } else if($UstStatus==1){ //$this->app->Tpl->Set(STATUS,"
Vollständig
"); $result = 1; // jetzt brief bestellen! $UstStatus = $this->CheckUst("DE263136143", $ust, $firmenname, $ort, $strasse, $plz, $druck="ja"); $this->app->DB->Insert('INSERT INTO ustprf_protokoll (ustprf_id, zeit, bemerkung, bearbeiter) VALUES ('.$ustprf_id.',"'.date("Y-m-d H:i:s").'","Online-Abfrage OK + Brief bestellt", "'.$this->app->User->GetName().'")'); $this->app->DB->Update('UPDATE ustprf SET datum_online=NOW(), status="erfolgreich" WHERE id='.$ustprf_id.''); } else { $this->app->DB->Insert('INSERT INTO ustprf_protokoll (ustprf_id, zeit, bemerkung, bearbeiter) VALUES ('.$ustprf_id.',"'.date("Y-m-d H:i:s").'","'.$UstStatus.'", "'.$this->app->User->GetName().'")'); $this->app->DB->Update('UPDATE ustprf SET datum_online=NOW(), status="allgemeiner fehler" WHERE id='.$ustprf_id.''); } return $result; } function ArtikelMindestlager($artikel) { if($artikel <= 0) { return 0; } // Fall ein 100R in vielen Listen dann muss man alle listen mit mindestmengen nehmen // Fall das ist eine $mindestlager = $this->app->DB->Select("SELECT mindestlager FROM artikel WHERE id='$artikel' LIMIT 1"); if($mindestlager > 0) { return $mindestlager; } return 0; } function AddChargeLagerOhneBewegung($artikel,$menge,$lagerplatz,$datum,$charge='',$internebemerkung='',$zid=0, $doctype = '', $doctypeid = 0, $isInterim = 0) { if($artikel <= 0) { return null; } $zid = (int)$zid; $this->app->DB->Insert("INSERT INTO lager_charge (artikel,menge,lager_platz,datum,internebemerkung,charge,zwischenlagerid) VALUES ('$artikel','$menge','$lagerplatz','$datum','$internebemerkung','$charge','$zid')"); $this->app->DB->Insert("INSERT INTO chargen_log (artikel,lager_platz,eingang,bezeichnung,zeit,adresse_mitarbeiter,menge,internebemerkung,doctype,doctypeid, is_interim) VALUES ('$artikel','$lagerplatz','1','$charge',NOW(),".$this->app->User->GetAdresse().",'$menge','$internebemerkung','$doctype','$doctypeid',".(int)$isInterim.")"); $id = $this->app->DB->GetInsertID(); $bestand = $this->app->DB->Select("SELECT ifnull(sum(menge),0) FROM lager_charge WHERE artikel = '$artikel' AND lager_platz = '$lagerplatz' AND charge = '$charge'"); $this->app->DB->Update("UPDATE chargen_log SET bestand = '$bestand' WHERE id = '$id' LIMIT 1"); return $id; } function AddMindesthaltbarkeitsdatumLagerOhneBewegung($artikel,$menge,$lagerplatz,$mhd,$charge='',$zid=0, $doctype = '', $doctypeid = 0, $internebemerkung = '', $adresse = 0, $isInterim = 0) { if($artikel <= 0) { return 0; } if (!$this->CheckDateValidate($mhd)) { $mhd = date('Y-m-d'); } $zid = (int)$zid; $this->app->DB->Insert("INSERT INTO lager_mindesthaltbarkeitsdatum (artikel,menge,lager_platz,datum,internebemerkung,charge,zwischenlagerid,mhddatum) VALUES ('$artikel','$menge','$lagerplatz',NOW(),'$internebemerkung','$charge','$zid','$mhd')"); $bestand = (float)$this->app->DB->Select("SELECT ifnull(sum(menge),0) FROM lager_mindesthaltbarkeitsdatum WHERE artikel = '$artikel' AND lager_platz = '$lagerplatz' AND mhddatum = '$mhd' AND ifnull(charge,'') = '$charge' "); $this->app->DB->Insert("INSERT INTO mhd_log (artikel,lager_platz,eingang,mhddatum,zeit,adresse_mitarbeiter,menge,internebemerkung,doctype,doctypeid,bestand,adresse,is_interim) VALUES ('$artikel','$lagerplatz','1','$mhd',NOW(),".$this->app->User->GetAdresse().",'$menge','$internebemerkung','$doctype','$doctypeid','$bestand','$adresse',".(int)$isInterim.")"); $insid = $this->app->DB->GetInsertID(); if($charge != '') { $this->app->DB->Update("UPDATE mhd_log SET charge = '$charge' WHERE id = '$insid' LIMIT 1"); } return $insid; } function AddChargeLager($artikel,$menge,$lagerplatz,$datum,$charge="",$internebemerkung="",$zid=0, $doctype = "", $doctypeid = 0, $adresse = 0, $isInterim = 0) { if($artikel <= 0) { return; } $zid = (int)$zid; $this->LagerArtikelZusammenfassen($artikel, $lagerplatz); $this->app->DB->Insert("INSERT INTO lager_charge (artikel,menge,lager_platz,datum,internebemerkung,charge,zwischenlagerid) VALUES ('$artikel','$menge','$lagerplatz','$datum','$internebemerkung','$charge','$zid')"); $this->app->erp->LagerEinlagern($artikel,$menge,$lagerplatz,$projekt,$internebemerkung,"","",$doctype,$doctypeid,0,0,$adresse); $this->Chargenlog($artikel, $lagerplatz, 1, $charge, $menge, $internebemerkung, $doctype, $doctypeid, $adresse,0, $isInterim); $this->LagerArtikelZusammenfassen($artikel, $lagerplatz); } function AddMindesthaltbarkeitsdatumLager($artikel,$menge,$lagerplatz,$mhd,$charge="",$zid=0, $doctype = "", $doctypeid = 0) { if($artikel <= 0 || (empty($lagerplatz) && empty($zid))) { return 0; } $this->LagerArtikelZusammenfassen($artikel, $lagerplatz); if ($mhd == '' || $mhd==0 || $mhd=='0000-00-00') { return 0; } $this->app->DB->Insert("INSERT INTO lager_mindesthaltbarkeitsdatum (artikel,menge,lager_platz,datum,internebemerkung,charge,zwischenlagerid,mhddatum) VALUES ('$artikel','$menge','$lagerplatz',NOW(),'$internebemerkung','$charge','$zid','$mhd')"); if(empty($lagerplatz)) { return 0; } if($menge > 0) { $this->app->DB->Insert("INSERT INTO lager_platz_inhalt (artikel,menge,lager_platz) VALUES ($artikel','$menge','$lagerplatz')"); } if($charge!='') { $charge = ' Charge: '.$charge; } $bestand = $this->ArtikelImLagerPlatz($artikel,$lagerplatz); $vpe = ''; $projekt = 0; $this->app->DB->Insert("INSERT INTO lager_bewegung (lager_platz, artikel, menge,vpe, eingang,zeit,referenz, bearbeiter,projekt,firma,logdatei,bestand,doctype,doctypeid) VALUES('$lagerplatz','$artikel','$menge','$vpe','1',NOW(),'MHD eingelagert $charge','".$this->app->User->GetName()."', '$projekt','".$this->app->User->GetFirma()."',NOW(),'$bestand','$doctype','$doctypeid')"); $insId = $this->app->DB->GetInsertID(); $this->LagerArtikelZusammenfassen($artikel, $lagerplatz); return $insId; } function SeriennummernLog($artikel, $lagerplatz, $seriennummer, $eingang, $internebemerkung="",$zid=0,$mhd="",$charge="",$doctype="", $doctypeid=0, $adresse = 0) { if(empty($lagerplatz) || (empty($seriennummer) && empty($artikel))) { return 0; } if($adresse == 0 && $doctypeid != 0 && $doctype != '') { $adresse = $this->app->DB->Select("SELECT adresse FROM $doctype WHERE id = '$doctypeid' LIMIT 1"); } $this->app->DB->Insert("INSERT INTO seriennummern_log (artikel,lager_platz,eingang,bezeichnung,zeit,adresse_mitarbeiter,menge,internebemerkung,doctype,doctypeid, adresse) VALUES ('$artikel','$lagerplatz',$eingang,'$seriennummer',NOW(),".$this->app->User->GetAdresse().",1,'$internebemerkung','$doctype','$doctypeid','$adresse')"); return (int)$this->app->DB->GetInsertID(); } function LagerEinlagerVomZwischenlager($zwischenlagerid,$menge,$regal,$projekt,$grund="",$doctype="", $doctypeid=0) { if($menge <= 0 || $regal <= 0) { return; } $zwischenlagerRow = $this->app->DB->SelectRow( sprintf( 'SELECT * FROM zwischenlager WHERE id= %d', $zwischenlagerid ) ); if(empty($zwischenlagerRow) || empty($zwischenlagerRow['artikel'])) { return; } $artikel = $zwischenlagerRow['artikel']; $this->LagerArtikelZusammenfassen($artikel); $referenz = $zwischenlagerRow['grund']; $vpe = $zwischenlagerRow['vpe']; $bestellung = $zwischenlagerRow['parameter']; $paketannahme = $zwischenlagerRow['paketannahme']; $this->app->DB->Insert("INSERT INTO lager_platz_inhalt (lager_platz,artikel,menge,vpe,bearbeiter,bestellung,projekt,firma,logdatei) VALUES ('$regal','$artikel','$menge','$vpe','".$this->app->User->GetName()."','$bestellung','$projekt','".$this->app->User->GetFirma()."',NOW())"); $bestand = $this->ArtikelImLagerPlatz($artikel,$regal); // Bewegung $this->app->DB->Insert("INSERT INTO lager_bewegung (lager_platz, artikel, menge,vpe, eingang,zeit,referenz, bearbeiter,projekt,firma,logdatei,bestand,paketannahme,doctype,doctypeid) VALUES('$regal','$artikel','$menge','$vpe','1',NOW(),'$referenz:$grund','".$this->app->User->GetName()."','$projekt','".$this->app->User->GetFirma()."',NOW(),'$bestand','$paketannahme','$doctype','$doctypeid')"); $this->app->DB->Update("UPDATE lager_seriennummern SET lager_platz='$regal',zwischenlagerid='0' WHERE zwischenlagerid='$zwischenlagerid'"); $this->app->DB->Update("UPDATE lager_mindesthaltbarkeitsdatum SET lager_platz='$regal',zwischenlagerid='0' WHERE zwischenlagerid='$zwischenlagerid'"); $this->app->DB->Update("UPDATE lager_charge SET lager_platz='$regal',zwischenlagerid='0' WHERE zwischenlagerid='$zwischenlagerid'"); $menge_db = $zwischenlagerRow['menge']; if($menge_db - $menge > 0) { $tmp = $menge_db - $menge; $this->app->DB->Update("UPDATE zwischenlager SET menge='$tmp' WHERE id='$zwischenlagerid' LIMIT 1"); } else { $this->app->DB->Update("DELETE FROM zwischenlager WHERE id='$zwischenlagerid' LIMIT 1"); } $this->LagerArtikelZusammenfassen($artikel); } function LagerAutoAuslagernArtikel($artikel,$menge,$grund, $doctype = "", $doctypeid = 0, $posid = 0, $projektueberschreiben = "") { $this->LagerArtikelZusammenfassen($artikel); $artikelArr = $this->app->DB->SelectRow("SELECT * FROM artikel WHERE id='$artikel' LIMIT 1"); $lager_platz = $artikelArr['lager_platz']; $projekt = $artikelArr['projekt']; if($projektueberschreiben != ''){ $projekt = $projektueberschreiben; } $mindesthaltbarkeitsdatum = $artikelArr['mindesthaltbarkeitsdatum']; $chargenverwaltung = $artikelArr['chargenverwaltung']; if($lager_platz > 0){ $tmparr = $this->app->DB->SelectArr("SELECT lager_platz,menge FROM lager_platz_inhalt WHERE artikel='$artikel' ORDER by lager_platz='$lager_platz' DESC, menge DESC"); } else{ $tmparr = $this->app->DB->SelectArr("SELECT lager_platz,menge FROM lager_platz_inhalt WHERE artikel='$artikel' ORDER by menge DESC"); } $mhdchargemengen = null; // build common array $ctmparr = !empty($tmparr)?count($tmparr):0; for($i=0;$i<$ctmparr;$i++) { $lager_platz_id[] = array('lager_platz'=>$tmparr[$i]['lager_platz'],'menge'=>$tmparr[$i]['menge']); if($mindesthaltbarkeitsdatum) { if(!isset($mhdchargemengen[$tmparr[$i]['lager_platz']])) { $mhdchargemengen[$tmparr[$i]['lager_platz']] = $this->app->DB->Select("SELECT ifnull(sum(menge),0) FROM lager_mindesthaltbarkeitsdatum WHERE artikel = '$artikel' AND lager_platz = '".$tmparr[$i]['lager_platz']."'"); } }elseif($chargenverwaltung) { if(!isset($mhdchargemengen[$tmparr[$i]['lager_platz']])) { $mhdchargemengen[$tmparr[$i]['lager_platz']] = $this->app->DB->Select("SELECT ifnull(sum(menge),0) FROM lager_charge WHERE artikel = '$artikel' AND lager_platz = '".$tmparr[$i]['lager_platz']."'"); } } } // auslagern mit mhd/chargen if($mindesthaltbarkeitsdatum || $chargenverwaltung) { $clager_platz_id = !empty($lager_platz_id)?count($lager_platz_id):0; for($i=0;$i < $clager_platz_id;$i++) { if($menge <= 0) { return; } if(!isset($mhdchargemengen[$lager_platz_id[$i]['menge']['lager_platz']])) { continue; } if($lager_platz_id[$i]['menge'] <= 0) { continue; } if($lager_platz_id[$i]['menge']>=$menge) { if($mhdchargemengen[$lager_platz_id[$i]['menge']['lager_platz']] >= $menge) { // in dem regal ist genug restmenge nehmen $this->LagerAuslagernRegal($artikel,$lager_platz_id[$i]['lager_platz'],$menge,$projekt,$grund, $doctype, $doctypeid); $this->LagerAuslagernRegalMHDCHARGESRN($artikel,$lager_platz_id[$i]['lager_platz'],$menge,$projekt,$grund, "", $doctype, $doctypeid,$posid); $menge = 0; return; }else{ $this->LagerAuslagernRegal($artikel,$lager_platz_id[$i]['lager_platz'],$mhdchargemengen[$lager_platz_id[$i]['menge']['lager_platz']],$projekt,$grund, $doctype, $doctypeid); $this->LagerAuslagernRegalMHDCHARGESRN($artikel,$lager_platz_id[$i]['lager_platz'],$mhdchargemengen[$lager_platz_id[$i]['menge']['lager_platz']],$projekt,$grund, "",$doctype, $doctypeid,$posid); $menge = round($menge - $mhdchargemengen[$lager_platz_id[$i]['menge']['lager_platz']],8); $lager_platz_id[$i]['menge'] = round($lager_platz_id[$i]['menge'] - $mhdchargemengen[$lager_platz_id[$i]['menge']['lager_platz']], 8); $mhdchargemengen[$lager_platz_id[$i]['menge']['lager_platz']] = 0; } } else { if($mhdchargemengen[$lager_platz_id[$i]['menge']['lager_platz']] >= $lager_platz_id[$i]['menge']) { $this->LagerAuslagernRegal($artikel,$lager_platz_id[$i]['lager_platz'],$lager_platz_id[$i]['menge'],$projekt,$grund, $doctype, $doctypeid); $this->LagerAuslagernRegalMHDCHARGESRN($artikel,$lager_platz_id[$i]['lager_platz'],$lager_platz_id[$i]['menge'],$projekt,$grund, "",$doctype, $doctypeid,$posid); $menge = round($menge - $lager_platz_id[$i]['menge'],8); $mhdchargemengen[$lager_platz_id[$i]['menge']['lager_platz']] = round($mhdchargemengen[$lager_platz_id[$i]['menge']['lager_platz']] - $lager_platz_id[$i]['menge'],8); $lager_platz_id[$i]['menge'] = 0; }else{ $this->LagerAuslagernRegal($artikel,$lager_platz_id[$i]['lager_platz'],$mhdchargemengen[$lager_platz_id[$i]['menge']['lager_platz']],$projekt,$grund, $doctype, $doctypeid); $this->LagerAuslagernRegalMHDCHARGESRN($artikel,$lager_platz_id[$i]['lager_platz'],$mhdchargemengen[$lager_platz_id[$i]['menge']['lager_platz']],$projekt,$grund, "",$doctype, $doctypeid,$posid); $lager_platz_id[$i]['menge'] = round($lager_platz_id[$i]['menge'] - $mhdchargemengen[$lager_platz_id[$i]['menge']['lager_platz']], 8); $menge = round($menge - $mhdchargemengen[$lager_platz_id[$i]['menge']['lager_platz']], 8); $mhdchargemengen[$lager_platz_id[$i]['menge']['lager_platz']] = 0; } } } } //auslagern ohne mhd/charge $clager_platz_id = !empty($lager_platz_id)?count($lager_platz_id):0; for($i=0;$clager_platz_id;$i++) { if($menge <= 0) { return; } if($lager_platz_id[$i]['menge'] <= 0) { continue; } //$regal = $this->app->DB->Select("SELECT lager_platz FROM lager_platz_inhalt WHERE id='".$lager_platz_id[$i]['id']."' LIMIT 1"); if($lager_platz_id[$i]['menge']>=$menge) { // in dem regal ist genug restmenge nehmen $this->LagerAuslagernRegal($artikel,$lager_platz_id[$i]['lager_platz'],$menge,$projekt,$grund, $doctype, $doctypeid); $this->LagerAuslagernRegalMHDCHARGESRN($artikel,$lager_platz_id[$i]['lager_platz'],$menge,$projekt,$grund, "", $doctype, $doctypeid,$posid); $menge = 0; return; } else { // komplettes regal und menge abziegen $this->LagerAuslagernRegal($artikel,$lager_platz_id[$i]['lager_platz'],$lager_platz_id[$i]['menge'],$projekt,$grund, $doctype, $doctypeid); $this->LagerAuslagernRegalMHDCHARGESRN($artikel,$lager_platz_id[$i]['lager_platz'],$lager_platz_id[$i]['menge'],$projekt,$grund, "",$doctype, $doctypeid,$posid); $menge = round($menge - $lager_platz_id[$i]['menge'],8); } } //$this->LagerArtikelZusammenfassen($artikel); } function GetVPEBezeichnung($vpeid) { if($vpeid <= 0) { return ''; } return (String)$this->app->DB->Select("SELECT concat(' (VPE Menge: ',".$this->FormatMenge('menge').",' Gewicht: ',".$this->FormatMenge('gewicht').",' Abmessung: ',".$this->FormatMenge('breite').",' x ',".$this->FormatMenge('laenge').",' x ',".$this->FormatMenge('hoehe').",')') FROM `lager_platz_vpe` WHERE id = '$vpeid' LIMIT 1"); } function LagerAuslagernRegal($artikel,$regal,$menge,$projekt,$grund,$importer="", $doctype = "", $doctypeid = 0, $lager_platz_vpe = 0, $lpiid = 0) { if(!$artikel) { return -1; } $break = false; $this->RunHook('LagerAuslagernRegal_before',8, $artikel, $menge, $regal, $projekt, $grund, $doctype,$doctypeid, $break); if($break)return; $this->LagerArtikelZusammenfassen($artikel, $regal); if($importer==1) $username = "Import"; else{ if(!empty($this->app->User) && method_exists($this->app->User,'GetName')){ $username = $this->app->DB->real_escape_string($this->app->User->GetName()); }else{ $username = 'Cronjob'; } } // abbrechen wenn es nicht so ist! $bestand = $this->ArtikelImLagerPlatz($artikel,$regal); if($menge > $bestand || $bestand <=0) return -1; if($menge > 0) { $subwhere = ""; $vpe_found = false; if($lager_platz_vpe > 0) { $check = $this->app->DB->Select("SELECT id FROM lager_platz_inhalt WHERE lager_platz_vpe = '$lager_platz_vpe' AND menge >= $menge AND artikel='$artikel' AND lager_platz='$regal' ORDER BY id = '$lpiid' DESC LIMIT 1"); if($check) { $vpe_found = true; $subwhere = " AND id = '$check' "; } }else{ $check = $this->app->DB->Select("SELECT id FROM lager_platz_inhalt WHERE lager_platz_vpe = '0' AND menge >= $menge AND artikel='$artikel' AND lager_platz='$regal' LIMIT 1"); if($check) { $subwhere = " AND id = '$check' "; } } if($check) { // lager in diesem Regal anpassen if($vpe_found)$grund .= $this->GetVPEBezeichnung($lager_platz_vpe); $this->app->DB->Update("UPDATE lager_platz_inhalt SET menge=menge-$menge WHERE artikel='$artikel' AND lager_platz='$regal' $subwhere LIMIT 1"); $this->app->DB->Delete( sprintf( 'DELETE FROM `lager_platz_inhalt` WHERE `id` = %d AND `menge` <= 0 AND `lager_platz_vpe` <= 0', $check ) ); // Bewegung buchen $bestand = $this->ArtikelImLagerPlatz($artikel,$regal); $this->app->DB->Insert("INSERT INTO lager_bewegung (id,lager_platz,artikel,menge,vpe,eingang,zeit,referenz,bearbeiter,projekt,firma,bestand,doctype,doctypeid) VALUES ('','$regal','$artikel','$menge','','0',NOW(),'$grund','" . $username. "','$projekt','','$bestand','$doctype','$doctypeid')"); }else{ $lpis = $this->app->DB->SelectArr("SELECT id, menge,lager_platz_vpe FROM lager_platz_inhalt WHERE artikel = '$artikel' AND lager_platz='$regal' ORDER BY ".($lager_platz_vpe && $lpiid?" id = '$lpiid' DESC, ":'')." lager_platz_vpe = '$lager_platz_vpe' DESC, id"); if($lpis) { $vpemengen = null; $_menge = $menge; foreach($lpis as $v) { if($_menge <= 0)break; if($_menge < $v['menge']) { if(!isset($vpemengen[$v['lager_platz_vpe']]))$vpemengen[$v['lager_platz_vpe']] = 0; $vpemengen[$v['lager_platz_vpe']] += $_menge; $this->app->DB->Update("UPDATE lager_platz_inhalt SET menge=menge-$_menge WHERE id = '".$v['id']."' LIMIT 1"); $this->app->DB->Delete(sprintf('DELETE FROM `lager_platz_inhalt` WHERE `id` = %d AND `menge` <= 0', $v['id'])); $_menge = 0; break; }elseif($_menge == $v['menge']) { if(!isset($vpemengen[$v['lager_platz_vpe']]))$vpemengen[$v['lager_platz_vpe']] = 0; $vpemengen[$v['lager_platz_vpe']] += $_menge; $this->app->DB->Delete("DELETE FROM lager_platz_inhalt WHERE id = '".$v['id']."' LIMIT 1"); $_menge = 0; break; }elseif($v['menge'] < $_menge) { if(!isset($vpemengen[$v['lager_platz_vpe']]))$vpemengen[$v['lager_platz_vpe']] = 0; $vpemengen[$v['lager_platz_vpe']] += $v['menge']; $this->app->DB->Delete("DELETE FROM lager_platz_inhalt WHERE id = '".$v['id']."' LIMIT 1"); $_menge = round($_menge - $v['menge'],8); } } if($_menge > 0)$menge -= $_menge; if($menge > 0) { $bestand = $this->ArtikelImLagerPlatz($artikel,$regal); $bestandalt = round($bestand + $menge,8); foreach($vpemengen as $vpeid => $m) { $bestandalt = round($bestandalt - $m, 8); $_grund = $grund; if($vpeid)$_grund = $grund . $this->GetVPEBezeichnung($vpeid); $this->app->DB->Insert("INSERT INTO lager_bewegung (id,lager_platz,artikel,menge,vpe,eingang,zeit,referenz,bearbeiter,projekt,firma,bestand,doctype,doctypeid) VALUES ('','$regal','$artikel','$m','','0',NOW(),'$_grund','" . $username. "','$projekt','','$bestandalt','$doctype','$doctypeid')"); } } } } } else { $this->Protokoll("Menge $menge fuer Artikel $artikel und lager_platz $regal konnte nicht entnommen werden"); } $this->LagerArtikelZusammenfassen($artikel, $regal); $this->RunHook('LagerAuslagernRegal_after',7, $artikel, $menge, $regal, $projekt, $grund, $doctype,$doctypeid); $this->app->DB->Update(sprintf('UPDATE `artikel`SET `laststorage_changed` = NOW() WHERE `id` = %d', $artikel)); return 1; } function AddBaugruppenChargeMHD($id, $artikel, $anzahl, $chargennummer,$mhd = '') { $bezeichnung = ""; $kommentar = ""; $typ = ""; $this->app->DB->Insert("INSERT INTO produktion_charge (bezeichnung, kommentar, artikel, produktion,typ,anzahl,chargennummer,mhd,bearbeiter) VALUES ('$bezeichnung','$kommentar','$artikel','$id','$typ','$anzahl','$chargennummer','$mhd','".$this->app->DB->real_escape_string($this->app->User->GetName())."')"); echo $this->app->DB->error(); $newid = $this->app->DB->GetInsertID(); $baugruppen = $this->app->DB->SelectArr("SELECT pb.id, ifnull(count(pbc.id),0) as co FROM produktion_baugruppen pb LEFT JOIN produktion_baugruppen_charge pbc ON pbc.baugruppe = pb.id WHERE pb.produktion = '$id' GROUP BY pb.id ORDER by count(pbc.id), pb.id "); if($baugruppen) { $ind = 0; foreach($baugruppen as $baugruppe) { $ind+=$mengeprobaugruppe; $_mengebaugruppe = $mengeprobaugruppe; if($anzahl && $ind >= $anzahl)$_mengebaugruppe -= $ind - $anzahl; if($_mengebaugruppe > 0)$this->app->DB->Insert("INSERT INTO produktion_baugruppen_charge (produktion, baugruppe, charge, chargennummer,mhd,bearbeiter, menge) values ('$id','".$baugruppe['id']."','$newid','$chargennummer','$mhd','".$this->app->DB->real_escape_string($this->app->User->GetName())."','$_mengebaugruppe')"); if($anzahl && $ind >= $anzahl)break; } } } function ChargenMHDAuslagern($artikel, $menge, $lagerplatztyp, $lpid,$typ,$wert, $fifo=0, $projekt=0, $grund="",$doctype="",$doctypeid) { $mindesthaltbarkeitsdatum = $this->app->DB->Select("SELECT mindesthaltbarkeitsdatum FROM artikel WHERE id = '$artikel' LIMIT 1"); $chargenverwaltung = $this->app->DB->Select("SELECT chargenverwaltung FROM artikel WHERE id = '$artikel' LIMIT 1"); $subwhere = ''; $join = ''; $sperrlagerWhere = ' lp.sperrlager <> 1 '; if($doctype === 'produktion') { $sperrlagerWhere = ' (lp.sperrlager <> 1 OR lp.allowproduction = 1) '; } switch($lagerplatztyp) { case 'lagerplatz': if($lpid) { $subwhere = " AND c.lager_platz = '$lpid' "; } break; case 'lager': if($lpid) { $join = " INNER JOIN lager_platz lp ON c.lager_platz = lp.id AND lp.lager = '$lpid' AND ".$sperrlagerWhere; } break; case 'projektlager': if($projekt) { $join = " INNER JOIN lager_platz lp ON c.lager_platz = lp.id AND lp.projekt = '$projekt' AND ".$sperrlagerWhere; } break; case "poslager": if($lpid) { $join = " INNER JOIN lager_platz lp ON c.lager_platz = lp.id AND lp.lager = '$lpid' AND lp.poslager = 1"; } break; } switch($typ) { case 'mhdcharge': case 'mhd': if(!$mindesthaltbarkeitsdatum || !$chargenverwaltung)return false; if($typ == 'mhdcharge') { $mhdcharge = $wert; if($mhdcharge && strlen($mhdcharge) > 10) { $mhd = substr($mhdcharge, 0,10); if(strpos($mhd,'.') !== false) { $mhd = $this->app->String->Convert($mhd,"%1.%2.%3","%3-%2-%1"); } $mhdcharge = substr($mhdcharge, 11); } }else{ $mhd = $wert; $mhdcharge = ""; } $checkarr = $this->app->DB->SelectArr("SELECT c.* FROM lager_mindesthaltbarkeitsdatum c $join WHERE c.artikel = '$artikel' $subwhere ORDER BY mhddatum = '$mhd' DESC, ".($mhdcharge != ''?"charge= '$mdhcharge' DESC,":"")." mhddatum,charge, id "); if($checkarr) { $nochmenge = $menge; foreach($checkarr as $c) { if($nochmenge <= 0)break; if(!$fifo && $c['mhddatum'] != $mhd)break; if($nochmenge >= $c['menge']) { if($doctype == 'produktion')$this->AddBaugruppenChargeMHD($doctypeid, $artikel, $c['menge'], $c['charge'],$c['mhddatum']); $this->app->DB->Delete("DELETE FROM `lager_mindesthaltbarkeitsdatum` WHERE id = '".$c['id']."' LIMIT 1"); if($chargenverwaltung) { $checkchargen = $this->app->DB->SelectArr("SELECT * FROM lager_charge WHERE artikel = '$artikel' AND lager_platz = '$lager_platz' AND charge = '".$c['charge']."' ORDER BY id "); if($checkchargen) { $cnochmenge = $c['menge']; foreach($checkchargen as $cc) { if($cnochmenge <= 0)break; if($cc['menge'] <= $cnochmenge) { $this->app->DB->Delete("DELETE FROM lager_charge WHERE id = '".$cc['id']."' LIMIT 1"); $cnochmenge -= $cc['menge']; }else{ $this->app->DB->Update("UPDATE lager_mindesthaltbarkeitsdatum SET menge = menge - '".$cnochmenge."' WHERE id = '".$cc['id']."' LIMIT 1"); break; } } } } $nochmenge -= $c['menge']; }else{ if($doctype == 'produktion')$this->AddBaugruppenChargeMHD($doctypeid, $artikel, $nochmenge, $c['charge'],$c['mhddatum']); $this->app->DB->Update("UPDATE lager_charge SET menge = menge - '".$nochmenge."' WHERE id = '".$c['id']."' LIMIT 1"); if($chargenverwaltung) { $checkchargen = $this->app->DB->SelectArr("SELECT * FROM lager_charge WHERE artikel = '$artikel' AND lager_platz = '$lager_platz' AND charge = '".$c['charge']."' ORDER BY id "); if($checkchargen) { $cnochmenge = $nochmenge; foreach($checkchargen as $cc) { if($cnochmenge <= 0)break; if($cc['menge'] <= $cnochmenge) { $this->app->DB->Delete("DELETE FROM lager_charge WHERE id = '".$cc['id']."' LIMIT 1"); $cnochmenge -= $cc['menge']; }else{ $this->app->DB->Update("UPDATE lager_mindesthaltbarkeitsdatum SET menge = menge - '".$cnochmenge."' WHERE id = '".$cc['id']."' LIMIT 1"); break; } } } } $nochmenge = 0; break; } } return $menge - $nochmenge; } break; case 'charge': if(!$chargenverwaltung)return false; $checkarr = $this->app->DB->SelectArr("SELECT c.* FROM lager_charge c $join WHERE c.artikel = '$artikel' $subwhere ORDER BY charge = '$wert' DESC, charge, id "); if($checkarr) { $nochmenge = $menge; foreach($checkarr as $c) { if($nochmenge <= 0)break; if(!$fifo && $c['charge'] != $wert)break; if($c['menge'] <= $nochmenge) { if($doctype == 'produktion')$this->AddBaugruppenChargeMHD($doctypeid, $artikel, $c['menge'], $c['charge']); $this->app->DB->Delete("DELETE FROM lager_charge WHERE id = '".$c['id']."' LIMIT 1"); $nochmenge -= $c['menge']; }else{ if($doctype == 'produktion')$this->AddBaugruppenChargeMHD($doctypeid, $artikel, $nochmenge, $c['charge']); $this->app->DB->Update("UPDATE lager_charge SET menge = menge - $nochmenge WHERE id = '".$c['id']."' LIMIT 1"); $nochmenge = 0; break; } } return $menge - $nochmenge; } break; } return false; } function CreateBelegPositionMHDCHARGESRNArr($doctype,$doctypeid,$pos, $data, $lager_platz = 0) { if(!$data) { return; } $first = true; $sql = "INSERT INTO beleg_chargesnmhd (doctype,doctypeid,pos,type,wert,menge, type2, wert2, lagerplatz) VALUES "; foreach($data as $k => $v) { if(!$first) { $sql .= ', '; } $sql .= " ('$doctype','$doctypeid','$pos','".$v['type']."','".$v['wert']."','".$v['menge']."','".$v['type2']."','".$v['wert2']."','$lager_platz') "; $first = false; } $this->app->DB->Insert($sql); } function CreateBelegPositionMHDCHARGESRN($doctype,$doctypeid,$pos,$type,$wert,$menge=1, $type2 = "", $wert2 = "", $lager_platz = 0, $internebemerkung = '') { if($type === 'sn' && $menge == 0) { $menge = 1; } $this->app->DB->Insert( "INSERT INTO beleg_chargesnmhd (doctype,doctypeid,pos,type,wert,menge, type2, wert2) VALUES ('$doctype','$doctypeid','$pos','$type','$wert','$menge','$type2','$wert2')" ); $ind = $this->app->DB->GetInsertID(); if($lager_platz) { $this->app->DB->Update("UPDATE beleg_chargesnmhd set lagerplatz = '".$lager_platz."' WHERE id = '$ind' LIMIT 1"); } if($internebemerkung != '') { $this->app->DB->Update("UPDATE beleg_chargesnmhd set internebemerkung = '".$this->app->DB->real_escape_string($internebemerkung)."' WHERE id = '$ind' LIMIT 1"); } if($type === 'sn') { $this->app->erp->SeriennummernLog($this->app->DB->Select("SELECT artikel FROM $doctype"."_position WHERE id = '$pos' LIMIT 1"), $lager_platz, $wert, 0, "",0,"","",$doctype, $doctypeid); } return $ind; } function MHDAuslagernLog($artikel, $lager_platz, $mhddatum, $charge, $menge, $internebemerkung = '', $doctype = "", $doctypeid = 0, $lager_chargenid = 0, $adresse = 0) { if($artikel <= 0 || $menge == 0) { return false; } if($lager_platz == 0 && $lager_chargenid == 0) { return false; } if(!$adresse && $doctype != '' && $doctypeid > 0) { $adresse = $this->app->DB->Select("SELECT adresse FROM $doctype WHERE id = '$doctypeid' LIMIT 1"); } if($lager_chargenid) { $arr = $this->app->DB->SelectArr("SELECT id, lager_platz, menge, charge,mhddatum FROM lager_mindesthaltbarkeitsdatum WHERE id = '$lager_chargenid' AND artikel = '$artikel' LIMIT 1"); }else{ $arr = $this->app->DB->SelectArr("SELECT id, lager_platz, menge, charge,mhddatum FROM lager_mindesthaltbarkeitsdatum WHERE artikel = '$artikel' AND lager_platz = '$lager_platz' ".($mhddatum!=''?" AND mhddatum = '$mhddatum'":'')." ".($charge!=''?" AND charge = '$charge'":'')." AND menge > 0"); } if(!$arr) { return false; } foreach($arr as $v) { if($menge <= 0) { return true; } if($menge >= $v['menge']) { $menge -= $v['menge']; $this->app->DB->Delete("DELETE FROM lager_mindesthaltbarkeitsdatum WHERE id = '".$v['id']."' LIMIT 1"); $this->MHDLog($artikel, $v['lager_platz'], 0, $v['mhddatum'], $v['menge'], $internebemerkung, $doctype, $doctypeid, $v['charge']); }else{ $this->app->DB->Update("UPDATE lager_mindesthaltbarkeitsdatum SET menge = menge - $menge WHERE id = '".$v['id']."' LIMIT 1"); $this->MHDLog($artikel, $v['lager_platz'], 0, $v['mhddatum'], $menge, $internebemerkung, $doctype, $doctypeid, $v['charge']); return true; } } return $menge <= 0; } function ChargeAuslagernLog($artikel, $lager_platz, $charge, $menge, $internebemerkung = '', $doctype = '', $doctypeid = 0, $lager_chargenid = 0, $adresse = 0, $isInterim = 0) { if($artikel <= 0 || $menge == 0) { return false; } if($lager_platz == 0 && $lager_chargenid == 0) { return false; } if(!$adresse && $doctype != '' && $doctypeid > 0) { $adresse = $this->app->DB->Select("SELECT adresse FROM $doctype WHERE id = '$doctypeid' LIMIT 1"); } if($lager_chargenid) { $arr = $this->app->DB->SelectArr("SELECT id, lager_platz, menge, charge FROM lager_charge WHERE id = '$lager_chargenid' AND artikel = '$artikel' LIMIT 1"); }else{ $arr = $this->app->DB->SelectArr("SELECT id, lager_platz, menge, charge FROM lager_charge WHERE artikel = '$artikel' AND lager_platz = '$lager_platz' AND charge = '$charge' AND menge > 0"); } if(!$arr) { return false; } foreach($arr as $v) { if($menge <= 0) { return true; } if($menge >= $v['menge']) { $menge -= $v['menge']; $this->app->DB->Delete("DELETE FROM lager_charge WHERE id = '".$v['id']."' LIMIT 1"); $this->Chargenlog($artikel, $v['lager_platz'], 0, $charge, $v['menge'], $internebemerkung, $doctype, $doctypeid, $adresse,0,$isInterim); }else{ $this->app->DB->Update("UPDATE lager_charge SET menge = menge - $menge WHERE id = '".$v['id']."' LIMIT 1"); $this->Chargenlog($artikel, $v['lager_platz'], 0, $charge, $menge, $internebemerkung, $doctype, $doctypeid, $adresse,0,$isInterim); return true; } } return $menge <= 0; } function Chargenlog($artikel, $lager_platz, $eingang, $charge, $menge, $internebemerkung = '', $doctype = "", $doctypeid = 0, $adresse = 0,$chargen_log_id = 0, $isInterim = 0) { if($artikel <= 0) { return null; } if(!$adresse && $doctype != '' && $doctypeid > 0) { $adresse = $this->app->DB->Select("SELECT adresse FROM $doctype WHERE id = '$doctypeid' LIMIT 1"); } $internebemerkung = $this->app->DB->real_escape_string($internebemerkung); $bestand = $this->app->DB->Select("SELECT ifnull(sum(menge),0) FROM lager_charge WHERE artikel = '$artikel' AND lager_platz = '$lager_platz' AND charge = '$charge'"); $this->RunHook('chargenlog_bestand', 4, $artikel, $lager_platz, $charge, $bestand); if($chargen_log_id) { $chargen_log_id = $this->app->DB->Select("SELECT id FROM chargen_log WHERE id='$chargen_log_id' AND eingang = '$eingang' AND artikel = '$artikel' AND charge = '$charge' AND doctype = '$doctype' AND doctypeid = '$doctypeid' AND adresse = '$adresse' LIMIT 1"); } if($chargen_log_id) { $this->app->DB->Update("UPDATE chargen_log SET menge = menge + $menge, bestand = '$bestand' WHERE id = '$chargen_log_id' LIMIT 1"); return $chargen_log_id; } $this->app->DB->Insert("INSERT INTO chargen_log (artikel,lager_platz,eingang,bezeichnung,zeit,adresse_mitarbeiter,menge,internebemerkung,doctype,doctypeid,bestand,adresse,is_interim) VALUES ('$artikel','$lager_platz','$eingang','".$charge."',NOW(),".(int)$this->app->User->GetAdresse().",'".$menge."','$internebemerkung','$doctype','$doctypeid','$bestand','$adresse',".(int)$isInterim.")"); return $this->app->DB->GetInsertID(); } function ChargenLogArray($artikel, $lager_platz, $eingang, $data, $internebemerkung = '', $doctype = "", $doctypeid = 0, $adresse = 0) { if($artikel <= 0) { return; } if(!$adresse && $doctype != '' && $doctypeid > 0) { $adresse = $this->app->DB->Select("SELECT adresse FROM $doctype WHERE id = '$doctypeid' LIMIT 1"); } $internebemerkung = $this->app->DB->real_escape_string($internebemerkung); $sql = "INSERT INTO chargen_log (artikel,lager_platz,eingang,bezeichnung,zeit,adresse_mitarbeiter,menge,internebemerkung,doctype,doctypeid,bestand,adresse) VALUES "; $first = true; $useradresse = 0; if(isset($this->app->User) && $this->app->User && method_exists($this->app->User, 'GetAdresse')) { $useradresse = $this->app->User->GetAdresse(); } foreach($data as $k => $v) { $this->RunHook('chargenlog_bestand', 4, $artikel, $lager_platz, $data[$k]['charge'], $data[$k]['bestand']); if(!$first) { $sql .= ', '; } $sql .= " ('$artikel','$lager_platz','$eingang','".$data[$k]['charge']."',NOW(),".$useradresse.",'".$data[$k]['menge']."','$internebemerkung','$doctype','$doctypeid','".$data[$k]['bestand']."','$adresse') "; $first = false; } $this->app->DB->Insert($sql); } function MHDLog($artikel, $lager_platz, $eingang, $mhd, $menge, $internebemerkung = '', $doctype = '', $doctypeid = 0, $charge = '', $adresse = 0, $isInterim = 0) { if($artikel <= 0) { return; } if(!$adresse && $doctype != '' && $doctypeid > 0) { $adresse = $this->app->DB->Select("SELECT adresse FROM $doctype WHERE id = '$doctypeid' LIMIT 1"); } $internebemerkung = $this->app->DB->real_escape_string($internebemerkung); $bestand = $this->app->DB->Select("SELECT ifnull(sum(menge),0) FROM lager_mindesthaltbarkeitsdatum WHERE artikel = '$artikel' AND lager_platz = '$lager_platz' AND mhddatum = '$mhd' AND ifnull(charge,'') = '$charge'"); $this->RunHook('mhdlog_bestand', 4, $artikel, $lager_platz, $mhd, $bestand); $this->app->DB->Insert("INSERT INTO mhd_log (artikel,lager_platz,eingang,mhddatum,zeit,adresse_mitarbeiter,menge,internebemerkung,doctype,doctypeid,bestand,adresse,is_interim) VALUES ('$artikel','$lager_platz','$eingang','".$mhd."',NOW(),".(int)$this->app->User->GetAdresse().",'".$menge."','$internebemerkung','$doctype','$doctypeid','$bestand','$adresse',".(int)$isInterim.")"); $insid = $this->app->DB->GetInsertID(); if($charge != '') { $this->app->DB->Update("UPDATE mhd_log SET charge = '$charge' WHERE id = '$insid' LIMIT 1"); } } function MHDLogArray($artikel, $lager_platz, $eingang, $data, $internebemerkung = '', $doctype = '', $doctypeid = 0, $adresse = 0) { if(empty($data)) { return; } $sql = "INSERT INTO mhd_log (artikel,lager_platz,eingang,mhddatum,zeit,adresse_mitarbeiter,menge,internebemerkung,doctype,doctypeid,bestand,adresse,charge) VALUES "; $first = true; foreach($data as $k => $v) { $this->RunHook('mhdlog_bestand', 4, $artikel, $lager_platz, $data[$k]['mhd'], $data[$k]['bestand']); if(!$first) { $sql .= ', '; } $sql .= "('$artikel','$lager_platz','$eingang','".$data[$k]['mhd']."',NOW(),".(int)$this->app->User->GetAdresse().",'".$data[$k]['menge']."','$internebemerkung','$doctype','$doctypeid','".$data[$k]['bestand']."','$adresse','".$data[$k]['charge']."')"; $first = false; } $this->app->DB->Insert($sql); } public function removeBatchFromStock($articleId, $storageLocationId, $batch, $amount, $comment = '', $doctype = '', $doctypeid = 0, $docPosId = '') { if($articleId <= 0 || $storageLocationId <= 0 || $amount <= 0 || empty($batch)) { return 0; } $toRemove = $amount; while($toRemove > 0) { $this->app->erp->RunHook( 'LagerAuslagernRegalMHDCHARGESRN_Charge', 7, $articleId, $storageLocationId, $toRemove, $doctype, $doctypeid, $dokumentposid, $extraorder ); $lager_chargen = $this->app->DB->SelectArr( sprintf( "SELECT id, menge, charge FROM lager_charge WHERE artikel=%d AND lager_platz=%d AND menge > 0 AND charge = '%s' ORDER BY $extraorder id LIMIT %d", (int)$articleId, (int)$storageLocationId, $batch, ceil($toRemove) ) ); if(empty($lager_chargen)){ break; } $chargen_log_arr = null; foreach ($lager_chargen as $v) { if($toRemove <= 0){ break; } if($v['menge'] <= $toRemove){ $this->app->DB->Update("UPDATE lager_charge SET menge = 0 WHERE id='" . $v['id'] . "' AND menge = '" . $v['menge'] . "' LIMIT 1"); if($this->app->DB->affected_rows() > 0){ $this->app->DB->Delete("DELETE FROM lager_charge WHERE id='" . $v['id'] . "' AND id > 0 LIMIT 1"); if(!isset($chargen_log_arr['C' . $v['charge']])){ $chargen_log_arr['C' . $v['charge']] = array('menge' => 0, 'bestand' => 0); } $chargen_log_arr['C' . $v['charge']]['menge'] += $v['menge']; $toRemove = round($toRemove - $v['menge'], 8); }else{ break; } }elseif($toRemove > 0){ $this->app->DB->Update("UPDATE lager_charge SET menge = menge - $toRemove WHERE id='" . $v['id'] . "' AND menge >= '$toRemove' LIMIT 1"); if($this->app->DB->affected_rows() > 0){ $this->app->DB->Delete("DELETE FROM lager_charge WHERE id='" . $v['id'] . "' AND id > 0 AND menge <= 0 LIMIT 1"); if(!isset($chargen_log_arr['C' . $v['charge']])){ $chargen_log_arr['C' . $v['charge']] = array('menge' => 0, 'bestand' => 0); } $chargen_log_arr['C' . $v['charge']]['menge'] += $toRemove; $toRemove = 0; break; } break; } } if($chargen_log_arr){ $chargensqla = null; $bestandsql = "SELECT sum(menge) as bestand, charge FROM lager_charge WHERE artikel='$articleId' AND lager_platz='$storageLocationId' AND menge > 0 "; foreach ($chargen_log_arr as $chargenkey => $arr) { $chargensqla[] = "'" . substr($chargenkey, 1) . "'"; } $bestandsql .= " AND ifnull(charge,'') in (" . implode(', ', $chargensqla) . ") GROUP BY charge"; $query = $this->app->DB->Query($bestandsql); if($query){ while ($row = $this->app->DB->Fetch_Assoc($query)) { if(isset($chargen_log_arr['C' . $row['charge']])){ $chargen_log_arr['C' . $row['charge']]['bestand'] = $row['bestand']; } } } $data = null; $data2 = null; foreach ($chargen_log_arr as $chargenkey => $arr) { $data[] = array('charge' => substr($chargenkey, 1), 'menge' => $arr['menge'], 'bestand' => $arr['bestand']); $data2[] = array('type' => 'charge', 'wert' => substr($chargenkey, 1), 'menge' => $arr['menge'], 'type2' => '', 'wert2' => ''); } unset($chargen_log_arr); $this->ChargenLogArray($articleId, $storageLocationId, 0, $data, $comment, $doctype, $doctypeid); unset($data); if($doctypeid){ $this->CreateBelegPositionMHDCHARGESRNArr($doctype, $doctypeid, $docPosId, $data2, $storageLocationId); } unset($data2); } } return round($amount - $toRemove, 7); } function LagerAuslagernRegalMHDCHARGESRN($artikel,$regal,$menge,$projekt,$grund,$importer="",$dokumenttyp="",$dokumentid="",$dokumentposid="", $chargenauslagern = 1, $mhdauslagern = 1, $seriennummernauslagern = 1) { $grundescaped = $this->app->DB->real_escape_string($grund); if($this->Verbrauchslagervorhanden()) { $verbrauchslager = $this->app->DB->Select("SELECT verbrauchslager FROM lager_platz WHERE id = '$regal' LIMIT 1"); if($verbrauchslager)$this->LagerArtikelZusammenfassen($artikel, $regal); } $artikelArr = $this->app->DB->SelectRow( sprintf('SELECT mindesthaltbarkeitsdatum, chargenverwaltung, seriennummern FROM artikel WHERE id= %d LIMIT 1', (int)$artikel ) ); $mhd = $artikelArr['mindesthaltbarkeitsdatum']; $chargenverwaltung = $artikelArr['chargenverwaltung']; $chargenverwaltung = $chargenverwaltung == 2 || $chargenverwaltung == 1; $seriennummern = $artikelArr['seriennummern']; if($seriennummernauslagern && $seriennummern==='vomprodukteinlagern') { if($mhd == '1') { $mhdauslagern = 1; } if($chargenverwaltung) { $chargenauslagern = 1; } } elseif($seriennummern==='vomprodukteinlagern' && !$seriennummernauslagern) { if($mhd == '1') { $mhdauslagern = 0; } if($chargenverwaltung) { $chargenauslagern = 0; } } elseif($mhd == '1' && $mhdauslagern && $chargenverwaltung) { $chargenauslagern = 1; } elseif($mhd == '1' && !$mhdauslagern && $chargenverwaltung) { $chargenauslagern = 0; } $mhd_menge = $menge; $charge_menge = $menge; $extraorder = ''; if($mhd=='1' && $mhdauslagern) { $timeout=0; while($mhd_menge > 0 && $timeout < 1000) { $timeout++; $this->app->erp->RunHook('LagerAuslagernRegalMHDCHARGESRN_MHD', 7,$artikel, $regal, $menge, $dokumenttyp,$dokumentid,$dokumentposid, $extraorder); $lager_mindesthaltbarkeitsdatum = $this->app->DB->SelectArr( sprintf( "SELECT id,menge,mhddatum, charge FROM lager_mindesthaltbarkeitsdatum WHERE artikel=%d AND lager_platz=%d AND menge > 0 ORDER BY $extraorder mhddatum, datum LIMIT %d", (int)$artikel, (int)$regal, ceil($mhd_menge) ) ); if($lager_mindesthaltbarkeitsdatum) { $mhd_log_arr = null; foreach($lager_mindesthaltbarkeitsdatum as $v) { if($mhd_menge <= 0) { break; } $charge_menge = 0; if($v['menge']<=$mhd_menge) { $this->app->DB->Update("UPDATE lager_mindesthaltbarkeitsdatum SET menge = 0 WHERE id='".$v['id']."' AND menge = '".$v['menge']."' LIMIT 1"); if($this->app->DB->affected_rows() > 0) { $mhd_menge = round($mhd_menge - $v['menge'],8); $this->app->DB->Delete("DELETE FROM lager_mindesthaltbarkeitsdatum WHERE id='".$v['id']."' AND id > 0 LIMIT 1"); if(!isset($mhd_log_arr[$v['mhddatum']]) || !isset($mhd_log_arr[$v['mhddatum']]['C'.$v['charge']])) { $mhd_log_arr[$v['mhddatum']]['C'.$v['charge']] = array('menge'=>0, 'bestand'=>0); } $mhd_log_arr[$v['mhddatum']]['C'.$v['charge']]['menge'] += $v['menge']; if($chargenverwaltung) { $stockedout = (float)$this->removeBatchFromStock($artikel, $regal, $v['charge'], $v['menge'], $grundescaped, $dokumenttyp, $dokumentid, $dokumentposid); $charge_menge = round($charge_menge - $stockedout, 7); } }else { break; } }elseif($mhd_menge > 0) { $this->app->DB->Update("UPDATE lager_mindesthaltbarkeitsdatum SET menge = menge - $mhd_menge WHERE id='".$v['id']."' AND menge >= '$mhd_menge' LIMIT 1"); if($this->app->DB->affected_rows() > 0) { $this->app->DB->Delete("DELETE FROM lager_mindesthaltbarkeitsdatum WHERE id='".$v['id']."' AND id > 0 AND menge <= 0 LIMIT 1"); if(!isset($mhd_log_arr[$v['mhddatum']]) || !isset($mhd_log_arr[$v['mhddatum']]['C'.$v['charge']])) { $mhd_log_arr[$v['mhddatum']]['C'.$v['charge']] = array('menge'=>0, 'bestand'=>0); } $mhd_log_arr[$v['mhddatum']]['C'.$v['charge']]['menge'] += $mhd_menge; if($chargenverwaltung) { $stockedout = (float)$this->removeBatchFromStock($artikel, $regal, $v['charge'], $mhd_menge, $grundescaped, $dokumenttyp, $dokumentid, $dokumentposid); $charge_menge = round($charge_menge - $stockedout, 7); } $mhd_menge = 0; } break; } } if($mhd_log_arr) { $mhdsqla = null; $chargensqla = null; $bestandsql = "SELECT sum(menge) as bestand, mhddatum, charge FROM lager_mindesthaltbarkeitsdatum WHERE artikel='$artikel' AND lager_platz='$regal' AND menge > 0 "; foreach($mhd_log_arr as $mhdkey => $arr) { $mhdsqla[] = "'".$mhdkey."'"; foreach($arr as $chargenkey => $arr2) { $chargensqla[] = "'".substr($chargenkey, 1)."'"; } } $bestandsql .= " AND mhddatum in (".implode(', ',$mhdsqla).") AND ifnull(charge,'') in (".implode(', ', $chargensqla).") GROUP BY mhddatum, charge"; $query = $this->app->DB->Query($bestandsql); if($query) { while($row = $this->app->DB->Fetch_Assoc($query)) { if(isset($mhd_log_arr[$row['mhddatum']]) && isset($mhd_log_arr[$v['mhddatum']]['C'.$row['charge']])) { $mhd_log_arr[$v['mhddatum']]['C'.$row['charge']]['bestand'] = $row['bestand']; } } } $data = null; $data2 = null; foreach($mhd_log_arr as $mhdkey => $arr) { $mhdsqla[] = "'".$mhdkey."'"; foreach($arr as $chargenkey => $arr2) { $data[] = array('mhd' => $mhdkey, 'charge'=> substr($chargenkey,1), 'menge'=>$arr2['menge'],'bestand'=>$arr2['bestand']); $data2[] = array('type'=>'mhd','wert'=>$mhdkey,'menge'=>$arr2['menge'],'type2'=>(substr($chargenkey,1) == ''?'':'charge'),'wert2'=>substr($chargenkey,1)); } } unset($mhd_log_arr); $this->MHDLogArray($artikel, $regal, 0, $data, $grundescaped, $dokumenttyp, $dokumentid); unset($data); if($dokumentid) { $this->CreateBelegPositionMHDCHARGESRNArr($dokumenttyp,$dokumentid,$dokumentposid, $data2, $regal); } unset($data2); } }else { break; } /* 05.06.2018 Bruno Abfragen zusammengefuehrt */ } } if($chargenverwaltung && $chargenauslagern) { while($charge_menge > 0) { $this->app->erp->RunHook('LagerAuslagernRegalMHDCHARGESRN_Charge', 7,$artikel, $regal, $menge, $dokumenttyp,$dokumentid,$dokumentposid, $extraorder); $lager_chargen = $this->app->DB->SelectArr( sprintf( "SELECT id, menge, charge FROM lager_charge WHERE artikel=%d AND lager_platz=%d AND menge > 0 ORDER BY $extraorder id LIMIT %d", (int)$artikel, (int)$regal, ceil($menge) ) ); if($lager_chargen) { $chargen_log_arr = null; foreach($lager_chargen as $v) { if($charge_menge <= 0) { break; } if($v['menge'] <= $charge_menge) { $this->app->DB->Update("UPDATE lager_charge SET menge = 0 WHERE id='".$v['id']."' AND menge = '".$v['menge']."' LIMIT 1"); if($this->app->DB->affected_rows() > 0) { $this->app->DB->Delete("DELETE FROM lager_charge WHERE id='".$v['id']."' AND id > 0 LIMIT 1"); if(!isset($chargen_log_arr['C'.$v['charge']])) { $chargen_log_arr['C'.$v['charge']] = array('menge'=>0, 'bestand'=>0); } $chargen_log_arr['C'.$v['charge']]['menge'] += $v['menge']; $charge_menge = round($charge_menge - $v['menge'],8); }else{ break; } }elseif($charge_menge > 0) { $this->app->DB->Update("UPDATE lager_charge SET menge = menge - $charge_menge WHERE id='".$v['id']."' AND menge >= '$charge_menge' LIMIT 1"); if($this->app->DB->affected_rows() > 0) { $this->app->DB->Delete("DELETE FROM lager_charge WHERE id='".$v['id']."' AND id > 0 AND menge <= 0 LIMIT 1"); if(!isset($chargen_log_arr['C'.$v['charge']])) { $chargen_log_arr['C'.$v['charge']] = array('menge'=>0, 'bestand'=>0); } $chargen_log_arr['C'.$v['charge']]['menge'] += $charge_menge; $charge_menge = 0; } break; } } if($chargen_log_arr) { $chargensqla = null; $bestandsql = "SELECT sum(menge) as bestand, charge FROM lager_charge WHERE artikel='$artikel' AND lager_platz='$regal' AND menge > 0 "; foreach($chargen_log_arr as $chargenkey => $arr) { $chargensqla[] = "'".substr($chargenkey, 1)."'"; } $bestandsql .= " AND ifnull(charge,'') in (".implode(', ', $chargensqla).") GROUP BY charge"; $query = $this->app->DB->Query($bestandsql); if($query) { while($row = $this->app->DB->Fetch_Assoc($query)) { if(isset($chargen_log_arr['C'.$row['charge']])) { $chargen_log_arr['C'.$row['charge']]['bestand'] = $row['bestand']; } } } $data = null; $data2 = null; foreach($chargen_log_arr as $chargenkey => $arr) { $data[] = array('charge'=> substr($chargenkey,1), 'menge'=>$arr['menge'],'bestand'=>$arr['bestand']); $data2[] = array('type'=>'charge','wert'=>substr($chargenkey,1),'menge'=>$arr['menge'],'type2'=>'','wert2'=>''); } unset($chargen_log_arr); $this->ChargenLogArray($artikel, $regal, 0, $data, $grundescaped, $dokumenttyp, $dokumentid); unset($data); if($dokumentid) { $this->CreateBelegPositionMHDCHARGESRNArr($dokumenttyp,$dokumentid,$dokumentposid, $data2, $regal); } unset($data2); } unset($lager_chargen); }else { break; } } /* 05.06.2018 Bruno Abfragen zusammengefuehrt */ } if($this->Verbrauchslagervorhanden()) { if($verbrauchslager)$this->LagerArtikelZusammenfassen($artikel, $regal); } } function CreateLagerplatz($lager,$lagerplatz_name,$firma="1") { $lagerplatz_name = trim($lagerplatz_name); // pruefe ob es Lagerplatz bereits gibt $check_id = $this->app->DB->Select("SELECT id FROM lager_platz WHERE kurzbezeichnung='$lagerplatz_name' AND lager='$lager' LIMIT 1"); if($check_id <= 0) { if($firma <= 0) $firma=1; $this->app->DB->Insert("INSERT INTO lager_platz (id,lager,kurzbezeichnung,firma) VALUES ('','$lager','$lagerplatz_name',$firma)"); $check_id = $this->app->DB->GetInsertID(); } return $check_id; } function LagerID($lager) { if(is_numeric($lager) && $lager > 0) { $lager = $lager + 0; $lager = $this->app->DB->Select("SELECT id FROM lager_platz WHERE id='$lager' LIMIT 1"); if($lager > 0) return $lager; } if($lager !="") { $id = $this->app->DB->Select("SELECT id FROM lager_platz WHERE kurzbezeichnung='$lager' LIMIT 1"); return $id; } else return ""; } function IsArtikelInZwischenlager($artikel) { $check = $this->app->DB->Select("SELECT id FROM zwischenlager WHERE richtung='Eingang' AND artikel='$artikel' LIMIT 1"); return $check > 0; } function ArtikelIDWennEAN($artikelnummer, $fremdnummern = false) { if($artikelnummer!="") { // artikelnummer hat hoechste Prio $nummer = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='$artikelnummer' AND ifnull(geloescht,0) = 0 LIMIT 1"); if($nummer > 0) return $nummer; // dann ean nummer $ean = $this->app->DB->Select("SELECT id FROM artikel WHERE ean='$artikelnummer' AND ifnull(geloescht,0) = 0 AND nummer != 'DEL' LIMIT 1"); if($ean > 0) return $ean; // und zum Schluss Hersteller $herstellernummer = $this->app->DB->Select("SELECT id FROM artikel WHERE herstellernummer='$artikelnummer' AND ifnull(geloescht,0) = 0 AND nummer != 'DEL' LIMIT 1"); if($herstellernummer > 0) return $herstellernummer; if($fremdnummern) { $artikel = $this->app->DB->Select("SELECT art.id FROM artikel art INNER JOIN artikelnummer_fremdnummern af ON art.id = af.artikel AND ifnull(art.geloescht,0) = 0 AND af.aktiv = 1 AND art.nummer <> 'DEL' INNER JOIN shopexport s ON af.shopid = s.id WHERE af.nummer = '$artikelnummer' LIMIT 1"); if($artikel) return $artikel; } /* $id = $this->app->DB->Select("SELECT id FROM artikel WHERE id='$artikelnummer' LIMIT 1"); if($id > 0) return $id; else return 0; */ } return 0; } function LagerEinlagern($artikel,$menge,$regal,$projekt,$grund="",$importer="",$paketannahme="",$doctype = "", $doctypeid = 0, $vpeid = 0, $permanenteinventur = 0, $adresse = 0) { if(empty($artikel) || empty($regal)){ return; } $break = false; $this->RunHook('LagerEinlagern_before',8, $artikel, $menge, $regal, $projekt, $grund, $doctype,$doctypeid, $break); if($break) { return; } if(!$adresse && $doctypeid && $doctype != '') { $adresse = $this->app->DB->Select("SELECT adresse FROM $doctype WHERE id = '$doctypeid' LIMIT 1"); } //$this->LagerArtikelZusammenfassen($artikel); $vpe = 'einzeln'; $username = 'Import'; if($importer!=1) { $username = $this->app->DB->real_escape_string($this->app->User->GetName()); } if($menge > 0 && is_numeric($menge)) { // inhalt buchen $this->app->DB->Insert("INSERT INTO lager_platz_inhalt (id,lager_platz,artikel,menge,vpe,bearbeiter,bestellung,projekt,firma,logdatei) VALUES ('','$regal','$artikel','$menge','$vpe','".$username."','','$projekt','',NOW())"); $insid = $this->app->DB->GetInsertID(); $bestand = $this->ArtikelImLagerPlatz($artikel,$regal); // Bewegung if($vpeid) { $grund .= $this->GetVPEBezeichnung($vpeid); } $this->app->DB->Insert("INSERT INTO lager_bewegung (id,lager_platz, artikel, menge,vpe, eingang,zeit,referenz, bearbeiter,projekt,firma,logdatei,bestand,paketannahme,doctype,doctypeid, permanenteinventur, adresse) VALUES('','$regal','$artikel','$menge','$vpe','1',NOW(),'$grund','".$username."','$projekt','',NOW(),'$bestand','$paketannahme','$doctype','$doctypeid', '$permanenteinventur','$adresse')"); if($vpeid)$this->app->DB->Update("UPDATE lager_platz_inhalt SET lager_platz_vpe = '$vpeid' WHERE id = '$insid' LIMIT 1"); $this->LagerArtikelZusammenfassen($artikel, $regal); $this->app->DB->Update("UPDATE artikel SET cache_lagerplatzinhaltmenge = -999, `laststorage_changed` = NOW() WHERE id = '$artikel' LIMIT 1"); $this->app->DB->Update( sprintf( 'UPDATE artikel_onlineshops SET storage_cache = -999, pseudostorage_cache = -999 WHERE artikel = %d', $artikel ) ); } $this->RunHook('LagerEinlagern_after',7, $artikel, $menge, $regal, $projekt, $grund, $doctype,$doctypeid); } function CreateLagerPlatzInhaltVPE($artikel, $menge, $gewicht, $laenge, $breite, $hoehe, $menge2 = 0, $gewicht2 = 0, $laenge2 = 0, $breite2 = 0, $hoehe2 = 0) { $check = $this->app->DB->Select("SELECT id FROM `lager_platz_vpe` WHERE artikel = '$artikel' AND menge = '$menge' AND gewicht = '$gewicht' AND breite = '$breite' AND hoehe = '$hoehe' ".($menge2 <= 1?" AND (menge2 = '0' OR menge2 = 1) ":" AND menge2 = '$menge2' ")." AND gewicht2 = '$gewicht' AND breite2 = '$breite' AND hoehe2 = '$hoehe' LIMIT 1 "); if($check)return $check; $this->app->DB->Insert("INSERT INTO `lager_platz_vpe` (artikel, menge, gewicht, laenge, breite, hoehe, menge2, gewicht2, laenge2, breite2, hoehe2 ) VALUES ('$artikel', '$menge', '$gewicht', '$laenge', '$breite', '$hoehe', '$menge2', '$gewicht2', '$laenge2', '$breite2', '$hoehe2') "); return $this->app->DB->GetInsertID(); } function LagerEinlagernDifferenz($artikel,$menge,$regal,$projekt,$grund="",$importer="", $vpeid = 0) { $grund = "Differenz: ".$grund; $this->LagerEinlagern($artikel,$menge,$regal,$projekt,$grund,$importer, "", "", 0, $vpeid); } function LagerArtikelZusammenfassen($artikel, $regal = 0) { $fp = $this->app->erp->ProzessLock("lager_artikelzusammenfassen"); //$this->LagerSync($artikel); // all einzeln buchungen in einem Baum zusammenfassen if($artikel > 0) { $result = $this->app->DB->SelectArr("SELECT lager_platz,SUM(menge) as gesamt,projekt,max(firma) as firma,max(inventur) as inventur, min(id) as minid,lager_platz_vpe FROM lager_platz_inhalt WHERE artikel='$artikel' ".($regal?" AND lager_platz = '$regal' ":'')." GROUP by lager_platz,lager_platz_vpe having count(id) > 1"); //echo "DELETE FROM lager_platz_inhalt WHERE artikel='".$artikel."';"; if($result) { $cresult = (!empty($result)?count($result):0); for($i=0;$i<$cresult;$i++) { $this->app->DB->Delete("DELETE FROM lager_platz_inhalt WHERE artikel='$artikel' AND lager_platz = '".$result[$i]['lager_platz']."' AND lager_platz_vpe = '".$result[$i]['lager_platz_vpe']."' "); if(empty($result[$i]['lager_platz'])) { continue; } $this->app->DB->Insert("INSERT INTO lager_platz_inhalt (id,lager_platz,artikel,menge,projekt,firma,inventur,lager_platz_vpe) VALUES ('".$result[$i]['minid']."','".$result[$i]['lager_platz']."','$artikel', '".$result[$i]['gesamt']."','".$result[$i]['projekt']."','".$result[$i]['firma']."',".(is_null($result[$i]['inventur'])?"NULL":"'".$result[$i]['inventur']."'").",'".$result[$i]['lager_platz_vpe']."')"); } } } if($regal) { //$this->app->DB->Delete("DELETE lager_platz_inhalt FROM lager_platz_inhalt WHERE lager_platz = '$regal' AND ((menge<='0' and (isnull(inventur) or inventur <= 0)) or menge < 0)"); }else{ //$this->app->DB->Delete("DELETE lager_platz_inhalt FROM lager_platz_inhalt WHERE (menge<='0' and (isnull(inventur) or inventur <= 0)) or menge < 0"); } if($this->Verbrauchslagervorhanden()) { if($regal && $this->app->DB->Select("SELECT verbrauchslager FROM lager_platz WHERE id = '$regal' LIMIT 1")) { $this->app->DB->Delete("DELETE lager_platz_inhalt FROM lager_platz_inhalt INNER JOIN lager_platz ON lager_platz.id=lager_platz_inhalt.lager_platz WHERE lager_platz.verbrauchslager='1' AND lager_platz.id = '$regal'"); //WHERE lager_platz_inhalt.artikel='".$artikel."' AND lager_platz.verbrauchslager='1'"); $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'"); $this->app->DB->Delete("DELETE lager_seriennummern FROM lager_seriennummern INNER JOIN lager_platz ON lager_platz.id=lager_seriennummern.lager_platz WHERE lager_platz.verbrauchslager='1' AND lager_platz.id = '$regal'"); $this->app->DB->Delete("DELETE lager_mindesthaltbarkeitsdatum FROM lager_mindesthaltbarkeitsdatum LEFT JOIN lager_platz ON lager_platz.id=lager_mindesthaltbarkeitsdatum.lager_platz WHERE lager_platz.verbrauchslager='1' AND lager_platz.id = '$regal'"); }else{ // loesche verbrauchslager // aber ebenfalls chargen, seriennummern und mhd $this->app->DB->Delete("DELETE lager_platz_inhalt FROM lager_platz_inhalt INNER JOIN lager_platz ON lager_platz.id=lager_platz_inhalt.lager_platz WHERE lager_platz.verbrauchslager='1'"); //WHERE lager_platz_inhalt.artikel='".$artikel."' AND lager_platz.verbrauchslager='1'"); $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'"); $this->app->DB->Delete("DELETE lager_seriennummern FROM lager_seriennummern INNER JOIN lager_platz ON lager_platz.id=lager_seriennummern.lager_platz WHERE lager_platz.verbrauchslager='1'"); $this->app->DB->Delete("DELETE lager_mindesthaltbarkeitsdatum FROM lager_mindesthaltbarkeitsdatum LEFT JOIN lager_platz ON lager_platz.id=lager_mindesthaltbarkeitsdatum.lager_platz WHERE lager_platz.verbrauchslager='1'"); } } $this->app->erp->ProzessUnlock($fp); } // pruefe ob es artikel noch im lager gibt bzw. ob es eine reservierung gibt function LagerFreieMenge($artikel, $mitautolagersperre = false, $standardlager = 0, $projektlager = 0) { $summe_im_lager = (float)$this->app->DB->Select( sprintf( "SELECT SUM(li.menge) FROM `lager_platz_inhalt` AS `li` LEFT JOIN lager_platz AS lp ON lp.id=li.lager_platz WHERE li.artikel = %d AND lp.sperrlager!='1'".($mitautolagersperre?' AND lp.autolagersperre != 1':''), $artikel ) ); if($summe_im_lager <= 0) { return 0; } $artikel_reserviert = (float)$this->app->DB->Select( "SELECT SUM(lr.menge) FROM `lager_reserviert` AS `lr` WHERE lr.artikel = '{$artikel}' AND (lr.datum >= NOW() OR lr.datum='0000-00-00')"); $restmenge = $summe_im_lager - $artikel_reserviert; if($restmenge <= 0) { return 0; } if($standardlager > 0) { $summe_im_lager_standard = (float)$this->app->DB->Select( sprintf( "SELECT SUM(li.menge) FROM `lager_platz_inhalt` AS `li` INNER JOIN `lager_platz` AS `lp` ON lp.id=li.lager_platz AND lp.lager = %d WHERE li.artikel = %d AND lp.sperrlager != '1'".($mitautolagersperre?' AND lp.autolagersperre != 1':''), $standardlager,$artikel ) ); if($summe_im_lager_standard <= 0) { return 0; } $artikelReserviertAuftrag = (float)$this->app->DB->Select( sprintf( "SELECT SUM(lr.menge) FROM `lager_reserviert` AS `lr` INNER JOIN `auftrag` AS `o` ON lr.objekt LIKE 'auftrag' AND lr.parameter = o.id AND o.standardlager = %d AND o.status = 'freigegeben' WHERE lr.artikel = %d AND (lr.datum>=NOW() OR lr.datum='0000-00-00')", $standardlager, $artikel ) ); $artikelReserviertProduktion = (float)$this->app->DB->Select( sprintf( "SELECT SUM(lr.menge) FROM `lager_reserviert` AS `lr` INNER JOIN `produktion` AS `p` ON lr.objekt LIKE 'produktion' AND lr.parameter = p.id AND p.standardlager = %d AND p.status IN ('freigegeben', 'gestartet') WHERE lr.artikel = %d AND (lr.datum>=NOW() OR lr.datum='0000-00-00')", $standardlager, $artikel ) ); $summe_im_lager_standard -= ($artikelReserviertAuftrag + $artikelReserviertProduktion); if($summe_im_lager_standard <= 0) { return 0; } if($summe_im_lager_standard < $restmenge) { return $summe_im_lager_standard; } } elseif($projektlager > 0) { $summe_im_lager_projekt = (float)$this->app->DB->Select( sprintf( "SELECT SUM(li.menge) FROM `lager_platz_inhalt` AS `li` INNER JOIN `lager_platz` AS `lp` ON lp.id=li.lager_platz INNER JOIN `lager` AS `l` ON lp.lager = l.id AND l.projekt = %d WHERE li.artikel=%d AND lp.sperrlager!='1'".($mitautolagersperre?' AND lp.autolagersperre != 1':''), $projektlager, $artikel ) ); if($summe_im_lager_projekt <= 0) { return 0; } $artikelReserviertProjektAuftrag = (float)$this->app->DB->Select( sprintf( "SELECT SUM(lr.menge) FROM `lager_reserviert` AS `lr` INNER JOIN `auftrag` AS `o` ON lr.objekt LIKE 'auftrag' AND lr.parameter = o.id AND o.projekt = %d AND o.status = 'freigegeben' WHERE lr.artikel = %d AND (lr.datum>=NOW() OR lr.datum='0000-00-00')", $projektlager, $artikel ) ); $artikelReserviertProjektProduktion = (float)$this->app->DB->Select( sprintf( "SELECT SUM(lr.menge) FROM `lager_reserviert` AS `lr` INNER JOIN `produktion` AS `p` ON lr.objekt LIKE 'produktion' AND lr.parameter = p.id AND p.projekt = %d AND p.status IN ('freigegeben', 'gestartet') WHERE lr.artikel = %d AND (lr.datum>=NOW() OR lr.datum='0000-00-00')", $projektlager, $artikel ) ); $summe_im_lager_projekt -= ($artikelReserviertProjektAuftrag + $artikelReserviertProjektProduktion); if($summe_im_lager_projekt <= 0) { return 0; } if($summe_im_lager_projekt < $restmenge) { return $summe_im_lager_projekt; } } return $restmenge; } public function getPreproducedPartlistFromArticle($id) { return $this->app->DB->Select( "SELECT art.preproduced_partlist FROM artikel AS art INNER JOIN artikel art2 ON art.preproduced_partlist = art2.id AND art2.lagerartikel = 1 AND (art2.geloescht = 0 OR art2.geloescht IS NULL) AND art.id != art2.id WHERE art.id = $id AND art.has_preproduced_partlist" ); } public function PreproducedPartlistSellableFrom($id, $projektlager = 0, $shopid = 0, $modus = 0) { if($id <= 0) { return 0; } $preproduced_partlist = $this->getPreproducedPartlistFromArticle($id); if($preproduced_partlist <= 0) { return 0; } return $this->ArtikelAnzahlVerkaufbar($preproduced_partlist, $projektlager, $shopid, $modus); } public function ArtikelAnzahlLagerStueckliste($id, $projektlager = 0, $shopid = 0, $modus = 0) { // gehe stueckliste durch und schaue ob es maximal artikel ist //$offen = $this->app->DB->Select("SELECT SUM(ap.menge) FROM auftrag_position ap LEFT JOIN auftrag a ON a.id=ap.auftrag WHERE ap.artikel='$id' AND a.status='freigegeben'"); if(empty($id)) { return 0; } $artikel = $this->app->DB->SelectArr("SELECT s.* FROM stueckliste s INNER JOIN artikel a ON s.artikel = a.id WHERE s.stuecklistevonartikel='$id' AND s.art!='it' AND a.lagerartikel = 1 and (a.geloescht = 0 OR a.geloescht IS NULL)"); if(empty($artikel)) { return 0; } $offset = $this->PreproducedPartlistSellableFrom($id, $projektlager, $shopid, $modus); $stueck = 0; $kleinste_max_menge = 0; $cartikel = !empty($artikel)?count($artikel):0; for($i=0;$i<$cartikel;$i++) { $artikelid = $artikel[$i]['artikel']; $mengeimlage = (float)$this->app->DB->Select("SELECT SUM(lpi.menge) FROM lager_platz_inhalt lpi INNER JOIN lager_platz lp ON lp.id=lpi.lager_platz WHERE lpi.artikel='$artikelid' AND lp.sperrlager!=1"); $mengereserviert = (float)$this->app->DB->Select("SELECT ifnull(SUM(menge),0) FROM lager_reserviert WHERE artikel='$artikelid'"); $mengeoffen = $modus == 1 ? 0 : (float)$this->app->DB->Select( "SELECT ifnull(SUM(ap.menge),0) FROM `auftrag_position` AS `ap` INNER JOIN `auftrag` AS `a` ON a.id = ap.auftrag WHERE ap.artikel='{$artikelid}' AND a.status='freigegeben'" ); $mengefrei = $mengeimlage - ($mengeoffen > $mengereserviert ? $mengeoffen : $mengereserviert); if($projektlager) { $mengeimlagerprojekt = (float)$this->app->DB->Select("SELECT SUM(lpi.menge) FROM lager_platz_inhalt lpi INNER JOIN lager_platz lp ON lp.id=lpi.lager_platz INNER JOIN lager `lag` ON lp.lager = `lag`.id AND `lag`.projekt = '$projektlager' AND `lag`.geloescht <> 1 WHERE lpi.artikel='$artikelid' AND lp.sperrlager!=1"); $mengereserviertprojekt = (float)$this->app->DB->Select("SELECT ifnull(SUM(r.menge),0) FROM lager_reserviert r INNER JOIN auftrag a ON r.parameter = a.id AND r.objekt = 'auftrag' AND a.status = 'freigegeben' WHERE r.artikel='$artikelid' AND a.projekt = '$projektlager' "); $mengeoffenprojekt = $modus == 1 ? 0 : (float)$this->app->DB->Select( "SELECT ifnull(SUM(ap.menge),0) FROM `auftrag_position` AS `ap` INNER JOIN `auftrag` AS `a` ON a.id = ap.auftrag WHERE ap.artikel='{$artikelid}' AND a.status='freigegeben' AND a.projekt = '{$projektlager}'" ); $mengefreiprojekt = $mengeimlage - ($mengeoffenprojekt > $mengereserviertprojekt?$mengeoffenprojekt:$mengereserviertprojekt); if($mengefreiprojekt < $mengefrei) { $mengefrei = $mengefreiprojekt; } } if($artikel[$i]['menge'] <= 0) { return $offset; } $max_menge = floor($mengefrei/$artikel[$i]['menge']); $collect[] = $max_menge; } sort($collect); $stueck = (float)$collect[0]; if($stueck <= 0) { $stueck=0; } return $stueck+$offset; } function ArtikelAnzahlVerkaufbar($artikelid, $offset = 0, $projektlager = 0, $shopid = 0, $modus=0, $returnArray = false) { $ij=0; if(is_array($artikelid) && isset($artikelid['juststueckliste']) && isset($artikelid['lagerartikel'])) { $articleRow = $artikelid; $artikelid = $artikelid['id']; } else{ $lagerartikel[$ij]['id'] = $artikelid; $articleRow = $this->app->DB->SelectRow( sprintf( 'SELECT id, juststueckliste, lagerartikel FROM artikel WHERE id = %d', $artikelid ) ); } $lagerartikel[$ij]['juststueckliste'] = $articleRow['juststueckliste'];// $this->app->DB->Select("SELECT juststueckliste FROM artikel WHERE id='$artikelid' LIMIT 1"); //$lagerartikel[$ij]['name_de'] = $this->app->DB->Select("SELECT name_de FROM artikel WHERE id='$artikelid' LIMIT 1"); //$lagerartikel[$ij]['nummer'] = $this->app->DB->Select("SELECT nummer FROM artikel WHERE id='$artikelid' LIMIT 1"); //$lagerartikel[$ij]['cache_lagerplatzinhaltmenge'] = $this->app->DB->Select("SELECT cache_lagerplatzinhaltmenge FROM artikel WHERE id='$artikelid' LIMIT 1"); $keinestueckliste = false; if($lagerartikel[$ij]['juststueckliste'] && !$articleRow['lagerartikel']) { $offen = 0; $reserviert = 0; $lagernd = (float)$this->ArtikelAnzahlLagerStueckliste($lagerartikel[$ij]['id'], $projektlager, $shopid, $modus); } elseif($lagerartikel[$ij]['juststueckliste']) { $lagernd = (float)$this->ArtikelAnzahlLagerStueckliste($lagerartikel[$ij]['id'], $projektlager, $shopid, $modus); $offen = (float)$this->ArtikelAnzahlOffene($lagerartikel[$ij]['id'], $projektlager); $reserviert = (float)$this->ArtikelAnzahlReserviert($lagerartikel[$ij]['id'], $projektlager); } else { $lagernd = (float)$this->ArtikelAnzahlLager($lagerartikel[$ij]['id'],0 , $projektlager); $offen = (float)$this->ArtikelAnzahlOffene($lagerartikel[$ij]['id'], $projektlager); $reserviert = (float)$this->ArtikelAnzahlReserviert($lagerartikel[$ij]['id'], $projektlager); $keinestueckliste = true; } $lagermenge = $lagernd; $lagernd += (float)$offset; if($modus==1) // lager minus reservierte { $blockierte_menge = $reserviert; } else { if($offen > $reserviert) { $blockierte_menge = $offen; } else { $blockierte_menge = $reserviert; } } $lagernd -= $blockierte_menge; $berechneterBestand = $lagernd; if($lagernd < 0) { $lagernd = 0; } if($shopid) { $lagernd += (float)$this->GetArtikelShopEinstellung('lagerkorrekturwert', $artikelid, $shopid); } if ($returnArray === false){ return $lagernd; } return [ 'lagernd' => (float)$lagermenge, 'reserviert' => (float)$reserviert, 'offene_auftraege' => (float)$offen, 'offene_bestellungen' => (float)$this->ArtikelAnzahlBestellung($artikelid), 'berechneter_bestand' => (float)$berechneterBestand, 'verkaufbar' => (float)$lagernd, ]; } /** * @param int $shopId * @param int $articleId * * @return array|null */ public function getStorageCacheInfosByShopId(int $shopId, int $articleId) { return $this->app->DB->SelectRow( "SELECT `storage_cache`, `pseudostorage_cache`, `last_storage_transfer`, HOUR(TIMEDIFF(NOW(), `last_storage_transfer`)) AS `last_storage_transfer_hours` FROM `artikel_onlineshops` WHERE `shop` = '{$shopId}' AND `artikel` = '{$articleId}' AND `storage_cache` IS NOT NULL LIMIT 1" ); } /** * @param int $shopId * @param int $articleId * @param int $sellable * @param int $pseudoStorage * * @return bool */ public function isArticleShopCacheDifferent(int $shopId, int $articleId, int $sellable, int $pseudoStorage): bool { $storageCache = $this->app->DB->SelectRow( "SELECT `storage_cache`, `pseudostorage_cache` FROM `artikel_onlineshops` WHERE `shop` = '{$shopId}' AND `artikel` = '{$articleId}' AND `storage_cache` IS NOT NULL LIMIT 1" ); if(empty($storageCache)) { return true; } return $storageCache['storage_cache'] != $sellable || $storageCache['pseudostorage_cache'] != $pseudoStorage; } /** * @param int|array $artikelid * @param bool $print_echo * @param array $shopByIds * * @return string */ public function LagerSync($artikelid, $print_echo=false, $shopByIds = []) { $ij=0; $message = ''; if(!empty($artikelid) && is_array($artikelid) && !empty($artikelid['id'])){ $artikelid = (int)$artikelid['id']; } elseif(!empty($artikelid) && is_array($artikelid)){ $artikelid = (int)reset($artikelid); } if(!is_numeric($artikelid) || $artikelid <= 0){ return ''; } $lagerartikel = $this->app->DB->SelectArr( "SELECT * FROM `artikel` WHERE `id` = '{$artikelid}' LIMIT 1" ); if(empty($lagerartikel)){ return ''; } $bestandalternativartikel = $lagerartikel[$ij]['bestandalternativartikel']; $shops = $this->GetArtikelshops($lagerartikel[$ij]); if(empty($shops)) { return $message; } foreach($shops as $shop) { if($shop <= 0){ continue; } if(!empty($shopByIds[$shop])) { $shopArr = $shopByIds[$shop]; } else { $shopArr = $this->app->DB->SelectRow( "SELECT `id`, `projekt`, `lagergrundlage`, `lagerkorrekturwert`, `ueberschreibe_lagerkorrekturwert` FROM `shopexport` WHERE `id` = '{$shop}' AND `aktiv` = 1 LIMIT 1" ); } if(empty($shopArr) && empty($this->app->DB->error())) { continue; } $shopAricleArr = $this->GetArtikelShopEinstellung('', $lagerartikel[$ij], $shopArr); if(empty($shopAricleArr['autolagerlampe'])) { continue; } if(isset($shopAricleArr['pseudolager']) && trim($shopAricleArr['pseudolager']) !== '') { $pseudolager = !empty($shopAricleArr['pseudolager'])?(float)$shopAricleArr['pseudolager']:0; } else { $pseudolager = 0; } $this->app->erp->RunHook('remote_send_article_list_pseudostorage', 3, $shop, $artikelid, $pseudolager); if(is_numeric($pseudolager) && $pseudolager < 0) { $pseudolager = 0; } $projekt = $shopArr['projekt']; $lagergrundlage = $shopArr['lagergrundlage']; $projektlager = $this->Projektdaten($projekt, 'projektlager'); if($projektlager) { if($bestandalternativartikel) { $verkaufbare_menge = (float)$this->ArtikelAnzahlVerkaufbar($bestandalternativartikel,0,$projekt); $verkaufbare_menge_korrektur = floor($this->ArtikelAnzahlVerkaufbar($bestandalternativartikel,0,$projekt, $shop, $lagergrundlage)); } else{ $verkaufbare_menge = (float)$this->ArtikelAnzahlVerkaufbar($artikelid,0,$projekt); $verkaufbare_menge_korrektur = floor((float)$this->ArtikelAnzahlVerkaufbar($artikelid,0,$projekt, $shop, $lagergrundlage)); } } else{ //$verkaufbare_menge = $verkaufbare_menge_alle; if($bestandalternativartikel) { $verkaufbare_menge = (float)$this->ArtikelAnzahlVerkaufbar($bestandalternativartikel,0,0); $verkaufbare_menge_korrektur = floor((float)$this->ArtikelAnzahlVerkaufbar($bestandalternativartikel,0,0,$shop,$lagergrundlage)); } else{ $verkaufbare_menge = (float)$this->ArtikelAnzahlVerkaufbar($artikelid,0,0); $verkaufbare_menge_korrektur = floor((float)$this->ArtikelAnzahlVerkaufbar($artikelid,0,0,$shop,$lagergrundlage)); } } if($verkaufbare_menge_korrektur < 0) { $verkaufbare_menge_korrektur = 0; } $neuer_status = 'red'; if ($verkaufbare_menge > 0){ $neuer_status = 'gruen (Menge: ' . ($verkaufbare_menge . ' Pseudolager: ' . $pseudolager) . ')'; } $isArticleCacheDifferent = $lagerartikel[$ij]['cache_lagerplatzinhaltmenge'] != ((int) $verkaufbare_menge_korrektur + (int) $pseudolager); $storageCache = $isArticleCacheDifferent ? null : $this->getStorageCacheInfosByShopId((int)$shop, (int)$lagerartikel[$ij]['id']); $hasToSendStock = $isArticleCacheDifferent || $this->isArticleShopCacheDifferent( (int)$shop, (int)$lagerartikel[$ij]['id'], (int)$verkaufbare_menge_korrektur, (int)$pseudolager ); $needUpdateShopStorageCache = $storageCache && !$isArticleCacheDifferent; $isZeroQuantity = (is_numeric($pseudolager) && $pseudolager == 0) || (int)$verkaufbare_menge_korrektur === 0; if( $storageCache !== null && $isZeroQuantity && ($storageCache['last_storage_transfer_hours'] === null || $storageCache['last_storage_transfer_hours'] > 48) ) { $hasToSendStock = true; $needUpdateShopStorageCache = true; } if(!$hasToSendStock) { continue; } if($needUpdateShopStorageCache) { // to prevent loops $this->app->DB->Update( "UPDATE `artikel_onlineshops` SET `last_storage_transfer` = NOW(), `storage_cache` = {$verkaufbare_menge_korrektur} WHERE `artikel` = {$lagerartikel[$ij]['id']} AND `shop` = {$shop}" ); if(is_numeric($pseudolager)) { $this->app->DB->Update( "UPDATE `artikel_onlineshops` SET `pseudostorage_cache` = {$pseudolager} WHERE `artikel` = {$lagerartikel[$ij]['id']} AND `shop` = {$shop}" ); } } $extnummer = null; $anzges = 0; $anzfehler = 0; $result = null; // 1 on success if(!empty($extnummer) && is_array($extnummer)) { foreach($extnummer as $nummer) { $anzges++; try { $result = $this->app->remote->RemoteSendArticleList($shop, array($lagerartikel[$ij]['id']), array($nummer['nummer']), true); } catch(Exception $e) { $this->app->erp->LogFile($this->app->DB->real_escape_string('Lagersync Fehler '.$shop.' '.$nummer['nummer'].' '.$e->getMessage())); $anzfehler++; } } } else{ $anzges++; try { $result = $this->app->remote->RemoteSendArticleList($shop,array($lagerartikel[$ij]['id']),!empty($extnummer)? array($extnummer):'',true); } 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())); $anzfehler++; } } $message .= 'Artikel: '.$lagerartikel[$ij]['name_de'].' ('.$lagerartikel[$ij]['nummer'].') Neuer Status: '.$neuer_status."\r\n"; 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"; } $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( "UPDATE `artikel` SET `laststorage_sync` = NOW() WHERE `id` = {$artikelid}" ); return $message; } // pruefe ob es artikel noch im lager gibt bzw. ob es eine reservierung gibt public function LagerCheck($adresse,$artikel,$menge,$objekt='',$parameter='', $juststorage = false) { $projektlager = 0; $standardlager = 0; if($parameter > 0 && ($objekt==='auftrag' || $objekt==='lieferschein')) { $docArr = $this->app->DB->SelectRow(sprintf('SELECT * FROM `%s` WHERE id=%d LIMIT 1', $objekt, (int)$parameter)); $projekt = $docArr['projekt']; $auftrag = $parameter; if($objekt === 'lieferschein') { $auftrag = $docArr['auftragid']; } if($projekt > 0) { $projectArr = $this->app->DB->SelectRow( sprintf( 'SELECT projektlager, standardlager,kommissionierverfahren FROM projekt WHERE id=%d', $projekt ) ); $kommissionierverfahren= $projectArr['kommissionierverfahren']; if( !($kommissionierverfahren==='lieferscheinlager' || $kommissionierverfahren==='lieferscheinlagerscan' || $kommissionierverfahren==='lieferscheinscan' || $kommissionierverfahren === 'lieferschein') || $this->app->DB->Select('SELECT IFNULL(COUNT(id),0) FROM lager') <= 1 ) { $standardlager = 0; } else { $projektlager = $projectArr['projektlager']; if($objekt==='auftrag' || $objekt === 'lieferschein') { $standardlager = $docArr['standardlager']; } else{ $standardlager = $this->app->DB->Select(sprintf('SELECT standardlager FROM auftrag WHERE id = %d LIMIT 1', (int)$auftrag)); } if($standardlager && !$this->app->DB->Select(sprintf('SELECT id FROM lager WHERE id = %d LIMIT 1', (int)$standardlager))) { $standardlager = $this->app->DB->Select(sprintf('SELECT id FROM lager WHERE id = %d LIMIT 1', (int)$docArr['standardlager'])); } } } } $articleArr = $this->app->DB->SelectRow( sprintf( 'SELECT chargenverwaltung, mindesthaltbarkeitsdatum,seriennummern FROM artikel WHERE id = %d LIMIT 1', $artikel ) ); $isBestBefore = !empty($articleArr['mindesthaltbarkeitsdatum']); $isBatch = !empty($articleArr['chargenverwaltung']); $isSn = !empty($articleArr['seriennummern']) && $articleArr['seriennummern'] !== 'keine'; if($juststorage) { $isBestBefore = false; $isBatch = false; $isSn = false; } if($standardlager > 0) { $summe_im_lager = round( $this->app->DB->Select( sprintf( "SELECT IFNULL(SUM(li.menge),0) FROM lager_platz_inhalt AS li INNER JOIN lager_platz AS lp ON lp.id=li.lager_platz INNER JOIN lager AS lag ON lag.id=lp.lager WHERE li.artikel= %d AND lp.autolagersperre!=1 AND lp.sperrlager!= 1 AND lag.id=%d", (int)$artikel, (int)$standardlager ) ), $this->GetLagerNachkommastellen() ); if($summe_im_lager > 0 && $isBestBefore) { $bestBeforeStorage = round( $this->app->DB->Select( sprintf( "SELECT IFNULL(SUM(li.menge),0) FROM lager_mindesthaltbarkeitsdatum AS li INNER JOIN lager_platz AS lp ON lp.id=li.lager_platz INNER JOIN lager AS lag ON lag.id=lp.lager WHERE li.artikel= %d AND lp.autolagersperre!=1 AND lp.sperrlager!= 1 AND lag.id=%d", (int)$artikel, (int)$standardlager ) ), $this->GetLagerNachkommastellen() ); if($bestBeforeStorage < $summe_im_lager) { $summe_im_lager = $bestBeforeStorage; } }elseif($summe_im_lager > 0 && $isBatch) { $batchStorage = round( $this->app->DB->Select( sprintf( "SELECT IFNULL(SUM(li.menge),0) FROM lager_charge AS li INNER JOIN lager_platz AS lp ON lp.id=li.lager_platz INNER JOIN lager AS lag ON lag.id=lp.lager WHERE li.artikel= %d AND lp.autolagersperre!=1 AND lp.sperrlager!= 1 AND lag.id=%d", (int)$artikel, (int)$standardlager ) ), $this->GetLagerNachkommastellen() ); if($batchStorage < $summe_im_lager) { $summe_im_lager = $batchStorage; } } $artikel_reserviert = round( $this->app->DB->Select( sprintf( "SELECT SUM(menge) FROM lager_reserviert WHERE artikel=%d AND (datum>=NOW() OR datum='0000-00-00')", (int)$artikel ) ), $this->GetLagerNachkommastellen() ); $summe_im_lager_gesamt = round( $this->app->DB->Select( sprintf( "SELECT SUM(li.menge) FROM lager_platz_inhalt AS li LEFT JOIN lager_platz lp ON lp.id=li.lager_platz WHERE li.artikel= %d AND lp.autolagersperre!=1 AND lp.sperrlager!=1", $artikel ) ), $this->GetLagerNachkommastellen() ); }elseif($projektlager > 0) { $summe_im_lager = round( $this->app->DB->Select( sprintf( "SELECT SUM(li.menge) FROM lager_platz_inhalt AS li INNER JOIN lager_platz AS lp ON lp.id=li.lager_platz INNER JOIN lager AS lag ON lag.id=lp.lager WHERE li.artikel=%d AND lp.autolagersperre!=1 AND lp.sperrlager!= 1 AND lag.projekt=%d", (int)$artikel, (int)$projekt ) ), $this->GetLagerNachkommastellen() ); if($summe_im_lager > 0 && $isBestBefore) { $bestBeforeStorage = round( $this->app->DB->Select( sprintf( "SELECT SUM(li.menge) FROM lager_mindesthaltbarkeitsdatum AS li INNER JOIN lager_platz AS lp ON lp.id=li.lager_platz INNER JOIN lager AS lag ON lag.id=lp.lager WHERE li.artikel=%d AND lp.autolagersperre!=1 AND lp.sperrlager!= 1 AND lag.projekt=%d", (int)$artikel, (int)$projekt ) ), $this->GetLagerNachkommastellen() ); if($bestBeforeStorage < $summe_im_lager) { $summe_im_lager = $bestBeforeStorage; } } elseif($summe_im_lager > 0 && $isBatch) { $batchStorage = round( $this->app->DB->Select( sprintf( "SELECT SUM(li.menge) FROM lager_charge AS li INNER JOIN lager_platz AS lp ON lp.id=li.lager_platz INNER JOIN lager AS lag ON lag.id=lp.lager WHERE li.artikel=%d AND lp.autolagersperre!=1 AND lp.sperrlager!= 1 AND lag.projekt=%d", (int)$artikel, (int)$projekt ) ), $this->GetLagerNachkommastellen() ); if($batchStorage < $summe_im_lager) { $summe_im_lager = $batchStorage; } } $artikel_reserviert = round($this->app->DB->Select("SELECT SUM(menge) FROM lager_reserviert WHERE artikel='".$artikel."' AND projekt='$projekt' AND (datum>=NOW() OR datum='0000-00-00')"),$this->GetLagerNachkommastellen()); } else { $summe_im_lager = round( $this->app->DB->Select( sprintf( "SELECT SUM(li.menge) FROM lager_platz_inhalt AS li LEFT JOIN lager_platz lp ON lp.id=li.lager_platz WHERE li.artikel= %d AND lp.autolagersperre!=1 AND lp.sperrlager!=1", $artikel ) ), $this->GetLagerNachkommastellen() ); if($summe_im_lager > 0 && $isBestBefore) { $bestBeforeStorage = round( $this->app->DB->Select( sprintf( "SELECT SUM(li.menge) FROM lager_mindesthaltbarkeitsdatum AS li LEFT JOIN lager_platz AS lp ON lp.id=li.lager_platz WHERE li.artikel= %d AND lp.autolagersperre!=1 AND lp.sperrlager!=1", $artikel ) ), $this->GetLagerNachkommastellen() ); if($bestBeforeStorage < $summe_im_lager) { $summe_im_lager = $bestBeforeStorage; } }elseif($summe_im_lager > 0 && $isBatch) { $batchStorage = round( $this->app->DB->Select( sprintf( "SELECT SUM(li.menge) FROM lager_charge AS li LEFT JOIN lager_platz AS lp ON lp.id=li.lager_platz WHERE li.artikel= %d AND lp.autolagersperre!=1 AND lp.sperrlager!=1", $artikel ) ), $this->GetLagerNachkommastellen() ); if($batchStorage < $summe_im_lager) { $summe_im_lager = $batchStorage; } } $artikel_reserviert = round($this->app->DB->Select("SELECT SUM(menge) FROM lager_reserviert WHERE artikel='".$artikel."' AND (datum>=NOW() OR datum='0000-00-00')"),$this->GetLagerNachkommastellen()); } // wenn es reservierungen fuer den Auftrag gibt if($objekt!='') { // auftrag reservierungen $artikel_fuer_adresse_reserviert = round($this->app->DB->Select("SELECT SUM(menge) FROM lager_reserviert WHERE artikel='".$artikel."' ".($adresse > 0?" AND adresse='$adresse'":'')." AND ((objekt='$objekt' AND parameter='$parameter')".($objekt==='lieferschein' && $auftrag > 0?" OR (objekt='auftrag' AND parameter = '$auftrag') ":'').") AND (datum>=NOW() OR datum='0000-00-00')"),$this->GetLagerNachkommastellen()); } else { $artikel_fuer_adresse_reserviert = round($this->app->DB->Select("SELECT SUM(menge) FROM lager_reserviert WHERE artikel='".$artikel."' ".($adresse > 0?" AND adresse='$adresse'":'')." AND (datum>=NOW() OR datum='0000-00-00') AND objekt!='lieferschein'"),$this->GetLagerNachkommastellen()); } if(round(($summe_im_lager - ($artikel_reserviert -$artikel_fuer_adresse_reserviert)),8) >= round($menge,8)) { return 1; } if($standardlager) { $nichtStandardlager = round($summe_im_lager_gesamt - $summe_im_lager,8); if($nichtStandardlager > 0 ) { $artikel_reserviert -= $nichtStandardlager; if($artikel_reserviert < 0) { $artikel_reserviert = 0; } if(round(($summe_im_lager - ($artikel_reserviert -$artikel_fuer_adresse_reserviert)),8) >= round($menge,8)) { return 1; } } } if($objekt === 'auftrag' && $artikel_fuer_adresse_reserviert > 0) { if($summe_im_lager >= $artikel_fuer_adresse_reserviert) { $gesamte_menge_im_auftrag= $this->app->DB->Select("SELECT SUM(menge-geliefert_menge) FROM auftrag_position WHERE auftrag='$parameter' AND artikel='$artikel'"); if($artikel_fuer_adresse_reserviert >= $menge && $artikel_fuer_adresse_reserviert >= $gesamte_menge_im_auftrag && $summe_im_lager >= $gesamte_menge_im_auftrag){ return true; } } } elseif($objekt === 'lieferschein' && $artikel_fuer_adresse_reserviert > 0) { if($summe_im_lager >= $artikel_fuer_adresse_reserviert) { $gesamte_menge_im_auftrag= $this->app->DB->Select("SELECT SUM(menge-geliefert) FROM lieferschein_position WHERE lieferschein='$parameter' AND artikel='$artikel'"); if($artikel_fuer_adresse_reserviert >= $menge && $artikel_fuer_adresse_reserviert >= $gesamte_menge_im_auftrag && $summe_im_lager >= $gesamte_menge_im_auftrag){ return true; } } } return 0; } function AngebotSuche($parsetarget) { $treffer = $this->app->Secure->GetPOST("treffer"); if($treffer > 0 ) { $_SESSION['angebottreffer'] = $treffer; $_SESSION['page'] = 1; } else if(!isset($_SESSION['angebottreffer']) || $_SESSION['angebottreffer'] <= 0) $_SESSION['angebottreffer'] = 10; $this->app->Tpl->Set('TREFFER',$_SESSION['angebottreffer']); $suchwort= $this->app->Secure->GetPOST("suchwort"); $name= $this->app->Secure->GetPOST("name"); $plz= $this->app->Secure->GetPOST("plz"); $angebot= $this->app->Secure->GetPOST("angebot"); $kundennummer= $this->app->Secure->GetPOST("kundennummer"); $_SESSION['angebotsuchwort']=$suchwort; //$this->app->Tpl->Set(SUCHWORT,$_SESSION[angebotsuchwort]); $_SESSION['angebotname']=$name; $this->app->Tpl->Set('NAME',$_SESSION['angebotname']); $_SESSION['angebotplz']=$plz; $this->app->Tpl->Set('PLZ',$_SESSION['angebotplz']); $_SESSION['angebotangebot']=$angebot; $this->app->Tpl->Set('ANGEBOT',$_SESSION['angebotangebot']); $_SESSION['angebotkundennummer']=$kundennummer; $this->app->Tpl->Set('KUNDENNUMMER',$_SESSION['angebotkundennummer']); $suche = $this->app->Secure->GetPOST("suche"); //$this->app->YUI->AutoComplete(PROJEKTAUTO,"projekt",array('name','abkuerzung'),"abkuerzung"); if(($_SESSION['angebotsuchwort']!='' || $_SESSION['angebotname']!='' || $_SESSION['angebotplz']!='' || $_SESSION['angebotangebot']!='' || $_SESSION['angebotkundennummer']!='') && $suche!=""){ //Jeder der in Nachbesserung war egal ob auto oder manuell wandert anschliessend in Manuelle-Freigabe"); if($suchwort!="") { return "SELECT DATE_FORMAT(a.datum,'%d.%m.%y') as vom, if(a.belegnr,a.belegnr,'ohne Nummer') as Angebot, ad.kundennummer as kunde, a.name, p.abkuerzung as projekt, a.status, a.id FROM angebot a, projekt p, adresse ad WHERE (a.plz LIKE '%$suchwort%' OR a.name LIKE '%$suchwort%' OR a.belegnr LIKE '%$suchwort%') AND p.id=a.projekt AND a.adresse=ad.id order by a.datum DESC, a.id DESC"; } else { return "SELECT DATE_FORMAT(a.datum,'%d.%m.%y') as vom, if(a.belegnr,a.belegnr,'ohne Nummer') as Angebot, ad.kundennummer as kunde, a.name, p.abkuerzung as projekt, a.status, a.id FROM angebot a, projekt p, adresse ad WHERE (ad.kundennummer LIKE '%{$_SESSION['angebotkundennummer']}%' AND a.plz LIKE '%{$_SESSION['angebotplz']}%' AND a.name LIKE '%{$_SESSION['angebotname']}%' AND a.belegnr LIKE '%{$_SESSION['angebotangebot']}%' ) AND p.id=a.projekt AND a.adresse=ad.id order by a.datum DESC, a.id DESC"; } /* return ("SELECT DISTINCT a.nummer, a.name_de as Artikel, p.abkuerzung, a.id FROM artikel a LEFT JOIN projekt p ON p.id=a.projekt WHERE a.name_de LIKE '%$name%' AND a.nummer LIKE '$nummer%'AND p.abkuerzung LIKE '%$projekt%' AND geloescht='0' ORDER by a.id DESC"); */ // SELECT DISTINCT a.name, a.ort, a.telefon, a.email, a.id // FROM adresse a LEFT JOIN adresse_rolle r ON a.id=r.adresse WHERE r.subjekt='Kunde' ORDER by a.id DESC } else { return "SELECT DATE_FORMAT(a.datum,'%d.%m.%y') as vom, if(a.belegnr,a.belegnr,'ohne Nummer') as Angebot, ad.kundennummer as kunde, a.name, p.abkuerzung as projekt, a.status, a.id FROM angebot a, projekt p, adresse ad WHERE p.id=a.projekt AND a.adresse=ad.id order by a.datum DESC, a.id DESC"; } //$this->app->Tpl->Set(INHALT,""); } function WebmailSuche($parsetarget,$rolle) { $suche = $this->app->Secure->GetPOST("suche"); $name = $this->app->Secure->GetPOST("name"); $this->app->Tpl->Set('SUCHENAME',$name); $nummer = $this->app->Secure->GetPOST("nummer"); $this->app->Tpl->Set('SUCHENUMMER',$nummer); $typ = $this->app->Secure->GetPOST("typ"); $this->app->YUI->AutoComplete('PROJEKTAUTO',"projekt",array('name','abkuerzung'),"abkuerzung"); $projekt = $this->app->Secure->GetPOST("projekt"); $this->app->Tpl->Set('SUCHEPROJEKT',$projekt); $limit = $this->app->Secure->GetPOST("limit"); if($limit=="" || $limit ==0) $limit=10; $this->app->Tpl->Set('SUCHELIMIT',$limit); if($name!='' && $suche!='') { $_SESSION['name_webmailsuche'] = $name; } elseif ($suche!="" && $name=='') $_SESSION['name_webmailsuche'] = ''; if($name=='' && $suche!='') { $_SESSION['name_artikel'] = $name; } $_SESSION['nummer'] = $nummer; $_SESSION['projekt'] = $projekt; $adresse = $this->app->User->getAdresse(); if($name==""){ $name = $_SESSION['name_webmailsuche']; $this->app->Tpl->Set('SUCHENAME',$name);} if($nummer==""){$nummer= $_SESSION['nummer']; $this->app->Tpl->Set('SUCHENUMMER',$nummer);} if($projekt==""){$projekt= $_SESSION['projekt']; $this->app->Tpl->Set('SUCHEPROJEKT',$projekt);} if($name!="" || $nummer!="" || $projekt!="") $suche ="suche"; $this->app->Tpl->Parse($parsetarget,"webmailsuche.tpl"); if(($name!="" || $nummer!="" || $projekt!="") && $suche!=""){ return("SELECT DATE_FORMAT(e.empfang,'%d.%m.%Y %H:%i') as zeit,CONCAT(LEFT(e.subject,30),'...') as betreff, e.sender,e.id FROM emailbackup_mails e WHERE e.webmail IN (SELECT id FROM emailbackup WHERE emailbackup.adresse = '$adresse' AND emailbackup.geloescht!=1) AND e.sender LIKE '%$name%' AND e.subject LIKE '$nummer%' ORDER BY e.empfang DESC"); //p.abkuerzung LIKE '%$projekt%' //Jeder der in Nachbesserung war egal ob auto oder manuell wandert anschliessend in Manuelle-Freigabe"); /* return("SELECT DATE_FORMAT(tn.zeit,'%d.%m.%Y %H:%i') as zeit,CONCAT(LEFT(tn.betreff,30),'...') as betreff, t.kunde, p.abkuerzung, tn.id FROM ticket_nachricht tn LEFT JOIN ticket t ON t.schluessel=tn.ticket LEFT JOIN projekt p ON p.id=t.projekt WHERE t.kunde LIKE '%$name%' AND tn.betreff LIKE '$nummer%'AND p.abkuerzung LIKE '%$projekt%' ORDER by tn.zeit DESC"); */ // SELECT DISTINCT a.name, a.ort, a.telefon, a.email, a.id // FROM adresse a LEFT JOIN adresse_rolle r ON a.id=r.adresse WHERE r.subjekt='Kunde' ORDER by a.id DESC // $table->Display(INHALT,"auftrag","kundeuebernehmen","In Auftrag einfügen"); } else { return "SELECT DATE_FORMAT(e.empfang,'%d.%m.%Y %H:%i') as zeit,CONCAT(LEFT(e.subject,30),'...') as betreff, e.sender,e.id FROM emailbackup_mails e WHERE webmail IN (SELECT id FROM emailbackup WHERE emailbackup.adresse = '$adresse' AND emailbackup.geloescht!=1) ORDER BY e.empfang DESC"; // return "SELECT DATE_FORMAT(e.empfang,'%d.%m.%Y %H:%i') as zeit,CONCAT(LEFT(e.subject,30),'...') as betreff, e.sender, // e.id FROM emailbackup_mails e WHERE // ORDER by e.empfang DESC"; } //$this->app->Tpl->Set(INHALT,""); } function TicketArchivSuche($parsetarget,$rolle) { /** @var Ticket $obj */ $obj = $this->LoadModul('ticket'); if(!empty($obj) && method_exists($obj, 'TicketArchivSuche')) { return $obj->TicketArchivSuche($parsetarget,$rolle); } } function ArtikelSuche($parsetarget,$rolle) { $suche = $this->app->Secure->GetPOST("suche"); $suchwort= $this->app->Secure->GetPOST("suchwort"); /* Auftrage fuer manuelle freigabe */ $name = $this->app->Secure->GetPOST("name"); $this->app->Tpl->Set('SUCHENAME',$name); $nummer = $this->app->Secure->GetPOST("nummer"); $this->app->Tpl->Set('SUCHENUMMER',$nummer); $typ = $this->app->Secure->GetPOST("typ"); $this->app->YUI->AutoComplete('PROJEKTAUTO',"projekt",array('name','abkuerzung'),"abkuerzung"); $projekt = $this->app->Secure->GetPOST("projekt"); $this->app->Tpl->Set('SUCHEPROJEKT',$projekt); $limit = $this->app->Secure->GetPOST("limit"); if($limit=="" || $limit ==0) $limit=10; $this->app->Tpl->Set('SUCHELIMIT',$limit); if($name!="" && $suche!="") { $_SESSION['name_artikel'] = $name; } elseif ($suche!="" && $name=="") $_SESSION['name_artikel'] = ""; if($name=="" && $suche!="") { $_SESSION['name_artikel'] = $name; } $_SESSION['nummer'] = $nummer; $_SESSION['projekt'] = $projekt; if($name==""){ $name = $_SESSION['name_artikel']; $this->app->Tpl->Set('SUCHENAME',$name);} if($nummer==""){$nummer= $_SESSION['nummer']; $this->app->Tpl->Set('SUCHENUMMER',$nummer);} if($projekt==""){$projekt= $_SESSION['projekt']; $this->app->Tpl->Set('SUCHEPROJEKT',$projekt);} if($name!="" || $nummer!="" || $projekt!="") $suche ="suche"; $this->app->Tpl->Parse($parsetarget,"artikelsuche.tpl"); if(($name!="" || $nummer!="" || $projekt!="" || $suchwort!="") && $suche!=""){ if($suchwort!="") { return ("SELECT DISTINCT a.nummer, a.name_de as Artikel, p.abkuerzung, a.id FROM artikel a LEFT JOIN projekt p ON p.id=a.projekt WHERE (a.name_de LIKE '%$suchwort%' OR a.nummer LIKE '%$suchwort%') AND geloescht='0' ORDER by a.id DESC"); } else { return ("SELECT DISTINCT a.nummer, a.name_de as Artikel, p.abkuerzung, a.id FROM artikel a LEFT JOIN projekt p ON p.id=a.projekt WHERE a.name_de LIKE '%$name%' AND a.nummer LIKE '%$nummer%' AND p.abkuerzung LIKE '%$projekt%' AND a.geloescht='0' ORDER by a.id DESC"); } //Jeder der in Nachbesserung war egal ob auto oder manuell wandert anschliessend in Manuelle-Freigabe"); // SELECT DISTINCT a.name, a.ort, a.telefon, a.email, a.id // FROM adresse a LEFT JOIN adresse_rolle r ON a.id=r.adresse WHERE r.subjekt='Kunde' ORDER by a.id DESC // $table->Display(INHALT,"auftrag","kundeuebernehmen","In Auftrag einfügen"); } else { return "SELECT DISTINCT a.nummer, a.name_de as Artikel, p.abkuerzung, a.id FROM artikel a LEFT JOIN projekt p ON p.id=a.projekt WHERE a.geloescht='0' ORDER by a.id DESC"; } //$this->app->Tpl->Set(INHALT,""); } function AdressSuche($parsetarget,$rolle) { $suche = $this->app->Secure->GetPOST("suche"); /* Auftrage fuer manuelle freigabe */ if($rolle!="") $this->app->Tpl->Set('SUBHEADING',"$rolle suchen"); else $this->app->Tpl->Set('SUBHEADING',"Adresse suchen"); $name = $this->app->Secure->GetPOST("name"); $this->app->Tpl->Set('SUCHENAME',$name); $typ = $this->app->Secure->GetPOST("typ"); $ansprechpartner = $this->app->Secure->GetPOST("ansprechpartner"); $this->app->Tpl->Set('SUCHEANSPRECHPARTNER',$ansprechpartner); $abteilung= $this->app->Secure->GetPOST("abteilung"); $unterabteilung= $this->app->Secure->GetPOST("unterabteilung"); $adresszusatz= $this->app->Secure->GetPOST("adresszusatz"); $email= $this->app->Secure->GetPOST("email"); $telefon= $this->app->Secure->GetPOST("telefon"); $telefax= $this->app->Secure->GetPOST("telefax"); $ustid= $this->app->Secure->GetPOST("ustid"); $land= $this->app->Secure->GetPOST("land"); $plz= $this->app->Secure->GetPOST("plz"); $this->app->Tpl->Set('SUCHEPLZ',$plz); $ort= $this->app->Secure->GetPOST("ort"); $this->app->Tpl->Set('SUCHEORT',$ort); $strasse= $this->app->Secure->GetPOST("strasse"); $this->app->Tpl->Set('SUCHESTRASSE',$strasse); $kundennummer= $this->app->Secure->GetPOST("kundennummer"); $this->app->Tpl->Set('KUNDENNUMMER',$kundennummer); if($name!="" && $suche!="") { $_SESSION['name'] = $name; } elseif ($suche!="" && $name=="") $_SESSION['name'] = ""; if($name=="" && $suche!="") { $_SESSION['name'] = $name; } $_SESSION['ort'] = $ort; $_SESSION['plz'] = $plz; if($name==""){ $name = $_SESSION['name']; $this->app->Tpl->Set('SUCHENAME',$name);} if($ort==""){$ort= $_SESSION['ort']; $this->app->Tpl->Set('SUCHEORT',$ort);} if($plz==""){$plz= $_SESSION['plz']; $this->app->Tpl->Set('SUCHEPLZ',$plz);} if($name!="" || $ort!="" || $plz!="") $suche ="suche"; $this->app->Tpl->Parse($parsetarget,"kundensuche.tpl"); if(($name!="" || $kundennummer!="" || $strasse!="" || $ort!="" || $plz!="") && $suche!=""){ //Jeder der in Nachbesserung war egal ob auto oder manuell wandert anschliessend in Manuelle-Freigabe"); return ("SELECT DISTINCT a.kundennummer, a.name, a.ort, a.telefon, a.email, a.id FROM adresse a LEFT JOIN adresse_rolle r ON a.id=r.adresse WHERE a.name LIKE '%$name%' AND a.ansprechpartner LIKE '%$ansprechpartner%' AND a.ort LIKE '%$ort%' AND a.strasse LIKE '%$strasse%' AND a.kundennummer LIKE '%$kundennummer%' AND a.plz LIKE '%$plz%' AND a.geloescht=0 ORDER by a.id DESC"); //a.plz LIKE '%$plz%' AND r.subjekt='$rolle' ORDER by a.id DESC"); // SELECT DISTINCT a.name, a.ort, a.telefon, a.email, a.id // FROM adresse a LEFT JOIN adresse_rolle r ON a.id=r.adresse WHERE r.subjekt='Kunde' ORDER by a.id DESC // $table->Display(INHALT,"auftrag","kundeuebernehmen","In Auftrag einfügen"); } else { return "SELECT DISTINCT a.name, a.ort, a.telefon, a.email, a.id FROM adresse a WHERE a.geloescht=0 ORDER by a.name ASC"; //FROM adresse a LEFT JOIN adresse_rolle r ON a.id=r.adresse WHERE r.subjekt='$rolle' ORDER by a.id DESC"; } //$this->app->Tpl->Set(INHALT,""); } function string2array ($string, $template){ //#search defined dividers preg_match_all ("|%(.+)%|U", $template, $template_matches); //#replace dividers with "real dividers" $template = preg_replace ("|%(.+)%|U", "(.+)", $template); //#search matches preg_match ("|" . $template . "|", $string, $string_matches); //#[template_match] => $string_match foreach ($template_matches[1] as $key => $value){ $output[$value] = $string_matches[($key + 1)]; } return $output; } function SelectLaenderliste($selected="") { if($selected=="") $selected=$this->Firmendaten("land"); $laender = $this->GetSelectLaenderliste(true); $options = ''; foreach ($laender as $land => $kuerzel) { $options = $options."\n"; } return $options; } function GetSelectStaatenliste($land = 'DE', $staatenliste=false){ switch ($land) { case 'DE': $staaten = array( 'Baden-Württemberg' => 'BW', 'Bayern' => 'BY', 'Berlin' => 'BE', 'Brandenburg' => 'BB', 'Bremen' => 'HB', 'Hamburg' => 'HH', 'Hessen' => 'HE', 'Mecklenburg-Vorpommern' => 'MV', 'Niedersachsen' => 'NI', 'Nordrhein-Westfalen' => 'NW', 'Rheinland-Pfalz' => 'RP', 'Saarland' => 'SL', 'Sachsen' => 'SN', 'Sachsen-Anhalt' => 'ST', 'Schleswig-Holstein' => 'SH', 'Thüringen' => 'TH' ); break; case 'AT': $staaten = array( 'Burgenland' => '01', 'Kärnten' => '02', 'Niederösterreich' => '03', 'Oberösterreich' => '04', 'Salzburg' => '05', 'Steiermark' => '06', 'Tirol' => '07', 'Vorarlberg' => '08', 'Wien' => '09' ); break; case 'CH': $staaten = array( 'Aargau' => 'AG', 'Appenzell Ausserrhoden' => 'AR', 'Appenzell Innerrhoden' => 'AI', 'Basel-Landschaft' => 'BL', 'Basel-Stadt' => 'BS', 'Bern' => 'BE', 'Freiburg' => 'FR', 'Genf' => 'GE', 'Glarus' => 'GL', 'Graubünden' => 'GR', 'Jura' => 'JU', 'Luzern' => 'LU', 'Neuenburg' => 'NE', 'Nidwalden' => 'NW', 'Obwalden' => 'OW', 'Schaffhausen' => 'SH', 'Schwyz' => 'SZ', 'Solothurn' => 'SO', 'St. Gallen' => 'SG', 'Tessin' => 'TI', 'Thurgau' => 'TG', 'Uri' => 'UR', 'Waadt' => 'VD', 'Wallis' => 'VS', 'Zug' => 'ZG', 'Zürich' => 'ZH' ); break; case 'CA': $staaten = array( 'Alberta' => 'AB', 'British Columbia' => 'BC', 'Manitoba' => 'MB', 'Neufundland und Labrador' => 'NL', 'New Brunswick' => 'NB', 'Nordwest-Territorien' => 'NT', 'Nova Scotia' => 'NS', 'Nunavut' => 'NU', 'Ontario' => 'ON', 'Prince Edward Island' => 'PE', 'Quebéc' => 'QC', 'Saskatchewan' => 'SK', 'Yukon' => 'YT' ); break; case 'US': $staaten = array( 'Alabama' => 'AL', 'Alaska' => 'AK', 'Arizona' => 'AZ', 'Arkansas' => 'AR', 'Colorado' => 'CO', 'Connecticut' => 'CT', 'Delaware' => 'DE', 'Florida' => 'FL', 'Georgia' => 'GA', 'Hawaii' => 'HI', 'Idaho' => 'ID', 'Illinois' => 'IL', 'Indiana' => 'IN', 'Iowa' => 'IA', 'Kalifornien' => 'CA', 'Kansas' => 'KS', 'Kentucky' => 'KY', 'Louisiana' => 'LA', 'Maine' => 'ME', 'Maryland' => 'MD', 'Massachusetts' => 'MA', 'Michigan' => 'MI', 'Minnesota' => 'MN', 'Mississippi' => 'MS', 'Missouri' => 'MO', 'Montana' => 'MT', 'Nebraska' => 'NE', 'Nevada' => 'NV', 'New Hampshire' => 'NH', 'New Jersey' => 'NJ', 'New Mexico' => 'NM', 'New York' => 'NY', 'North Carolina' => 'NC', 'North Dakota' => 'ND', 'Ohio' => 'OH', 'Oklahoma' => 'OK', 'Oregon' => 'OR', 'Pennsylvania' => 'PA', 'Rhode Island' => 'RI', 'South Carolina' => 'SC', 'South Dakota' => 'SD', 'Tennessee' => 'TN', 'Texas' => 'TX', 'Utah' => 'UT', 'Vermont' => 'VT', 'Virginia' => 'VA', 'Washington' => 'WA', 'West Virginia' => 'WV', 'Wisconsin' => 'WI', 'Wyoming' => 'WY' ); break; } $Values = array(); /* while(list($Key,$Val) = each($staaten)) $Values[$Val] = $Key; */ foreach($staaten as $Key => $Val) { $$Values[$Val] = $Key; } if($staatenliste) return $staaten; else return $Values; } function FindISOCountry($country) { if(strlen($country)==2) return $country; $check = $this->GetSelectLaenderliste(); foreach($check as $iso=>$countryname) { if(strtolower($countryname)===strtolower($country)) return $iso; } $check = $this->GetSelectLaenderlisteEN(); foreach($check as $iso=>$countryname) { if(strtolower($countryname)===strtolower($country)) return $iso; } return -1; } /** * @param bool $laenderliste * * @return array */ public function GetSelectLaenderliste($laenderliste=false) { if($laenderliste) { $tmp = $this->app->DB->SelectPairs( 'SELECT bezeichnung_de, iso FROM laender ORDER BY bezeichnung_de' ); } else { $tmp = $this->app->DB->SelectPairs( 'SELECT iso, bezeichnung_de FROM laender ORDER BY bezeichnung_de' ); } if(!empty($tmp)) { return $tmp; } $laender = array( 'Afghanistan' => 'AF', 'Ägypten' => 'EG', 'Albanien' => 'AL', 'Algerien' => 'DZ', 'Amerikanische Jungferninseln' => 'VI', 'Andorra' => 'AD', 'Angola' => 'AO', 'Anguilla' => 'AI', 'Antarktis' => 'AQ', 'Antigua und Barbuda' => 'AG', 'Äquatorialguinea' => 'GQ', 'Argentinien' => 'AR', 'Armenien' => 'AM', 'Aruba' => 'AW', 'Aserbaidschan' => 'AZ', 'Äthiopien' => 'ET', 'Australien' => 'AU', 'Bahamas' => 'BS', 'Bahrain' => 'BH', 'Bangladesch' => 'BD', 'Barbados' => 'BB', 'Belgien' => 'BE', 'Belize' => 'BZ', 'Benin' => 'BJ', 'Bermuda' => 'BM', 'Bhutan' => 'BT', 'Bolivien' => 'BO', 'Bosnien und Herzegowina' => 'BA', 'Botswana' => 'BW', 'Bouvetinsel' => 'BV', 'Brasilien' => 'BR', 'Britisch-Indischer Ozean' => 'IO', 'Britische Jungferninseln' => 'VG', 'Brunei Darussalam' => 'BN', 'Bulgarien' => 'BG', 'Burkina Faso' => 'BF', 'Burundi' => 'BI', 'Chile' => 'CL', 'China' => 'CN', 'Cookinseln' => 'CK', 'Costa Rica' => 'CR', 'Dänemark' => 'DK', 'Deutschland' => 'DE', 'Dominica' => 'DM', 'Dominikanische Republik' => 'DO', 'Dschibuti' => 'DJ', 'Ecuador' => 'EC', 'El Salvador' => 'SV', 'Elfenbeinküste' => 'CI', 'Eritrea' => 'ER', 'Estland' => 'EE', 'Falklandinseln' => 'FK', 'Färöer Inseln' => 'FO', 'Fidschi' => 'FJ', 'Finnland' => 'FI', 'Frankreich' => 'FR', 'Französisch-Guayana' => 'GF', 'Französisch-Polynesien' => 'PF', 'Französisches Süd-Territorium' => 'TF', 'Gabun' => 'GA', 'Gambia' => 'GM', 'Georgien' => 'GE', 'Ghana' => 'GH', 'Gibraltar' => 'GI', 'Grenada' => 'GD', 'Griechenland' => 'GR', 'Grönland' => 'GL', 'Großbritannien' => 'GB', 'Guadeloupe' => 'GP', 'Guam' => 'GU', 'Guatemala' => 'GT', 'Guinea' => 'GN', 'Guinea-Bissau' => 'GW', 'Guyana' => 'GY', 'Haiti' => 'HT', 'Heard und McDonaldinseln' => 'HM', 'Honduras' => 'HN', 'Hongkong' => 'HK', 'Indien' => 'IN', 'Indonesien' => 'ID', 'Irak' => 'IQ', 'Iran' => 'IR', 'Irland' => 'IE', 'Island' => 'IS', 'Israel' => 'IL', 'Italien' => 'IT', 'Jamaika' => 'JM', 'Japan' => 'JP', 'Jemen' => 'YE', 'Jordanien' => 'JO', 'Kaimaninseln' => 'KY', 'Kambodscha' => 'KH', 'Kamerun' => 'CM', 'Kanada' => 'CA', 'Kap Verde' => 'CV', 'Kasachstan' => 'KZ', 'Katar' => 'QA', 'Kenia' => 'KE', 'Kirgisistan' => 'KG', 'Kiribati' => 'KI', 'Kokosinseln' => 'CC', 'Kolumbien' => 'CO', 'Komoren' => 'KM', 'Kongo' => 'CG', 'Kongo, Demokratische Republik' => 'CD', 'Kosovo' => 'XK', 'Kroatien' => 'HR', 'Kuba' => 'CU', 'Kuwait' => 'KW', 'Laos' => 'LA', 'Lesotho' => 'LS', 'Lettland' => 'LV', 'Libanon' => 'LB', 'Liberia' => 'LR', 'Libyen' => 'LY', 'Liechtenstein' => 'LI', 'Litauen' => 'LT', 'Luxemburg' => 'LU', 'Macau' => 'MO', 'Madagaskar' => 'MG', 'Malawi' => 'MW', 'Malaysia' => 'MY', 'Malediven' => 'MV', 'Mali' => 'ML', 'Malta' => 'MT', 'Marianen' => 'MP', 'Marokko' => 'MA', 'Marshallinseln' => 'MH', 'Martinique' => 'MQ', 'Mauretanien' => 'MR', 'Mauritius' => 'MU', 'Mayotte' => 'YT', 'Mazedonien' => 'MK', 'Mexiko' => 'MX', 'Mikronesien' => 'FM', 'Moldawien' => 'MD', 'Monaco' => 'MC', 'Mongolei' => 'MN', 'Montenegro' => 'ME', 'Montserrat' => 'MS', 'Mosambik' => 'MZ', 'Myanmar' => 'MM', 'Namibia' => 'NA', 'Nauru' => 'NR', 'Nepal' => 'NP', 'Neukaledonien' => 'NC', 'Neuseeland' => 'NZ', 'Nicaragua' => 'NI', 'Niederlande' => 'NL', 'Niger' => 'NE', 'Nigeria' => 'NG', 'Niue' => 'NU', 'Nordkorea' => 'KP', 'Norfolkinsel' => 'NF', 'Norwegen' => 'NO', 'Oman' => 'OM', 'Österreich' => 'AT', 'Pakistan' => 'PK', 'Palästina' => 'PS', 'Palau' => 'PW', 'Panama' => 'PA', 'Papua-Neuguinea' => 'PG', 'Paraguay' => 'PY', 'Peru' => 'PE', 'Philippinen' => 'PH', 'Pitcairninseln' => 'PN', 'Polen' => 'PL', 'Portugal' => 'PT', 'Puerto Rico' => 'PR', 'Réunion' => 'RE', 'Ruanda' => 'RW', 'Rumänien' => 'RO', 'Russland' => 'RU', 'Salomonen' => 'SB', 'Sambia' => 'ZM', 'Samoa, amerikanisch' => 'AS', 'Samoa' => 'WS', 'San Marino' => 'SM', 'São Tomé und Príncipe' => 'ST', 'Saudi-Arabien' => 'SA', 'Schweden' => 'SE', 'Schweiz' => 'CH', 'Senegal' => 'SN', 'Serbien' => 'RS', 'Seychellen' => 'SC', 'Sierra Leone' => 'SL', 'Simbabwe' => 'ZW', 'Singapur' => 'SG', 'Slowakei' => 'SK', 'Slowenien' => 'SI', 'Somalia' => 'SO', 'Südgeorgien, südliche Sandwichinseln' => 'GS', 'Spanien' => 'ES', 'Sri Lanka' => 'LK', 'St. Helena' => 'SH', 'St. Kitts und Nevis' => 'KN', 'St. Lucia' => 'LC', 'St. Pierre und Miquelon' => 'PM', 'St. Vincent und die Grenadinen' => 'VC', 'Südkorea' => 'KR', 'Südafrika' => 'ZA', 'Sudan' => 'SD', 'Suriname' => 'SR', 'Svalbard und Jan Mayen' => 'SJ', 'Swasiland' => 'SZ', 'Syrien' => 'SY', 'Tadschikistan' => 'TJ', 'Taiwan' => 'TW', 'Tansania' => 'TZ', 'Thailand' => 'TH', 'Togo' => 'TG', 'Tokelau' => 'TK', 'Tonga' => 'TO', 'Trinidad und Tobago' => 'TT', 'Tschad' => 'TD', 'Tschechien' => 'CZ', 'Tunesien' => 'TN', 'Türkei' => 'TR', 'Turkmenistan' => 'TM', 'Turks- und Caicosinseln' => 'TC', 'Tuvalu' => 'TV', 'Uganda' => 'UG', 'Ukraine' => 'UA', 'Ungarn' => 'HU', 'Uruguay' => 'UY', 'Usbekistan' => 'UZ', 'Vanuatu' => 'VU', 'Vatikanstadt' => 'VA', 'Venezuela' => 'VE', 'Vereinigte Arabische Emirate' => 'AE', 'Vereinigtes Königreich' => 'UK', 'Vereinigte Staaten von Amerika' => 'US', 'Vietnam' => 'VN', 'Wallis und Futuna' => 'WF', 'Weihnachtsinsel' => 'CX', 'Weißrussland' => 'BY', 'Westsahara' => 'EH', 'Zentralafrikanische Republik' => 'CF', 'Zypern' => 'CY' ); if($laenderliste) { return $laender; } return array_flip($laender); } /** * @param bool $laenderliste * * @return array */ public function GetSelectLaenderlisteEN($laenderliste=false) { if($laenderliste) { $tmp = $this->app->DB->SelectPairs( 'SELECT bezeichnung_en, iso FROM laender ORDER BY bezeichnung_en' ); } else { $tmp = $this->app->DB->SelectPairs( 'SELECT iso, bezeichnung_en FROM laender ORDER BY bezeichnung_en' ); } if(!empty($tmp)) { return $tmp; } $laender = array( 'Afghanistan' => 'AF', 'Albania' => 'AL', 'Algeria' => 'DZ', 'Andorra' => 'AD', 'Angola' => 'AO', 'Anguilla' => 'AI', 'Antarctica' => 'AQ', 'Antigua and Barbuda' => 'AG', 'Argentina' => 'AR', 'Armenia' => 'AM', 'Aruba' => 'AW', 'Australia' => 'AU', 'Austria' => 'AT', 'Azerbaijan' => 'AZ', 'Bahamas' => 'BS', 'Bahrain' => 'BH', 'Bangladesh' => 'BD', 'Barbados' => 'BB', 'Belarus' => 'BY', 'Belgium' => 'BE', 'Belize' => 'BZ', 'Benin' => 'BJ', 'Bermuda' => 'BM', 'Bhutan' => 'BT', 'Bolivia' => 'BO', 'Bosnia and Herzegovina' => 'BA', 'Botswana' => 'BW', 'Bouvet Island' => 'BV', 'Brazil' => 'BR', 'British Indian Ocean Territory' => 'IO', 'Brunei Darussalam' => 'BN', 'Bulgaria' => 'BG', 'Burkina Faso' => 'BF', 'Burundi' => 'BI', 'Cabo Verde' => 'CV', 'Cambodia' => 'KH', 'Cameroon' => 'CM', 'Canada' => 'CA', 'Cayman Islands' => 'KY', 'Central African Republic' => 'CF', 'Chad' => 'TD', 'Chile' => 'CL', 'China' => 'CN', 'Christmas Island' => 'CX', 'Cocos Islands' => 'CC', 'Colombia' => 'CO', 'Comoros' => 'KM', 'Congo' => 'CG', 'Congo (Democratic Republic)' => 'CD', 'Cook Islands' => 'CK', 'Costa Rica' => 'CR', 'Côte d\'Ivoire' => 'CI', 'Croatia' => 'HR', 'Cuba' => 'CU', 'Cyprus' => 'CY', 'Czech Republic' => 'CZ', 'Denmark' => 'DK', 'Djibouti' => 'DJ', 'Dominica' => 'DM', 'Dominican Republic' => 'DO', 'Ecuador' => 'EC', 'Egypt' => 'EG', 'El Salvador' => 'SV', 'Equatorial Guinea' => 'GQ', 'Eritrea' => 'ER', 'Estonia' => 'EE', 'Ethiopia' => 'ET', 'Falkland Islands' => 'FK', 'Faroe Islands' => 'FO', 'Fiji' => 'FJ', 'Finland' => 'FI', 'France' => 'FR', 'French Guiana' => 'GF', 'French Polynesia' => 'PF', 'French Southern Territories' => 'TF', 'Gabon' => 'GA', 'Gambia' => 'GM', 'Georgia' => 'GE', 'Germany' => 'DE', 'Ghana' => 'GH', 'Gibraltar' => 'GI', 'Greece' => 'GR', 'Greenland' => 'GL', 'Grenada' => 'GD', 'Guadeloupe' => 'GP', 'Guam' => 'GU', 'Guatemala' => 'GT', 'Guinea' => 'GN', 'Guinea-Bissau' => 'GW', 'Guyana' => 'GY', 'Haiti' => 'HT', 'Heard Island and McDonald Islands' => 'HM', 'Holy See' => 'VA', 'Honduras' => 'HN', 'Hong Kong' => 'HK', 'Hungary' => 'HU', 'Iceland' => 'IS', 'India' => 'IN', 'Indonesia' => 'ID', 'Iran' => 'IR', 'Iraq' => 'IQ', 'Ireland' => 'IE', 'Israel' => 'IL', 'Italy' => 'IT', 'Jamaica' => 'JM', 'Japan' => 'JP', 'Jordan' => 'JO', 'Kazakhstan' => 'KZ', 'Kenya' => 'KE', 'Kiribati' => 'KI', 'Korea (Democratic Republic)' => 'KP', 'Korea (Republic of)' => 'KR', 'Kosovo' => 'XK', 'Kuwait' => 'KW', 'Kyrgyzstan' => 'KG', 'Lao' => 'LA', 'Latvia' => 'LV', 'Lebanon' => 'LB', 'Lesotho' => 'LS', 'Liberia' => 'LR', 'Libya' => 'LY', 'Liechtenstein' => 'LI', 'Lithuania' => 'LT', 'Luxembourg' => 'LU', 'Macao' => 'MO', 'Macedonia' => 'MK', 'Madagascar' => 'MG', 'Malawi' => 'MW', 'Malaysia' => 'MY', 'Maldives' => 'MV', 'Mali' => 'ML', 'Malta' => 'MT', 'Marshall Islands' => 'MH', 'Martinique' => 'MQ', 'Mauritania' => 'MR', 'Mauritius' => 'MU', 'Mayotte' => 'YT', 'Mexico' => 'MX', 'Micronesia' => 'FM', 'Moldova' => 'MD', 'Monaco' => 'MC', 'Mongolia' => 'MN', 'Montenegro' => 'ME', 'Montserrat' => 'MS', 'Morocco' => 'MA', 'Mozambique' => 'MZ', 'Myanmar' => 'MM', 'Namibia' => 'NA', 'Nauru' => 'NR', 'Nepal' => 'NP', 'New Caledonia' => 'NC', 'New Zealand' => 'NZ', 'Nicaragua' => 'NI', 'Netherlands' => 'NL', 'Niger' => 'NE', 'Nigeria' => 'NG', 'Niue' => 'NU', 'Norfolk Island' => 'NF', 'Northern Mariana Islands' => 'MP', 'Norway' => 'NO', 'Oman' => 'OM', 'Pakistan' => 'PK', 'Palau' => 'PW', 'Palestine' => 'PS', 'Panama' => 'PA', 'Papua New Guinea' => 'PG', 'Paraguay' => 'PY', 'Peru' => 'PE', 'Philippines' => 'PH', 'Pitcairn' => 'PN', 'Poland' => 'PL', 'Portugal' => 'PT', 'Puerto Rico' => 'PR', 'Qatar' => 'QA', 'Réunion' => 'RE', 'Romania' => 'RO', 'Russia' => 'RU', 'Rwanda' => 'RW', 'Saint Helena' => 'SH', 'Saint Kitts and Nevis' => 'KN', 'Saint Lucia' => 'LC', 'Saint Pierre and Miquelon' => 'PM', 'Saint Vincent and the Grenadines' => 'VC', 'Samoa (American)' => 'AS', 'Samoa' => 'WS', 'San Marino' => 'SM', 'Sao Tome and Principe' => 'ST', 'Saudi Arabia' => 'SA', 'Senegal' => 'SN', 'Serbia' => 'RS', 'Seychelles' => 'SC', 'Sierra Leone' => 'SL', 'Singapore' => 'SG', 'Slovakia' => 'SK', 'Slovenia' => 'SI', 'Solomon Islands' => 'SB', 'Somalia' => 'SO', 'South Africa' => 'ZA', 'South Georgia, South Sandwich Isl.' => 'GS', 'Spain' => 'ES', 'Sri Lanka' => 'LK', 'Sudan' => 'SD', 'Suriname' => 'SR', 'Svalbard and Jan Mayen' => 'SJ', 'Swaziland' => 'SZ', 'Sweden' => 'SE', 'Switzerland' => 'CH', 'Syrian' => 'SY', 'Taiwan' => 'TW', 'Tajikistan' => 'TJ', 'Tanzania' => 'TZ', 'Thailand' => 'TH', 'Timor-Leste' => 'TL', 'Togo' => 'TG', 'Tokelau' => 'TK', 'Tonga' => 'TO', 'Trinidad and Tobago' => 'TT', 'Tunisia' => 'TN', 'Turkey' => 'TR', 'Turkmenistan' => 'TM', 'Turks and Caicos Islands' => 'TC', 'Tuvalu' => 'TV', 'Uganda' => 'UG', 'Ukraine' => 'UA', 'United Arab Emirates' => 'AE', 'United Kingdom' => 'GB', 'United States of America' => 'US', 'Uruguay' => 'UY', 'Uzbekistan' => 'UZ', 'Vanuatu' => 'VU', 'Venezuela' => 'VE', 'Viet Nam' => 'VN', 'Virgin Islands (Brit.)' => 'VG', 'Virgin Islands (USA)' => 'VI', 'Wallis and Futuna' => 'WF', 'Western Sahara' => 'EH', 'Yemen' => 'YE', 'Zambia' => 'ZM', 'Zimbabwe' => 'ZW', ); if($laenderliste) { return $laender; } return array_flip($laender); } /** * @return array */ public function GetAdressSprachen() { return array('deutsch'=>'DE','englisch'=>'EN','franzoesisch'=>'FR','hollaendisch'=>'NL','italienisch'=>'IT','spanisch'=>'ES','tschechisch'=>'CZ','daenisch'=>'DK','slowakisch'=>'SK','schwedisch'=>'SW','polnisch'=>'PL' ); } function RMAGrund(){ $gruende = array( 'gutschrift' => 'Gutschrift zu ausgewählten Artikeln', 'ersatzlieferung' => 'Kostenlose Ersatzlieferung veranlassen', 'ruecksendung' => 'Rücksendung der ausgewählten Artikel', 'internreparatur' => 'ausgewählte zur internen Reparatur geben', 'externreparatur' => 'ausgewählte für Reparatur zurückschicken', 'abgeschlossen' => 'ausgewählte Artikel auf abgeschlossen setzen', 'offen' => 'ausgewählte Artikel auf offen setzen'); return $gruende; } /** * @param bool $sprachenliste * * @return array */ public function GetSelectSprachenListe($sprachenliste=false) { if($sprachenliste) { $tmp = $this->app->DB->SelectPairs('SELECT bezeichnung_de, iso FROM sprachen ORDER BY bezeichnung_de'); } else { $tmp = $this->app->DB->SelectPairs('SELECT iso, bezeichnung_de FROM sprachen ORDER BY bezeichnung_de'); } if(!empty($tmp) && (!empty($tmp)?count($tmp):0) > 1) { return array_merge([''], $tmp); } $sprachen = array( 'Afrikaans' => 'AF', 'Albanisch' => 'SQ', 'Arabisch' => 'AR', 'Armenisch' => 'HY', 'Aserbeidschanisch' => 'AZ', 'Bosnisch' =>'BS', 'Bulgarisch' => 'BG', 'Chinesisch' => 'ZH', 'Dänisch' => 'DA', 'Deutsch' => 'DE', 'Englisch' => 'EN', 'Estnisch' => 'ET', 'Finnisch' => 'FI', 'Französisch' => 'FR', 'Georgisch' => 'KA', 'Griechisch' => 'EL', 'Holländisch' => 'NL', 'Isländisch' => 'IS', 'Italienisch' => 'IT', 'Japanisch' => 'JA', 'Kasachisch' => 'KK', 'Koreanisch' => 'KO', 'Kroatisch' => 'HR', 'Lettisch' => 'LV', 'Litauisch' => 'LT', 'Norwegisch' => 'NO', 'Polnisch' => 'PL', 'Portugiesisch' => 'PT', 'Rumänisch' => 'RO', 'Russisch' => 'RU', 'Schwedisch' => 'SV', 'Serbisch' => 'SR', 'Slowakisch' => 'SK', 'Slowenisch' => 'SL', 'Spanisch' => 'ES', 'Tschechisch' => 'CZ', 'Türkisch' => 'TR', 'Ukrainisch' => 'UK', 'Ungarisch' => 'HU', 'Weißrussisch' => 'BY' ); if($sprachenliste) { return $sprachen; } return array_flip($sprachen); } /** * @param bool $sprachenliste * * @return array */ public function GetSelectSprachenListeEN($sprachenliste=false) { if($sprachenliste) { $tmp = $this->app->DB->SelectPairs('SELECT bezeichnung_en, iso FROM sprachen ORDER BY bezeichnung_en'); } else { $tmp = $this->app->DB->SelectPairs('SELECT iso, bezeichnung_en FROM sprachen ORDER BY bezeichnung_en'); } if(!empty($tmp) && (!empty($tmp)?count($tmp):0) > 1) { return array_merge([''], $tmp); } $sprachen = array( 'Afrikaans' => 'AF', 'Albanian' => 'SQ', 'Arabic' => 'AR', 'Armenian' => 'HY', 'Azerbaijani' => 'AZ', 'Bosnian' =>'BS', 'Bulgarian' => 'BG', 'Chinese' => 'ZH', 'Danish' => 'DA', 'German' => 'DE', 'English' => 'EN', 'Estonian' => 'ET', 'Finnish' => 'FI', 'French' => 'FR', 'Georgian' => 'KA', 'Greek' => 'EL', 'Dutch' => 'NL', 'Icelandic' => 'IS', 'Italian' => 'IT', 'Japanese' => 'JA', 'Kazakh' => 'KK', 'Korean' => 'KO', 'Croatian' => 'HR', 'Latvian' => 'LV', 'Lithuanian' => 'LT', 'Norwegian' => 'NO', 'Polish' => 'PL', 'Portuguese' => 'PT', 'Romanian' => 'RO', 'Russian' => 'RU', 'Swedish' => 'SV', 'Serbian' => 'SR', 'Slovak' => 'SK', 'Slovenian' => 'SL', 'Spanish' => 'ES', 'Czech' => 'CZ', 'Turkish' => 'TR', 'Ukrainian' => 'UK', 'Hungarian' => 'HU', 'Belarusian' => 'BE' ); if($sprachenliste) { return $sprachen; } return array_flip($sprachen); } function GetFirmaBCC1() { return $this->Firmendaten('bcc1'); } function GetFirmaBCC2() { return $this->Firmendaten('bcc2'); } function GetFirmaMail() { return $this->Firmendaten('email'); } function GetFirmaName() { return $this->Firmendaten('name'); } function GetFirmaAbsender() { $name = $this->Firmendaten('absendername'); if($name!='') { return $name; } return $this->Firmendaten('name'); } function GetSelectEmailMitName($selected="") { /* $own = $this->app->User->GetEmail(); $name = $this->app->User->GetName(); $selected = str_replace(' <',' <',$selected); $selected = str_replace('>','>',$selected); $email_addr[0]['email'] = $this->Firmendaten('email'); $absendernamefirma[0]['absendername'] = $this->Firmendaten('absendername'); $firmenname = $this->Firmendaten('name'); if($absendernamefirma[0]['absendername']=="") $absendernamefirma[0]['absendername']= $firmenname; $emails = array(); if($this->app->User->GetField("email_bevorzugen")=="1") { if($own!='' && $name!='') $emails[] = $name." <".$own.">"; } $i=0; foreach($email_addr AS $mail) { if($absendernamefirma[$i]['absendername']!="" && $mail['email']!="") $emails[] = $absendernamefirma[$i]['absendername']." <".$mail['email'].">"; } if($this->app->User->GetField("email_bevorzugen")!="1") { if($own!='' && $name!='') $emails[] = $name." <".$own.">"; } $email_addr = $this->app->DB->SelectArr("SELECT if(smtp_frommail!='',smtp_frommail,email) as email,smtp_fromname FROM emailbackup WHERE (smtp_frommail!='' OR email!='') AND (adresse<=0 OR adresse='".$this->app->User->GetAdresse()."') AND geloescht!=1 ORDER BY email"); */ // Force only existing emailbackup accounts // $tpl = ""; $email_addr = $this->app->DB->SelectArr("SELECT email, angezeigtername FROM emailbackup WHERE email != '' AND (adresse<=0 OR adresse='".$this->app->User->GetAdresse()."') AND geloescht!=1 ORDER BY email"); if (empty($email_addr)) { return ""; } foreach($email_addr AS $mail) { if($mail['angezeigtername']!="") $emails[] = $mail['angezeigtername']." <".$mail['email'].">"; else $emails[] = $firmenname." <".$mail['email'].">"; } $emails = array_keys(array_flip($emails)); for($i=0;$i<(!empty($emails)?count($emails):0);$i++) { if($emails[$i]===$selected) $mark="selected"; else $mark=""; $tpl .=""; } return $tpl; } function GetSelectEmail($selected="") { /* $own = $this->app->User->GetEmail(); $email_addr= $this->Firmendaten("email"); $emails = array(); if($this->app->User->GetField("email_bevorzugen")=="1") { if($own!='') $emails[] = $own; } if($email_addr!="") $emails[] = $email_addr; $email_addr = $this->app->DB->SelectArr("SELECT if(smtp_frommail!='',smtp_frommail,email) as email FROM emailbackup WHERE (smtp_frommail!='' OR email!='') AND (adresse<=0 OR adresse='".$this->app->User->GetAdresse()."') AND geloescht!=1 ORDER BY email"); */ // Force only existing emailbackup accounts $tpl = ""; $email_addr = $this->app->DB->SelectArr("SELECT email FROM emailbackup WHERE email != '' AND (adresse<=0 OR adresse='".$this->app->User->GetAdresse()."') AND geloescht!=1 ORDER BY email"); if (empty($email_addr)) { return ""; } foreach($email_addr AS $mail) { $emails[] = $mail['email']; } $emails = array_keys(array_flip($emails)); for($i=0;$i<(!empty($emails)?count($emails):0);$i++) { if($emails[$i]==$selected) { $mark="selected"; } else { $mark=""; } $tpl .=""; } return $tpl; } function GetSelectTicketmail($selected="") { /** @var Ticket $obj */ $obj = $this->LoadModul('ticket'); if(!empty($obj) && method_exists($obj, 'GetSelectTicketmail')) { return $obj->GetSelectTicketmail($selected); } return ''; } function GetSelectDokumentKunde($typ,$adresse,$select) { $typ_bezeichnung = ucfirst($typ); $result = $this->app->DB->SelectArr("SELECT CONCAT('$typ_bezeichnung ',if(status='angelegt','ENTWURF',belegnr),' (Status: ',status,') vom ',DATE_FORMAT(datum,'%d.%m.%Y')) as result,id FROM $typ WHERE adresse='$adresse' ORDER by datum DESC"); if(empty($result)) { return ''; } $tmp = ''; foreach ($result as $row) { $tmp .= ""; } return $tmp; } function GetSelectAuftragKunde($adresse,$select="") { return $this->GetSelectDokumentKunde("auftrag",$adresse,$select); } function GetSelectRechnungKunde($adresse,$select="") { return $this->GetSelectDokumentKunde("rechnung",$adresse,$select); } function GetSelectArbeitsnachweisKunde($adresse,$select="") { return $this->GetSelectDokumentKunde("arbeitsnachweis",$adresse,$select); } function GetSelectAnsprechpartner($adresse, $selected="") { $first = $this->app->DB->Select("SELECT CONCAT(ansprechpartner,' <',email,'>') FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); $firstname = $this->app->DB->Select("SELECT ansprechpartner FROM adresse WHERE id='$adresse' LIMIT 1"); if($firstname=="") $first = $this->app->DB->Select("SELECT CONCAT(name,' <',email,'>') FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); $others = $this->app->DB->SelectArr("SELECT id, CONCAT(name,' (',bereich,')',' <',email,'>') as name FROM ansprechpartner WHERE adresse='$adresse'"); $tpl =""; for($i=0;$i<(!empty($others)?count($others):0);$i++) { if($others[$i]['id']==$selected) $mark="selected"; else $mark=""; $tpl .=""; } return $tpl; } function GetVorgaenger($projekt,$disableid="") { $user = $this->app->DB->SelectArr("SELECT * FROM arbeitspaket WHERE projekt='".$projekt."' AND id!='$disableid' AND art!='material'"); $tpl[0]="keinen"; for($i=0;$i<(!empty($user)?count($user):0);$i++) { $tpl[$user[$i]['id']]=$user[$i]['aufgabe']; } return $tpl; } function GetMitarbeiter() { $user = $this->app->DB->SelectArr("SELECT DISTINCT a.id,a.name FROM adresse a INNER JOIN adresse_rolle ar on ar.adresse=a.id AND ar.subjekt='Mitarbeiter' WHERE a.mitarbeiternummer!='' AND a.geloescht!=1 AND (ar.bis = '0000-00-00' or ar.bis >= now()) ORDER by name"); for($i=0;$i<(!empty($user)?count($user):0);$i++) { $tmp[$i]['id'] = $user[$i]['id']; $tmp[$i]['name'] = $user[$i]['name']; } return $tmp; } function GetReisekostenartAssoc() { $user = $this->app->DB->SelectArr("SELECT * FROM reisekostenart ORDER by nummer"); for($i=0;$i<(!empty($user)?count($user):0);$i++) { $tmp[(string)$user[$i]['id']] = "{$user[$i]['nummer']}- {$user[$i]['beschreibung']}"; } return $tmp; } function GetSelectBezahltWie() { $tmp = $this->GetBezahltWieAssoc(); foreach($tmp as $key=>$value) $result .= ""; return $result; } function GetLagerRegalart($selected="") { $tmp = array('Fachboden','Palette'); foreach($tmp as $key=>$value) { if($value==$selected) $mark="selected"; else $mark=""; $tpl .=""; } return $tpl; } function GetLagerABCKategorie($selected="") { $tmp = array(''=>'keine','A'=>'A','B'=>'B','C'=>'C'); foreach($tmp as $key=>$value) { if($key==$selected) $mark="selected"; else $mark=""; $tpl .=""; } return $tpl; } function GetSelectEtiketten($art,$selected="") { $user = $this->app->DB->SelectArr("SELECT * FROM etiketten WHERE verwendenals='$art' ORDER by name"); if (!is_null($user)) { for($i=0;$i<(!empty($user)?count($user):0);$i++) { if($user[$i]['id']==$selected) $mark="selected"; else $mark=""; $tpl .=""; } } return $tpl; } function GetKalkulationartAssoc() { $user['artikel']="Artikel aus Stammdaten"; $user['stueckliste']="Stückliste"; $user['freieposition']="Freie Position"; $user['maschinenzeit']="Maschinenzeit"; $user['arbeitszeit']="Arbeitszeit"; $user['einmalkosten']="Einmalkosten / Werkzeugkosten"; // $user['teilprojekt']="Teilprojekt / Aufgabe"; // $user['hauptpunkt']="Beschriftung für Gruppe"; // $user['unterpunkt']="Beschriftung für Untergruppe"; $user['zwischensumme']="Zwischensumme"; $user['zwischensummemengex']="Zwischensumme für Menge X"; // $user['geplantemenge']="Geplante Menge"; return $user; } function GetSelectKalkulationart($selected="") { $user = $this->GetKalkulationartAssoc(); foreach($user as $key=>$value) { if($key==$selected) $mark="selected"; else $mark=""; $tpl .=""; } return $tpl; } function GetSelectReisekostenart($selected="") { $user = $this->app->DB->SelectArr("SELECT * FROM reisekostenart ORDER by nummer"); for($i=0;$i<(!empty($user)?count($user):0);$i++) { if($user[$i]['id']==$selected) $mark="selected"; else $mark=""; $tpl .=""; } return $tpl; } function GetSelectUserVorlage($selected="",$disableid="") { $user = $this->app->DB->SelectArr("SELECT * FROM uservorlage WHERE id!='$disableid' ORDER by bezeichnung"); for($i=0;$i<(!empty($user)?count($user):0);$i++) { if($user[$i]['id']==$selected) $mark=" selected"; else $mark=""; $tpl .=""; } return $tpl; } function GetSelectUser($selected="",$disableid="") { $user = $this->app->DB->SelectArr("SELECT * FROM user WHERE id!='$disableid'"); for($i=0;$i<(!empty($user)?count($user):0);$i++) { $user[$i]['description'] = $this->app->DB->Select("SELECT name FROM adresse WHERE id='".$user[$i]['adresse']."' LIMIT 1"); if($user[$i]['id']==$selected) $mark="selected"; else $mark=""; $tpl .=""; } return $tpl; } /** * @param array $array * @param string|int $selected * * @return string */ public function arrayToSelect($array, $selected = '') { $tpl = ''; foreach($array as $id => $konto) { $mark = ''; if($selected == $id) { $mark = 'selected'; } $tpl .= ''; } return $tpl; } function GetIPAdapterbox($id) { return $this->app->DB->Select("SELECT adapterboxip FROM drucker WHERE id='$id' LIMIT 1"); } function GetStandardPaketmarkendrucker($projekt="",$versandart="") { return $this->app->DB->Select("SELECT paketmarkendrucker FROM user WHERE id='".$this->app->User->GetID()."'"); } function GetStandardVersanddrucker($projekt="",$versandart="") { return $this->app->DB->Select("SELECT standardversanddrucker FROM user WHERE id='".$this->app->User->GetID()."'"); } function GetInstrashipExport($projekt="") { $export = $this->app->DB->Select("SELECT intraship_exportdrucker FROM projekt WHERE id = '$projekt' LIMIT 1"); if($export)return $export; return $this->GetStandardVersanddrucker(); } function GetSelectEtikettenDrucker($selected="") { if($selected=="") $selected = $this->app->DB->Select("SELECT standardetikett FROM user WHERE id='".$this->app->User->GetID()."' LIMIT 1"); $check = $this->app->DB->Select("SELECT id FROM drucker WHERE id='$selected' AND aktiv='1' LIMIT 1"); if($check!=$selected) $selected=""; if($selected=="") $selected = $this->Firmendaten("standardetikettendrucker"); if($selected=="0" || $selected=="") $tpl .=""; else $tpl .=""; $drucker = $this->app->DB->SelectArr("SELECT id, name FROM drucker WHERE aktiv='1' AND art='2'"); for($i=0;$i<(!empty($drucker)?count($drucker):0);$i++) { if($drucker[$i]['id']==$selected) $mark="selected"; else $mark=""; $tpl .=""; } return $tpl; } function GetSelectFax($selected="") { if($selected=="") $selected = $this->app->DB->Select("SELECT standardfax FROM user WHERE id='".$this->app->User->GetID()."' LIMIT 1"); $check = $this->app->DB->Select("SELECT id FROM drucker WHERE id='$selected' AND aktiv='1' LIMIT 1"); if($check!=$selected) $selected=""; if($selected=="") $selected = $this->Firmendaten("standardfax"); //$tpl .=""; $drucker = $this->app->DB->SelectArr("SELECT id, name FROM drucker WHERE aktiv='1' AND art='1'"); if (gettype($drucker) == 'array') { for($i=0;$i<(!empty($drucker)?count($drucker):0);$i++) { if($drucker[$i]['id']==$selected) $mark="selected"; else $mark=""; $tpl .=""; } } return $tpl; } function GetSelectBonDrucker($selected="") { if($selected=="") $selected = $this->Firmendaten("aufgaben_bondrucker"); $drucker = $this->app->DB->SelectArr("SELECT id, bezeichnung FROM adapterbox WHERE verwendenals='bondrucker'"); $tpl =""; for($i=0;$i<(!empty($drucker)?count($drucker):0);$i++) { if($drucker[$i]['id']==$selected) $mark="selected"; else $mark=""; $tpl .=""; } return $tpl; } function GetPosAdapterbox() { $drucker = $this->app->DB->SelectArr("SELECT id, bezeichnung FROM adapterbox WHERE verwendenals='bondrucker' OR verwendenals='rksvlight'"); for($i=0;$i<(!empty($drucker)?count($drucker):0);$i++) { $result[$drucker[$i]['id']]=$drucker[$i]['bezeichnung']; } return $result; } function GetBondrucker() { $drucker = $this->app->DB->SelectArr("SELECT id, bezeichnung FROM adapterbox WHERE verwendenals='bondrucker'"); for($i=0;$i<(!empty($drucker)?count($drucker):0);$i++) { $result[$drucker[$i]['id']]=$drucker[$i]['bezeichnung']; } return $result; } function GetEtiketten() { //$tpl .=""; $drucker = $this->app->DB->SelectArr("SELECT id, name FROM etiketten"); for($i=0;$i<(!empty($drucker)?count($drucker):0);$i++) { $result[$drucker[$i]['id']]=$drucker[$i]['name']; } return $result; } function GetWaage() { //$tpl .=""; $drucker = $this->app->DB->SelectArr("SELECT id, bezeichnung FROM adapterbox WHERE verwendenals='waage'"); for($i=0;$i<(!empty($drucker)?count($drucker):0);$i++) { $result[$drucker[$i]['id']]=$drucker[$i]['bezeichnung']; } return $result; } function GetEtikettendrucker() { //$tpl .=""; $drucker = $this->app->DB->SelectArr("SELECT id, name FROM drucker WHERE aktiv='1' AND art='2'"); for($i=0;$i<(!empty($drucker)?count($drucker):0);$i++) { $result[$drucker[$i]['id']]=$drucker[$i]['name']; } return $result; } function GetDrucker() { $drucker = $this->app->DB->SelectArr("SELECT id, name FROM drucker WHERE aktiv='1' AND art='0'"); for($i=0;$i<(!empty($drucker)?count($drucker):0);$i++) { $result[$drucker[$i]['id']]=$drucker[$i]['name']; } return $result; } function GetSelectVersanddrucker($selected="") { if($selected=="") $selected = $this->app->DB->Select("SELECT standardversanddrucker FROM user WHERE id='".$this->app->User->GetID()."' LIMIT 1"); $check = $this->app->DB->Select("SELECT id FROM drucker WHERE id='$selected' AND aktiv='1' LIMIT 1"); if($check!=$selected) $selected=""; $tpl =""; $drucker = $this->app->DB->SelectArr("SELECT id, name FROM drucker WHERE aktiv='1' AND art='0'"); for($i=0;$i<(!empty($drucker)?count($drucker):0);$i++) { if($drucker[$i]['id']==$selected) $mark="selected"; else $mark=""; $tpl .=""; } return $tpl; } function GetSelectDrucker($selected="") { if($selected=="") $selected = $this->app->DB->Select("SELECT standarddrucker FROM user WHERE id='".$this->app->User->GetID()."' LIMIT 1"); $check = $this->app->DB->Select("SELECT id FROM drucker WHERE id='$selected' AND aktiv='1' LIMIT 1"); if($check!=$selected) $selected=""; if($selected=="") $selected = $this->Firmendaten("standardversanddrucker"); $tpl .=""; $drucker = $this->app->DB->SelectArr("SELECT id, name FROM drucker WHERE aktiv='1' AND art='0'"); for($i=0;$i<(!empty($drucker)?count($drucker):0);$i++) { if($drucker[$i]['id']==$selected) $mark="selected"; else $mark=""; $tpl .=""; } return $tpl; } function DokumentSendVorlage($id) { $betreff = $this->app->DB->Select("SELECT betreff FROM dokumente_send WHERE id='$id' LIMIT 1"); $text = $this->app->DB->Select("SELECT text FROM dokumente_send WHERE id='$id' LIMIT 1"); $this->app->Tpl->Set('BETREFF',$betreff); $this->app->Tpl->Set('TEXT',$text); } function Geschaeftsbriefvorlage($sprache,$subjekt,$projekt="",$name="",$id="", $intern = false) { if($sprache=="") $sprache="deutsch"; $this->BeschriftungSprache($sprache); $belegnr = ""; $adresse = ""; $anschreiben = ""; $lowersubjekt = strtolower($subjekt); if( $lowersubjekt=="angebot" || $lowersubjekt=="auftrag" || $lowersubjekt=="bestellung" || $lowersubjekt=="produktion" || $lowersubjekt=="lieferschein" || $lowersubjekt=="retoure" || $lowersubjekt=="rechnung" || $lowersubjekt=="gutschrift" || $lowersubjekt=="arbeitsnachweis" || $lowersubjekt=="proformarechnung" ){ if($id > 0) { if($name=="") $name = $this->app->DB->Select("SELECT name FROM $lowersubjekt WHERE id='$id' LIMIT 1"); $belegnr = $this->app->DB->Select("SELECT belegnr FROM $lowersubjekt WHERE id='$id' LIMIT 1"); $adresse = $this->app->DB->Select("SELECT adresse FROM $lowersubjekt WHERE id='$id' LIMIT 1"); $anschreiben = $this->app->DB->Select("SELECT anschreiben FROM $lowersubjekt WHERE id='$id' LIMIT 1"); $datum = $this->app->DB->Select("SELECT DATE_FORMAT(datum,'%d.%m.%Y') FROM $lowersubjekt WHERE id='$id' LIMIT 1"); if($anschreiben=="") { $anschreiben = $this->app->DB->Select("SELECT anschreiben FROM adresse WHERE id='$adresse' LIMIT 1"); } if($anschreiben=="") { $anschreiben = $this->Beschriftung("dokument_anschreiben"); } if(!$intern)$this->GeschaeftsBriefAnhang($subjekt,$sprache,$projekt,$lowersubjekt,$id); } } $text = $this->GetGeschaeftsBriefText($subjekt,$sprache,$projekt,$lowersubjekt,$id); $betreff = $this->GetGeschaeftsBriefBetreff($subjekt,$sprache,$projekt,$lowersubjekt,$id); if($text=="") $text = $this->GetGeschaeftsBriefText($subjekt,$sprache,$projekt,$lowersubjekt,$id); if($betreff=="") $betreff = $this->GetGeschaeftsBriefBetreff($subjekt,$sprache,$projekt,$lowersubjekt,$id); if(($text === "" || $betreff === "") && $sprache != 'deutsch') { $text = $this->GetGeschaeftsBriefText($subjekt,'deutsch',$projekt,$lowersubjekt,$id); $betreff = $this->GetGeschaeftsBriefBetreff($subjekt,'deutsch',$projekt,$lowersubjekt,$id); if($text=="") $text = $this->GetGeschaeftsBriefText($subjekt,'deutsch',$projekt,$lowersubjekt,$id); if($betreff=="") $betreff = $this->GetGeschaeftsBriefBetreff($subjekt,'deutsch',$projekt,$lowersubjekt,$id); } $text = str_replace('{BELEGNR}',$belegnr,$text); $text = str_replace('{DATUM}',$datum,$text); $betreff = str_replace('{BELEGNR}',$belegnr,$betreff); $betreff = str_replace('{DATUM}',$datum,$betreff); if($id > 0) { $betreff = $this->ParseUserVars($lowersubjekt,$id, $betreff); $text = $this->ParseUserVars($lowersubjekt,$id, $text); } if($anschreiben=="") { $anschreiben = $this->app->erp->Beschriftung("dokument_anschreiben"); } $betreff = str_replace('{ANSCHREIBEN}',$anschreiben,$betreff); $text = str_replace('{ANSCHREIBEN}',$anschreiben,$text); $betreff = str_replace('{NAME}',$name,$betreff); $text = str_replace('{NAME}',$name,$text); if(!$intern)$this->app->Tpl->Set('BETREFF',$betreff); if(!$this->isHTML($text) && $this->Firmendaten("briefhtml")=="1"){ $texthtml = str_replace("\r\n", "
", $text); if(!$intern)$this->app->Tpl->Set('TEXT',$texthtml); } else { if(!$intern)$this->app->Tpl->Set('TEXT',$text); } return array("betreff"=>$betreff,"text"=>$text); } function GetAnsprechpartner($data) { // $data: 'Admin ' // return id, name, email $first = strpos($data, '<'); $last = strpos($data, '>'); $name = trim(substr($data, 0, $first)); $email = trim(substr($data, $first+1, $last-($first+1))); $id = $this->app->DB->Select("SELECT id FROM adresse WHERE email='$mail' LIMIT 1"); if(!(is_numeric($id) && $id<1)) $id = $this->app->DB->Select("SELECT id FROM adresse WHERE name='$name' LIMIT 1"); if(!is_numeric($id)) $id = 0; return array('id'=>$id, 'name'=>$name, 'email'=>$email); } function RemoveReadonly($feld) { $this->app->Tpl->Add('JQUERY','$("#'.$feld.'").removeAttr("disabled","disabled");'); $this->app->Tpl->Add('JQUERY','$("#'.$feld.'").removeAttr("readonly","readonly");'); $this->app->Tpl->Add('JQUERY','$("#'.$feld.'").css("background-color", "white");'); } function CommonReadonly() { $this->commonreadonly=1; $this->app->Tpl->Set('COMMONREADONLYINPUT',"readonly disabled style=\"background-color:#eee; border-color:#ddd;\""); $this->app->Tpl->Set('COMMONREADONLYSELECT',"disabled=\"disabled\" style=\"background-color:#eee;\""); } function BriefpapierHintergrundDisable($drucker) { $keinhintergrund = $this->app->DB->Select("SELECT keinhintergrund FROM drucker WHERE id='$drucker' LIMIT 1"); if($keinhintergrund=="1") $this->app->erp->BriefpapierHintergrunddisable = true; } function BriefpapierHintergrundEnable() { $this->app->erp->BriefpapierHintergrunddisable = false; } function DokumentMask($parsetarget,$typ,$id,$adresse,$projekt="",$popup=false, $intern = false) { if(!$intern) { $this->app->Tpl->Set('SID',$id); $this->app->Tpl->Set('TYP',$typ); $ansprechpartnerManuell = $this->app->Secure->GetPOST('ansprechpartnermanuellverwenden'); if($ansprechpartnerManuell == 'on'){ $ansprechpartner = $this->app->Secure->GetPOST('ansprechpartnermanuell'); }else{ $ansprechpartner = $this->app->Secure->GetPOST('ansprechpartner'); } $betreff = $this->app->Secure->GetPOST("betreff"); $projekt_submit = $this->app->Secure->GetPOST("projekt"); $text = $this->app->Secure->GetPOST("text"); $art = $this->app->Secure->GetPOST("senden"); $tmpcc = $this->app->Secure->GetPOST("cc"); $tmpbcc = $this->app->Secure->GetPOST("bcc"); $vorlage = $this->app->Secure->GetPOST("vorlage"); if($vorlage!='' && !empty($this->app->User) && method_exists($this->app->User, 'SetParameter')) { $this->app->User->SetParameter("briefpapier_vorlage",$vorlage); } }else{ $betreff = isset($intern["betreff"])?$intern["betreff"]:''; $projekt_submit = isset($intern["projekt"])?$intern["projekt"]:$projekt; $ansprechpartner = isset($intern["ansprechpartner"])?$intern["ansprechpartner"]:$this->app->DB->Select("SELECT concat(if(ansprechpartner <> '',ansprechpartner,name),'<',email,'>') FROM $typ WHERE id = '$id' LIMIT 1"); $text = isset($intern["text"])?$intern["text"]:''; $art = isset($intern["senden"])?$intern["senden"]:''; $tmpcc = isset($intern["cc"])?$intern["cc"]:''; $tmpbcc = isset($intern["bcc"])?$intern["bcc"]:''; $vorlage = isset($intern["vorlage"])?$intern["vorlage"]:''; if($vorlage!='' && !empty($this->app->User) && method_exists($this->app->User, 'SetParameter')) { $this->app->User->SetParameter("briefpapier_vorlage",$vorlage); } } $ansprechpartner = str_replace('<','<',$ansprechpartner); $ansprechpartner = str_replace('>','>',$ansprechpartner); list($name, $email) = explode('<', trim($ansprechpartner,'>')); $betreff = str_replace('\"','"',$betreff); $betreff = str_replace("\'","'",$betreff); $partnerinfo['email'] = $email; $partnerinfo['name'] = $name; if(!$intern && $this->app->Secure->GetPOST('ansprechpartnermanuellverwenden')=='on'){ $partnerinfo['email'] = $this->app->Secure->GetPOST("ansprechpartnermanuell"); $partnerinfo['name'] = ''; } if($projekt=="" && $projekt_submit!="") $projekt = $projekt_submit; if($projekt=="") $projekt = $this->app->DB->Select("SELECT projekt FROM $typ WHERE id='$id' LIMIT 1"); //04.07.2018 von Bruno hinzugefuegt // hole standard projekt von adresse if($projekt=="") $projekt = $this->app->DB->Select("SELECT projekt FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); if($typ!="brieffax") $projektbriefpapier = $this->app->DB->Select("SELECT projekt FROM $typ WHERE id='$id' LIMIT 1"); // START SCHLEIFE if(!$intern) { $tmpsenden = $this->app->Secure->GetPOST("senden"); }else{ $tmpsenden = isset($intern['senden'])?$intern['senden']:null; } if(!$intern && $tmpsenden && !empty($this->app->User) && method_exists($this->app->User, 'SetParameter')) { $this->app->User->SetParameter("dokumente_abschickenmask_".$typ."_brief","0"); $this->app->User->SetParameter("dokumente_abschickenmask_".$typ."_email","0"); $this->app->User->SetParameter("dokumente_abschickenmask_".$typ."_sonstiges","0"); $this->app->User->SetParameter("dokumente_abschickenmask_".$typ."_telefon","0"); $this->app->User->SetParameter("dokumente_abschickenmask_".$typ."_fax","0"); } for($tmpis=0;$tmpis<(!empty($tmpsenden)?count($tmpsenden):0);$tmpis++) { $deckblatt = false; //BRIEFCHECKED $art = $tmpsenden[$tmpis]; if($art!='' && !empty($this->app->User) && method_exists($this->app->User, 'SetParameter')){ $this->app->User->SetParameter('dokumente_abschickenmask_' . $typ . '_' . $art, '1'); } if($art == "brief") $drucker = $this->app->Secure->GetPOST("drucker_brief"); else if($art == "fax") $drucker = $this->app->Secure->GetPOST("drucker_fax"); else if ($art == "email") $drucker = $this->app->Secure->GetPOST("email_from"); // Hintergrund ausschalten wenn drucker es erfordert $this->BriefpapierHintergrundDisable($drucker); if($art === 'email' || (!$intern && $this->app->Secure->GetPOST('sammelpdf'))) { if($intern) { if(isset($intern['dateianhaenge']) && $intern['dateianhaenge'] && is_array($intern['dateianhaenge'])) { foreach($intern['dateianhaenge'] as $pk => $pv) { if(is_numeric($pv)) { $dateiname = str_replace(' ','_',$this->app->erp->GetDateiName($pv)); }else { $dateiname = $pv; if(!file_exists($dateiname))$dateiname = ''; } if($dateiname != '') { if(is_numeric($pv)) { $dateiinhalt = $this->app->erp->GetDatei($pv); if($handle = fopen (rtrim($this->app->erp->GetTMP(),'/')."/".$dateiname, "wb")) { fwrite($handle, $dateiinhalt); fclose($handle); $_dateien[] = rtrim($this->app->erp->GetTMP(),'/')."/".$dateiname; $dateisort = $pk; if($dateisort)$dateiensort[$dateisort] = (!empty($_dateien)?count($_dateien):0)-1; $zuloeschen[] = rtrim($this->app->erp->GetTMP(),'/')."/".$dateiname; } }else{ $_dateien[] = $dateiname; $dateisort = $pk; if($dateisort)$dateiensort[$dateisort] = (!empty($_dateien)?count($_dateien):0)-1; $zuloeschen[] = $dateiname; } } } } }else{ /*if($this->app->Secure->GetPOST('sammelpdf')) $_dateien = array($tmpfile);*/ foreach($_POST as $pk => $pv) { $pka = explode('_',$pk); if($pka[0] == 'datei' && isset($pka[1]) && $pka[1] && is_numeric($pka[1])){ $dateiname = str_replace(' ','_',$this->app->erp->GetDateiName($pka[1])); if($dateiname) { if($this->app->DB->Select("SELECT id FROM datei_stichwoerter WHERE datei=".$pka[1]." AND subjekt='Deckblatt' AND objekt='auftrag' AND parameter='$id'") && $this->app->Secure->GetPOST('sammelpdf')){ //Datei ist ein Deckblatt, vermerken $deckblatt=true; }else{ $dateiinhalt = $this->app->erp->GetDatei($pka[1]); if($handle = fopen (rtrim($this->app->erp->GetTMP(),'/')."/".$dateiname, "wb")) { fwrite($handle, $dateiinhalt); fclose($handle); $_dateien[] = rtrim($this->app->erp->GetTMP(),'/')."/".$dateiname; $dateisort = (int)$this->app->Secure->GetPOST('dateisort_'.$pka[1]); if($dateisort)$dateiensort[$dateisort] = (!empty($_dateien)?count($_dateien):0)-1; $zuloeschen[] = rtrim($this->app->erp->GetTMP(),'/')."/".$dateiname; } } } } } if($this->app->Secure->GetPOST('sammelpdf') && isset($dateiensort)) { foreach($dateiensort as $k => $v) { if(file_exists($_dateien[$v])) { $contenttyp = mime_content_type($_dateien[$v]); if($contenttyp == 'application/pdf') { $sammelpdf[] = file_get_contents($_dateien[$v]); unset($_dateien[$v]); } } } } } } // eigentliches dokument if($typ=="bestellung") { // sende if($this->Firmendaten('hintergrund') == 'kein'){ $this->app->erp->BriefpapierHintergrunddisable = false; } else{ $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; } if(class_exists('BestellungPDFCustom')) { $Brief = new BestellungPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new BestellungPDF($this->app,$projektbriefpapier); } $Brief->GetBestellung($id); if(isset($sammelpdf)) { foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } } $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); unlink($tmpfile); $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('BestellungPDFCustom')) { $Brief = new BestellungPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new BestellungPDF($this->app,$projektbriefpapier); } $Brief->GetBestellung($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); if(isset($sammelpdf)) { unlink($tmpfile); if(class_exists('BestellungPDFCustom')) { $Brief = new BestellungPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new BestellungPDF($this->app,$projektbriefpapier); } $Brief->GetBestellung($id); foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } $tmpfile = $Brief->displayTMP(); } } // eigentliches dokument if($typ=="angebot") { // sende $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('AngebotPDFCustom')) { $Brief = new AngebotPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new AngebotPDF($this->app,$projektbriefpapier); } $Brief->GetAngebot($id); if(isset($sammelpdf)) { foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } } $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); unlink($tmpfile); $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('AngebotPDFCustom')) { $Brief = new AngebotPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new AngebotPDF($this->app,$projektbriefpapier); } $Brief->GetAngebot($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); if(isset($sammelpdf)) { unlink($tmpfile); if(class_exists('AngebotPDFCustom')) { $Brief = new AngebotPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new AngebotPDF($this->app,$projektbriefpapier); } $Brief->GetAngebot($id); foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } $tmpfile = $Brief->displayTMP(); } } // eigentliches dokument if($typ=="lieferschein") { // sende if($this->Firmendaten('hintergrund') == 'kein'){ $this->app->erp->BriefpapierHintergrunddisable = false; } else{ $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; } if(class_exists('LieferscheinPDFCustom')) { $Brief = new LieferscheinPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new LieferscheinPDF($this->app,$projektbriefpapier); } $Brief->GetLieferschein($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); unlink($tmpfile); $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('LieferscheinPDFCustom')) { $Brief = new LieferscheinPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new LieferscheinPDF($this->app,$projektbriefpapier); } $Brief->GetLieferschein($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); } if($typ=="retoure") { // sende $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('RetourePDFCustom')) { $Brief = new RetourePDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new RetourePDF($this->app,$projektbriefpapier); } $Brief->GetRetoure($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); unlink($tmpfile); $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('RetourePDFCustom')) { $Brief = new RetourePDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new RetourePDF($this->app,$projektbriefpapier); } $Brief->GetRetoure($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); } // eigentliches dokument if($typ=="arbeitsnachweis") { // sende $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('ArbeitsnachweisPDFCustom')) { $Brief = new ArbeitsnachweisPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new ArbeitsnachweisPDF($this->app,$projektbriefpapier); } $Brief->GetArbeitsnachweis($id); if(isset($sammelpdf)) { foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } } $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); unlink($tmpfile); $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('ArbeitsnachweisPDFCustom')) { $Brief = new ArbeitsnachweisPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new ArbeitsnachweisPDF($this->app,$projektbriefpapier); } $Brief->GetArbeitsnachweis($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); if(isset($sammelpdf)) { unlink($tmpfile); if(class_exists('ArbeitsnachweisPDFCustom')) { $Brief = new ArbeitsnachweisPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new ArbeitsnachweisPDF($this->app,$projektbriefpapier); } $Brief->GetArbeitsnachweis($id); foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } $tmpfile = $Brief->displayTMP(); } } // eigentliches dokument if($typ=="reisekosten") { // sende $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('ReisekostenPDFCustom')) { $Brief = new ReisekostenPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new ReisekostenPDF($this->app,$projektbriefpapier); } $Brief->GetReisekosten($id); if(isset($sammelpdf)) { foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } } $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); unlink($tmpfile); $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('ReisekostenPDFCustom')) { $Brief = new ReisekostenPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new ReisekostenPDF($this->app,$projektbriefpapier); } $Brief->GetReisekosten($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); if(isset($sammelpdf)) { unlink($tmpfile); if(class_exists('ReisekostenPDFCustom')) { $Brief = new ReisekostenPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new ReisekostenPDF($this->app,$projektbriefpapier); } $Brief->GetReisekosten($id); foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } $tmpfile = $Brief->displayTMP(); } } // eigentliches dokument if($typ=="auftrag") { // sende if(class_exists('AuftragPDFCustom')) { $Brief = new AuftragPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new AuftragPDF($this->app,$projektbriefpapier); } $Brief->GetAuftrag($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); if(isset($sammelpdf)) { unlink($tmpfile); if(class_exists('AuftragPDFCustom')) { $Brief = new AuftragPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new AuftragPDF($this->app,$projektbriefpapier); } $Brief->GetAuftrag($id); foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } if($deckblatt){ $containerpdf = new Fpdi('P','mm','A4'); foreach($_POST as $pk => $pv){ $pka = explode('_',$pk); if($pka[0] == 'datei' && isset($pka[1]) && $pka[1] && is_numeric($pka[1])){ $dateiname = str_replace(' ','_',$this->app->erp->GetDateiName($pka[1])); if($dateiname){ $deckblattdatei = $this->app->DB->Select("SELECT datei FROM datei_stichwoerter WHERE datei=".$pka[1]." AND subjekt='Deckblatt' AND objekt='auftrag' AND parameter='$id'"); if($deckblattdatei){ //Zuerst alle Deckblätter der Reihe nach zum PDF Dokument hinzufügen $deckblattdateitmp = $this->app->erp->GetUSERDATA()."/dms/".$this->app->Conf->WFdbname."/".$deckblattdatei; $pages_count = $containerpdf->setSourceFile($deckblattdateitmp); for($j = 1; $j <= $pages_count; $j++) { $containerpdf->AddPage(); $tplIdx = $containerpdf->importPage($j); $containerpdf->useTemplate($tplIdx, 0, 0); } } } } } //Anschließend das eigentliche SammelPDF zum PDF mit den Deckblättern hinzufügen $pages_count = $containerpdf->setSourceFile($Brief->displayTMP()); for($j = 1; $j <= $pages_count; $j++) { $containerpdf->AddPage(); $tplIdx = $containerpdf->importPage($j); $containerpdf->useTemplate($tplIdx, 0, 0); } $containerpdf->Output($this->app->erp->GetTMP().$this->app->erp->Dateinamen($Brief->filename),'F'); $tmpfile = $this->app->erp->GetTMP().$this->app->erp->Dateinamen($Brief->filename); }else{ $tmpfile = $Brief->displayTMP(); } } } // eigentliches dokument if($typ=="rechnung") { // sende $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('RechnungPDFCustom')) { $Brief = new RechnungPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new RechnungPDF($this->app,$projektbriefpapier); } $Brief->GetRechnung($id); if(isset($sammelpdf)) { foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } } //$Brief->ArchiviereDocument(); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); unlink($tmpfile); $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('RechnungPDFCustom')) { $Brief = new RechnungPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new RechnungPDF($this->app,$projektbriefpapier); } $Brief->GetRechnung($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); if(isset($sammelpdf)) { unlink($tmpfile); if(class_exists('RechnungPDFCustom')) { $Brief = new RechnungPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new RechnungPDF($this->app,$projektbriefpapier); } $Brief->GetRechnung($id); foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } $tmpfile = $Brief->displayTMP(); } //$Brief->ArchiviereDocument(); } // eigentliches dokument if($typ=="gutschrift") { // sende $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('GutschriftPDFCustom')) { $Brief = new GutschriftPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new GutschriftPDF($this->app,$projektbriefpapier); } $Brief->GetGutschrift($id); if(isset($sammelpdf)) { foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } } $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); unlink($tmpfile); $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('GutschriftPDFCustom')) { $Brief = new GutschriftPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new GutschriftPDF($this->app,$projektbriefpapier); } $Brief->GetGutschrift($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); if(isset($sammelpdf)) { unlink($tmpfile); if(class_exists('GutschriftPDFCustom')) { $Brief = new GutschriftPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new GutschriftPDF($this->app,$projektbriefpapier); } $Brief->GetGutschrift($id); foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } $tmpfile = $Brief->displayTMP(); } } // eigentliches dokument if($typ=="anfrage") { // sende $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('AnfragePDFCustom')) { $Brief = new AnfragePDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new AnfragePDF($this->app,$projektbriefpapier); } $Brief->GetAnfrage($id); if(isset($sammelpdf)) { foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } } $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); unlink($tmpfile); $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('AnfragePDFCustom')) { $Brief = new AnfragePDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new AnfragePDF($this->app,$projektbriefpapier); } $Brief->GetAnfrage($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); if(isset($sammelpdf)) { unlink($tmpfile); if(class_exists('AnfragePDFCustom')) { $Brief = new AnfragePDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new AnfragePDF($this->app,$projektbriefpapier); } $Brief->GetAnfrage($id); foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } $tmpfile = $Brief->displayTMP(); } } // eigentliches dokument if($typ=="preisanfrage") { // sende $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('PreisanfragePDFCustom')) { $Brief = new PreisanfragePDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new PreisanfragePDF($this->app,$projektbriefpapier); } $Brief->GetPreisanfrage($id); if(isset($sammelpdf)) { foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } } $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); unlink($tmpfile); $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('PreisanfragePDFCustom')) { $Brief = new PreisanfragePDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new PreisanfragePDF($this->app,$projektbriefpapier); } $Brief->GetPreisanfrage($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); if(isset($sammelpdf)) { unlink($tmpfile); if(class_exists('PreisanfragePDFCustom')) { $Brief = new PreisanfragePDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new PreisanfragePDF($this->app,$projektbriefpapier); } $Brief->GetPreisanfrage($id); foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } $tmpfile = $Brief->displayTMP(); } } // eigentliches dokument if($typ=="produktion") { // sende $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('ProduktionPDFCustom')) { $Brief = new ProduktionPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new ProduktionPDF($this->app,$projektbriefpapier); } $Brief->GetProduktion($id); if(isset($sammelpdf)) { foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } } $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); unlink($tmpfile); $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('ProduktionPDFCustom')) { $Brief = new ProduktionPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new ProduktionPDF($this->app,$projektbriefpapier); } $Brief->GetProduktion($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); if(isset($sammelpdf)) { unlink($tmpfile); if(class_exists('ProduktionPDFCustom')) { $Brief = new ProduktionPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new ProduktionPDF($this->app,$projektbriefpapier); } $Brief->GetProduktion($id); foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } $tmpfile = $Brief->displayTMP(); } } // eigentliches dokument if($typ=="proformarechnung") { // sende $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('ProformarechnungPDFCustom')) { $Brief = new ProformarechnungPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new ProformarechnungPDF($this->app,$projektbriefpapier); } $Brief->GetProformarechnung($id); if(isset($sammelpdf)) { foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } } $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); unlink($tmpfile); $this->app->erp->BriefpapierHintergrunddisable = !$this->app->erp->BriefpapierHintergrunddisable; if(class_exists('ProformarechnungPDFCustom')) { $Brief = new ProformarechnungPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new ProformarechnungPDF($this->app,$projektbriefpapier); } $Brief->GetProformarechnung($id); $tmpfile = $Brief->displayTMP(); $Brief->ArchiviereDocument(true); if(isset($sammelpdf)) { unlink($tmpfile); if(class_exists('ProformarechnungPDFCustom')) { $Brief = new ProformarechnungPDFCustom($this->app,$projektbriefpapier); }else{ $Brief = new ProformarechnungPDF($this->app,$projektbriefpapier); } $Brief->GetProformarechnung($id); foreach($sammelpdf as $dat) { $Brief->AddPDF($dat); } $tmpfile = $Brief->displayTMP(); } } if($typ!="") { if($typ=="brieffax") $dateien = array($tmpbrief); else { $this->RunHook('DokumentMask', 5, $typ, $id, $tmpfile, $sammelpdf, $art); if(is_array($tmpfile)) { if(isset($tmpbrief) && $tmpbrief) { $dateien = array($tmpbrief); foreach($tmpfile as $v)$dateien[] = $v; }else{ $dateien = $tmpfile; } }else{ $dateien = array($tmpbrief,$tmpfile); } if(isset($_dateien))foreach ($_dateien as $dat)if($dat)$dateien[] = $dat; } } if($intern || $this->app->Secure->GetPOST('submit')!='') { //echo "SENDEN"; if($art=="fax"){ $ret = $this->DokumentSend($adresse, $typ, $id, $art, $betreff, $text, $dateien, $drucker, $ansprechpartner, $projekt, $this->app->Secure->GetPOST("faxnummer"), ""); }else{ $weitereadressids = ''; if($typ == 'preisanfrage'){ $weitereadressids = $this->app->Secure->GetPOST('pran_adressids'); if($weitereadressids != '' && $adresse > 0){ $adresse .= ';'.$weitereadressids; $this->app->erp->RunHook('preisanfrage_mails_abschicken', 13, $adresse, $typ, $id, $art, $betreff, $text, $dateien, $drucker, $ansprechpartner, $projekt, $partnerinfo['email'], $tmpcc, $tmpbcc); }elseif($weitereadressids == ''){ $ret = $this->DokumentSend($adresse, $typ, $id, $art, $betreff, $text, $dateien, $drucker, $ansprechpartner, $projekt, $partnerinfo['email'], $partnerinfo['name'], $tmpcc, $tmpbcc); } }else{ $ret = $this->DokumentSend($adresse, $typ, $id, $art, $betreff, $text, $dateien, $drucker, $ansprechpartner, $projekt, $partnerinfo['email'], $partnerinfo['name'], $tmpcc, $tmpbcc); } } if($tmpis == 0)$this->RunHook('dokumentsend_email',6, $typ, $id,$betreff,$text,$dateien, $intern); if(isset($zuloeschen) && is_array($zuloeschen)) { foreach($zuloeschen as $zl)unlink($zl); unset($zuloeschen); } $this->BriefpapierHintergrundEnable(); /* // NEU ANLEGEN ODER UPDATE if($typ=="brieffax") { $check = $this->app->DB->Select("SELECT id FROM dokumente_send WHERE text='$text' AND betreff='$betreff' AND geloescht=0 AND versendet=0 ORDER by id DESC LIMIT 1"); } else { $check = $this->app->DB->Select("SELECT id FROM dokumente_send WHERE dokument='$typ' AND parameter='$id' AND geloescht=0 AND versendet=0 ORDER by id DESC LIMIT 1"); // GEHT bei BE RE LS } */ //Datei anlegen if($this->Firmendaten("belegeinanhang")=="1") { $fileid = $this->CreateDateiWithStichwort($Brief->filename,$module,"","",$tmpfile,$this->app->User->GetName() ,$typ,$typ,$id, "",false); /*$fileid = $this->CreateDatei($Brief->filename,$module,"","",$tmpfile,$this->app->User->GetName()); $this->AddDateiStichwort($fileid,$typ,$typ,$id,$without_log=false);*/ } if(is_numeric($check) && $check >0) { /* if($typ=="brieffax") { // das dokument gibt es so bereits 1:1 hier braucht man nichts machen //echo "DAS DOKUMENT GIBT ES UNVERSENDET SO"; $this->app->DB->Update("UPDATE dokumente_send SET versendet=1 WHERE id='$check' LIMIT 1"); } else { $this->app->DB->Update("UPDATE dokumente_send SET betreff='$betreff', text='$text',versendet=1 WHERE dokument='$typ' AND parameter='$id' AND geloescht=0 AND versendet=0 LIMIT 1"); // GEHT bei RE, LS .. } */ } else { if($typ=="brieffax") { $this->app->DB->Insert("INSERT INTO dokumente_send (id,dokument,zeit,bearbeiter,adresse,parameter,art,betreff,text,projekt,ansprechpartner,versendet,dateiid) VALUES ('','$typ',NOW(),'".$this->app->User->GetName()."', '$adresse','$parameter','$art','$betreff','$text','$projekt','$ansprechpartner',1,'$fileid')"); $tmpid = $this->app->DB->GetInsertID(); $this->app->DB->Update("UPDATE dokumente_send SET parameter='$tmpid' WHERE id='$tmpid' LIMIT 1"); //echo "INSERT brieffax dokument"; } else { //echo "anlegen begleitschreiben RE, LS"; //TODO ANSPRECHPARTNER if($weitereadressids == ''){ $this->app->DB->Insert("INSERT INTO dokumente_send (id,dokument,zeit,bearbeiter,adresse,parameter,art,betreff,text,projekt,ansprechpartner,versendet,dateiid) VALUES ('','$typ',NOW(),'".$this->app->User->GetName()."', '$adresse','$id','$art','$betreff','$text','$projekt','$ansprechpartner',1,'$fileid')"); $tmpid = $this->app->DB->GetInsertID(); } } } if($ret == "") { if(!$intern)$this->app->Tpl->Set($parsetarget,"
Dokument wurde erfolgreich versendet
"); /* Status gezielt von Dokument aendern */ if($typ=="bestellung") { $this->app->DB->Update("UPDATE bestellung SET versendet=1, versendet_am=NOW(), versendet_per='$art',versendet_durch='".$this->app->User->GetName()."',schreibschutz='1' WHERE id='$id' LIMIT 1"); $this->app->DB->Update("UPDATE bestellung SET status='versendet' WHERE id='$id' AND status='freigegeben' LIMIT 1"); $this->BestellungProtokoll($id,"Bestellung versendet"); //TODO ARCHIVIEREN } else if($typ=="angebot") { $this->app->DB->Update("UPDATE angebot SET versendet=1, versendet_am=NOW(), versendet_per='$art',versendet_durch='".$this->app->User->GetName()."',schreibschutz='1' WHERE id='$id' LIMIT 1"); $this->app->DB->Update("UPDATE angebot SET status='versendet' WHERE id='$id' AND status='freigegeben' LIMIT 1"); $this->AngebotProtokoll($id,"Angebot versendet"); //TODO ARCHIVIEREN } else if($typ=="lieferschein") { $this->app->DB->Update("UPDATE lieferschein SET versendet=1, versendet_am=NOW(), versendet_per='$art',versendet_durch='".$this->app->User->GetName()."',schreibschutz='1' WHERE id='$id' LIMIT 1"); $this->app->DB->Update("UPDATE lieferschein SET status='versendet' WHERE id='$id' AND status='freigegeben' LIMIT 1"); $this->LieferscheinProtokoll($id,"Lieferschein versendet"); //TODO ARCHIVIEREN } else if($typ=="retoure") { $this->app->DB->Update("UPDATE retoure SET versendet=1, versendet_am=NOW(), versendet_per='$art',versendet_durch='".$this->app->User->GetName()."',schreibschutz='1' WHERE id='$id' LIMIT 1"); $this->app->DB->Update("UPDATE retoure SET status='versendet' WHERE id='$id' AND status='freigegeben' LIMIT 1"); $this->RetoureProtokoll($id,"Retoure versendet"); //TODO ARCHIVIEREN } else if($typ=="arbeitsnachweis") { $this->app->DB->Update("UPDATE arbeitsnachweis SET versendet=1, versendet_am=NOW(), versendet_per='$art',versendet_durch='".$this->app->User->GetName()."',schreibschutz='1' WHERE id='$id' LIMIT 1"); $this->app->DB->Update("UPDATE arbeitsnachweis SET status='versendet' WHERE id='$id' AND status='freigegeben' LIMIT 1"); $this->ArbeitsnachweisProtokoll($id,"Arbeitsnachweis versendet"); //TODO ARCHIVIEREN } else if($typ=="reisekosten") { $this->app->DB->Update("UPDATE reisekosten SET versendet=1, versendet_am=NOW(), versendet_per='$art',versendet_durch='".$this->app->User->GetName()."',schreibschutz='1' WHERE id='$id' LIMIT 1"); $this->app->DB->Update("UPDATE reisekosten SET status='versendet' WHERE id='$id' AND status='freigegeben' LIMIT 1"); $this->ReisekostenProtokoll($id,"Reisekosten versendet"); //TODO ARCHIVIEREN } else if($typ=="auftrag") { $this->app->DB->Update("UPDATE auftrag SET versendet=1, versendet_am=NOW(), versendet_per='$art',versendet_durch='".$this->app->User->GetName()."',schreibschutz='1' WHERE id='$id' LIMIT 1"); //$this->app->DB->Update("UPDATE auftrag SET status='versendet' WHERE id='$id' AND status='freigegeben' LIMIT 1"); $this->AuftragProtokoll($id,"Auftrag versendet"); //TODO ARCHIVIEREN } else if ($typ=="rechnung") { $this->app->DB->Update("UPDATE rechnung SET versendet=1, versendet_am=NOW(), versendet_per='$art',versendet_durch='".$this->app->User->GetName()."',schreibschutz='1' WHERE id='$id' LIMIT 1"); $this->closeInvoice($id,'freigegeben'); $this->app->DB->Update("UPDATE rechnung SET status='versendet' WHERE id='$id' AND status='freigegeben' LIMIT 1"); $this->RechnungProtokoll($id,"Rechnung versendet"); //TODO ARCHIVIEREN } else if ($typ=="gutschrift") { $this->app->DB->Update("UPDATE gutschrift SET versendet=1, versendet_am=NOW(), versendet_per='$art',versendet_durch='".$this->app->User->GetName()."',schreibschutz='1' WHERE id='$id' LIMIT 1"); $this->app->DB->Update("UPDATE gutschrift SET status='versendet' WHERE id='$id' AND status='freigegeben' LIMIT 1"); $this->GutschriftProtokoll($id,"Gutschrift versendet"); //TODO ARCHIVIEREN } else if ($typ=="proformarechnung") { $this->app->DB->Update("UPDATE proformarechnung SET versendet=1, versendet_am=NOW(), versendet_per='$art',versendet_durch='".$this->app->User->GetName()."',schreibschutz='1' WHERE id='$id' LIMIT 1"); $this->app->DB->Update("UPDATE proformarechnung SET status='versendet' WHERE id='$id' AND status='freigegeben' LIMIT 1"); $this->ProformarechnungProtokoll($id,"Proformarechnung versendet"); //TODO ARCHIVIEREN } else if ($typ=="preisanfrage") { $this->app->DB->Update("UPDATE preisanfrage SET versendet=1, versendet_am=NOW(), versendet_per='$art',versendet_durch='".$this->app->User->GetName()."',schreibschutz='1' WHERE id='$id' LIMIT 1"); $this->app->DB->Update("UPDATE preisanfrage SET status='versendet' WHERE id='$id' AND status='freigegeben' LIMIT 1"); $this->PreisanfrageProtokoll($id,"Preisanfrage versendet"); //TODO ARCHIVIEREN }else if ($typ=="spedition") { $this->app->DB->Update("UPDATE spedition SET versendet=1, schreibschutz='1' WHERE id='$id' LIMIT 1"); $this->app->DB->Update("UPDATE spedition SET status='versendet' WHERE id='$id' AND status='freigegeben' LIMIT 1"); $this->app->DB->Insert("INSERT INTO spedition_protokoll (bearbeiter, grund, avi) VALUES ('".$this->app->DB->real_escape_string($this->app->User->GetName())."', 'Spedition versendet', '$id')"); } $this->RunHook('DokumentMaskVersendet', 2, $typ, $id); } else { $this->BelegProtokoll($typ,$id,$ret); if(!$intern)$this->app->Tpl->Set($parsetarget,"
$ret
"); } } elseif ($this->app->Secure->GetPOST("speichern")!="") { //echo "SPEICHERN"; // Nur speichern $action = $this->app->Secure->GetGET("action"); $module = $this->app->Secure->GetGET("module"); if($module=="adresse") { $check = $this->app->DB->Select("SELECT id FROM dokumente_send WHERE dokument='brieffax' AND geloescht=0 AND versendet=0 ORDER by id DESC LIMIT 1"); } else { $check = $this->app->DB->Select("SELECT id FROM dokumente_send WHERE dokument='$typ' AND parameter='$id' AND geloescht=0 AND versendet=0 ORDER by id DESC LIMIT 1"); // GEHT bei BE RE LS } if($module=="adresse") { $typ="brieffax"; if(is_numeric($check)) { $this->app->DB->Insert("UPDATE dokumente_send SET betreff='$betreff',text='$text',bearbeiter='".$this->app->User->GetName()."' WHERE id='$check' LIMIT 1"); $this->app->Tpl->Set('MESSAGE',"
Die Änderungen wurden gespeichert.
"); } else { $this->app->DB->Insert("INSERT INTO dokumente_send (id,dokument,zeit,bearbeiter,adresse,parameter,art,betreff,text,projekt,ansprechpartner,versendet) VALUES ('','$typ',NOW(),'".$this->app->User->GetName()."', '$adresse','$parameter','$art','$betreff','$text','$projekt','$ansprechpartner',0)"); $this->app->Tpl->Set('MESSAGE',"
Es wurde ein neues Dokument wurde angelegt, da das alte Dokument bereits versendet worden ist.
"); } } else { if(is_numeric($check)) { $this->app->DB->Update("UPDATE dokumente_send SET betreff='$betreff',text='$text',bearbeiter='".$this->app->User->GetName()."' WHERE id='$check' LIMIT 1"); $this->app->Tpl->Set('MESSAGE',"
Die Änderungen wurden gespeichert.
"); } else { $parameter = $this->app->Secure->GetGET("id"); $this->app->DB->Insert("INSERT INTO dokumente_send (id,dokument,zeit,bearbeiter,adresse,parameter,art,betreff,text,projekt,ansprechpartner,versendet) VALUES ('','$typ',NOW(),'".$this->app->User->GetName()."', '$adresse','$parameter','$art','$betreff','$text','$projekt','$ansprechpartner',0)"); $this->app->Tpl->Set('MESSAGE',"
Es wurde ein neues Dokument wurde angelegt, da das alte Dokument bereits versendet worden ist.
"); } } }elseif($this->app->Secure->GetPOST("download")!="") { header("Location: index.php?module=adresse&action=briefpdf&sid=$id&id=$adresse"); exit; } } // ENDE SCHLEIFE if(!$intern) { $tmp_fax = $this->app->DB->Select("SELECT telefax FROM $typ WHERE id='$id' LIMIT 1"); $tmp_fax = str_replace('+','00',$tmp_fax); $n = preg_match_all("/[0-9]/", $tmp_fax, $treffer); for($i=0;$i<$n;$i++){ $nummer = $nummer . $treffer[0][$i]; if($n%2 == 1 && $i%2 == 0 && $i < $n-1){ $nummer = $nummer . ""; }elseif($n%2 == 0 && $i%2 == 1 && $i < $n-1){ $nummer = $nummer . ""; } } $this->app->Tpl->Set('FAXNUMMER',$nummer); if(!empty($this->app->User) && method_exists($this->app->User, 'GetParameter')){ if($this->app->User->GetParameter('dokumente_abschickenmask_' . $typ . "_brief") == '1'){ $this->app->Tpl->Set("BRIEFCHECKED", 'checked'); } if($this->app->User->GetParameter('dokumente_abschickenmask_' . $typ . "_email") == '1') { $this->app->Tpl->Set("EMAILCHECKED", 'checked'); } if($this->app->User->GetParameter('dokumente_abschickenmask_' . $typ . "_fax") == '1') { $this->app->Tpl->Set("FAXCHECKED", 'checked'); } if($this->app->User->GetParameter('dokumente_abschickenmask_' . $typ . "_telefon") == '1') { $this->app->Tpl->Set("TELEFONCHECKED", 'checked'); } if($this->app->User->GetParameter('dokumente_abschickenmask_' . $typ . "_sonstiges") == '1') { $this->app->Tpl->Set("SONSTIGESCHECKED", 'checked'); } $selected = $this->app->User->GetParameter('drucker_dokumentmask_' . $typ); $this->app->Tpl->Set('DRUCKER', $this->GetSelectDrucker($selected)); } $this->app->Tpl->Set('FAX',$this->GetSelectFax()); $this->app->Tpl->Set('EMAILEMPFAENGER',$this->GetSelectEmail($this->Firmendaten("email"))); $projektabkuerzung = $this->app->DB->Select("SELECT abkuerzung FROM projekt WHERE id='$projekt'"); $this->app->Tpl->Set('PROJEKT',$projektabkuerzung); //$this->app->Tpl->Set(PROJEKT,$this->GetProjektSelect($projekt)); // $this->app->Tpl->Set(ANSPRECHPARTNER,$this->GetSelectAnsprechpartner($adresse,$projekt)); $tmp_mail = $this->app->DB->Select("SELECT email FROM $typ WHERE id='$id' LIMIT 1"); $tmp_name = $this->app->DB->Select("SELECT ansprechpartner FROM $typ WHERE id='$id' LIMIT 1"); if($tmp_name=="") $tmp_name = $this->app->DB->Select("SELECT name FROM $typ WHERE id='$id' LIMIT 1"); //$this->app->Tpl->Set(ANSPRECHPARTNER,$tmp_name." <".$tmp_mail.">"); $this->app->Tpl->Set('ANSPRECHPARTNER',$this->GetAdresseMail($adresse,$id,$typ)); $this->app->Tpl->Set('SELECTUNSICHTBAR', ''); $this->app->Tpl->Set('MANUELLUNSICHTBAR', 'display:none;'); //$this->app->YUI->AutoComplete('ansprechpartner', 'emailname'); $this->app->YUI->AutoComplete('projekt', 'projektname',1); $projekt = $this->app->DB->Select("SELECT projekt FROM $typ WHERE id='$id' LIMIT 1"); $this->DokumentSendShow($parsetarget,$typ,$id,$adresse,$tmpfile,$popup,$projekt); } // temp datei wieder loeschen if(@is_file($tmpfile))unlink($tmpfile); if(@is_file($tmpbrief))unlink($tmpbrief); } function GetAdresseMail($adresse,$id="",$tabelle="") { // hole adresse aus feld ansprechpartner $tmp_mail = $this->app->DB->Select("SELECT email FROM $tabelle WHERE id='$id' LIMIT 1"); $tmp_name = $this->app->DB->Select("SELECT ansprechpartner FROM $tabelle WHERE id='$id' LIMIT 1"); if($tmp_name=="") $tmp_name = $this->app->DB->Select("SELECT name FROM $tabelle WHERE id='$id' LIMIT 1"); $data[0]['name']=$tmp_name; $data[0]['email']=$tmp_mail; // doppelte eintraege loeschen if($data[0]['email']==$tmp_mail) { $result = ""; } else $result = ""; $data = $this->app->DB->SelectArr("SELECT name, email FROM adresse WHERE id='$adresse' ORDER by name"); $data2 = $this->app->DB->SelectArr("SELECT name, email FROM ansprechpartner WHERE adresse='$adresse' ORDER by name"); foreach($data2 as $item) { $check=false; foreach($data as $check_item) { if($item['name']==$check_item['name'] && $item['email']==$check_item['email']) $check=true; } if($check!=true) $data[]=array('name'=>$item['name'],'email'=>$item['email']); } for($i=0;$i<(!empty($data)?count($data):0);$i++) { if($data[$i]['email']!=$tmp_mail && $data[$i]['name']!=$tmp_name) { if($data[$i]['email']==$tmp_mail) $result .= ""; else $result .= ""; } } return $result; } function DokumentSendShow($parsetarget,$dokument,$id,$adresse,$attachments="",$popup=false,$projekt="", $intern = false) { $return = null; $this->BriefpapierHintergrunddisable = false; $sprache = $this->app->DB->Select("SELECT sprache FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); $name = $this->app->DB->Select("SELECT name FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); $name2 = $this->app->DB->Select("SELECT name FROM $dokument WHERE id='$id' LIMIT 1"); $abperfax = $this->app->DB->Select("SELECT abperfax FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); if($abperfax=="1") $this->app->Tpl->Set('ABPERFAX',"checked"); $testdata = null;//@todo check query $this->app->DB->SelectArr("SELECT betreff WHERE dokument='".$dokument."' AND parameter='$id' AND parameter!=0 ORDER BY zeit DESC LIMIT 1"); if($sprache=="") $sprache="deutsch"; switch($dokument) { case "bestellung": if($tmp_data[0]['betreff']!="") $this->DokumentSendVorlage($id); else { $return = $this->Geschaeftsbriefvorlage($sprache,"Bestellung",$projekt,$name2,$id, $intern); if(!$intern) { $this->app->Tpl->Add('TEXT',"\n\n".$this->Grussformel($projekt,$sprache)); }else{ $return['text'] .= "\n\n".$this->Grussformel($projekt,$sprache); } } break; case "angebot": $return = $this->Geschaeftsbriefvorlage($sprache,"Angebot",$projekt,$name2,$id, $intern); if(!$intern) { $this->app->Tpl->Add('TEXT',"\n\n".$this->Grussformel($projekt,$sprache)); }else{ $return['text'] .= "\n\n".$this->Grussformel($projekt,$sprache); } break; case "lieferschein": $return = $this->Geschaeftsbriefvorlage($sprache,"Lieferschein",$projekt,$name2,$id, $intern); if(!$intern) { $this->app->Tpl->Add('TEXT',"\n\n".$this->Grussformel($projekt,$sprache)); }else{ $return['text'] .= "\n\n".$this->Grussformel($projekt,$sprache); } break; case "retoure": $return = $this->Geschaeftsbriefvorlage($sprache,"Retoure",$projekt,$name2,$id, $intern); if(!$intern) { $this->app->Tpl->Add('TEXT',"\n\n".$this->Grussformel($projekt,$sprache)); }else{ $return['text'] .= "\n\n".$this->Grussformel($projekt,$sprache); } break; case "rechnung": $return = $this->Geschaeftsbriefvorlage($sprache,"Rechnung",$projekt,$name2,$id, $intern); if(!$intern) { $this->app->Tpl->Add('TEXT',"\n\n".$this->Grussformel($projekt,$sprache)); }else{ $return['text'] .= "\n\n".$this->Grussformel($projekt,$sprache); } break; case "gutschrift": $return = $this->Geschaeftsbriefvorlage($sprache,"Gutschrift",$projekt,$name2,$id, $intern); if(!$intern) { $this->app->Tpl->Add('TEXT',"\n\n".$this->Grussformel($projekt,$sprache)); }else{ $return['text'] .= "\n\n".$this->Grussformel($projekt,$sprache); } break; case "auftrag": $return = $this->Geschaeftsbriefvorlage($sprache,"Auftrag",$projekt,$name2,$id, $intern); if(!$intern) { $this->app->Tpl->Add('TEXT',"\n\n".$this->Grussformel($projekt,$sprache)); }else{ $return['text'] .= "\n\n".$this->Grussformel($projekt,$sprache); } break; case "arbeitsnachweis": $return = $this->Geschaeftsbriefvorlage($sprache,"Auftrag",$projekt,$name2,$id, $intern); if(!$intern) { $this->app->Tpl->Add('TEXT',"\n\n".$this->Grussformel($projekt,$sprache)); }else{ $return['text'] .= "\n\n".$this->Grussformel($projekt,$sprache); } break; case "proformarechnung": $return = $this->Geschaeftsbriefvorlage($sprache,"Proformarechnung",$projekt,$name2,$id, $intern); if(!$intern) { $this->app->Tpl->Add('TEXT',"\n\n".$this->Grussformel($projekt,$sprache)); }else{ $return['text'] .= "\n\n".$this->Grussformel($projekt,$sprache); } break; case "preisanfrage": $return = $this->Geschaeftsbriefvorlage($sprache,"Preisanfrage",$projekt,$name2,$id, $intern); if(!$intern) { $this->app->Tpl->Add('TEXT',"\n\n".$this->Grussformel($projekt,$sprache)); }else{ $return['text'] .= "\n\n".$this->Grussformel($projekt,$sprache); } break; case "produktion": $return = $this->Geschaeftsbriefvorlage($sprache,"Produktion",$projekt,$name2,$id, $intern); if(!$intern) { $this->app->Tpl->Add('TEXT',"\n\n".$this->Grussformel($projekt,$sprache)); }else{ $return['text'] .= "\n\n".$this->Grussformel($projekt,$sprache); } break; case "brieffax": if($testdata!="") $this->DokumentSendVorlage($id); else { $return = $this->Geschaeftsbriefvorlage($sprache,"Korrespondenz",$projekt,$name2, $intern); if(!$intern) { $this->app->Tpl->Add('TEXT',"\n\n".$this->Grussformel($projekt,$sprache)); }else{ $return['text'] .= "\n\n".$this->Grussformel($projekt,$sprache); } } break; default: ; } if(!$intern && !empty($this->app->User) && method_exists($this->app->User, 'GetParameter') && $this->app->User->GetParameter('dokument_absenden_alleartikel')=='1') { $tabelle = strtolower($dokument); $dateianhaenge = $this->app->DB->SelectArr("SELECT DISTINCT ds.id, ds.datei, d.titel,ds.subjekt, ds.objekt, ds.sort FROM datei_stichwoerter ds INNER JOIN datei d on ds.datei = d.id where d.geloescht <> 1 AND (ds.parameter = '$id' AND ds.objekt like '$dokument') OR ((ds.parameter IN (SELECT DISTINCT artikel FROM ".$tabelle."_position WHERE ".$tabelle."='$id') ) AND ds.objekt like 'artikel') ORDER BY ds.objekt like '$dokument' DESC, ds.sort"); } else { $dateianhaenge = $this->app->DB->SelectArr("SELECT DISTINCT ds.id, ds.datei, d.titel,ds.subjekt, ds.objekt, ds.sort FROM datei_stichwoerter ds INNER JOIN datei d on ds.datei = d.id where d.geloescht <> 1 AND ds.parameter = '$id' AND ds.objekt like '$dokument' AND ds.subjekt!='$dokument' ORDER BY ds.sort"); if($intern)$intern['dateianhaenge'] = $dateianhaenge; } if($intern)return $return; if($dateianhaenge) { $sort = 0; foreach($dateianhaenge as $dk => $dv) { $sort++; if(strtolower($dv['objekt']) == strtolower($dokument)) { if($dv['sort'] != $sort)$this->app->DB->Update("UPDATE datei_stichwoerter SET sort = '$sort' WHERE id = '".$dv['id']."' LIMIT 1"); $dateianhaenge[$dk]['sort'] = $sort; } } foreach($dateianhaenge as $dk => $dv) { if(strtolower($dv['subjekt'])=="anhang") $checked="checked"; else $checked=""; $dateiname = $this->GetDateiName($dv['datei']); if($this->app->User->GetParameter("dokument_absenden_sammelpdf")=="1" && strtolower($dv['objekt']) == strtolower($dokument)) { $extraspalte = ""; } else $extraspalte=" "; $this->app->Tpl->Add('DATEIANHAENGE',''.$dateiname.''.$extraspalte.''); } } else { $this->app->Tpl->Add('DATEIANHAENGE','Keine Anhänge vorhanden.
Dateien können unter dem Reiter "Dateien"
als Anhang dem Dokument
angehängt werden.
'); } $module = $this->app->Secure->GetGET("module"); $id = $this->app->Secure->GetGET("id"); if($module=="adresse") { //echo "Fall 1"; // genau das eine dokument $tmp = $this->app->DB->SelectArr("SELECT DATE_FORMAT(zeit,'%d.%m.%Y %H:%i') as datum, dateiid, text, betreff, ansprechpartner, id, adresse, bearbeiter,art, dokument, parameter, versendet FROM dokumente_send WHERE dokument='".$dokument."' AND id='$id' AND parameter!=0 AND versendet=1 ORDER by zeit DESC"); //echo ("SELECT DATE_FORMAT(zeit,'%d.%m.%Y %H:%i') as zeit, text, betreff, id, adresse, bearbeiter,art, dokument, parameter, versendet FROM dokumente_send WHERE dokument='".$dokument."' // AND id='$id' parameter!=0 AND versendet=1 ORDER by zeit"); } else { // alle passenden dokumente $tmp = $this->app->DB->SelectArr("SELECT DATE_FORMAT(zeit,'%d.%m.%Y %H:%i') as datum, text, dateiid, ansprechpartner, betreff, id, adresse, versendet, parameter, dokument, bearbeiter,art FROM dokumente_send WHERE dokument='".$dokument."' AND parameter='$id' AND parameter!=0 ORDER by zeit DESC"); //echo "Fall 2"; } if((!empty($tmp)?count($tmp):0)>0) { $this->app->Tpl->Set('HISTORIE',""); $this->app->Tpl->Add('HISTORIE',""); for($i=0;$i<(!empty($tmp)?count($tmp):0);$i++) { if($tmp[$i]['versendet']==0) $tmp[$i]['versendet'] = "nein"; else $tmp[$i]['versendet'] = "ja"; //$tmp_name = $this->app->DB->Select("SELECT name FROM adresse WHERE id='{$tmp[$i]['adresse']}' AND geloescht=0 LIMIT 1"); if(is_numeric($tmp[$i]['ansprechpartner'])) $tmp_name = $this->app->DB->Select("SELECT name FROM adresse WHERE id='".$tmp[$i]['ansprechpartner']."'"); else $tmp_name = htmlentities($tmp[$i]['ansprechpartner'],ENT_QUOTES, "UTF-8"); //$tmp_name = $this->app->DB->Select("SELECT name FROM adresse WHERE id='{$tmp[$i]['adresse']}' AND geloescht=0 LIMIT 1"); if($tmp[$i]['dateiid'] > 0) $tmppdf = ''; else $tmppdf=""; $this->app->Tpl->Add('HISTORIE',''); } $this->app->Tpl->Add('HISTORIE',"
ZeitAnVon Art AnschreibenDokument
'.$tmp[$i]['datum'].' '.$tmp_name.''.$tmp[$i]['bearbeiter'].' '.ucfirst($tmp[$i]['art']).' '.$tmppdf.'
"); } else { $this->app->Tpl->Set('HISTORIE',"
Dieses Dokument wurde noch nicht versendet!
"); } if (gettype($attachments) == 'string') { $attachments = (Array) $attachments; } for($i=0;$i<(!empty($attachments)?count($attachments):0);$i++) { $this->app->Tpl->Add('ANHAENGE',"".basename($attachments[$i])." "); } if((!empty($attachments)?count($attachments):0)==0) $this->app->Tpl->Add('ANHAENGE',"keine Anhänge vorhanden"); if((!empty($tmp)?count($tmp):0)>0) { $tmp[0]['betreff'] = str_replace('{FIRMA}',$this->Firmendaten("name"),$tmp[0]['betreff']); $tmp[0]['text'] = str_replace('{FIRMA}',$this->Firmendaten("name"),$tmp[0]['text']); $tmp[0]['betreff'] = $this->ParseUserVars($dokument,$id, $tmp[0]['betreff']); $tmp[0]['text'] = $this->ParseUserVars($dokument,$id, $tmp[0]['text']); if($tmp[0]['betreff']!="") $this->app->Tpl->Set('BETREFF',$tmp[0]['betreff']); if($tmp[0]['text']!="") $this->app->Tpl->Set('TEXT',$tmp[0]['text']); } $tmp = new EasyTable($this->app); if($dokument == 'spedition'){ $tmp->Query("SELECT zeit,bearbeiter,grund FROM ".$dokument."_protokoll WHERE avi='$id' ORDER by zeit DESC"); }else{ $tmp->Query("SELECT zeit,bearbeiter,grund FROM ".$dokument."_protokoll WHERE $dokument='$id' ORDER by zeit DESC"); } $tmp->DisplayNew('PROTOKOLL',"Protokoll","noAction"); $this->app->YUI->AutoSaveUserParameter("alleartikel","dokument_absenden_alleartikel","window.location.href='index.php?module=$dokument&action=abschicken&id=$id';"); if(!empty($this->app->User) && method_exists($this->app->User, 'GetParameter') && $this->app->User->GetParameter("dokument_absenden_alleartikel")=="1") { $this->app->Tpl->Set("ALLEARTIKEL","checked"); } $this->app->YUI->AutoSaveUserParameter("sammelpdf","dokument_absenden_sammelpdf","window.location.href='index.php?module=$dokument&action=abschicken&id=$id';"); if(!empty($this->app->User) && method_exists($this->app->User, 'GetParameter') && $this->app->User->GetParameter("dokument_absenden_sammelpdf")=="1") { $this->app->Tpl->Set("SAMMELPDF","checked"); } $this->app->YUI->CkEditor("text","internal",array("height"=>"450")); if(is_file('pages/content/dokument_absenden_vorlage.tpl')) { $this->app->Tpl->Set('EMPFAENGER',$name); $pTemplate = (($popup==true) ? 'dokument_absenden_popup.tpl' : 'dokument_absenden_vorlage.tpl'); $this->app->Tpl->Parse($parsetarget, $pTemplate); } else { $this->app->Tpl->Set('EMPFAENGER',$name); $pTemplate = (($popup==true) ? 'dokument_absenden_popup.tpl' : 'dokument_absenden.tpl'); if($popup != true) { $this->app->Tpl->Add('EMAILHOOK', ''); $this->RunHook('dokument_absenden_email', 2, $dokument, $id); } $this->app->Tpl->Parse($parsetarget, $pTemplate); } } //art=email,betreff,text,dateien, email_to, email_name_to function DokumentSend($adresse,$dokument, $parameter, $art,$betreff,$text,$dateien,$drucker="",$ansprechpartner="",$projekt="",$email_to="", $email_name_to="",$cc="",$bcc="") { // $ret muss geleert werden wenn Dokument erfolgreich versendet wurde!! $ret = "Das Dokument konnte nicht versendet werden! (Bitte wählen Sie eine Versandoption aus um das Dokument zu versenden)"; //$text = $this->ParseUserVars($dokument,$parameter,$text); //$betreff = $this->ParseUserVars($dokument,$parameter,$betreff); if($dokument!="" && $drucker!="") $this->app->User->SetParameter("drucker_dokumentmask_".$dokument,$drucker); switch($art) { case "email": // signatur + dokument als anhang $ret = ""; if($email_to!='') { $to = $email_to; $to_name = $email_name_to; }else{ if($ansprechpartner!=0) { $to = $this->app->DB->Select("SELECT email FROM ansprechpartner WHERE id='$ansprechpartner' LIMIT 1"); $to_name = $this->app->DB->Select("SELECT name FROM ansprechpartner WHERE id='$ansprechpartner' LIMIT 1"); } else { $to = $this->app->DB->Select("SELECT email 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 if($drucker==$this->app->User->GetEmail()) $from_name = $this->app->User->GetName(); else { // $from_name = $this->app->DB->Select("SELECT absendername FROM firmendaten WHERE absendername!='' AND email!='' AND email='$drucker' LIMIT 1"); $from_name = $this->app->DB->Select("SELECT wert FROM firmendaten_werte WHERE name = 'absendername' LIMIT 1"); if($from_name=="") $from_name = $this->app->DB->Select("SELECT smtp_fromname FROM emailbackup WHERE smtp_fromname!='' AND smtp_frommail!='' AND smtp_frommail='$drucker' AND geloescht!=1 LIMIT 1"); } if($from_name=="") $from_name=$this->GetFirmaAbsender(); if($drucker=="") $drucker=$this->GetFirmaMail(); if($dokument=="auftrag") { $abweichendeemailab = $this->app->DB->Select("SELECT abweichendeemailab FROM adresse WHERE id='$adresse' AND geloescht!=1 LIMIT 1"); if($abweichendeemailab!="") $to = $abweichendeemailab; } $cc_empfaengerausadresse = $this->app->DB->Select("SELECT ".$dokument."_cc FROM adresse WHERE id='$adresse' AND geloescht!=1 LIMIT 1"); $cc_empfaenger = []; $bcc_empfaenger = []; if(!empty($cc_empfaengerausadresse)){ $cc_empfaenger = explode(',',$cc_empfaengerausadresse); } $text = str_replace('\"','"',$text); if($cc!="") { if (strpos($cc, ',') !== false) { $tmpcc = explode(',',$cc); $cc_empfaenger = array_merge($cc_empfaenger, $tmpcc); } else $cc_empfaenger[] = trim($cc); } if($bcc!="") { if (strpos($bcc, ',') !== false) { $tmpbcc = explode(',',$bcc); $bcc_empfaenger = array_merge($bcc_empfaenger, $tmpbcc); } else $bcc_empfaenger[] = trim($bcc); } foreach($cc_empfaenger as $index => $empfaenger){ $cc_empfaenger[$index] = trim(trim($empfaenger,'>'),'<'); } foreach($bcc_empfaenger as $index => $empfaenger){ $bcc_empfaenger[$index] = trim(trim($empfaenger,'>'),'<'); } if($this->MailSend($drucker,$from_name,$to,$to_name,$betreff,$text,$dateien,$projekt,true,$cc_empfaenger,$bcc_empfaenger)){ $ret = ""; $this->RunHook('documentsend_email_success', 8, $dokument, $parameter, $drucker, $to, $to_name, $betreff, $text, $dateien); } else { if($to=="") $ret = "Keine Empfängeradresse gefunden. E-Mail konnte nicht versendet werden."; else $ret = "Die E-Mail konnte nicht versendet werden! (".$this->mail_error.")"; } break; case "brief": foreach($dateien as $key=>$value) $this->app->printer->Drucken($drucker,$value); $ret = ""; break; case "fax": foreach($dateien as $key=>$value) $this->app->printer->Drucken($drucker,$value,$email_to); $ret = ""; break; case "telefon": $ret = ""; break; case "sonstiges": $ret = ""; break; } $this->app->erp->RunHook('dokumentsend_ende', 5, $dokument, $parameter, $projekt, $adresse, $art); return $ret; } function NewEvent($beschreibung, $kategorie, $objekt='',$parameter='') { $bearbeiter = $this->app->User->GetName(); $this->app->DB->Insert("INSERT INTO event (id,beschreibung,kategorie,zeit,objekt,parameter,bearbeiter) VALUES('','$beschreibung','$kategorie',NOW(),'$objekt','$parameter','$bearbeiter')"); } function UpdateChecksumShopartikel($projekt) { $tmp = $this->app->DB->SelectArr("SELECT id FROM artikel WHERE shop > 0"); if(empty($tmp)) { return; } foreach($tmp as $row) { $this->UpdateArtikelChecksum($row['id'], $projekt); } } function UpdateArtikelChecksum($artikel,$projekt) { $tmp = $this->app->DB->SelectArr("SELECT typ, nummer, projekt, inaktiv, warengruppe, name_de, name_en, kurztext_de, ausverkauft, kurztext_en , beschreibung_de, beschreibung_en,standardbild, herstellerlink, hersteller, uebersicht_de,uebersicht_en,links_de,links_en, startseite_de, startseite_en, lieferzeit , lieferzeitmanuell, wichtig, gewicht, sperrgrund, gueltigbis,umsatzsteuer, klasse, adresse, shop, firma, neu,topseller,startseite, (SELECT MAX(preis) FROM verkaufspreise WHERE artikel='$artikel' AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') AND ab_menge = 1 AND (adresse='0' OR adresse='')) as preis FROM artikel WHERE id='$artikel' LIMIT 1"); // artikel='$artikel' AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') AND ab_menge = 1 AND (objekt='Standard' OR objekt='')) as preis serialize($tmp); $checksum = md5(serialize($tmp)); $this->app->DB->Update("UPDATE artikel SET checksum='$checksum' WHERE id='$artikel' LIMIT 1"); } function GetStandardMarge() { return $this->Firmendaten("standardmarge"); } function GetStandardStundensatz() { return 57.62; } /** @deprecated */ function GetProjektSelectMitarbeiter($adresse) { // Adresse ist Mitglied von Projekt xx // gibt man kein parameter an soll alles zurueck // entsprechen weitere parameter filtern die ausgabe $arr = $this->app->DB->SelectArr("SELECT adresse FROM bla bla where rolle=mitarbeiter von projekt xxx"); foreach($arr as $value) { if($selected==$value) $tmp = "selected"; else $tmp=""; $ret .= ""; } return $ret; } function GetArtikelPreisvorlageProjekt($kunde,$projekt,$artikel,$menge) { //HACK! return $this->app->DB->Select("SELECT preis FROM verkaufspreise WHERE projekt='$projekt' AND artikel='$artikel'"); } // do not use this function! function GetAuftragSteuersatz($auftrag) { //ermitteln aus Land und UST-ID Prüfung return 1.19; } function GetSteuersatzAssoc($id,$typ) { $steuersatzErmaessigt = $this->GetSteuersatzErmaessigt(false,$id,$typ); $steuersatzNormal = $this->GetSteuersatzNormal(false,$id,$typ); return [ 0=>'0 %', $steuersatzErmaessigt=>$steuersatzErmaessigt.' %', $steuersatzNormal=>$steuersatzNormal.' %' ]; } function GetSteuersatz($id,$typ) { $tmp[] = 0; $tmp[] = $this->GetSteuersatzErmaessigt(false,$id,$typ); $tmp[] = $this->GetSteuersatzNormal(false,$id,$typ); return $tmp; } function GetSelectSteuersatz($selected,$id,$typ) { $tmp = $this->GetSteuersatz($id,$typ); $ret = ''; foreach($tmp as $key=>$value) { $tmp = ''; if($selected==$value) { $tmp = 'selected'; } $ret .= ""; } return $ret; } function GetSteuersatzNormal($komma, $id, $typ) { $steuersatz = 0; if($typ==='provisionsgutschrift'){ $steuersatz = $this->app->DB->Select("SELECT steuersatz FROM mlm_abrechnung_adresse WHERE id='$id' LIMIT 1"); } elseif($typ !== 'lieferschein'){ $steuersatz = $this->app->DB->Select("SELECT steuersatz_normal FROM $typ WHERE id='$id' LIMIT 1"); } if($komma){ return ($steuersatz / 100.0) + 1.0; //1.19 } return $steuersatz; } function GetSteuersatzErmaessigt($komma, $id, $typ) { $steuersatz = 0; if($typ !== 'lieferschein'){ $steuersatz = $this->app->DB->Select("SELECT steuersatz_ermaessigt FROM $typ WHERE id='$id' LIMIT 1"); } if($komma){ return ($steuersatz / 100.0) + 1.0; //1.19 } return $steuersatz; } function GetSteuersatzBefreit($komma, $id, $typ) { if($komma){ return 1.00; } return 0.00; } function GetKreditkarten() { return array('MasterCard','Visa','American Express'); } function GetKreditkartenSelect($selected) { $ret = ''; foreach($this->GetKreditkarten() as $value) { $tmp = ''; if($selected==$value) { $tmp = 'selected'; } $ret .= ""; } return $ret; } function GetKundeSteuersatz($kunde) { } function AddUSTIDPruefungKunde($kunde) { //gebunden an eine adresse } function GetVersandkosten($projekt) { return 3.32; } function AuftraegeBerechnen() { $this->app->erp->SetKonfigurationValue('last_order_calc',date('d.m.Y H:i:s')); $this->app->DB->Delete("DELETE r FROM lager_reserviert r LEFT JOIN auftrag a ON r.objekt = 'auftrag' AND r.parameter = a.id AND a.status = 'freigegeben' WHERE r.objekt = 'auftrag' AND isnull(a.id)"); if(!empty($this->app->User) && method_exists($this->app->User, 'GetID') && $this->app->User->GetID()) { $limit = (int)$this->app->erp->Firmendaten('autoversand_maxauftraege'); }else { $limit = 0; } $auftraege = $this->app->DB->SelectArr("SELECT id FROM auftrag WHERE status='freigegeben' AND inbearbeitung=0 AND autoversand=1 ORDER BY fastlane = 1 DESC, datum ".($limit > 0?" LIMIT $limit ":'')); if(empty($auftraege)) { return; } foreach($auftraege as $auftrag) { //$this->app->erp->AuftragNeuberechnen($auftraege[$i][id]); $this->AuftragEinzelnBerechnen($auftrag['id']); } } function KalkulationNeuberechnen($id) { /** @var Kalkulation $obj */ $obj = $this->LoadModul('kalkulation'); if(!empty($obj) && method_exists($obj,'KalkulationNeuberechnen')) { $obj->KalkulationNeuberechnen($id); } } function AddArtikelAuftrag($artikel,$auftrag,$menge=1) { if(!is_numeric($menge)) { $menge = 1; } $articleRow = $this->app->DB->SelectRow("SELECT name_de,anabregs_text FROM artikel WHERE id='$artikel' LIMIT 1"); $name = $articleRow['name_de']; $beschreibung = $articleRow['anabregs_text']; $this->AddPositionManuell("auftrag",$auftrag, $artikel,$menge,$name,$beschreibung); } function DelArtikelAuftrag($id) { //loesche artikel von auftrag und schiebe positionen nach } function GetAuftragStatus($auftrag) { } function IsEU($land) { foreach($this->GetUSTEU() as $euland) { if($land==$euland) return true; } // alle anderen laender sind export! return false; } function Export($land) { if($land == '' || $land==$this->Firmendaten('land')){ return false; } return !$this->IsEU($land); } function GetEU() { return $this->GetUSTEU(false); } function GetUSTEU($ust=false) { $isoGreece = 'GR'; if($ust){ $isoGreece = 'EL'; } $checklaender = $this->app->DB->Select('SELECT id FROM laender LIMIT 1'); if($checklaender > 0 ) { $laender = $this->app->DB->SelectArr("SELECT iso FROM laender WHERE eu=1 ORDER by iso"); $ret = null; foreach($laender as $land) { if($land['iso'] === 'GR'){ $ret[] = $isoGreece; }else{ $ret[] = $land['iso']; } } return $ret; } return array('DE','BE','IT','RO', 'BG','LV','SE', 'DK','LT','SK', 'DE','LU','SI', 'EE','MT','ES', 'FI','NL','CZ', 'FR','AT','HU', $isoGreece,'PL', 'IE','PT','CY','HR'); } function CheckUSTFormat($ust) { /* * method not removed for downward compatibility */ return USTID::CheckUSTFormat($ust); } function CheckUst($ust1,$ust2, $firmenname, $ort, $strasse, $plz, $druck="nein") { $tmp = new USTID(); //$status = $tmp->check("DE263136143","SE556459933901","Wind River AB","Kista","Finlandsgatan 52","16493","ja"); $status = $tmp->check($ust1, $ust2, $firmenname, $ort, $strasse, $plz, $druck,$onlinefehler); /* if($tmp->answer['Erg_Name'] == 'A')$tmp->answer['Erg_Name'] = ''; if($tmp->answer['Erg_Ort'] == 'A')$tmp->answer['Erg_Ort'] = ''; if($tmp->answer['Erg_Str'] == 'A')$tmp->answer['Erg_Str'] = ''; if($tmp->answer['Erg_PLZ'] == 'A')$tmp->answer['Erg_PLZ'] = ''; */ $erg = array( 'ERG_NAME' => $tmp->answer['Erg_Name'], 'ERG_ORT' => $tmp->answer['Erg_Ort'], 'ERG_STR' => $tmp->answer['Erg_Str'], 'ERG_PLZ' => $tmp->answer['Erg_PLZ'], 'ERROR_MSG' => $tmp->answer['ErrorMSG'], 'ERROR_CODE' => $tmp->answer['ErrorCode']); return $erg; } function MailSend($from,$from_name,$to,$to_name,$betreff,$text,$files="",$projekt="",$signature=true,$cc="",$bcc="", $system = false) { $bcc1 = $this->Firmendaten('bcc1'); $bcc2 = $this->Firmendaten('bcc2'); if($bcc1!="") { $this->MailSendFinal($from,$from_name,$bcc1,"Xentral Kopie 1","KOPIE ".$betreff,$text,$files,$projekt,$signature,'','', $system); } if($bcc2!="") $this->MailSendFinal($from,$from_name,$bcc2,"Xentral Kopie 2","KOPIE ".$betreff,$text,$files,$projekt,$signature,'','', $system); return $this->MailSendFinal($from,$from_name,$to,$to_name,$betreff,$text,$files,$projekt,$signature,$cc,$bcc, $system); } /* * Return 0 = not ok, return 1 = ok * $to, $to_name, $cc, $bcc can be csv or arrays */ function MailSendFinal($from,$from_name,$to,$to_name,$betreff,$text,$files="",$projekt="",$signature=true,$cc="",$bcc="", $system = false) { // keine leeren email versenden if($text=="" && $betreff=="") { $this->mail_error = "Mailer Error: " . "Empty mail."; return 0; } /* $isSystemTemplate = $system && is_file(dirname(__DIR__, 2) .'/classes/Modules/Company/templates/systemmail.tpl'); if($isSystemTemplate) { $signature = false; }*/ if($projekt > 0 && $this->Projektdaten($projekt,"absendeadresse")!=""){ $from = $this->Projektdaten($projekt, "absendeadresse"); } $from_name = $this->ClearDataBeforeOutput($from_name); $from_name = $this->ReadyForPDF($from_name); $betreff = $this->ReadyForPDF($betreff); $text = $this->ReadyForPDF($text); $text = str_replace('€','€',$text); /* $text = htmlspecialchars_decode( htmlentities($text, ENT_NOQUOTES, 'UTF-8', false) , ENT_NOQUOTES ); */ if($signature) { $eigenesignatur = $this->app->DB->Select("SELECT eigenesignatur FROM emailbackup WHERE email='$from' AND email !='' AND geloescht!=1 LIMIT 1"); if(strlen(trim($this->Signatur($from))) > 0 && $eigenesignatur == 1) { $signaturtext = $this->Signatur($from); if($this->isHTML($signaturtext)) $body = str_replace('\r\n',"\n",$text)."
".$signaturtext; else $body = str_replace('\r\n',"\n",$text)."
".nl2br($signaturtext); }else{ if($projekt > 0 && $this->Projektdaten($projekt,"absendesignatur")!=""){ $signaturtext = $this->Projektdaten($projekt,"absendesignatur"); if($this->isHTML($signaturtext)) $body = str_replace('\r\n',"\n",$text)."

".$signaturtext; else $body = str_replace('\r\n',"\n",$text)."

".$this->ReadyForPDF(nl2br($signaturtext)); }else{ if(strlen(trim($this->Signatur($from))) > 0 && $eigenesignatur == 0){ $signaturtext = $this->Signatur($from); if($this->isHTML($signaturtext)) $body = str_replace('\r\n',"\n",$text)."
".$signaturtext; else $body = str_replace('\r\n',"\n",$text)."
".nl2br($signaturtext); }else{ $body = str_replace('\r\n',"\n",$text); } } } } else { $body = str_replace('\r\n',"\n",$text); } { $email_html_template = $this->Projektdaten($projekt, "email_html_template"); if($email_html_template == ""){ $email_html_template = $this->Firmendaten('email_html_template'); } } if($email_html_template!="" && preg_match("/{CONTENT}/",$email_html_template)) { $email_html_template = preg_replace('~\x{00a0}~siu',' ',$email_html_template); $email_html_template = preg_replace( "#(( |\s|
)+$)#", "", trim($email_html_template) ); $body = str_replace('{CONTENT}',$body,$email_html_template); } $sysMailerSent = false; $sysMailer = null; $emailObj = null; if ($this->app->Container->has('SystemMailer')) { $sysMailer = $this->app->Container->get('SystemMailer'); } if ($sysMailer !== null) { $recipients = []; $to_csv = ""; $to_array = array(); $to_name_array = array(); $to_name_csv = ""; // Prepare names and addresses if (is_array($to)) { foreach ($to as $item) { $to_array[] = $item; $to_csv .= $item; } } else if (!empty($to)) { foreach (explode(',',str_replace(" ","",$to)) as $item) { $to_array[] = $item; $to_csv .= $item; } } if (is_array($to_name)) { foreach ($to_name as $item) { $to_name_array[] = $item; $to_name_csv .= $item; } } else if (!empty($to_name)) { foreach (explode(',',$to_name) as $item) { $to_name_array[] = $item; $to_name_csv .= $item; } } // Fill empty names with address $number_of_names = empty($to_name_array)?0:count($to_name_array); if (count($to_array) > $number_of_names) { $itemcount = 0; foreach ($to_array as $item) { $itemcount++; if ($itemcount > $number_of_names) { $to_name_array[] = $item; } } } $to_combined_array = array_combine($to_array,$to_name_array); foreach ($to_combined_array as $key => $value) { $value = $this->ClearDataBeforeOutput($value); $value = $this->ReadyForPDF($value); $recipients[] = new EmailRecipient($key, $value); } $ccRecipients = []; if (is_array($cc)) { foreach ($cc as $item) { $ccRecipients[] = new EmailRecipient($item, $item); } } else if (!empty($cc)) { foreach (explode(',',str_replace(" ","",$cc)) as $item) { $ccRecipients[] = new EmailRecipient($item, $item); } } $bccRecipients = []; if (is_array($bcc)) { foreach ($bcc as $item) { $bccRecipients[] = new EmailRecipient($item, $item); } } else if (!empty($bcc)) { foreach (explode(',',str_replace(" ","",$bcc)) as $item) { $bccRecipients[] = new EmailRecipient($item, $item); } } $bcc3 = $this->Firmendaten('bcc3'); if($bcc3!="") { $bccRecipients[] = new EmailRecipient($bcc3, $bcc3); } if (!empty($recipients)) { // This will build the mail with phpmailer 6 and send it out // There is no way to retrieve the created mail e.g. for IMAP output // This should be migrated to laminas-mail (used for imap) // Phpmailer 6 can then be removed $sysMailerSent = $sysMailer->composeAndSendEmail( $from, $from_name, $recipients, $betreff, $body, $files, $ccRecipients, $bccRecipients, $sendmail_error ); } else { $sendmail_error = "Kein Empfänger angegeben"; } } if($sysMailerSent === false) { $this->MailLogFile($from,$from_name,$to_csv,$to_name_csv,$betreff,$text,$files,$projekt,$signature,$cc,$bcc,$system); $this->mail_error = "Mailer Error: " . $sendmail_error; if(isset($this->app->User) && $this->app->User && method_exists($this->app->User, 'GetID')) { $this->app->erp->InternesEvent($this->app->User->GetID(),"Fehler bei Mailversand: ".$sendmail_error,"alert",1); } return 0; } else { $this->MailLogFile($from,$from_name,$to_csv,$to_name_csv,$betreff,$text,$files,$projekt,$signature,$cc,$bcc,$system); // Put the mail in IMAP sent folder // Note that this is implemented with laminas-mail and only this // The created mail may differ from the sent one because it is created by different libraries $imap_aktiv = $this->app->DB->Select("SELECT imap_sentfolder_aktiv FROM emailbackup WHERE email='".$from."' AND imap_sentfolder!='' AND geloescht!=1 LIMIT 1"); if($imap_aktiv=="1" && !preg_match("/Xentral Kopie/",$to_name_csv) && !preg_match("/WaWision Kopie/",$to_name_csv)) { // This will build the mail as EmailMessage (Xentral\Components\Mailer\Data) and then rebuild it with laminas-mail message to produce the raw output $emailObj = $sysMailer->composeEmail( $recipients, $betreff, $body, $files, $ccRecipients, $bccRecipients ); if ($emailObj !== null) { /** @var MimeMessageFormatterInterface $formatter */ $formatter = $this->app->Container->get('MailClientMimeMessageFormatter'); $imapCopyMessage = $formatter->formatMessage( $emailObj, new EmailRecipient($from, $from_name) ); } else { $this->app->erp->LogFile("Mailer Error: Email could not be composed!"); } // Load the mail to IMAP using laminas try { $imap_data = $this->app->DB->SelectRow("SELECT * FROM emailbackup WHERE email='".$from."' AND geloescht!=1 LIMIT 1"); $account = EmailBackupAccount::fromDbState($imap_data); /** @var MailClientProvider $clientProvider */ $clientProvider = $this->app->Container->get('MailClientProvider'); $client = $clientProvider->createMailClientFromAccount($account); $client->connect(); $client->appendMessage($imapCopyMessage, $account->getImapOutgoingFolder()); } catch (Exception $e) { $this->app->erp->LogFile("Mailer IMAP Error: " . (string) $e); if(isset($this->app->User) && $this->app->User && method_exists($this->app->User, 'GetID')) { $this->app->erp->InternesEvent($this->app->User->GetID(),"IMAP-Fehler","alert",1); } $this->mail_error = "Mailer IMAP Error"; return 0; } } } // sysMailersent $this->mail_error = ""; return 1; } function MailLogFile($from,$from_name,$to,$to_name,$betreff,$text,$files="",$projekt="",$signature=true,$cc="",$bcc="", $system = false) { $subject = $subject; $body = $body; $status = $errorinfo; if($status!="") { $status .= " (Host: ".$host." User: ".$username.") "; } $from = $this->app->DB->real_escape_string($from); $to = $this->app->DB->real_escape_string($to); $this->app->DB->Insert("INSERT INTO mailausgang (id,`subject`,`body`,`from`,`to`,`status`,zeit) VALUES ('','$subject','$body','$from','$to','$status',NOW())"); if($cc && (!empty($cc)?count($cc):0) > 0){ for ($i=0; $i < (!empty($cc)?count($cc):0); $i++) { $this->app->DB->Insert("INSERT INTO mailausgang (id,`subject`,`body`,`from`,`to`,`status`,zeit, art) VALUES ('','$subject','$body','$from','".$cc[$i][0]."','$status',NOW(), '1')"); } } if($bcc && (!empty($bcc)?count($bcc):0) > 0){ for ($i=0; $i < (!empty($bcc)?count($bcc):0); $i++) { $this->app->DB->Insert("INSERT INTO mailausgang (id,`subject`,`body`,`from`,`to`,`status`,zeit, art) VALUES ('','$subject','$body','$from','".$bcc[$i][0]."','$status',NOW(), '2')"); } } $this->app->DB->Delete("DELETE FROM `mailausgang` WHERE DATE_SUB(CURDATE(), INTERVAL 90 DAY) >= zeit"); } function isMailAdr($mailadr){ return preg_match("/^[_a-z0-9!#$%&\\'*+-\/=?^_`.{|}~]+(\.[_a-z0-9!#$%&\'*+-\\/=?^_`.{|}~]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,20})$/i", $mailadr, $treffer)?1:0; } function BeschriftungSprache($sprache='') { if ($sprache === '') { $this->beschriftung_sprache='deutsch'; } else { $this->beschriftung_sprache=strtolower(trim($sprache)); } } function BeschriftungStandardwerte($field,$sprache="deutsch",$getvars=false) { $uebersetzung['dokument_rechnung_titel']['deutsch'] = "Rechnung"; $uebersetzung['dokument_position']['deutsch'] = "Pos"; $uebersetzung['dokument_anschreiben']['deutsch'] = "Sehr geehrte Damen und Herren"; $uebersetzung['dokument_artikelnummer']['deutsch'] = "Artikelnr"; $uebersetzung['dokument_artikel']['deutsch'] = "Artikel"; $uebersetzung['dokument_lieferdatum']['deutsch'] = "Liefertermin"; $uebersetzung['dokument_lieferdatumkw']['deutsch'] = "KW"; $uebersetzung['dokument_artikelnummerkunde']['deutsch'] = "Ihre Artikelnummer"; $uebersetzung['dokument_menge']['deutsch'] = "Menge"; $uebersetzung['dokument_gesamt']['deutsch'] = "Gesamt"; $uebersetzung['dokument_gesamt_optional']['deutsch'] = "Gesamt optional"; $uebersetzung['dokument_gesamt_total']['deutsch'] = "Gesamt"; $uebersetzung['dokument_mwst']['deutsch'] = "MwSt."; $uebersetzung['dokument_zzglmwst']['deutsch'] = "zzgl. MwSt."; $uebersetzung['dokument_inklmwst']['deutsch'] = "inkl. MwSt."; $uebersetzung['dokument_gesamtnetto_zzglmwst']['deutsch'] = "Gesamt netto"; $uebersetzung['dokument_rabatt']['deutsch'] = "Rabatt"; $uebersetzung['dokument_stueck']['deutsch'] = "Stck"; $uebersetzung['dokument_einzel']['deutsch'] = "Einzel"; $uebersetzung['dokument_einheit']['deutsch'] = "Einheit"; $uebersetzung['dokument_gewicht']['deutsch'] = "Gewicht"; $uebersetzung['dokument_laenge']['deutsch'] = "Länge"; $uebersetzung['dokument_breite']['deutsch'] = "Breite"; $uebersetzung['dokument_hoehe']['deutsch'] = "Höhe"; $uebersetzung['dokument_optional']['deutsch'] = "Optional: "; $uebersetzung['dokument_ursprungsregion']['deutsch'] = "Ursprungsregion"; $uebersetzung['dokument_gewicht']['deutsch'] = "Gewicht"; $uebersetzung['dokument_gesamtnetto']['deutsch'] = "Gesamt netto"; $uebersetzung['dokument_gesamtnetto_optional']['deutsch'] = "Gesamt netto optional"; $uebersetzung['dokument_seite']['deutsch'] = "Seite"; $uebersetzung['dokument_seitevon']['deutsch'] = "von"; $uebersetzung['dokument_datum']['deutsch'] = "Datum"; $uebersetzung['dokument_angebot_anfrage']['deutsch'] = "Ihre Anfrage"; $uebersetzung['dokument_angebot']['deutsch'] = "Angebot"; $uebersetzung['dokument_bestellung']['deutsch'] = "Bestellung"; $uebersetzung['dokument_bestellung_angebotnummer']['deutsch'] = "Ihr Angebot"; $uebersetzung['dokument_bestellung_unserekundennummer']['deutsch'] = "Unsere Kunden-Nr."; $uebersetzung['dokument_bestelldatum']['deutsch'] = "Bestelldatum"; $uebersetzung['dokument_bestellung_einkauf']['deutsch'] = "Einkauf"; $uebersetzung['dokument_bestellung_keineartikelnummer']['deutsch'] = "siehe Artikel-Nr."; $uebersetzung['dokument_lieferdatum_sofort']['deutsch'] = "sofort"; $uebersetzung['dokument_bestellung_unsereartikelnummer']['deutsch'] = "Unsere Artikel-Nr."; $uebersetzung['dokument_bestellung_bestellnummer']['deutsch'] = "Best-Nr."; $uebersetzung['dokument_bestellung_mengeinvpe']['deutsch'] = "Menge in VPE"; $uebersetzung['dokument_bestellung_bestaetigung']['deutsch'] = "Die Bestellung ist erst nach Eingang einer Bestätigung Ihrerseits gültig. Wird die Bestellung nicht innerhalb einer Woche bestätigt verfällt diese."; $uebersetzung['dokument_auftrag']['deutsch'] = "Auftrag"; $uebersetzung['dokument_auftrag_auftragsbestaetigung']['deutsch'] = "Auftragsbestätigung"; $uebersetzung['dokument_lieferdatum']['deutsch'] = "Lieferdatum"; $uebersetzung['dokument_lieferschein']['deutsch'] = "Lieferschein"; $uebersetzung['dokument_retoure']['deutsch'] = "Retoure"; $uebersetzung['dokument_kommissionierschein']['deutsch'] = "Kommissionierschein"; $uebersetzung['dokument_ansprechpartner']['deutsch'] = "Ansprechpartner"; $uebersetzung['dokument_rechnungsdatum']['deutsch'] = "Rechnungsdatum"; $uebersetzung['dokument_proformarechnungsdatum']['deutsch'] = "Datum"; $uebersetzung['dokument_auftragsdatum']['deutsch'] = "Auftragsdatum"; $uebersetzung['dokument_rechnung']['deutsch'] = "Rechnung"; $uebersetzung['dokument_gutschrift']['deutsch'] = "Gutschrift"; $uebersetzung['dokument_kalkulation']['deutsch'] = "Kalkulation"; $uebersetzung['dokument_stueckliste']['deutsch'] = "(Stückliste)"; $uebersetzung['dokument_proformarechnung']['deutsch'] = "Proformarechnung"; $uebersetzung['dokument_preisanfrage']['deutsch'] = "Preisanfrage"; $uebersetzung['dokument_entwurf']['deutsch'] = "Entwurf"; $uebersetzung['dokument_rechnung_kopie']['deutsch'] = "doppel"; $uebersetzung['dokument_skonto']['deutsch'] = "Skonto"; $uebersetzung['dokument_innerhalb']['deutsch'] = "innerhalb"; $uebersetzung['dokument_tagen']['deutsch'] = "Tagen"; $uebersetzung['dokument_tagebiszum']['deutsch'] = "Tage bis zum"; $uebersetzung['dokument_zahlung_per']['deutsch'] = "Bezahlung per"; $uebersetzung['dokument_offene_lastschriften']['deutsch'] = "Der Betrag wird mit offenen Lastschriften verrechnet."; $uebersetzung['dokument_auszahlungskonditionen']['deutsch'] = "aus Zahlungskonditionen"; $uebersetzung['dokument_zahlung_rechnung_anab']['deutsch'] = "Rechnung zahlbar innerhalb von {ZAHLUNGSZIELTAGE} Tagen."; $uebersetzung['dokument_telefon']['deutsch'] = "Telefon"; $uebersetzung['dokument_email']['deutsch'] = "E-Mail"; $uebersetzung['dokument_teillieferung']['deutsch'] = "Teillieferung von Auftrag"; $uebersetzung['dokument_herstellernummer']['deutsch'] = "Herstellernummer"; $uebersetzung['dokument_abmessung']['deutsch'] = "Abmessung"; $uebersetzung['dokument_zolltarifnummer']['deutsch'] = "Zolltarifnummer"; $uebersetzung['dokument_ean']['deutsch'] = "EAN"; $uebersetzung['dokument_mhd']['deutsch'] = "MHD"; $uebersetzung['dokument_herkunftsland']['deutsch'] = "Herkunftsland"; $uebersetzung['dokument_charge']['deutsch'] = "Charge"; $uebersetzung['dokument_seriennummer']['deutsch'] = "S/N"; $uebersetzung['dokument_ihreartikelnummer']['deutsch'] = "Ihre Artikelnummer"; $uebersetzung['dokument_projekt']['deutsch'] = "Projekt"; $uebersetzung['dokument_skontoanderezahlungsweisen']['deutsch'] = "Skonto {ZAHLUNGSZIELSKONTO} % aus Zahlungskonditionen "; $uebersetzung['dokument_staffelpreis_von']['deutsch'] = "ab"; $uebersetzung['dokument_staffelpreis_stueck']['deutsch'] = "St."; $uebersetzung['auftrag_bezeichnung_vertrieb']['deutsch'] = "Vertrieb"; $uebersetzung['auftrag_bezeichnung_bearbeiter']['deutsch'] = "Bearbeiter"; $uebersetzung['auftrag_bezeichnung_bestellnummer']['deutsch'] = "Ihre Bestellnummer"; $uebersetzung['beschriftunginternetnummer']['deutsch'] = "Internetnummer"; $uebersetzung['bezeichnungkundennummer']['deutsch'] = "Kundennummer"; $uebersetzung['bezeichnungstornorechnung']['deutsch'] = "Stornorechnung"; $uebersetzung['bezeichnungangebotersatz']['deutsch'] = ""; $uebersetzung['bezeichnungauftragersatz']['deutsch'] = ""; $uebersetzung['bezeichnungproformarechnungersatz']['deutsch'] = ""; $uebersetzung['bezeichnungrechnungersatz']['deutsch'] = ""; $uebersetzung['bezeichnunglieferscheinersatz']['deutsch'] = ""; $uebersetzung['bezeichnungbestellungersatz']['deutsch'] = ""; $uebersetzung['entspricht_rechnungsadresse']['deutsch'] = "entspricht Rechnungsadresse"; $uebersetzung['entspricht_hauptadresse']['deutsch'] = "entspricht Hauptadresse"; $uebersetzung['gruppenrechnung_lieferschein_freitext']['deutsch'] = "Lieferschein {BELEGNR} vom {DATUM}"; $uebersetzung['gruppenrechnung_lieferschein_anzahl']['deutsch'] = "Lieferschein Anzahl: {ANZAHL}"; $uebersetzung['proformarechnung_lieferschein_freitext']['deutsch'] = "Lieferschein {BELEGNR} vom {DATUM}"; $uebersetzung['proformarechnung_lieferschein_anzahl']['deutsch'] = "Lieferschein Anzahl: {ANZAHL}"; $uebersetzung['proformarechnung_ohnezolltarifnummer']['deutsch'] = "Ohne Zolltarifnummer"; $uebersetzung['dokument_zahlungserinnerung']['deutsch'] = "Zahlungserinnerung"; $uebersetzung['mahnwesen_betreff']['deutsch'] = "Buchhaltung: Ihre offene Rechnung"; $uebersetzung['mahnwesen_betreff']['englisch'] = "Accounting: Your outstanding account"; $uebersetzung['dokument_mahnung1']['deutsch'] = "1. Mahnung"; $uebersetzung['dokument_mahnung2']['deutsch'] = "2. Mahnung"; $uebersetzung['dokument_mahnung3']['deutsch'] = "3. Mahnung"; $uebersetzung['dokument_mahnunginkasso']['deutsch'] = "Inkasso-Mahnung"; $uebersetzung['zahlung_proformarechnung_sofort_de']['deutsch'] = "Proformarechnung zahlbar sofort"; $uebersetzung['zahlung_auftrag_sofort_de']['deutsch'] = "Rechnung zahlbar sofort"; for($ifreifeld=1;$ifreifeld<=40;$ifreifeld++) { if($this->app->erp->Firmendaten("freifeld".$ifreifeld)!="") { $uebersetzung['artikel_freifeld'.$ifreifeld]['deutsch'] = $this->app->erp->Firmendaten("freifeld".$ifreifeld); $uebersetzung['artikel_freifeld'.$ifreifeld]['englisch'] = $this->app->erp->Firmendaten("freifeld".$ifreifeld); } else { $uebersetzung['artikel_freifeld'.$ifreifeld]['deutsch'] = "Freifeld ".$ifreifeld; $uebersetzung['artikel_freifeld'.$ifreifeld]['englisch'] = "Field ".$ifreifeld; } } for($ifreifeld=1;$ifreifeld<=20;$ifreifeld++) { if($this->app->erp->Firmendaten("projektfreifeld".$ifreifeld)!="") { $uebersetzung['projekt_freifeld'.$ifreifeld]['deutsch'] = $this->app->erp->Firmendaten("projektfreifeld".$ifreifeld); $uebersetzung['projekt_freifeld'.$ifreifeld]['englisch'] = $this->app->erp->Firmendaten("projektfreifeld".$ifreifeld); } else { $uebersetzung['projekt_freifeld'.$ifreifeld]['deutsch'] = "Freifeld ".$ifreifeld; $uebersetzung['projekt_freifeld'.$ifreifeld]['englisch'] = "Field ".$ifreifeld; } } if($this->app->erp->Firmendaten("freitext1inhalt")!="") { $uebersetzung['freitext1inhalt']['deutsch'] = $this->app->erp->Firmendaten("freitext1inhalt"); $uebersetzung['freitext1inhalt']['englisch'] = $this->app->erp->Firmendaten("freitext1inhalt"); } else { $uebersetzung['freitext1inhalt']['deutsch'] = ''; $uebersetzung['freitext1inhalt']['englisch'] = ''; } if($this->app->erp->Firmendaten("freitext2inhalt")!="") { $uebersetzung['freitext2inhalt']['deutsch'] = $this->app->erp->Firmendaten("freitext2inhalt"); $uebersetzung['freitext2inhalt']['englisch'] = $this->app->erp->Firmendaten("freitext2inhalt"); } else { $uebersetzung['freitext2inhalt']['deutsch'] = ''; $uebersetzung['freitext2inhalt']['englisch'] = ''; } if($getvars) return $uebersetzung; if(isset($uebersetzung[$field][$sprache])) return $uebersetzung[$field][$sprache]; return ""; } function getUebersetzung($field, $sprache, $id = true) { $sprache = strtolower($sprache); if(empty($this->uebersetzungId)) { $arr = $this->app->DB->SelectArr('SELECT id, label, sprache, beschriftung, original FROM uebersetzung WHERE sprache <> "" AND label <> ""'); if(!empty($arr)) { foreach($arr as $row) { $this->uebersetzungId[$row['label']][strtolower($row['sprache'])] = $row['id']; if ($row['beschriftung'] != '') { $this->uebersetzungBeschriftung[$row['label']][strtolower($row['sprache'])] = $row['beschriftung']; } else { $this->uebersetzungBeschriftung[$row['label']][strtolower($row['sprache'])] = $row['original']; } } } } if($id){ if(!empty($this->uebersetzungId[$field]) && isset($this->uebersetzungId[$field][$sprache])){ return $this->uebersetzungId[$field][$sprache]; } }else{ if(!empty($this->uebersetzungBeschriftung[$field]) && isset($this->uebersetzungBeschriftung[$field][$sprache])){ return $this->uebersetzungBeschriftung[$field][$sprache]; } } return null; } function Beschriftung($field,$sprache='') { if($sprache!='') { $this->BeschriftungSprache($sprache); } if($this->beschriftung_sprache==''){ $this->beschriftung_sprache = 'deutsch'; } // wenn feld mit artikel_freifeld beginnt dann freifeld draus machen //$field = str_replace('artikel_freifeld','freifeld',$field); // schaue ob es das wort in uebesetzungen gibt $check = $this->getUebersetzung($field, $this->beschriftung_sprache); $uebersetzung = ''; if($check > 0){ $uebersetzung = $this->getUebersetzung($field, $this->beschriftung_sprache, false); } if($check > 0 && $uebersetzung!='') { // eintrag eindeutig gefunden return $uebersetzung; } // schaueb ob es das wort in firmendaten gibt achtung hier gibtes nur deutsche woerter! if($this->beschriftung_sprache==='deutsch') { $wert = $this->Firmendaten($field); if($wert!='') { return $wert; } // Gibt es eine Konstante? return $this->BeschriftungStandardwerte($field,$this->beschriftung_sprache); } //gibt es eine Vorlage? $wert = $this->BeschriftungStandardwerte($field,$this->beschriftung_sprache); if($wert!='') { return $wert; } return $field; // Not found! } function FirmendatenSet($field,$value) { $firmendatenid = $this->app->DB->Select('SELECT MAX(id) FROM firmendaten LIMIT 1'); $check = $this->app->DB->SelectRow( sprintf('SELECT id, typ FROM firmendaten_werte WHERE name = \'%s\' LIMIT 1',$field) ); if(!empty($check)) { if($check['typ'] === 'int' || $check['typ'] === 'tinyint') { $this->app->DB->Update("UPDATE firmendaten_werte SET wert = '".(int)$value."' WHERE id = '".$check['id']."'"); }else{ $this->app->DB->Update("UPDATE firmendaten_werte SET wert = '".$this->app->DB->real_escape_string($value)."' WHERE id = '".$check['id']."'"); } } else { $column_exists = $this->app->DB->Select("SHOW COLUMNS FROM firmendaten WHERE field = '".$field."'"); if ($column_exists) { $this->app->DB->Update("UPDATE firmendaten SET " . $field . "='$value' WHERE id='" . $firmendatenid . "'"); } else { $this->AddNeuenFirmendatenWert($field, $typ, $typ1, $typ2, $value, $default_value, $default_null, $darf_null); } } $db = $this->app->Conf->WFdbname; if(!empty($this->firmendaten[$db])) { $this->firmendaten[$db][$field] = $value; } else { $this->firmendaten = null; } } function Firmendaten($field,$projekt='', $clearcache = false) { if($field === 'mysql55') { return '1'; } if(strpos($field,'next') != false) { $firmendatenid = (int)$this->app->DB->Select('SELECT MAX(id) FROM firmendaten LIMIT 1'); if ($this->app->DB->Select("SHOW COLUMNS FROM firmendaten LIKE '$field'")) { $firmendaten_value = $this->app->DB->Select( sprintf( 'SELECT `%s` FROM firmendaten WHERE id = %d LIMIT 1', $field, $firmendatenid) ); } if(!$this->app->DB->error()) { return $firmendaten_value; } $firmendaten_value = $this->app->DB->SelectRow( sprintf('SELECT id, wert FROM firmendaten_werte WHERE `name` = \'%s\' LIMIT 1', $field) ); if(!empty($firmendaten_value)) { return $firmendaten_value['wert']; } return $this->app->DB->Select( sprintf("SELECT `%s` FROM `firmendaten` WHERE id = %d LIMIT 1",$field, $firmendatenid) ); } $db = $this->app->Conf->WFdbname; if($clearcache) { $this->firmendaten = null; } if(empty($this->firmendaten[$db])) { $firmendatenid = (int)$this->app->DB->Select('SELECT MAX(id) FROM firmendaten LIMIT 1'); $this->firmendaten[$db] = $this->app->DB->SelectRow( sprintf('SELECT * FROM firmendaten WHERE id = %d LIMIT 1', $firmendatenid) ); $firmendaten_value = $this->app->DB->SelectArr('SELECT id, wert,name,typ FROM firmendaten_werte'); if($firmendaten_value) { foreach($firmendaten_value as $key => $value) { if(!isset($this->firmendaten[$db][$value['name']])) { $this->firmendaten[$db][$value['name']] = $value['wert']; if($value['typ'] === 'int' || $value['typ'] === 'tinyint') { $this->firmendaten[$db][$value['name']] = (int)$this->firmendaten[$db][$value['name']]; } } } } } $value = null; if(isset($this->firmendaten[$db][$field])) { $value = $this->firmendaten[$db][$field]; } // Umstellung 08.01.2015 von DE auf land zursicherheit wenn jemand der Wert DE fehlen sollte. if($field==='land' && $value=='') { return 'DE'; } if($field==="schriftart" && $value=='') { return 'Arial'; } return $value; } function TplFirmendaten($field) { $ret = $this->Firmendaten($field); if($ret != "")return $ret; switch($field) { case 'firmenfarbehell': //return "#42B8C4"; return '#404040'; break; case 'firmenfarbedunkel': //return "#2F9099"; return '#2F2F2F'; break; case 'firmenfarbeganzdunkel': return "#018fa3"; break; case 'navigationfarbe': return "#48494b"; break; case 'navigationfarbeschrift': return "#c9c9cb"; break; case 'unternavigationfarbe': return "#d5ecf2"; break; case 'unternavigationfarbeschrift': return $this->TplFirmendaten('firmenfarbeganzdunkel'); //return "#027d8d"; break; case 'firmenfarbe': return "#48494b"; break; case 'tabsnavigationfarbeschrift': return $this->TplFirmendaten('firmenfarbeganzdunkel'); //return '#018fa3'; //return "#26727a"; break; case 'tabsnavigationfarbe': return $this->TplFirmendaten('firmenfarbehell'); return "#c2e3ea"; break; case 'tabsnavigationfarbe2': return $this->TplFirmendaten('tabsnavigationfarbeschrift'); break; case 'navigationfarbe2': return $this->TplFirmendaten('navigationfarbeschrift'); break; case 'navigationfarbeschrift2': return $this->TplFirmendaten('navigationfarbe'); break; } return $ret; } /* function Firmendaten($field,$projekt="") { $firmendatenid = $this->app->DB->Select("SELECT MAX(id) FROM firmendaten LIMIT 1"); $value = $this->app->DB->Select("SELECT ".$field." FROM firmendaten WHERE id='".$firmendatenid."' LIMIT 1"); // Umstellung 08.01.2015 von DE auf land zursicherheit wenn jemand der Wert DE fehlen sollte. if($field=="land" && $value=="") $value="DE"; return $value; }*/ function Grusswort($sprache="") { //abhaenig von Zeit usw.. passende Grußformel /* return "Grüße aus dem sonnigen Ausgburg."; return "Grüße aus Ausgburg."; return "Frohe Ostern."; return "Schöne Feierabend."; return "Frohe Weihnachten."; return "Schönes Wochenende."; */ if($sprache=="englisch") return "\nKind regards,"; return "\nMit freundlichen Grüßen"; } function Grussformel($projekt=0,$sprache="") { if($projekt > 0) { $result = $this->app->DB->Select("SELECT absendegrussformel FROM projekt WHERE id='$projekt' LIMIT 1"); } if($result=="") { $this->app->erp->BeschriftungSprache($sprache); $gruss = $this->app->erp->Beschriftung("mailgrussformel"); if($gruss!=$this->app->erp->Firmendaten("mailgrussformel")) { $result = "

".nl2br($gruss); } if($result=="") { $result = $this->app->erp->Firmendaten("mailgrussformel"); } } //if($sprache=="englisch") $result = "\nKind regards,"; $result = str_replace('{MITARBEITER}',$this->app->User->GetName(),$result); $data = $this->app->DB->SelectArr("SELECT telefon, telefax,email,mobil FROM adresse WHERE id='".$this->app->User->GetAdresse()."'"); $result= str_replace('{MITARBEITER}',$this->app->User->GetName(),$result); $result = str_replace('{MITARBEITER_TELEFON}',$data[0]['telefon'],$result); $result = str_replace('{MITARBEITER_TELEFAX}',$data[0]['telefax'],$result); $result = str_replace('{MITARBEITER_MOBIL}',$data[0]['mobil'],$result); $result = str_replace('{MITARBEITER_EMAIL}',$data[0]['email'],$result); return $result; //return "\r\n\r\n".$this->ReadyForPDF($signatur); } function Signatur($from="",$language="") { $signatur = $this->app->DB->Select("SELECT signatur FROM emailbackup WHERE email='$from' AND email!='' AND eigenesignatur=1 AND geloescht!=1 LIMIT 1"); if($signatur=="") { $firmendatenid = $this->app->DB->Select("SELECT MAX(id) FROM firmendaten LIMIT 1"); $signatur = base64_decode($this->Beschriftung("signatur",$language)); } $data = $this->app->DB->SelectArr("SELECT telefon, telefax,email,mobil FROM adresse WHERE id='".$this->app->User->GetAdresse()."'"); $signatur = str_replace('{MITARBEITER}',$this->app->User->GetName(),$signatur); $signatur = str_replace('{MITARBEITER_TELEFON}',$data[0]['telefon'],$signatur); $signatur = str_replace('{MITARBEITER_TELEFAX}',$data[0]['telefax'],$signatur); $signatur = str_replace('{MITARBEITER_MOBIL}',$data[0]['mobil'],$signatur); $signatur = str_replace('{MITARBEITER_EMAIL}',$data[0]['email'],$signatur); if($this->isHTML($signatur)) return "

".$signatur; return "\r\n\r\n".$this->ReadyForPDF($signatur); } function GetQuelleTicket() { return array('Telefon','Fax','Brief','Selbstabholer'); } /** @deprecated */ function GetStatusTicketSelect($status) { $stati = array('neu'=>'neu','offen'=>'offen','warten_e'=>'warten auf Intern','warten_kd'=>'warten auf Kunde','klaeren'=>'klären','abgeschlossen'=>'abgeschlossen','spam'=>'Papierkorb'); foreach($stati as $key=>$value) { if($status==$key) $selected="selected"; else $selected=""; $ret .=""; } return $ret; } /** @depracated */ function GetPrioTicketSelect($prio) { $prios = array('4'=>'niedrig','3'=>'normal','2'=>'hoch'); foreach($prios as $key=>$value) { if($prio==$key) $selected="selected"; else $selected=""; $ret .=""; } return $ret; } function GetZeiterfassungArt() { return array('arbeit'=>'Arbeit','pause'=>'Pause','urlaub'=>'Urlaub','krankheit'=>'Krankheit','ueberstunden'=>'Freizeitausgleich','feiertag'=>'Feiertag'); } function GetVPE() { return array('einzeln'=>'Einzeln','tray'=>'Tray','rolle'=>'Rolle','stueckgut'=>'Stückgut','stange'=>'Stange','palette'=>'Palette'); } function GetUmsatzsteuerklasse() { return array('normal'=>'normal','ermaessigt'=>'ermäßgt','befreit'=>'befreit'); } function GetEtikett() { $tmp = array('artikel_klein'=>'Artikel klein'); $result = $this->app->DB->SelectArr("SELECT * FROM etiketten WHERE (verwendenals='artikel_klein' OR verwendenals='seriennummer') AND ausblenden!=1 ORDER by name"); if((!empty($result)?count($result):0) > 0) $tmp = array(); for($i=0;$i<(!empty($result)?count($result):0);$i++) { $tmp[$result[$i]['id']]=$result[$i]['name']; } $tmp['keineetiketten']="Kein Etikett"; return $tmp; } function AddWaehrungumrechnung($waehrung_von, $waehrung_nach, $kurs, $gueltig_bis = "", $kommentar = "", $user = "") { /** @var Waehrungumrechnung $obj */ $obj = $this->LoadModul('waehrungumrechnung'); if(!empty($obj) && method_exists($obj,'AddWaehrungumrechnung')) { return $obj->AddWaehrungumrechnung($waehrung_von, $waehrung_nach, $kurs, $gueltig_bis, $kommentar, $user); } } function GetWaehrung($onlytable = false) { /** @var Waehrungumrechnung $obj */ $obj = $this->LoadModul('waehrungumrechnung'); if(!empty($obj) && method_exists($obj,'GetWaehrung')) { return $obj->GetWaehrung($onlytable); } return array('EUR'=>'EUR','USD'=>'USD','JPY'=>'JPY','BGN'=>'BGN','CZK'=>'CZK','DKK'=>'DKK','GBP'=>'GBP','HUF'=>'HUF','PLN'=>'PLN','RON'=>'RON','SEK'=>'SEK','CHF'=>'CHF','ISK'=>'ISK','NOK'=>'NOK','HRK'=>'HRK','RUB'=>'RUB','TRY'=>'TRY','AUD'=>'AUD','BRL'=>'BRL','CAD'=>'CAD','CNY'=>'CNY','HKD'=>'HKD','IDR'=>'IDR','ILS'=>'ILS','INR'=>'INR','KRW'=>'KRW','MXN'=>'MXN','MYR'=>'MYR','NZD'=>'NZD','PHP'=>'PHP','SGD'=>'SGD','THB'=>'THB','ZAR'=>'ZAR'); } function GetWaehrungUmrechnungskurseTabelle($von = 'EUR') { /** @var Waehrungumrechnung $obj */ $obj = $this->LoadModul('waehrungumrechnung'); if(!empty($obj) && method_exists($obj,'GetWaehrungUmrechnungskurseTabelle')) { return $obj->GetWaehrungUmrechnungskurseTabelle($von); } } /** * @param bool $mitstandardlager * @param bool $forceZwischenlager * * @return array */ function GetLager($mitstandardlager=false, $forceZwischenlager = false) { $tmp = []; if($forceZwischenlager || $this->Firmendaten('wareneingang_zwischenlager')=='1') { $tmp['zwischenlager'] = 'Zwischenlager'; } if($mitstandardlager) { $tmp['standardlager'] = 'Standardlager'; } $result = $this->app->DB->SelectArr( "SELECT lp.id, CONCAT(l.bezeichnung,'->',lp.kurzbezeichnung) as kurzbezeichnung FROM lager_platz AS lp INNER JOIN lager AS l ON lp.lager=l.id WHERE lp.kurzbezeichnung!='' AND lp.geloescht <> 1 AND l.geloescht <> 1 ORDER BY l.bezeichnung,lp.kurzbezeichnung" ); if(empty($result)) { return $tmp; } foreach($result as $row) { $tmp[$row['id']] = $row['kurzbezeichnung']; } return $tmp; } function GetArtikelart() { return array('produkt'=>'Produkt','material'=>'Material','dienstleistung'=>'Dienstleistung','muster'=>'Muster', 'gebuehr'=>'Gebühr','betriebsstoff'=>'Betriebsstoff','buerobedarf'=>'Bürobedarf', 'inventar'=>'Inventar','porto'=>'Porto','literatur'=>'Literatur'); } function StartMessung() { $this->start_messung = $this->uniqueTimeStamp(); } function EndeMessung() { $this->ende_messung = $this->uniqueTimeStamp(); } function ErgebnisMessung() { $differenz = $this->ende_messung-$this->start_messung; $differenz = $differenz/10; // warum auch immer $differenz = (int)$differenz; echo "Die Ausführung dauerte $differenz ms"; } function uniqueTimeStamp() { $milliseconds = microtime(); $timestring = explode(" ", $milliseconds); $sg = $timestring[1]; $mlsg = substr($timestring[0], 2, 4); $timestamp = $sg.$mlsg; return $timestamp; } /** @deprecated */ function GetWartezeitTicket($zeit) { $timestamp = strToTime($zeit, null); $td = $this->makeDifferenz($timestamp,time()); return $td['day'][0] . ' ' . $td['day'][1] . ', ' . $td['std'][0] . ' ' . $td['std'][1] . ', ' . $td['min'][0] . ' ' . $td['min'][1];// . ', ' . $td['sec'][0] . ' ' . $td['sec'][1]; } function makeDifferenz($first, $second){ if($first > $second) $td['dif'][0] = $first - $second; else $td['dif'][0] = $second - $first; $td['sec'][0] = $td['dif'][0] % 60; // 67 = 7 $td['min'][0] = (($td['dif'][0] - $td['sec'][0]) / 60) % 60; $td['std'][0] = (((($td['dif'][0] - $td['sec'][0]) /60)- $td['min'][0]) / 60) % 24; $td['day'][0] = floor( ((((($td['dif'][0] - $td['sec'][0]) /60)- $td['min'][0]) / 60) / 24) ); $td = $this->makeString($td); return $td; } function makeString($td){ if ($td['sec'][0] == 1) $td['sec'][1] = 'Sekunde'; else $td['sec'][1] = 'Sekunden'; if ($td['min'][0] == 1) $td['min'][1] = 'Minute'; else $td['min'][1] = 'Minuten'; if ($td['std'][0] == 1) $td['std'][1] = 'Stunde'; else $td['std'][1] = 'Stunden'; if ($td['day'][0] == 1) $td['day'][1] = 'Tag'; else $td['day'][1] = 'Tage'; return $td; } function GetProjektSelect($projekt,$color_selected='') { $sql = "SELECT id,name,farbe FROM projekt order by id"; $tmp = $this->app->DB->SelectArr($sql); $ctmp = !empty($tmp)?count($tmp):0; for($i=0;$i<$ctmp;$i++) { if($tmp[$i]['farbe']=='') $tmp[$i]['farbe']='white'; if($projekt==$tmp[$i]['id']){ $options = (isset($options)?$options:'').""; $color_selected = $tmp[$i]['farbe']; } else{ $options = (isset($options) ? $options : '') . ""; } } return !empty($options)?$options:''; } /** * @param int $id * * @return string */ public function GetAdressName($id) { return (String)$this->app->DB->Select( sprintf('SELECT name FROM adresse WHERE id=%d AND geloescht=0 LIMIT 1', $id) ); } function GetAdressSubject() { return array('Kunde','Lieferant','Mitarbeiter','Mitglied');//'Externer Mitarbeiter','Projektleiter } function GetAdressPraedikat() { return array('','von','fuer','ist'); } function GetAdressObjekt() { return array('','Projekt'); } function GetVersandartAuftrag($projekt = 0) { $check = $this->app->DB->Select("SELECT COUNT(id) FROM versandarten"); if($check <=0) { $modul = ""; $tmp = array( 'keinversand'=>'Kein Versand', 'selbstabholer'=>'Selbstabholer', 'spedition'=>'Spedition', ); foreach($tmp as $key=>$value) { if($key == 'keinversand'){$modul='';} if($key == 'selbstabholer'){$modul='selbstabholer';} if($key == 'spedition'){$modul='';} $this->app->DB->Insert("INSERT INTO versandarten (id,type,bezeichnung,aktiv,modul) VALUES ('','$key','$value','1','$modul')"); } } $tmp = $this->app->DB->SelectArr("SELECT type,bezeichnung FROM versandarten WHERE aktiv='1' AND geloescht!='1' AND (projekt = '$projekt' OR projekt = 0) ORDER by bezeichnung"); if($tmp) { for($i=0;$i<(!empty($tmp)?count($tmp):0);$i++) { $result[$tmp[$i]['type']]=$tmp[$i]['bezeichnung']; } } return $result; } function GetVersandartLieferant() { return array('DHL','DPD','Hermes','UPS','GLS','Post','Spedition','Selbstabholer','Packstation'); } function GetArtikeleigenschaft($projekt="") { if($projekt > 0) { $result = $this->app->DB->SelectArr("SELECT id,name FROM artikeleigenschaften WHERE projekt='$projekt' AND geloescht!=1 ORDER by name"); // gibt es keine projekt gruppen dann die ohne projekt verwenden if((!empty($result)?count($result):0)<=0) $result = $this->app->DB->SelectArr("SELECT id,name FROM artikeleigenschaften WHERE geloescht!=1 AND projekt <=0 ORDER by name"); } else { $result = $this->app->DB->SelectArr("SELECT id,name FROM artikeleigenschaften WHERE geloescht!=1 AND projekt <=0 ORDER by name"); } if((!empty($result)?count($result):0) > 0) { for($i=0;$i<(!empty($result)?count($result):0);$i++) { $tmp[$result[$i]['id']]=$result[$i]['name']; } return $tmp; } } function GetArtikelgruppe($projekt="") { if($projekt > 0) { $result = $this->app->DB->SelectArr("SELECT id,bezeichnung FROM artikelkategorien WHERE (projekt='$projekt' OR projekt = 0) AND parent = 0 AND geloescht!=1 ORDER by bezeichnung"); // gibt es keine projekt gruppen dann die ohne projekt verwenden if((!empty($result)?count($result):0)<=0) $result = $this->app->DB->SelectArr("SELECT id,bezeichnung FROM artikelkategorien WHERE geloescht!=1 AND projekt <=0 AND parent = 0 ORDER by bezeichnung"); } else { $result = $this->app->DB->SelectArr("SELECT id,bezeichnung FROM artikelkategorien WHERE geloescht!=1 AND projekt <=0 AND parent = 0 ORDER by bezeichnung"); } if($result && (!empty($result)?count($result):0) > 0) { for($i=0;$i<(!empty($result)?count($result):0);$i++) { $tmp[$result[$i]['id']."_kat"]=$result[$i]['bezeichnung']; } return $tmp; } return array("produkt"=>"Ware für Verkauf (700000)", "module"=>"Module / Hardware (600000)", "produktion"=>"Produktionsmaterial (400000)", "material"=>"Sonstiges (100000)", "fremdleistung"=>"Fremdleistung (100000)", "gebuehr"=>"Gebühr / Miete (100000)"); } function GetZahlungsstatus() { return array('offen','bezahlt'); } /** * @param null|int $id * * @return array */ public function GetZahlungsweiseGutschrift($id = null) { $zahlungsweise = ''; $projectId = 0; $tmp = []; if($id) { $returnOrder = $this->app->DB->SelectRow( sprintf( 'SELECT `zahlungsweise`, `projekt` FROM `gutschrift` WHERE `id` = %d LIMIT 1', $id ) ); if(!empty($returnOrder)) { $projectId = $returnOrder['projekt']; $zahlungsweise = $returnOrder['zahlungsweise']; } } $extra = $this->app->DB->SelectPairs( sprintf( 'SELECT z.`type`, z.`bezeichnung` FROM `zahlungsweisen` AS `z` INNER JOIN ( SELECT `type`, max(`projekt`) as projekt FROM `zahlungsweisen` WHERE `aktiv` = 1 AND `projekt` = 0 OR `projekt` = %d GROUP BY `type` ) AS `t` ON z.`type` = t.`type` AND z.`projekt` = t.`projekt`', $projectId ) ); // return array('ueberweisung'=>'Überweisung','bar'=>'Bar','paypal'=>'PayPal'); foreach( [ 'kreditkarte' => 'Kreditkarte', 'lastschrift' => 'Verrechnen mit Lastschriften', 'paypal' => 'Paypal', 'amazon' => 'Amazon Payments', 'amazon_bestellung' => 'Amazon Bestellung', 'secupay' => 'Secupay', 'sofortueberweisung' => 'Sofortüberweisung', 'eckarte' => 'EC-Karte', ] as $paymentType => $paymentName) { if(!empty($extra[$paymentType])) { continue; } if($zahlungsweise === $paymentType || $this->Firmendaten('zahlung_'.$paymentType)) { $tmp[$paymentType] = $paymentName; } } if(!empty($extra)){ foreach($extra as $type => $name) { $tmp[$type] = $name; } } if($zahlungsweise && empty($tmp[$zahlungsweise])) { if($zahlungsweise === 'ueberweisung') { $tmp['ueberweisung'] = 'Überweisung'; } else { $tmp[$zahlungsweise] = ucfirst($zahlungsweise); } } asort($tmp); return $tmp; } public function GetZahlungsweise($table = null, $id = null, $projekt = null) { $zahlungsweise = ''; if($projekt === null){ $projekt = (int)$this->Firmendaten('projekt'); if(!empty($table) && !empty($id)) { $arr = $this->app->DB->SelectRow("SELECT zahlungsweise, projekt FROM $table WHERE id = '$id' LIMIT 1"); if(!empty($arr)) { $zahlungsweise = $arr['zahlungsweise']; $projekt = (int)$arr['projekt']; } } } if($this->Firmendaten("zahlung_rechnung") || $zahlungsweise == 'rechnung'){ $tmp['rechnung'] = "Rechnung"; } if($this->Firmendaten("zahlung_vorkasse") || $zahlungsweise == 'vorkasse'){ $tmp['vorkasse'] = "Vorkasse"; } if($this->Firmendaten("zahlung_nachnahme") || $zahlungsweise == 'nachnahme'){ $tmp['nachnahme'] = "Nachnahme"; } if($this->Firmendaten("zahlung_kreditkarte") || $zahlungsweise == 'kreditkarte'){ $tmp['kreditkarte'] = "Kreditkarte"; } if($this->Firmendaten("zahlung_eckarte") || $zahlungsweise == 'eckarte'){ $tmp['eckarte'] = "EC-Karte"; } if($this->Firmendaten("zahlung_bar") || $zahlungsweise == 'bar'){ $tmp['bar'] = "Bar"; } if($this->Firmendaten("zahlung_paypal") || $zahlungsweise == 'paypal'){ $tmp['paypal'] = "Paypal"; } if($this->Firmendaten("zahlung_amazon") || $zahlungsweise == 'amazon'){ $tmp['amazon'] = "Amazon Payments"; } if($this->Firmendaten("zahlung_amazon_bestellung") || $zahlungsweise == 'amazon_bestellung'){ $tmp['amazon_bestellung'] = "Amazon Bestellung"; } if($this->Firmendaten("zahlung_secupay") || $zahlungsweise == 'secupay'){ $tmp['secupay'] = "Secupay"; } if($this->Firmendaten("zahlung_sofortueberweisung") || $zahlungsweise == 'sofortueberweisung'){ $tmp['sofortueberweisung'] = "Sofortüberweisung"; } if($this->Firmendaten("zahlung_lastschrift") || $zahlungsweise == 'lastschrift'){ $tmp['lastschrift'] = "Lastschrift"; } if($this->Firmendaten("zahlung_ratenzahlung") || $zahlungsweise == 'ratenzahlung'){ $tmp['ratenzahlung'] = "Ratenzahlung"; } $extra = $this->app->DB->SelectArr(" SELECT z.`type`, z.`bezeichnung` FROM zahlungsweisen z INNER JOIN ( SELECT `type`, max(projekt) as projekt FROM zahlungsweisen WHERE aktiv=1 AND projekt = 0 OR projekt = $projekt GROUP BY `type` ) t ON z.`type` = t.`type` AND z.`projekt` = t.`projekt` "); $cextra = !empty($extra)?count($extra):0; for($i=0;$i<$cextra;$i++) { $tmp[$extra[$i]['type']] = $extra[$i]['bezeichnung']; } if($zahlungsweise && empty($tmp[$zahlungsweise]))$tmp[$zahlungsweise] = ucfirst($zahlungsweise); if (!empty($tmp)) { asort($tmp); } return $tmp; // return array('rechnung'=>'Rechnung','vorkasse'=>'Vorkasse','nachnahme'=>'Nachnahme','kreditkarte'=>'Kreditkarte','einzugsermaechtigung'=>'Einzugsermaechtigung','bar'=>'Bar','paypal'=>'PayPal','lastschrift'=>'Lastschrift'); } function GetPinwandSelect() { $tmp = $this->app->DB->SelectArr("SELECT DISTINCT p.id,p.name FROM pinwand p LEFT JOIN pinwand_user pu ON pu.pinwand=p.id WHERE (pu.user='".$this->app->User->GetID()."' OR p.user='".$this->app->User->GetID()."') ORDER by p.name"); $result['0']="Eigene Pinnwand"; if(empty($tmp)) { return $result; } foreach($tmp as $row) { $result[$row['id']] = $row['name']; } return $result; } function GetSprachenSelect($wert = null) { $check = $this->app->DB->Select("SELECT id FROM sprachen WHERE aktiv = 1 LIMIT 1"); if($check <=0) { $this->app->erp->CheckTable("sprachen"); $this->app->erp->CheckColumn("id", "int(11)", "sprachen", "NOT NULL AUTO_INCREMENT"); $this->app->erp->CheckColumn("iso", "varchar(2)", "sprachen", "NOT NULL"); $this->app->erp->CheckColumn("bezeichnung_de", "varchar(255)", "sprachen", "NOT NULL DEFAULT ''"); $this->app->erp->CheckColumn("bezeichnung_en", "varchar(255)", "sprachen", "NOT NULL DEFAULT ''"); $this->app->erp->CheckColumn("alias", "varchar(255)", "sprachen", "NOT NULL DEFAULT ''"); $this->app->erp->CheckColumn("aktiv", "tinyint(1)", "sprachen", "NOT NULL DEFAULT '0'"); $arr = array('DE'=>array('Deutsch','German','deutsch','1'), 'EN'=>array('Englisch','English','englisch','1'), 'FR'=>array('Französisch','French','franzoesisch','1'), 'NL'=>array('Holländisch','Dutch','hollaendisch','1'), 'IT'=>array('Italienisch','Italian','italienisch','1'), 'ES'=>array('Spanisch','Spanish','spanisch','1'), 'CZ'=>array('Tschechisch','Czech','tschechisch','1'), 'DK'=>array('Dänisch','Danish','daenisch','1'), 'SK'=>array('Slowakisch','Slovak','slowakisch','1'), 'SW'=>array('Schwedisch','Swedish','schwedisch','1'), 'PL'=>array('Polnisch','Polish','polnisch','1') ); foreach($arr as $k => $v) { $check = $this->app->DB->SelectArr("SELECT * FROM sprachen WHERE iso = '$k' LIMIT 1"); if($check) { if($check[0]['alias'] != $v[2])$this->app->DB->Update("UPDATE sprachen SET alias = '".$v[2]."', aktiv = 1 WHERE id = '".$check[0]['id']."' LIMIT 1"); }else{ $this->app->DB->Insert("INSERT INTO sprachen (iso, bezeichnung_de,bezeichnung_en, alias, aktiv) VALUES ('".$k."','".$v[0]."','".$v[1]."','".$v[2]."','1')"); } } } $land = $this->Firmendaten('land'); $tmp = $this->app->DB->SelectArr("SELECT iso,alias, bezeichnung_de,aktiv FROM sprachen WHERE iso <> '' ORDER BY iso = '$land' DESC, bezeichnung_de"); $deutschfound = false; $englischfound = false; for($i=0;$i<(!empty($tmp)?count($tmp):0);$i++) { if($tmp[$i]['alias'] != '' && $wert != $tmp[$i]['iso']) { if($tmp[$i]['aktiv']) { if($tmp[$i]['alias'] == 'deutsch')$deutschfound = true; if($tmp[$i]['alias'] == 'englisch')$englischfound = true; $result[$tmp[$i]['alias']] = $tmp[$i]['bezeichnung_de']; } }else{ if($wert == $tmp[$i]['alias'] && $wert <> '') { $result[$tmp[$i]['alias']] = $tmp[$i]['bezeichnung_de']; if($tmp[$i]['alias'] == 'deutsch')$deutschfound = true; if($tmp[$i]['alias'] == 'englisch')$englischfound = true; }elseif($wert == $tmp[$i]['iso'] && $wert <> '') { $result[$tmp[$i]['iso']] = $tmp[$i]['bezeichnung_de']; }elseif($tmp[$i]['aktiv']) { $result[$tmp[$i]['iso']] = $tmp[$i]['bezeichnung_de']; } } } if(!$deutschfound)$result['deutsch'] = 'Deutsch'; if(!$englischfound)$result['englisch'] = 'Englisch'; return $result; } function GetTypSelect() { $check = $this->app->DB->Select("SELECT COUNT(id) FROM adresse_typ"); if($check <=0) { $tmp = array('firma'=>'Firma','herr'=>'Herr','frau'=>'Frau'); foreach($tmp as $key=>$value) { if($key=="firma") $netto=1;else $netto=0; $this->app->DB->Insert("INSERT INTO adresse_typ (id,type,bezeichnung,aktiv,netto) VALUES ('','$key','$value','1','$netto')"); } } $tmp = $this->app->DB->SelectArr("SELECT type,bezeichnung FROM adresse_typ WHERE aktiv='1' AND geloescht!='1' ORDER by bezeichnung"); $result['']='Bitte wählen'; for($i=0;$i<(!empty($tmp)?count($tmp):0);$i++) $result[$tmp[$i]['type']]=$tmp[$i]['bezeichnung']; return $result; } function GetArtikelWarengruppe() { //return array('SMD','THT','EBG','BGP'); $tmp = array('','Bauteil','Eval-Board','Adapter','Progammer','Gerät','Kabel','Software','Dienstleistung','Spezifikation'); sort($tmp); return $tmp; } function GetBezahltWieAssoc() { return array('privat'=>"Privat",'firma_bar'=>"Firma (Kasse/Bar)",'firma_ecr'=>"Firma (EC-Karte)",'firma_cc'=>"Firma (Kreditkarte)",'firma_sonst'=>"Firma (Sonstige)"); } function GetStatusArbeitsnachweis() { return array('offen','freigegeben','versendet'); } function GetStatusAnfrage() { return array('offen','abgeschlossen'); } function GetStatusInventur() { return array('offen','abgeschlossen'); } function GetStatusReisekosten() { return array('offen','freigegeben','versendet','buchhaltung'); } function GetStatusLieferschein() { return array('offen','freigegeben','versendet'); } function GetStatusAuftrag() { return array('offen','freigegeben','abgeschlossen'); } function GetStatusAngebot() { return array('offen','freigegeben','bestellt','angemahnt','empfangen'); } function GetStatusGutschrift() { return array('offen','freigegeben','bezahlt'); } function GetStatusRechnung() { return array('offen','freigegeben','gestellt','zahlungserinnerung','mahnung'); } function GetFirmaFieldsCheckbox() { $tmp = array('paketmarke_mit_waage','artikel_beschleunigte_suche','internebemerkungminidetails','briefpapier_bearbeiter_ausblenden','briefpapier_vertrieb_ausblenden','versand_gelesen','zahlung_rechnung','zahlung_vorkasse','zahlung_bar','zahlung_lastschrift','zahlung_paypal','zahlung_amazon','artikel_bilder_uebersicht','artikel_baum_uebersicht','internetnummerimbeleg','wiedervorlage_mitarbeiter', 'zahlung_amazon_bestellung','zahlung_billsafe','zahlung_sofortueberweisung','zahlung_secupay','zahlung_eckarte','zeiterfassung_schliessen','zeiterfassung_pflicht', 'zahlung_kreditkarte','zahlung_nachnahme','zahlung_ratenzahlung','knickfalz','begrenzen_artikeltabelle','begrenzen_adressetabelle','begrenzen_belege','schnellsuche','schnellsuchecount','versandmail_zwischenspeichern','keinhauptmenurahmen','bordertabnav','steuerfrei_inland_ausblenden','auftragexplodieren_unterstuecklisten', 'standardaufloesung','immerbruttorechnungen','immernettorechnungen','bestellvorschlaggroessernull','erweiterte_positionsansicht','schnellanlegen','kleinunternehmer','steuerspalteausblenden','api_enable','api_importwarteschlange','warnung_doppelte_nummern','warnung_doppelte_seriennummern','wareneingang_zwischenlager','bestellungohnepreis','zahlung_lastschrift_konditionen','porto_berechnen','breite_artikelbeschreibung','deviceenable','auftrag_eantab','bestellungmitartikeltext','bestellungeigeneartikelnummer','bestellunglangeartikelnummern','steuer_standardkonto_aufwendungen', 'iconset_dunkel','api_cleanutf8','mahnwesenmitkontoabgleich','briefhtml','absenderunterstrichen','seite_von_ausrichtung_relativ','wareneingang_gross','datatables_export_button_flash','viernachkommastellen_belege','stornorechnung_standard','angebotersatz_standard','rechnungersatz_standard','geburtstagekalender','footer_zentriert','auftragmarkierenegsaldo','wareneingangauftragzubestellung','freifelderimdokument','zeiterfassung_anderemitarbeiter','zeiterfassung_beschreibungssperre','zeiterfassung_ort','zeiterfassung_kommentar','zeiterfassung_erweitert','footer_reihenfolge_angebot_aktivieren','footer_reihenfolge_auftrag_aktivieren','footer_reihenfolge_rechnung_aktivieren','footer_reihenfolge_gutschrift_aktivieren','footer_reihenfolge_lieferschein_aktivieren','footer_reihenfolge_bestellung_aktivieren','position_quantity_change_price_update', 'beleg_pos_ean','beleg_pos_charge','beleg_pos_mhd','beleg_pos_sn','beleg_pos_zolltarifnummer', 'schnellanlegen_ohnefreigabe','langeartikelnummern','noauth','belege_subpositionen', 'belege_subpositionenstuecklisten','briefpapier_ohnedoppelstrich','bearbeiteremailimdokument', 'bearbeitertelefonimdokument','seite_belegnr','eigener_skontotext','proformarechnung_ohnebriefpapier', 'footer_reihenfolge_proformarechnung_aktivieren','zeiterfassung_abrechnenvorausgewaehlt','festetrackingnummer', 'guenstigste_vk','oneclickrelease','cleaner_logfile','cleaner_protokoll','cleaner_shopimport','cleaner_shopexportlog', 'cleaner_versandzentrum','cleaner_uebertragungen','cleaner_adapterbox','angebot_auftrag_bestellung_ansprechpartner', 'ampellager','ampelporto','ampelust','ampelzahlung','ampelnachnahme','ampelautoversand','ampelkunde', 'ampelliefertermin','ampelkreditlimit','ampelliefersperre','ampelproduktion','freitext1aktiv','freitext2aktiv', 'reisekosten_ohnebriefpapier','lieferdatumkw','vertriebbearbeiterfuellen','typimdokument','staffelpreiseanzeigen', 'abmessungimdokument','projektoeffentlich','verkaufspreisevpe','einkaufspreisevpe','apiohnehtmlumwandlung', 'externeurlsblockieren','auftragabschliessen','belegnummersortierungint', 'dienstleistungsartikel_nicht_zu_lieferschein','dateienweiterfuehren','systemmailsabschalten','belegeinanhang', 'lagerbestand_in_auftragspositionen_anzeigen','positionenkaufmaenischrunden','wareneingang_lagerartikel', 'stuecklistegewichtnurartikel','bestellungabschliessen','gutschriftkursvonrechnung','wareneingangdmsdrucker', 'dsgvoversandunternehmen','produktionskorrektur_nichtverwenden','disableproductionautostart','closesubproductions', 'disablecreateproductiononextern', 'beleg_artikelbild','lieferschein_artikelbild','rechnung_artikelbild','bestellung_artikelbild','gutschrift_artikelbild','angebot_artikelbild', 'shopexportlog','autoversand_locked_orders','beleg_pos_herkunftsland', 'loadcurrencyrate','versandzentrum_bild','onlyemployeeprojects','proformainvoice_juststorgearticles' ); return $tmp; } function GetFirmaFields() { $fields = array('additionalcspheader','zahlung_rechnung_de','zahlung_kreditkarte_de','breite_position','breite_menge','breite_nummer','breite_einheit','land','abstand_seiten_unten','beschriftunginternetnummer','breite_artikel','breite_steuer','angebot_anzahltage','angebot_anzahlwiedervorlage','angebot_pipewiedervorlage', 'zahlung_vorkasse_de','zahlung_nachnahme_de','zahlung_lastschrift_de','zahlung_bar_de','zahlung_paypal_de','zahlung_amazon_de','zahlung_amazon_bestellung_de','zahlung_ratenzahlung_de', 'zahlung_sofortueberweisung_de','zahlung_billsafe_de','testmailempfaenger','zahlung_secupay_de','zahlung_eckarte_de','abstand_umbruchunten', 'zahlung_rechnung_sofort_de','api_importwarteschlange_name','footer_farbe','zahlung_auftrag_sofort_de','zahlung_auftrag_de', 'zahlungszieltage','zahlungszieltageskonto','zahlungszielskonto','api_initkey','api_remotedomain','api_eventurl','steuer_erloese_inland_normal','devicekey','deviceserials','steuer_standardkonto','bcc3', 'steuer_aufwendung_inland_normal','tabsnavigationfarbe','tabsnavigationfarbeschrift', 'steuer_erloese_inland_ermaessigt', 'steuer_aufwendung_inland_ermaessigt', 'steuer_erloese_inland_steuerfrei', 'steuer_aufwendung_inland_steuerfrei', 'steuer_erloese_inland_innergemeinschaftlich', 'steuer_aufwendung_inland_innergemeinschaftlich', 'steuer_erloese_inland_eunormal', 'steuer_erloese_inland_euermaessigt', 'steuer_erloese_inland_nichtsteuerbar', 'steuer_aufwendung_inland_nichtsteuerbar', 'steuer_aufwendung_inland_eunormal', 'steuer_aufwendung_inland_euermaessigt', 'steuer_erloese_inland_export', 'etikettendrucker_wareneingang','schriftgroesseabsender','aufgaben_bondrucker', 'steuer_aufwendung_inland_import','versandart','zahlungsweise','zahlungsweiselieferant','bezeichnungstornorechnung','steuer_anpassung_kundennummer','abstand_seitenrandlinks','abstand_adresszeilelinks','sepaglaeubigerid','abstand_gesamtsumme_lr', 'schriftgroesse_gesamt','schriftgroesse_gesamt_steuer','abstand_seitenrandrechts', 'bezeichnungangebotersatz', 'bezeichnungauftragersatz', 'bezeichnungproformarechnungersatz', 'bezeichnungrechnungersatz', 'bezeichnunglieferscheinersatz', 'bezeichnungbestellungersatz', 'barcode_x','barcode_y','barcode_x_header','barcode_y_header','abseite2y','mailgrussformel', 'email_html_template', 'footer_reihenfolge_angebot', 'footer_reihenfolge_auftrag', 'footer_reihenfolge_rechnung', 'footer_reihenfolge_proformarechnung', 'footer_reihenfolge_gutschrift', 'footer_reihenfolge_lieferschein', 'footer_reihenfolge_bestellung','reihenfolge_zwischenspeicher','adresse_vorlage','eigener_skontotext_re','eigener_skontotext_anab', 'footer_reihenfolge_bestellung','cleaner_logfile_tage','cleaner_protokoll_tage','cleaner_shopimport_tage','cleaner_versandzentrum_tage','cleaner_uebertragungen_tage','cleaner_adapterbox_tage','begrenzenanzahl_artikeltabelle','begrenzenanzahl_adressetabelle','begrenzenanzahl_belege','versandmails_max','autoversand_maxauftraege' ,'gewichtzukgfaktor','gewichtbezeichnung','zeiterfassung_schliessentage','freitext1x','freitext1y','freitext1schriftgroesse','freitext1breite','freitext1inhalt', 'freitext2x','freitext2y','freitext2schriftgroesse','freitext2breite','freitext2inhalt','kommissionskonsignationslager','bezeichnungaktionscodes','belege_stuecklisteneinrueckenmm','ldap_host','ldap_bindname','ldap_searchbase','ldap_filter','systemmailsempfaenger', 'server_url','server_port','cronjob_limit','cleaner_shopexportlog_tage','poll_repeattime','wareneingangbildtypvorauswahl','wareneingangscanverhalten', 'group_sales', 'group_employee' ); for($ki=1;$ki<=15;$ki++) { $fields[]='steuer_art_'.$ki; $fields[]='steuer_art_'.$ki.'_normal'; $fields[]='steuer_art_'.$ki.'_ermaessigt'; $fields[]='steuer_art_'.$ki.'_steuerfrei'; } return $fields; } function GetMLMAuszahlungWaehrung() { return array('EUR','CHF'); } function GetWaehrungUmrechnungskurs($von,$nach,$onlytable = false) { /** @var Waehrungumrechnung $obj */ $obj = $this->LoadModul('waehrungumrechnung'); if(!empty($obj) && method_exists($obj,'GetWaehrungUmrechnungskurs')) { return $obj->GetWaehrungUmrechnungskurs($von,$nach,$onlytable); } return 0; } function GetSchriftarten() { return array( 'arial' => 'Arial' ); } function GetFonts() { $ret['times'] = array('b' => true,'bi' => true,'i' => true, 'name' => 'Times'); $ret['arial'] = array('b' => true,'bi' => true,'i' => true, 'name' => 'Arial'); if(!file_exists(__DIR__.'/pdf/font') || !is_dir(__DIR__.'/pdf/font')) { return $ret; } $handle = opendir(__DIR__.'/pdf/font'); if(!$handle) { return $ret; } while (false !== ($entry = readdir($handle))) { $b = false; $bi = false; $i = false; $pathinfo = pathinfo($entry); if(isset($pathinfo['extension']) && strtolower($pathinfo['extension']) == 'php') { if(strpos($entry,'helvetica') !== 0 && strpos($entry,'times') !== 0) { $basis = $pathinfo['filename']; if(substr($pathinfo['filename'],-2) == 'bi') { if(file_exists(__DIR__.'/pdf/font/'.substr($pathinfo['filename'],0,strlen($pathinfo['filename'])-2).'.php')) { $bi = true; $basispathinfo = pathinfo(__DIR__.'/pdf/font/'.substr($pathinfo['filename'],0,strlen($pathinfo['filename'])-2)); $basis = $basispathinfo['basename']; } }elseif(substr($pathinfo['filename'],-1) == 'i') { if(file_exists(__DIR__.'/pdf/font/'.substr($pathinfo['filename'],0,strlen($pathinfo['filename'])-1).'.php')) { $i = true; $basispathinfo = pathinfo(__DIR__.'/pdf/font/'.substr($pathinfo['filename'],0,strlen($pathinfo['filename'])-1)); $basis = $basispathinfo['basename']; } }elseif(substr($pathinfo['filename'],-1) == 'b') { if(file_exists(__DIR__.'/pdf/font/'.substr($pathinfo['filename'],0,strlen($pathinfo['filename'])-1).'.php')) { $b = true; $basispathinfo = pathinfo(__DIR__.'/pdf/font/'.substr($pathinfo['filename'],0,strlen($pathinfo['filename'])-1)); $basis = $basispathinfo['basename']; } } if(isset($file))unset($file); if(isset($name))unset($name); include_once(__DIR__.'/pdf/font/'.$entry); if(isset($file)&& file_exists(__DIR__.'/pdf/font/'.$file) && isset($name)) { if(!isset($ret[$basis]))$ret[$basis]['name'] = $name; if(!$bi && !$i && !$b)$ret[$basis]['name'] = $name; if($bi)$ret[$basis]['bi'] = true; if($i)$ret[$basis]['i'] = true; if($b)$ret[$basis]['b'] = true; } } } } closedir($handle); return $ret; } function GetMLMAbrechnung() { return array('sammelueberweisung'=>'Sammelüberweisung','manuell'=>'Manuelle Auszahlung'); } function GetMLMPositionierung() { return array('1'=>'1. Junior Consultant', '2'=>'2. Consultant', '3'=>'3. Associate', '4'=>'4. Manager', '5'=>'5. Senior Manager', '6'=>'6. General Director', '7'=>'7. General Manager', '8'=>'8. Chief Manager', '9'=>'9. Vice President', '10'=>'10. President', '11'=>'11. ', '12'=>'12. ', '13'=>'13. ', '14'=>'14. ', '15'=>'15. ' ); } function GetStatusBestellung() { return array('offen','freigegeben','bestellt','angemahnt','empfangen'); } function GetSelectAsso($array, $selected) { foreach($array as $key=>$value) { if($selected==$key) $tmp = "selected"; else $tmp=""; $ret .= ""; } return $ret; } function GetSelect($array, $selected) { foreach($array as $value) { if($selected==$value) $tmp = "selected"; else $tmp=""; $ret .= ""; } return $ret; } function CreateAdresse($name,$firma="1") { $projekt = $this->app->DB->Select("SELECT standardprojekt FROM firma WHERE id='".$this->app->User->GetFirma()."' LIMIT 1"); $projekt_bevorzugt=$this->app->DB->Select("SELECT projekt_bevorzugen FROM user WHERE id='".$this->app->User->GetID()."' LIMIT 1"); if($projekt_bevorzugt=="1") { $projekt = $this->app->DB->Select("SELECT projekt FROM user WHERE id='".$this->app->User->GetID()."' LIMIT 1"); } $zahlungsweise = $this->StandardZahlungsweise($projekt); $zahlungsweiselieferant = $this->StandardZahlungsweiseLieferant($projekt); $versandart = $this->StandardVersandart($projekt); $this->app->DB->Insert("INSERT INTO adresse (id,name,firma,zahlungsweise,zahlungsweiselieferant,projekt,versandart) VALUES ('','$name','$firma','$zahlungsweise','$zahlungsweiselieferant','$projekt','$versandart')"); $returnId = $this->app->DB->GetInsertID(); $this->RunHook('AfterAddressCreate', 1, $returnId); return $returnId; } function CreateLieferadresse($adresse,$data) { $this->app->DB->Insert("INSERT INTO lieferadressen (id,adresse) VALUES ('','$adresse')"); $id = $this->app->DB->GetInsertID(); if($data['land']=="") $data['land']='DE'; $type="lieferadressen"; $this->app->erp->ObjektProtokoll($type,$id,$type."_create",ucfirst($type)." angelegt"); foreach ($data as $key => $value) { $this->app->DB->Update("UPDATE lieferadressen SET $key='".$value."' WHERE id='$id' LIMIT 1"); } return $id; } function CreateAnsprechpartner($adresse,$data) { $this->app->DB->Insert("INSERT INTO ansprechpartner (id,adresse) VALUES ('','$adresse')"); $id = $this->app->DB->GetInsertID(); if($data['land']=="") $data['land']='DE'; if (!empty($id)) { $this->app->erp->RunHook('contact_person_created', 1, $id); } $type="ansprechpartner"; $this->app->erp->ObjektProtokoll($type,$id,$type."_create",ucfirst($type)." angelegt"); foreach ($data as $key => $value) { $this->app->DB->Update("UPDATE ansprechpartner SET $key='".$value."' WHERE id='$id' LIMIT 1"); } return $id; } function CreateAccount($adresse, $data) { $this->app->DB->Insert("INSERT INTO adresse_accounts (id, adresse) VALUES ('', '$adresse')"); $id = $this->app->DB->GetInsertID(); if($data['aktiv'] == ""){ $data['aktiv'] = 0; } if($data['art'] == ""){ $data['art'] = ""; } if($data['gueltig_ab'] == "" || $data['gueltig_ab'] == "0000-00-00" || $data['gueltig_ab'] == "00.00.0000"){ $data['gueltig_ab'] = '0000-00-00'; }else{ $data['gueltig_ab'] = date('Y-m-d',strtotime($data['gueltig_ab'])); } if($data['gueltig_bis'] == "" || $data['gueltig_bis'] == "0000-00-00" || $data['gueltig_bis'] == "00.00.0000"){ $data['gueltig_bis'] = "0000-00-00"; }else{ $data['gueltig_bis'] = date('Y-m-d',strtotime($data['gueltig_bis'])); } foreach($data as $key => $value){ $this->app->DB->Update("UPDATE adresse_accounts SET $key = '".$value."' WHERE id = '$id' LIMIT 1"); } return $id; } function FallbackRolle($adresse) { if(is_numeric($adresse)) { $projekt = $this->app->DB->Select("SELECT ar.parameter FROM adresse_rolle ar INNER JOIN projekt pr ON ar.parameter = pr.id AND pr.geloescht <> 1 WHERE (ar.bis <= CURDATE() OR ar.bis = '0000-00-00') AND ar.adresse='$adresse' AND ar.objekt='Projekt' LIMIT 1"); if($projekt <=0) { $projekt = $this->app->DB->Select("SELECT ar.projekt FROM adresse_rolle ar INNER JOIN projekt pr ON ar.projekt = pr.id AND pr.geloescht <> 1 WHERE (ar.bis <= CURDATE() OR ar.bis = '0000-00-00') AND ar.adresse='$adresse' AND ar.objekt!='Gruppe' LIMIT 1"); } return $projekt; } } function AddRolleZuAdresse($adresse, $subjekt, $praedikat="", $objekt="", $parameter="") { if(!$adresse) { return; } $tmp_data_adresse = $this->app->DB->SelectRow("SELECT * FROM adresse WHERE id='$adresse' LIMIT 1"); if(!$tmp_data_adresse) { return; } $projekt = $tmp_data_adresse['projekt']; if(strtoupper($objekt)=="PROJEKT") { $parameter = $this->app->DB->Select("SELECT id FROM projekt WHERE id='$parameter' LIMIT 1"); if($parameter<=0) $parameter=0; if($parameter > 0 ) $projekt=$parameter; else { $parameter =""; $projekt = 0; } } $check = $this->app->DB->Select("SELECT id FROM adresse_rolle WHERE subjekt='$subjekt' AND objekt='$objekt' AND praedikat='$praedikat' AND parameter='$parameter' AND adresse='$adresse' AND (bis >= NOW() OR bis='0000-00-00') LIMIT 1"); if($check > 0) return $check; // Insert .... $sql ="INSERT INTO adresse_rolle (id, adresse, subjekt, praedikat, objekt, parameter,von,projekt) VALUES ('','$adresse','$subjekt','$praedikat','$objekt','$parameter',NOW(),'$projekt')"; $this->app->DB->Insert($sql); $id = $this->app->DB->GetInsertID(); $kundennummer = trim($tmp_data_adresse['kundennummer']); // wenn adresse zum erstenmal die rolle erhält wird kundennummer bzw. lieferantennummer vergeben if($subjekt=="Kunde" && ($kundennummer=="" || is_array($kundennummer))) { $kundennummer = $this->GetNextKundennummer($projekt,$tmp_data_adresse); $this->ObjektProtokoll("adresse",$adresse,"adresse_next_kundennummer","Kundennummer erhalten: $kundennummer"); $this->app->DB->Update("UPDATE adresse SET kundennummer='$kundennummer' WHERE id='$adresse' AND (kundennummer='0' OR kundennummer='') LIMIT 1"); } $lieferantennummer = trim($this->app->DB->Select("SELECT lieferantennummer FROM adresse WHERE id='$adresse' LIMIT 1")); //$data = $this->app->DB->SelectArr("SELECT * FROM adresse WHERE id='$adresse' LIMIT 1"); //$this->LogFile("DEBUG subjekt = $subjekt, projekt=$projekt,adresse=$adresse,lieferantennummer=$lieferantennummer"); if($subjekt=="Lieferant" && ($lieferantennummer=="" || is_array($lieferantennummer))) { $lieferantennummer = $this->GetNextLieferantennummer($projekt,$tmp_data_adresse); $this->ObjektProtokoll("adresse",$adresse,"adresse_next_lieferantennummer","Lieferantennummer erhalten: $lieferantennummer"); $this->app->DB->Update("UPDATE adresse SET lieferantennummer='$lieferantennummer' WHERE id='$adresse' AND (lieferantennummer='0' OR lieferantennummer='') LIMIT 1"); } $mitarbeiternummer = trim($this->app->DB->Select("SELECT mitarbeiternummer FROM adresse WHERE id='$adresse' LIMIT 1")); if($subjekt=="Mitarbeiter" && ($mitarbeiternummer=="" || is_array($mitarbeiternummer))) { $mitarbeiternummer = $this->GetNextMitarbeiternummer($projekt,$tmp_data_adresse); $this->ObjektProtokoll("adresse",$adresse,"adresse_next_mitarbeiternummer","Mitarbeiternummer erhalten: $mitarbeiternummer"); $this->app->DB->Update("UPDATE adresse SET mitarbeiternummer='$mitarbeiternummer' WHERE id='$adresse' AND (mitarbeiternummer='0' OR mitarbeiternummer='') LIMIT 1"); } $this->app->DB->Delete("DELETE FROM adresse_rolle WHERE von > bis AND bis!='0000-00-00'"); return $id; } function UpdateArbeitszeit($id,$adr_id, $vonZeit, $bisZeit, $aufgabe, $beschreibung,$ort, $projekt, $paketauswahl,$art,$kunde="",$abrechnen="0",$verrechnungsart="",$kostenstelle="",$abgerechnet="0",$gps="",$internerkommentar="",$auftrag=0,$produktion=0, $preis = 0,$auftragpositionid="") { //Update $myArr = $this->app->DB->SelectRow("SELECT aufgabe, beschreibung, projekt, kostenstelle FROM arbeitspaket WHERE id = $paketauswahl"); if($paketauswahl!=0 && $kunde <=0) { $kunde = $this->app->DB->Select("SELECT kunde FROM projekt WHERE id='".$myArr["projekt"]."'"); $projekt = $myArr["projekt"]; } else if($kunde=="NULL") $kunde = 0; else if($kunde=="") $kunde = $this->app->DB->Select("SELECT adresse_abrechnung FROM zeiterfassung WHERE id='$id'"); if($auftrag > 0 && $kunde <=0) $kunde = $this->app->DB->Select("SELECT adresse FROM auftrag WHERE id='$auftrag' LIMIT 1"); if($produktion > 0 && $kunde <=0) $kunde = $this->app->DB->Select("SELECT adresse FROM produktion WHERE id='$produktion' LIMIT 1"); $this->app->DB->Update("UPDATE zeiterfassung SET aufgabe='$aufgabe',adresse='$adr_id',arbeitspaket='$paketauswahl',ort='$ort',beschreibung='$beschreibung', projekt='$projekt',art='$art', von='$vonZeit',bis='$bisZeit',adresse_abrechnung='$kunde',abrechnen='$abrechnen',kostenstelle='$kostenstelle', verrechnungsart='$verrechnungsart', abgerechnet='$abgerechnet', ist_abgerechnet='$abgerechnet',gps='$gps',internerkommentar='$internerkommentar',auftrag='$auftrag',produktion='$produktion',auftragpositionid='$auftragpositionid' WHERE id='$id'"); // wenn arbeitszeit in arbeistnachweis verwendet wurden ist dann dort auch updaten $arbeitsnachweisposid = $this->app->DB->Select("SELECT arbeitsnachweispositionid FROM zeiterfassung WHERE id='$id'"); if($arbeitsnachweisposid > 0){ $von = $this->app->DB->Select("SELECT DATE_FORMAT(von,'%H:%i') FROM zeiterfassung WHERE id='$id'"); $bis = $this->app->DB->Select("SELECT DATE_FORMAT(bis,'%H:%i') FROM zeiterfassung WHERE id='$id'"); $this->app->DB->Update("UPDATE arbeitsnachweis_position SET bezeichnung='$aufgabe',beschreibung='$beschreibung',ort='$ort', von='$von',bis='$bis', adresse='$adr_id' WHERE id='$arbeitsnachweisposid' LIMIT 1"); } if(!$preis)$preis = $this->app->DB->Select("SELECT stundensatz FROM zeiterfassung WHERE id = '$id' LIMIT 1"); if(!$preis) { $stundensatz = (float)$this->app->DB->Select("SELECT stundensatz FROM `zeiterfassung_kosten` WHERE adresse = '$adr_id' AND (gueltig_ab >= date(von) OR gueltig_ab = '0000-00-00') ORDER by gueltig_ab = '0000-00-00', gueltig_ab LIMIT 1"); if($stundensatz)$this->app->DB->Update("UPDATE zeiterfassung SET stundensatz = '$stundensatz' WHERE id = '$id' LIMIT 1"); } } function AddArbeitszeit($adr_id, $vonZeit, $bisZeit, $aufgabe, $beschreibung,$ort, $projekt, $paketauswahl,$art,$kunde="",$abrechnen="",$verrechnungsart="",$kostenstelle="",$abgerechnet="0",$gps="",$aufgabeid=0,$internerkommentar="",$auftrag=0,$produktion=0, $preis = 0,$auftragpositionid="",$serviceauftrag=0) { if(str_replace(array('-',':'),'',$vonZeit) == 0 || str_replace(array('-',':'),'',$bisZeit) == 0) return; $insert = ""; if($paketauswahl==0){ if($auftrag > 0 && $kunde <=0) $kunde = $this->app->DB->Select("SELECT adresse FROM auftrag WHERE id='$auftrag' LIMIT 1"); if($produktion > 0 && $kunde <=0) $kunde = $this->app->DB->Select("SELECT adresse FROM produktion WHERE id='$produktion' LIMIT 1"); if($abrechnen!="1") $abrechnen=0; //if($projekt<=0) $projekt = $this->app->DB->Select("SELECT projekt FROM adresse WHERE id='$kunde' LIMIT 1"); if($projekt=="") $projekt=0; $insert = 'INSERT INTO zeiterfassung (adresse, von, bis, aufgabe, beschreibung, projekt, buchungsart,art,adresse_abrechnung,abrechnen,gebucht_von_user,ort,kostenstelle,verrechnungsart,abgerechnet,ist_abgerechnet,gps,aufgabe_id,internerkommentar,auftrag,produktion,auftragpositionid,serviceauftrag) VALUES ('.$adr_id.',"'.$vonZeit.'","'.$bisZeit.'","'.$aufgabe.'", "'.$beschreibung.'",'.$projekt.', "manuell","'.$art.'","'.$kunde.'","'.$abrechnen.'","'.$this->app->User->GetID().'","'.$ort.'","'.$kostenstelle.'","'.$verrechnungsart.'","'.$abgerechnet.'","'.$abgerechnet.'","'.$gps.'","'.$aufgabeid.'","'.$internerkommentar.'","'.$auftrag.'","'.$produktion.'","'.$auftragpositionid.'","'.$serviceauftrag.'")'; }else{ $projekt = $this->app->DB->SelectArr("SELECT aufgabe, beschreibung, projekt, kostenstelle FROM arbeitspaket WHERE id = $paketauswahl"); $myArr = $projekt[0]; if($kunde<=0) // wenn kunde angeben wird dann da drauf buchen paralell $kunde = $this->app->DB->Select("SELECT kunde FROM projekt WHERE id='".$myArr["projekt"]."' LIMIT 1"); $insert = 'INSERT INTO zeiterfassung (adresse, von, bis, arbeitspaket, aufgabe, beschreibung, projekt, buchungsart,art,gebucht_von_user,ort,adresse_abrechnung,abrechnen,abgerechnet,ist_abgerechnet,gps,aufgabe_id,internerkommentar,auftrag,produktion,auftragpositionid,serviceauftrag) VALUES ('.$adr_id.',"'.$vonZeit.'","'.$bisZeit.'",'.$paketauswahl.' , "'.$aufgabe.'", "'.$beschreibung.'",'.$myArr["projekt"].', "AP","'.$art.'","'.$this->app->User->GetID().'","'.$ort.'","'.$kunde.'","'.$abrechnen.'","'.$abgerechnet.'","'.$abgerechnet.'","'.$gps.'","'.$aufgabeid.'","'.$internerkommentar.'","'.$auftrag.'","'.$produktion.'","'.$auftragpositionid.'","'.$serviceauftrag.'")'; } $this->app->DB->Insert($insert); $ret = $this->app->DB->GetInsertID(); if(!$preis) { /* $stundensatz = (float)$this->app->DB->Select("SELECT stundensatz FROM `zeiterfassung_kosten` WHERE adresse = '$adr_id' AND (gueltig_ab <= curdate() OR gueltig_ab = '0000-00-00') ORDER BY gueltig_ab DESC LIMIT 1");*/ if($stundensatz)$this->app->DB->Update("UPDATE zeiterfassung SET stundensatz = '$stundensatz' WHERE id = '$ret' LIMIT 1"); } return $ret; // wenn art=="AP" hole projekt und kostenstelle aus arbeitspaket beschreibung // und update zuvor angelegten datensatz } /** * \brief Anlegen eines Arbeitspakets * * Diese Funktion legt ein Arbeitspaket an. * * \param aufgabe Kurzbeschreibung (ein paar Woerter) * \param beschreibung Textuelle Beschreibung * \param projekt Projekt ID * \param zeit_geplant Stundenanzahl Integer Wert * \param kostenstelle Kostenstelle * \param initiator user id des Initiators * \param abgabedatum Datum fuer Abgabe * \return Status-Code * */ function CreateArbeitspaket($adresse, $aufgabe,$beschreibung,$projekt,$zeit_geplant,$kostenstelle,$initiator,$abgabedatum="") { if(($aufgabe != '') && ($beschreibung != '') && ($projekt != '') && ($zeit_geplant != '') && ($kostenstelle != '') && ($initiator != '')){ $this->app->DB->Insert('INSERT INTO arbeitspakete (adresse, aufgabe, beschreibung, projekt, zeit_geplant, kostenstelle, initiator, abgabedatum) VALUES ( '.$adresse.',"'.$aufgabe.'", "'.$beschreibung.'", '.$projekt.', '.$zeit_geplant.','.$kostenstelle.', '.$initiator.',"'.$abgabedatum.'")'); return 1; } return 0; } function CreateBenutzerVorlage($felder) { $this->app->DB->Insert("INSERT INTO uservorlage (id,bezeichnung,beschreibung) VALUES ('','{$felder['bezeichnung']}', '{$felder['beschreibung']}')"); $id = $this->app->DB->GetInsertID(); //standard rechte damit man sich anmelden kann $this->app->DB->Update("INSERT INTO uservorlagerights (vorlage, module,action,permission) VALUES ('$id','welcome','login',1)"); $this->app->DB->Update("INSERT INTO uservorlagerights (vorlage, module,action,permission) VALUES ('$id','welcome','logout',1)"); $this->app->DB->Update("INSERT INTO uservorlagerights (vorlage, module,action,permission) VALUES ('$id','welcome','start',1)"); $this->app->DB->Update("INSERT INTO uservorlagerights (vorlage, module,action,permission) VALUES ('$id','welcome','startseite',1)"); $this->app->DB->Update("INSERT INTO uservorlagerights (vorlage, module,action,permission) VALUES ('$id','welcome','settings',1)"); return $id; } function CreateBenutzer($felder) { $settings = base64_encode(serialize($felder['settings'])); $firma = $this->app->User->GetFirma(); $passwordunenescaped = $felder['passwordunenescaped']; $this->app->DB->Insert( sprintf( "INSERT INTO `user` (`username`, `passwordmd5`, `password`, `description`, `settings`, `parentuser`, `activ`, `type`, `adresse`, `fehllogins`, `standarddrucker`, `startseite`, `hwtoken`, `hwkey`, `hwcounter`, `hwdatablock`, `motppin`, `motpsecret`, `externlogin`, `gpsstechuhr`, `firma`, `kalender_passwort`, `kalender_aktiv`, `vorlage`, `projekt_bevorzugen`, `projekt`, `docscan_aktiv`, `docscan_passwort`, `repassword`) VALUES ( '%s', MD5('%s'), '', '%s', '%s', '0', '%d', '%s', %d, %d, %d, '%s', %d, '%s', %d, '%s', '%s', '%s', '%d', '%d', '%d', '%s', '%d', '%s', '%d', '%d', '%d', '%s', 0 )", $felder['username'], $felder['password'], $felder['description'], $settings, $felder['activ'], $felder['type'], $felder['adresse'], $felder['fehllogins'], $felder['standarddrucker'], $felder['startseite'], $felder['hwtoken'], $felder['hwkey'], $felder['hwcounter'], $felder['hwdatablock'], $felder['motppin'], $felder['motpsecret'], $felder['externlogin'], $felder['gpsstechuhr'], $firma, $felder['kalender_passwort'], $felder['kalender_aktiv'], $felder['vorlage'], $felder['projekt_bevorzugen'], $felder['projekt'], $felder['docscan_aktiv'], $felder['docscan_passwort'] ) ); $id = $this->app->DB->GetInsertID(); if(empty($id)) { return $id; } $salt = $this->app->DB->Select("SELECT salt FROM user WHERE id = '$id' LIMIT 1"); if(!$this->app->DB->error()) { $salt = hash('sha512',microtime(true)); $passwordsha512 = hash('sha512', $passwordunenescaped.$salt); $this->app->DB->Update("UPDATE user SET password='', salt = '$salt', passwordsha512 = '$passwordsha512' WHERE id='$id' LIMIT 1"); } //standard rechte damit man sich anmelden kann $this->insertDefaultUserRights($id); $this->AbgleichBenutzerVorlagen($id); return $id; } /** * @param int $userId */ public function insertDefaultUserRights($userId) { if($userId <= 0) { return; } foreach(['login','logout','start','startseite','settings'] as $action) { $this->app->DB->Update( sprintf( "INSERT INTO `userrights` (`user`, `module`, `action`, `permission`) VALUES (%d, 'welcome', '%s', 1)", $userId, $action ) ); } } function IsAdresseInGruppe($adresse,$gruppe) { $check = $this->app->DB->Select("SELECT a.parameter FROM adresse_rolle a WHERE (a.bis='0000-00-00' OR a.bis <=NOW()) AND a.adresse='$adresse' AND a.parameter='$gruppe' AND a.objekt='Gruppe' LIMIT 1"); return ($check == $gruppe) && $gruppe > 0; } function IsAdresseSubjekt($adresse,$subjekt) { $id = $this->app->DB->Select("SELECT id FROM adresse_rolle WHERE adresse='$adresse' AND subjekt='$subjekt' LIMIT 1"); return $id > 0?1:0; } function AddOffenenVorgang($adresse, $titel, $href, $beschriftung="", $linkremove="") { $sql = "INSERT INTO offenevorgaenge (id,adresse,titel,href,beschriftung,linkremove) VALUES ('','$adresse','$titel','$href','$beschriftung','$linkremove')"; $this->app->DB->Insert($sql); } function RenameOffenenVorgangID($id,$titel) { $sql = "UPDATE offenevorgaenge SET titel='$titel' WHERE id='$id' LIMIT 1"; $this->app->DB->Update($sql); } function RemoveOffenenVorgangID($id) { $sql = "DELETE FROM offenevorgaenge WHERE id='$id' LIMIT 1"; $this->app->DB->Delete($sql); } function CalcNextNummer($nummer) { $nummer = trim($nummer); //Nummer von rechts abknabbern for($i=strlen($nummer)-1; $i >= 0; $i--) { $checkvalue = $nummer[$i]; if(is_numeric($checkvalue)) $nummer_anteil[] = $checkvalue; else break; } // nummer string erstellen if(isset($nummer_anteil)) { $nummer_anteil_string = implode("",$nummer_anteil); $nummer_anteil_string = strrev($nummer_anteil_string); $laenge_nummer_anteil_string = strlen($nummer_anteil_string); } else { $nummer_anteil_string = 0; $laenge_nummer_anteil_string = 0; } // buchstaben teil extrahieren $buchstaben_anteil_string = substr($nummer,0,strlen($nummer) - $laenge_nummer_anteil_string); if($laenge_nummer_anteil_string == 0)$laenge_nummer_anteil_string = 1; // nummer erhoehen $neue_nummer = $nummer_anteil_string+1; // nummer von links auffuellen mit nullern $neue_nummer = str_pad($neue_nummer, $laenge_nummer_anteil_string, "0", STR_PAD_LEFT); //zusammensetzen return $buchstaben_anteil_string.$neue_nummer; } function GetNextNummer($type,$projekt="",$data="") { $doctype = $type; if(in_array($doctype,['kundennummer', 'lieferantennummer', 'mitarbeiternummer'])) { $doctype = 'adresse'; } $checkprojekt = $this->app->DB->Select("SELECT id FROM projekt WHERE id='$projekt' LIMIT 1"); $process_lock = $this->app->erp->ProzessLock("erpapi_getnextnummer"); $eigenernummernkreis = $this->app->DB->Select("SELECT eigenernummernkreis FROM projekt WHERE id='$projekt' LIMIT 1"); $belegnr = ''; if($eigenernummernkreis=='1') { $allowedtypes = ['angebot', 'auftrag', 'rechnung', 'lieferschein', 'arbeitsnachweis', 'reisekosten', 'bestellung', 'gutschrift', 'kundennummer', 'lieferantennummer', 'mitarbeiternummer', 'waren', 'produktion', 'sonstiges', 'anfrage', 'artikelnummer', 'kalkulation', 'preisanfrage', 'proformarechnung', 'retoure', 'verbindlichkeit','lieferantengutschrift', 'goodspostingdocument', 'receiptdocument']; $dbfield = "next_$type"; $belegnr = $this->app->DB->Select("SELECT $dbfield FROM projekt WHERE id='$projekt' LIMIT 1"); if (!empty($belegnr)) { $newbelegnr = $this->CalcNextNummer($belegnr); $this->app->DB->Update("UPDATE projekt SET $dbfield='$newbelegnr' WHERE id='$projekt' LIMIT 1"); } } if (empty($belegnr)) { // naechste switch($type) { case "preisanfrage": $belegnr = $this->Firmendaten("next_preisanfrage"); if($belegnr == "0" || $belegnr == "") $belegnr = 100000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case "angebot": $belegnr = $this->Firmendaten("next_angebot"); if($belegnr == "0" || $belegnr == "") $belegnr = 100000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case "auftrag": $belegnr = $this->Firmendaten("next_auftrag"); if($belegnr == "0" || $belegnr=="") $belegnr = 200000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case "rechnung": $belegnr = $this->Firmendaten("next_rechnung"); if($belegnr == "0" || $belegnr=="") $belegnr = 400000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case "gutschrift": $belegnr = $this->Firmendaten("next_gutschrift"); if($belegnr == "0" || $belegnr=="") $belegnr = 900000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case "lieferschein": $belegnr = $this->Firmendaten("next_lieferschein"); if($belegnr == "0" || $belegnr=="") $belegnr = 300000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case "retoure": $belegnr = $this->Firmendaten("next_retoure"); if($belegnr == "0" || $belegnr=="") $belegnr = 500000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case "bestellung": $belegnr = $this->Firmendaten("next_bestellung"); if($belegnr == "0" || $belegnr=="") $belegnr = 100000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case "arbeitsnachweis": $belegnr = $this->Firmendaten("next_arbeitsnachweis"); if($belegnr == "0" || $belegnr=="") $belegnr = 300000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case "anfrage": $belegnr = $this->Firmendaten("next_anfrage"); if($belegnr == "0" || $belegnr=="") $belegnr = 300000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case "preisanfrage": $belegnr = $this->Firmendaten("next_preisanfrage"); if($belegnr == "0" || $belegnr=="") $belegnr = 300000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case "proformarechnung": $belegnr = $this->Firmendaten("next_proformarechnung"); if($belegnr == "0" || $belegnr=="") $belegnr = 300000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case "kalkulation": $belegnr = $this->Firmendaten("next_kalkulation"); if($belegnr == "0" || $belegnr=="") $belegnr = 300000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case "reisekosten": $belegnr = $this->Firmendaten("next_reisekosten"); if($belegnr == "0" || $belegnr=="") $belegnr = 300000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case "produktion": $belegnr = $this->Firmendaten("next_produktion"); if($belegnr == "0" || $belegnr=="") $belegnr = 300000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case "kundennummer": $belegnr = $this->Firmendaten("next_kundennummer"); if($belegnr == "0" || $belegnr=="") $belegnr = 10000; while($this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer = '$belegnr' and kundennummer <> '' and geloescht <> 1 LIMIT 1")) { $belegnr++; } $newbelegnr = $this->CalcNextNummer($belegnr); break; case "lieferantennummer": $belegnr = $this->Firmendaten("next_lieferantennummer"); if($belegnr == "0" || $belegnr=="") $belegnr = 70000; while($this->app->DB->Select("SELECT id FROM adresse WHERE lieferantennummer = '$belegnr' and lieferantennummer <> '' and geloescht <> 1 LIMIT 1")) { $belegnr++; } $newbelegnr = $this->CalcNextNummer($belegnr); break; case "mitarbeiternummer": $belegnr = $this->Firmendaten("next_mitarbeiternummer"); if($belegnr == "0" || $belegnr=="") $belegnr = 90000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case "projektnummer": $belegnr = $this->Firmendaten("next_projektnummer"); if($belegnr == "0" || $belegnr=="") $belegnr = 90000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case "serviceauftrag": $belegnr = $this->Firmendaten("next_serviceauftrag"); if($belegnr == "0" || $belegnr=="") $belegnr = 300000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case "verbindlichkeit": $belegnr = $this->Firmendaten("next_verbindlichkeit"); if($belegnr == "0" || $belegnr=="") $belegnr = 10000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case "lieferantengutschrift": $belegnr = $this->Firmendaten("next_lieferantengutschrift"); if($belegnr == "0" || $belegnr=="") $belegnr = 20000; $newbelegnr = $this->CalcNextNummer($belegnr); break; case 'receiptdocument': $belegnr = $this->Firmendaten('next_receiptdocument'); if($belegnr == '0' || $belegnr=='') { $belegnr = 10000; } $newbelegnr = $this->CalcNextNummer($belegnr); break; default: $belegnr = null; $newbelegnr = null; $this->RunHook('next_number', 3, $type, $belegnr, $newbelegnr); if($belegnr === null && $newbelegnr === null){ $begelnr = 'Fehler'; } break; } $this->FirmendatenSet("next_$type",$newbelegnr); } $this->app->erp->ProzessUnlock($process_lock); // alle spalten aus Adress als Variable $doctypeid = $data; if($doctype === 'adresse') { if(is_numeric($data)) { $adresse = $this->app->DB->SelectRow( sprintf( 'SELECT a.* FROM `adresse` AS a WHERE a.id=%d LIMIT 1', $doctypeid ) ); }elseif(is_array($data)) { if(empty($data['id']) && !empty($data[0])) { $data = reset($data); } if(!empty($data['id'])) { $adresse = $data; } } } elseif(is_array($data)) { if(empty($data['id']) && !empty($data[0])) { $data = reset($data); } if(!empty($data['id'])) { $data = $data['id']; } } if(is_numeric($data)){ $adresse = $this->app->DB->SelectRow( sprintf( "SELECT a.* FROM `%s` b LEFT JOIN adresse a ON a.id=b.adresse WHERE b.id=%d LIMIT 1", $doctype, $data ) ); } if(!empty($adresse)) { foreach($adresse as $key=>$value) { $belegnr = str_ireplace('{ADRESSE_' . strtoupper($key) . '}', $value, $belegnr); } } $belegnr = str_ireplace('{JAHR}',date('Y'),$belegnr); $belegnr = str_ireplace('{MONAT}',date('m'),$belegnr); $belegnr = str_ireplace('{TAG}',date('d'),$belegnr); $belegnr = str_ireplace('{KW}',date('W'),$belegnr); return $belegnr; } function InsertUpdateAdresse($data) { $created = false; if(!is_array($data)) { return false; } $projekt = $this->app->DB->Select("SELECT standardprojekt FROM firma WHERE id='".$this->app->User->GetFirma()."' LIMIT 1"); if(isset($data['projekt'])){ $projekt = $data['projekt']; } else { $data['projekt'] = $projekt; } if(isset($data['id'])) { $adresse = $this->app->DB->SelectRow("select * from adresse where id = ".$data['id']." limit 1"); } if(!isset($adresse) || !$adresse) { $where = " geloescht <> 1 "; if(isset($data['lieferantennummer']) && $data['lieferantennummer'] !== '') { if($where != "")$where .= " and "; $where .= " lieferantennummer like '".$this->app->DB->real_escape_string($data['lieferantennummer'])."' "; } if(isset($data['kundennummer']) && $data['kundennummer'] !== '') { if($where != "")$where .= " and "; $where .= " kundennummer like '".$this->app->DB->real_escape_string($data['kundennummer'])."' "; } if(isset($data['mitarbeiternummer']) && $data['mitarbeiternummer'] !== '') { if($where != "")$where .= " and "; $where .= " mitarbeiternummer like '".$this->app->DB->real_escape_string($data['mitarbeiternummer'])."' "; } if($where != " geloescht <> 1 ") { $adresse = $this->app->DB->SelectRow("select * from adresse where ".$where." limit 1"); } } if(!isset($adresse) || !$adresse) { $this->app->DB->Insert("insert into adresse (id) values ('')"); $id = $this->app->DB->GetInsertID(); $created = true; if($id) { $adresse = $this->app->DB->SelectRow("select * from adresse where id = '".$id."' limit 1"); } else return false; if(isset($data['lieferantennummer']) && $data['lieferantennummer'] !== '') { $this->AddRolleZuAdresse($id, "Lieferant", "von", "Projekt", $projekt); } if(isset($data['kundennummer']) && $data['kundennummer'] !== '') { $this->AddRolleZuAdresse($id, "Kunde", "von", "Projekt", $projekt); } if(isset($data['mitarbeiternummer']) && $data['mitarbeiternummer'] !== '') { $this->AddRolleZuAdresse($id, "Mitarbeiter", "von", "Projekt", $projekt); } } if(!$adresse)return false; if(isset($adresse['id']))$id = $adresse['id']; if(isset($data['lieferantennummer']) && $data['lieferantennummer'] !== '') { $this->AddRolleZuAdresse($id, "Lieferant", "von", "Projekt", $projekt); } if(isset($data['kundennummer']) && $data['kundennummer'] !== '') { $this->AddRolleZuAdresse($id, "Kunde", "von", "Projekt", $projekt); } if(isset($data['mitarbeiternummer']) && $data['mitarbeiternummer'] !== '') { $this->AddRolleZuAdresse($id, "Mitarbeiter", "von", "Projekt", $projekt); } $zielspalten = $this->app->DB->SelectArr("show columns from `adresse`"); if($zielspalten) { foreach($zielspalten as $val)$ziel[$val['Field']] = true; } foreach($data as $k => $v) { $k = trim($k); if(empty($ziel)) { $ka = explode(' ',$k); $k = $ka[0]; } if($k !== '' && $k != 'id' && (String)$adresse[$k] !== (String)$v && (empty($ziel) || isset($ziel[$k]))) { $sqla[] = $this->app->DB->real_escape_string($k). " = ".(!is_null($v)?"'".$this->app->DB->real_escape_string($v)."'":"NULL")." "; } } if(!empty($sqla))$this->app->DB->Update("update adresse set ".implode(', ',$sqla)." where id = '".$adresse['id']."' LIMIT 1"); if($this->app->DB->error() != '' || empty($sqla)) { foreach($data as $k => $v) { $k = trim($k); if(empty($ziel)) { $ka = explode(' ',$k); $k = $ka[0]; } if($k !== '' && $k != 'id' && (String)$adresse[$k] !== (String)$v && (empty($ziel) || isset($ziel[$k]))) { $this->app->DB->Update("update adresse set ".$this->app->DB->real_escape_string($k)." = ".(!is_null($v)?"'".$this->app->DB->real_escape_string($v)."'":"NULL")." where id = '".$adresse['id']."' LIMIT 1"); } } } if($created) { $addressId = $adresse['id']; $this->RunHook('adresse_create', 1, $addressId); $this->RunHook('AfterAddressCreate', 1, $addressId); } else { $addressId = $adresse['id']; $this->RunHook('adresse_update', 1, $addressId); } return $adresse['id']; } public function InsertUpdateArtikel($data, $onlyUpdate = false) { if(!is_array($data)){ return false; } $created = false; $projekt = $this->app->erp->Firmendaten('projekt'); if(isset($data['projekt'])){ $projekt = $data['projekt']; } else { $data['projekt'] = $projekt; } if(isset($data['id']) && $data['id']) { $artikel = $this->app->DB->SelectRow("select * from artikel where id = ".$data['id']." limit 1"); } else { $artikel = null; } if(!$artikel && isset($data['nummer']) && $data['nummer'] != '') { $order = ""; $where = " geloescht <> 1 AND nummer = '".$this->app->DB->real_escape_string($data['nummer'])."'"; if(isset($data['projekt']) && $data['projekt'] && (int)$data['projekt'] > 0) { if($this->app->DB->Select("SELECT id FROM projekt WHERE eigenernummernkreis = 1 AND id = '".(int)$data['projekt']."'")) { $where .= " AND projekt = '".(int)$data['projekt']."' "; }else { $order .= " ORDER BY projekt = '".(int)$data['projekt']."' DESC "; } } if(isset($data['typ']) && $data['typ'] !== '') { $kat = (int)str_replace('_kat','',$data['typ']); if($kat && $this->app->DB->Select("SELECT id FROM artikelkategorien WHERE id = '$kat' AND externenummer = 0 AND geloescht = 0 LIMIT 1")) { if($order === '') { $order .= " ORDER BY "; } else{ $order .= " , "; } $order .= " typ = '".$kat.'_kat'."' DESC "; } } $artikel = $this->app->DB->SelectRow("select * from artikel where ".$where." $order limit 1"); } if(!(isset($artikel['id']) && $artikel['id'] > 0)) { if($onlyUpdate) { return false; } $this->app->DB->Insert("insert into artikel (id) values (NULL)"); $created = true; $id = $this->app->DB->GetInsertID(); $artikel = $this->app->DB->SelectRow("select * from artikel where id = ".$id." limit 1"); if(empty($data['nummer'])){ $data['nummer'] = $this->GetNextArtikelnummer(!empty($data['typ'])?$data['typ']:"", 1, $data['projekt']); } } if(isset($artikel['id']) && $artikel['id'] > 0) { $id = $artikel['id']; $zielspalten = $this->app->DB->SelectArr("show columns from `artikel`"); if($zielspalten) { foreach($zielspalten as $val) { $ziel[$val['Field']] = true; } } foreach($data as $k => $v) { $k = trim($k); if(empty($ziel)) { $ka = explode(' ',$k); $k = $ka[0]; } $artikelValue = isset($artikel[$k])?(String)$artikel[$k]:''; if($k !== '' && $k !== 'id' && $artikelValue !== (String)$v && (empty($ziel) || isset($ziel[$k]))) { $sqla[] = $this->app->DB->real_escape_string($k). ' = '.($v !== null?"'".$this->app->DB->real_escape_string($v)."'":'NULL').' '; } } if(!empty($sqla)) { $this->app->DB->Update("update artikel set ".implode(', ',$sqla)." where id = '".$id."' LIMIT 1"); } if($this->app->DB->error() != '' || empty($sqla)) { foreach($data as $k => $v) { if(empty($ziel)){ $ka = explode(' ',trim($k)); $k = $ka[0]; } $artikelValue = isset($artikel[$k])?(String)$artikel[$k]:''; if($k !== '' && $k !== 'id' && $artikelValue !== (String)$v && (empty($ziel) || isset($ziel[$k]))) { $this->app->DB->Update("update artikel set ".$this->app->DB->real_escape_string($k)." = ".($v !== null?"'".$this->app->DB->real_escape_string($v)."'":'NULL')." where id = '".$id."' LIMIT 1"); } } } if(!empty($data['shop']) || !empty($data['shop2']) || !empty($data['shop3'])) { $this->CheckShopTabelle($id); } $articleId = $id; if($created) { $this->app->erp->RunHook('artikel_create', 1, $articleId); } else { $this->app->erp->RunHook('artikel_update', 1, $articleId); } return $id; } return false; } function GetNextArtikelnummer($artikelart="",$firma="1",$projekt="") { // neue artikel nummer holen $process_lock = $this->app->erp->ProzessLock("erpapi_getnextartikelnummer"); if(is_numeric($artikelart)) $artikelart = $artikelart."_kat"; $check = str_replace("_kat","",$artikelart); $check = $this->app->DB->Select("SELECT id FROM artikelkategorien WHERE id='$check' AND geloescht!=1 LIMIT 1"); if($check > 0) { $next_nummer_alt = $this->app->DB->Select("SELECT next_nummer FROM artikelkategorien WHERE id='$check' AND geloescht!=1"); $externenummer = $this->app->DB->Select("SELECT externenummer FROM artikelkategorien WHERE id='$check' AND geloescht!=1"); if($externenummer!="1") { if($next_nummer_alt=="") { $next_nummer_alt = 100000; $neue_nummer = $next_nummer_alt; $this->app->DB->Update("UPDATE artikelkategorien SET next_nummer='$neue_nummer' WHERE id='$check' AND geloescht!=1"); } else { $nurbuchstaben = preg_replace("/[^a-zA-Z]/","",$next_nummer_alt); $nurzahlen = preg_replace("/[^0-9]/","",$next_nummer_alt); $laenge = strlen($nurzahlen); $next_nummer = $this->CalcNextNummer($next_nummer_alt); //$nurbuchstaben.str_pad($nurzahlen+1, $laenge ,'0', STR_PAD_LEFT); $neue_nummer = $next_nummer; $this->app->DB->Update("UPDATE artikelkategorien SET next_nummer='$next_nummer' WHERE id='$check' AND geloescht!=1"); } } else { // externe nummer holen // TODO pruefen ob es im Projekt ueberladen gehoert $eigenernummernkreis = $this->app->DB->Select("SELECT eigenernummernkreis FROM projekt WHERE id='$projekt' LIMIT 1"); if($eigenernummernkreis=="1") { $neue_nummer = $this->app->DB->Select("SELECT next_artikelnummer FROM projekt WHERE id='$projekt' LIMIT 1"); if($this->app->DB->Select("SELECT id FROM artikel WHERE nummer = '".$this->app->DB->real_escape_string($neue_nummer)."' LIMIT 1"))$neue_nummer = $this->CalcNextNummer($neue_nummer); $next_nummer = $this->CalcNextNummer($neue_nummer); $this->app->DB->Update("UPDATE projekt SET next_artikelnummer='".$next_nummer."' WHERE id='$projekt' LIMIT 1"); } else { //zentraler nummernkreis mit prefix $next_nummer = $this->CalcNextNummer($this->Firmendaten("next_artikelnummer")); $this->FirmendatenSet("next_artikelnummer",$next_nummer); if($next_nummer_alt!="") $neue_nummer=$next_nummer_alt.$next_nummer; else $neue_nummer = $next_nummer; } //$nurbuchstaben = preg_replace("/[^a-zA-Z]/","",$next_nummer_alt); //$neue_nummer = $nurbuchstaben.$next_nummer; //$neue_nummer = $this->CalcNextNummer($next_nummer_alt); } } else { $eigenernummernkreis = $this->app->DB->Select("SELECT eigenernummernkreis FROM projekt WHERE id='$projekt' LIMIT 1"); if($eigenernummernkreis) { $neue_nummer = $this->app->DB->Select("SELECT next_artikelnummer FROM projekt WHERE id='$projekt' LIMIT 1"); if($this->app->DB->Select("SELECT id FROM artikel WHERE nummer = '".$this->app->DB->real_escape_string($neue_nummer)."' LIMIT 1"))$neue_nummer = $this->CalcNextNummer($neue_nummer); $next_nummer = $this->CalcNextNummer($neue_nummer); $this->app->DB->Update("UPDATE projekt SET next_artikelnummer='".$next_nummer."' WHERE id='$projekt' LIMIT 1"); }else{ $firmennummer = $this->app->erp->Firmendaten('next_artikelnummer'); if($firmennummer) { $next_nummer = $firmennummer; $neue_nummer = $this->CalcNextNummer($next_nummer); $this->FirmendatenSet('next_artikelnummer', $neue_nummer); $neue_nummer = $this->app->erp->Firmendaten('next_artikelnummer'); } else { switch($artikelart) { case "produkt": $neue_nummer = $this->app->DB->Select("SELECT MAX(nummer) FROM artikel WHERE nummer LIKE '7%'"); if($neue_nummer=="" || $neue_nummer=="0") $neue_nummer = "700000"; break; case "produktion": $neue_nummer = $this->app->DB->Select("SELECT MAX(nummer) FROM artikel WHERE nummer LIKE '4%'"); if($neue_nummer=="" || $neue_nummer=="0") $neue_nummer = "400000"; break; case "module": $neue_nummer = $this->app->DB->Select("SELECT MAX(nummer) FROM artikel WHERE nummer LIKE '6%'"); if($neue_nummer=="" || $neue_nummer=="0") $neue_nummer = "600000"; break; default: $neue_nummer = $this->app->DB->Select("SELECT MAX(CAST(nummer AS UNSIGNED)) FROM artikel WHERE nummer LIKE '1%'"); if(($neue_nummer=="" || $neue_nummer=="0")) $neue_nummer = "100000"; } $neue_nummer = $this->CalcNextNummer($neue_nummer);//$neue_nummer + 1; } } } $this->app->erp->ProzessUnlock($process_lock); $neue_nummer = str_replace('{JAHR}',date('Y'),$neue_nummer); $neue_nummer = str_replace('{MONAT}',date('m'),$neue_nummer); $neue_nummer = str_replace('{TAG}',date('d'),$neue_nummer); return $neue_nummer; } function GetNextMitarbeiternummer($projekt="",$data="") { return $this->GetNextNummer("mitarbeiternummer",$projekt,$data); } function GetNextKundennummer($projekt="",$data="") { return $this->GetNextNummer("kundennummer",$projekt,$data); } function GetNextLieferantennummer($projekt="",$data="") { return $this->GetNextNummer("lieferantennummer",$projekt,$data); } function ArbeitsnachweisProtokoll($id,$text) { /** @var Arbeitsnachweis $obj */ $obj = $this->app->erp->LoadModul('arbeitsnachweis'); if(!empty($obj) && method_exists($obj, 'addArbeitsnachweisProtokoll')) { $obj->addArbeitsnachweisProtokoll($id, $text); } } function KalkulationProtokoll($id,$text) { if(!$id)return; $bearbeiter = (isset($this->app->User) && $this->app->User && method_exists($this->app->User, 'GetName'))?$this->app->DB->real_escape_string($this->app->User->GetName()):''; $text = $this->app->DB->real_escape_string($text); $this->app->DB->Insert("INSERT INTO kalkulation_protokoll (id,reisekosten,zeit,bearbeiter,grund) VALUES ('','$id',NOW(),'".$bearbeiter."','$text')"); } function ReisekostenProtokoll($id,$text) { /** @var Reisekosten $obj */ $obj = $this->app->erp->LoadModul('reisekosten'); if(!empty($obj) && method_exists($obj, 'AddReisekostenProtokoll')) { $obj->AddReisekostenProtokoll($id, $text); } } function AnfrageProtokoll($id,$text) { $bearbeiter = (isset($this->app->User) && $this->app->User && method_exists($this->app->User, 'GetName'))?$this->app->DB->real_escape_string($this->app->User->GetName()):''; $text = $this->app->DB->real_escape_string($text); $this->app->DB->Insert("INSERT INTO anfrage_protokoll (id,anfrage,zeit,bearbeiter,grund) VALUES ('','$id',NOW(),'".$bearbeiter."','$text')"); } function BelegProtokoll($typ,$id,$text) { if(!$id)return; $bearbeiter = (isset($this->app->User) && $this->app->User && method_exists($this->app->User, 'GetName'))?$this->app->DB->real_escape_string($this->app->User->GetName()):''; $text = $this->app->DB->real_escape_string($text); $this->app->DB->Insert("INSERT INTO ".$typ."_protokoll (id,".$typ.",zeit,bearbeiter,grund) VALUES ('','$id',NOW(),'".$bearbeiter."','$text')"); } function PreisanfrageProtokoll($id,$text) { /** @var Preisanfrage $obj */ $obj = $this->app->erp->LoadModul('preisanfrage'); if(!empty($obj) && method_exists($obj,'addPreisanfrageProtokoll')) { $obj->addPreisanfrageProtokoll($id, $text); } } function ProformarechnungProtokoll($id,$text) { if(!$id)return; $bearbeiter = (isset($this->app->User) && $this->app->User && method_exists($this->app->User, 'GetName'))?$this->app->DB->real_escape_string($this->app->User->GetName()):''; $text = $this->app->DB->real_escape_string($text); $this->app->DB->Insert("INSERT INTO proformarechnung_protokoll (id,proformarechnung,zeit,bearbeiter,grund) VALUES ('','$id',NOW(),'".$bearbeiter."','$text')"); } function InventurProtokoll($id,$text) { /** @var Inventur $obj */ $obj = $this->LoadModul('inventur'); if(!empty($obj) && method_exists($obj, 'AddInventurProtokoll')) { $obj->AddInventurProtokoll($id,$text); } } function RetoureProtokoll($id,$text) { /** @var Retoure $obj */ $obj = $this->app->erp->LoadModul('retoure'); if($obj && method_exists($obj,'addRetoureProtokoll')) { $obj->addRetoureProtokoll($id, $text); } } function LieferscheinProtokoll($id,$text) { if(!$id)return; $bearbeiter = (isset($this->app->User) && $this->app->User && method_exists($this->app->User, 'GetName'))?$this->app->DB->real_escape_string($this->app->User->GetName()):''; $text = $this->app->DB->real_escape_string($text); $this->app->DB->Insert("INSERT INTO lieferschein_protokoll (id,lieferschein,zeit,bearbeiter,grund) VALUES ('','$id',NOW(),'".$bearbeiter."','$text')"); } function AuftragProtokoll($id, $text, $bearbeiter = '') { if(!$id){ return; } if(empty($bearbeiter)){ $bearbeiter = ''; if((isset($this->app->User) && $this->app->User && method_exists($this->app->User, 'GetName'))){ $bearbeiter = $this->app->DB->real_escape_string($this->app->User->GetName()); } } $text = $this->app->DB->real_escape_string($text); $this->app->DB->Insert("INSERT INTO auftrag_protokoll (id,auftrag,zeit,bearbeiter,grund) VALUES ('','$id',NOW(),'".$bearbeiter."','$text')"); } function AngebotProtokoll($id,$text) { if(!$id)return; $bearbeiter = (isset($this->app->User) && $this->app->User && method_exists($this->app->User, 'GetName'))?$this->app->DB->real_escape_string($this->app->User->GetName()):''; $text = $this->app->DB->real_escape_string($text); $this->app->DB->Insert("INSERT INTO angebot_protokoll (id,angebot,zeit,bearbeiter,grund) VALUES ('','$id',NOW(),'".$bearbeiter."','$text')"); } function BestellungProtokoll($id,$text) { $bearbeiter = (isset($this->app->User) && $this->app->User && method_exists($this->app->User, 'GetName'))?$this->app->DB->real_escape_string($this->app->User->GetName()):''; $text = $this->app->DB->real_escape_string($text); $this->app->DB->Insert("INSERT INTO bestellung_protokoll (id,bestellung,zeit,bearbeiter,grund) VALUES ('','$id',NOW(),'".$bearbeiter."','$text')"); } function RechnungProtokoll($id,$text) { if(!$id)return; $bearbeiter = (isset($this->app->User) && $this->app->User && method_exists($this->app->User, 'GetName'))?$this->app->DB->real_escape_string($this->app->User->GetName()):''; $text = $this->app->DB->real_escape_string($text); $this->app->DB->Insert("INSERT INTO rechnung_protokoll (id,rechnung,zeit,bearbeiter,grund) VALUES ('','$id',NOW(),'".$bearbeiter."','$text')"); } function GutschriftProtokoll($id,$text) { if(!$id)return; $bearbeiter = (isset($this->app->User) && $this->app->User && method_exists($this->app->User, 'GetName'))?$this->app->DB->real_escape_string($this->app->User->GetName()):''; $text = $this->app->DB->real_escape_string($text); $this->app->DB->Insert("INSERT INTO gutschrift_protokoll (id,gutschrift,zeit,bearbeiter,grund) VALUES ('','$id',NOW(),'$bearbeiter','$text')"); } function LoadArbeitsnachweisStandardwerte($id,$adresse,$projekt="") { /** @var Arbeitsnachweis $obj */ $obj = $this->app->erp->LoadModul('arbeitsnachweis'); if(!empty($obj) && method_exists($obj, 'LoadArbeitsnachweisStandardwerte')) { $obj->LoadArbeitsnachweisStandardwerte($id,$adresse,$projekt); } } function LoadInventurStandardwerte($id,$adresse,$projekt="") { /** @var Inventur $obj */ $obj = $this->LoadModul('inventur'); if(!empty($obj) && method_exists($obj, 'LoadInventurStandardwerte')) { $obj->LoadInventurStandardwerte($id,$adresse,$projekt); } } function KundeHatZR($adresse) { $verband = $this->GetVerband($adresse); $zr = $this->app->DB->Select("SELECT zentralregulierung FROM gruppen WHERE id='$verband' LIMIT 1"); return $zr=='1'; } function GetVerbandName($gruppe) { return $this->app->DB->Select("SELECT CONCAT(kennziffer,' ',name) FROM gruppen WHERE id='$gruppe' LIMIT 1"); } function GetVerband($adresse) { return $this->app->DB->Select("SELECT g.id FROM adresse_rolle a INNER JOIN gruppen g ON g.id=a.parameter WHERE (a.bis='0000-00-00' OR a.bis >=NOW()) AND a.adresse='$adresse' AND a.objekt='Gruppe' AND (g.art='verband' OR g.art='preisgruppe') AND g.aktiv = 1 LIMIT 1"); } function LoadAnfrageStandardwerte($id,$adresse,$projekt="") { // standard adresse von lieferant $arr = $this->app->DB->SelectArr("SELECT *,vertrieb as vertriebid,innendienst as bearbeiterid,'' as bearbeiter FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); $arr[0]['gruppe'] = $this->GetVerband($adresse); $field = array('anschreiben','name','abteilung','typ','unterabteilung','strasse','adresszusatz','plz','ort','land','ustid','email','telefon','telefax', 'kundennummer','projekt','gruppe','vertriebid','bearbeiterid','bearbeiter','titel'); foreach($field as $key=>$value) { if($value=="projekt" && $this->app->Secure->POST[$value]!="") { if(!is_numeric($this->app->Secure->POST[$value])) { $uparr[$value] = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung <> '' AND abkuerzung = '".$this->app->DB->real_escape_string($this->app->Secure->POST[$value])."' AND (geloescht = 0 OR isnull(geloescht)) LIMIT 1"); }else{ $uparr[$value] = $this->app->Secure->POST[$value]; } } else { if($value == 'bearbeiterid' || $value=='bearbeiter') { if($arr[0]['bearbeiterid'])$this->app->Secure->POST[$value] = $arr[0][$value]; if($arr[0]['bearbeiterid'])$uparr[$value] = $arr[0][$value]; }else{ $this->app->Secure->POST[$value] = $arr[0][$value]; $uparr[$value] = $arr[0][$value]; } } } if($projekt!="") { $this->app->Secure->POST['projekt'] = $projekt; $uparr['projekt'] = $this->app->Secure->POST['projekt']; } $uparr['adresse']=$adresse; $this->app->DB->UpdateArr("anfrage",$id,"id",$uparr,true); $this->LoadAdresseStandard("anfrage",$id,$adresse); } function LoadPreisanfrageStandardwerte($id,$adresse,$projekt="") { /** @var Preisanfrage $obj */ $obj = $this->app->erp->LoadModul('preisanfrage'); if(!empty($obj) && method_exists($obj,'LoadPreisanfrageStandardwerte')) { $obj->LoadPreisanfrageStandardwerte($id,$adresse,$projekt); } } function LoadProformarechnungStandardwerte($id,$adresse,$projekt="") { // standard adresse von lieferant $arr = $this->app->DB->SelectArr("SELECT *,zollinformationen as verzollinformationen,if(zollinformationen!='',1,0) as verzollungadresse FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); $field = array('anschreiben','name','abteilung','typ','unterabteilung','strasse','adresszusatz','plz','ort','land','ustid','email','telefon','telefax', 'kundennummer','projekt','ust_befreit','lieferbedingung','titel','gln','verzollinformationen','verzollungadresse','zahlungsweise','zahlungszieltage','zahlungszieltageskonto','zahlungszielskonto'); foreach($field as $key=>$value) { if($value=="projekt" && $this->app->Secure->POST[$value]!="") { if(!is_numeric($this->app->Secure->POST[$value])) { $uparr[$value] = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung <> '' AND abkuerzung = '".$this->app->DB->real_escape_string($this->app->Secure->POST[$value])."' AND (geloescht = 0 OR isnull(geloescht)) LIMIT 1"); }else{ $uparr[$value] = $this->app->Secure->POST[$value]; } } else { $this->app->Secure->POST[$value] = $arr[0][$value]; $uparr[$value] = $arr[0][$value]; } } if($this->Firmendaten("proformarechnung_ohnebriefpapier")=="1") $uparr['ohne_briefpapier'] = "1"; if($projekt!="") { $this->app->Secure->POST['projekt'] = $projekt; $uparr['projekt'] = $this->app->Secure->POST['projekt']; } $this->LoadZahlungsweise($adresse,$uparr); $uparr['adresse']=$adresse; $this->app->DB->UpdateArr("proformarechnung",$id,"id",$uparr,true); $this->LoadAdresseStandard("proformarechnung",$id,$adresse); } /** * @deprecated */ function LoadKalkulationStandardwerte($id,$adresse,$projekt="") { $obj = $this->LoadModul('kalkulation'); if(!empty($obj) && method_exists($obj,'LoadKalkulationStandardwerte')) { return $obj->LoadKalkulationStandardwerte($id,$adresse,$projekt); } } /** * @deprecated */ public function LoadReisekostenStandardwerte($id,$adresse,$projekt="") { /** @var Reisekosten $obj */ $obj = $this->LoadModul('reisekosten'); if(!empty($obj) && method_exists($obj, 'LoadReisekostenStandardwerte')) { $obj->LoadReisekostenStandardwerte($id,$adresse,$projekt); } } function LoadRetoureStandardwerte($id,$adresse,$lieferantenretoure=false) { // standard adresse von lieferant $arr = $this->app->DB->SelectArr("SELECT * FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); $field = array('anschreiben','name','abteilung','unterabteilung','strasse','adresszusatz','plz','ort','land','bundesstaat','ustid','email','telefon','telefax','kundennummer','projekt','ust_befreit','typ','titel','lieferbedingung'); $rolle_projekt = $this->app->DB->Select("SELECT parameter FROM adresse_rolle WHERE adresse='$adresse' AND subjekt='Kunde' AND objekt='Projekt' AND (bis ='0000-00-00' OR bis <= NOW()) LIMIT 1"); if($rolle_projekt > 0) { $arr[0]['projekt'] = $rolle_projekt; } foreach($field as $key=>$value) { if($value=="projekt" && $this->app->Secure->POST[$value]!="" && 0) { $uparr[$value] = $this->app->Secure->POST[$value]; } else { $this->app->Secure->POST[$value] = str_replace("'", ''',$arr[0][$value]); $uparr[$value] = str_replace("'", ''',$arr[0][$value]); } } $uparr['adresse']=$adresse; if($lieferantenretoure) { $uparr['lieferant']=$adresse; $uparr['lieferantenretoure'] = 1; } $this->app->DB->UpdateArr("retoure",$id,"id",$uparr,true); $uparr=null; //liefernantenvorlage $arr = $this->app->DB->SelectArr("SELECT * FROM adresse WHERE id='$adresse' LIMIT 1"); // falls von Benutzer projekt ueberladen werden soll $projekt_bevorzugt=$this->app->DB->Select("SELECT projekt_bevorzugen FROM user WHERE id='".$this->app->User->GetID()."' LIMIT 1"); if($projekt_bevorzugt=="1") { $uparr['projekt'] = $this->app->DB->Select("SELECT projekt FROM user WHERE id='".$this->app->User->GetID()."' LIMIT 1"); $arr[0]['projekt'] = $uparr['projekt']; $this->app->Secure->POST['projekt']=$this->app->DB->Select("SELECT abkuerzung FROM projekt WHERE id='".$arr[0]['projekt']."' AND id > 0 LIMIT 1"); } $field = array('versandart'); foreach($field as $key=>$value) { $uparr[$value] = $arr[0][$value]; $this->app->Secure->POST[$value] = $arr[0][$value]; } if($uparr['versandart']=="") $uparr['versandart']=$this->StandardVersandart($arr[0]['projekt']); $this->app->DB->UpdateArr('retoure', $id, 'id', $uparr, true); $this->LoadStandardLieferadresse($adresse,$id,"retoure"); $this->LoadAdresseStandard("retoure",$id,$adresse); $this->RunHook('erpapi_loadretourestandardwerte',2, $id, $adresse); } function LoadLieferscheinStandardwerte($id,$adresse,$lieferantenretoure=false) { $obj = $this->LoadModul('lieferschein'); if(!empty($obj) && method_exists($obj, 'LoadLieferscheinStandardwerte')){ $obj->LoadLieferscheinStandardwerte($id,$adresse,$lieferantenretoure); } } /** * @param string $modul * @param int $id */ public function InfoAuftragsErfassung($modul,$id) { if(empty($modul) || empty($id)) { return; } $adresse = $this->app->DB->Select( sprintf('SELECT `adresse` FROM `%s` WHERE `id` = %d LIMIT 1', $modul, $id) ); $this->app->YUI->CkEditor('readonlybox','none'); $infoauftragserfassung = $this->app->DB->Select( sprintf('SELECT `infoauftragserfassung` FROM `adresse` WHERE `id`= %d LIMIT 1', $adresse) ); $this->app->Tpl->Set( 'INFOFUERAUFTRAGSERFASSUNG', "
Info für Angebots- und Auftragserfassung
" ); } function MarkerUseredit($feld1,$useredittimestamp) { $usereditid = str_replace("useredittimestamp","usereditid",$useredittimestamp); return "CONCAT($feld1,' ',IFNULL(if(TIME_TO_SEC(TIMEDIFF(NOW(), $useredittimestamp)) < 45,CONCAT('
(in Bearbeitung von ', (SELECT a2.name FROM user u2 LEFT JOIN adresse a2 ON a2.id=u2.adresse WHERE u2.id=$usereditid LIMIT 1),')'),''),''))"; } function TimeoutUseredit($smodule,$sid,$user) { $sid = (int)$sid; if($sid <= 0)return; $smodulea = explode(' ',$smodule); $smodule = $smodulea[0]; if(!preg_match('/^[a-zA-Z0-9\_]*$/',$smodule,$trefer)) { $smodule = ''; } if($smodule==='')return; if(!in_array($smodule, array('adresse', 'anfrage', 'angebot', 'arbeitsnachweis', 'artikel', 'auftrag', 'bestellung', 'gutschrift', 'inventur', 'lieferschein', 'preisanfrage', 'produktion', 'proformarechnung', 'rechnung', 'retoure', 'spedition') ))return; $this->app->DB->Update("UPDATE $smodule SET useredittimestamp=NOW(),usereditid='$user' WHERE id = '$sid' AND (usereditid='$user' OR ifnull(useredittimestamp,'0000-00-00 00:00:00') = '0000-00-00 00:00:00' OR TIME_TO_SEC(TIMEDIFF(NOW(), useredittimestamp)) > 30) LIMIT 1"); if(!$this->app->DB->error())return;//Bruno 14.12.17 Querys sparen aber bei Fehler altes Verhalten $useredittimestamp = $this->app->DB->Select("SELECT useredittimestamp FROM $smodule WHERE id='$sid' LIMIT 1"); if($useredittimestamp=="0000-00-00 00:00:00" || $useredittimestamp=="") { $this->app->DB->Select("UPDATE $smodule SET useredittimestamp=NOW(),usereditid='".$user."' WHERE id='$sid' LIMIT 1"); } // nur wenn timediff > 10 $timediff = $this->app->DB->Select("SELECT TIME_TO_SEC(TIMEDIFF(NOW(), useredittimestamp)) FROM $smodule WHERE id='$sid' LIMIT 1"); $timeuser = $this->app->DB->Select("SELECT usereditid FROM $smodule WHERE id='$sid' LIMIT 1"); if($timeuser == $user) { $this->app->DB->Select("UPDATE $smodule SET useredittimestamp=NOW() WHERE id='$sid' LIMIT 1"); } else { if($timediff>30) $this->app->DB->Select("UPDATE $smodule SET useredittimestamp=NOW(),usereditid='$user' WHERE id='$sid' LIMIT 1"); } } function DisableModul($modul, $id, $backlink='') { // Prüfen ob Backlink mit index.php? beginnt; ansonsten ist Open Redirect möglich if (!empty($backlink) && strpos($backlink, 'index.php?') !== 0) { unset($backlink); } $user = $this->app->DB->Select("SELECT usereditid FROM $modul WHERE id='$id' LIMIT 1"); if($this->app->DB->error())return false; $user_adresse = $this->app->DB->Select("SELECT adresse FROM user WHERE id='$user' LIMIT 1"); $user_name = $this->app->DB->Select("SELECT name FROM adresse WHERE id='$user_adresse' LIMIT 1"); $this->TimeoutUseredit($modul,$id,$this->app->User->GetID()); $timeuser = $this->app->DB->Select("SELECT usereditid FROM $modul WHERE id='$id' LIMIT 1"); if($timeuser==$this->app->User->GetID() || $timeuser=="") // heute wieder aus dem kommentar in echten quelltext genommen { return false; } else if ($user_adresse > 0) { if($this->RechteVorhanden("welcome","unlock")) { $id = $this->app->Secure->GetGET("id"); $open = ""; } else { $this->SystemLog("Fehlendes Recht",1,"","welcome","unlock"); } $this->app->Tpl->Set('TAB1',"
Achtung dieses Dokument wird aktuell durch Mitarbeiter: $user_name bearbeitet! $open
"); $this->app->Tpl->Parse('PAGE',"tabview.tpl"); return true; } } function LockModule($modul = null, $action = null) { if(is_null($modul))$modul = $this->app->Secure->GetGET("module"); if(is_null($action))$action = $this->app->Secure->GetGET("action"); //in Modul //if($this->app->erp->LockModul())return; //benutzen $time = microtime(true); $salt = md5(microtime(true)); $saltjs = ' var lockalert = false; var lockstarttime = '.$time.'; setInterval(function(){ lockstarttime = lockstarttime + 1; },1000 ); $(document).ready(function() { $( window ).unload(function() { $.ajax({ url: "index.php?module=ajax&action=moduleunlock&salt='.$salt.'" }); }); window.addEventListener("beforeunload", function(event) { $.ajax({ url: "index.php?module=ajax&action=moduleunlock&salt='.$salt.'" }); }); if(typeof(Storage) !== "undefined") { // Code for localStorage/sessionStorage. setInterval(function(){ if(!localStorage.getItem("lockedmodule")) { var data = new Object(); localStorage.setItem("lockedmodule",JSON.stringify(data)); } //if(localStorage.getItem("lockedmodule")){ var lockstr = localStorage.getItem("lockedmodule"); if(lockstr.indexOf("[") > -1) { var data = new Object(); localStorage.setItem("lockedmodule",JSON.stringify(data)); lockstr = localStorage.getItem("lockedmodule"); } var lockedmodule = JSON.parse(lockstr); if(typeof(lockedmodule["'.$modul.'"]) === "undefined") { lockedmodule.'.$modul.' = new Object(); } if(typeof(lockedmodule.'.$modul.'.'.$action.') === "undefined") { lockedmodule.'.$modul.'.'.$action.' = new Object(); } lockedmodule.'.$modul.'.'.$action.'.x'.$salt.' = lockstarttime; var ar = lockedmodule.'.$modul.'.'.$action.'; var k; for (k in ar) { var v = ar[k]; if(k === "x'.$salt.'") { lockedmodule.'.$modul.'.'.$action.'.x'.$salt.' = lockstarttime; }else{ if(v > lockstarttime - 1) { if(!lockalert){ lockalert = true; alert("Sie haben noch ein Tab mit diesem Modul offen!"); } } if(v < lockstarttime - 10) { } } } var lstr = JSON.stringify(lockedmodule); localStorage.setItem("lockedmodule", JSON.stringify(lockedmodule)); },1000); } else { // Sorry! No Web Storage support.. } }); '; if($this->app->Secure->GetPOST("unlock")) { if($this->app->erp->RechteVorhanden("welcome","unlock")){ $this->app->DB->Delete("DELETE FROM module_lock where module like '".addslashes($modul)."' and action like '".addslashes($action)."'"); } } if($locked = $this->app->DB->SelectRow("SELECT *, now() as aktzeit from module_lock where module like '".addslashes($modul)."' and action like '".addslashes($action)."' limit 1")) { if($locked['userid'] && $locked['userid'] != $this->app->User->GetID() && strtotime($locked['aktzeit']) - strtotime($locked['zeit']) < 300) { $user_adresse = $this->app->DB->Select("SELECT adresse FROM user WHERE id='",$locked['userid']."' LIMIT 1"); $user_name = $this->app->DB->Select("SELECT name FROM adresse WHERE id='$user_adresse' LIMIT 1"); if($this->RechteVorhanden("welcome","unlock")) { $id = $this->app->Secure->GetGET("id"); //$open = ""; $open = '
'; } else { $this->SystemLog("Fehlendes Recht",1,"","welcome","unlock"); } $this->app->Tpl->Set('TAB1',"
Achtung dieses Modul wird aktuell durch Mitarbeiter: $user_name bearbeitet! $open
"); $this->app->Tpl->Parse('PAGE',"tabview.tpl"); return true; } $this->app->DB->Update("UPDATE module_lock set zeit = now(), userid = ".$this->app->User->GetID().", salt = '".$salt."' where module like '".addslashes($modul)."' and action like '".addslashes($action)."'"); $this->app->Tpl->Add('JAVASCRIPT',$saltjs); } else { $this->app->DB->Insert("INSERT INTO module_lock (module, action, userid, salt, zeit) values ('".addslashes($modul)."','".addslashes($action)."','".$this->app->User->GetID()."','".$salt."', now())"); $this->app->Tpl->Add('JAVASCRIPT',$saltjs); } return false; } /** * @param int $adresse * @param int $id * @param string $type * @param int $lieferadressenId */ public function LoadStandardLieferadresse($adresse,$id,$type, $lieferadressenId = 0) { if($lieferadressenId > 0) { $standardlieferadresse = $this->app->DB->SelectArr( sprintf( 'SELECT * FROM lieferadressen WHERE (adresse=%d OR adresse = 0) AND id=%d LIMIT 1', $adresse, $lieferadressenId ) ); } else{ $standardlieferadresse = $this->app->DB->SelectArr("SELECT * FROM lieferadressen WHERE adresse='$adresse' AND standardlieferadresse='1' LIMIT 1"); } if($standardlieferadresse[0]['id'] > 0) { foreach($standardlieferadresse[0] as $k => $v)$standardlieferadresse[0][$k] = $this->app->DB->real_escape_string($v); switch($type) { case "angebot": case "auftrag": $this->app->DB->Update("UPDATE $type SET abweichendelieferadresse='1', liefername='".$standardlieferadresse[0]['name']."', lieferabteilung='".$standardlieferadresse[0]['abteilung']."', lieferunterabteilung='".$standardlieferadresse[0]['unterabteilung']."', lieferland='".$standardlieferadresse[0]['land']."', lieferstrasse='".$standardlieferadresse[0]['strasse']."', lieferort='".$standardlieferadresse[0]['ort']."', lieferplz='".$standardlieferadresse[0]['plz']."', lieferadresszusatz='".$standardlieferadresse[0]['adresszusatz']."', lieferansprechpartner='".$standardlieferadresse[0]['ansprechpartner']."' WHERE id='$id' LIMIT 1"); if($standardlieferadresse[0]['ustid']!="") $this->app->DB->Update("UPDATE $type SET ustid = '".$standardlieferadresse[0]['ustid']."' WHERE id='$id' LIMIT 1"); if($standardlieferadresse[0]['ust_befreit']!="") $this->app->DB->Update("UPDATE $type SET ust_befreit = '".$standardlieferadresse[0]['ust_befreit']."' WHERE id='$id' LIMIT 1"); if($standardlieferadresse[0]['lieferbedingung']!="") $this->app->DB->Update("UPDATE $type SET lieferbedingung = '".$standardlieferadresse[0]['lieferbedingung']."' WHERE id='$id' LIMIT 1"); if($type == 'auftrag')$this->app->DB->Update("UPDATE $type SET liefergln = '".$standardlieferadresse[0]['gln']."' WHERE id='$id' LIMIT 1"); if($type == 'auftrag')$this->app->DB->Update("UPDATE $type SET lieferemail = '".$standardlieferadresse[0]['email']."' WHERE id='$id' LIMIT 1"); if($type == 'auftrag')$this->app->DB->Update("UPDATE $type SET lieferbundesstaat = '".$standardlieferadresse[0]['bundesstaat']."' WHERE id='$id' LIMIT 1"); break; case "lieferschein": $this->app->DB->Update("UPDATE lieferschein SET name='".$standardlieferadresse[0]['name']."', abteilung='".$standardlieferadresse[0]['abteilung']."', unterabteilung='".$standardlieferadresse[0]['unterabteilung']."', land='".$standardlieferadresse[0]['land']."', strasse='".$standardlieferadresse[0]['strasse']."', ort='".$standardlieferadresse[0]['ort']."', plz='".$standardlieferadresse[0]['plz']."', adresszusatz='".$standardlieferadresse[0]['adresszusatz']."', lieferbedingung='".$standardlieferadresse[0]['lieferbedingung']."', ansprechpartner='".$standardlieferadresse[0]['ansprechpartner']."' WHERE id='$id' LIMIT 1"); $this->app->DB->Update("UPDATE $type SET gln = '".$standardlieferadresse[0]['gln']."' WHERE id='$id' LIMIT 1"); $this->app->DB->Update("UPDATE $type SET bundesstaat = '".$standardlieferadresse[0]['bundesstaat']."' WHERE id='$id' LIMIT 1"); break; } } } function DisableVerband() { $module = $this->app->Secure->GetGET('module'); $id = $this->app->Secure->GetGET('id'); if($id <= 0 || !in_array($module,['angebot', 'auftrag', 'rechnung', 'gutschrift'])) { return; } if($module=="angebot" || $module=="auftrag" || $module=="rechnung" || $module=="gutschrift") { $docArr = $this->app->DB->SelectRow( sprintf( 'SELECT realrabatt, gruppe, adresse FROM `%s`WHERE id = %d', $module, $id ) ); $rabatt = !empty($docArr)?$docArr['realrabatt']: $this->app->DB->Select("SELECT realrabatt FROM $module b LEFT JOIN adresse a ON a.id=b.adresse WHERE b.id='$id' LIMIT 1"); $gruppe = !empty($docArr)?$docArr['gruppe']:$this->app->DB->Select("SELECT gruppe FROM $module b WHERE b.id='$id' LIMIT 1"); $adresse = !empty($docArr)?$docArr['adresse']:$this->app->DB->Select("SELECT adresse FROM $module WHERE id='$id' LIMIT 1"); $rabatte_festschreiben = $this->app->DB->Select("SELECT rabatte_festschreiben FROM adresse WHERE id='".$adresse."' LIMIT 1"); if($rabatt > 0 && $gruppe > 0)//CLAUDI && $this->Firmendaten("modul_verband")=="1") { if($rabatte_festschreiben=='1' && $gruppe<=0){ $this->app->Tpl->Set('RABATTANZEIGE', "
Kundenrabatt: $rabatt%"); } else { if($this->Firmendaten('modul_verband')=='1') //CLAUDI { $this->app->Tpl->Set('RABATTANZEIGE',"
Verbandsrabatt: $rabatt%"); } else { $this->app->Tpl->Set('RABATTANZEIGE',"
Preisgruppenrabatt: $rabatt%"); } } } else { $this->app->Tpl->Set('STARTDISABLEVERBAND',""); } //if(($rabatte_festschreiben!="1" && $gruppe > 0) || $gruppe > 0) // ANZEIGE VERBAND wenn definiert if($gruppe > 0) { $gruppenArr = $this->app->DB->SelectRow( sprintf( "SELECT CONCAT(name,' ',kennziffer) AS name, internebemerkung FROM gruppen WHERE id=%d", $gruppe ) ); $gruppe = !empty($docArr)?$docArr['gruppe']:$this->app->DB->Select("SELECT gruppe FROM $module WHERE id='$id' LIMIT 1"); $gruppe_name = !empty($gruppenArr)?$gruppenArr['name']: $this->app->DB->Select("SELECT CONCAT(name,' ',kennziffer) FROM gruppen WHERE id='$gruppe' LIMIT 1"); $gruppeinternebemerkung = !empty($gruppenArr)?$gruppenArr['internebemerkung']:$this->app->DB->Select("SELECT internebemerkung FROM gruppen WHERE id='$gruppe' LIMIT 1"); $this->app->Tpl->Set('VERBANDINFO',""); } else { $gruppe_name = ''; $rabattinformation = $this->app->DB->Select("SELECT rabattinformation FROM adresse WHERE id='$adresse' LIMIT 1"); $this->app->Tpl->Set('VERBANDINFO',""); } if($this->RechteVorhanden($module,'deleterabatte')) { $this->app->Tpl->Set('VERBAND'," "); } else { $this->app->Tpl->Set('VERBAND',""); } } } // prueft ob adresse eine filiale ist wenn wird der beleg gekennzeichnet function LoadAdresseProjektfiliale($table,$id,$adresse) { $check = $this->app->DB->Select("SELECT id FROM projekt WHERE filialadresse='$adresse' LIMIT 1"); if($check > 0) { $this->app->DB->Update("UPDATE $table SET projektfiliale=1 WHERE id='$id'"); } else { $this->app->DB->Update("UPDATE $table SET projektfiliale=0 WHERE id='$id'"); } } function LoadAdresseStandard($table,$id,$adresse) { if($table=="auftrag" || $table=="rechnung" || $table=="gutschrift" || $table=="lieferschein" || $table=="anfrage" || $table=="produktion" || $table=="bestellung" || $table=="preisanfrage" || $table=="proformarechnung" || $table=="angebot") { $firma = $this->app->DB->Select("SELECT firma FROM $table WHERE id='$id' LIMIT 1"); if($firma <=0) { $firma = $this->app->DB->Select("SELECT MAX(f.id) FROM firma f INNER JOIN firmendaten fd ON f.id = fd.firma LIMIT 1"); if(!$firma)$firma = $this->app->DB->Select("SELECT max(id) FROM firma LIMIT 1"); if($firma<=0)$firma = $this->app->DB->Select("SELECT MAX(id) FROM firma LIMIT 1"); $this->app->DB->Update("UPDATE $table SET firma='$firma' WHERE id='$id' LIMIT 1"); } //Sprache $sprache = $this->app->DB->Select("SELECT sprache FROM adresse WHERE id = '$adresse' LIMIT 1"); if($sprache)$this->app->DB->Update("UPDATE $table SET sprache = '".$this->app->DB->real_escape_string($sprache)."' WHERE id = '$id' LIMIT 1"); if($table == "auftrag" || $table == "rechnung" || $table == "gutschrift" || $table == "lieferschein" || $table == "angebot" || $table=="proformarechnung") { $kundennummer = $this->app->DB->Select("SELECT kundennummer FROM adresse WHERE id = '$adresse' LIMIT 1"); if($kundennummer)$this->app->DB->Update("UPDATE $table SET kundennummer = '".$this->app->DB->real_escape_string($kundennummer)."' WHERE id = '$id' LIMIT 1"); }elseif($table == "bestellung") { $kundennummerlieferant = $this->app->DB->Select("SELECT kundennummerlieferant FROM adresse WHERE id = '$adresse' LIMIT 1"); if($kundennummerlieferant)$this->app->DB->Update("UPDATE $table SET kundennummerlieferant = '".$this->app->DB->real_escape_string($kundennummerlieferant)."' WHERE id = '$id' LIMIT 1"); } $this->LoadAdresseProjektfiliale($table,$id,$adresse); $checkemail = $this->app->DB->Select("SELECT ".($table==='rechnung' || $table === 'proformarechnung'?'rechnungs':$table)."_email FROM adresse WHERE id='$adresse' LIMIT 1"); if($checkemail!="") $this->app->DB->Update("UPDATE $table SET email='$checkemail' WHERE id='$id' LIMIT 1"); } } function LoadAuftragStandardwerte($id,$adresse,$lieferantenauftrag=false) { // standard adresse von lieferant $arr = $this->app->DB->SelectArr("SELECT *,vertrieb as vertriebid,'' as bearbeiter,innendienst as bearbeiterid FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); if($arr[0]['bearbeiterid'] <=0 ) $arr[0]['bearbeiterid'] = $this->app->User->GetAdresse(); $arr[0]['gruppe'] = $this->GetVerband($adresse); $field = array('anschreiben','name','vorname','abteilung','ansprechpartner','unterabteilung','strasse','adresszusatz','plz','ort','land','bundesstaat','ustid','email','telefon','telefax','kundennummer','projekt','ust_befreit','gruppe','typ','vertriebid','bearbeiter','gln','bearbeiterid','titel','lieferbedingung'); $rolle_projekt = $this->app->DB->Select("SELECT parameter FROM adresse_rolle WHERE adresse='$adresse' AND subjekt='Kunde' AND objekt='Projekt' AND (bis ='0000-00-00' OR bis <= NOW()) LIMIT 1"); if($rolle_projekt > 0) { $arr[0]['projekt'] = $rolle_projekt; } foreach($field as $key=>$value) { if($value=="projekt" && $this->app->Secure->POST[$value]!="" && 0) // immer projekt von adresse { $uparr[$value] = str_replace("'", ''',$this->app->Secure->POST[$value]); } else { $this->app->Secure->POST[$value] = $arr[0][$value]; $uparr[$value] = str_replace("'", ''',$arr[0][$value]); } } $uparr['adresse']=$adresse; if($lieferantenauftrag) $uparr['lieferant']=$adresse; $this->app->DB->UpdateArr("auftrag",$id,"id",$uparr,true); $uparr=null; //liefernantenvorlage $arr = $this->app->DB->SelectArr("SELECT * FROM adresse WHERE id='$adresse' LIMIT 1"); if($lieferantenauftrag && $arr) $arr[0]['lieferantkdrnummer']=$arr[0]['lieferantennummer']; if(!$lieferantenauftrag && $arr) $arr[0]['lieferantkdrnummer']=$arr[0]['kundennummer']; // falls von Benutzer projekt ueberladen werden soll $projekt_bevorzugt=$this->app->DB->Select("SELECT projekt_bevorzugen FROM user WHERE id='".$this->app->User->GetID()."' LIMIT 1"); if($projekt_bevorzugt=="1") { $uparr['projekt'] = $this->app->DB->Select("SELECT projekt FROM user WHERE id='".$this->app->User->GetID()."' LIMIT 1"); $arr[0]['projekt'] = $uparr['projekt']; $arr[0]['standardlager'] = $this->app->DB->Select("SELECT standardlager FROM projekt WHERE id='".$uparr['projekt']."' LIMIT 1"); $this->app->Secure->POST['projekt']=$this->app->DB->Select("SELECT abkuerzung FROM projekt WHERE id='".$arr[0]['projekt']."' AND id > 0 LIMIT 1"); } $field = array('zahlungsweise','zahlungszieltage','zahlungszieltageskonto','zahlungszielskonto','versandart'); $this->LoadZahlungsweise($adresse,$arr); if($arr[0]['versandart']==''){ $arr[0]['versandart'] = $this->StandardVersandart($arr[0]['projekt']); } $this->app->Secure->POST['zahlungsweise'] = strtolower($arr[0]['zahlungsweise']); $this->app->Secure->POST['zahlungszieltage'] = strtolower($arr[0]['zahlungszieltage']); $this->app->Secure->POST['zahlungszieltageskonto'] = strtolower($arr[0]['zahlungszieltageskonto']); $this->app->Secure->POST['zahlungszielskonto'] = strtolower($arr[0]['zahlungszielskonto']); $this->app->Secure->POST['versandart'] = strtolower($arr[0]['versandart']); foreach($arr[0] as $k => $v) { if(strpos((String)$v, "'") !== false)$arr[0][$k] = str_replace("'", ''',$v); } if(isset($arr[0]['usereditid']))unset($arr[0]['usereditid']); $this->app->DB->UpdateArr("auftrag",$id,"id",$arr[0], true); // must after called after UpdateArr auftrag because ustid can overridden by StandardLieferadresse $this->LoadStandardLieferadresse($adresse,$id,"auftrag"); $this->LoadSteuersaetzeWaehrung($id,"auftrag"); $this->LoadAdresseStandard("auftrag",$id,$adresse); $this->app->DB->Update(" UPDATE auftrag a INNER JOIN adresse adr ON a.lieferant = adr.id SET a.lieferantkdrnummer = if(a.lieferantennummer <> '',a.lieferantennummer,adr.lieferantennummer) WHERE a.lieferantkdrnummer = '' AND a.lieferantenauftrag = 1 AND a.id = '$id' "); $this->app->DB->Update(" UPDATE auftrag a INNER JOIN adresse adr ON a.adresse = adr.id SET a.lieferantkdrnummer = if(a.kundennummer <> '',a.kundennummer, adr.kundennummer) WHERE a.lieferantkdrnummer = '' AND a.lieferantenauftrag = 0 AND a.id = '$id' "); if($arr[0]['art'])$this->app->DB->Update("UPDATE auftrag SET art = '".$this->app->DB->real_escape_string($arr[0]['art'])."' WHERE id = '$id' LIMIT 1"); $projekt = $this->app->DB->Select("SELECT projekt FROM auftrag WHERE id = '$id' LIMIT 1"); $deactivateAutoversand = (int)$this->app->erp->Projektdaten($projekt,'deactivateautoshipping'); if($deactivateAutoversand) { $this->app->DB->Update( sprintf( 'UPDATE auftrag SET autoversand = 0 WHERE schreibschutz = 0 AND id = %d', $id ) ); }else{ $this->app->DB->Update( sprintf( 'UPDATE auftrag SET autoversand = 1 WHERE schreibschutz = 0 AND id = %d', $id ) ); } $this->AuftragEinzelnBerechnen($id); $this->RunHook('erpapi_loadauftragstandardwerte',3, $id, $adresse, $lieferantenauftrag); } function GetKategorienbaum(&$baum, $parent = 0, $lvl = 0, $shop = 0) { if($lvl > 30)return; $sprachen = $this->GetSelectSprachenListe(true); $elemente = $this->app->DB->SelectArr("SELECT ak.id, ak.parent, ak.bezeichnung, sk.extid FROM artikelkategorien ak LEFT JOIN `shopexport_kategorien` sk ON ak.id = sk.kategorie AND sk.shop = '$shop' AND sk.shop > 0 AND sk.aktiv = 1 WHERE (ak.geloescht = 0 OR isnull(ak.geloescht)) AND ak.parent = '$parent' ORDER BY ak.bezeichnung"); if($elemente) { foreach($elemente as $el) { $el['lvl'] = $lvl; $uebersetzungen = $this->app->DB->SelectArr("SELECT beschriftung,sprache FROM uebersetzung WHERE label='kategorie_".$el['id']."'"); $texte = array(); if(is_array($uebersetzungen)){ foreach ($uebersetzungen as $index => $sprachenarray){ $kategoriesprache = $sprachenarray['sprache']; if(array_key_exists(ucfirst($sprachenarray['sprache']),$sprachen)){ $kategoriesprache = $sprachen[ucfirst($sprachenarray['sprache'])]; } $texte[$kategoriesprache] = $sprachenarray['beschriftung']; } } $el['texte'] = $texte; $baum[] = $el; $this->GetKategorienbaum($baum, $el['id'], $lvl + 1, $shop); } } } function LoadZahlungsweise($adresse,&$arr) { //$arr = $this->app->DB->SelectArr("SELECT * FROM adresse WHERE id='$adresse' LIMIT 1"); if($arr[0]['zahlungsweise']=="") $arr[0]['zahlungsweise']=$this->Firmendaten("zahlungsweise"); if($arr[0]['zahlungsweise']=="") $arr[0]['zahlungsweise']="vorkasse"; if($arr[0]['zahlungszieltage']==="" && $arr[0]['zahlungsweise']=="rechnung") $arr[0]['zahlungszieltage']=$this->ZahlungsZielTage(); if($arr[0]['zahlungszieltageskonto']==="" && $arr[0]['zahlungsweise']=="rechnung") $arr[0]['zahlungszieltageskonto']=$this->ZahlungsZielTageSkonto(); if($arr[0]['zahlungszielskonto']==="" && $arr[0]['zahlungsweise']=="rechnung") $arr[0]['zahlungszielskonto']=$this->ZahlungsZielSkonto(); } function LoadAngebotStandardwerte($id,$adresse) { // standard adresse von lieferant $arr = $this->app->DB->SelectArr("SELECT *,vertrieb as vertriebid,'' as bearbeiter,innendienst as bearbeiterid FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); if($arr[0]['bearbeiterid'] <=0 ) $arr[0]['bearbeiterid'] = $this->app->User->GetAdresse(); $arr[0]['gruppe'] = $this->GetVerband($adresse); $rolle_projekt = $this->app->DB->Select("SELECT parameter FROM adresse_rolle WHERE adresse='$adresse' AND subjekt='Kunde' AND objekt='Projekt' AND (bis ='0000-00-00' OR bis <= NOW()) LIMIT 1"); if($rolle_projekt > 0) { $arr[0]['projekt'] = $rolle_projekt; } $field = array('gln','anschreiben','name','abteilung','unterabteilung','strasse','adresszusatz','plz','ort','land','ustid','ust_befreit','email','telefon','telefax','projekt','ansprechpartner','gruppe','typ','vertriebid','bearbeiter','bearbeiterid','titel','lieferbedingung'); foreach($field as $key=>$value) { if($value=="projekt" && $this->app->Secure->POST[$value]!="" && 0) { $uparr[$value] = str_replace("'", ''',$this->app->Secure->POST[$value]); } else { $this->app->Secure->POST[$value] = str_replace("'", ''',$arr[0][$value]); $uparr[$value] = str_replace("'", ''',$arr[0][$value]); } } $uparr['adresse'] = $adresse; $this->app->DB->UpdateArr("angebot",$id,"id",$uparr,true); $uparr=null; //liefernantenvorlage $arr = $this->app->DB->SelectArr("SELECT * FROM adresse WHERE id='$adresse' LIMIT 1"); $this->LoadZahlungsweise($adresse,$arr); if($arr[0]['versandart']==''){ $arr[0]['versandart'] = $this->StandardVersandart($arr[0]['projekt']); } // falls von Benutzer projekt ueberladen werden soll $projekt_bevorzugt=$this->app->DB->Select("SELECT projekt_bevorzugen FROM user WHERE id='".$this->app->User->GetID()."' LIMIT 1"); if($projekt_bevorzugt=="1") { $uparr['projekt'] = $this->app->DB->Select("SELECT projekt FROM user WHERE id='".$this->app->User->GetID()."' LIMIT 1"); $arr[0]['projekt'] = $uparr['projekt']; $arr[0]['standardlager'] = $this->app->DB->Select("SELECT standardlager FROM projekt WHERE id='".$uparr['projekt']."' LIMIT 1"); $this->app->Secure->POST['projekt']=$this->app->DB->Select("SELECT abkuerzung FROM projekt WHERE id='".$arr[0]['projekt']."' AND id > 0 LIMIT 1"); } $this->app->Secure->POST['zahlungsweise'] = strtolower($arr[0]['zahlungsweise']); $this->app->Secure->POST['zahlungszieltage'] = strtolower($arr[0]['zahlungszieltage']); $this->app->Secure->POST['zahlungszieltageskonto'] = strtolower($arr[0]['zahlungszieltageskonto']); $this->app->Secure->POST['zahlungszielskonto'] = strtolower($arr[0]['zahlungszielskonto']); $this->app->Secure->POST['versandart'] = strtolower($arr[0]['versandart']); if(isset($arr[0]['usereditid']))unset($arr[0]['usereditid']); $this->app->DB->UpdateArr("angebot",$id,"id",$arr[0],true); $this->LoadStandardLieferadresse($adresse,$id,"angebot"); $this->LoadSteuersaetzeWaehrung($id,"angebot"); $this->LoadAdresseStandard("angebot",$id,$adresse); } function LoadGutschriftStandardwerte($id,$adresse) { $obj = $this->LoadModul('gutschrift'); if(!empty($obj) && method_exists($obj,'LoadGutschriftStandardwerte')) { return $obj->LoadGutschriftStandardwerte($id, $adresse); } } function BerechneDeckungsbeitrag($id,$typ,$extern=false) { // mit rabatt beruecksichtigen if($typ==='rechnung' || $typ==='gutschrift' || $typ==='auftrag' || $typ==='angebot') { $waehrungProjekt = $this->app->DB->SelectRow( sprintf( "SELECT waehrung, projekt,steuersatz_normal, steuersatz_ermaessigt FROM `%s` WHERE id=%d LIMIT 1", $typ, (int)$id ) ); $waehrung = $waehrungProjekt['waehrung']; $projectId = $waehrungProjekt['projekt']; $steuersatzNormal = $waehrungProjekt['steuersatz_normal']; $steuersatzErmaessigt = $waehrungProjekt['steuersatz_ermaessigt']; $method = ucfirst($typ).'MitUmsatzsteuer'; if(!method_exists($this, $method)) { $method = ucfirst($typ).'MitUmsatzeuer'; } $mitumsatzsteuer = method_exists($this, $method)? $this->$method($id):true; if(!$mitumsatzsteuer) { $steuersatzNormal = 0; $steuersatzErmaessigt = 0; } $preisberechnung = $this->Projektdaten($projectId,'preisberechnung'); if($waehrung == '') { $waehrung = 'EUR'; } $ohneeks = $this->app->DB->SelectArr("SELECT id, artikel, menge, preis, rabatt, ekwaehrung, einkaufspreis, waehrung FROM {$typ}_position ap WHERE $typ = '$id' "); if($this->app->DB->error()){ $ohneeks = $this->app->DB->SelectArr("SELECT id, artikel, menge, preis, rabatt, ekwaehrung, einkaufspreis FROM {$typ}_position ap WHERE $typ = '$id' "); } if(!empty($ohneeks)) { foreach($ohneeks as $ek) { if($ek['einkaufspreis'] == 0) { $originalwaehrung = $ek['waehrung']; $originalpreis = $ek['preis']; $ekpreis = (double)$this->GetEinkaufspreisWaehrung($ek['artikel'],$ek['menge'],$waehrung,$originalwaehrung, $originalpreis); if($originalwaehrung == '')$originalwaehrung = 'EUR'; switch($typ) { case "rechnung": $explodiertspalte = "explodiert_parent_artikel"; break; default: $explodiertspalte = "explodiert_parent"; } $this->app->DB->Update("UPDATE {$typ}_position SET ekwaehrung = '$originalwaehrung', einkaufspreisurspruenglich = '$originalpreis', einkaufspreis = '$ekpreis' WHERE id = '".$ek['id']."' AND $explodiertspalte = 0 AND einkaufspreis=0 LIMIT 1"); }else{ $ekpreis = $ek['einkaufspreis']; } $pdeckungsbeitrag = $ek['preis']*(100-$ek['rabatt'])/100; $pdeckungsbeitrag = ($pdeckungsbeitrag != 0)?(($pdeckungsbeitrag - $ekpreis) / $pdeckungsbeitrag):1; $this->app->DB->Update("UPDATE {$typ}_position SET deckungsbeitrag = '$pdeckungsbeitrag' WHERE id = '".$ek['id']."' LIMIT 1"); } if($preisberechnung == 3){ $sql = sprintf( 'UPDATE `%s` SET umsatz_netto_einzeln = ROUND(preis * (1 - rabatt / 100),2), umsatz_netto_gesamt = ROUND(menge * ROUND(preis * (1 - rabatt / 100),2), 2), umsatz_brutto_einzeln = ROUND(preis * (1 - rabatt / 100),2) * (1 + IF( IFNULL(steuersatz,-1) < 0, IF( umsatzsteuer = \'befreit\', 0, IF(umsatzsteuer = \'ermaessigt\', %f, %f ) ), steuersatz ) / 100), umsatz_brutto_gesamt = ROUND(menge * ROUND(preis * (1 - rabatt / 100),2), 2) * (1 + IF( IFNULL(steuersatz,-1) < 0, IF( umsatzsteuer = \'befreit\', 0, IF(umsatzsteuer = \'ermaessigt\', %f, %f ) ), steuersatz ) / 100) WHERE `%s` = %d', $typ . '_position', $steuersatzErmaessigt, $steuersatzNormal, $steuersatzErmaessigt, $steuersatzNormal, $typ, $id); }elseif($preisberechnung == 1) { $sql = sprintf( 'UPDATE `%s` SET umsatz_netto_einzeln = preis * (1 - rabatt / 100), umsatz_netto_gesamt = ROUND(menge * preis * (1 - rabatt / 100), 2), umsatz_brutto_einzeln = preis * (1 - rabatt / 100) * (1 + IF( IFNULL(steuersatz,-1) < 0, IF( umsatzsteuer = \'befreit\', 0, IF(umsatzsteuer = \'ermaessigt\', %f, %f ) ), steuersatz ) / 100), umsatz_brutto_gesamt = ROUND(menge * preis * (1 - rabatt / 100), 2) * (1 + IF( IFNULL(steuersatz,-1) < 0, IF( umsatzsteuer = \'befreit\', 0, IF(umsatzsteuer = \'ermaessigt\', %f, %f ) ), steuersatz ) / 100) WHERE `%s` = %d', $typ . '_position', $steuersatzErmaessigt, $steuersatzNormal, $steuersatzErmaessigt, $steuersatzNormal, $typ, $id ); }else{ $sql = sprintf( 'UPDATE `%s` SET umsatz_netto_einzeln = preis * (1 - rabatt / 100), umsatz_netto_gesamt = menge * preis * (1 - rabatt / 100), umsatz_brutto_einzeln = preis * (1 - rabatt / 100) * (1 + IF( IFNULL(steuersatz,-1) < 0, IF( umsatzsteuer = \'befreit\', 0, IF(umsatzsteuer = \'ermaessigt\', %f, %f ) ), steuersatz ) / 100), umsatz_brutto_gesamt = menge * preis * (1 - rabatt / 100) * (1 + IF( IFNULL(steuersatz,-1) < 0, IF( umsatzsteuer = \'befreit\', 0, IF(umsatzsteuer = \'ermaessigt\', %f, %f ) ), steuersatz ) / 100) WHERE `%s` = %d', $typ . '_position', $steuersatzErmaessigt, $steuersatzNormal, $steuersatzErmaessigt, $steuersatzNormal, $typ, $id ); } $this->app->DB->Update($sql); } $status=$this->app->DB->Select("SELECT status FROM $typ WHERE id='$id' LIMIT 1"); $deckungsbeitragcalc=$this->app->DB->Select("SELECT deckungsbeitragcalc FROM $typ WHERE id='$id' LIMIT 1"); //wenn im richtigen status oder noch nicht berechnet if(1)//($status!="storniert" && $status!="versendet" && $status!="abgeschlossen") || $deckungsbeitragcalc!="1") { $deckungsbeitrag = 0; $deckungsbeitragprozent = 0; $belegnr = $this->app->DB->Select("SELECT belegnr FROM $typ WHERE id='$id' LIMIT 1"); if(!$extern) $this->Protokoll(strtoupper($typ)." BELEG $belegnr"); $anzahlStellen = ($this->app->erp->Firmendaten('viernachkommastellen_belege')?4:2); if($preisberechnung == 3) { if($typ === 'angebot') { $einnahmen = $this->app->DB->Select( sprintf( "SELECT SUM(ap.menge*ROUND(ap.preis*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1)),%d)) FROM `%s` auf INNER JOIN `%s` ap ON ap.`%s`=auf.id WHERE auf.id=%d AND ap.optional <> 1 AND (ap.explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1),0))", $anzahlStellen, $typ, $typ.'_position', $typ, (int)$id ) ); }else{ $einnahmen = $this->app->DB->Select(sprintf( "SELECT SUM(ap.menge*ROUND(ap.preis*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1)),%d)) FROM `%s` auf INNER JOIN `%s` ap ON ap.`%s`=auf.id WHERE auf.id=%d", $anzahlStellen, $typ, $typ.'_position', $typ, (int)$id ) ); } }elseif($preisberechnung == 1) { if($typ === 'angebot') { $einnahmen = $this->app->DB->Select( sprintf( "SELECT SUM(ROUND(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1)),%d)) FROM `%s` auf INNER JOIN `%s` ap ON ap.`%s`=auf.id WHERE auf.id=%d AND ap.optional <> 1 AND (ap.explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1),0))", $anzahlStellen, $typ, $typ.'_position', $typ, (int)$id ) ); }else{ $einnahmen = $this->app->DB->Select(sprintf( "SELECT SUM(ROUND(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1)),%d)) FROM `%s` auf INNER JOIN `%s` ap ON ap.`%s`=auf.id WHERE auf.id=%d", $anzahlStellen, $typ, $typ.'_position', $typ, (int)$id ) ); } }else{ if($typ === 'angebot') { $einnahmen = $this->app->DB->Select( sprintf( "SELECT SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1))) FROM `%s` auf INNER JOIN `%s` ap ON ap.`%s`=auf.id WHERE auf.id=%d AND ap.optional <> 1 AND (ap.explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1),0))", $typ, $typ.'_position', $typ, (int)$id ) ); }else{ $einnahmen = $this->app->DB->Select(sprintf( "SELECT SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1))) FROM `%s` auf INNER JOIN `%s` ap ON ap.`%s`=auf.id WHERE auf.id=%d", $typ, $typ.'_position', $typ, (int)$id ) ); } } $this->app->DB->Update( sprintf( "UPDATE `%s` SET deckungsbeitragcalc=1, deckungsbeitrag=%f, erloes_netto=%f, umsatz_netto=%f WHERE id= %d LIMIT 1" ,$typ,(float)$deckungsbeitragprozent,(float)$deckungsbeitrag,(float)$einnahmen ,(int)$id ) ); } } $this->RunHook('BerechneDeckungsbeitragEnde', 3, $id, $typ, $extern); } function LoadRechnungStandardwerte($id,$adresse) { /** @var Rechnung $obj */ $obj = $this->LoadModul('rechnung'); if(!empty($obj) && method_exists($obj,'LoadRechnungStandardwerte')){ return $obj->LoadRechnungStandardwerte($id, $adresse); } } function LoadBestellungStandardwerte($id,$adresse) { /** @var Bestellung $obj */ $obj = $this->LoadModul('bestellung'); if(!empty($obj) && method_exists($obj, 'LoadBestellungStandardwerte')) { $obj->LoadBestellungStandardwerte($id, $adresse); } } function CreateArbeitsnachweis($adresse="",$projekt="") { /** @var Arbeitsnachweis $obj */ $obj = $this->app->erp->LoadModul('arbeitsnachweis'); if(!empty($obj) && method_exists($obj, 'CreateArbeitsnachweis')) { return $obj->CreateArbeitsnachweis($adresse,$projekt); } return 0; } function CreateInventur($adresse="") { /** @var Inventur $obj */ $obj = $this->LoadModul('inventur'); if(!empty($obj) && method_exists($obj, 'CreateInventur')) { return $obj->CreateInventur($adresse); } return 0; } function CreateAnfrage($adresse='') { $projekt = $this->GetCreateProjekt($adresse); $belegmax = ''; $ohnebriefpapier = 1; $this->app->DB->Insert("INSERT INTO anfrage (id,datum,bearbeiter,firma,belegnr,adresse,ohne_briefpapier,bearbeiterid,projekt) VALUES ('',NOW(),'".$this->app->User->GetName()."','".$this->app->User->GetFirma()."','$belegmax','$adresse','".$ohnebriefpapier."', '".$this->app->User->GetAdresse()."','$projekt')"); $id = $this->app->DB->GetInsertID(); $this->LoadSteuersaetzeWaehrung($id,"anfrage"); $this->SchnellFreigabe("anfrage",$id); $this->EventAPIAdd("EventAnfrageCreate",$id,"anfrage","create"); return $id; } function SchnellFreigabe($beleg,$id) { if($id <= 0 || empty($beleg) || $this->app->erp->Firmendaten('schnellanlegen_ohnefreigabe')!='1') { return; } $doc = $this->app->DB->SelectRow(sprintf('SELECT `projekt`, `status`, `belegnr` FROM `%s` WHERE `id` = %d', $beleg, $id)); if( empty($doc) || ($doc['status'] === 'freigegeben' && (string)$doc['belegnr'] !== '0' && (string)$doc['belegnr'] !=='') ) { return; } $projekt = $doc['projekt']; $belegnr = (String)$doc['belegnr']; $status = $doc['status']; if($belegnr === '' || $belegnr === '0') { $belegnr = $this->app->erp->GetNextNummer($beleg,$projekt,$id); } $this->app->DB->Update("UPDATE $beleg SET datum=NOW(),belegnr='$belegnr', status='freigegeben' WHERE id='$id' LIMIT 1"); $methodname = ucfirst($beleg).'Protokoll'; if(method_exists($this,$methodname) && $status != 'freigegeben') { $this->app->erp->$methodname($id,ucfirst($beleg).' freigegeben'); } // automatisch eine wiedervorlage anlegen if($beleg === 'angebot') { $this->AngebotWiedervorlage($id); } if($beleg === 'auftrag') { $this->app->DB->Update( sprintf( 'UPDATE `artikel` AS `a` INNER JOIN `auftrag_position` AS `ap` ON a.id = ap.artikel AND (a.lagerartikel = 1 OR a.juststueckliste = 1) SET a.`laststorage_changed` = NOW() WHERE `ap`.auftrag = %d', $id ) ); } } function BelegFreigabe($beleg,$id) { if($id <= 0 || empty($beleg)) { return; } $doc = $this->app->DB->SelectRow(sprintf('SELECT `projekt`, `status`, `belegnr` FROM `%s` WHERE `id` = %d', $beleg, $id)); if( empty($doc) || ($doc['status'] === 'freigegeben' && (string)$doc['belegnr'] !== '0' && (string)$doc['belegnr'] !=='') ) { return; } $projekt = $doc['projekt']; $belegnr = (String)$doc['belegnr']; $status = $doc['status']; if($belegnr === '' || $belegnr === '0') { $belegnr = $this->app->erp->GetNextNummer($beleg,$projekt,$id); } if(!empty($this->app->User) && method_exists($this->app->User, 'GetParameter') && $this->app->User->GetParameter($beleg."_create_entwurfsdatumuebernehmen")=='1'){ $this->app->DB->Update("UPDATE $beleg SET belegnr='$belegnr', `status`='freigegeben' WHERE id='$id' LIMIT 1"); } else{ $this->app->DB->Update("UPDATE $beleg SET datum=NOW(),belegnr='$belegnr', `status`='freigegeben' WHERE id='$id' LIMIT 1"); } // schutzt fals kein Datum gefunden $this->app->DB->Update("UPDATE $beleg SET datum=NOW() WHERE id='$id' AND (datum='0000-00-00' OR datum='1970-01-01' OR datum IS NULL OR datum='') LIMIT 1"); $methodname = ucfirst($beleg).'Protokoll'; if(method_exists($this,$methodname) && $status != 'freigegeben') { $this->app->erp->$methodname($id,ucfirst($beleg).' freigegeben'); } if($status != 'freigeben') { $_beleg = $beleg; $_id = $id; $this->RunHook('BelegFreigabe', 2, $_beleg, $_id); } // automatisch eine wiedervorlage anlegen if($beleg=='angebot') { $this->AngebotWiedervorlage($id); } if($beleg === 'auftrag') { $this->app->DB->Update( sprintf( 'UPDATE `artikel` AS `a` INNER JOIN `auftrag_position` AS `ap` ON a.id = ap.artikel AND (a.lagerartikel = 1 OR a.juststueckliste = 1) SET a.`laststorage_changed` = NOW() WHERE `ap`.auftrag = %d', $id ) ); } } function CreateWiedervorlage($adresse,$bezeichnung,$beschreibung,$intagen=30,$adresse_mitarbeiter=0,$bearbeiter=0,$typ="",$typid=0) { if($adresse_mitarbeiter <=0) $adresse_mitarbeiter = $this->app->User->GetAdresse(); if($bearbeiter <= 0) $bearbeiter = $this->app->User->GetAdresse(); $this->app->DB->Insert("INSERT INTO wiedervorlage ( datum_angelegt, zeit_angelegt,datum_erinnerung, zeit_erinnerung, bezeichnung,beschreibung,abgeschlossen,bearbeiter,adresse_mitarbeiter,module,parameter,adresse) values ( DATE_FORMAT(NOW(),'%Y-%m-%d'),DATE_FORMAT(NOW(),'%h:%i:00'),DATE_ADD(NOW(), INTERVAL ".$intagen." DAY), DATE_FORMAT(NOW(),'%h:%i:00'),'".$this->app->DB->real_escape_string( $bezeichnung)."', '".$this->app->DB->real_escape_string( $beschreibung)."','0','$bearbeiter','$adresse_mitarbeiter','$typ','$typid','$adresse')" ); return $this->app->DB->GetInsertID(); } function AngebotWiedervorlage($id) { if($this->Firmendaten('angebot_anzahlwiedervorlage')<=0) { return; } $check = $this->app->DB->Select("SELECT id FROM wiedervorlage WHERE module='angebot' AND parameter='$id' LIMIT 1"); if($check > 0) { return; } $angebot_pipewiedervorlage = $this->Firmendaten("angebot_pipewiedervorlage"); $angebot_pipewiedervorlage = strstr($angebot_pipewiedervorlage, ' ', true); if(!is_numeric($angebot_pipewiedervorlage)) $angebot_pipewiedervorlage = 0; $belegnr = $this->app->DB->Select("SELECT belegnr FROM angebot WHERE id='$id' LIMIT 1"); $bezeichnung = "Nachfassen beim Angebot $belegnr"; $beschreibung = "Nachfassen beim Angebot"; $adresse = $this->app->DB->Select("SELECT adresse FROM angebot WHERE id='$id' LIMIT 1"); $adresse_mitarbeiter = $this->app->DB->Select("SELECT vertriebid FROM angebot WHERE id='$id' LIMIT 1"); if($adresse_mitarbeiter <=0) $adresse_mitarbeiter = $this->app->User->GetAdresse(); $bearbeiter = $this->app->User->GetAdresse(); $projekt = $this->app->DB->Select("SELECT projekt FROM angebot WHERE id = '$id' LIMIT 1"); $this->app->DB->Insert("INSERT INTO wiedervorlage ( datum_angelegt, zeit_angelegt,datum_erinnerung, zeit_erinnerung, bezeichnung,beschreibung,abgeschlossen,bearbeiter,adresse_mitarbeiter,module,parameter,adresse,stages,projekt) values ( DATE_FORMAT(NOW(),'%Y-%m-%d'),DATE_FORMAT(NOW(),'%h:%i:00'),DATE_ADD(NOW(), INTERVAL ".$this->Firmendaten("angebot_anzahlwiedervorlage")." DAY),DATE_FORMAT(NOW(),'%h:%i:00'),'".$this->app->DB->real_escape_string( $bezeichnung)."', '".$this->app->DB->real_escape_string( $beschreibung)."','0','$bearbeiter','$adresse_mitarbeiter','angebot','$id','$adresse','$angebot_pipewiedervorlage','$projekt')" ); } function CreatePreisanfrage($adresse="") { /** @var Preisanfrage $obj */ $obj = $this->app->erp->LoadModul('preisanfrage'); if(!empty($obj) && method_exists($obj,'CreatePreisanfrage')) { return $obj->CreatePreisanfrage($adresse); } return 0; } function CreateProformarechnung($adresse="") { $projekt = $this->GetCreateProjekt($adresse); $belegmax = ""; $ohnebriefpapier = $this->Firmendaten("proformarechnung_ohnebriefpapier"); $this->app->DB->Insert("INSERT INTO proformarechnung (id,datum,bearbeiter,firma,belegnr,adresse,ohne_briefpapier,bearbeiterid,projekt,zollinformation) VALUES ('',NOW(),'".$this->app->User->GetName()."','".$this->app->User->GetFirma()."','$belegmax','$adresse','".$ohnebriefpapier."', '".$this->app->User->GetAdresse()."','$projekt',1)"); $id = $this->app->DB->GetInsertID(); $this->LoadSteuersaetzeWaehrung($id,"proformarechnung"); $this->EventAPIAdd("EventAnfrageCreate",$id,"proformarechnung","create"); return $id; } function CreateKalkulation($adresse="") { /** @var Kalkulation $obj */ $obj = $this->LoadModul('kalkulation'); if(!empty($obj) && method_exists($obj,'CreateKalkulation')) { return $obj->CreateKalkulation($adresse); } return null; } /** * @deprecated */ public function CreateReisekosten($adresse='') { /** @var Reisekosten $obj */ $obj = $this->LoadModul('reisekosten'); if(!empty($obj) && method_exists($obj,'CreateReisekosten')) { return $obj->CreateReisekosten($adresse); } return 0; } function ZeitSollDatumArbeit($adresse,$datum) { $erg = $this->app->DB->Select('SELECT stunden FROM mitarbeiterzeiterfassung_sollstunden WHERE datum = "' . $datum . '" AND adresse = "' . $adresse . '" LIMIT 1'); if($erg<=0) $erg=0; return $erg; } function AnzahlWerktageMonat($datum="") { if($datum=="") $query_date = date('Y-m-d'); else $query_date=$datum; // First day of the month. $first = date('Y-m', strtotime($query_date)); // Last day of the month. $last = date('t', strtotime($query_date)); $anzahlwerktage=0; for($day=1;$day<=$last;$day++) { $checkday = date('w',strtotime($first."-".$day)); if($checkday!=0 && $checkday!=6) $anzahlwerktage++; } return $anzahlwerktage; } function ZeitGesamtDatumArbeitAbrechnen($adresse,$datum) { $sql = "SELECT SUM((TIMESTAMPDIFF(SECOND,z.von, z.bis))/3600) FROM `zeiterfassung` z WHERE z.art LIKE 'Arbeit' AND DATE_FORMAT(z.von,'%Y-%m-%d')='$datum' AND z.adresse='$adresse' AND z.abrechnen=1"; $erg=$this->app->DB->Select($sql); if($erg<=0) $erg=0; return $erg; } function ZeitGesamtAufgabe($id,$adresse=0) { if($adresse<=0) { $sql = "SELECT SUM((TIMESTAMPDIFF(SECOND,z.von, z.bis))/3600) FROM `zeiterfassung` z WHERE z.art LIKE 'Arbeit' AND z.aufgabe_id='$id'"; } else { $sql = "SELECT SUM((TIMESTAMPDIFF(SECOND,z.von, z.bis))/3600) FROM `zeiterfassung` z WHERE z.art LIKE 'Arbeit' AND z.aufgabe_id='$id' AND z.adresse='$adresse'"; } $erg=$this->app->DB->Select($sql); if($erg<=0) $erg=0; return $erg; } function ZeitGesamtDatumArbeit($adresse,$datum) { $sql = "SELECT SUM((TIMESTAMPDIFF(SECOND,z.von, z.bis))/3600) FROM `zeiterfassung` z WHERE z.art NOT LIKE 'Pause' AND DATE_FORMAT(z.von,'%Y-%m-%d')='$datum' AND z.adresse='$adresse'"; $erg=$this->app->DB->Select($sql); if($erg<=0) $erg=0; return $erg; } function ZeitGesamtHeuteArbeit($adresse) { $sql = "SELECT SUM((TIMESTAMPDIFF(SECOND,z.von, z.bis))/3600) FROM `zeiterfassung` z WHERE z.art NOT LIKE 'Pause' AND DATE_FORMAT(z.von,'%Y-%m-%d')=DATE_FORMAT(NOW(),'%Y-%m-%d') AND z.adresse='$adresse'"; $erg=$this->app->DB->Select($sql); if($erg<=0) $erg=0; return $erg; } function ZeitGesamtArbeit($adresse,$datum) { $sql = "SELECT SUM((TIMESTAMPDIFF(SECOND,z.von, z.bis))/3600) FROM `zeiterfassung` z WHERE z.art NOT LIKE 'Pause' AND DATE_FORMAT(z.von,'%Y-%m-%d')=DATE_FORMAT('$datum','%Y-%m-%d') AND z.adresse='$adresse'"; $erg=$this->app->DB->Select($sql); if($erg<=0) $erg=0; return $erg; } function ZeitGesamtDatumPause($adresse,$datum) { $sql = "SELECT SUM((TIMESTAMPDIFF(SECOND,z.von, z.bis))/3600) FROM `zeiterfassung` z WHERE z.art LIKE 'Pause' AND DATE_FORMAT(z.von,'%Y-%m-%d')='$datum' AND z.adresse='$adresse'"; $erg=$this->app->DB->Select($sql); if($erg <=0) $erg=0; return $erg; } function ZeitGesamtHeutePause($adresse) { $sql = "SELECT SUM((TIMESTAMPDIFF(SECOND,z.von, z.bis))/3600) FROM `zeiterfassung` z WHERE z.art LIKE 'Pause' AND DATE_FORMAT(z.von,'%Y-%m-%d')=DATE_FORMAT(NOW(),'%Y-%m-%d') AND z.adresse='$adresse'"; $erg=$this->app->DB->Select($sql); if($erg <=0) $erg=0; return $erg; } function ZeitGesamtPause($adresse,$datum) { $sql = "SELECT SUM((TIMESTAMPDIFF(SECOND,z.von, z.bis))/3600) FROM `zeiterfassung` z WHERE z.art LIKE 'Pause' AND DATE_FORMAT(z.von,'%Y-%m-%d')=DATE_FORMAT('$datum','%Y-%m-%d') AND z.adresse='$adresse'"; $erg=$this->app->DB->Select($sql); if($erg <=0) $erg=0; return $erg; } function ZeitGesamtWocheIst($adresse,$jahr="",$kw="",$datum="") { if($datum!="") { $jahr = $this->app->DB->Select("SELECT DATE_FORMAT('$datum','%Y')"); $kw = $this->app->DB->Select("SELECT DATE_FORMAT('$datum','%u')"); } if($jahr=="") $jahr=date('Y'); if($kw=="") $kw=date('W'); $kw = str_pad($kw, 2, "0", STR_PAD_LEFT); $sql = "SELECT SUM((TIMESTAMPDIFF(SECOND,z.von, z.bis))/3600) FROM `zeiterfassung` z WHERE z.art NOT LIKE 'Pause' AND DATE_FORMAT(z.von,'%Y-%v')='".$jahr."-".$kw."' AND z.adresse='$adresse'"; $erg=$this->app->DB->Select($sql); if($erg <=0) $erg=0; return $erg; } function ZeitGesamtMonatIst($adresse,$jahr="",$monat="",$datum="") { if($datum!="") { $jahr = $this->app->DB->Select("SELECT DATE_FORMAT('$datum','%Y')"); $monat = $this->app->DB->Select("SELECT DATE_FORMAT('$datum','%m')"); } if($jahr=="") $jahr=date('Y'); if($monat=="") $monat=date('m'); $monat = str_pad($monat, 2, "0", STR_PAD_LEFT); $sql = "SELECT SUM((TIMESTAMPDIFF(SECOND,z.von, z.bis))/3600) FROM `zeiterfassung` z WHERE z.art NOT LIKE 'Pause' AND DATE_FORMAT(z.von,'%Y-%m')='".$jahr."-".$monat."' AND z.adresse='$adresse'"; $erg=$this->app->DB->Select($sql); if($erg <=0) $erg=0; return $erg; } function ZeitGesamtWocheSoll($adresse,$jahr="",$kw="",$datum="") { return $this->GetArbeitszeitWoche($adresse,$jahr,$kw,$datum); } function ZeitGesamtWocheOffen($adresse,$jahr="",$kw="",$datum="") { $ist=$this->ZeitGesamtWocheIst($adresse,$jahr,$kw,$datum); $soll=$this->ZeitGesamtWocheSoll($adresse,$jahr,$kw,$datum); return $soll-$ist; } function ZeitUrlaubOffen($adresse, $datum) { $monat = date('m', strtotime($datum)); $jahr = date('Y', strtotime($datum)); if($this->ModulVorhanden('zeiterfassung_stundenuebersicht')) { if(!$jahr || !$monat) { $monat = date('m', strtotime($datum)); $jahr = date('Y', strtotime($datum)); } $stundenprowoche = $this->app->DB->Select("SELECT stundenprowoche FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $ueberstundentoleranz = $this->app->DB->Select("SELECT ueberstundentoleranz FROM zeiterfassung_stundenuebersicht_jahre wHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $urlaubimjahr = $this->app->DB->Select("SELECT urlaubimjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $restueberstunden = $this->app->DB->Select("SELECT ueberstundenvorjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $resturlaub = $this->app->DB->Select("SELECT urlaubvorjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $restnotiz = $this->app->DB->Select("SELECT notizenvorjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); if($stundenprowoche == ""){ $stundenprowoche = 0; } if($ueberstundentoleranz == ""){ $ueberstundentoleranz = 0; } if($urlaubimjahr == ""){ $urlaubimjahr = 0; } if($restueberstunden == ""){ $restueberstunden = 0; } if($resturlaub == ""){ $resturlaub = 0; } $stundenausadresse = $this->app->DB->Select("SELECT arbeitszeitprowoche FROM adresse WHERE id='$adresse' AND id>0"); if($stundenprowoche <=0 && $stundenausadresse >0) $stundenprowoche = $stundenausadresse; $this->app->Tpl->Set("STUNDENWOCHE", $stundenprowoche); $this->app->Tpl->Set("TOLERANZ", $ueberstundentoleranz); $this->app->Tpl->Set("URLAUBJAHR", $urlaubimjahr); $this->app->Tpl->Set("RESTUEBERSTUNDEN", $restueberstunden); $this->app->Tpl->Set("RESTURLAUB", $resturlaub); $this->app->Tpl->Set("RESTNOTIZ", $restnotiz); $gesamtsummesoll = $this->app->DB->Select("SELECT SUM(soll) FROM zeiterfassung_stundenuebersicht WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); for($i = 1; $i<13; $i++){ //IST $sql = "SELECT SUM((TIMESTAMPDIFF(SECOND,z.von, z.bis))/3600) FROM `zeiterfassung` z WHERE z.art NOT LIKE 'Pause' AND DATE_FORMAT(z.von,'%Y-%m')='".$jahr."-".($i < 10?'0':'').$i."' AND z.adresse='$adresse'"; $aist2[$i] = $this->app->DB->Select($sql); if($aist2[$i] <= 0){ $aist2[$i] = 0; } $aist2[$i] = number_format($aist2[$i], 2, '.', ''); if($gesamtsummesoll != 0){ //SOLL $asoll2[$i] = $this->app->DB->Select("SELECT soll FROM zeiterfassung_stundenuebersicht WHERE adresse = \"$adresse\" AND monat = \"$i\" AND jahr = \"$jahr\""); $asoll2[$i] = number_format($asoll2[$i], 2, '.', ''); }else{ if($stundenprowoche != ""){ $asoll2[$i] = $this->app->erp->AnzahlWerktageMonat($jahr."-".str_pad($i, 2, "0", STR_PAD_LEFT)."-"."1")*$stundenprowoche/5; //NOCH IN DIE DATENBANK SPEICHERN $asoll2[$i] = number_format($asoll2[$i], 2, '.', ''); }else{ $asoll2[$i] = 0.00; } } //EINGELÖSTE ÜBERSTUNDEN $aueberstunden2[$i] = $this->app->DB->Select("SELECT ueberstunden_eingeloest FROM zeiterfassung_stundenuebersicht WHERE adresse = \"$adresse\" AND monat = \"$i\" AND jahr = \"$jahr\""); $aueberstunden2[$i] = number_format($aueberstunden2[$i], 2, '.', ''); //EINGELÖSTER URLAUB $aurlaub2[$i] = $this->app->DB->Select("SELECT urlaub_eingeloest FROM zeiterfassung_stundenuebersicht WHERE adresse = \"$adresse\" AND monat = \"$i\" AND jahr = \"$jahr\""); $aurlaub2[$i] = number_format($aurlaub2[$i], 2, '.', ''); //NOTIZEN $anotizen2[$i] = $this->app->DB->Select("SELECT notizen FROM zeiterfassung_stundenuebersicht WHERE adresse = \"$adresse\" AND monat = \"$i\" AND jahr = \"$jahr\""); if($aist2[$i] == 0){ $differenz_stunden2[$i] = -$asoll2[$i]; }else{ $differenz_stunden2[$i] = $aist2[$i] - $asoll2[$i]; } $differenz_stunden2[$i] = number_format($differenz_stunden2[$i], 2, '.', ''); if($aist2[$i] == 0){ $stunden_minus_toleranz2[$i] = -$asoll2[$i]; }else{ if($differenz_stunden2[$i] <= $ueberstundentoleranz){ $stunden_minus_toleranz2[$i] = 0; }else{ $stunden_minus_toleranz2[$i] = $differenz_stunden2[$i] - $ueberstundentoleranz; } } $stunden_minus_toleranz2[$i] = number_format($stunden_minus_toleranz2[$i], 2, '.', ''); { if($i == 1){ $ueberstunden_aktuell2[$i] = $restueberstunden; $ueberstunden_aktuell2[0] = $restueberstunden; } if($stunden_minus_toleranz2[$i] > 0.00){ //$ueberstunden_aktuell2[$i] += $stunden_minus_toleranz2[$i]; } //if($aueberstunden2[$i] != "" && $aueberstunden2[$i] > 0.00){ if($aist2[$i]>0.00){ $ueberstunden_aktuell2[$i] = $ueberstunden_aktuell2[$i-1] - $aueberstunden2[$i] + $stunden_minus_toleranz2[$i]; }else{ if($stunden_minus_toleranz2[$i]>0.00){ $ueberstunden_aktuell2[$i] = $ueberstunden_aktuell2[$i-1] - $aueberstunden2[$i] - $asoll2[$i] + $stunden_minus_toleranz2[$i]; }else{ $ueberstunden_aktuell2[$i] = $ueberstunden_aktuell2[$i-1] - $aueberstunden2[$i] - $asoll2[$i]; } } } $ueberstunden_aktuell2[$i] = number_format($ueberstunden_aktuell2[$i], 2, '.', ''); if($i == 1){ $urlaub_aktuell2[0] = $resturlaub + $urlaubimjahr; } $urlaub_aktuell2[$i] = $urlaub_aktuell2[$i-1] - $aurlaub2[$i]; $urlaub_aktuell2[$i] = number_format($urlaub_aktuell2[$i], 2, '.', ''); if($i == (int)$monat)return $urlaub_aktuell2[$i]; } } return 0; } function ZeitUrlaubGenommen($adresse, $datum) { if($this->ModulVorhanden('zeiterfassung_stundenuebersicht')) { if(!$jahr || !$monat) { $monat = date('m', strtotime($datum)); $jahr = date('Y', strtotime($datum)); } $stundenprowoche = $this->app->DB->Select("SELECT stundenprowoche FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $ueberstundentoleranz = $this->app->DB->Select("SELECT ueberstundentoleranz FROM zeiterfassung_stundenuebersicht_jahre wHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $urlaubimjahr = $this->app->DB->Select("SELECT urlaubimjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $restueberstunden = $this->app->DB->Select("SELECT ueberstundenvorjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $resturlaub = $this->app->DB->Select("SELECT urlaubvorjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $restnotiz = $this->app->DB->Select("SELECT notizenvorjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); if($stundenprowoche == ""){ $stundenprowoche = 0; } if($ueberstundentoleranz == ""){ $ueberstundentoleranz = 0; } if($urlaubimjahr == ""){ $urlaubimjahr = 0; } if($restueberstunden == ""){ $restueberstunden = 0; } if($resturlaub == ""){ $resturlaub = 0; } $stundenausadresse = $this->app->DB->Select("SELECT arbeitszeitprowoche FROM adresse WHERE id='$adresse' AND id>0"); if($stundenprowoche <=0 && $stundenausadresse >0) $stundenprowoche = $stundenausadresse; $this->app->Tpl->Set("STUNDENWOCHE", $stundenprowoche); $this->app->Tpl->Set("TOLERANZ", $ueberstundentoleranz); $this->app->Tpl->Set("URLAUBJAHR", $urlaubimjahr); $this->app->Tpl->Set("RESTUEBERSTUNDEN", $restueberstunden); $this->app->Tpl->Set("RESTURLAUB", $resturlaub); $this->app->Tpl->Set("RESTNOTIZ", $restnotiz); $gesamtsummesoll = $this->app->DB->Select("SELECT SUM(soll) FROM zeiterfassung_stundenuebersicht WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $eingeloest = 0; for($i = 1; $i<13; $i++){ //IST $sql = "SELECT SUM((TIMESTAMPDIFF(SECOND,z.von, z.bis))/3600) FROM `zeiterfassung` z WHERE z.art NOT LIKE 'Pause' AND DATE_FORMAT(z.von,'%Y-%m')='".$jahr."-".($i < 10?'0':'').$i."' AND z.adresse='$adresse'"; $aist2[$i] = $this->app->DB->Select($sql); if($aist2[$i] <= 0){ $aist2[$i] = 0; } $aist2[$i] = number_format($aist2[$i], 2, '.', ''); if($gesamtsummesoll != 0){ //SOLL $asoll2[$i] = $this->app->DB->Select("SELECT soll FROM zeiterfassung_stundenuebersicht WHERE adresse = \"$adresse\" AND monat = \"$i\" AND jahr = \"$jahr\""); $asoll2[$i] = number_format($asoll2[$i], 2, '.', ''); }else{ if($stundenprowoche != ""){ $asoll2[$i] = $this->app->erp->AnzahlWerktageMonat($jahr."-".str_pad($i, 2, "0", STR_PAD_LEFT)."-"."1")*$stundenprowoche/5; //NOCH IN DIE DATENBANK SPEICHERN $asoll2[$i] = number_format($asoll2[$i], 2, '.', ''); }else{ $asoll2[$i] = 0.00; } } //EINGELÖSTE ÜBERSTUNDEN $aueberstunden2[$i] = $this->app->DB->Select("SELECT ueberstunden_eingeloest FROM zeiterfassung_stundenuebersicht WHERE adresse = \"$adresse\" AND monat = \"$i\" AND jahr = \"$jahr\""); $aueberstunden2[$i] = number_format($aueberstunden2[$i], 2, '.', ''); //EINGELÖSTER URLAUB $aurlaub2[$i] = $this->app->DB->Select("SELECT urlaub_eingeloest FROM zeiterfassung_stundenuebersicht WHERE adresse = \"$adresse\" AND monat = \"$i\" AND jahr = \"$jahr\""); $aurlaub2[$i] = number_format($aurlaub2[$i], 2, '.', ''); $eingeloest += $aurlaub2[$i]; //NOTIZEN $anotizen2[$i] = $this->app->DB->Select("SELECT notizen FROM zeiterfassung_stundenuebersicht WHERE adresse = \"$adresse\" AND monat = \"$i\" AND jahr = \"$jahr\""); if($aist2[$i] == 0){ $differenz_stunden2[$i] = -$asoll2[$i]; }else{ $differenz_stunden2[$i] = $aist2[$i] - $asoll2[$i]; } $differenz_stunden2[$i] = number_format($differenz_stunden2[$i], 2, '.', ''); if($aist2[$i] == 0){ $stunden_minus_toleranz2[$i] = -$asoll2[$i]; }else{ if($differenz_stunden2[$i] <= $ueberstundentoleranz){ $stunden_minus_toleranz2[$i] = 0; }else{ $stunden_minus_toleranz2[$i] = $differenz_stunden2[$i] - $ueberstundentoleranz; } } $stunden_minus_toleranz2[$i] = number_format($stunden_minus_toleranz2[$i], 2, '.', ''); { if($i == 1){ $ueberstunden_aktuell2[$i] = $restueberstunden; $ueberstunden_aktuell2[0] = $restueberstunden; } if($stunden_minus_toleranz2[$i] > 0.00){ //$ueberstunden_aktuell2[$i] += $stunden_minus_toleranz2[$i]; } //if($aueberstunden2[$i] != "" && $aueberstunden2[$i] > 0.00){ if($aist2[$i]>0.00){ $ueberstunden_aktuell2[$i] = $ueberstunden_aktuell2[$i-1] - $aueberstunden2[$i] + $stunden_minus_toleranz2[$i]; }else{ if($stunden_minus_toleranz2[$i]>0.00){ $ueberstunden_aktuell2[$i] = $ueberstunden_aktuell2[$i-1] - $aueberstunden2[$i] - $asoll2[$i] + $stunden_minus_toleranz2[$i]; }else{ $ueberstunden_aktuell2[$i] = $ueberstunden_aktuell2[$i-1] - $aueberstunden2[$i] - $asoll2[$i]; } } } $ueberstunden_aktuell2[$i] = number_format($ueberstunden_aktuell2[$i], 2, '.', ''); if($i == 1){ $urlaub_aktuell2[0] = $resturlaub + $urlaubimjahr; } $urlaub_aktuell2[$i] = $urlaub_aktuell2[$i-1] - $aurlaub2[$i]; $urlaub_aktuell2[$i] = number_format($urlaub_aktuell2[$i], 2, '.', ''); if($i == (int)$monat)return $eingeloest; } } return 0; } function ZeitGesamtMonatSoll($adresse, $jahr = "", $monat = "",$datum="") { if($datum!="") { $jahr = $this->app->DB->Select("SELECT DATE_FORMAT('$datum','%Y')"); $monat = $this->app->DB->Select("SELECT DATE_FORMAT('$datum','%m')"); } if($this->ModulVorhanden('mitarbeiterzeiterfassung') && $this->app->DB->Select("SELECT id FROM mitarbeiterzeiterfassung_einstellungen WHERE adresse = '$adresse' LIMIT 1")) { if(!$jahr || !$monat) { $urlaubkrankheitsstunden = (float)$this->app->DB->Select("SELECT sum(minuten)/60 FROM mitarbeiterzeiterfassung_sollstunden WHERE adresse = '$adresse' AND month(datum) = month(now()) and year(datum) = year(now()) AND (instr(kuerzel,'U') OR instr(kuerzel,'K'))"); $urlaubkrankheitsstunden += (float)$this->app->DB->Select("SELECT sum(ms.minuten)/60 FROM mitarbeiterzeiterfassung_sollstunden ms INNER JOIN (SELECT distinct datum FROM arbeitsfreietage) a ON a.datum = ms.datum WHERE ms.adresse = '$adresse' AND month(ms.datum) = month(now()) and year(ms.datum) = year(now()) AND NOT (instr(ms.kuerzel,'U') OR instr(ms.kuerzel,'K'))"); $mitarbeiterzeiterfassung_sollstunden = $this->app->DB->Select("SELECT sum(minuten) / 60 as wochenstunden FROM mitarbeiterzeiterfassung_sollstunden WHERE adresse = '$adresse' AND month(datum) = month(now()) and year(datum) = year(now())"); if($mitarbeiterzeiterfassung_sollstunden)return $mitarbeiterzeiterfassung_sollstunden-$urlaubkrankheitsstunden; }else{ $urlaubkrankheitsstunden = (float)$this->app->DB->Select("SELECT sum(minuten)/60 FROM mitarbeiterzeiterfassung_sollstunden WHERE adresse = '$adresse' AND month(datum) = $monat and year(datum) = $jahr AND (instr(kuerzel,'U') OR instr(kuerzel,'K'))"); $urlaubkrankheitsstunden += (float)$this->app->DB->Select("SELECT sum(ms.minuten)/60 FROM mitarbeiterzeiterfassung_sollstunden ms INNER JOIN (SELECT distinct datum FROM arbeitsfreietage) a ON a.datum = ms.datum WHERE ms.adresse = '$adresse' AND month(ms.datum) = $monat and year(ms.datum) = $jahr AND NOT (instr(ms.kuerzel,'U') OR instr(ms.kuerzel,'K'))"); $mitarbeiterzeiterfassung_sollstunden = $this->app->DB->Select("SELECT sum(minuten) / 60 as wochenstunden FROM mitarbeiterzeiterfassung_sollstunden WHERE adresse = '$adresse' AND month(datum) = $monat and year(datum) = $jahr"); if($mitarbeiterzeiterfassung_sollstunden)return $mitarbeiterzeiterfassung_sollstunden-$urlaubkrankheitsstunden; } }elseif($this->ModulVorhanden('zeiterfassung_stundenuebersicht')) { if(!$jahr || !$monat) { $monat = date('m', strtotime($datum)); $jahr = date('Y', strtotime($datum)); } $stundenprowoche = $this->app->DB->Select("SELECT stundenprowoche FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $ueberstundentoleranz = $this->app->DB->Select("SELECT ueberstundentoleranz FROM zeiterfassung_stundenuebersicht_jahre wHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $urlaubimjahr = $this->app->DB->Select("SELECT urlaubimjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $restueberstunden = $this->app->DB->Select("SELECT ueberstundenvorjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $resturlaub = $this->app->DB->Select("SELECT urlaubvorjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $restnotiz = $this->app->DB->Select("SELECT notizenvorjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); if($stundenprowoche == ""){ $stundenprowoche = 0; } if($ueberstundentoleranz == ""){ $ueberstundentoleranz = 0; } if($urlaubimjahr == ""){ $urlaubimjahr = 0; } if($restueberstunden == ""){ $restueberstunden = 0; } if($resturlaub == ""){ $resturlaub = 0; } $stundenausadresse = $this->app->DB->Select("SELECT arbeitszeitprowoche FROM adresse WHERE id='$adresse' AND id>0"); if($stundenprowoche <=0 && $stundenausadresse >0) $stundenprowoche = $stundenausadresse; $gesamtsummesoll = $this->app->DB->Select("SELECT SUM(soll) FROM zeiterfassung_stundenuebersicht WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); if($gesamtsummesoll != 0){ $asoll2 = $this->app->DB->Select("SELECT soll FROM zeiterfassung_stundenuebersicht WHERE adresse = \"$adresse\" AND monat = \"$monat\" AND jahr = \"$jahr\""); return number_format($asoll2, 2, '.', ''); } if($stundenprowoche != ""){ $asoll2 = $this->app->erp->AnzahlWerktageMonat($jahr."-".str_pad($monat, 2, "0", STR_PAD_LEFT)."-"."1")*$stundenprowoche/5; return number_format($asoll2, 2, '.', ''); } return 0.00; } return $this->AnzahlWerktageMonat()*$this->ZeitGesamtWocheSoll($adresse)/5; } function GetArbeitszeitTag($adresse,$datum="") { if($datum!="") { $jahr = $this->app->DB->Select("SELECT DATE_FORMAT('$datum','%Y')"); $kw = $this->app->DB->Select("SELECT DATE_FORMAT('$datum','%u')"); } if($this->ModulVorhanden('mitarbeiterzeiterfassung')) { if($datum!="") { $urlaubkrankheitsstunden = (float)$this->app->DB->Select("SELECT sum(minuten)/60 FROM mitarbeiterzeiterfassung_sollstunden WHERE adresse = '$adresse' AND datum = '$datum' AND (instr(kuerzel,'U') OR instr(kuerzel,'K'))"); $urlaubkrankheitsstunden += (float)$this->app->DB->Select("SELECT sum(ms.minuten)/60 FROM mitarbeiterzeiterfassung_sollstunden ms INNER JOIN (SELECT distinct datum FROM arbeitsfreietage) a ON a.datum = ms.datum WHERE ms.adresse = '$adresse' AND datum='$datum' AND not (instr(ms.kuerzel,'U') OR instr(ms.kuerzel,'K'))"); $mitarbeiterzeiterfassung_sollstunden = $this->app->DB->Select("SELECT sum(minuten) / 60 as wochenstunden FROM mitarbeiterzeiterfassung_sollstunden WHERE adresse = '$adresse' AND datum='$datum'"); if($mitarbeiterzeiterfassung_sollstunden)return $mitarbeiterzeiterfassung_sollstunden-$urlaubkrankheitsstunden; }else{ $urlaubkrankheitsstunden = (float)$this->app->DB->Select("SELECT sum(minuten)/60 FROM mitarbeiterzeiterfassung_sollstunden WHERE adresse = '$adresse' AND datum='$datum' AND (instr(kuerzel,'U') OR instr(kuerzel,'K'))"); $urlaubkrankheitsstunden += (float)$this->app->DB->Select("SELECT sum(ms.minuten)/60 FROM mitarbeiterzeiterfassung_sollstunden ms INNER JOIN (SELECT distinct datum FROM arbeitsfreietage) a ON a.datum = ms.datum WHERE ms.adresse = '$adresse' AND datum='$datum' AND not (instr(ms.kuerzel,'U') OR instr(ms.kuerzel,'K'))"); $mitarbeiterzeiterfassung_sollstunden = $this->app->DB->Select("SELECT sum(minuten) / 60 as wochenstunden FROM mitarbeiterzeiterfassung_sollstunden WHERE adresse = '$adresse' AND datum='$datum'"); if($mitarbeiterzeiterfassung_sollstunden)return $mitarbeiterzeiterfassung_sollstunden-$urlaubkrankheitsstunden; } }elseif($this->ModulVorhanden('zeiterfassung_stundenuebersicht')) { if(!$jahr || !$monat) { $monat = date('m', strtotime($datum)); $jahr = date('Y', strtotime($datum)); } $stundenprowoche = $this->app->DB->Select("SELECT stundenprowoche/5 FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $ueberstundentoleranz = $this->app->DB->Select("SELECT ueberstundentoleranz FROM zeiterfassung_stundenuebersicht_jahre wHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $urlaubimjahr = $this->app->DB->Select("SELECT urlaubimjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $restueberstunden = $this->app->DB->Select("SELECT ueberstundenvorjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $resturlaub = $this->app->DB->Select("SELECT urlaubvorjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $restnotiz = $this->app->DB->Select("SELECT notizenvorjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); if($stundenprowoche == ""){ $stundenprowoche = 0; } if($ueberstundentoleranz == ""){ $ueberstundentoleranz = 0; } if($urlaubimjahr == ""){ $urlaubimjahr = 0; } if($restueberstunden == ""){ $restueberstunden = 0; } if($resturlaub == ""){ $resturlaub = 0; } $stundenausadresse = $this->app->DB->Select("SELECT arbeitszeitprowoche/5 FROM adresse WHERE id='$adresse' AND id>0"); if($stundenprowoche <=0 && $stundenausadresse >0) $stundenprowoche = $stundenausadresse; return $stundenprowoche; } $arbeitszeitprowoche = $this->app->DB->Select("SELECT arbeitszeitprowoche/5 FROM adresse WHERE id='$adresse' LIMIT 1"); if($arbeitszeitprowoche<=0 || !is_numeric($arbeitszeitprowoche)) { return 0; } return $arbeitszeitprowoche; } function GetArbeitszeitWoche($adresse,$jahr,$kw,$datum="") { if($datum!="") { $jahr = $this->app->DB->Select("SELECT DATE_FORMAT('$datum','%Y')"); $kw = $this->app->DB->Select("SELECT DATE_FORMAT('$datum','%u')"); } if($this->ModulVorhanden('mitarbeiterzeiterfassung')) { if(!$jahr || !$kw) { $urlaubkrankheitsstunden = (float)$this->app->DB->Select("SELECT sum(minuten)/60 FROM mitarbeiterzeiterfassung_sollstunden WHERE adresse = '$adresse' AND week(datum,3) = week(now(),3) and year(datum) = year(now()) AND (instr(kuerzel,'U') OR instr(kuerzel,'K'))"); $urlaubkrankheitsstunden += (float)$this->app->DB->Select("SELECT sum(ms.minuten)/60 FROM mitarbeiterzeiterfassung_sollstunden ms INNER JOIN (SELECT distinct datum FROM arbeitsfreietage) a ON a.datum = ms.datum WHERE ms.adresse = '$adresse' AND week(ms.datum,3) = week(now(),3) and year(ms.datum) = year(now()) AND not (instr(ms.kuerzel,'U') OR instr(ms.kuerzel,'K'))"); $mitarbeiterzeiterfassung_sollstunden = $this->app->DB->Select("SELECT sum(minuten) / 60 as wochenstunden FROM mitarbeiterzeiterfassung_sollstunden WHERE adresse = '$adresse' AND week(datum,3) = week(now(),3) and year(datum) = year(now())"); if($mitarbeiterzeiterfassung_sollstunden)return $mitarbeiterzeiterfassung_sollstunden-$urlaubkrankheitsstunden; }else{ $urlaubkrankheitsstunden = (float)$this->app->DB->Select("SELECT sum(minuten)/60 FROM mitarbeiterzeiterfassung_sollstunden WHERE adresse = '$adresse' AND week(datum,3) = $kw and year(datum) = $jahr AND (instr(kuerzel,'U') OR instr(kuerzel,'K'))"); $urlaubkrankheitsstunden += (float)$this->app->DB->Select("SELECT sum(ms.minuten)/60 FROM mitarbeiterzeiterfassung_sollstunden ms INNER JOIN (SELECT distinct datum FROM arbeitsfreietage) a ON a.datum = ms.datum WHERE ms.adresse = '$adresse' AND week(ms.datum,3) = $kw and year(ms.datum) = $jahr AND not (instr(ms.kuerzel,'U') OR instr(ms.kuerzel,'K'))"); $mitarbeiterzeiterfassung_sollstunden = $this->app->DB->Select("SELECT sum(minuten) / 60 as wochenstunden FROM mitarbeiterzeiterfassung_sollstunden WHERE adresse = '$adresse' AND week(datum,3) = $kw and year(datum) = $jahr"); if($mitarbeiterzeiterfassung_sollstunden)return $mitarbeiterzeiterfassung_sollstunden-$urlaubkrankheitsstunden; } }elseif($this->ModulVorhanden('zeiterfassung_stundenuebersicht')) { if(!$jahr || !$monat) { $monat = date('m', strtotime($datum)); $jahr = date('Y', strtotime($datum)); } $stundenprowoche = $this->app->DB->Select("SELECT stundenprowoche FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $ueberstundentoleranz = $this->app->DB->Select("SELECT ueberstundentoleranz FROM zeiterfassung_stundenuebersicht_jahre wHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $urlaubimjahr = $this->app->DB->Select("SELECT urlaubimjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $restueberstunden = $this->app->DB->Select("SELECT ueberstundenvorjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $resturlaub = $this->app->DB->Select("SELECT urlaubvorjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); $restnotiz = $this->app->DB->Select("SELECT notizenvorjahr FROM zeiterfassung_stundenuebersicht_jahre WHERE adresse = \"$adresse\" AND jahr = \"$jahr\""); if($stundenprowoche == ""){ $stundenprowoche = 0; } if($ueberstundentoleranz == ""){ $ueberstundentoleranz = 0; } if($urlaubimjahr == ""){ $urlaubimjahr = 0; } if($restueberstunden == ""){ $restueberstunden = 0; } if($resturlaub == ""){ $resturlaub = 0; } $stundenausadresse = $this->app->DB->Select("SELECT arbeitszeitprowoche FROM adresse WHERE id='$adresse' AND id>0"); if($stundenprowoche <=0 && $stundenausadresse >0) $stundenprowoche = $stundenausadresse; return $stundenprowoche; } $arbeitszeitprowoche = $this->app->DB->Select("SELECT arbeitszeitprowoche FROM adresse WHERE id='$adresse' LIMIT 1"); if($arbeitszeitprowoche<=0 || !is_numeric($arbeitszeitprowoche)) { return 0; } return $arbeitszeitprowoche; } function AddArbeitsnachweisPositionZeiterfassung($arbeitsnachweis,$zid) { $tmp = $this->app->DB->SelectArr("SELECT *,DATE_FORMAT(von,'%Y-%m-%d') as datum,DATE_FORMAT(von,'%H:%i') as von,DATE_FORMAT(bis,'%H:%i') as bis FROM zeiterfassung WHERE id='$zid'"); $sort = $this->app->DB->Select("SELECT MAX(sort) FROM arbeitsnachweis_position WHERE arbeitsnachweis='$arbeitsnachweis' LIMIT 1"); $sort = $sort + 1; $adresse = $tmp[0]['adresse']; //mitarbeiter $bezeichnung = $tmp[0]['aufgabe']; $beschreibung = $tmp[0]['beschreibung']; $ort = $tmp[0]['ort']; $arbeitspaket =$tmp[0]['arbeitspaket']; $datum = $tmp[0]['datum']; $von=$tmp[0]['von']; $bis=$tmp[0]['bis']; $this->app->DB->Insert("INSERT INTO arbeitsnachweis_position (id,arbeitsnachweis,artikel,bezeichnung,beschreibung,ort,arbeitspaket,datum,von,bis,sort,status,projekt,adresse) VALUES ('','$arbeitsnachweis','$artikel','$bezeichnung','$beschreibung','$ort','$arbeitspaket','$datum','$von','$bis','$sort','angelegt','$projekt','$adresse')"); $tmpid = $this->app->DB->GetInsertID(); //markieren als erledigt $this->app->DB->Update("UPDATE zeiterfassung SET arbeitsnachweis='$arbeitsnachweis',arbeitsnachweispositionid='$tmpid' WHERE id='$zid'"); } function CreateAufgabe($adresse,$aufgabe,$kunde=0) { $this->app->DB->Insert("INSERT INTO aufgabe (id,adresse,initiator,aufgabe,status,kunde) VALUES ('','$adresse','".$this->app->User->GetAdresse()."','$aufgabe','offen','$kunde')"); return $this->app->DB->GetInsertID(); } function AbschlussAufgabe($id) { // einmalig immer weg $intervall_tage = $this->app->DB->Select("SELECT intervall_tage FROM aufgabe WHERE id='$id'"); $startdatum = $this->app->DB->Select("SELECT abgabe_bis FROM aufgabe WHERE id='$id'"); $check = $this->app->DB->Select("SELECT id FROM aufgabe WHERE id='$id' AND ((abgabe_bis <= NOW() AND intervall_tage > 0) OR intervall_tage=0)"); if($check<=0) return -1; switch($intervall_tage) { case 1: //taeglich $newaufgabe = $this->CopyAufgabe($id); $newstartdatum =date('Y-m-d H:i:s', strtotime("$startdatum +1 days")); $this->app->DB->Update("UPDATE aufgabe SET abgabe_bis='$newstartdatum' WHERE id='$newaufgabe'"); break; case 2: //wochen $newaufgabe = $this->CopyAufgabe($id); $newstartdatum =date('Y-m-d H:i:s', strtotime("$startdatum +7 days")); $this->app->DB->Update("UPDATE aufgabe SET abgabe_bis='$newstartdatum' WHERE id='$newaufgabe'"); break; case 3: //monatlich $newaufgabe = $this->CopyAufgabe($id); $newstartdatum =date('Y-m-d H:i:s', strtotime("$startdatum +1 month")); $this->app->DB->Update("UPDATE aufgabe SET abgabe_bis='$newstartdatum' WHERE id='$newaufgabe'"); break; case 4: // jaehrlich $newaufgabe = $this->CopyAufgabe($id); $newstartdatum =date('Y-m-d H:i:s', strtotime("$startdatum +1 year")); $this->app->DB->Update("UPDATE aufgabe SET abgabe_bis='$newstartdatum' WHERE id='$newaufgabe'"); break; } // aufgaben kopieren und dann wenn intervall_tage 2 = woechen 3 monatlich 4 jaehrlich // alles kopieren 1:1 neue hat mit dem datum von turnus +1 tag + 7 Tage oder monatlich immer wieder dann rein // ab taeglich kann man nur abschliessen abgabe_bis <= heute ist $this->app->DB->Update("UPDATE aufgabe SET status='abgeschlossen',abgeschlossen_am=NOW() WHERE id='$id' LIMIT 1"); return 1; } function CopyAufgabe($id) { return $this->app->DB->MysqlCopyRow("aufgabe","id",$id); } function CreateRetoure($adresse="") { $projekt = $this->GetCreateProjekt($adresse); $standardlager = $this->app->DB->Select("SELECT l.id FROM projekt p INNER JOIN lager l ON p.standardlager = l.id WHERE p.id = '$projekt' LIMIT 1"); $belegmax = ""; $ohnebriefpapier = $this->Firmendaten("retoure_ohnebriefpapier"); $this->app->DB->Insert("INSERT INTO retoure (id,datum,bearbeiter,firma,belegnr,adresse,ohne_briefpapier,projekt) VALUES ('',NOW(),'".$this->app->User->GetName()."','".$this->app->User->GetFirma()."','$belegmax','$adresse','".$ohnebriefpapier."','".$projekt."')"); $id = $this->app->DB->GetInsertID(); $this->app->DB->Update("UPDATE retoure SET liefername = '".$this->app->DB->real_escape_string($this->Firmendaten('name'))."' , lieferstrasse = '".$this->app->DB->real_escape_string($this->Firmendaten('strasse'))."' , lieferort = '".$this->app->DB->real_escape_string($this->Firmendaten('ort'))."' , lieferplz = '".$this->app->DB->real_escape_string($this->Firmendaten('plz'))."' , lieferland = '".$this->app->DB->real_escape_string($this->Firmendaten('land'))."' , abweichendelieferadresse = 1 WHERE id = '$id' LIMIT 1"); if(!$id)die($this->app->DB->error()); if($standardlager)$this->app->DB->Update("UPDATE retoure SET standardlager = '$standardlager' WHERE id = '$id' LIMIT 1"); $type="retoure"; $this->app->erp->ObjektProtokoll($type,$id,$type."_create",ucfirst($type)." angelegt"); $this->SchnellFreigabe($type,$id); $this->EventAPIAdd("EventREtoureCreate",$id,"retoure","create"); return $id; } function CreateLieferschein($adresse="") { $obj = $this->LoadModul('lieferschein'); if(!empty($obj) && method_exists($obj, 'CreateLieferschein')){ return $obj->CreateLieferschein($adresse); } } function AddLieferscheinPositionArtikelID($lieferschein, $artikel,$menge,$bezeichnung,$beschreibung,$datum) { $obj = $this->LoadModul('lieferschein'); if(!empty($obj) && method_exists($obj, 'AddLieferscheinPositionArtikelID')){ $obj->AddLieferscheinPositionArtikelID($lieferschein, $artikel,$menge,$bezeichnung,$beschreibung,$datum); } } function AddLieferscheinPosition($lieferschein, $verkauf,$menge,$datum) { $obj = $this->LoadModul('lieferschein'); if(!empty($obj) && method_exists($obj, 'AddLieferscheinPosition')){ $obj->AddLieferscheinPosition($lieferschein, $verkauf,$menge,$datum); } } function DeleteAnfrage($id) { $this->app->DB->Delete("DELETE FROM anfrage_position WHERE anfrage='$id'"); $this->app->DB->Delete("DELETE FROM anfrage_protokoll WHERE anfrage='$id'"); $this->app->DB->Delete("DELETE FROM anfrage WHERE id='$id' LIMIT 1"); } function DeletePreisanfrage($id) { /** @var Preisanfrage $obj */ $obj = $this->app->erp->LoadModul('preisanfrage'); if(!empty($obj) && method_exists($obj,'DeletePreisanfrage')) { $obj->DeletePreisanfrage($id); } } function DeleteProformarechnung($id) { $this->app->DB->Delete("DELETE FROM proformarechnung_lieferschein WHERE proformarechnung='$id'"); $this->app->DB->Delete("DELETE FROM proformarechnung_position WHERE proformarechnung='$id'"); $this->app->DB->Delete("DELETE FROM proformarechnung_protokoll WHERE proformarechnung='$id'"); $this->app->DB->Delete("DELETE FROM proformarechnung WHERE id='$id' LIMIT 1"); } function DeleteInventur($id) { /** @var Inventur $obj */ $obj = $this->LoadModul('inventur'); if(!empty($obj) && method_exists($obj, 'DeleteInventur')) { $obj->DeleteInventur($id); } } function DeleteKalkulation($id) { $this->app->DB->Delete("DELETE FROM kalkulation_position WHERE kalkulation='$id'"); $this->app->DB->Delete("DELETE FROM kalkulation_protokoll WHERE kalkulation='$id'"); $this->app->DB->Delete("DELETE FROM kalkulation WHERE id='$id' LIMIT 1"); } function DeleteReisekosten($id) { /** @var Reisekosten $obj */ $obj = $this->LoadModul('reisekosten'); if(!empty($obj) && method_exists($obj, 'DeleteReisekosten')) { $obj->DeleteReisekosten($id); } } function DeleteArbeitsnachweis($id) { /** @var Arbeitsnachweis $obj */ $obj = $this->app->erp->LoadModul('arbeitsnachweis'); if(!empty($obj) && method_exists($obj, 'DeleteArbeitsnachweis')) { $obj->DeleteArbeitsnachweis($id); } } function DeleteRetoure($id) { $this->app->DB->Delete("DELETE FROM retoure_position WHERE retoure='$id'"); $this->app->DB->Delete("DELETE FROM retoure_protokoll WHERE retoure='$id'"); $this->app->DB->Delete("DELETE FROM retoure WHERE id='$id' LIMIT 1"); } function DeleteLieferschein($id) { $obj = $this->LoadModul('lieferschein'); if(!empty($obj) && method_exists($obj, 'DeleteLieferschein')){ $obj->DeleteLieferschein($id); } } function CreateAuftrag($adresse="") { $ohnebriefpapier = $this->Firmendaten("auftrag_ohnebriefpapier"); $belegmax = ""; $projekt = $this->GetCreateProjekt($adresse); $standardlager = $this->app->DB->Select("SELECT standardlager FROM projekt WHERE id = '$projekt' LIMIT 1"); $firma = $this->app->DB->Select("SELECT MAX(f.id) FROM firma f INNER JOIN firmendaten fd ON f.id = fd.firma LIMIT 1"); if(!$firma)$firma = $this->app->DB->Select("SELECT max(id) FROM firma LIMIT 1"); if(!$firma)$firma = $this->app->DB->Select("SELECT MAX(id) FROM firma LIMIT 1"); if($this->StandardZahlungsweise($projekt)=="rechnung") { $this->app->DB->Insert("INSERT INTO auftrag (id,datum,bearbeiter,firma,belegnr,autoversand,zahlungsweise,zahlungszieltage, zahlungszieltageskonto,zahlungszielskonto,status,projekt,adresse,ohne_briefpapier) VALUES ('',NOW(),'','','$belegmax',1,'".$this->StandardZahlungsweise($projekt)."', '".$this->ZahlungsZielTage($projekt)."', '".$this->ZahlungsZielTageSkonto($projekt)."', '".$this->ZahlungsZielSkonto($projekt)."', 'angelegt','$projekt','$adresse','".$ohnebriefpapier."')"); } else { $this->app->DB->Insert("INSERT INTO auftrag (id,datum,bearbeiter,firma,belegnr,autoversand,zahlungsweise,zahlungszieltage, zahlungszieltageskonto,zahlungszielskonto,status,projekt,adresse,ohne_briefpapier) VALUES ('',NOW(),'','','$belegmax',1,'".$this->StandardZahlungsweise($projekt)."', '0', '0', '0', 'angelegt','$projekt','$adresse','".$ohnebriefpapier."')"); } $id = $this->app->DB->GetInsertID(); if($standardlager)$this->app->DB->Update("UPDATE auftrag SET standardlager = '$standardlager' WHERE id = '$id' LIMIT 1"); $this->CheckVertrieb($id,"auftrag"); $this->CheckBearbeiter($id,"auftrag"); $type="auftrag"; $this->app->erp->ObjektProtokoll($type,$id,$type."_create",ucfirst($type)." angelegt"); $this->app->erp->AuftragProtokoll($id,"Auftrag angelegt"); $deliverythresholdvatid = $this->getDeliverythresholdvatid($projekt); if($id > 0 && !empty($deliverythresholdvatid)){ $deliverythresholdvatid = $this->app->DB->real_escape_string($deliverythresholdvatid); $this->app->DB->Update("UPDATE auftrag SET deliverythresholdvatid = '$deliverythresholdvatid' WHERE id = $id LIMIT 1"); } $this->SchnellFreigabe("auftrag",$id); $this->EventAPIAdd("EventAuftragCreate",$id,"auftrag","create"); $this->LoadSteuersaetzeWaehrung($id,"auftrag",$projekt); return $id; } function ArtikelIDProjekt($artikelnummer,$projekt=0) { $eigenernummernkreis = $this->app->DB->Select("SELECT eigenernummernkreis FROM projekt WHERE id='$projekt' LIMIT 1"); if($eigenernummernkreis=="1") { $artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='$artikelnummer' AND projekt='$projekt' AND nummer!='' LIMIT 1"); if($artikel) { return $artikel; } return $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='$artikelnummer' AND projekt='0' AND nummer!='' LIMIT 1"); } return $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='$artikelnummer' AND nummer!='' LIMIT 1"); } function AddAuftragPositionNummer($auftrag,$nummer,$menge,$projekt,$nullpreis="",$taxfree=false,$typ="", $data = null) { $doctype = $typ; if($doctype !== 'angebot') { $doctype = 'auftrag'; } if($typ === 'produktion'){ $doctype = $typ; } $artikel = 0; if(!empty($data) && !empty($data['forceartikelid']) && $data['forceartikelid'] > 0) { $artikel = (int)$this->app->DB->Select( sprintf( 'SELECT id FROM artikel WHERE id = %d AND geloescht = 0 LIMIT 1', (int)$data['forceartikelid'] ) ); } if($artikel <= 0) { $artikel = (int)$this->ArtikelIDProjekt($nummer,$projekt); } $artikeldata = $this->app->DB->SelectRow( sprintf( 'SELECT name_de,nummer,anabregs_text,mlmpunkte,mlmbonuspunkte,mlmdirektpraemie,umsatzsteuer FROM artikel WHERE id=%d LIMIT 1', $artikel ) ); $bezeichnunglieferant = $artikeldata['name_de']; $bestellnummer = $artikeldata['nummer']; $beschreibung = $artikeldata['anabregs_text']; $sprache = $this->app->DB->Select("SELECT sprache FROM $doctype WHERE id='$auftrag' LIMIT 1"); $this->RunHook('AARLGPositionenSprache', 6, $doctype, $auftrag, $artikel, $sprache, $bezeichnunglieferant, $beschreibung); $this->app->erp->LogFile("Add $nummer,$menge $artikel $sprache Name: $bezeichnunglieferant"); $verkaufspreisarr = $this->GetVerkaufspreis($artikel, $menge,0,'', $returnwaehrung,true); if($verkaufspreisarr) { $verkaufsid = (int)$verkaufspreisarr['id']; }else{ $verkaufsid = (int)$this->app->DB->Select( sprintf( "SELECT id FROM verkaufspreise WHERE artikel=%d AND (gueltig_bis='0000-00-00' OR gueltig_bis >=NOW()) AND ab_menge=1 AND ((objekt='Standard' AND adresse=0) OR (objekt='' AND adresse=0)) AND geloescht=0 ORDER BY art = 'gruppe' LIMIT 1", $artikel ) ); } $preis = 0; $vpe = ''; $preisVpe = $this->app->DB->SelectRow(sprintf('SELECT preis,vpe FROM verkaufspreise WHERE id=%d LIMIT 1',$verkaufsid)); if(!empty($preisVpe)){ $preis = $preisVpe['preis']; $vpe = $preisVpe['vpe']; } if($nullpreis=='1'){ $preis = 0; } $umsatzsteuer = $this->app->DB->real_escape_string($artikeldata['umsatzsteuer']); $mlmpunkte = $artikeldata['mlmpunkte']; $mlmbonuspunkte = $artikeldata['mlmbonuspunkte']; $mlmdirektpraemie = $artikeldata['mlmdirektpraemie']; $bezeichnunglieferant = $this->app->DB->real_escape_string($bezeichnunglieferant); $bestellnummer = $this->app->DB->real_escape_string($bestellnummer); $beschreibung = $this->app->DB->real_escape_string($beschreibung); if($typ=='produktion') { } else { $sort = 1 + (int)$this->app->DB->Select( sprintf( 'SELECT IFNULL(MAX(sort),0) FROM `%s` WHERE `%s`= %d LIMIT 1', $doctype.'_position', $doctype, (int)$auftrag ) ); $this->app->DB->Insert( sprintf( "INSERT INTO `%s` (%s,artikel,bezeichnung,nummer,menge,preis, sort,lieferdatum, umsatzsteuer, status,projekt,vpe,punkte,bonuspunkte,mlmdirektpraemie) VALUES (%d, %d, '%s', '%s', %f, %f, %d, '%s', '%s','angelegt', %d, '%s', %f, %f, %f)", $doctype.'_position',$doctype,(int)$auftrag, $artikel,$bezeichnunglieferant,$bestellnummer,(float)$menge,(float)$preis,$sort, $datum,$umsatzsteuer,(int)$projekt,$this->app->DB->real_escape_string($vpe),$mlmpunkte,$mlmbonuspunkte,$mlmdirektpraemie ) ); $insid = $this->app->DB->GetInsertID(); if(!empty($data) && !empty($data['parentap'])) { $this->app->DB->Update( sprintf( 'UPDATE `%s` AS pp INNER JOIN artikel art ON pp.artikel = art.id AND (art.stueckliste = 1 OR art.juststueckliste = 1) SET pp.explodiert = 1 WHERE pp.id = %d', $doctype.'_position', (int)$data['parentap'] ) ); $this->app->DB->Update( sprintf( 'UPDATE `%s` SET explodiert_parent = %d WHERE id = %d', $doctype.'_position', (int)$data['parentap'], (int)$insid ) ); } } return $insid; } function AddArtikelEigenschaft($artikel, $name, $wert, $einheit = '') { if($name == ''){ return; } if(!$this->app->DB->Select("SELECT id FROM artikel WHERE id = '$artikel' AND nummer <> 'DEL' AND ifnull(geloescht,0) = 0")){ return; } $checkkategorie = $this->app->DB->Select("SELECT id FROM artikeleigenschaften WHERE name = '$name' AND geloescht <> 1 LIMIT 1"); if(!$checkkategorie) { $this->app->DB->Insert("INSERT INTO artikeleigenschaften (name) values ('$name')"); $checkkategorie = $this->app->DB->GetInsertID(); } $checkwert = $this->app->DB->Select("SELECT id FROM artikeleigenschaftenwerte WHERE artikeleigenschaften = '$checkkategorie' AND artikel = '$artikel' AND wert = '$wert' LIMIT 1"); if(!$checkwert){ $this->app->DB->Insert("INSERT INTO artikeleigenschaftenwerte (wert, artikeleigenschaften, artikel, einheit) values ('$wert','$checkkategorie','$artikel','$einheit')"); } } function KopiereArtikelEigenschaften($vonartikel, $nachartikel) { $vonartikel = $this->app->DB->Select("SELECT id FROM artikel WHERE geloescht <> 1 AND id = '". (int)$vonartikel."' LIMIT 1"); $nachartikel = $this->app->DB->Select("SELECT id FROM artikel WHERE geloescht <> 1 AND id = '". (int)$nachartikel."' LIMIT 1"); if(!$vonartikel || !$nachartikel || $vonartikel == $nachartikel){ return; } $artikeleigenschaftenwerte = $this->app->DB->SelectArr("SELECT id FROM artikeleigenschaftenwerte WHERE artikel = '$vonartikel' ORDER by id"); if($artikeleigenschaftenwerte) { foreach($artikeleigenschaftenwerte as $v) { $idnew = $this->app->DB->MysqlCopyRow("artikeleigenschaftenwerte","id",$v['id']); $this->app->DB->Update("UPDATE artikeleigenschaftenwerte SET artikel = '$nachartikel' WHERE id = '$idnew' LIMIT 1"); } } } function KopiereArtikelDateistichwoerter($vonartikel, $nachartikel) { $vonartikel = $this->app->DB->Select("SELECT id FROM artikel WHERE geloescht <> 1 AND id = '". (int)$vonartikel."' LIMIT 1"); $nachartikel = $this->app->DB->Select("SELECT id FROM artikel WHERE geloescht <> 1 AND id = '". (int)$nachartikel."' LIMIT 1"); if(!$vonartikel || !$nachartikel || $vonartikel == $nachartikel)return; $dateistichwoerter = $this->app->DB->SelectArr("SELECT id FROM datei_stichwoerter WHERE objekt LIKE 'Artikel' AND parameter = '$vonartikel' ORDER by id"); if($dateistichwoerter) { foreach($dateistichwoerter as $v) { $idnew = $this->app->DB->MysqlCopyRow("datei_stichwoerter","id",$v['id']); $this->app->DB->Update("UPDATE datei_stichwoerter SET parameter = '$nachartikel' WHERE id = '$idnew' LIMIT 1"); } } } function AddPositionManuellPreisNummer($typ,$id,$projekt, $artikelnummer,$menge,$name,$preis,$umsatzsteuer,$rabatt=0,$shop=0,$waehrung='EUR',$data = null, &$fulldata = null) { // wenn es Artikel nicht gibt anlegen! bzw. immer updaten wenn name anders ist // $artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer='$artikelnummer' AND nummer!='' LIMIT 1"); $artikelnummershop = $artikelnummer; $artikel = 0; $artikelnummernummerkreis = false; $externeartikelnummer = ""; $eigenernummernkreis= 0; $artikeltexteuebernehmen = 0; $multiprojekt = 0; $shopArr = null; if($shop > 0) { $shopArr = $this->app->DB->SelectRow( sprintf( 'SELECT artikeltexteuebernehmen,multiprojekt,projekt,artikelbeschreibungauswawision, artikelbeschreibungenuebernehmen,artikelnummernummerkreis,bezeichnung FROM shopexport WHERE id= %d', $shop ) ); $artikeltexteuebernehmen = !empty($shopArr)?$shopArr['artikeltexteuebernehmen']:$this->app->DB->Select("SELECT artikeltexteuebernehmen FROM shopexport WHERE id='$shop' LIMIT 1"); $multiprojekt = !empty($shopArr)?$shopArr['multiprojekt']:$this->app->DB->Select("SELECT multiprojekt FROM shopexport WHERE id='$shop' LIMIT 1"); if(!$projekt){ $projekt = !empty($shopArr)?$shopArr['projekt']:$this->app->DB->Select("SELECT projekt FROM shopexport WHERE id='".$shop."' LIMIT 1"); } } if($projekt){ $eigenernummernkreis = $this->app->DB->Select("SELECT eigenernummernkreis FROM projekt WHERE id = '$projekt' LIMIT 1"); } if($shop && isset($data['fremdnummer']) && trim((String)$data['fremdnummer']) !== ''){ $artikel = $this->app->DB->Select("SELECT a.id FROM artikelnummer_fremdnummern af INNER JOIN artikel a on af.artikel = a.id WHERE af.nummer='{$data['fremdnummer']}' AND af.aktiv = 1 AND af.nummer <> '' AND (a.projekt='$projekt' OR af.shopid = '$shop') AND a.nummer <> 'DEL' AND IFNULL(a.geloescht,0) = 0 ORDER BY af.shopid = '$shop' DESC,IFNULL(a.intern_gesperrt,0) = 0 DESC, af.id LIMIT 1"); } if(empty($artikel)){ if($eigenernummernkreis && !$multiprojekt) { $artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer = '".$artikelnummer."' AND IFNULL(geloescht,0) = 0 AND IFNULL(intern_gesperrt,0) = 0 AND projekt = '$projekt' LIMIT 1"); } else { $artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer = '".$artikelnummer."' AND IFNULL(geloescht,0) = 0 AND IFNULL(intern_gesperrt,0) = 0 ORDER BY projekt = '$projekt' DESC LIMIT 1"); } } if(!$artikel) { if($eigenernummernkreis && !$multiprojekt) { $artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE herstellernummer = '".$artikelnummer."' AND nummer <> 'DEL' AND projekt = '$projekt' AND IFNULL(geloescht,0) = 0 ORDER BY IFNULL(intern_gesperrt,0) = 0 DESC LIMIT 1"); } else { $artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE herstellernummer = '".$artikelnummer."' AND nummer <> 'DEL' ORDER BY IFNULL(intern_gesperrt,0) = 0 DESC, projekt = '$projekt' AND IFNULL(geloescht,0) = 0 DESC LIMIT 1"); } if($artikel){ $artikelnummer = $this->app->DB->Select("SELECT nummer FROM artikel WHERE id = '$artikel' LIMIT 1"); } } if(!$artikel) { if($eigenernummernkreis && !$multiprojekt) { $artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE ean = '".$artikelnummer."' AND nummer <> 'DEL' AND projekt = '$projekt' AND IFNULL(geloescht,0) = 0 ORDER BY IFNULL(intern_gesperrt,0) = 0 DESC LIMIT 1"); } else { $artikel = $this->app->DB->Select("SELECT id FROM artikel WHERE ean = '".$artikelnummer."' AND nummer <> 'DEL' ORDER BY IFNULL(intern_gesperrt,0) = 0 DESC, projekt = '$projekt' AND IFNULL(geloescht,0) = 0 DESC LIMIT 1"); } if($artikel){ $artikelnummer = $this->app->DB->Select("SELECT nummer FROM artikel WHERE id = '$artikel' LIMIT 1"); } } if(!$artikel){ $artikel = $this->ArtikelIDProjekt($artikelnummer,$projekt); } if($artikel <=0) { if($artikelnummernummerkreis) { $externeartikelnummer = $artikelnummer; $artikelnummer = $this->GetNextArtikelnummer('produkt', 1, $projekt); } //Artikel anlegen $ean = ''; if(is_array($data) && isset($data['ean'])){ $ean = $data['ean']; } $artdata = array('name_de'=>$name,'nummer'=>$artikelnummer,'projekt'=>$projekt,'umsatzsteuer'=>$umsatzsteuer,'lagerartikel'=>1,'shop'=>$shop,'firma'=>(isset($this->app->User)?$this->app->User->GetFirma():1),'ean'=>$ean); if(!is_null($data) && is_array($data)) { foreach($data as $k => $v) { switch($k) { case 'anabregs_text': case 'anabregs_text_en': case 'kurztext_de': case 'kurztext_en': case 'uebersicht_de': case 'uebersicht_en': case 'metadescription_de': case 'metadescription_en': case 'metakeywords_de': case 'metakeywords_en': if($artikeltexteuebernehmen){ $artdata[$k] = $v; } break; case 'anabregs_text_de': //$artdata['anabregs_text'] = $v; break; case 'lagerartikel': case 'serviceartikel': case 'unikat': case 'anhang': $artdata[$k] = $v; break; } switch($k) { case 'options': $beschreibung = $v; break; } } } $artikel = $this->AddArtikel($artdata); if(!empty($fulldata['generierenummerbeioption'])){ $this->ObjektProtokoll('artikel',$artikel, 'artikel_create','Automatisch Kopie angelegt'); } $this->AddVerkaufspreis($artikel,1,0,$preis,$waehrung); } else { $variante_kopietesten = true; if(!empty($data) && isset($data['stuecklisteergaenzen']) && $data['stuecklisteergaenzen'] && isset($data['posid']) && !empty($fulldata)) { $stueckliste = $this->app->DB->Select("SELECT stueckliste FROM artikel WHERE id = '$artikel' LIMIT 1"); if($stueckliste) { $variante_kopietesten = false; $varkopie = $this->app->DB->Select("SELECT variante_kopie FROM artikel WHERE id = '$artikel' LIMIT 1"); $copystueckliste = $varkopie; if(!$copystueckliste) { $stuecklistenelemente = $this->app->DB->SelectArr("SELECT a.* FROM stueckliste s INNER JOIN artikel a ON s.artikel = a.id WHERE a.geloescht <> 1 AND s.stuecklistevonartikel = '$artikel' ORDER BY sort"); if($stuecklistenelemente) { foreach($stuecklistenelemente as $v3) { if($v3['variante_kopie'])$copystueckliste = true; } } } if(!$copystueckliste) { foreach($fulldata as $k2 => $v2) { $cnummer = $v2['articleid']; if(isset($v2['parentid']) && $v2['parentid'] == $data['posid']) { $found = false; if($stuecklistenelemente) { foreach($stuecklistenelemente as $v3) { $sfound = false; if($cnummer == $v3['nummer'])$sfound = true; if($cnummer == $v3['herstellernummer'])$sfound = true; if($cnummer == $v3['ean'])$sfound = true; if(!$sfound) { if($this->app->DB->Select("SELECT a.id FROM artikelnummer_fremdnummern af INNER JOIN artikel a on af.artikel = a.id WHERE af.nummer ='".$this->app->DB->real_escape_string($cnummer)."' AND af.nummer <> '' AND af.shopid = '$shop' AND af.aktiv = 1 AND a.nummer <> 'DEL' ORDER by af.id LIMIT 1"))$sfound = true; } if(!$sfound)$copystueckliste = true; } } } } } if(!$copystueckliste) { foreach($fulldata as $k2 => $v2) { if(isset($v2['parentid']) && $v2['parentid'] == $data['posid']) { $fulldata[$k2]['ignorieren'] = true; } } }else{ $neuerartikel['nummer'] = $this->GetNextArtikelnummer($this->app->DB->Select("SELECT typ FROM artikel WHERE id = '$artikel' LIMIT 1"), 1, $projekt); $neuerartikel['stueckliste'] = 1; $neuerartikel['variante_kopie'] = $varkopie; $neuerartikel['projekt'] = $projekt; $tmpArticleArr = $this->app->DB->SelectRow( sprintf( 'SELECT lagerartikel,name_de,lager_platz,produktion,adresse,umsatzsteuer,juststueckliste FROM artikel WHERE id = %d', $artikel ) ); $neuerartikel['lagerartikel'] = !empty($tmpArticleArr)?$tmpArticleArr['lagerartikel']:$this->app->DB->Select("SELECT lagerartikel FROM artikel WHERE id = '$artikel' LIMIT 1"); $neuerartikel['name_de'] = !empty($tmpArticleArr)?$tmpArticleArr['name_de']:$this->app->DB->Select("SELECT name_de FROM artikel WHERE id = '$artikel' LIMIT 1"); $neuerartikel['lager_platz'] = !empty($tmpArticleArr)?$tmpArticleArr['lager_platz']:$this->app->DB->Select("SELECT lager_platz FROM artikel WHERE id = '$artikel' LIMIT 1"); $neuerartikel['produktion'] = !empty($tmpArticleArr)?$tmpArticleArr['produktion']:$this->app->DB->Select("SELECT produktion FROM artikel WHERE id = '$artikel' LIMIT 1"); $neuerartikel['adresse'] = !empty($tmpArticleArr)?$tmpArticleArr['adresse']:$this->app->DB->Select("SELECT adresse FROM artikel WHERE id = '$artikel' LIMIT 1"); $neuerartikel['umsatzsteuer'] = !empty($tmpArticleArr)?$tmpArticleArr['umsatzsteuer']:$this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id = '$artikel' LIMIT 1"); $neuerartikel['juststueckliste'] = !empty($tmpArticleArr)?$tmpArticleArr['juststueckliste']:$this->app->DB->Select("SELECT juststueckliste FROM artikel WHERE id = '$artikel' LIMIT 1"); $neuerartikel['anabregs_text'] = isset($value['options']) && !empty($value['options'])?$value['options']:''; $neuerartikel['bestandalternativartikel'] = $this->app->DB->Select("SELECT bestandalternativartikel FROM artikel WHERE id = '$artikel' LIMIT 1"); if($this->app->DB->Select("SELECT unikatbeikopie FROM artikel WHERE id = '$artikel' LIMIT 1"))$neuerartikel['unikat'] = 1; $this->app->DB->Insert("INSERT INTO artikel (id) VALUES ('')"); $neuerartikel['id'] = $this->app->DB->GetInsertID(); $neuerartikelid = $this->InsertUpdateArtikel($neuerartikel); $this->CopyArtikelVariante($neuerartikelid, $artikel,isset($value['options']) && !empty($value['options'])?$value['options']:(isset($value['anabregs_text'])?$value['anabregs_text']:'')); $stuecklistenelementeneu = $this->app->DB->SelectArr("SELECT a.* FROM stueckliste s INNER JOIN artikel a ON s.artikel = a.id WHERE a.geloescht <> 1 AND s.stuecklistevonartikel = '$neuerartikelid' ORDER BY sort"); foreach($fulldata as $k2 => $v2) { $cnummer = $v2['articleid']; if(isset($v2['parentid']) && $v2['parentid'] == $data['posid']) { $found = false; if($stuecklistenelementeneu) { foreach($stuecklistenelementeneu as $v3) { $sfound = false; if($cnummer == $v3['nummer'])$sfound = true; if($cnummer == $v3['herstellernummer'])$sfound = true; if($cnummer == $v3['ean'])$sfound = true; if(!$sfound) { if($this->app->DB->Select("SELECT a.id FROM artikelnummer_fremdnummern af INNER JOIN artikel a on af.artikel = a.id WHERE a.id = '".$v3['id']."' AND af.nummer ='".$this->app->DB->real_escape_string($cnummer)."' AND af.nummer <> '' AND af.shopid = '$shop' AND af.aktiv = 1 AND a.nummer <> 'DEL' ORDER by af.id LIMIT 1"))$sfound = true; } if(!$sfound) { if($v3['variante_von']) { $va = $this->app->DB->SelectRow("SELECT * FROM artikel where id = '".$v3['variante_von']."' LIMIT 1"); if($va) { if($cnummer == $va['nummer'])$sfound = true; if($cnummer == $va['herstellernummer'])$sfound = true; if($cnummer == $va['ean'])$sfound = true; if(!$sfound) { if($this->app->DB->Select("SELECT a.id FROM artikelnummer_fremdnummern af INNER JOIN artikel a on af.artikel = a.id WHERE a.id = '".$va['id']."' AND af.nummer ='".$this->app->DB->real_escape_string($cnummer)."' AND af.nummer <> '' AND af.shopid = '$shop' AND af.aktiv = 1 AND a.nummer <> 'DEL' ORDER by af.id LIMIT 1"))$sfound = true; } } } } if(!$sfound) { $umsatzsteuers = $v2['umsatzsteuer']; if(!empty($v2['steuersatz']) && round((float)str_replace($v2['steuersatz'],',','.'),2)== 7)$umsatzsteuers = 'ermaessigt'; $snummer = $this->GetNextArtikelnummer('produkt',1,$projekt); $artdatas = array('name_de'=>$v2['name'],'nummer'=>$snummer ,'projekt'=>$projekt,'umsatzsteuer'=>$umsatzsteuers,'lagerartikel'=>1,'shop'=>$shop,'firma'=>(isset($this->app->User)?$this->app->User->GetFirma():1)); $this->app->DB->Insert("INSERT INTO artikel (id) VALUES ('')"); $artdatas['id'] = $this->app->DB->GetInsertID(); $sneueid = $this->InsertUpdateArtikel($artdatas); $sort = 1 + (int)$this->app->DB->Select("SELECT max(sort) FROM stueckliste WHERE stuecklistevonartikel = '".$neuerartikelid."'"); $quant = str_replace($v3['quantity'],',','.'); if(!$quant)$quant = 1; $this->app->DB->Insert("INSERT INTO stueckliste (artikel, sort, stuecklistevonartikel, menge) values ('".$sneueid."','".$sort."','".$neuerartikelid."','".$quant."')"); } } } $fulldata[$k2]['ignorieren'] = true; } } $artikel = $neuerartikelid; } } } } if($variante_kopietesten) { if($this->app->DB->Select("SELECT variante_kopie FROM artikel WHERE id = '$artikel' LIMIT 1")) { $neuerartikel['nummer'] = $this->GetNextArtikelnummer($this->app->DB->Select("SELECT typ FROM artikel WHERE id = '$artikel' LIMIT 1"), 1, $projekt); $neuerartikel['stueckliste'] = 1; $neuerartikel['variante_kopie'] = 1; $neuerartikel['variante_von'] = $artikel; $neuerartikel['projekt'] = $projekt; $neuerartikel['lagerartikel'] = $this->app->DB->Select("SELECT lagerartikel FROM artikel WHERE id = '$artikel' LIMIT 1"); if(isset($data['lagerartikel']) && $data['lagerartikel']) { $neuerartikel['lagerartikel'] = 1; }elseif(isset($data['lagerartikel']) && ($data['lagerartikel'] === 0 || $data['lagerartikel'] === '0')) { $neuerartikel['lagerartikel'] = 1; } if(isset($data['serviceartikel']) && $data['serviceartikel']) { $neuerartikel['serviceartikel'] = 1; }elseif(isset($data['serviceartikel']) && ($data['serviceartikel'] === 0 || $data['serviceartikel'] === '0')) { $neuerartikel['serviceartikel'] = 1; } $tmpArticleArr = $this->app->DB->SelectRow( sprintf( 'SELECT name_de,lager_platz,produktion,adresse,umsatzsteuer,juststueckliste,bestandalternativartikel FROM artikel WHERE id = %d', $artikel ) ); $neuerartikel['name_de'] = !empty($tmpArticleArr)?$tmpArticleArr['name_de']:$this->app->DB->Select("SELECT name_de FROM artikel WHERE id = '$artikel' LIMIT 1"); $neuerartikel['lager_platz'] = !empty($tmpArticleArr)?$tmpArticleArr['lager_platz']:$this->app->DB->Select("SELECT lager_platz FROM artikel WHERE id = '$artikel' LIMIT 1"); $neuerartikel['produktion'] = !empty($tmpArticleArr)?$tmpArticleArr['produktion']:$this->app->DB->Select("SELECT produktion FROM artikel WHERE id = '$artikel' LIMIT 1"); $neuerartikel['adresse'] = !empty($tmpArticleArr)?$tmpArticleArr['adresse']:$this->app->DB->Select("SELECT adresse FROM artikel WHERE id = '$artikel' LIMIT 1"); $neuerartikel['umsatzsteuer'] = !empty($tmpArticleArr)?$tmpArticleArr['umsatzsteuer']:$this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id = '$artikel' LIMIT 1"); $neuerartikel['juststueckliste'] = !empty($tmpArticleArr)?$tmpArticleArr['juststueckliste']:$this->app->DB->Select("SELECT juststueckliste FROM artikel WHERE id = '$artikel' LIMIT 1"); $neuerartikel['anabregs_text'] = isset($value['options']) && !empty($value['options'])?$value['options']:''; $neuerartikel['bestandalternativartikel'] = !empty($tmpArticleArr)?$tmpArticleArr['bestandalternativartikel']:$this->app->DB->Select("SELECT bestandalternativartikel FROM artikel WHERE id = '$artikel' LIMIT 1"); if($this->app->DB->Select("SELECT unikatbeikopie FROM artikel WHERE id = '$artikel' LIMIT 1"))$neuerartikel['unikat'] = 1; $this->app->DB->Insert("INSERT INTO artikel (id) VALUES ('')"); $neuerartikel['id'] = $this->app->DB->GetInsertID(); $neuerartikelid = $this->InsertUpdateArtikel($neuerartikel); if($neuerartikelid) { $this->ObjektProtokoll('artikel', $neuerartikelid,"artikel_create","Automatisch Kopie angelegt"); $this->KopiereArtikelEigenschaften($artikel, $neuerartikelid); $this->KopiereArtikelDateistichwoerter($artikel, $neuerartikelid); $artikel = $neuerartikelid; $artikelnummer = $neuerartikel['nummer']; } } } //$waehrung = 'EUR'; $datum =""; $belegsprache = $this->app->DB->Select("SELECT sprache FROM $typ WHERE id = $id"); $adresssprachen = $this->GetAdressSprachen(); if(!is_null($data) && isset($data['options']))$beschreibung = $data['options']; if(empty($beschreibung) && $artikelbeschreibungenuebernehmen)$beschreibung = $this->app->DB->real_escape_string($data['anabregs_text']); if($artikelbeschreibungauswawision) { $beschreibung = $this->app->DB->real_escape_string($this->app->DB->Select("SELECT anabregs_text FROM artikel WHERE id='$artikel' LIMIT 1")); if($this->app->DB->Select("SELECT adr.id FROM auftrag auf INNER JOIN adresse adr ON auf.adresse = adr.id AND adr.sprache = 'englisch' WHERE auf.id = '$id' LIMIT 1")) $beschreibung = $this->app->DB->Select("SELECT anabregs_text_en FROM artikel WHERE id = '$artikel'"); if(!$beschreibung && $this->app->DB->Select("SELECT variante FROM artikel WHERE id = '$artikel' LIMIT 1")) { $variante_von = $this->app->DB->Select("SELECT variante_von FROM artikel WHERE id = '$artikel' LIMIT 1"); if($variante_von)$beschreibung = $this->app->DB->real_escape_string($this->app->DB->Select("SELECT anabregs_text FROM artikel WHERE id='$variante_von' LIMIT 1")); } if($this->ModulVorhanden('artikel_texte')){ if(array_key_exists($belegsprache,$adresssprachen)){ $belegsprache = $adresssprachen[$belegsprache]; } $artikelbeschreibung = $this->app->DB->Select("SELECT beschreibung FROM artikel_texte WHERE artikel=$artikel AND sprache='$belegsprache'"); if($artikelbeschreibung){ $beschreibung = $artikelbeschreibung; } } } //$vpe = $this->app->DB->Select("SELECT vpe FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $sort = $this->app->DB->Select("SELECT MAX(sort) FROM ".$typ."_position WHERE $typ='$id' LIMIT 1"); $sort = $sort + 1; $artikelnummeruebernehmen = $this->app->DB->Select("SELECT artikelnummeruebernehmen FROM shopexport WHERE id = '$shop' LIMIT 1"); if($artikelnummeruebernehmen)$artikelnummer = $artikelnummershop; $artikelbezeichnungauswawision = $this->app->DB->Select("SELECT artikelbezeichnungauswawision FROM shopexport WHERE id = '$shop' LIMIT 1"); if($artikelbezeichnungauswawision) { $name = ''; if($this->app->DB->Select("SELECT adr.id FROM auftrag auf INNER JOIN adresse adr ON auf.adresse = adr.id AND adr.sprache = 'englisch' WHERE auf.id = '$id' LIMIT 1")) $name = $this->app->DB->Select("SELECT name_en FROM artikel WHERE id = '$artikel'"); if($name === '')$name = $this->app->DB->Select("SELECT name_de FROM artikel WHERE id = '$artikel'"); if($this->ModulVorhanden('artikel_texte')){ if(array_key_exists($belegsprache,$adresssprachen)){ $belegsprache = $adresssprachen[$belegsprache]; } $artikelbezeichnung = $this->app->DB->Select( "SELECT name FROM artikel_texte WHERE artikel=$artikel AND sprache='$belegsprache' ORDER BY name <> '' DESC LIMIT 1" ); if($artikelbezeichnung){ $name = $artikelbezeichnung; } } } $name = $this->app->DB->real_escape_string($name); if($typ === 'retoure') { $this->app->DB->Insert("INSERT INTO `retoure_position` (`retoure`,`artikel`,`bezeichnung`,`beschreibung`,`nummer`,`menge`, `sort`,`lieferdatum`, `status`,`projekt`,`vpe`) VALUES ('$id','$artikel','$name','$beschreibung','$artikelnummer','$menge', '$sort','$datum','angelegt','$projekt','$vpe')"); } else{ $this->app->DB->Insert("INSERT INTO " . $typ . "_position (id,$typ,artikel,bezeichnung,beschreibung,nummer,menge,preis, waehrung, sort,lieferdatum, umsatzsteuer, status,projekt,vpe,rabatt,grundrabatt,rabattsync) VALUES ('','$id','$artikel','$name','$beschreibung','$artikelnummer','$menge', '$preis','$waehrung','$sort','$datum','$umsatzsteuer','angelegt','$projekt','$vpe','$rabatt','$rabatt',1)"); } $insid = $this->app->DB->GetInsertID(); $mlmfelder = $this->app->DB->SelectArr("SELECT mlmpunkte, mlmbonuspunkte, mlmdirektpraemie FROM artikel WHERE id = '$artikel' LIMIT 1"); if($mlmfelder) { $this->app->DB->Update("UPDATE ".$typ."_position SET punkte = '".$mlmfelder[0]['mlmpunkte']."', bonuspunkte = '".$mlmfelder[0]['mlmbonuspunkte']."', mlmdirektpraemie = '".$mlmfelder[0]['mlmdirektpraemie']."' WHERE id = '$insid' LIMIT 1 "); } if(isset($neuerartikel['juststueckliste']) && $neuerartikel['juststueckliste']) { if($typ == 'auftrag') { $this->AuftragExplodieren($id); } } if($typ == 'auftrag' && is_array($data) && isset($data['parentap'])) { $this->app->DB->Update("UPDATE auftrag_position set explodiert_parent = '".$data['parentap']."' where id = '$insid'"); $this->app->DB->Update("UPDATE auftrag_position ap INNER JOIN artikel art ON ap.artikel = art.id AND (art.juststueckliste = 1 OR art.stueckliste = 1) SET ap.explodiert = 1 where ap.id = '".$data['parentap']."'"); } if($typ === 'auftrag') { $this->app->DB->Update(sprintf('UPDATE `artikel`SET `laststorage_changed` = NOW() WHERE `id` = %d', $artikel)); } return $insid; } function AddPositionManuellPreis($typ,$id, $artikel,$menge,$name,$preis,$umsatzsteuer,$rabatt=0,$waehrung='EUR',$beschreibung="") { // wenn es Artikel nicht gibt anlegen! bzw. immer updaten wenn name anders ist $artArr = $this->app->DB->SelectRow( sprintf( 'SELECT nummer,mlmpunkte,mlmbonuspunkte,mlmdirektpraemie FROM artikel WHERE id = %d', $artikel ) ); $bestellnummer = !empty($artArr)?$artArr['nummer']:$this->app->DB->Select("SELECT nummer FROM artikel WHERE id='$artikel' LIMIT 1"); //$vpe = $this->app->DB->Select("SELECT vpe FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $sort = $this->app->DB->Select("SELECT MAX(sort) FROM ".$typ."_position WHERE $typ='$id' LIMIT 1"); $sort = $sort + 1; $mlmpunkte = !empty($artArr)?$artArr['mlmpunkte']:$this->app->DB->Select("SELECT mlmpunkte FROM artikel WHERE id='$artikel' LIMIT 1"); $mlmbonuspunkte = !empty($artArr)?$artArr['mlmbonuspunkte']:$this->app->DB->Select("SELECT mlmbonuspunkte FROM artikel WHERE id='$artikel' LIMIT 1"); $mlmdirektpraemie = !empty($artArr)?$artArr['mlmdirektpraemie']:$this->app->DB->Select("SELECT mlmdirektpraemie FROM artikel WHERE id='$artikel' LIMIT 1"); $name = $this->app->DB->real_escape_string($name); $beschreibung = $this->app->DB->real_escape_string($beschreibung); $bestellnummer = $this->app->DB->real_escape_string($bestellnummer); if($typ=="auftrag" || $typ=="angebot" || $typ=="rechnung") { $this->app->DB->Insert("INSERT INTO ".$typ."_position (id,$typ,artikel,bezeichnung, beschreibung,nummer,menge,preis, waehrung, sort,lieferdatum, umsatzsteuer, status,projekt,vpe,rabatt,punkte,bonuspunkte,mlmdirektpraemie) VALUES ('','$id','$artikel','$name','$beschreibung','$bestellnummer','$menge', '$preis','$waehrung','$sort','$datum','$umsatzsteuer','angelegt','$projekt','$vpe','$rabatt','$mlmpunkte','$mlmbonuspunkte','$mlmdirektpraemie')"); } else { $this->app->DB->Insert("INSERT INTO ".$typ."_position (id,$typ,artikel,bezeichnung, beschreibung,nummer,menge,preis, waehrung, sort,lieferdatum, umsatzsteuer, status,projekt,vpe,rabatt) VALUES ('','$id','$artikel','$name','$beschreibung','$bestellnummer','$menge','$preis', '$waehrung','$sort','$datum','$umsatzsteuer','angelegt','$projekt','$vpe','$rabatt')"); } return $this->app->DB->GetInsertID(); } function AddPositionManuell($typ,$id, $artikel,$menge,$name=null,$beschreibung=null,$waehrung='EUR') { $artArr = $this->app->DB->SelectRow( sprintf( 'SELECT nummer,projekt FROM artikel WHERE id = %d', $artikel ) ); $bestellnummer = !empty($artArr)?$artArr['nummer']:$this->app->DB->Select("SELECT nummer FROM artikel WHERE id='$artikel' LIMIT 1"); $projekt = !empty($artArr)?$artArr['projekt']:$this->app->DB->Select("SELECT projekt FROM artikel WHERE id='$artikel' LIMIT 1"); $adresse = $this->app->DB->Select("SELECT adresse FROM $typ WHERE id='$id' LIMIT 1"); if($menge<1) $preis = $this->GetVerkaufspreis($artikel,1,$adresse,$waehrung); else $preis = $this->GetVerkaufspreis($artikel,$menge,$adresse,$waehrung); $artikelnummerkunde = $this->app->DB->real_escape_string($this->app->DB->Select("SELECT kundenartikelnummer FROM verkaufspreise WHERE adresse='$adresse' AND artikel='$artikel' AND kundenartikelnummer!='' AND ab_menge <='$menge' AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') ORDER by ab_menge DESC LIMIT 1")); $artikeldata = $this->app->DB->SelectRow("SELECT umsatzsteuer,mlmpunkte,mlmbonuspunkte,mlmdirektpraemie,name_de,anabregs_text FROM artikel WHERE id='$artikel' LIMIT 1"); $vpe = ''; $datum = null; $sort = (int)$this->app->DB->Select("SELECT IFNULL(MAX(sort),0) FROM ".$typ."_position WHERE $typ='$id' LIMIT 1"); $sort = $sort + 1; $umsatzsteuer = $artikeldata['umsatzsteuer']; $mlmpunkte = $artikeldata['mlmpunkte']; $mlmbonuspunkte = $artikeldata['mlmbonuspunkte']; $mlmdirektpraemie = $artikeldata['mlmdirektpraemie']; if($name===null) { $name = $artikeldata['name_de']; } if($beschreibung===null) { $beschreibung = $artikeldata['anabregs_text']; } if($typ==='auftrag' || $typ==='angebot' || $typ==='rechnung') { $this->app->DB->Insert("INSERT INTO ".$typ."_position (id,$typ,artikel,bezeichnung, beschreibung,nummer,menge,preis, waehrung, sort,lieferdatum, umsatzsteuer, status,projekt,vpe,punkte,bonuspunkte,mlmdirektpraemie,artikelnummerkunde) VALUES ('','$id','$artikel','$name','$beschreibung','$bestellnummer','$menge','$preis','$waehrung','$sort','$datum','$umsatzsteuer','angelegt','$projekt', '$vpe','$mlmpunkte','$mlmbonuspunkte','$mlmdirektpraemie','$artikelnummerkunde')"); } else { $this->app->DB->Insert("INSERT INTO ".$typ."_position (id,$typ,artikel,bezeichnung, beschreibung,nummer,menge,preis, waehrung, sort,lieferdatum, umsatzsteuer, status,projekt,vpe) VALUES ('','$id','$artikel','$name','$beschreibung','$bestellnummer','$menge','$preis','$waehrung','$sort','$datum','$umsatzsteuer','angelegt','$projekt','$vpe')"); } $posid = $this->app->DB->GetInsertID(); $this->RunHook("erpapi_addpositionmanuell", 5, $typ, $id, $artikel, $menge, $posid); return $posid; } function AddAuftragPosition($auftrag, $verkauf,$menge,$datum) { $artikel = $this->app->DB->Select("SELECT artikel FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $bezeichnunglieferant = $this->app->DB->Select("SELECT name_de FROM artikel WHERE id='$artikel' LIMIT 1"); $bestellnummer = $this->app->DB->Select("SELECT nummer FROM artikel WHERE id='$artikel' LIMIT 1"); $preis = $this->app->DB->Select("SELECT preis FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $projekt = $this->app->DB->Select("SELECT projekt FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $umsatzsteuer = $this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id='$artikel' LIMIT 1"); $sort = $this->app->DB->Select("SELECT MAX(sort) FROM auftrag_position WHERE auftrag='$auftrag' LIMIT 1"); $sort = $sort + 1; $mlmpunkte = $this->app->DB->Select("SELECT mlmpunkte FROM artikel WHERE id='$artikel' LIMIT 1"); $mlmbonuspunkte = $this->app->DB->Select("SELECT mlmbonuspunkte FROM artikel WHERE id='$artikel' LIMIT 1"); $mlmdirektpraemie = $this->app->DB->Select("SELECT mlmdirektpraemie FROM artikel WHERE id='$artikel' LIMIT 1"); $this->app->DB->Insert("INSERT INTO auftrag_position (id,auftrag,artikel,bezeichnung,nummer,menge,preis, waehrung, sort,lieferdatum, umsatzsteuer, status,projekt,vpe,punkte,bonuspunkte,mlmdirektpraemie) VALUES ('','$auftrag','$artikel','$bezeichnunglieferant','$bestellnummer','$menge','$preis','$waehrung','$sort','$datum','$umsatzsteuer','angelegt','$projekt','$vpe', '$mlmpunkte','$mlmbonuspunkte','$mlmdirektpraemie')"); } function DeleteAuftrag($id) { $belegnr = $this->app->DB->Select("SELECT belegnr FROM auftrag WHERE id='$id' LIMIT 1"); if($belegnr=="" || $belegnr=="0") { $positionen = $this->app->DB->SelectArr("SELECT id FROM auftrag_position WHERE auftrag = '$id'"); if($positionen) { foreach($positionen as $pos) { $this->app->DB->Delete("DELETE FROM objekt_lager_platz WHERE objekt = 'auftrag' AND parameter = '".$pos['id']."'"); } } $this->app->DB->Delete("DELETE FROM auftrag_position WHERE auftrag='$id'"); $this->app->DB->Delete("DELETE FROM auftrag_protokoll WHERE auftrag='$id'"); $this->app->DB->Delete("DELETE FROM auftrag WHERE id='$id' LIMIT 1"); $this->app->DB->Delete("DELETE FROM lager_reserviert WHERE objekt='auftrag' AND parameter='$id'"); } } function GetCreateProjekt($adresse=0) { if($adresse>0) $tmp_projekt = $this->app->DB->Select("SELECT projekt FROM adresse WHERE id='$adresse' LIMIT 1"); if($tmp_projekt > 0) $projekt = $tmp_projekt; $projekt_bevorzugt=$this->app->DB->Select("SELECT projekt_bevorzugen FROM user WHERE id='".$this->app->User->GetID()."' LIMIT 1"); if($projekt_bevorzugt=="1") { $projekt = $this->app->DB->Select("SELECT projekt FROM user WHERE id='".$this->app->User->GetID()."' LIMIT 1"); } if($projekt <= 0 && $this->app->User->GetType()=="admin") { $projekt = $this->app->DB->Select("SELECT standardprojekt FROM firma WHERE id='".$this->app->User->GetFirma()."' LIMIT 1"); } else { if($projekt <=0) { $projekt = $this->FallbackRolle($this->app->User->GetAdresse()); } } return $projekt; } function CreateAngebot($adresse="") { $projekt = $this->GetCreateProjekt($adresse); $standardlager = $this->app->DB->Select("SELECT standardlager FROM projekt WHERE id = '$projekt' LIMIT 1"); $usereditid = 0; if(isset($this->app->User) && $this->app->User && method_exists($this->app->User,'GetID'))$usereditid = $this->app->User->GetID(); $ohnebriefpapier = $this->Firmendaten("angebot_ohnebriefpapier"); $belegmax = ""; $angebotersatz_standard = $this->Firmendaten("angebotersatz_standard"); if($this->StandardZahlungsweise($projekt)=="rechnung") { $this->app->DB->Insert("INSERT INTO angebot (id,datum,gueltigbis,bearbeiter,usereditid,vertrieb,firma,belegnr,autoversand,zahlungsweise, zahlungszieltage, zahlungszieltageskonto, zahlungszielskonto, status,projekt,adresse,ohne_briefpapier,abweichendebezeichnung ) VALUES ('',NOW(), DATE_ADD(curdate(), INTERVAL ".((int)$this->Firmendaten("angebot_anzahltage")>0?(int)$this->Firmendaten("angebot_anzahltage"):28)." DAY),'','$usereditid','','".$this->app->User->GetFirma()."','$belegmax',1,'".$this->StandardZahlungsweise($projekt)."', '".$this->ZahlungsZielTage($projekt)."', '".$this->ZahlungsZielTageSkonto($projekt)."', '".$this->ZahlungsZielSkonto($projekt)."', 'angelegt','$projekt','$adresse','".$ohnebriefpapier."','$angebotersatz_standard')"); } else { $this->app->DB->Insert("INSERT INTO angebot (id,datum,gueltigbis,bearbeiter,usereditid,vertrieb,firma,belegnr,autoversand,zahlungsweise, zahlungszieltage, zahlungszieltageskonto, zahlungszielskonto, status,projekt,adresse,ohne_briefpapier,abweichendebezeichnung ) VALUES ('',NOW(), DATE_ADD(curdate(), INTERVAL ".((int)$this->Firmendaten("angebot_anzahltage")>0?(int)$this->Firmendaten("angebot_anzahltage"):28)." DAY),'','$usereditid','','1','$belegmax',1,'".$this->StandardZahlungsweise($projekt)."', '0', '0', '0', 'angelegt','$projekt','$adresse','".$ohnebriefpapier."','$angebotersatz_standard')"); } $id = $this->app->DB->GetInsertID(); $this->CheckVertrieb($id,"angebot"); $this->CheckBearbeiter($id,"angebot"); if($standardlager) { $this->app->DB->Update("UPDATE angebot SET standardlager = '$standardlager' WHERE id = '$id' LIMIT 1"); } $type="angebot"; $this->app->erp->ObjektProtokoll($type,$id,$type."_create",ucfirst($type)." angelegt"); $this->app->erp->AngebotProtokoll($id,"Angebot angelegt"); $this->SchnellFreigabe("angebot",$id); $this->EventAPIAdd("EventAngebotCreate",$id,"angebot","create"); $this->LoadSteuersaetzeWaehrung($id,"angebot",$projekt); return $id; } function AddAdressePosition($adresse, $verkauf,$menge,$startdatum, $wiederholend = 1, $zahlzyklus = 1) { $adresse = (int)$adresse; $verkauf = (int)$verkauf; $menge = (float)str_replace(',','.',$menge); $lieferdatum = $this->app->String->Convert($startdatum,"%1.%2.%3","%3-%2-%1"); $artikel = $this->app->DB->Select("SELECT artikel FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $bezeichnung= $this->app->DB->Select("SELECT name_de FROM artikel WHERE id='$artikel' LIMIT 1"); $bestellnummer = $this->app->DB->Select("SELECT nummer FROM artikel WHERE id='$artikel' LIMIT 1"); $anabregs_text = $this->app->DB->Select("SELECT anabregs_text FROM artikel WHERE id='$artikel' LIMIT 1"); $preis = $this->app->DB->Select("SELECT preis FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $projekt = $this->app->DB->Select("SELECT projekt FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $waehrung = $this->app->DB->Select("SELECT waehrung FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $umsatzsteuer = $this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id='$artikel' LIMIT 1"); $vpe = $this->app->DB->Select("SELECT vpe FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); //$sort = $this->app->DB->Select("SELECT MAX(sort) FROM angebot_position WHERE angebot='$angebot' LIMIT 1"); $sort = (int)$this->app->DB->Select("SELECT MAX(sort) FROM abrechnungsartikel where adresse = ".$adresse); $sort = $sort + 1; $this->app->DB->Insert("INSERT INTO abrechnungsartikel (id,artikel,bezeichnung,nummer,menge,preis, sort, lieferdatum, steuerklasse, status,projekt,wiederholend,zahlzyklus,adresse,startdatum,waehrung,beschreibung,beschreibungersetzten,dokument,preisart) VALUES ('','$artikel','$bezeichnung','$bestellnummer','$menge','$preis','$sort','$lieferdatum', '$umsatzsteuer','angelegt','$projekt','$wiederholend','$zahlzyklus','$adresse','$startdatum','$waehrung','$anabregs_text','1','rechnung','monat')"); return $this->app->DB->GetInsertID(); } function AddAngebotPosition($angebot, $verkauf,$menge,$datum) { $artikel = $this->app->DB->Select("SELECT artikel FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $bezeichnunglieferant = $this->app->DB->Select("SELECT name_de FROM artikel WHERE id='$artikel' LIMIT 1"); $bestellnummer = $this->app->DB->Select("SELECT nummer FROM artikel WHERE id='$artikel' LIMIT 1"); $beschreibung = $this->app->DB->Select("SELECT anabregs_text FROM artikel WHERE id='$artikel' LIMIT 1"); $preis = $this->app->DB->Select("SELECT preis FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $projekt = $this->app->DB->Select("SELECT projekt FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $waehrung = $this->app->DB->Select("SELECT waehrung FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $umsatzsteuer = $this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id='$artikel' LIMIT 1"); $vpe = $this->app->DB->Select("SELECT vpe FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $sort = $this->app->DB->Select("SELECT MAX(sort) FROM angebot_position WHERE angebot='$angebot' LIMIT 1"); $sort = $sort + 1; $this->app->DB->Insert("INSERT INTO angebot_position (id,angebot,artikel,beschreibung,bezeichnung,nummer,menge,preis, waehrung, sort,lieferdatum, umsatzsteuer, status,projekt,vpe) VALUES ('','$angebot','$artikel','$beschreibung','$bezeichnunglieferant','$bestellnummer','$menge','$preis','$waehrung','$sort','$datum','$umsatzsteuer','angelegt','$projekt','$vpe')"); } function DeleteBelegPosition($doctype, $posid) { $arr = $this->app->DB->SelectArr("SELECT * FROM $doctype"."_position WHERE id = '$posid' LIMIT 1"); if(!$arr)return false; $this->app->DB->Delete("DELETE FROM $doctype"."_position WHERE id = '$posid' LIMIT 1"); $this->app->DB->Update("UPDATE $doctype"."_position SET sort = sort - 1 WHERE $doctype = '".$arr[0][$doctype]."' AND sort > ".$arr[0]['sort']); $akstort = $this->app->DB->SelectArr("SELECT sort FROM beleg_zwischenpositionen WHERE doctype = '$doctype' AND doctypeid = '".$arr[0][$doctype]."' AND pos = '".$arr[0]['sort']."' ORDER BY sort DESC LIMIT 1"); $offset = 0; if($aktsort)$offset = 1 + (int)$aktsort[0]['sort']; $this->app->DB->Update("UPDATE beleg_zwischenpositionen SET pos = pos - 1, sort = sort - $offset WHERE doctype = '$doctype' AND doctypeid = '".$arr[0][$doctype]."' AND pos = '".($arr[0]['sort'] + 1)."'"); $this->app->DB->Update("UPDATE beleg_zwischenpositionen SET pos = pos - 1 WHERE doctype = '$doctype' AND doctypeid = '".$arr[0][$doctype]."' AND pos > '".($arr[0]['sort'] + 1)."'"); return true; } function CopyBestellung($id) { $obj = $this->LoadModul('bestellung'); if(!empty($obj) && method_exists($obj, 'CopyBestellung')) { return $obj->CopyBestellung($id); } } function NextProjektnummer($abkuerzung) { $i = 1; $neu = $abkuerzung.$i; while($this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung = '".$this->app->DB->real_escape_string($neu)."' LIMIT 1")) { $i++; $neu =$abkuerzung.$i; } return $neu; } function CopyProjektDaten($fromid , $toid, $data = null) { $id = $fromid; $newid = $toid; $arbeitspakete = $this->app->DB->SelectArr("SELECT id,vorgaenger FROM arbeitspaket WHERE projekt = '$id'"); for ($i=0; $i < count($data['arbeitspaket']); $i++) { for ($j=0; $j < (!empty($arbeitspakete)?count($arbeitspakete):0); $j++) { if(($arbeitspakete[$j]['id'] == $data['arbeitspaket'][$i]) && ($arbeitspakete[$j]['vorgaenger'] != '0')){ if(!in_array($arbeitspakete[$j]['vorgaenger'], $data['arbeitspaket'])){ $data['arbeitspaket'][] = $arbeitspakete[$j]['vorgaenger']; } } } } if($arbeitspakete) { $alteNeueIds = array(); foreach($arbeitspakete as $arbeitspaket) { $do = true; if(is_null($data) || (!is_null($data) && !isset($data['arbeitspaket']) || !is_array($data['arbeitspaket']) || !in_array($arbeitspaket['id'], $data['arbeitspaket'])))$do = false; if($do) { $newpaket = $this->app->DB->MysqlCopyRow('arbeitspaket', 'id', $arbeitspaket['id']); $alteNeueIds[$arbeitspaket['id']] = $newpaket; $idtoid[$arbeitspaket['id']] = $newpaket; $newidtoold[$newpaket] = $arbeitspaket['id']; $this->app->DB->Update("UPDATE arbeitspaket SET status = 'offen', abgabedatum = '0000-00-00', startdatum = '0000-00-00', projekt = '$newid' WHERE id = '$newpaket' LIMIT 1"); } } foreach($arbeitspakete as $arbeitspaket) { if($arbeitspaket['vorgaenger'] && !empty($idtoid[$arbeitspaket['vorgaenger']]) && !empty($idtoid[$arbeitspaket['id']])) { $this->app->DB->Update("UPDATE arbeitspaket SET vorgaenger = '".$idtoid[$arbeitspaket['vorgaenger']]."' WHERE id = '".$idtoid[$arbeitspaket['id']]."' LIMIT 1"); } } unset($arbeitspakete); } $artikel = $this->app->DB->SelectArr("SELECT id,parent,teilprojekt FROM projekt_artikel WHERE projekt = '$id' and teilprojekt > 0"); if($artikel) { foreach($artikel as $art) { $do = true; if((!isset($idtoid) || !isset($idtoid[$art['teilprojekt']])))$do = false; if((!is_null($data) && (!isset($data['artikel']) || !is_array($data['artikel']) || !in_array($art['id'], $data['artikel']))))$do = false; if($do) { $newartikel = $this->app->DB->MysqlCopyRow('projekt_artikel', 'id', $art['id']); $this->app->DB->Update("UPDATE projekt_artikel SET projekt = '$newid' WHERE id = '$newartikel' LIMIT 1"); $this->app->DB->Update("UPDATE projekt_artikel SET teilprojekt = '".$newidtoold[$art['teilprojekt']]."' WHERE id = '$newartikel' LIMIT 1"); $idtoidart[$art['id']] = $newpaket; } } foreach($artikel as $art) { if($art['parent'] && !empty($idtoidart[$art['parent']]) && !empty($idtoidart[$art['id']])) { $this->app->DB->Update("UPDATE projekt_artikel SET parent = '".$idtoidart[$art['parent']]."' WHERE id = '".$idtoidart[$art['id']]."' LIMIT 1"); } } unset($idtoidart); unset($artikel); } $adressrollen = $this->app->DB->SelectArr("SELECT id FROM adresse_rolle WHERE projekt = '$id' AND objekt like 'Projekt' AND (bis = '0000-00-00' OR bis >= date(now()))"); if($adressrollen) { foreach($adressrollen as $rolle) { $do = true; if(!is_null($data) && (!isset($data['adressrollen']) || !is_array($data['adressrollen']) || !in_array($rolle['id'], $data['adressrollen'])))$do = false; if($do) { $newrolle = $this->app->DB->MysqlCopyRow('adresse_rolle', 'id', $rolle['id']); $this->app->DB->Update("UPDATE adresse_rolle SET projekt = '$newid' , parameter = '$newid' WHERE id = '$newrolle' LIMIT 1"); } } unset($adressrollen); } $aufgaben = $this->app->DB->SelectArr("SELECT a.id, a.aufgabe, ap.aufgabe AS teilprojekt, adr.name as mitarbeiter, a.status FROM aufgabe a LEFT JOIN projekt p ON p.id=a.projekt LEFT JOIN adresse adr ON a.adresse=adr.id LEFT JOIN arbeitspaket ap ON ap.id=a.teilprojekt WHERE a.projekt = '$id'"); if($aufgaben){ foreach($aufgaben as $aufgabe){ $do = true; if((!is_null($data) && (!isset($data['aufgaben']) || !is_array($data['aufgaben']) || !in_array($aufgabe['id'], $data['aufgaben']))))$do = false; if($do) { $newaufgabe = $this->app->DB->MysqlCopyRow('aufgabe', 'id', $aufgabe['id']); $this->app->DB->Update("UPDATE aufgabe SET projekt = '$newid', angelegt_am = CURDATE() WHERE id = '$newaufgabe' LIMIT 1"); $altesTeilprojekt = $this->app->DB->Select("SELECT teilprojekt FROM aufgabe WHERE id = '$newaufgabe' LIMIT 1"); if($altesTeilprojekt != '' && $altesTeilprojekt > 0){ if(is_array($alteNeueIds)){ if($alteNeueIds[$altesTeilprojekt] > 0){ $this->app->DB->Update("UPDATE aufgabe SET teilprojekt = '".$alteNeueIds[$altesTeilprojekt]."' WHERE id = '$newaufgabe' LIMIT 1"); }else{ $this->app->DB->Update("UPDATE aufgabe SET teilprojekt = 0 WHERE id = '$newaufgabe' LIMIT 1"); } } } } } unset($aufgaben); } $wiedervorlagen = $this->app->DB->SelectArr("SELECT id FROM wiedervorlage WHERE projekt = '$id'"); if($wiedervorlagen){ foreach($wiedervorlagen as $wiedervorlage){ $do = true; if(!is_null($data) && (!isset($data['wiedervorlagen']) || !is_array($data['wiedervorlagen']) || !in_array($wiedervorlage['id'], $data['wiedervorlagen']))){ $do = false; } if($do){ $neueWiedervorlage = $this->app->DB->MysqlCopyRow('wiedervorlage', 'id', $wiedervorlage['id']); $this->app->DB->Update("UPDATE wiedervorlage SET projekt = '$newid', parameter = '$newid' WHERE id = '$neueWiedervorlage' LIMIT 1"); } } unset($wiedervorlagen); } } /** * @param $id Project-ID to Copy * @param null $data unused * @return int|bool return new Project-Id or false on error */ public function CopyProjekt($id, $data = null) { $id = (int)$id; if(!empty($id)){ $id = $this->app->DB->Select("SELECT id FROM projekt WHERE id = '$id' LIMIT 1"); } if(empty($id)){ return false; } $newid = $this->app->DB->MysqlCopyRow('projekt', 'id', $id); if(empty($newid)) { return false; } $abkuerzung = $this->app->DB->Select("SELECT abkuerzung FROM projekt WHERE id = '$id' LIMIT 1"); $abkuerzungneu = $this->NextProjektnummer($abkuerzung); if(!empty($abkuerzungneu)){ $this->app->DB->Update("UPDATE projekt SET abkuerzung = '".$this->app->DB->real_escape_string($abkuerzungneu)."', status = 'gestartet' WHERE id = '$newid' LIMIT 1"); } return $newid; } /** * @param $doctype * @param $doctypeid * @return int|void */ public function getNextSort($doctype, $doctypeid) { if($doctypeid <= 0 || !is_numeric($doctypeid) || empty($doctype) || !is_string($doctype) || strpos($doctype,'`') !== false) { return; } return 1 + (int)$this->app->DB->Select('SELECT ifnull(max(sort),0) FROM `'.$doctype.'` WHERE id = '.$doctypeid); } public function CopyVerbindlichkeit($id){ /** @var Verbindlichkeit $obj */ $obj = $this->app->erp->LoadModul('verbindlichkeit'); if(!empty($obj) && method_exists($obj,'copyLiability')) { return $obj->copyLiability($id); } return 0; } public function CopyAuftrag($id) { if($id <= 0) { return; } // kopiere eintraege aus auftrag_position $arr = $this->app->DB->SelectArr( sprintf( "SELECT NOW() as datum,projekt,freitext,bodyzusatz,adresse,name,shopextid, standardlager,ansprechpartner,anschreiben, abteilung,unterabteilung,strasse,adresszusatz,plz,ort,land,ustid,email,telefon,telefax,betreff,kundennummer, ihrebestellnummer,typ, versandart,vertrieb,zahlungsweise,zahlungszieltage,lieferdatum,'angelegt' as status, rabatt,rabatt1,rabatt2,rabatt3,rabatt4,rabatt5,gruppe,vertriebid,bearbeiterid,provision,provision_summe, zahlungszieltageskonto,zahlungszielskonto,firma,'angelegt' as status,abweichendelieferadresse,liefername, lieferabteilung,lieferunterabteilung,ust_befreit,angebotid,kommissionskonsignationslager, lieferland,lieferstrasse,lieferort,lieferplz,lieferadresszusatz,lieferansprechpartner,autoversand,art, sprache,anzeigesteuer,waehrung,kurs,kostenstelle,gln,liefergln,bundesstaat,lieferemail, lieferbedingung FROM auftrag WHERE id=%d LIMIT 1", $id ) ); if(empty($arr)) { return; } $this->app->DB->Insert('INSERT INTO auftrag (id) VALUES (NULL)'); $newid = $this->app->DB->GetInsertID(); $arr[0]['kundennummer'] = $this->app->DB->Select("SELECT kundennummer FROM adresse WHERE id = '".$arr[0]['adresse']."' LIMIT 1"); $this->app->DB->UpdateArr('auftrag', $newid, 'id', $arr[0],true); $pos = $this->app->DB->SelectArr("SELECT * FROM auftrag_position WHERE auftrag='$id' order by sort, id"); $cpos = !empty($pos)?count($pos):0; for($i=0;$i<$cpos;$i++){ $this->app->DB->Insert("INSERT INTO auftrag_position (id) VALUES('')"); $newposid = $this->app->DB->GetInsertID(); $altzuneu[$pos[$i]['id']] = $newposid; $pos[$i]['auftrag']=$newid; if($pos[$i]['explodiert_parent'] && isset($altzuneu[$pos[$i]['explodiert_parent']]))$pos[$i]['explodiert_parent'] = $altzuneu[$pos[$i]['explodiert_parent']]; $this->app->DB->UpdateArr('auftrag_position',$newposid,'id',$pos[$i],true); if(is_null($pos[$i]['steuersatz'])){ $this->app->DB->Update("UPDATE auftrag_position SET steuersatz = null WHERE id = '$newposid' LIMIT 1"); } } $this->CheckFreifelder('auftrag',$newid); $this->CopyBelegZwischenpositionen('auftrag',$id,'auftrag',$newid); $this->app->DB->Update("UPDATE auftrag_position SET geliefert=0, geliefert_menge=0 WHERE auftrag='$newid'"); $this->LoadSteuersaetzeWaehrung($newid,'auftrag'); $this->SchnellFreigabe('auftrag',$newid); return $newid; } function CopyGutschrift($id) { $obj = $this->LoadModul('gutschrift'); if(!empty($obj) && method_exists($obj,'CopyGutschrift')) { return $obj->CopyGutschrift($id); } } function CopyRechnung($id) { $obj = $this->LoadModul('rechnung'); if(!empty($obj) && method_exists($obj,'CopyRechnung')){ return $obj->CopyRechnung($id); } } function CopyPreisanfrage($id) { /** @var Preisanfrage $obj */ $obj = $this->app->erp->LoadModul('preisanfrage'); if(!empty($obj) && method_exists($obj,'CopyPreisanfrage')) { return $obj->CopyPreisanfrage($id); } return 0; } function CopyProformarechnung($id) { $this->app->DB->Insert("INSERT INTO proformarechnung (id) VALUES ('')"); $newid = $this->app->DB->GetInsertID(); $arr = $this->app->DB->SelectArr("SELECT NOW() as datum,projekt,freitext,bodyzusatz,adresse,'' as belegnr,name,abteilung,unterabteilung,strasse,adresszusatz,plz,ort,land,ustid,email,telefon,telefax,betreff,lieferantennummer,bearbeiter,'angelegt' as status,typ,sprache,waehrung, firma FROM proformarechnung WHERE id='$id' LIMIT 1"); $this->app->DB->UpdateArr('proformarechnung', $newid, 'id',$arr[0],true); $pos = $this->app->DB->SelectArr("SELECT * FROM proformarechnung_position WHERE proformarechnung='$id'"); $cpos = !empty($pos)?count($pos):0; for($i=0;$i<$cpos;$i++) { $this->app->DB->Insert("INSERT INTO proformarechnung_position (id) VALUES('')"); $newposid = $this->app->DB->GetInsertID(); $pos[$i]['proformarechnung']=$newid; $this->app->DB->UpdateArr('proformarechnung_position',$newposid,'id',$pos[$i],true); if(is_null($pos[$i]['steuersatz'])) { $this->app->DB->Update("UPDATE proformarechnung_position SET steuersatz = null WHERE id = '$newposid' LIMIT 1"); } } $this->CheckFreifelder("proformarechnung",$newid); $this->CopyBelegZwischenpositionen("proformarechnung",$id,"proformarechnung",$newid); $this->LoadSteuersaetzeWaehrung($newid,"proformarechnung"); return $newid; } function CopyAnfrage($id) { $this->app->DB->Insert("INSERT INTO anfrage (id) VALUES ('')"); $newid = $this->app->DB->GetInsertID(); $arr = $this->app->DB->SelectArr("SELECT NOW() as datum,projekt,bodyzusatz,freitext,adresse,CONCAT(name,' (Kopie)') as name,abteilung,unterabteilung,strasse,adresszusatz,plz,ort,land,ustid,email,telefon,telefax,betreff,kundennummer,bearbeiter,'angelegt' as status,typ, firma FROM anfrage WHERE id='$id' LIMIT 1"); $this->app->DB->UpdateArr('anfrage', $newid, 'id',$arr[0],true); $pos = $this->app->DB->SelectArr("SELECT * FROM anfrage_position WHERE anfrage='$id'"); $cpos = !empty($pos)?count($pos):0; for($i=0;$i<$cpos;$i++) { $this->app->DB->Insert("INSERT INTO anfrage_position (id) VALUES('')"); $newposid = $this->app->DB->GetInsertID(); $pos[$i]['anfrage']=$newid; $this->app->DB->UpdateArr('anfrage_position',$newposid,'id',$pos[$i],true); if(is_null($pos[$i]['steuersatz'])) { $this->app->DB->Update("UPDATE anfrage_position SET steuersatz = null WHERE id = '$newposid' LIMIT 1"); } } $this->CheckFreifelder("anfrage",$newid); $this->CopyBelegZwischenpositionen("anfrag",$id,"anfrage",$newid); $this->LoadSteuersaetzeWaehrung($newid,"anfrage"); return $newid; } function CopyInventur($id) { /** @var Inventur $obj */ $obj = $this->LoadModul('inventur'); if(!empty($obj) && method_exists($obj, 'CopyInventur')) { return $obj->CopyInventur($id); } return 0; } /** * @deprecated * */ public function CopyKalkulation($id) { $obj = $this->LoadModul('kalkulation'); if(!empty($obj) && method_exists($obj,'CopyKalkulation')) { return $obj->CopyKalkulation($id); } } /** * @deprecated * */ public function CopyReisekosten($id) { /** @var Reisekosten $obj */ $obj = $this->LoadModul('reisekosten'); if(!empty($obj) && method_exists($obj,'CopyReisekosten')) { return $obj->CopyReisekosten($id); } return 0; } /** * @param $id * * @return int|null */ public function CopyArbeitsnachweis($id) { /** @var Arbeitsnachweis $obj */ $obj = $this->app->erp->LoadModul('arbeitsnachweis'); if(!empty($obj) && method_exists($obj, 'CopyArbeitsnachweis')) { return $obj->CopyArbeitsnachweis($id); } return 0; } /** * @param $id * * @return int|null */ public function CopyLieferschein($id) { /** @var Lieferschein $obj */ $obj = $this->LoadModul('lieferschein'); if(!empty($obj) && method_exists($obj, 'CopyLieferschein')){ return $obj->CopyLieferschein($id); } return null; } /** * @param int $id * * @return int|null */ public function CopyRetoure($id) { $this->app->DB->Insert("INSERT INTO retoure (id) VALUES ('')"); $newid = $this->app->DB->GetInsertID(); $arr = $this->app->DB->SelectArr("SELECT NOW() as datum,projekt,lieferschein,lieferscheinid,bodyzusatz,freitext,adresse,name,abteilung,unterabteilung,strasse,adresszusatz,plz,ort,land,ustid,email,telefon,telefax,betreff,kundennummer,versandart,bearbeiter,'angelegt' as status,typ,standardlager,ansprechpartner,titel,anschreiben, firma FROM retoure WHERE id='$id' LIMIT 1"); $this->app->DB->UpdateArr('retoure',$newid,'id',$arr[0],true); $pos = $this->app->DB->SelectArr("SELECT * FROM retoure_position WHERE retoure='$id'"); $cpos = !empty($pos)?count($pos):0; for($i=0;$i<$cpos;$i++) { $this->app->DB->Insert("INSERT INTO retoure_position (id) VALUES(NULL)"); $newposid = $this->app->DB->GetInsertID(); $altzuneu[$pos[$i]['id']] = $newposid; $pos[$i]['lagertext']=''; $pos[$i]['retoure']=$newid; $pos[$i]['menge_eingang'] = 0; $pos[$i]['menge_gutschrift'] = 0; $pos[$i]['geliefert'] = 0; if($pos[$i]['explodiert_parent'] && isset($altzuneu[$pos[$i]['explodiert_parent']])) { $pos[$i]['explodiert_parent'] = $altzuneu[$pos[$i]['explodiert_parent']]; } $this->app->DB->UpdateArr('retoure_position',$newposid,'id',$pos[$i],true); } $this->CheckFreifelder('retoure',$newid); $this->CopyBelegZwischenpositionen('retoure',$id,'retoure',$newid); $this->app->DB->Update("UPDATE retoure_position SET geliefert=0, abgerechnet=0 WHERE retoure='$newid'"); $this->SchnellFreigabe("retoure",$newid); return $newid; } function CopyBelegZwischenpositionen($orgtyp,$orgid,$newtyp,$newid, $zwischenpositionen = null) { $where = ''; if($zwischenpositionen) { foreach($zwischenpositionen as $v) { $wherea[] = " id = '$v' "; $where = ' AND ('.implode(' OR ', $wherea).") "; } } $belegpositionen = $this->app->DB->SelectArr("SELECT * FROM beleg_zwischenpositionen WHERE doctype = '$orgtyp' AND doctypeid = '$orgid' $where "); if($belegpositionen) { $cpos = !empty($belegpositionen)?count($belegpositionen):0; for($i=0;$i<$cpos;$i++) { $this->app->DB->Insert('INSERT INTO beleg_zwischenpositionen (id) VALUES (NULL)'); $newposid = $this->app->DB->GetInsertID(); $belegpositionen[$i]['doctypeid']=$newid; $belegpositionen[$i]['doctype']=$newtyp; $this->app->DB->UpdateArr('beleg_zwischenpositionen',$newposid,'id',$belegpositionen[$i],true); } } } function CopyAngebot($id) { // kopiere eintraege aus angebot_position $this->app->DB->Insert("INSERT INTO angebot (id) VALUES ('')"); $newid = $this->app->DB->GetInsertID(); $arr = $this->app->DB->SelectRow("SELECT NOW() as datum,projekt,anfrage,bodyzusatz,freitext,adresse,name,abteilung,unterabteilung,strasse,adresszusatz,plz,ort,land,ustid,email,telefon,telefax,betreff,kundennummer,versandart,vertrieb,zahlungsweise,zahlungszieltage,ust_befreit,lieferdatum,DATE_ADD(curdate(),INTERVAL ".((int)$this->app->erp->Firmendaten("angebot_anzahltage")>0?(int)$this->app->erp->Firmendaten("angebot_anzahltage"):28)." DAY) as gueltigbis,'angelegt' as status,rabatt,rabatt1,rabatt2,rabatt3,rabatt4,rabatt5,gruppe,vertriebid,bearbeiterid,provision,provision_summe,typ,aktion,titel,ansprechpartner,anschreiben,keinsteuersatz, zahlungszieltageskonto,standardlager,zahlungszielskonto,firma,abweichendelieferadresse,liefername,lieferabteilung,lieferunterabteilung, lieferland,lieferstrasse,lieferort,lieferplz,lieferadresszusatz,lieferansprechpartner,liefergln,lieferemail,gln,liefertitel,internebezeichnung,lieferdatumkw,lieferbedingung,gesamtsummeausblenden ,sprache,anzeigesteuer,waehrung,kurs,kostenstelle FROM angebot WHERE id='$id' LIMIT 1"); $this->app->DB->UpdateArr('angebot', $newid, 'id', $arr, true); $pos = $this->app->DB->SelectArr("SELECT * FROM angebot_position WHERE angebot='$id'"); $cpos = !empty($pos)?count($pos):0; for($i=0;$i<$cpos;$i++) { $this->app->DB->Insert("INSERT INTO angebot_position (id) VALUES('')"); $newposid = $this->app->DB->GetInsertID(); $pos[$i]['angebot']=$newid; $this->app->DB->UpdateArr('angebot_position',$newposid,'id',$pos[$i],true); if(is_null($pos[$i]['steuersatz'])) { $this->app->DB->Update("UPDATE angebot_position SET steuersatz = null WHERE id = '$newposid' LIMIT 1"); } } $this->CopyBelegZwischenpositionen('angebot',$id,'angebot',$newid); $this->LoadSteuersaetzeWaehrung($newid,'angebot'); $this->SchnellFreigabe('angebot',$newid); return $newid; } function WeiterfuehrenDateianhang($vonbelegtyp,$vonbelegid,$nachbelegtyp,$nachbelegid){ $dateien = $this->app->DB->SelectArr("SELECT datei, subjekt,parameter2,objekt2 FROM datei_stichwoerter WHERE objekt LIKE '$vonbelegtyp' AND parameter = '$vonbelegid'"); if($dateien != ""){ foreach($dateien as $key=>$value){ $this->app->erp->AddDateiStichwort($value['datei'], $value['subjekt'], $nachbelegtyp, $nachbelegid,false,$value['parameter2'],$value['objekt2']); } } } function WeiterfuehrenAuftragZuLieferschein($id, $positionen = null, $zwischenpositionen = null) { if($id <= 0) { return null; } // pruefe ob auftrag status=angelegt, dann vergebe belegnr $this->CheckClass('FormHandler'); $this->RunHook('WeiterfuehrenAuftragZuLieferschein', 1, $id); $orderArr = $this->app->DB->SelectRow( sprintf( 'SELECT projekt,status,belegnr FROM auftrag WHERE id=%d LIMIT 1', $id ) ); $projekt = $orderArr['projekt']; $nurlagerartikel = $this->app->DB->Select("SELECT nurlagerartikel FROM projekt WHERE id = '$projekt' LIMIT 1"); $status = $orderArr['status']; $checkbelegnr = $orderArr['belegnr']; if($status === 'angelegt' && $checkbelegnr == ''){ $belegnr = $this->GetNextNummer("auftrag", $projekt, $id); $this->app->DB->Update("UPDATE auftrag SET belegnr='$belegnr', status='freigegeben' WHERE id='$id' LIMIT 1"); $this->AuftragProtokoll($id, "Auftrag freigegeben"); // auftrag abschliessen und event senden $this->EventAPIAdd("EventAuftragEdit", $id, "auftrag", "edit"); } $bundesland = $this->app->DB->Select("SELECT bundesland FROM auftrag WHERE id = '$id' LIMIT 1"); $bundesstaat = $this->app->DB->Select("SELECT bundesstaat FROM auftrag WHERE id = '$id' LIMIT 1"); $arr = $this->app->DB->SelectArr("SELECT datum,ihrebestellnummer,projekt,belegnr as auftrag,bodyzusatz,freitext,adresse,name,abteilung,unterabteilung,strasse,adresszusatz,titel,lieferbedingung,ansprechpartner,plz,ort,land,ustid,email,telefon,telefax,betreff,kundennummer,versandart,vertrieb,zahlungsweise,zahlungszieltage,anschreiben, id as auftragid,vertriebid, bearbeiter,bearbeiterid, internebemerkung,projektfiliale,typ,standardlager,ust_befreit,gln, ohne_artikeltext,sprache,kostenstelle,lieferid, zahlungszieltageskonto,zahlungszielskonto,firma,'angelegt' as status,internebezeichnung,lieferantenauftrag as lieferantenretoure,lieferant,kommissionskonsignationslager FROM auftrag WHERE id='$id' LIMIT 1"); $check_mail = $this->app->DB->Select("SELECT lieferschein_email FROM adresse WHERE id='".$arr[0]['adresse']."'"); if($check_mail!="") { $arr[0]['email'] = $check_mail; } $arr2 = $this->app->DB->SelectArr("SELECT gln, liefergln FROM auftrag WHERE id = '$id' LIMIT 1"); $abweichendelieferadresse = $this->app->DB->Select("SELECT abweichendelieferadresse FROM auftrag WHERE id='$id' LIMIT 1"); $tmparrliefer = $this->app->DB->SelectArr("SELECT * FROM auftrag WHERE id='$id' LIMIT 1"); foreach($tmparrliefer[0] as $k => $v) { $tmparrliefer[0][$k] = $this->app->DB->real_escape_string($v); } $versandart = $this->app->DB->Select("SELECT versandart FROM auftrag WHERE id='$id' LIMIT 1"); $poswheretmp = ''; if($this->Firmendaten("dienstleistungsartikel_nicht_zu_lieferschein")=="1"){ $poswheretmp = ' AND art.dienstleistung = 0'; } if(!empty($positionen)) { $posa = null; foreach($positionen as $v) { $posa[] = " ap.id = '$v' "; } $poswheretmp .= ' AND ('.implode(' OR ',$posa).') '; } if($nurlagerartikel) { $pos = $this->app->DB->SelectArr("SELECT ap.*,art.porto AS artikelporto FROM auftrag_position ap INNER JOIN artikel art ON ap.artikel = art.id AND (art.lagerartikel = 1 OR (art.stueckliste = 1 AND art.juststueckliste = 1)) WHERE ap.auftrag='$id' $poswheretmp order by ap.sort"); }else{ $pos = $this->app->DB->SelectArr("SELECT ap.*,art.porto AS artikelporto FROM auftrag_position ap LEFT JOIN artikel art ON ap.artikel = art.id WHERE ap.auftrag='$id' $poswheretmp order by ap.sort"); } if(empty($pos)) { return null; } $portoartikelArr = []; $haspositions = false; foreach($pos as $positem) { $portoartikelArr[$positem['id']] = $positem['artikelporto']; if((int)$positem['artikelporto']===0) { $haspositions = true; } } if(!$haspositions){ return null; } $newid = $this->CreateLieferschein($arr[0]['adresse']); if($this->Firmendaten('dateienweiterfuehren')){ $this->WeiterfuehrenDateianhang("Auftrag", $id, "Lieferschein", $newid); } $this->app->DB->UpdateArr("lieferschein",$newid,'id',$arr[0],true); if(!empty($bundesland)){ $this->app->DB->Update("UPDATE lieferschein SET bundesland='".$this->app->DB->real_escape_string($bundesland)."' WHERE id='$newid' LIMIT 1"); } if(!empty($bundesstaat)){ $this->app->DB->Update("UPDATE lieferschein SET bundesstaat='".$this->app->DB->real_escape_string($bundesstaat)."' WHERE id='$newid' LIMIT 1"); } $this->app->DB->Update("UPDATE lieferschein SET datum=NOW() WHERE id='$newid' LIMIT 1"); //lieferadresse wenn abweichend!!!! if($abweichendelieferadresse && $versandart!="packstation") { if($tmparrliefer[0]['lieferemail']=="") { $tmparrliefer[0]['lieferemail'] = $arr[0]['email']; } //liefername lieferland lieferstrasse lieferort lieferplz lieferadresszusatz $this->app->DB->Update("UPDATE lieferschein SET name='{$tmparrliefer[0]['liefername']}', abteilung='{$tmparrliefer[0]['lieferabteilung']}', unterabteilung='{$tmparrliefer[0]['lieferunterabteilung']}',strasse='{$tmparrliefer[0]['lieferstrasse']}',titel='{$tmparrliefer[0]['liefertitel']}', email='{$tmparrliefer[0]['lieferemail']}', adresszusatz='{$tmparrliefer[0]['lieferadresszusatz']}', plz='{$tmparrliefer[0]['lieferplz']}',ort='{$tmparrliefer[0]['lieferort']}',land='{$tmparrliefer[0]['lieferland']}',ansprechpartner='{$tmparrliefer[0]['lieferansprechpartner']}' WHERE id='$newid' LIMIT 1"); if($tmparrliefer[0]['liefergln']!="") $this->app->DB->Update("UPDATE lieferschein SET gln = '{$tmparrliefer[0]['liefergln']}' WHERE id = '$newid' LIMIT 1"); if($tmparrliefer[0]['lieferbundesstaat']!='') { $this->app->DB->Update("UPDATE `lieferschein` SET `bundesstaat` = '{$tmparrliefer[0]['lieferbundesstaat']}' WHERE `id` = '{$newid}' LIMIT 1"); } } //lieferadresse wenn packstation if($versandart=="packstation") { //packstation_inhaber packstation_station packstation_ident packstation_plz packstation_ort $this->app->DB->Update("UPDATE lieferschein SET name='{$tmparrliefer[0]['packstation_inhaber']}', unterabteilung='',strasse='Packstation Nr. {$tmparrliefer[0]['packstation_station']}', adresszusatz='{$tmparrliefer[0]['packstation_ident']}', plz='{$tmparrliefer[0]['packstation_plz']}',ort='{$tmparrliefer[0]['packstation_ort']}' WHERE id='$newid' LIMIT 1"); } $portosorts = null; $cpos = $pos?count($pos):0; for($i=0;$i<$cpos;$i++){ /* nur lager artikel in den Lieferschein */ $portoartikel = !empty($portoartikel)?$portoartikelArr[$pos[(int) $i]]:0; if($portoartikel==0) { $this->app->DB->Insert("INSERT INTO lieferschein_position (id) VALUES('')"); $newposid = $this->app->DB->GetInsertID(); $auftragzulieferschein[$pos[$i]['id']] = $newposid; $pos[$i]['lieferschein']=$newid; $pos[$i]['auftrag_position_id']=$pos[$i]['id']; if($pos[$i]['explodiert']) { $pos[$i]['bezeichnung'] = $pos[$i]['bezeichnung'];//." (Stückliste)"; } if($pos[$i]['explodiert_parent'] > 0) { $aktlvl = 1; $aktparent = $pos[$i]['explodiert_parent']; while(true) { if($aktlvl > 10) { break; } $aktparent = $this->app->DB->Select("SELECT explodiert_parent FROM auftrag_position WHERE id = '".$aktparent."' LIMIT 1"); if(!$aktparent) { break; } $aktlvl++; } if($aktlvl > 1) { $pos[$i]['bezeichnung'] = str_repeat("*", $aktlvl - 1).$pos[$i]['bezeichnung']; } $pos[$i]['explodiert_parent_artikel'] = $this->app->DB->Select("SELECT artikel FROM auftrag_position WHERE id='".$pos[$i]['explodiert_parent']."' LIMIT 1"); $pos[$i]['explodiert_parent'] = isset($auftragzulieferschein[$pos[$i]['explodiert_parent']])?$auftragzulieferschein[$pos[$i]['explodiert_parent']]:0; } $this->app->DB->UpdateArr("lieferschein_position",$newposid,'id',$pos[$i],true); }else{ $portosorts[] = $i; } } if($this->Firmendaten('auftragabschliessen')!='1') { $this->app->DB->Update("UPDATE auftrag SET status='abgeschlossen',schreibschutz='1' WHERE id='$id' LIMIT 1"); $this->app->DB->Update("UPDATE auftrag_position SET geliefert_menge=menge WHERE auftrag='$id'"); } $this->CheckFreifelder("lieferschein",$newid); if(!empty($positionen) && !empty($zwischenpositionen)){ $this->CopyBelegZwischenpositionen('auftrag', $id, 'lieferschein', $newid, $zwischenpositionen); } elseif(empty($positionen)) { $this->CopyBelegZwischenpositionen('auftrag', $id, 'lieferschein', $newid); } if(!empty($portosorts)) { foreach($portosorts as $k => $v) { if($v == (!empty($pos)?count($pos):0) -1) { $this->app->DB->Delete("DELETE FROM beleg_zwischenpositionen WHERE doctype = 'lieferschein' AND doctypeid = '$newid' AND pos = '".($v)."' AND postype LIKE 'gruppe'"); } elseif($this->app->DB->Select("SELECT id FROM beleg_zwischenpositionen WHERE doctype = 'lieferschein' AND doctypeid = '$newid' AND pos = '".($v+1)."' AND postype LIKE 'gruppe' LIMIT 1")) { $this->app->DB->Delete("DELETE FROM beleg_zwischenpositionen WHERE doctype = 'lieferschein' AND doctypeid = '$newid' AND pos = '".($v)."' AND postype LIKE 'gruppe'"); } } } $this->BelegNeusortieren('lieferschein', $newid); // auftrag freigeben!!! $this->SchnellFreigabe("lieferschein",$newid); $this->LieferscheinNeuberechnen($newid); $this->RunHook('weiterfuehrenauftragzulieferschein_ende', 2, $id, $newid); return $newid; } function BelegNeusortieren($doctype, $id) { $arr = $this->app->DB->SelectArr("SELECT id, sort FROM $doctype"."_position WHERE $doctype = '$id' ORDER BY sort, id"); if(empty($arr)) { return; } $altsort = 0; foreach($arr as $k => $v) { if($v['sort'] > ($k+1)) { $diff = $v['sort'] - ($k+1); $this->app->DB->Update("UPDATE $doctype"."_position SET sort = sort - $diff WHERE id = '".$v['id']."' LIMIT 1"); for($sort = ($k+1); $sort < $v['sort']; $sort++) { $beleg_zwischenpositionensort = $this->app->DB->SelectArr("SELECT id, sort FROM beleg_zwischenpositionen where doctype = '$doctype' AND doctypeid = '$id' AND pos = '".($sort-1)."' ORDER BY sort DESC LIMIT 1"); $offset = 0; if($beleg_zwischenpositionensort) { $offset = 1 + $beleg_zwischenpositionensort[0]['sort']; } $this->app->DB->Update("UPDATE beleg_zwischenpositionen SET pos = pos - $diff, sort = sort + $offset WHERE doctype = '$doctype' AND doctypeid = '$id' AND pos = '$sort'"); } } } //Belegpositionen nach letzter Position $sort = (!empty($arr)?count($arr):0); $restpositionen = $this->app->DB->SelectArr("SELECT id FROM beleg_zwischenpositionen where doctype = '$doctype' AND doctypeid = '$id' AND pos > $sort ORDER BY pos, sort"); if($restpositionen) { $beleg_zwischenpositionensort = $this->app->DB->SelectArr("SELECT id, sort FROM beleg_zwischenpositionen where doctype = '$doctype' AND doctypeid = '$id' AND pos = '".($sort)."' ORDER BY sort DESC LIMIT 1"); $offset = 0; if($beleg_zwischenpositionensort) { $offset = 1 + $beleg_zwischenpositionensort[0]['sort']; } foreach($restpositionen as $k => $v) { $this->app->DB->Update("UPDATE beleg_zwischenpositionen SET pos = '".$sort."', sort = '".($offset + $k)."' WHERE id = '".$v['id']."' LIMIT 1"); } } //Luecken in Zwischenpositionen $restpositionen = $this->app->DB->SelectArr("SELECT id,pos,sort FROM beleg_zwischenpositionen where doctype = '$doctype' AND doctypeid = '$id' ORDER BY pos, sort"); if(empty($restpositionen)) { return; } $aktpos = -1; $k2 = -1; foreach($restpositionen as $k => $v) { if($v['pos'] != $aktpos) { $k2 = -1; $aktpos = $v['pos']; } $k2++; if($v['sort'] > $k2) { $this->app->DB->Update("UPDATE beleg_zwischenpositionen SET sort = $k2 WHERE id = '".$v['id']."' LIMIT 1"); } } } function CheckFreifelderEinzelPos($table, $id, $force = false, $posid = 0){ $language = $this->app->erp->GetSpracheBelegISO($table,$id); $pos = $this->app->DB->SelectRow("SELECT * FROM ".$table."_position WHERE ".$table."='$id' AND id = '$posid' LIMIT 1"); if(empty($pos)) { return; } $artikel_id = $pos['artikel']; $tmpfreifelder = $this->app->DB->SelectArr("SELECT * FROM artikel WHERE id='".$artikel_id."' LIMIT 1"); if(empty($tmpfreifelder)) { return; } $langFreifeld = []; $freifelderLang = $this->app->DB->SelectArr("SELECT nummer, wert FROM artikel_freifelder WHERE artikel=$artikel_id AND sprache='$language'"); if(!empty($freifelderLang)) { foreach($freifelderLang as $freifelderLangRow) { $langFreifeld[(int)$freifelderLangRow['nummer']] = $freifelderLangRow['wert']; } } for($ifreifeld=1; $ifreifeld<=40; $ifreifeld++) { $check_language = !empty($langFreifeld[$ifreifeld])?$langFreifeld[$ifreifeld]:''; $tmpfreifelder[0]['freifeld'.$ifreifeld] = $this->app->DB->real_escape_string(($check_language!=""?$check_language:$tmpfreifelder[0]['freifeld'.$ifreifeld])); } switch($table){ case "angebot": $kurz="an"; break; case "auftrag": $kurz="ab"; break; case "rechnung": $kurz="re"; break; case "gutschrift": $kurz="gs"; break; case "lieferschein": $kurz="ls"; break; case "bestellung": $kurz="be"; break; case "proformarechnung": $kurz="pr"; break; case "preisanfrage": $kurz="pa"; break; case "produktion": $kurz="pd"; break; } for($ifreifeld=1; $ifreifeld<=40; $ifreifeld++){ $pos['freifeld'.$ifreifeld] = $this->app->DB->real_escape_string($pos['freifeld'.$ifreifeld]); if($this->app->erp->Firmendaten("freifeld".$ifreifeld.$kurz)=="1" && $pos['freifeld'.$ifreifeld] == ""){ $this->app->DB->Update("UPDATE ".$table."_position SET freifeld".$ifreifeld."='".$tmpfreifelder[0]['freifeld'.$ifreifeld]."' WHERE id='".$pos['id']."'"); } elseif($this->app->erp->Firmendaten("freifeld".$ifreifeld.$kurz)=="1" && $pos['freifeld'.$ifreifeld] != ""){ $this->app->DB->Update("UPDATE ".$table."_position SET freifeld".$ifreifeld."='".($force?$tmpfreifelder[0]['freifeld'.$ifreifeld]:$pos['freifeld'.$ifreifeld])."' WHERE id='".$pos['id']."'"); } elseif($this->app->erp->Firmendaten("freifeld".$ifreifeld.$kurz)!="1"){ $this->app->DB->Update("UPDATE ".$table."_position SET freifeld".$ifreifeld."='' WHERE id='".$pos['id']."'"); } } } // entsprechend der Firmendaten die Freifelder beim Weiterfuehren vom Dokument fuellen function CheckFreifelder($table,$id, $force = false) { $language = $this->app->erp->GetSpracheBelegISO($table,$id); $pos = $this->app->DB->SelectArr( sprintf( 'SELECT * FROM `%s` WHERE `%s`=%d', $table.'_position', $table, (int)$id ) ); if(empty($pos)) { return; } $articles = []; foreach($pos as $row) { if((int)$row['artikel'] > 0 && !in_array((int)$row['artikel'], $articles)) { $articles[] = (int)$row['artikel']; } } $freifelderLangs = []; $freifelderLangQuery = $this->app->DB->Query('SELECT artikel, nummer, wert FROM artikel_freifelder WHERE artikel IN ('.implode(', ', $articles).") AND sprache='$language'"); if(!empty($freifelderLangQuery)) { while ($row = $this->app->DB->Fetch_Assoc($freifelderLangQuery)) { $freifelderLangs[$row['artikel']][] = $row; } $this->app->DB->free($freifelderLangQuery); } $articleQuery = $this->app->DB->Query('SELECT * FROM artikel WHERE id IN ('.implode(', ', $articles).')'); if(!empty($articleQuery)){ while ($row = $this->app->DB->Fetch_Assoc($articleQuery)) { $articles[$row['id']] = $row; } $this->app->DB->free($articleQuery); } switch($table) { case 'angebot': $kurz='an'; break; case 'auftrag': $kurz='ab'; break; case 'rechnung': $kurz='re'; break; case 'gutschrift': $kurz='gs'; break; case 'lieferschein': $kurz='ls'; break; case 'bestellung': $kurz='be'; break; case 'proformarechnung': $kurz='pr'; break; case 'preisanfrage': $kurz='pa'; break; case 'produktion': $kurz='pd'; break; } $cpos = (!empty($pos)?count($pos):0); for($i=0;$i<$cpos;$i++) { $artikel_id = $pos[$i]['artikel']; $tmpfreifelder = !empty($articles[$artikel_id])?[$articles[$artikel_id]]:null; if(!empty($tmpfreifelder)) { $langFreifeld = []; $freifelderLang = !empty($freifelderLangs[$artikel_id])?$freifelderLangs[$artikel_id]:null; if(!empty($freifelderLang)) { foreach($freifelderLang as $freifelderLangRow) { $langFreifeld[(int)$freifelderLangRow['nummer']] = $freifelderLangRow['wert']; } } for($ifreifeld=1;$ifreifeld<=40;$ifreifeld++) { $check_language = !empty($langFreifeld[$ifreifeld])?$langFreifeld[$ifreifeld]:''; $tmpfreifelder[0]['freifeld'.$ifreifeld] = $this->app->DB->real_escape_string(($check_language!=""?$check_language:$tmpfreifelder[0]['freifeld'.$ifreifeld])); } $updateArr = []; for($ifreifeld=1;$ifreifeld<=40;$ifreifeld++) { $isFreifeldKurz = $this->app->erp->Firmendaten('freifeld'.$ifreifeld.$kurz)=='1'; $posFreifeld = $pos[$i]['freifeld'.$ifreifeld]; $posFreifeldEscaped = $this->app->DB->real_escape_string($posFreifeld); if($isFreifeldKurz && $posFreifeld=='' && $posFreifeld !== $tmpfreifelder[0]['freifeld' . $ifreifeld]){ $updateArr['freifeld'.$ifreifeld] = $tmpfreifelder[0]['freifeld' . $ifreifeld]; } else if($isFreifeldKurz && $pos[$i]['freifeld'.$ifreifeld]!=''){ $newValue = ($force ? $tmpfreifelder[0]['freifeld' . $ifreifeld] : $posFreifeldEscaped); if($posFreifeld !== $newValue){ $updateArr['freifeld'.$ifreifeld] = $newValue; } } else if (!$isFreifeldKurz && $posFreifeld !== '') { $updateArr['freifeld'.$ifreifeld] = ''; } } if(!empty($updateArr)) { $this->app->DB->UpdateArr($table.'_position', (int)$pos[$i]['id'], 'id', $updateArr); } } } } function LagerAuslagernObjektLagerPlatz($artikel,$pos, $regal,$menge, $objekt = 'lieferschein') { $check = $this->app->DB->SelectArr("SELECT * FROM objekt_lager_platz WHERE lager_platz = '$regal' AND objekt = '$objekt' AND parameter = '$pos' AND artikel = '$artikel' LIMIT 1"); if($check) { $this->app->DB->Update("UPDATE objekt_lager_platz set menge = menge + '".$menge."' WHERE id = '".$check[0]['id']."'"); }else{ $this->app->DB->Insert("INSERT into objekt_lager_platz (objekt, lager_platz, parameter, artikel,menge) values ('$objekt', '$regal', '$pos','$artikel' ,'$menge')"); } } function LagerAuslagernText($artikel,$pos, $regal,$menge, $objekt = 'lieferschein') { $this->LagerAuslagernObjektLagerPlatz($artikel,$pos, $regal,$menge, $objekt); $this->AddLagerPlatzText($pos, $objekt); } function AddLagerPlatzText($parameter, $objekt = 'lieferschein',$return=false) { $parameter = (int)$parameter; $olp = $this->app->DB->SelectArr("SELECT * FROM objekt_lager_platz WHERE objekt = '$objekt' AND parameter = '$parameter' ORDER BY menge DESC"); $text = ''; foreach($olp as $k => $v) { $kurzbezeichnung = $this->app->DB->Select("SELECT kurzbezeichnung FROM lager_platz WHERE id = '".$v['lager_platz']."' LIMIT 1"); if($text != '')$text .= ', '; if($v['menge'] == round($v['menge']))$v['menge'] = round($v['menge']); $text .= $kurzbezeichnung.' ('.$v['menge'].')'; } if($return) return $text; switch($objekt) { case 'lieferschein': $this->app->DB->Update("UPDATE ".$objekt."_position SET lagertext = '$text' WHERE id = '$parameter' LIMIT 1"); break; } return true; } function WeiterfuehrenLieferscheinZuRechnung($id) { $adresse = $this->app->DB->Select("SELECT adresse FROM lieferschein WHERE id='$id' LIMIT 1"); $newid = $this->CreateRechnung($adresse); if($this->Firmendaten('dateienweiterfuehren')){ $this->WeiterfuehrenDateianhang("Lieferschein", $id, "Rechnung", $newid); } $this->LoadRechnungStandardwerte($newid,$adresse); if($newid)$this->app->DB->Update("UPDATE lieferschein SET rechnungid = '$newid' WHERE (rechnungid = 0 OR isnull(rechnungid)) AND id = '$id' LIMIT 1"); if($newid)$this->app->DB->Update("UPDATE lieferschein_position SET abgerechnet = '1' WHERE lieferschein = '$id'"); if($newid)$this->app->DB->Update("UPDATE rechnung SET lieferschein = '$id' WHERE id = '$newid' LIMIT 1"); if($this->app->erp->Firmendaten("schnellanlegen_ohnefreigabe")=="1") { $arr = $this->app->DB->SelectArr("SELECT NOW() as datum,ihrebestellnummer,projekt, anschreiben, id as lieferschein,bodyzusatz,auftrag,auftragid, internebemerkung, freitext,adresse,name,abteilung,unterabteilung,strasse,adresszusatz,ansprechpartner,titel,lieferbedingung,plz,ort,land,email,telefon,telefax,betreff,kundennummer,ohne_artikeltext, versandart, vertriebid,vertrieb,sprache,projektfiliale,typ,internebezeichnung,bearbeiterid,ustid,ust_befreit,kostenstelle, gln FROM lieferschein WHERE id='$id' LIMIT 1"); } else { $arr = $this->app->DB->SelectArr("SELECT NOW() as datum,ihrebestellnummer,projekt, anschreiben, id as lieferschein,bodyzusatz,auftrag,auftragid,internebemerkung, freitext,adresse,name,abteilung,unterabteilung,strasse,adresszusatz,ansprechpartner,titel,lieferbedingung,plz,ort,land,email,telefon,telefax,betreff,kundennummer,ohne_artikeltext, versandart, vertriebid,vertrieb,sprache,projektfiliale,typ,internebezeichnung,bearbeiterid,ustid,ust_befreit,kostenstelle, 'angelegt' as status, gln FROM lieferschein WHERE id='$id' LIMIT 1"); } $abweichende_rechnungsadresse = $this->app->DB->SelectArr("SELECT abweichende_rechnungsadresse,rechnung_name,rechnung_titel,rechnung_typ,rechnung_strasse,rechnung_ort,rechnung_plz,rechnung_ansprechpartner, rechnung_land,rechnung_abteilung,rechnung_unterabteilung,rechnung_adresszusatz,rechnung_telefon,rechnung_telefax,rechnung_anschreiben, rechnung_email,rechnung_gln FROM adresse WHERE id = '$adresse' LIMIT 1"); if($abweichende_rechnungsadresse && $abweichende_rechnungsadresse[0]['abweichende_rechnungsadresse'] && $abweichende_rechnungsadresse[0]['rechnung_name']) { // abweichende Rechnungsadresse sticht foreach($abweichende_rechnungsadresse[0] as $k => $v) { if($k != 'abweichende_rechnungsadresse') $arr[0][str_replace('rechnung_','',$k)] = $v; } } else if ($arr[0]['auftragid']) { // adresse aus auftrag wenn vorhanden $abweichende_rechnungsadresse = $this->app->DB->SelectArr("SELECT name as rechnung_name,titel as rechnung_titel,typ as rechnung_typ, strasse as rechnung_strasse,ort as rechnung_ort,plz as rechnung_plz,ansprechpartner as rechnung_ansprechpartner, land as rechnung_land,abteilung as rechnung_abteilung,unterabteilung as rechnung_unterabteilung, adresszusatz as rechnung_adresszusatz,telefon as rechnung_telefon,telefax as rechnung_telefax,anschreiben as rechnung_anschreiben, email as rechnung_email, gln as rechnung_gln FROM auftrag WHERE id = '".$arr[0]['auftragid']."' LIMIT 1"); foreach($abweichende_rechnungsadresse[0] as $k => $v) { if($k != 'abweichende_rechnungsadresse') $arr[0][str_replace('rechnung_','',$k)] = $v; } } // this is not the different invoice email - this is the forced email for invoices! $check_mail = $this->app->DB->Select("SELECT rechnungs_email FROM adresse WHERE id='$adresse'"); if($check_mail!="") $arr[0]['email'] = $check_mail; $this->app->DB->UpdateArr('rechnung', $newid, 'id', $arr[0], true); if($arr[0]['auftragid']) { $aufarr = $this->app->DB->SelectArr("SELECT zahlungsweise,zahlungszieltage,zahlungszieltageskonto,zahlungszielskonto,waehrung,steuersatz_normal,steuersatz_ermaessigt FROM auftrag WHERE id = '".$arr[0]['auftragid']."' LIMIT 1"); if($aufarr) { $this->app->DB->UpdateArr('rechnung',$newid,'id',$aufarr[0],true); } } $pos = $this->app->DB->SelectArr("SELECT * FROM lieferschein_position WHERE lieferschein='$id' order by sort"); $cpos = !empty($pos)?count($pos):0; for($i=0;$i<$cpos;$i++) { $this->app->DB->Insert("INSERT INTO rechnung_position (id) VALUES('')"); $newposid = $this->app->DB->GetInsertID(); $lieferscheinzurechnung[$pos[$i]['id']] = $newposid; if(!empty($pos[$i]['explodiert_parent'])) { $pos[$i]['explodiert_parent'] = isset($lieferscheinzurechnung[$pos[$i]['explodiert_parent']])?$lieferscheinzurechnung[$pos[$i]['explodiert_parent']]:0; } $pos[$i]['rechnung']=$newid; if($pos[$i]['auftrag_position_id'] > 0) { $tmpap = $this->app->DB->SelectArr("SELECT * FROM auftrag_position WHERE id='".$pos[$i]['auftrag_position_id']."' LIMIT 1"); foreach($tmpap[0] as $key=>$value) { if($key!="id" && $key!="menge" && ($key!="bezeichnung" && $value!="") && ($key!="beschreibung" && $value!="")) { $pos[$i][$key]=$value; } } } else { $pos[$i]['preis']=$this->GetVerkaufspreis($pos[$i]['artikel'],$pos[$i]['menge'],$adresse); $umsatzsteuer = $this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id='".$pos[$i]['artikel']."' LIMIT 1"); if($umsatzsteuer=="ermaessigt") { $pos[$i]['umsatzsteuer']=$umsatzsteuer; } if($umsatzsteuer=="befreit") { $pos[$i]['umsatzsteuer']=$umsatzsteuer; } } $this->app->DB->UpdateArr('rechnung_position',$newposid,'id',$pos[$i],true); if(is_null($pos[$i]['steuersatz'])) { $this->app->DB->Update("UPDATE rechnung_position SET steuersatz = null WHERE id = '$newposid' LIMIT 1"); } } if($this->Firmendaten('dateienweiterfuehren')){ foreach($lieferscheinzurechnung as $oldpos => $newpos){ $this->app->DB->Update("UPDATE datei_stichwoerter SET parameter2='$newpos' WHERE LOWER(objekt)='rechnung' AND parameter='$newid' AND objekt2='position' AND parameter2=".$oldpos); } $this->app->DB->Update("UPDATE datei_stichwoerter SET parameter2='0', objekt2='' WHERE LOWER(objekt)='rechnung' AND parameter='$newid' AND objekt2='position' AND NOT parameter2 IN (".implode(',',$lieferscheinzurechnung).")"); } $portoExistsInInvoice = ($this->app->DB->Select("SELECT rp.id FROM rechnung_position rp INNER JOIN artikel art ON rp.artikel = art.id AND art.porto = 1 AND rp.rechnung='".$newid."' LIMIT 1") > 0? true:false); if($arr[0]['auftragid'] && !$portoExistsInInvoice) { $portopositionen = $this->app->DB->SelectArr("SELECT ap.* FROM auftrag_position ap INNER JOIN artikel art ON ap.artikel = art.id AND art.porto = 1 AND ap.auftrag='".$arr[0]['auftragid']."' ORDER by ap.sort"); if($portopositionen) { foreach($portopositionen as $portopos) { $this->app->DB->Insert("INSERT INTO rechnung_position (id) VALUES('')"); $newposid = $this->app->DB->GetInsertID(); $sort = 1+$this->app->DB->Select("SELECT ifnull(max(sort),0) FROM rechnung_position WHERE rechnung = '$newid'"); $portopos['sort'] = $sort; unset($portopos['auftrag']); $portopos['auftrag_position_id'] = $portopos['id']; unset($portopos['id']); $portopos['rechnung'] = $newid; $this->app->DB->UpdateArr('rechnung_position',$newposid,'id',$portopos,true); if(is_null($portopos['steuersatz'])) { $this->app->DB->Update("UPDATE rechnung_position SET steuersatz = null WHERE id = '$newposid' LIMIT 1"); } } } } if(!empty($arr[0]['auftragid'])) { $orderRow = $this->app->DB->SelectRow( sprintf( 'SELECT storage_country,deliverythresholdvatid FROM auftrag WHERE id = %d', $arr[0]['auftragid'] ) ); if(!empty($orderRow['storage_country'])) { $this->app->DB->Update( sprintf( "UPDATE rechnung SET storage_country = '%s' WHERE id = %d", $this->app->DB->real_escape_string($orderRow['storage_country']), $newid ) ); } if(!empty($orderRow['deliverythresholdvatid'])) { $this->app->DB->Update( sprintf( "UPDATE rechnung SET deliverythresholdvatid = '%s' WHERE id = %d", $this->app->DB->real_escape_string($orderRow['deliverythresholdvatid']), $newid ) ); } } $ohnebriefpapier = $this->Firmendaten("rechnung_ohnebriefpapier"); //$stornorechnung = $this->Firmendaten("stornorechhung_standard"); $this->CheckFreifelder("rechnung",$newid); $this->CopyBelegZwischenpositionen("lieferschein",$id,"rechnung",$newid); $this->app->DB->Update("UPDATE rechnung SET ohne_briefpapier='".$ohnebriefpapier."' WHERE id='$newid,' LIMIT 1"); //$this->app->DB->Update("UPDATE rechnung SET stornorechnung='$stornorechnung', ohne_briefpapier='".$ohnebriefpapier."' WHERE id='$newid,' LIMIT 1"); $this->app->DB->Update("UPDATE lieferschein SET schreibschutz='1' WHERE id='$id' LIMIT 1"); //$this->SchnellFreigabe("rechnung",$newid); // braucht man nicht wegen create $this->ANABREGSNeuberechnen($newid,"rechnung"); return $newid; } function WeiterfuehrenRechnungZuGutschrift($id, $grund = "Rechnung storniert") { $adresse = $this->app->DB->Select("SELECT adresse FROM rechnung WHERE id='$id' LIMIT 1"); $newid = $this->CreateGutschrift($adresse); if($this->Firmendaten('dateienweiterfuehren')){ $this->WeiterfuehrenDateianhang("Rechnung", $id, "Gutschrift", $newid); } $arr = $this->app->DB->SelectArr("SELECT NOW() as datum,ihrebestellnummer,projekt, belegnr as rechnung,anschreiben,aktion,ansprechpartner,titel,lieferbedingung,bodyzusatz, freitext,adresse,name,abteilung,unterabteilung,strasse,adresszusatz,plz,ort,land,ustid,email,telefon,telefax,betreff,kundennummer,versandart,zahlungsweise,zahlungszieltage,ust_befreit, keinsteuersatz, id as rechnungid,rabatt,rabatt1,rabatt2,rabatt3,rabatt4,rabatt5,gruppe,vertriebid,bearbeiterid,provision,provision_summe,bearbeiter,projektfiliale,typ,internebezeichnung,ohne_artikeltext,kurs, `kundennummer_buchhaltung`, zahlungszieltageskonto,zahlungszielskonto,firma,waehrung,steuersatz_normal,steuersatz_zwischen,steuersatz_ermaessigt,steuersatz_starkermaessigt,steuersatz_dienstleistung,'angelegt' as status,gln,kostenstelle, sprache FROM rechnung WHERE id='$id' LIMIT 1"); $check_mail = $this->app->DB->Select("SELECT gutschrift_email FROM adresse WHERE id='$adresse'"); if($check_mail!='') { $arr[0]['email'] = $check_mail; } $arr[0]['deliverythresholdvatid'] = $this->app->DB->Select("SELECT deliverythresholdvatid FROM rechnung WHERE id='$id' LIMIT 1"); $this->app->DB->UpdateArr('gutschrift', $newid, 'id', $arr[0], true); $this->LoadKurs($newid,"gutschrift",$arr[0]['projekt'],true); $pos = $this->app->DB->SelectArr("SELECT * FROM rechnung_position WHERE rechnung='$id' order by sort"); $cpos = !empty($pos)?count($pos):0; for($i=0;$i<$cpos;$i++) { $this->app->DB->Insert("INSERT INTO gutschrift_position (id) VALUES('')"); $newposid = $this->app->DB->GetInsertID(); $idtoid[$pos[$i]['id']] = $newposid; if(!empty($pos[$i]['explodiert_parent'])) { $pos[$i]['explodiert_parent'] = isset($idtoid[$pos[$i]['explodiert_parent']])?$idtoid[$pos[$i]['explodiert_parent']]:0; } $pos[$i]['gutschrift']=$newid; $this->app->DB->UpdateArr('gutschrift_position', $newposid, 'id', $pos[$i], true); if(is_null($pos[$i]['steuersatz'])) { $this->app->DB->Update("UPDATE gutschrift_position SET steuersatz = null WHERE id = '$newposid' LIMIT 1"); } } $ohnebriefpapier = $this->Firmendaten('gutschrift_ohnebriefpapier'); $stornorechnung = $this->Firmendaten('stornorechnung_standard'); $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 rechnung SET schreibschutz='1',status='storniert' WHERE id='$id' LIMIT 1"); $this->RechnungProtokoll($id, $grund); $this->SchnellFreigabe("gutschrift",$newid); return $newid; } function WeiterfuehrenAuftragZuAnfrage($auftrag) { $anfrageid = $this->app->DB->Select("SELECT anfrageid FROM auftrag WHERE id='$auftrag' LIMIT 1"); //angebot aus offene Angebote entfernen $arr = $this->app->DB->SelectArr("SELECT projekt,aktion,bodyzusatz, freitext,anschreiben,adresse,name,abteilung,unterabteilung,strasse,adresszusatz,plz,ort,land,email,telefon,telefax,projektfiliale,typ,internebezeichnung,ansprechpartner,titel, firma,'angelegt' as status FROM auftrag WHERE id='$auftrag' LIMIT 1"); $arr[0]['bundesstaat'] = $this->app->DB->Select("SELECT bundesstaat FROM auftrag WHERE id = '$id' LIMIT 1"); $this->app->DB->UpdateArr('anfrage',$anfrageid,'id',$arr[0],true); $this->app->DB->Delete("DELETE FROM anfrage_position WHERE anfrage='$anfrageid'"); $pos = $this->app->DB->SelectArr("SELECT * FROM auftrag_position WHERE auftrag='$auftrag' order by sort"); $cpos = !empty($pos)?count($pos):0; for($i=0;$i<$cpos;$i++){ $this->app->DB->Insert("INSERT INTO anfrage_position (id) VALUES('')"); $newposid = $this->app->DB->GetInsertID(); $idtoid[$pos[$i]['id']] = $newposid; if(!empty($pos[$i]['explodiert_parent'])) { $pos[$i]['explodiert_parent'] = isset($idtoid[$pos[$i]['explodiert_parent']])?$idtoid[$pos[$i]['explodiert_parent']]:0; } $pos[$i]['anfrage']=$anfrageid; // Hole Verkaufspreis ab menge $this->app->DB->UpdateArr('anfrage_position',$newposid,'id',$pos[$i],true); if(is_null($pos[$i]['steuersatz'])) { $this->app->DB->Update("UPDATE anfrage_position SET steuersatz = null WHERE id = '$newposid' LIMIT 1"); } } $this->app->DB->Update("UPDATE auftrag SET schreibschutz='1' WHERE id='$id' LIMIT 1"); return $anfrageid; } function WeiterfuehrenAnfrageZuAngebot($id) { $adresse = $this->app->DB->Select("SELECT adresse FROM anfrage WHERE id='$id' LIMIT 1"); //angebot aus offene Angebote entfernen $this->app->DB->Insert("INSERT INTO angebot (id) VALUES ('')"); $newid = $this->app->DB->GetInsertID(); if($this->Firmendaten('dateienweiterfuehren')){ $this->WeiterfuehrenDateianhang("Anfrage", $id, "Angebot", $newid); } $arr = $this->app->DB->SelectArr("SELECT NOW() as datum,projekt,aktion,bodyzusatz, freitext,anschreiben,adresse,name,abteilung,unterabteilung,strasse,adresszusatz,plz,ort,land,ustid,email,telefon,telefax,betreff,kundennummer,projektfiliale,typ,ansprechpartner,titel, versandart, id as anfrageid,internebezeichnung, firma,'angelegt' as status FROM anfrage WHERE id='$id' LIMIT 1"); $this->app->DB->UpdateArr('angebot',$newid,'id',$arr[0],true); $pos = $this->app->DB->SelectArr("SELECT * FROM anfrage_position WHERE anfrage='$id' order by sort"); $cpos = !empty($pos)?count($pos):0; for($i=0;$i<$cpos;$i++) { $this->app->DB->Insert("INSERT INTO angebot_position (id) VALUES('')"); $newposid = $this->app->DB->GetInsertID(); $idtoid[$pos[$i]['id']] = $newposid; if(!empty($pos[$i]['explodiert_parent'])) { $pos[$i]['explodiert_parent'] = isset($idtoid[$pos[$i]['explodiert_parent']])?$idtoid[$pos[$i]['explodiert_parent']]:0; } $pos[$i]['angebot']=$newid; // Hole Verkaufspreis ab menge $pos[$i]['preis']=$this->GetVerkaufspreis($pos[$i]['artikel'],$pos[$i]['menge'],$adresse); $this->app->DB->UpdateArr('angebot_position',$newposid,'id',$pos[$i],true); if(is_null($pos[$i]['steuersatz'])) { $this->app->DB->Update("UPDATE angebot_position SET steuersatz = null WHERE id = '$newposid' LIMIT 1"); } } $this->app->DB->Update("UPDATE anfrage SET schreibschutz='1' WHERE id='$id' LIMIT 1"); $this->SchnellFreigabe("angebot",$newid); return $newid; } function CheckClass($class) { switch($class) { case 'FormHandler': if(isset($this->app->FormHandler) && $this->app->FormHandler) { return; } if(!class_exists('FormHandler') && file_exists(__DIR__ .'/../../phpwf/plugins/class.formhandler.php')) { include_once dirname(dirname(__DIR__)) .'/phpwf/plugins/class.formhandler.php'; } if(class_exists('FormHandler')) { $this->app->FormHandler = new FormHandler($this->app); } break; case 'LieferscheinPDF': case 'RechnungPDF': case 'AuftragPDF': case 'BestellungPDF': case 'GutschriftPDF': case 'AngebotPDF': case 'MahnwesenPDF': case 'AnfragePDF': case 'LayoutvorlagenPDF': if(class_exists($class)) { return; } if(!defined('FPDF_FONTPATH')) { define('FPDF_FONTPATH',dirname(__DIR__).'/pdf/font/'); } if(!class_exists('FPDFWAWISION')) { if(file_exists(dirname(dirname(__DIR__)).'/conf/user_defined.php')){ include_once dirname(dirname(__DIR__)).'/conf/user_defined.php'; } if(!defined('USEFPDF3')) { define('USEFPDF3',true); } if(defined('USEFPDF3') && USEFPDF3 && file_exists(__DIR__.'/pdf/fpdf_3.php')) { require_once(__DIR__.'/pdf/fpdf_3.php'); } else if(defined('USEFPDF2') && USEFPDF2 && file_exists(__DIR__.'/pdf/fpdf_2.php')) { require_once(__DIR__.'/pdf/fpdf_2.php'); } else { require_once(__DIR__.'/pdf/fpdf.php'); } } if(!class_exists('PDF_EPS'))require_once(__DIR__ .'/pdf/fpdf_final.php'); if(!class_exists('SuperFPDF'))require_once(__DIR__ ."/dokumente/class.superfpdf.php"); if(!class_exists('Etikett'))require_once(__DIR__ ."/dokumente/class.etikett.php"); if(!class_exists('Briefpapier')){ if(file_exists(__DIR__ ."/dokumente/class.briefpapier_custom.php")) { require_once(__DIR__ ."/dokumente/class.briefpapier_custom.php"); }else{ require_once(__DIR__ ."/dokumente/class.briefpapier.php"); } } if(!class_exists($class)) { if(file_exists(__DIR__ .'/dokumente/class.'.strtolower(substr($class,0,strlen($class)-3)).'_custom.php')) { require_once(__DIR__ .'/dokumente/class.'.strtolower(substr($class,0,strlen($class)-3)).'_custom.php'); }elseif(file_exists(__DIR__ .'/dokumente/class.'.strtolower(substr($class,0,strlen($class)-3)).'.php')) { require_once(__DIR__ .'/dokumente/class.'.strtolower(substr($class,0,strlen($class)-3)).'.php'); } } break; } } function WeiterfuehrenAuftragZuRechnung($id, $positionen = null, $zwischenpositionen = null, $newid = 0) { // wenn anfrage vorhanden diese markieren als abgerechnet status='abgerechnet' $orderArr = $this->app->DB->SelectRow( sprintf( 'SELECT anfrageid, adresse, status,projekt, belegnr FROM auftrag WHERE id = %d LIMIT 1', $id ) ); $anfrageid = $orderArr['anfrageid']; $adresseid = $orderArr['adresse']; $abweichende_rechnungsadresse = $this->app->DB->Select("SELECT abweichende_rechnungsadresse FROM adresse WHERE id='$adresseid' LIMIT 1"); if($anfrageid > 0) { $this->app->DB->Update("UPDATE anfrage SET status='abgerechnet',schreibschutz='0' WHERE id='$anfrageid'"); } // pruefe ob auftrag status=angelegt, dann vergebe belegnr $status = $orderArr['status']; $projekt = $orderArr['projekt']; $checkbelegnr = $orderArr['belegnr']; if($status==='angelegt' && $checkbelegnr=='') { $belegnr = $this->GetNextNummer("auftrag",$projekt,$id); $this->app->DB->Update("UPDATE auftrag SET belegnr='$belegnr', status='freigegeben' WHERE id='$id' LIMIT 1"); $this->AuftragProtokoll($id,"Auftrag freigegeben"); // auftrag abschliessen und event senden $this->EventAPIAdd("EventAuftragEdit",$id,"auftrag","edit"); } //angebot aus offene Angebote entfernen if($newid <= 0) { $newid = $this->CreateRechnung($adresseid); } if($this->Firmendaten('dateienweiterfuehren')){ $this->WeiterfuehrenDateianhang("Auftrag", $id, "Rechnung", $newid); } $arr = $this->app->DB->SelectArr("SELECT datum,ihrebestellnummer,projekt,gesamtsumme as soll, belegnr as auftrag, id as auftragid,aktion,typ,bodyzusatz, freitext,anschreiben,adresse,name,abteilung,unterabteilung,ansprechpartner,titel,lieferbedingung,strasse,adresszusatz,plz,ort,land,ustid,email,telefon,telefax,betreff,kundennummer,versandart,vertrieb,zahlungsweise,zahlungszieltage,ust_befreit,keinsteuersatz,rabatt,rabatt1,rabatt2,rabatt3,rabatt4,rabatt5,gruppe,vertriebid,bearbeiterid,provision,provision_summe,bearbeiter,internebemerkung,typ,internebezeichnung,systemfreitext,ohne_artikeltext,sprache,kostenstelle, `kundennummer_buchhaltung`, projektfiliale,zahlungszieltageskonto,zahlungszielskonto,firma,einzugsdatum,waehrung,kurs,steuersatz_normal,steuersatz_zwischen,steuersatz_ermaessigt,steuersatz_starkermaessigt,steuersatz_dienstleistung,'angelegt' as status, gln, storage_country FROM auftrag WHERE id='$id' LIMIT 1"); $arr[0]['deliverythresholdvatid'] = $this->app->DB->Select("SELECT deliverythresholdvatid FROM auftrag WHERE id='$id' LIMIT 1"); // this is not the different invoice email this is the forec mail for invoices $check_mail = $this->app->DB->Select("SELECT rechnungs_email FROM adresse WHERE id='$adresseid' "); if($check_mail!="") $arr[0]['email'] = $check_mail; $arr_zahlung = $this->app->DB->SelectArr("SELECT zahlungsweise,zahlungszieltage,zahlungszieltageskonto,zahlungszielskonto,versandart,projekt FROM auftrag WHERE id='$id' LIMIT 1"); $arr[0]['bundesstaat'] = $this->app->DB->Select("SELECT bundesstaat FROM auftrag WHERE id = '$id' LIMIT 1"); $this->app->DB->UpdateArr('rechnung',$newid,'id',$arr[0], true); $bundesland = $this->app->DB->Select("SELECT bundesland FROM auftrag WHERE id = '$id' LIMIT 1"); if(!empty($bundesland)) { $this->app->DB->Update("UPDATE rechnung SET bundesland = '".$this->app->DB->real_escape_string($bundesland)."' WHERE id = '$newid' LIMIT 1"); } $lieferscheinid = $this->app->DB->Select("SELECT id FROM lieferschein WHERE auftragid='$id' LIMIT 1"); if($lieferscheinid>0) { $this->app->DB->Update("UPDATE rechnung SET lieferschein='$lieferscheinid' WHERE id='$newid' LIMIT 1"); $this->app->DB->Update("UPDATE lieferschein SET rechnungid='$newid' WHERE id='$lieferscheinid' LIMIT 1"); } $this->app->DB->Update("UPDATE rechnung SET datum=NOW() WHERE id='$newid' LIMIT 1"); $where = ""; if($positionen) { if($positionen) { $posa = null; foreach($positionen as $v) { $posa[] = " id = '$v' "; } $where = ' AND ('.implode(' OR ',$posa).') '; } } $pos = $this->app->DB->SelectArr("SELECT * FROM auftrag_position WHERE auftrag='$id' $where order by sort"); $cpos = !empty($pos)?count($pos):0; $auftragzurechnung= []; for($i=0;$i<$cpos;$i++){ $this->app->DB->Insert("INSERT INTO rechnung_position (id) VALUES('')"); $newposid = $this->app->DB->GetInsertID(); $auftragzurechnung[$pos[$i]['id']] = $newposid; $pos[$i]['rechnung']=$newid; $pos[$i]['auftrag_position_id']=$pos[$i]['id']; if($positionen){ $pos[$i]['sort'] = 1+(int)$this->app->DB->Select("SELECT max(sort) FROM rechnung_position WHERE rechnung = '$newid'"); } //if($pos[$i]['explodiert']) $pos[$i]['bezeichnung'] = $pos[$i]['bezeichnung'];//." (Stückliste)"; if($pos[$i]['explodiert_parent'] > 0) { $pos[$i]['bezeichnung'] = "*** ".$pos[$i]['bezeichnung']; if($pos[$i]['explodiert_parent'] > 0){ $pos[$i]['explodiert_parent_artikel'] = $this->app->DB->Select("SELECT artikel FROM auftrag_position WHERE id='" . $pos[$i]['explodiert_parent'] . "' LIMIT 1"); } else { $pos[$i]['explodiert_parent_artikel'] = 0; } } $idtoid[$pos[$i]['id']] = $newposid; if(!empty($pos[$i]['explodiert_parent'])) { $pos[$i]['explodiert_parent'] = isset($idtoid[$pos[$i]['explodiert_parent']])?$idtoid[$pos[$i]['explodiert_parent']]:0; } $this->app->DB->UpdateArr('rechnung_position',$newposid,'id',$pos[$i], true); if(is_null($pos[$i]['steuersatz'])){ $this->app->DB->Update("UPDATE rechnung_position SET steuersatz = null WHERE id = '$newposid' LIMIT 1"); } } if($this->Firmendaten('dateienweiterfuehren')){ foreach($auftragzurechnung as $oldpos => $newpos){ $this->app->DB->Update("UPDATE datei_stichwoerter SET parameter2='$newpos' WHERE LOWER(objekt)='rechnung' AND parameter='$newid' AND objekt2='position' AND parameter2=".$oldpos); } $this->app->DB->Update("UPDATE datei_stichwoerter SET parameter2='0', objekt2='' WHERE LOWER(objekt)='rechnung' AND parameter='$newid' AND objekt2='position' AND NOT parameter2 IN (".implode(',',$auftragzurechnung).")"); } $this->CheckFreifelder("rechnung",$newid); if($positionen) { if($zwischenpositionen) { $this->CopyBelegZwischenpositionen("auftrag",$id,"rechnung",$newid,$zwischenpositionen); } } else{ $this->CopyBelegZwischenpositionen("auftrag",$id,"rechnung",$newid); } // wenn adresse abweichende rechnungsadresse hat diese nehmen! if($abweichende_rechnungsadresse=="1") { $this->LoadRechnungStandardwerte($newid,$adresseid); $arr_zahlung[0]['vertriebid']=$arr[0]['vertriebid']; $arr_zahlung[0]['bearbeiterid']=$arr[0]['bearbeiterid']; $arr_zahlung[0]['bearbeiter']=$arr[0]['bearbeiter']; $arr_zahlung[0]['vertrieb']=$arr[0]['vertrieb']; //$this->app->FormHandler->ArrayUpdateDatabase("rechnung",$newid,$arr_zahlung[0],true); $arr_zahlung[0]['ust_befreit'] = $arr[0]['ust_befreit']; $arr_zahlung[0]['steuersatz_normal'] = $arr[0]['steuersatz_normal']; $arr_zahlung[0]['steuersatz_ermaessigt'] = $arr[0]['steuersatz_ermaessigt']; $this->app->DB->UpdateArr('rechnung', $newid, 'id', $arr_zahlung[0],true); } $this->RunHook('WeiterfuehrenAuftragZuRechnungPositionen', 2, $id, $newid); if($this->useTaxFromSettings($arr[0]['projekt'])) { $this->LoadSteuersaetze($newid, 'rechnung', $arr[0]['projekt']); } // wenn auftrag vorkasse rechnung als bezahlt markieren wenn genug geld vorhanden $this->RechnungNeuberechnen($newid); //summe zahlungseingaenge $summe_zahlungseingaenge = 0; $rechnungssumme = $this->app->DB->Select("SELECT `soll` FROM `rechnung` WHERE `id` = '{$newid}' LIMIT 1"); //if(($arr[0][zahlungsweise]=="vorkasse" || $arr[0][zahlungsweise]=="paypal" || $arr[0][zahlungsweise]=="kreditkarte") && $summe_zahlungseingaenge >= $rechnungssumme) if($summe_zahlungseingaenge > 0) { $summe_zahlungseingaenge -= (float)$this->app->DB->Select( "SELECT SUM(`ist`) FROM `rechnung` WHERE `auftragid` = {$id} AND `id` != {$newid}" ); if($summe_zahlungseingaenge >= $rechnungssumme){ $this->app->DB->Update("UPDATE `rechnung` SET `ist` = `soll`, `zahlungsstatus` = 'bezahlt' WHERE `id` = '{$newid}'"); } elseif($summe_zahlungseingaenge > 0){ $lastDate = $this->app->DB->Select( "SELECT MAX(k.buchung) FROM `kontoauszuege_zahlungseingang` AS `ke` INNER JOIN `kontoauszuege` AS `k` ON ke.kontoauszuege = k.id WHERE ke.`objekt` = 'auftrag' AND ke.`parameter` = '{$id}' " ); $invoice = $this->app->DB->SelectRow( "SELECT `skontobetrag`, `zahlungszielskonto`, `zahlungszieltageskonto`, DATE_SUB(`datum`, INTERVAL `zahlungszieltageskonto` DAY) <= '{$lastdate}' AS `skonto_ok` FROM `rechnung` WHERE `id`= '{$newid}'" ); if(!empty($invoice['skonto_ok'])){ $minimumPayed = !empty($invoice['skontobetrag']) ? $invoice['skontobetrag'] : $rechnungssumme * (100 - $invoice['zahlungszielskonto']) / 100; if($summe_zahlungseingaenge >= $minimumPayed){ $this->app->DB->Update( "UPDATE `rechnung` SET `ist` = '{$summe_zahlungseingaenge}', `zahlungsstatus` = 'bezahlt' WHERE `id` = '{$newid}'" ); } } } } // was ist denn bei rechnung bar oder nachnahme wenn ein auftragsguthaben vorhanden ist if($this->Firmendaten("auftragabschliessen")!="1") $this->app->DB->Update("UPDATE auftrag SET status='abgeschlossen',schreibschutz='1' WHERE id='$id' LIMIT 1"); else { // erstmal nicht mehr umstellen //if($this->app->DB->Select("SELECT id FROM auftrag WHERE art <> 'rechnung' AND id = '$id' LIMIT 1"))$this->app->DB->Update("UPDATE auftrag SET art='lieferung' WHERE id='$id' LIMIT 1"); } // auftrag freigeben!!! $this->SchnellFreigabe("rechnung",$newid); $this->ANABREGSNeuberechnen($newid,"rechnung"); return $newid; } /** * @param int $projectId * * @return bool */ function useTaxFromSettings($projectId = 0) { $fromProject = $projectId <= 0?0:(int)$this->Projektdaten($projectId, 'taxfromdoctypesettings'); if($fromProject === 1) { return false; } if($fromProject === 2) { return true; } return !empty($this->Firmendaten('taxfromdoctypesettings')); } function WeiterfuehrenAngebotZuAuftrag($id) { $anfrageid = $this->app->DB->Select("SELECT anfrageid FROM angebot WHERE id='$id' LIMIT 1"); $adresseid = $this->app->DB->Select("SELECT adresse FROM angebot WHERE id='$id' LIMIT 1"); if($anfrageid > 0) $this->app->DB->Update("UPDATE anfrage SET status='beauftrag',schreibschutz='0' WHERE id='$anfrageid' AND status!='abgeschlossen' AND status!='abgerechnet'"); //angebot aus offene Angebote entfernen $this->app->DB->Insert("INSERT INTO auftrag (id) VALUES ('')"); $newid = $this->app->DB->GetInsertID(); if($this->Firmendaten('dateienweiterfuehren')){ $this->WeiterfuehrenDateianhang("Angebot", $id, "Auftrag", $newid); } $arr = $this->app->DB->SelectArr("SELECT NOW() as datum, projekt,belegnr as angebot,lieferdatum,aktion,bodyzusatz, '1' as autoversand, freitext,anschreiben,adresse,name,abteilung,unterabteilung,strasse,adresszusatz,plz,ort,land,ustid,email,telefon,telefax,betreff,kundennummer,versandart,vertrieb,ansprechpartner,titel,lieferbedingung, standardlager,zahlungsweise, zahlungszieltage, id as angebotid, anfrage as ihrebestellnummer, anfrageid,rabatt,rabatt1,rabatt2,rabatt3,rabatt4,rabatt5,gruppe,vertriebid,bearbeiterid,provision,provision_summe,bearbeiter,projektfiliale,typ,internebezeichnung, zahlungszieltageskonto,zahlungszielskonto,firma,abweichendelieferadresse,liefername,lieferabteilung,lieferunterabteilung,lieferland,lieferstrasse,lieferort,liefergln,lieferemail,ust_befreit,internebemerkung,liefertitel, ohne_artikeltext, lieferplz,lieferadresszusatz,lieferansprechpartner,ust_befreit,keinsteuersatz,keinporto,'angelegt' as status,lieferdatumkw, waehrung,steuersatz_normal,steuersatz_zwischen,steuersatz_ermaessigt,steuersatz_starkermaessigt,steuersatz_dienstleistung, gln,sprache,kostenstelle FROM angebot WHERE id='$id' LIMIT 1"); $arr[0]['bundesstaat'] = $this->app->DB->Select("SELECT bundesstaat FROM angebot WHERE id = '$id' LIMIT 1"); $check_mail = $this->app->DB->Select("SELECT auftrag_email FROM adresse WHERE id='$adresseid'"); if($check_mail!="") $arr[0]['email'] = $check_mail; $arr[0]['autoversand'] = 1-(int)$this->Projektdaten($arr[0]['projekt'],'deactivateautoshipping'); $this->app->DB->UpdateArr('auftrag',$newid, 'id', $arr[0], true); $pos = $this->app->DB->SelectArr("SELECT * FROM angebot_position WHERE angebot='$id' order by sort"); for($i=0;$i<(!empty($pos)?count($pos):0);$i++){ $this->app->DB->Insert("INSERT INTO auftrag_position (id) VALUES('')"); $newposid = $this->app->DB->GetInsertID(); $idtoid[$pos[$i]['id']] = $newposid; if(!empty($pos[$i]['explodiert_parent'])) { $pos[$i]['explodiert_parent'] = isset($idtoid[$pos[$i]['explodiert_parent']])?$idtoid[$pos[$i]['explodiert_parent']]:0; } $pos[$i]['auftrag']=$newid; $this->app->DB->UpdateArr('auftrag_position',$newposid, 'id', $pos[$i], true); if($pos[$i]['berechnen_aus_teile']) { $berechnen_aus_teile[$newposid] = true; } if(is_null($pos[$i]['steuersatz'])) { $this->app->DB->Update("UPDATE auftrag_position SET steuersatz = null WHERE id = '$newposid' LIMIT 1"); } } if(isset($berechnen_aus_teile)) { foreach($berechnen_aus_teile as $k => $v) { $this->app->DB->Update("UPDATE auftrag_position SET preis = 0 WHERE explodiert_parent = '$k' AND auftrag = '$newid'"); } } //wenn angebot explodiert war dann nicht if($this->app->DB->Select("SELECT COUNT(id) FROM angebot_position WHERE angebot='$id' AND explodiert_parent > 0") >0 ) $this->app->DB->Update("UPDATE auftrag_position ap INNER JOIN artikel art ON ap.artikel = art.id SET ap.explodiert = 1 WHERE art.juststueckliste = 1 AND ap.auftrag = '$newid'"); $this->CheckFreifelder("auftrag",$newid); $this->CopyBelegZwischenpositionen("angebot",$id,"auftrag",$newid); $belegnr = $this->app->DB->Select("SELECT belegnr FROM auftrag WHERE id='$newid' LIMIT 1"); $this->app->DB->Update("UPDATE angebot SET status='beauftragt', schreibschutz='1', auftrag='$belegnr',auftragid='$newid' WHERE id='$id' LIMIT 1"); // wiedervorlagen als abgeschlossen $this->app->DB->Update("UPDATE wiedervorlage SET abgeschlossen='1' WHERE module='angebot' AND parameter='$id' AND parameter > 0"); if($this->useTaxFromSettings($arr[0]['projekt'])) { $this->LoadSteuersaetze($newid, 'auftrag', $arr[0]['projekt']); } // auftrag freigeben!!! $this->SchnellFreigabe("auftrag",$newid); $this->app->erp->RunHook('WeiterfuehrenAngebotZuAuftrag', 2, $id, $newid); return $newid; } function DeleteAngebot($id) { $belegnr = $this->app->DB->Select("SELECT belegnr FROM angebot WHERE id='$id' LIMIT 1"); if($belegnr=="" || $belegnr=="0") { $this->app->DB->Delete("DELETE FROM angebot_position WHERE angebot='$id'"); $this->app->DB->Delete("DELETE FROM angebot_protokoll WHERE angebot='$id'"); $this->app->DB->Delete("DELETE FROM angebot WHERE id='$id' LIMIT 1"); } } function PaketannahmenAbschliessen() { $arr = $this->app->DB->SelectArr("SELECT id FROM paketannahme WHERE status!='abgeschlossen'"); for($i=0;$i<(!empty($arr)?count($arr):0);$i++) { } } function CreateVerbindlichkeit($adresse="") { /** @var Verbindlichkeit $obj */ $obj = $this->app->erp->LoadModul('verbindlichkeit'); if(!empty($obj) && method_exists($obj,'createLiability')) { return $obj->createLiability($adresse); } return 0; } function CreateBestellung($adresse="") { /** @var Bestellung $obj */ $obj = $this->LoadModul('bestellung'); if(!empty($obj) && method_exists($obj, 'CreateBestellung')) { return $obj->CreateBestellung($adresse); } } function AddBestellungPosition($bestellung, $einkauf,$menge,$datum, $beschreibung = '',$artikel="",$einheit="", $waehrung = '') { /** @var Bestellung $obj */ $obj = $this->LoadModul('bestellung'); if(!empty($obj) && method_exists($obj, 'AddBestellungPosition')) { return $obj->AddBestellungPosition($bestellung, $einkauf,$menge,$datum, $beschreibung,$artikel,$einheit, $waehrung); } } function DeleteBestellung($id) { /** @var Bestellung $obj */ $obj = $this->LoadModul('bestellung'); if(!empty($obj) && method_exists($obj, 'DeleteBestellung')) { $obj->DeleteBestellung($id); } } function CreateRechnung($adresse="") { /** @var Rechnung $obj */ $obj = $this->LoadModul('rechnung'); if(!empty($obj) && method_exists($obj,'CreateRechnung')){ return $obj->CreateRechnung($adresse); } } public function GetStandardWaehrung($projekt=0) { if(is_array($projekt) && isset($projekt['eigenesteuer']) && isset($projekt['waehrung'])) { $projekt_arr = $projekt; } elseif($projekt > 0) { $projekt_arr = $this->app->DB->SelectRow( "SELECT eigenesteuer,waehrung FROM projekt WHERE id='$projekt' LIMIT 1" ); } if(!empty($projekt_arr['eigenesteuer'])) { $waehrung = $projekt_arr['waehrung']; } else { $waehrung = $this->Firmendaten('waehrung'); } return $waehrung; } public function GetStandardSteuersatzErmaessigt($projekt=0) { /** @var Steuersaetze $objSteuersaetze */ $objSteuersaetze = $this->app->loadModule('steuersaetze', false); if($objSteuersaetze !== null && method_exists($objSteuersaetze, 'checkTaxesToSet')) { $objSteuersaetze->checkTaxesToSet(); } if(is_array($projekt) && isset($projekt['eigenesteuer']) && isset($projekt['steuersatz_ermaessigt'])) { $projekt_arr = $projekt; } elseif($projekt > 0){ $projekt_arr = $this->app->DB->SelectRow( "SELECT eigenesteuer,steuersatz_ermaessigt FROM projekt WHERE id='$projekt' LIMIT 1" ); } if(!empty($projekt_arr['eigenesteuer'])) { $steuersatz_ermaessigt = $projekt_arr['steuersatz_ermaessigt']; } else { $steuersatz_ermaessigt = $this->Firmendaten('steuersatz_ermaessigt'); } return $steuersatz_ermaessigt; } public function GetStandardSteuersatzNormal($projekt=0) { /** @var Steuersaetze $objSteuersaetze */ $objSteuersaetze = $this->app->loadModule('steuersaetze', false); if($objSteuersaetze !== null && method_exists($objSteuersaetze, 'checkTaxesToSet')) { $objSteuersaetze->checkTaxesToSet(); } if(is_array($projekt) && isset($projekt['eigenesteuer']) && isset($projekt['steuersatz_normal'])) { $projekt_arr = $projekt; } elseif($projekt > 0){ $projekt_arr = $this->app->DB->SelectRow( "SELECT eigenesteuer,steuersatz_normal FROM projekt WHERE id='$projekt' LIMIT 1" ); } if(!empty($projekt_arr['eigenesteuer'])) { $steuersatz_normal = $projekt_arr['steuersatz_normal']; } else { $steuersatz_normal = $this->Firmendaten("steuersatz_normal"); } return $steuersatz_normal; } function GetStandardSteuersatzBefreit($projekt=0) { return 0.00; } public function LoadSteuersaetze($id,$typ,$projekt='') { if($id <= 0 || empty($typ)) { return; } $this->app->erp->StartChangeLog($typ, $id); /** @var Steuersaetze $objSteuersaetze */ $objSteuersaetze = $this->app->loadModule('steuersaetze', false); if($objSteuersaetze !== null && method_exists($objSteuersaetze, 'checkTaxesToSet')) { $objSteuersaetze->checkTaxesToSet(); } if(!(is_array($projekt) && !empty($projekt['id'])) && $projekt <=0) { $projekt = $this->app->DB->Select("SELECT projekt FROM `$typ` WHERE id='$id' LIMIT 1"); } if(is_array($projekt) && isset($projekt['eigenesteuer']) && isset($projekt['steuersatz_normal']) && isset($projekt['steuersatz_ermaessigt'])) { $projekt_arr = $projekt; } elseif($projekt > 0) { $projekt_arr = $this->app->DB->SelectRow( "SELECT eigenesteuer,steuersatz_normal,steuersatz_ermaessigt FROM projekt WHERE id='$projekt' LIMIT 1" ); } if(!empty($projekt_arr['eigenesteuer'])) { $steuersatz_normal = $projekt_arr['steuersatz_normal']; $steuersatz_ermaessigt = $projekt_arr['steuersatz_ermaessigt']; } else { $steuersatz_normal = $this->Firmendaten('steuersatz_normal'); $steuersatz_ermaessigt = $this->Firmendaten('steuersatz_ermaessigt'); } $this->app->DB->Update("UPDATE $typ SET steuersatz_normal='$steuersatz_normal',steuersatz_ermaessigt='$steuersatz_ermaessigt' WHERE id='$id' LIMIT 1"); $this->app->erp->WriteChangeLog(); } function formatMoney($value,$currency,$decimals=2) { // Schweizer Franken $decSeparator = ','; $thouSeparator = '.'; if ($currency === 'CHF') { $decSeparator = '.'; $thouSeparator = '\''; } return number_format((float)$value, $decimals, $decSeparator, $thouSeparator); } function LoadKurs($id,$typ,$projekt="",$force=false) { if($id <= 0 || empty($typ) || $typ === 'bestellung') { return; } $kurs = 0; // wenn GS und Kurs aus RE denn nicht neuladen if($typ==='gutschrift' && $this->app->erp->Firmendaten('gutschriftkursvonrechnung')) { $rechnungid = $this->app->DB->Select("SELECT rechnungid FROM gutschrift WHERE id='$id'"); if($rechnungid > 0) { $kurs = $this->app->DB->Select("SELECT kurs FROM rechnung WHERE id='$rechnungid'"); } } // nur ziehen wenn in den Firmendaten aktiviert if($this->Firmendaten("loadcurrencyrate")) { $waehrung=$this->app->DB->Select("SELECT waehrung FROM $typ WHERE id='$id'"); $kurs = $this->GetWaehrungUmrechnungskurs($this->Firmendaten('waehrung'),$waehrung); } if($kurs<>0) { $this->app->DB->Update("UPDATE $typ SET kurs='$kurs' WHERE id='$id' LIMIT 1"); } } public function LoadSteuersaetzeWaehrung($id,$typ,$projekt='') { if($id <=0 || empty($typ)) { return; } $this->LoadSteuersaetze($id,$typ,$projekt); $waehrung = $this->GetStandardWaehrung($projekt); $this->app->DB->Update("UPDATE $typ SET waehrung='$waehrung' WHERE id='$id' AND waehrung='' LIMIT 1"); // AND waehrung='' if($typ === 'proformarechnung') { return; } $this->LoadKurs($id,$typ,$projekt); } function CreateGutschrift($adresse="") { $projekt = $this->GetCreateProjekt($adresse); $belegmax = ''; $ohnebriefpapier = $this->Firmendaten('gutschrift_ohnebriefpapier'); $stornorechnung = (int)$this->Firmendaten('stornorechnung_standard'); if($stornorechnung !== 0 && $stornorechnung !== 1) { $stornorechnung = 1; $this->FirmendatenSet('stornorechnung_standard', '1'); } if($this->StandardZahlungsweise($projekt)=="rechnung") { $this->app->DB->Insert("INSERT INTO gutschrift (id,datum,bearbeiter,firma,belegnr,zahlungsweise,zahlungszieltage,status,projekt,adresse,ohne_briefpapier,stornorechnung) VALUES ('',NOW(),'".$this->app->User->GetName()."','".$this->app->User->GetFirma()."','$belegmax','".$this->StandardZahlungsweise($projekt)."','".$this->ZahlungsZielTage($projekt)."','angelegt','$projekt','$adresse','".$ohnebriefpapier."','$stornorechnung')"); } else { $this->app->DB->Insert("INSERT INTO gutschrift (id,datum,bearbeiter,firma,belegnr,zahlungsweise,zahlungszieltage,status,projekt,adresse,ohne_briefpapier,stornorechnung) VALUES ('',NOW(),'".$this->app->User->GetName()."','".$this->app->User->GetFirma()."','$belegmax','".$this->StandardZahlungsweise($projekt)."','0','angelegt','$projekt','$adresse','".$ohnebriefpapier."','$stornorechnung')"); } $id = $this->app->DB->GetInsertID(); $this->CheckVertrieb($id,"gutschrift"); $this->CheckBearbeiter($id,"gutschrift"); $this->app->erp->GutschriftProtokoll($id,"Gutschrift angelegt"); $type="gutschrift"; $this->app->erp->ObjektProtokoll($type,$id,$type."_create",ucfirst($type)." angelegt"); $deliverythresholdvatid = $this->getDeliverythresholdvatid($projekt); if($id > 0 && !empty($deliverythresholdvatid)){ $deliverythresholdvatid = $this->app->DB->real_escape_string($deliverythresholdvatid); $this->app->DB->Update("UPDATE gutschrift SET deliverythresholdvatid = '$deliverythresholdvatid' WHERE id = $id LIMIT 1"); } $this->SchnellFreigabe("gutschrift",$id); $this->LoadSteuersaetzeWaehrung($id,"gutschrift"); $this->EventAPIAdd("EventGutschriftCreate",$id,"gutschrift","create"); return $id; } function AddGutschritPosition($gutschrift, $verkauf,$menge,$datum) { $artikel = $this->app->DB->Select("SELECT artikel FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $bezeichnunglieferant = $this->app->DB->Select("SELECT name_de FROM artikel WHERE id='$artikel' LIMIT 1"); $bestellnummer = $this->app->DB->Select("SELECT nummer FROM artikel WHERE id='$artikel' LIMIT 1"); $preis = $this->app->DB->Select("SELECT preis FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $projekt = $this->app->DB->Select("SELECT projekt FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $waehrung = $this->app->DB->Select("SELECT waehrung FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $umsatzsteuer = $this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id='$artikel' LIMIT 1"); $vpe = $this->app->DB->Select("SELECT vpe FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $sort = $this->app->DB->Select("SELECT MAX(sort) FROM gutschrift_position WHERE rechnung='$gutschrift' LIMIT 1"); $sort = $sort + 1; $this->app->DB->Insert("INSERT INTO gutschrift_position (id,gutschrift,artikel,bezeichnung,nummer,menge,preis, waehrung, sort,lieferdatum, umsatzsteuer, status,projekt,vpe) VALUES ('','$gutschrift','$artikel','$bezeichnunglieferant','$bestellnummer','$menge','$preis','$waehrung','$sort','$datum','$umsatzsteuer','angelegt','$projekt','$vpe')"); } function AddAuftragPositionManuell($auftrag, $artikel,$preis, $menge,$bezeichnung,$beschreibung="",$waehrung='EUR',$rabatt=0) { $bezeichnunglieferant = $bezeichnung; $artArr = $this->app->DB->SelectRow( sprintf( 'SELECT nummer,projekt,umsatzsteuer,mlmpunkte,mlmbonuspunkte,mlmdirektpraemie FROM artikel WHERE id =%d', $artikel ) ); $bestellnummer = !empty($artArr)?$artArr['nummer']:$this->app->DB->Select("SELECT nummer FROM artikel WHERE id='$artikel' LIMIT 1"); $projekt = !empty($artArr)?$artArr['projekt']:$this->app->DB->Select("SELECT projekt FROM artikel WHERE id='$artikel' LIMIT 1"); if($waehrung!=''){ $this->app->DB->Update("UPDATE auftrag SET waehrung='$waehrung' WHERE id='$auftrag' AND waehrung='' LIMIT 1"); } $umsatzsteuer = !empty($artArr)?$artArr['umsatzsteuer']:$this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id='$artikel' LIMIT 1"); $mlmpunkte = !empty($artArr)?$artArr['mlmpunkte']:$this->app->DB->Select("SELECT mlmpunkte FROM artikel WHERE id='$artikel' LIMIT 1"); $mlmbonuspunkte = !empty($artArr)?$artArr['mlmbonuspunkte']:$this->app->DB->Select("SELECT mlmbonuspunkte FROM artikel WHERE id='$artikel' LIMIT 1"); $mlmdirektpraemie = !empty($artArr)?$artArr['mlmdirektpraemie']:$this->app->DB->Select("SELECT mlmdirektpraemie FROM artikel WHERE id='$artikel' LIMIT 1"); $keinrabatterlaubt=0; if($rabatt <> 0) { $keinrabatterlaubt=1; } //$vpe = $this->app->DB->Select("SELECT vpe FROM verkaufspreise WHERE id='$verkauf' LIMIT 1"); $sort = (int)$this->app->DB->Select("SELECT MAX(sort) FROM auftrag_position WHERE auftrag='$auftrag' LIMIT 1"); $sort++; $this->app->DB->Insert("INSERT INTO auftrag_position (auftrag,artikel,bezeichnung,nummer,menge,preis, waehrung, sort, umsatzsteuer, status,projekt,vpe,beschreibung,punkte,bonuspunkte,mlmdirektpraemie,rabatt,keinrabatterlaubt) VALUES ('$auftrag','$artikel','$bezeichnunglieferant','$bestellnummer','$menge','$preis','$waehrung','$sort','$umsatzsteuer','angelegt','$projekt','$vpe','$beschreibung','$mlmpunkte','$mlmbonuspunkte','$mlmdirektpraemie','$rabatt','$keinrabatterlaubt')"); return $this->app->DB->GetInsertID(); } function AddRechnungPositionManuell($rechnung, $artikel,$preis, $menge,$bezeichnung,$beschreibung="",$waehrung='EUR',$rabatt=0) { $obj = $this->LoadModul('rechnung'); if(!empty($obj) && method_exists($obj,'AddRechnungPositionManuell')){ return $obj->AddRechnungPositionManuell($rechnung, $artikel,$preis, $menge,$bezeichnung,$beschreibung,$waehrung,$rabatt); } } function AddRechnungPosition($rechnung, $verkauf,$menge,$datum) { $obj = $this->LoadModul('rechnung'); if(!empty($obj) && method_exists($obj,'AddRechnungPosition')){ $obj->AddRechnungPosition($rechnung, $verkauf,$menge,$datum); } } // Produktion und Auftrag reservieren function AuftragReservieren($id,$typ="auftrag") { $standardlager = 0; $projektlager = 0; if($typ==='auftrag' && $id > 0){ $auftragsArr = $this->app->DB->SelectRow( sprintf( "SELECT id, adresse, projekt, belegnr, standardlager,reservationdate FROM auftrag WHERE status='freigegeben' AND id=%d LIMIT 1", (int)$id ) ); if($this->app->DB->error()) { $auftragsArr = $this->app->DB->SelectRow( sprintf( "SELECT id, adresse, projekt, belegnr, standardlager, NULL AS reservationdate FROM auftrag WHERE status='freigegeben' AND id=%d LIMIT 1", (int)$id ) ); } if(empty($auftragsArr)) { return 0; } if(!empty($auftragsArr['reservationdate']) && $auftragsArr['reservationdate'] !== '0000-00-00' && strtotime($auftragsArr['reservationdate']) > strtotime(date('Y-m-d'))) { return 0; } $id_check = $auftragsArr['id']; $adresse = $auftragsArr['adresse']; $projekt = $auftragsArr['projekt']; if($projekt) { $projektlager = $this->app->DB->Select( sprintf( 'SELECT id FROM projekt WHERE id = %d AND projektlager = 1', $projekt ) ); } $belegnr= $auftragsArr['belegnr']; $standardlager = $auftragsArr['standardlager']; } if($typ==='produktion'){ } // nicht reservieren wenn auftrag nicht offen ist if($id_check!=$id){ return 0; } if($typ==='auftrag') { $artikelarr= $this->app->DB->SelectArr("SELECT * FROM auftrag_position WHERE auftrag='$id' AND geliefert!=1"); $this->app->DB->Delete("DELETE FROM lager_reserviert WHERE parameter='$id' AND objekt='auftrag'"); } //schaue artikel fuer artikel an wieviel geliefert wurde und ob bereits reservierungen vorliegen, wenn welche vorliegen auch reservieren auf 9999-01-01 // Lager Check $cArtikelarr = !empty($artikelarr)?count($artikelarr):0; for($k=0;$k<$cArtikelarr; $k++) { if(isset($artikelarr[$k]['gelieferte_menge'])){ $menge = $artikelarr[$k]['menge'] - $artikelarr[$k]['gelieferte_menge']; } else{ $menge = $artikelarr[$k]['menge']; } $artikel = $artikelarr[$k]['artikel']; // pruefe artikel 12 menge 4 $articleArr = $this->app->DB->SelectRow( sprintf( "SELECT lagerartikel,stueckliste FROM artikel WHERE id=%d LIMIT 1",$artikel ) ); $lagerartikel = $articleArr['lagerartikel']; $stueckliste = $articleArr['stueckliste']; if($lagerartikel>=1) { // menge = notwendige menge - bereits reserviert $zu_reservieren = $menge;// - $anzahl_reserviert; if($zu_reservieren>0) { if($typ==='auftrag'){ //if($this->LagerFreieMenge($artikel) < $zu_reservieren) continue; $lagerfreiemenge = $this->LagerFreieMenge($artikel, true, $standardlager, $projektlager); if($lagerfreiemenge <=0) { continue; } // die restliche menge auf den Auftrag reservieren if($lagerfreiemenge < $zu_reservieren){ $zu_reservieren = $lagerfreiemenge; } // schaue ob es artikel in reserivierungen fuer diesen auftrag schon gibt dann erhoehe // $check = $this->app->DB->Select("SELECT menge FROM lager_reserviert WHERE artikel='$artikel' // AND objekt='auftrag' AND parameter='$id' LIMIT 1"); $check=0; if($check > 0) { // wenn schon etwas reserviert ist $this->app->DB->Update("UPDATE lager_reserviert SET menge = menge + '$zu_reservieren' WHERE artikel='$artikel' AND objekt='auftrag' AND parameter='$id'"); } else { $this->app->DB->Insert("INSERT INTO lager_reserviert (id,adresse,artikel,menge,grund,projekt,firma,bearbeiter,datum,objekt,parameter,posid) VALUES('','$adresse','$artikel','$zu_reservieren','Reservierung für Auftrag $belegnr','$projekt', '".$this->app->User->GetFirma()."','".$this->app->User->GetName()."','9999-99-99','auftrag','$id','".$artikelarr[$k]['id']."')"); } } } } } } function AnzeigePositionenBrutto($anrede, $doctyp, $projekt, $adresse,$doctypeid=0) { // wenn im beleg 3 oder 4 dann zaehlt die einstellung if($doctypeid > 0 && in_array($doctyp, ['rechnung', 'angebot','auftrag','gutschrift','bestellung'])) { $anzeigesteuer = $this->app->DB->Select("SELECT anzeigesteuer FROM `$doctyp` WHERE id='$doctypeid' LIMIT 1"); if($anzeigesteuer==3) { return false; } if($anzeigesteuer==4) { return true; } } if($adresse) { $bruttonetto = $this->app->DB->Select("SELECT anzeigesteuerbelege FROM adresse WHERE id = '$adresse' LIMIT 1"); if($bruttonetto == 1) { return false; } if($bruttonetto == 2) { return true; } } if($projekt){ $bruttonetto = $this->app->DB->Select("SELECT anzeigesteuerbelege FROM projekt WHERE id = '$projekt' LIMIT 1"); if($bruttonetto == 1) { return false; } if($bruttonetto == 2) { return true; } } if($this->app->erp->Firmendaten('immerbruttorechnungen',$projekt)) { return true; } return false; } function AnzeigeBelegNettoAdresse($anrede, $doctyp, $projekt, $adresse,$doctypeid=0) { // wenn im beleg 3 oder 4 dann zaehlt die einstellung if($doctypeid > 0 && ($doctyp==='rechnung' || $doctyp==='angebot' || $doctyp==='auftrag' || $doctyp==='gutschrift' || $doctyp==='bestellung')) { $anzeigesteuer = $this->app->DB->Select("SELECT anzeigesteuer FROM $doctyp WHERE id='$doctypeid' LIMIT 1"); if($anzeigesteuer==3) { return true; } if($anzeigesteuer==4) { return false; } } if($adresse) { $bruttonetto = $this->app->DB->Select("SELECT anzeigesteuerbelege FROM adresse WHERE id = '$adresse' LIMIT 1"); if($bruttonetto == 1) { return 1; } if($bruttonetto == 2) { return 0; } } if($doctyp==='bestellung' && $this->app->erp->Firmendaten('immerbruttorechnungen',$projekt)!='1' && $this->Projektdaten($projekt,'anzeigesteuerbelegebestellung') != '1') { return 1; } if($projekt) { $bruttonetto = $this->Projektdaten($projekt, 'anzeigesteuerbelege');// $this->app->DB->Select("SELECT anzeigesteuerbelege FROM projekt WHERE id = '$projekt' LIMIT 1"); if($bruttonetto == 1) { return 1; } if($bruttonetto == 2) { return 0; } } if($doctyp==='bestellung' && $this->app->erp->Firmendaten('immerbruttorechnungen',$projekt)!='1') { return 1; } if($this->app->erp->Firmendaten('immerbruttorechnungen',$projekt)!='1' && ($anrede==='firma' || $doctyp==='bestellung' || $this->app->erp->AnzeigeBelegNetto($anrede,$projekt,$doctyp,$doctypeid) || $this->app->erp->Firmendaten('immernettorechnungen',$projekt)=='1')) { return 1; } return 0; } function AnzeigeBelegNetto($typ,$projekt,$doctype="",$doctypeid=0) { // wenn im beleg 3 oder 4 dann zaehlt die einstellung if($doctypeid > 0 && ($doctype==='rechnung' || $doctype==='angebot' || $doctype==='auftrag' || $doctype=='gutschrift' || $doctype=='bestellung')) { $anzeigesteuer = $this->app->DB->Select("SELECT anzeigesteuer FROM $doctype WHERE id='$doctypeid' LIMIT 1"); if($anzeigesteuer==3) { return 1; } } $orderBy = ''; if($projekt > 0) { $orderBy = ' ORDER BY projekt DESC'; } return (int)$this->app->DB->Select( sprintf( 'SELECT netto FROM adresse_typ WHERE type=\'%s\' %s LIMIT 1', $typ, $orderBy ) ); } function AuftragNeuberechnenAllen() { $arrAuftrag = $this->app->DB->SelectArr("SELECT id FROM auftrag WHERE status!='abgeschlossen' AND status!='storniert' AND autoversand=1 ORDER BY fastlane = 1 DESC, datum"); if(empty($arrAuftrag)) { return; } foreach($arrAuftrag as $rowAuftrag) { $this->AuftragNeuberechnen($rowAuftrag['id']); } } function BestellungNeuberechnen($id) { $obj = $this->LoadModul('bestellung'); if(!empty($obj) && method_exists($obj, 'BestellungNeuberechnen')) { $obj->BestellungNeuberechnen($id); } } function LieferscheinNeuberechnen($id) { } function AngebotNeuberechnen($id) { $this->ANABREGSNeuberechnen($id,"angebot"); } function AuftragZahlungaufteilen($auftrag_org,$auftrag_new) { $gesamtsumme_new = $this->app->DB->Select("SELECT gesamtsumme FROM auftrag WHERE id='$auftrag_new' LIMIT 1"); $adresse_new = $this->app->DB->Select("SELECT adresse FROM auftrag WHERE id='$auftrag_new' LIMIT 1"); //pruefe ob es auf auftrag einen Zahlungseingang gibt $zahlungen = $this->app->DB->SelectArr("SELECT * FROM kontoauszuege_zahlungseingang WHERE objekt='auftrag' AND parameter='$auftrag_org'"); for($i=0;$i<(!empty($zahlungen)?count($zahlungen):0);$i++) { if($zahlungen[$i]['betrag'] > $gesamtsumme_new) { $betrag_new = $zahlungen[$i]['betrag'] - $gesamtsumme_new; $this->app->DB->Update("UPDATE kontoauszuege_zahlungseingang SET betrag='$betrag_new' WHERE id='".$zahlungen[$i]['id']."' LIMIT 1"); $this->app->DB->Insert("INSERT INTO kontoauszuege_zahlungseingang (id,adresse,bearbeiter,betrag,datum,objekt,parameter,kontoauszuege,firma,abgeschlossen,parameter2) VALUES ('','".$adresse_new."','".$zahlungen[$i]['bearbeiter']."','".$gesamtsumme_new."','".$zahlungen[$i]['datum']."','auftrag','".$auftrag_new."','".$zahlungen[$i]['kontoauszuege']."','".$zahlungen[$i]['firma']."','".$zahlungen[$i]['abgeschlossen']."','".$zahlungen[$i]['parameter2']."')"); break; } } return; } function AuftragNeuberechnen($id,$force=false) { $this->ANABREGSNeuberechnen($id,"auftrag",$force); } function GutschriftNeuberechnen($id) { $this->ANABREGSNeuberechnen($id,"gutschrift"); // alle zugehoerigen Rechnungen $rechnungid = $this->app->DB->Select("SELECT rechnungid FROM gutschrift WHERE id='$id' LIMIT 1"); if($rechnungid > 0 && $this->Firmendaten("mahnwesenmitkontoabgleich")=="1") { $this->app->DB->Update("UPDATE rechnung SET zahlungsstatus='offen' WHERE id='$rechnungid' AND mahnwesenfestsetzen!=1 LIMIT 1"); $this->RechnungNeuberechnen($rechnungid); } } function DeleteGutschrift($id) { $belegnr = $this->app->DB->Select("SELECT belegnr FROM gutschrift WHERE id='$id' LIMIT 1"); if($belegnr==="" || $belegnr==="0") { $this->app->DB->Delete("DELETE FROM gutschrift_position WHERE gutschrift='$id'"); $this->app->DB->Delete("DELETE FROM gutschrift_protokoll WHERE gutschrift='$id'"); $this->app->DB->Delete("DELETE FROM gutschrift WHERE id='$id' LIMIT 1"); } } function Skontofaehig($id, $art, $mitsteuer=true) { $name = ucfirst($art).'MitUmsatzeuer'; if(!method_exists($this->app->erp, $name)) { return; } $skontofaehig = 0; $positionen = $this->app->DB->SelectArr("SELECT ap.*,art.keinskonto as artkeinskonto FROM $art"."_position ap INNER JOIN artikel art ON ap.artikel = art.id WHERE $art = '$id' ".($art == 'angebot'?" AND ifnull(ap.optional,0) = 0 ":'')); $steuerfrei = !$this->$name($id); $steuersatzermaessigt = $this->GetSteuersatzErmaessigt(true,$id,$art); $steuersatznormal = $this->GetSteuersatzNormal(true,$id,$art); $zahlungszielskonto = $this->app->DB->Select("SELECT zahlungszielskonto FROM $art WHERE id = '$id' LIMIT 1"); foreach($positionen as $k => $v) { if($v['artkeinskonto'] == 1 && $v['skontobetrag'] !== 0) { }else{ $steuersatz = 1; if(!$steuerfrei) { if(!is_null($v['steuersatz']) && $v['steuersatz'] >= 0) { $steuersatz = 1+ $v['steuersatz']; }else{ if($v['umsatzsteuer'] == 'befreit') { }elseif($v['umsatzsteuer'] == 'ermaessigt') { $steuersatz = $steuersatzermaessigt; }else{ $steuersatz = $steuersatznormal; } } $rabatt = 0; if(!$v['keinrabatterlaubt'])$rabatt = (float)$v['rabatt']; } if($mitsteuer) $skontofaehig += $v['menge'] * $v['preis']* (1-$rabatt/100) * $steuersatz; else $skontofaehig += $v['menge'] * $v['preis']* (1-$rabatt/100); } } return $skontofaehig; } function BerechneSkonto($id, $art, $force = false) { if( ($art == '') || ($id <= 0) ){ return; } if($art === 'proformarechnung') { return; } if(!$force && $this->app->DB->Select( sprintf( 'SELECT schreibschutz FROM `%s` WHERE id = %d LIMIT 1', $art, $id ) ) ) { return; } $name = ucfirst($art).'MitUmsatzeuer'; if(!method_exists($this->app->erp, $name)) { return; } $positionen = $this->app->DB->SelectArr( "SELECT ap.*,art.keinskonto as artkeinskonto, art.umsatzsteuer as artumsatzsteuer FROM $art"."_position ap INNER JOIN artikel art ON ap.artikel = art.id WHERE $art = '$id' ".($art == 'angebot'?" AND ifnull(ap.optional,0) = 0 ":'')); if(empty($positionen)){ $this->app->DB->Update("UPDATE $art SET skontobetrag = 0 WHERE id = '$id' LIMIT 1"); return; } $steuerfrei = !$this->$name($id); $skontobetrag = 0; $docArr = $this->app->DB->SelectRow(sprintf('SELECT * FROM `%s` WHERE id = %d', $art, $id)); if(!empty($docArr)){ $steuersatzermaessigt = 1 + $docArr['steuersatz_ermaessigt'] / 100; $steuersatznormal = 1 + $docArr['steuersatz_normal'] / 100; $zahlungszielskonto = $docArr['zahlungszielskonto']; } else{ $steuersatzermaessigt = $this->GetSteuersatzErmaessigt(true, $id, $art); $steuersatznormal = $this->GetSteuersatzNormal(true, $id, $art); $zahlungszielskonto = $this->app->DB->Select("SELECT zahlungszielskonto FROM $art WHERE id = '$id' LIMIT 1"); } foreach($positionen as $k => $v) { if($v['artkeinskonto'] == 1 && $v['skontobetrag'] !== 0) { $skontobetragpos = 0; if(!$v['skontosperre']) { $this->app->DB->Update("UPDATE $art"."_position SET skontobetrag = 0 WHERE id = '".$v['id']."' LIMIT 1"); $this->app->DB->Update("UPDATE $art"."_position SET skontobetrag_netto_einzeln = 0 WHERE id = '".$v['id']."' LIMIT 1"); $this->app->DB->Update("UPDATE $art"."_position SET skontobetrag_netto_gesamt = 0 WHERE id = '".$v['id']."' LIMIT 1"); $this->app->DB->Update("UPDATE $art"."_position SET skontobetrag_brutto_einzeln = 0 WHERE id = '".$v['id']."' LIMIT 1"); $this->app->DB->Update("UPDATE $art"."_position SET skontobetrag_brutto_einzeln = 0 WHERE id = '".$v['id']."' LIMIT 1"); } else { $skontobetragpos = $v['skontobetrag']; } $skontobetrag += $skontobetragpos; } else{ $steuersatz = 1; if(!$steuerfrei) { if(!is_null($v['steuersatz']) && $v['steuersatz'] >= 0) { $steuersatz = 1+ $v['steuersatz']/100; }else{ if($v['umsatzsteuer'] == '') { $v['umsatzsteuer'] = $v['artumsatzsteuer']; } if($v['umsatzsteuer'] === 'befreit') { }elseif($v['umsatzsteuer'] === 'ermaessigt') { $steuersatz = $steuersatzermaessigt; }else{ $steuersatz = $steuersatznormal; } } } $rabatt = 0; if(!empty($v['rabatt'])) { $rabatt = (float)$v['rabatt']; } $skontobetragpos = $v['menge'] * $v['preis']* (1-$rabatt/100) * $steuersatz * $zahlungszielskonto / 100; $skontobetragNettoEinzeln = $v['preis'] * (1-$rabatt/100) * $zahlungszielskonto / 100; $skontobetragBruttoEinzeln = $v['preis'] * (1-$rabatt/100) * $steuersatz * $zahlungszielskonto / 100; $skontobetragNettoGesamt = $v['menge'] * $v['preis'] * (1-$rabatt/100) * $zahlungszielskonto / 100; if(empty($v['skontosperre'])) { $this->app->DB->Update("UPDATE $art"."_position SET skontobetrag = '$skontobetragpos' WHERE id = '".$v['id']."' LIMIT 1"); $this->app->DB->Update("UPDATE $art"."_position SET skontobetrag_brutto_gesamt = '$skontobetragpos' WHERE id = '".$v['id']."' LIMIT 1"); $this->app->DB->Update("UPDATE $art"."_position SET skontobetrag_netto_gesamt = '$skontobetragNettoGesamt' WHERE id = '".$v['id']."' LIMIT 1"); $this->app->DB->Update("UPDATE $art"."_position SET skontobetrag_brutto_einzeln = '$skontobetragBruttoEinzeln' WHERE id = '".$v['id']."' LIMIT 1"); $this->app->DB->Update("UPDATE $art"."_position SET skontobetrag_netto_einzeln = '$skontobetragNettoEinzeln' WHERE id = '".$v['id']."' LIMIT 1"); } else { $skontobetragpos = $v['skontobetrag']; } $skontobetrag += $skontobetragpos; } } $this->app->DB->Update("UPDATE $art SET skontobetrag = '$skontobetrag' WHERE id = '$id' LIMIT 1"); if(!empty($positionen) && (empty($docArr) || empty($docArr['skontoberechnet']))) { $this->app->DB->Update("UPDATE $art SET skontoberechnet = '1' WHERE id = '$id' LIMIT 1"); } } /* * 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) { if($id <= 0 || empty($art)) { return; } //$this->LoadSteuersaetze($id,$art); //03.01.2019 Bruno entfernt, da Shopaufträge umsgestellt werden //$this->LoadKurs($id,$art); //03.01.2019 Bruno entfernt $belegarr = $this->app->DB->SelectRow("SELECT * FROM $art WHERE id='$id' LIMIT 1"); if(empty($belegarr)) { return; } $belegnr = $belegarr['belegnr']; $adresse = $belegarr['adresse']; $status = $belegarr['status']; $waehrung = $belegarr['waehrung']; $rabatteportofestschreiben = 0; if($art === 'auftrag' && $belegarr['lieferantkdrnummer'] == '') { if($belegarr['lieferantenauftrag'] == 1){ if($belegarr['lieferantenauftrag'] != 1 || empty($belegarr['lieferantkdrnummer'])){ $this->app->DB->Update(" UPDATE auftrag a INNER JOIN adresse adr ON a.lieferant = adr.id SET a.lieferantkdrnummer = if(a.lieferantennummer <> '',a.lieferantennummer,adr.lieferantennummer) WHERE a.lieferantkdrnummer = '' AND a.lieferantenauftrag = 1 AND a.id = '$id' "); } } else{ if($belegarr['lieferantenauftrag'] != 0 || empty($belegarr['lieferantkdrnummer'])){ $this->app->DB->Update(" UPDATE auftrag a INNER JOIN adresse adr ON a.adresse = adr.id SET a.lieferantkdrnummer = if(a.kundennummer <> '',a.kundennummer, adr.kundennummer) WHERE a.lieferantkdrnummer = '' AND a.lieferantenauftrag = 0 AND a.id = '$id' "); } } } $schreibschutz = $belegarr['schreibschutz']; if($force!=true && $schreibschutz=='1'){ return; } //waehrungen if($waehrung!='') { $this->app->DB->Update("UPDATE ".$art."_position SET waehrung='$waehrung' WHERE $art='".$id."' AND waehrung=''"); } if($art==='auftrag') { // abweichende lieferadresse name loeschen wenn es keine gibt $abweichendelieferadresse = $belegarr['abweichendelieferadresse']; $rabatteportofestschreiben = $belegarr['rabatteportofestschreiben']; $liefername = $belegarr['liefername']; if($liefername=='' && $abweichendelieferadresse=='1'){ $this->app->DB->Update("UPDATE auftrag SET abweichendelieferadresse=0 WHERE id='$id' LIMIT 1"); } } $this->RunHook('ANABREGSNeuberechnen_1', 2, $art, $id); $this->CheckFreifelder($art,$id); $artikelarr = $this->app->DB->SelectArr( sprintf( 'SELECT pos.*, art.keinrabatterlaubt as art_keinrabatterlaubt, art.porto AS art_porto, art.rabatt AS art_rabatt, art.rabatt_prozent AS art_rabatt_prozent FROM `%s` AS pos LEFT JOIN artikel AS art ON pos.artikel = art.id WHERE pos.`%s`= %d ORDER BY pos.sort', $art.'_position', $art, (int)$id ) ); $adresse = $belegarr['adresse']; $cartikelarr = $artikelarr?count($artikelarr):0; if($art!=='bestellung')//$this->Firmendaten("modul_verband")=="1") //CLAUDI { $grundrabatt = 0; $rabatt1 = 0; $rabatt2 = 0; $rabatt3 = 0; $rabatt4 = 0; $rabatt5 = 0; if($art==='angebot' || $art==='auftrag' || $art==='rechnung' || $art==='gutschrift' || $art==='proformarechnung') { $rabattarr = $this->app->DB->SelectRow("SELECT * FROM $art WHERE id='$id' LIMIT 1"); if(!empty($rabattarr)){ $grundrabatt = $rabattarr['rabatt']; $rabatt1 = $rabattarr['rabatt1']; $rabatt2 = $rabattarr['rabatt2']; $rabatt3 = $rabattarr['rabatt3']; $rabatt4 = $rabattarr['rabatt4']; $rabatt5 = $rabattarr['rabatt5']; } if($grundrabatt>0) $rabattarr[] = ((100-$grundrabatt)/100.0); if($rabatt1>0) $rabattarr[] = ((100-$rabatt1)/100.0); if($rabatt2>0) $rabattarr[] = ((100-$rabatt2)/100.0); if($rabatt3>0) $rabattarr[] = ((100-$rabatt3)/100.0); if($rabatt4>0) $rabattarr[] = ((100-$rabatt4)/100.0); if($rabatt5>0) $rabattarr[]= ((100-$rabatt5)/100.0); $rabatt=1; if(!empty($rabattarr)) { foreach($rabattarr as $rabattRow) { if($rabattRow > 0 && $rabattRow < 1) { $rabatt *= $rabattRow; } } } $rabatt=(1-$rabatt)*100; if($grundrabatt >= 100 || $rabatt1 >= 100 || $rabatt2 >= 100 || $rabatt3 >= 100 || $rabatt4 >= 100 || $rabatt5 >= 100) { $rabatt = 100; } if($rabatt > 0 && $rabattarr['realrabatt'] != $rabatt) { $this->app->DB->Update( sprintf( 'UPDATE `%s` SET realrabatt=%f WHERE id=%d LIMIT 1', $art,(float)$rabatt, (int)$id ) ); } } // Rabatt Sync starten $cartikelarr = $artikelarr?count($artikelarr):0; for($i=0;$i<$cartikelarr;$i++) { // kopiere rabatte zum ersten mal if($artikelarr[$i]['rabattsync']!='1') { // pruefe ob artikel rabatt bekommen darf $check_keinrabatterlaubt = $artikelarr[$i]['art_keinrabatterlaubt']; $check_porto = $artikelarr[$i]['art_porto']; $check_rabatt = $artikelarr[$i]['art_rabatt']; if($check_keinrabatterlaubt!="1" && $check_porto!="1" && $check_rabatt!="1") { $this->app->DB->Update("UPDATE ".$art."_position SET rabattsync='1', grundrabatt='$grundrabatt', rabatt1='$rabatt1', rabatt2='$rabatt2', rabatt3='$rabatt3', rabatt4='$rabatt4', rabatt5='$rabatt5', keinrabatterlaubt='0' WHERE id='".$artikelarr[$i]['id']."' AND rabatt=0 AND keinrabatterlaubt!='1' LIMIT 1"); if($this->app->DB->affected_rows() > 0){ $artikelarr[$i]['rabattsync'] = 1; $artikelarr[$i]['grundrabatt'] = $grundrabatt; $artikelarr[$i]['rabatt1'] = $rabatt1; $artikelarr[$i]['rabatt2'] = $rabatt2; $artikelarr[$i]['rabatt3'] = $rabatt3; $artikelarr[$i]['rabatt4'] = $rabatt4; $artikelarr[$i]['rabatt5'] = $rabatt5; } } else { if($check_porto=="1") { $this->app->DB->Update("UPDATE ".$art."_position SET rabattsync='1',keinrabatterlaubt='".($rabatteportofestschreiben?'1':'0')."',rabatt='0' WHERE id='".$artikelarr[$i]['id']."' LIMIT 1"); $artikelarr[$i]['keinrabatterlaubt'] = $rabatteportofestschreiben?'1':'0'; $artikelarr[$i]['rabattsync'] = 1; $artikelarr[$i]['rabatt'] = 0; } elseif($check_keinrabatterlaubt=="1") { $this->app->DB->Update("UPDATE ".$art."_position SET rabattsync='1',keinrabatterlaubt='1',rabatt='0' WHERE id='".$artikelarr[$i]['id']."' LIMIT 1"); $artikelarr[$i]['keinrabatterlaubt'] = 1; $artikelarr[$i]['rabattsync'] = 1; $artikelarr[$i]['rabatt'] = 0; } } } $keinrabatterlaubt_sub = $artikelarr[$i]['keinrabatterlaubt']; if($keinrabatterlaubt_sub=='1') { $rabatt=0; }else{ // rechne rabatt fuer position aus $posarr = $artikelarr[$i]; if(!empty($posarr)){ $grundrabatt_sub = $posarr['grundrabatt']; $rabatt1_sub = $posarr['rabatt1']; $rabatt2_sub = $posarr['rabatt2']; $rabatt3_sub = $posarr['rabatt3']; $rabatt4_sub = $posarr['rabatt4']; $rabatt5_sub = $posarr['rabatt5']; $keinrabatterlaubt_sub = $posarr['keinrabatterlaubt']; }else{ $grundrabatt_sub = 0; $rabatt1_sub = 0; $rabatt2_sub = 0; $rabatt3_sub = 0; $rabatt4_sub = 0; $rabatt5_sub = 0; $keinrabatterlaubt_sub = 0; } $rabattarr = array(); if($grundrabatt_sub>0) $rabattarr[] = ((100-$grundrabatt_sub)/100.0); if($rabatt1_sub>0) $rabattarr[] = ((100-$rabatt1_sub)/100.0); if($rabatt2_sub>0) $rabattarr[] = ((100-$rabatt2_sub)/100.0); if($rabatt3_sub>0) $rabattarr[] = ((100-$rabatt3_sub)/100.0); if($rabatt4_sub>0) $rabattarr[] = ((100-$rabatt4_sub)/100.0); if($rabatt5_sub>0) $rabattarr[]= ((100-$rabatt5_sub)/100.0); $rabatt=1; if(!empty($rabattarr)) { foreach($rabattarr as $rabattRow) { if($rabattRow > 0 && $rabattRow < 1) { $rabatt *= $rabattRow; } } } $rabatt=(1-$rabatt)*100; if($grundrabatt_sub >= 100 || $rabatt1_sub >= 100 || $rabatt2_sub >= 100 || $rabatt3_sub >= 100 || $rabatt4_sub >= 100 || $rabatt5_sub >= 100) { $rabatt = 100; } } // wenn kein rabatt fuer die Position erlaubt ist if($this->Firmendaten("modul_verband")=="1" && $this->ModulVorhanden('verband')) //CLAUDI $this->app->DB->Update("UPDATE ".$art."_position SET rabatt='$rabatt' WHERE id='".$artikelarr[$i]['id']."' LIMIT 1"); elseif($rabatt != 0) { $this->app->DB->Update("UPDATE ".$art."_position SET rabatt='$rabatt' WHERE id='".$artikelarr[$i]['id']."' AND rabatt=0 LIMIT 1"); } } } // rabatt positionen berechnen also die, die auf den gesamten auftrag gehen $betrag = $this->ANABREGSNeuberechnenGesamtsummeOhnePortoUndKeinRabatt($id,$art); $cartikelarr = $artikelarr?count($artikelarr):0; for($i=0;$i<$cartikelarr;$i++) { $check_rabatt_artikel = $artikelarr[$i]['art_rabatt']; if($check_rabatt_artikel=='1') { $check_rabatt_artikel_prozente = $artikelarr[$i]['art_rabatt_prozent']; if($check_rabatt_artikel_prozente<>0) { $this->app->DB->Update("UPDATE ".$art."_position SET menge='1', preis='".((($betrag/100)*$check_rabatt_artikel_prozente)*-1)."' WHERE id='".$artikelarr[$i]['id']."' LIMIT 1"); } } } // porto berechnen $portoRow = $this->app->DB->SelectRow( sprintf( 'SELECT tp.* FROM `%s` AS tp INNER JOIN artikel AS a ON a.id=tp.artikel WHERE a.porto=1 AND a.geloescht!=1 AND tp.`%s`= %d LIMIT 1', $art.'_position', $art, (int)$id ) ); $portoid = !empty($portoRow['id'])?$portoRow['id']:0; $portoartikel = !empty($portoRow['artikel'])?$portoRow['artikel']:0; $keinrabatterlaubt_sub = !empty($portoRow['keinrabatterlaubt'])?$portoRow['keinrabatterlaubt']:0; $betrag = $this->ANABREGSNeuberechnenGesamtsummeOhnePorto($id,$art); if($portoid > 0 && $keinrabatterlaubt_sub!="1" && $this->Firmendaten("porto_berechnen")) { $realpreis = false; $portoberechnen = $this->PortoBerechnen($adresse,$betrag,$portoartikel, $realpreis); if($portoberechnen || $realpreis) { $this->app->DB->Update("UPDATE ".$art."_position SET menge='1',preis='".$this->PortoBerechnen($adresse,$betrag,$portoartikel)."' WHERE id='".$portoid ."' LIMIT 1"); } } $this->ANABREGSNeuberechnenGesamtsumme($id,$art); if($art==="auftrag") { //tatsaechlicheslieferdatum $orderRow = $this->app->DB->SelectRow( sprintf( 'SELECT tatsaechlicheslieferdatum, projekt, lieferdatum,land FROM auftrag WHERE id = %d LIMIT 1', (int)$id ) ); $tatsaechlicheslieferdatum = $orderRow['tatsaechlicheslieferdatum']; $projekt = $orderRow['projekt']; $differenztage = $this->Projektdaten($projekt,'differenz_auslieferung_tage'); if($differenztage<0 || empty($differenztage)) { $differenztage=0; } $lieferdatum = $orderRow['lieferdatum']; $land = $orderRow['land']; if(($tatsaechlicheslieferdatum==='0000-00-00' || $tatsaechlicheslieferdatum=='') && $lieferdatum!=='0000-00-00') { while($this->app->DB->Select("SELECT id FROM auftrag WHERE weekday(DATE_SUB(lieferdatum, INTERVAL $differenztage DAY)) >= 5 AND id='$id' LIMIT 1") || $this->app->DB->Select("SELECT id FROM arbeitsfreietage WHERE datum = DATE_SUB((SELECT lieferdatum FROM auftrag WHERE id = '$id' LIMIT 1), INTERVAL $differenztage DAY) AND (projekt='$projekt' OR projekt=0) AND (land='$land' OR land='') ORDER by land='$land' LIMIT 1")) { $differenztage++; } $this->app->DB->Update("UPDATE auftrag SET tatsaechlicheslieferdatum=DATE_SUB(lieferdatum, INTERVAL $differenztage DAY) WHERE id='$id' LIMIT 1"); } $this->EventAPIAdd("EventAuftragEdit",$id,"auftrag","edit"); } $this->BerechneDeckungsbeitrag($id,$art); $this->BerechneSkonto($id, $art); $teillieferung = false; $systemfreitext = ''; if($art === 'rechnung') { $systemfreitext = $this->app->DB->Select(sprintf('SELECT systemfreitext FROM rechnung WHERE id = %d', $id)); } elseif($art === 'auftrag') { $systemfreitext = $this->app->DB->Select(sprintf('SELECT systemfreitext FROM auftrag WHERE id = %d', $id)); } if($systemfreitext == '' && ($art==='rechnung' || $art==='auftrag')) { if($art==='auftrag') { $tmprechnung = $this->app->DB->SelectArr("SELECT projekt, id as auftragid, zahlungsweise,transaktionsnummer,teillieferungvon FROM $art WHERE id='$id' LIMIT 1"); $teillieferung = ($tmprechnung[0]['teillieferungvon']>0?true:false); } else{ $tmprechnung = $this->app->DB->SelectArr("SELECT projekt, auftragid, zahlungsweise FROM $art WHERE id='$id' LIMIT 1"); } if($tmprechnung[0]['transaktionsnummer']==''){ $tmprechnung[0]['transaktionsnummer'] = $this->app->DB->Select("SELECT transaktionsnummer FROM auftrag WHERE id='" . $tmprechnung[0]['auftragid'] . "' LIMIT 1"); } } $this->RunHook('ANABREGSNeuberechnenEnde',2, $id, $art); } /** * @param array $taxes * @param array $posTaxes * * @return array */ public function addErloesFromPos($taxes, $posTaxes) { if(empty($taxes) || empty($posTaxes)) { return $taxes; } $posByErloes = []; $hasErloes = false; foreach($posTaxes as $posTax) { if(!empty($posTax['erloese'])) { $hasErloes = true; } $posByErloes[(string)$posTax['steuersatz']][!empty($posTax['erloese'])?(string)$posTax['erloese']:''][] = $posTax; } if(!$hasErloes) { return $taxes; } $taxesToAdd = []; foreach($taxes as $key => $tax) { $taxRate = $tax['steuersatz']; if(empty($posByErloes[$taxRate])) { continue; } if(count($posByErloes[$taxRate]) === 1) { $erloes = array_keys($posByErloes[$taxRate]); $taxes[$key]['erloese'] = reset($erloes); continue; } $first = true; foreach($posByErloes[$taxRate] as $erloes => $positions) { $brutto = 0.0; $netto = 0.0; foreach($positions as $position) { $brutto += $position['brutto']; $netto += $postion['netto']; } if($first) { $taxesToAdd[] = $tax; $taxToaddKey = (!empty($taxesToAdd)?count($taxesToAdd):0)-1; $taxesToAdd[$taxToaddKey]['brutto'] -= $brutto; $taxesToAdd[$taxToaddKey]['netto'] -= $netto; $tax['brutto'] = $brutto; $tax['netto'] = $netto; $tax['erloese'] = $erloes; $taxes[$key]['brutto'] = $tax['brutto']; $taxes[$key]['netto'] = $tax['netto']; $taxes[$key]['erloese'] = $tax['erloese']; $first = false; continue; } $taxToaddKey = (!empty($taxesToAdd)?count($taxesToAdd):0)-1; $taxesToAdd[] = $taxesToAdd[$taxToaddKey]; $taxToaddKey = (!empty($taxesToAdd)?count($taxesToAdd):0)-1; $taxesToAdd[$taxToaddKey]['brutto'] -= $brutto; $taxesToAdd[$taxToaddKey]['netto'] -= $netto; $taxesToAdd[$taxToaddKey - 1]['brutto'] = $brutto; $taxesToAdd[$taxToaddKey - 1]['netto'] = $netto; $taxesToAdd[$taxToaddKey - 1]['erloese'] = $erloes; } } foreach($taxesToAdd as $tax) { if($tax['netto'] != 0.0) { $taxes[] = $tax; } } return $taxes; } /** * @param int $artikel * @param int $ust_befreit * @param bool|int $aufwendung * @param float $tmpsteuersatz * @param string $tmpsteuertext * @param string $tmperloes * @param string $umsatzsteuerpos * @param null|string $ustid * @param int $projekt */ public function getErloesFirmendaten($artikel, $ust_befreit,$aufwendung, &$tmpsteuersatz, &$tmpsteuertext, &$tmperloes, $umsatzsteuerpos, $ustid = null, $projekt = 0) { $tmperloes = ''; $artikeldata = $this->app->DB->SelectRow("SELECT * FROM artikel WHERE id = '$artikel' LIMIT 1"); if(empty($artikeldata)) { return; } $umsatzsteuer = $artikeldata['umsatzsteuer'] === 'ermaessigt'?'ermaessigt':($artikeldata['umsatzsteuer']==='befreit'?'befreit':'normal'); if($umsatzsteuerpos) { $umsatzsteuer = $umsatzsteuerpos; } switch($ust_befreit) { case 1: if($aufwendung) { if(trim((String)$ustid) !== '') { $tmperloes = $this->Firmendaten('steuer_aufwendung_inland_euermaessigt'); return; } if($umsatzsteuer === 'ermaessigt') { $tmperloes = $this->Firmendaten('steuer_aufwendung_inland_euermaessigt'); return; } $tmperloes = $this->Firmendaten('steuer_aufwendung_inland_eunormal'); return; } if(trim((String)$ustid) !== '') { $tmperloes = $this->Firmendaten('steuer_erloese_inland_innergemeinschaftlich'); return; } if($umsatzsteuer === 'ermaessigt') { $tmperloes = $this->Firmendaten('steuer_erloese_inland_euermaessigt'); return; } $tmperloes = $this->Firmendaten('steuer_erloese_inland_eunormal'); return; break; case 2: if($aufwendung) { $tmperloes = $this->Firmendaten('steuer_aufwendung_inland_import'); return; } $tmperloes = $this->Firmendaten('steuer_erloese_inland_export'); return; break; case 3: if($aufwendung) { $tmperloes = $this->Firmendaten('steuer_aufwendung_inland_nichtsteuerbar'); return; } $tmperloes = $this->Firmendaten('steuer_erloese_inland_nichtsteuerbar'); return; break; default: if($aufwendung) { if($umsatzsteuer === 'ermaessigt') { $tmperloes = $this->Firmendaten('steuer_aufwendung_inland_ermaessigt'); return; } if($umsatzsteuer === 'befreit'){ $tmperloes = $this->Firmendaten('steuer_aufwendung_inland_nichtsteuerbar'); return; } $tmperloes = $this->Firmendaten('steuer_aufwendung_inland_normal'); return; } if($umsatzsteuer === 'ermaessigt') { $tmperloes = $this->Firmendaten('steuer_erloese_inland_ermaessigt'); return; } if($umsatzsteuer === 'befreit') { $tmperloes = $this->Firmendaten('steuer_erloese_inland_nichtsteuerbar'); return; } $tmperloes = $this->Firmendaten('steuer_erloese_inland_normal'); return; break; } } /** * @param int $artikel * @param int $ust_befreit * @param bool|int $aufwendung * @param float $tmpsteuersatz * @param string $tmpsteuertext * @param string $tmperloes * @param string $umsatzsteuerpos * @param null|string $ustid * @param int $projekt */ function GetArtikelSteuer($artikel, $ust_befreit,$aufwendung, &$tmpsteuersatz, &$tmpsteuertext, &$tmperloes, $umsatzsteuerpos, $ustid = null, $projekt = 0) { $tmperloes = ''; $artikeldata = $this->app->DB->SelectRow("SELECT * FROM artikel WHERE id = '$artikel' LIMIT 1"); if(empty($artikeldata)) { return; } $umsatzsteuer = $artikeldata['umsatzsteuer'] === 'ermaessigt'?'ermaessigt':($artikeldata['umsatzsteuer']==='befreit'?'befreit':'normal'); if($umsatzsteuerpos) { $umsatzsteuer = $umsatzsteuerpos; } $projectRow = null; if($projekt) { $projectRow = $this->app->DB->SelectRow( sprintf( 'SELECT * FROM projekt WHERE id = %d', $projekt ) ); } $tmpsteuertext = ''; $kategorie = null; switch($ust_befreit) { case 1: $tmpsteuertext = $artikeldata['steuertext_innergemeinschaftlich']; if($aufwendung) { if(trim((String)$ustid) !== '') { $tmperloes = $artikeldata['steuer_aufwendung_inland_innergemeinschaftlich']; }else{ if($umsatzsteuer === 'ermaessigt') { $tmperloes = $artikeldata['steuer_aufwendung_inland_euermaessigt']; }else{ $tmperloes = $artikeldata['steuer_aufwendung_inland_eunormal']; } } }else{ if(trim((String)$ustid) !== '') { $tmperloes = $artikeldata['steuer_erloese_inland_innergemeinschaftlich']; }else{ if($umsatzsteuer === 'ermaessigt') { $tmperloes = $artikeldata['steuer_erloese_inland_euermaessigt']; }else{ $tmperloes = $artikeldata['steuer_erloese_inland_eunormal']; } } } break; case 2: $tmpsteuertext = $artikeldata['steuertext_export']; if($aufwendung) { $tmperloes = $artikeldata['steuer_aufwendung_inland_import']; }else{ $tmperloes = $artikeldata['steuer_erloese_inland_export']; } break; case 3: if($aufwendung) { $tmperloes = $artikeldata['steuer_aufwendung_inland_nichtsteuerbar']; }else{ $tmperloes = $artikeldata['steuer_erloese_inland_nichtsteuerbar']; } break; default: if($aufwendung) { if($umsatzsteuer === 'ermaessigt') { $tmperloes = $artikeldata['steuer_aufwendung_inland_ermaessigt']; }elseif($umsatzsteuer === 'befreit'){ $tmperloes = $artikeldata['steuer_aufwendung_inland_nichtsteuerbar']; }else{ $tmperloes = $artikeldata['steuer_aufwendung_inland_normal']; } }else{ if($umsatzsteuer === 'ermaessigt') { $tmperloes = $artikeldata['steuer_erloese_inland_ermaessigt']; }elseif($umsatzsteuer === 'befreit'){ $tmperloes = $artikeldata['steuer_erloese_inland_nichtsteuerbar']; }else{ $tmperloes = $artikeldata['steuer_erloese_inland_normal']; } } break; } if(strpos($artikeldata['typ'],'_kat') !== false) { $kategorie = $this->app->DB->SelectRow("SELECT * FROM artikelkategorien WHERE id = '".(int)str_replace('_kat','',$artikeldata['typ'])."' LIMIT 1"); } if($kategorie && ($tmpsteuertext === '' || $tmpsteuertext === false || is_null($tmpsteuertext))) { switch($ust_befreit) { case 1: $tmpsteuertext = $kategorie['steuertext_innergemeinschaftlich']; break; case 2: $tmpsteuertext = $kategorie['steuertext_export']; break; } } if(!$tmperloes) { switch($ust_befreit) { case 1: if($aufwendung) { if(trim((String)$ustid) !== '') { $tmperloes = $kategorie['steuer_aufwendung_inland_euermaessigt']; }else{ if($umsatzsteuer === 'ermaessigt') { $tmperloes = $kategorie['steuer_aufwendung_inland_euermaessigt']; }else{ $tmperloes = $kategorie['steuer_aufwendung_inland_eunormal']; } } }else{ if(trim((String)$ustid) !== '') { $tmperloes = $kategorie['steuer_erloese_inland_innergemeinschaftlich']; }else{ if($umsatzsteuer === 'ermaessigt') { $tmperloes = $kategorie['steuer_erloese_inland_euermaessigt']; }else{ $tmperloes = $kategorie['steuer_erloese_inland_eunormal']; } } } break; case 2: if($aufwendung) { $tmperloes = $kategorie['steuer_aufwendung_inland_import']; }else{ $tmperloes = $kategorie['steuer_erloese_inland_export']; } break; case 3: if($aufwendung) { $tmperloes = $kategorie['steuer_aufwendung_inland_nichtsteuerbar']; }else{ $tmperloes = $kategorie['steuer_erloese_inland_nichtsteuerbar']; } break; default: if($aufwendung) { if($umsatzsteuer === 'ermaessigt') { $tmperloes = $kategorie['steuer_aufwendung_inland_ermaessigt']; }elseif($umsatzsteuer == 'befreit'){ $tmperloes = $kategorie['steuer_aufwendung_inland_nichtsteuerbar']; }else{ $tmperloes = $kategorie['steuer_aufwendung_inland_normal']; } }else{ if($umsatzsteuer === 'ermaessigt') { $tmperloes = $kategorie['steuer_erloese_inland_ermaessigt']; }elseif($umsatzsteuer === 'befreit'){ $tmperloes = $kategorie['steuer_erloese_inland_nichtsteuerbar']; }else{ $tmperloes = $kategorie['steuer_erloese_inland_normal']; } } break; } } if(!$tmperloes && !empty($projectRow)) { switch($ust_befreit) { case 1: if($aufwendung) { if(trim((String)$ustid) !== '') { $tmperloes = $projectRow['steuer_aufwendung_inland_euermaessigt']; }else{ if($umsatzsteuer === 'ermaessigt') { $tmperloes = $projectRow['steuer_aufwendung_inland_euermaessigt']; }else{ $tmperloes = $projectRow['steuer_aufwendung_inland_eunormal']; } } }else{ if(trim((String)$ustid) !== '') { $tmperloes = $projectRow['steuer_erloese_inland_innergemeinschaftlich']; }else{ if($umsatzsteuer === 'ermaessigt') { $tmperloes = $projectRow['steuer_erloese_inland_euermaessigt']; }else{ $tmperloes = $projectRow['steuer_erloese_inland_eunormal']; } } } break; case 2: if($aufwendung) { $tmperloes = $projectRow['steuer_aufwendung_inland_import']; }else{ $tmperloes = $projectRow['steuer_erloese_inland_export']; } break; case 3: if($aufwendung) { $tmperloes = $projectRow['steuer_aufwendung_inland_nichtsteuerbar']; }else{ $tmperloes = $projectRow['steuer_erloese_inland_nichtsteuerbar']; } break; default: if($aufwendung) { if($umsatzsteuer === 'ermaessigt') { $tmperloes = $projectRow['steuer_aufwendung_inland_ermaessigt']; }elseif($umsatzsteuer === 'befreit'){ $tmperloes = $projectRow['steuer_aufwendung_inland_nichtsteuerbar']; }else{ $tmperloes = $projectRow['steuer_aufwendung_inland_normal']; } }else{ if($umsatzsteuer === 'ermaessigt') { $tmperloes = $projectRow['steuer_erloese_inland_ermaessigt']; }elseif($umsatzsteuer === 'befreit'){ $tmperloes = $projectRow['steuer_erloese_inland_nichtsteuerbar']; }else{ $tmperloes = $projectRow['steuer_erloese_inland_normal']; } } break; } } } /** * @param string $typ * @param int $posid * @param null|string $tmpsteuersatz * @param null|string $tmpsteuertext * @param null|string $erloes */ function GetSteuerPosition($typ, $posid,&$tmpsteuersatz = null, &$tmpsteuertext = null, &$erloes = null) { if($posid <= 0 || empty($typ)) { return; } $postyp = $typ.'_position'; $posRow = $this->app->DB->SelectRow( sprintf( "SELECT * FROM `%s` WHERE id = %d LIMIT 1", $postyp, (int)$posid ) ); if(empty($posRow['artikel'])) { return; } $projekt = (int)$this->app->DB->Select( sprintf( 'SELECT projekt FROM `%s` WHERE id = %d', $typ, $posRow[$typ] ) ); $artikel = $posRow['artikel']; $tmpsteuersatz = $posRow['steuersatz']; if($tmpsteuersatz === '') { $tmpsteuersatz = null; } $typid = $posRow[$typ]; if($tmpsteuersatz < 0 || $tmpsteuersatz === null) { if($posRow['umsatzsteuer'] === 'ermaessigt') { $tmpsteuersatz = $this->GetSteuersatzErmaessigt(false,$typid,$typ); }elseif($posRow['umsatzsteuer'] === 'befreit') { $tmpsteuersatz = 0; }else{ $tmpsteuersatz = $this->GetSteuersatzNormal(false,$typid,$typ); } } $ust_befreit = $this->app->DB->Select("SELECT ust_befreit FROM $typ WHERE id = '$typid' LIMIT 1"); $ustid = $this->app->DB->Select("SELECT ustid FROM $typ WHERE id = '$typid' LIMIT 1"); $aufwendung = false; switch($typ) { case 'bestellung': case 'anfrage': case 'verbindlichkeit': $aufwendung = true; break; } $this->GetArtikelSteuer($artikel, $ust_befreit, $aufwendung, $tmpsteuersatz, $tmpsteuertext, $erloes, $posRow['umsatzsteuer'], $ustid, $projekt); $this->getErloesFirmendaten($artikel, $ust_befreit, $aufwendung, $tmpsteuersatzFD, $tmpsteuertextFD, $tmperloesFD, $posRow['umsatzsteuer'], $ustid, $projekt); if (!$tmpsteuersatz) { $tmpsteuersatz = $tmpsteuersatzFD; } if (!$tmpsteuertext) { $tmpsteuertext = $tmpsteuertextFD; } if (!$erloes) { $erloes = $tmperloesFD; } } function PortoBerechnen($adresse,$gesamtsumme,$portoartikel, &$realpreis = false) { // schaue ob Kunde eine Regel hat $checkportofrei = $this->app->DB->Select("SELECT portofrei_aktiv FROM adresse WHERE id='".$adresse."' LIMIT 1"); if($checkportofrei=="1") { $checkportofreiab = $this->app->DB->Select("SELECT portofreiab FROM adresse WHERE id='".$adresse."' LIMIT 1"); if($gesamtsumme >= $checkportofreiab) { $realpreis = true; return 0; } else { // wenn kundenpreis vorhanden dann den holen sonst verband $tmppreis = $this->GetVerkaufspreisKunde($portoartikel,1,$adresse); if($tmppreis > 0) { $realpreis = true; return $tmppreis; } else { $returnwaehrung = null; $ret = $this->GetVerkaufspreis($portoartikel,1,$adresse,'EUR',$returnwaehrung); if($ret || $returnwaehrung)$realpreis = true; return $ret; } } } else { $gruppenarray = $this->GetGruppen($adresse); for($gi=0;$gi<(!empty($gruppenarray)?count($gruppenarray):0);$gi++) { $sql_erweiterung .= " id='".$gruppenarray[$gi]."' "; if($gi<(!empty($gruppenarray)?count($gruppenarray):0)-1) $sql_erweiterung .= " OR "; } $checkgruppeportofrei = $this->app->DB->Select("SELECT id FROM gruppen WHERE ($sql_erweiterung) AND portofrei_aktiv='1' ORDER BY portofreiab LIMIT 1"); if($checkgruppeportofrei>0) { $checkgruppeportofreiab = $this->app->DB->Select("SELECT portofreiab FROM gruppen WHERE id='".$checkgruppeportofrei."' LIMIT 1"); if($gesamtsumme >= $checkgruppeportofreiab) { $realpreis = true; return 0; } else { // hole kunden preis // wenn nicht vorhanden dann Standardpreis $tmppreis = $this->GetVerkaufspreisKunde($portoartikel,1,$adresse); if($tmppreis > 0) { $realpreis = true; return $tmppreis; } else { $returnwaehrung = null; $ret = $this->GetVerkaufspreis($portoartikel,1,$adresse,'EUR',$returnwaehrung); if($ret || $returnwaehrung)$realpreis = true; return $ret; } //return $this->GetVerkaufspreis($portoartikel,1,$adresse); } } // oder gruppe hat einen versandpreis? // billigsten versandpreis bei dem betrag } // sollte nicht passieren $returnwaehrung = null; $ret = $this->GetVerkaufspreis($portoartikel,1,$adresse,'EUR',$returnwaehrung); if($ret || $returnwaehrung)$realpreis = true; return $ret; } function ANABREGSNeuberechnenGesamtsummeOhnePortoUndKeinRabatt($id,$art) { //inkl. kein rabatt erlaubt if($art === 'bestellung') { return $this->app->DB->Select( sprintf( "SELECT IFNULL(SUM(tp.menge*tp.preis),0) FROM bestellung_position tp LEFT JOIN artikel a ON a.id=tp.artikel WHERE a.porto!='1' AND (a.rabatt!='1' OR a.rabatt IS NULL) AND (a.keinrabatterlaubt!='1' OR a.keinrabatterlaubt IS NULL) AND tp.bestellung=%d", (int)$id ) ); } return $this->app->DB->Select("SELECT SUM(tp.menge*(tp.preis-(tp.preis/100*tp.rabatt))) FROM ".$art."_position tp LEFT JOIN artikel a ON a.id=tp.artikel WHERE a.porto!='1' AND (a.rabatt!='1' OR a.rabatt IS NULL) AND (a.keinrabatterlaubt!='1' OR a.keinrabatterlaubt IS NULL) AND tp.".$art."='$id'"); } function BEGesamtsummeOhnePorto($id,$art) { //inkl. kein rabatt erlaubt $summeNetto = $this->app->DB->Select("SELECT SUM(tp.menge*tp.preis) FROM ".$art."_position tp LEFT JOIN artikel a ON a.id=tp.artikel WHERE a.porto!='1' AND tp.".$art."='$id'"); return $summeNetto; } function ANABREGSNeuberechnenGesamtsummeOhnePorto($id,$art) { //inkl. kein rabatt erlaubt if($art === 'bestellung') { return $this->app->DB->Select( sprintf( 'SELECT IFNULL(SUM(tp.menge*tp.preis),0) FROM `%s` AS tp LEFT JOIN artikel a ON a.id=tp.artikel WHERE a.porto!=1 AND (a.rabatt!=1 OR a.rabatt IS NULL) AND tp.`%s` = %d ', $art.'_position',$art,$id ) ); } $summeNetto = $this->app->DB->Select("SELECT SUM(tp.menge*(tp.preis-(tp.preis/100*tp.rabatt))) FROM ".$art."_position tp LEFT JOIN artikel a ON a.id=tp.artikel WHERE a.porto!='1' AND (a.rabatt!='1' OR a.rabatt IS NULL) AND tp.".$art."='$id'"); return $summeNetto; } function ANABREGSNeuberechnenGesamtsumme($id,$art,$return_netto=false) { if(empty($id) || empty($art)) { if($return_netto) { return 0; } return; } $docArr = $this->app->DB->SelectRow(sprintf('SELECT * FROM `%s` WHERE id = %d LIMIT 1', $art, $id)); if(empty($docArr)) { if($return_netto) { return 0; } return; } $projekt = $docArr['projekt']; $positionenkaufmaenischrunden = $this->app->erp->Projektdaten($projekt,"preisberechnung"); if(!$positionenkaufmaenischrunden) { $viernachkommastellen_belege = $this->app->erp->Firmendaten('viernachkommastellen_belege'); $sqlvor = ''; $sqlnach = ''; $sqlvor2 = ''; $sqlnach2 = ''; if($positionenkaufmaenischrunden) { $sqlvor = 'round('; $sqlnach = ',2)'; } if($positionenkaufmaenischrunden == 3) { $sqlvor2 = 'round('; $sqlnach2 = ',2)'; } if($art==='angebot') { $summeV = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*".$sqlvor2."(preis-(preis/100*rabatt))".$sqlnach2.$sqlnach.") FROM ".$art."_position ap WHERE umsatzsteuer!='ermaessigt' AND umsatzsteuer!='befreit' AND ".$art."='$id' AND optional!=1 AND (isnull(steuersatz) OR steuersatz < 0) AND (explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1 LIMIT 1),0))"); if($this->app->DB->error()) $summeV = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*".$sqlvor2."(preis-(preis/100*rabatt))".$sqlnach2.$sqlnach.") FROM ".$art."_position ap WHERE umsatzsteuer!='ermaessigt' AND umsatzsteuer!='befreit' AND ".$art."='$id' AND optional!=1 AND (explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1 LIMIT 1),0))"); $summeR = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*".$sqlvor2."(preis-(preis/100*rabatt))".$sqlnach2.$sqlnach.") FROM ".$art."_position ap WHERE umsatzsteuer='ermaessigt' AND ".$art."='$id' AND optional!=1 AND (isnull(steuersatz) OR steuersatz < 0) AND (explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1 LIMIT 1),0))"); if($this->app->DB->error()) $summeR = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*".$sqlvor2."(preis-(preis/100*rabatt))".$sqlnach2.$sqlnach.") FROM ".$art."_position ap WHERE umsatzsteuer='ermaessigt' AND ".$art."='$id' AND optional!=1 AND (explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1 LIMIT 1),0))"); if($positionenkaufmaenischrunden != 1 && $positionenkaufmaenischrunden != 3) { $summeS = (float)$this->app->DB->Select("SELECT SUM(".$sqlvor."menge*".$sqlvor2."(preis-(preis/100*rabatt))".$sqlnach2.$sqlnach." * if(umsatzsteuer != 'befreit',steuersatz,if(steuersatz < 0 OR isnull(steuersatz),0,steuersatz))/100) FROM ".$art."_position ap WHERE ".$art."='$id' AND optional!=1 AND ((steuersatz >= 0) and not isnull(steuersatz) OR umsatzsteuer='befreit') AND (explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1 LIMIT 1),0))"); }else{ $summeS = (float)$this->app->DB->Select("SELECT ifnull(SUM(".$sqlvor." s.pos * s.steuer".$sqlnach."),0) FROM ( SELECT SUM(menge*(preis-(preis/100*rabatt))) as pos, if(umsatzsteuer != 'befreit',steuersatz,if(steuersatz < 0 OR isnull(steuersatz),0,steuersatz))/100 as steuer FROM ".$art."_position WHERE $art = '$id' AND steuersatz >= 0 AND optional!=1 GROUP BY if(umsatzsteuer != 'befreit',steuersatz,if(steuersatz < 0 OR isnull(steuersatz),0,steuersatz))/100 ) s"); } $summeNetto = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*".$sqlvor2."(preis-(preis/100*rabatt))".$sqlnach2.$sqlnach.") FROM ".$art."_position ap WHERE ".$art."='$id' AND optional!=1 AND (explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1 LIMIT 1),0))"); } elseif($art === 'bestellung') { $summeV = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*".$sqlvor2."(preis)".$sqlnach2.$sqlnach.") FROM ".$art."_position WHERE umsatzsteuer!='ermaessigt' AND umsatzsteuer!='befreit' AND ".$art."='$id' AND (isnull(steuersatz) OR steuersatz < 0)"); if($this->app->DB->error())$summeV = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*".$sqlvor2."(preis)".$sqlnach2.$sqlnach.") FROM ".$art."_position WHERE umsatzsteuer!='ermaessigt' AND ".$art."='$id'"); $summeR = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*".$sqlvor2."(preis)".$sqlnach2.$sqlnach.") FROM ".$art."_position WHERE umsatzsteuer='ermaessigt' AND ".$art."='$id' AND (isnull(steuersatz) OR steuersatz < 0)"); if($this->app->DB->error())$summeR = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*".$sqlvor2."(preis)".$sqlnach2.$sqlnach.") FROM ".$art."_position WHERE umsatzsteuer='ermaessigt' AND ".$art."='$id'"); if($positionenkaufmaenischrunden != 1 && $positionenkaufmaenischrunden != 3) { $summeS = (float)$this->app->DB->Select("SELECT SUM(".$sqlvor."menge*".$sqlvor2."(preis)".$sqlnach2.$sqlnach." * if(umsatzsteuer != 'befreit',steuersatz,if(steuersatz < 0 OR isnull(steuersatz),0,steuersatz))/100) FROM ".$art."_position WHERE ".$art."='$id' AND ((steuersatz >= 0) and not isnull(steuersatz) OR umsatzsteuer='befreit')"); }else{ $summeS = (float)$this->app->DB->Select("SELECT ifnull(SUM(".$sqlvor." s.pos * s.steuer".$sqlnach."),0) FROM ( SELECT SUM(menge*(preis)) as pos, if(umsatzsteuer != 'befreit',steuersatz,if(steuersatz < 0 OR isnull(steuersatz),0,steuersatz))/100 as steuer FROM ".$art."_position WHERE $art = '$id' AND steuersatz >= 0 GROUP BY if(umsatzsteuer != 'befreit',steuersatz,if(steuersatz < 0 OR isnull(steuersatz),0,steuersatz))/100 ) s"); } $summeNetto = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*".$sqlvor2."(preis)".$sqlnach2.$sqlnach.") FROM ".$art."_position WHERE ".$art."='$id'"); } else { $summeV = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*".$sqlvor2."(preis-(preis/100*rabatt))".$sqlnach2.$sqlnach.") FROM ".$art."_position WHERE umsatzsteuer!='ermaessigt' AND umsatzsteuer!='befreit' AND ".$art."='$id' AND (isnull(steuersatz) OR steuersatz < 0)"); if($this->app->DB->error())$summeV = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*".$sqlvor2."(preis-(preis/100*rabatt))".$sqlnach2.$sqlnach.") FROM ".$art."_position WHERE umsatzsteuer!='ermaessigt' AND ".$art."='$id'"); $summeR = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*".$sqlvor2."(preis-(preis/100*rabatt))".$sqlnach2.$sqlnach.") FROM ".$art."_position WHERE umsatzsteuer='ermaessigt' AND ".$art."='$id' AND (isnull(steuersatz) OR steuersatz < 0)"); if($this->app->DB->error())$summeR = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*".$sqlvor2."(preis-(preis/100*rabatt))".$sqlnach2.$sqlnach.") FROM ".$art."_position WHERE umsatzsteuer='ermaessigt' AND ".$art."='$id'"); if($positionenkaufmaenischrunden != 1 && $positionenkaufmaenischrunden != 3) { $summeS = (float)$this->app->DB->Select("SELECT SUM(".$sqlvor."menge*".$sqlvor2."(preis-(preis/100*rabatt))".$sqlnach2.$sqlnach." * if(umsatzsteuer != 'befreit',steuersatz,if(steuersatz < 0 OR isnull(steuersatz),0,steuersatz))/100) FROM ".$art."_position WHERE ".$art."='$id' AND ((steuersatz >= 0) and not isnull(steuersatz) OR umsatzsteuer='befreit')"); }else{ $summeS = (float)$this->app->DB->Select("SELECT ifnull(SUM(".$sqlvor." s.pos * s.steuer".$sqlnach."),0) FROM ( SELECT SUM(menge*(preis-(preis/100*rabatt))) as pos, if(umsatzsteuer != 'befreit',steuersatz,if(steuersatz < 0 OR isnull(steuersatz),0,steuersatz))/100 as steuer FROM ".$art."_position WHERE $art = '$id' AND steuersatz >= 0 GROUP BY if(umsatzsteuer != 'befreit',steuersatz,if(steuersatz < 0 OR isnull(steuersatz),0,steuersatz))/100 ) s"); } $summeNetto = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*".$sqlvor2."(preis-(preis/100*rabatt))".$sqlnach2.$sqlnach.") FROM ".$art."_position WHERE ".$art."='$id'"); } $ust_befreit = $docArr['ust_befreit'];// $this->app->DB->Select("SELECT ust_befreit FROM $art WHERE id='$id' LIMIT 1"); $ustid = $docArr['ustid'];// $this->app->DB->Select("SELECT ustid FROM $art WHERE id='$id' LIMIT 1"); //UST ID CHECK if($ust_befreit==0 || ($ust_befreit==1 && $ustid=="")) { if($positionenkaufmaenischrunden == 1 || $positionenkaufmaenischrunden == 3) { $betrag = $summeNetto + round($summeV*$this->GetSteuersatzNormal(true,$id,$art)-$summeV,2)+ round($summeR*$this->GetSteuersatzErmaessigt(true,$id,$art)-$summeR,2)+$summeS; }else{ $betrag = $summeNetto + ($summeV*$this->GetSteuersatzNormal(true,$id,$art)-$summeV)+ ($summeR*$this->GetSteuersatzErmaessigt(true,$id,$art)-$summeR)+$summeS; } } else { $betrag = $summeNetto; } }else{ $betrag = $this->app->erp->calcBelegBrutto($art, $id); } if($return_netto) return $betrag; $extsoll = 0; if($art !== 'bestellung' && $art !== 'proformarechnung'){ $extsoll = (float)$docArr['extsoll'];//$this->app->DB->Select("SELECT extsoll FROM $art WHERE id = '$id' LIMIT 1"); } if($extsoll == 0) { if($art==='rechnung' || $art==='gutschrift' || $art==='proformarechnung'){ if($betrag != $docArr['soll']){ $this->app->DB->Update("UPDATE $art SET soll='$betrag' WHERE id='$id' LIMIT 1"); } } else{ if($betrag != $docArr['gesamtsumme']){ $this->app->DB->Update("UPDATE $art SET gesamtsumme='$betrag' WHERE id='$id' LIMIT 1"); } } } } function RechnungZwischensummeSteuersaetzeBrutto2($id,$art="ermaessigt") { $projekt = $this->app->DB->Select("SELECT projekt FROM rechnung WHERE id = '$id' LIMIT 1"); $positionenkaufmaenischrunden = $this->app->erp->Projektdaten($projekt,"preisberechnung"); $viernachkommastellen_belege = $this->app->erp->Firmendaten('viernachkommastellen_belege'); $sqlvor = ''; $sqlnach = ''; if($art!="ermaessigt") $summe = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*(preis-(preis/100*rabatt))".$sqlnach.") FROM rechnung_position WHERE (umsatzsteuer='normal' OR umsatzsteuer='standard' OR umsatzsteuer='') AND rechnung='$id' AND (isnull(steuersatz) OR steuersatz < 0) AND (isnull(erloese) OR erloese = '') "); else $summe = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*(preis-(preis/100*rabatt))".$sqlnach.") FROM rechnung_position WHERE umsatzsteuer='$art' AND rechnung='$id' AND (isnull(steuersatz) OR steuersatz < 0) AND isnull(erloese)"); if($art=="ermaessigt") $ermaessigt_summe = $summe*$this->GetSteuersatzErmaessigt(true,$id,"rechnung"); else $ermaessigt_summe = $summe*$this->GetSteuersatzNormal(true,$id,"rechnung"); return $positionenkaufmaenischrunden == 1?round($ermaessigt_summe,2):$ermaessigt_summe; } function RechungZwischensummeSpezialSteuer($id, $gruppierenpositionen = false, $gruppierenKostenstelle = false) { /** @var Buchhaltungexport $buchhaltungexport */ $buchhaltungexport = $this->app->loadModule('buchhaltungexport', false); if($buchhaltungexport !== null && method_exists($buchhaltungexport, 'RechungZwischensummeSpezialSteuer')) { return $buchhaltungexport->RechungZwischensummeSpezialSteuer($id, $gruppierenpositionen, $gruppierenKostenstelle); } if($id > 0) { $rechnungarr = $this->app->DB->SelectRow( sprintf( 'SELECT `id`, `projekt`, `ust_befreit`, `ustid`, `kostenstelle`, `datum`, `steuersatz_ermaessigt`, `steuersatz_normal` FROM `rechnung` WHERE `id` = %d LIMIT 1', $id ) ); } $projekt = null; $ust_befreit = null; $ustid = null; $kostenstelle = ''; if(!empty($rechnungarr)){ $projekt = $rechnungarr['projekt']; $ust_befreit = $rechnungarr['ust_befreit']; $ustid = $rechnungarr['ustid']; $kostenstelle = $this->app->DB->real_escape_string($rechnungarr['kostenstelle']); } $positionenkaufmaenischrunden = $this->app->erp->Projektdaten($projekt,'preisberechnung'); $viernachkommastellen_belege = $this->app->erp->Firmendaten('viernachkommastellen_belege'); $sqlvor = ''; $sqlnach = ''; $sqlvor2 = ''; $sqlnach2 = ''; if($positionenkaufmaenischrunden == 1){ $sqlvor = 'round('; $sqlnach = ',2)'; } if($positionenkaufmaenischrunden == 3){ $sqlvor2 = 'round('; $sqlnach2 = ',2)'; } if($gruppierenpositionen){ $arr = $this->app->DB->SelectArr( "SELECT rp.`nummer`, rp.`bezeichnung`, rp.`artikel`, rp.`steuersatz`,rp.`erloese`, ".$sqlvor."rp.menge*".$sqlvor2."(preis-(rp.preis/100*rp.rabatt))".$sqlnach2.$sqlnach." as netto, rp.menge*(rp.preis-(rp.preis/100*rp.rabatt)) as nettoungerundet, if(rp.umsatzsteuer = 'ermaessigt','ermaessigt',if(rp.umsatzsteuer = 'befreit','befreit','normal')) as usteuer , sum(rp.einkaufspreis * rp.menge) as summeeinkaufspreis, IF( IFNULL(rp.kostenstelle,'') <> '', rp.kostenstelle, IF('$kostenstelle' <> '', '$kostenstelle', art.kostenstelle) ) AS kostenstelle FROM `rechnung_position` AS rp LEFT JOIN `artikel` AS art ON rp.artikel = art.id WHERE rechnung = '$id' group by rp.`steuersatz`,rp.`erloese`, rp.`umsatzsteuer`,rp.`artikel`, rp.`id` "); }else{ $arr = $this->app->DB->SelectArr( "SELECT rp.`artikel`, rp.`steuersatz`,rp.`erloese`, SUM(" . $sqlvor . "rp.menge*" . $sqlvor2 . "(rp.preis-(rp.preis/100*rp.rabatt))" . $sqlnach2 . $sqlnach . ") as netto, SUM(rp.menge*(rp.preis-(rp.preis/100*rp.rabatt))) as nettoungerundet, if(rp.umsatzsteuer = 'ermaessigt','ermaessigt',if(rp.umsatzsteuer = 'befreit','befreit','normal')) as usteuer, sum(rp.einkaufspreis * rp.menge) as summeeinkaufspreis, IF( IFNULL(rp.kostenstelle,'') <> '', rp.kostenstelle, IF('$kostenstelle' <> '', '$kostenstelle', art.kostenstelle) ) AS kostenstelle FROM `rechnung_position` AS rp LEFT JOIN artikel AS art ON rp.artikel = art.id WHERE rp.rechnung = '$id' group by rp.`steuersatz`,rp.`erloese`, rp.`umsatzsteuer`,rp.`artikel` " ); } if($arr) { $steuersatzermaessigt = $this->GetSteuersatzErmaessigt(true,$id,'rechnung'); $steuersatznormal = $this->GetSteuersatzNormal(true,$id,'rechnung'); foreach($arr as $k => $v) { $_ust_befreit = $ust_befreit; if($v['steuersatz'] !== null && $v['steuersatz'] == 0 && $ust_befreit == 0) { $ust_befreit = 3; } $erloese = $this->Gegenkonto($ust_befreit, $ustid, 'rechnung', $id); $this->GetArtikelSteuer( $v['artikel'], $ust_befreit,0, $dummysteuersatz, $tmpsteuertext, $tmperloes,$v['usteuer'], $ustid, $projekt ); if(!$this->RechnungMitUmsatzeuer($id)){ $v['steuersatz'] = 0; } if($v['steuersatz'] === null || $v['steuersatz'] < 0) { if($v['usteuer'] === 'ermaessigt') { $arr[$k]['steuersatz'] = $steuersatzermaessigt; }elseif($v['usteuer'] === 'befreit'){ $arr[$k]['steuersatz'] = 1; }else{ $arr[$k]['steuersatz'] = $steuersatznormal; } }else { $arr[$k]['steuersatz'] = 1+$v['steuersatz']/100; } if($v['erloese'] === null || $v['erloese'] === '') { $arr[$k]['erloese'] = $erloese; if($tmperloes) { $arr[$k]['erloese'] = $tmperloes; }else{ if($v['usteuer'] === 'befreit' && $ust_befreit == 0) { $arr[$k]['erloese'] = $this->Firmendaten("steuer_erloese_inland_nichtsteuerbar"); } elseif($v['usteuer'] === 'ermaessigt' && $ust_befreit == 0) { $arr[$k]['erloese'] = $this->Firmendaten("steuer_erloese_inland_ermaessigt"); }elseif($v['usteuer'] === 'ermaessigt' && $ust_befreit == 1 && (String)$ustid === '') { $arr[$k]['erloese'] = $this->Firmendaten("steuer_erloese_inland_euermaessigt"); }elseif($ust_befreit == 1 && (String)$ustid !== ''){ $arr[$k]['erloese'] = $this->Firmendaten("steuer_erloese_inland_innergemeinschaftlich"); }elseif($v['usteuer'] !== 'ermaessigt' && $v['usteuer'] !== 'befreit' && $ust_befreit == 1 && (String)$ustid === '') { $arr[$k]['erloese'] = $this->Firmendaten("steuer_erloese_inland_eunormal"); } } } $arr[$k]['summe'] = $v['nettoungerundet'] * $arr[$k]['steuersatz']; if($gruppierenpositionen) { $arr[$k]['summe'] = round($arr[$k]['summe'], 2); } $ust_befreit = $_ust_befreit; } } if($gruppierenpositionen) { return $arr; } return $this->SteuerZusammenfassen($arr, $gruppierenKostenstelle); } function steuerAusBelegPDF($belegtyp, $id){ $arr = $this->steuerAusBelegArray($belegtyp, $id); $summe = 0; $gesamtsumme = 0; $summen = null; if($arr) { foreach($arr as $k => $v) { $summe += $v['netto']; $gesamtsumme += $v['brutto']; if(!isset($summen[$v['steuersatz']]))$summen[$v['steuersatz']] = 0; $summen[$v['steuersatz']] += $v['brutto'] - $v['netto']; } } return array($summe, $gesamtsumme, $summen); } function calcBelegBrutto($belegtyp, $id) { $arr = $this->steuerAusBelegArray($belegtyp, $id); $summe = 0; $gesamtsumme = 0; $summen = null; if($arr) { foreach($arr as $k => $v) { $gesamtsumme += $v['brutto']; } } return $gesamtsumme; } /** * @param string $belegtyp * @param int $id * @param bool $gruppierenpositionen * @param bool $ohneporto * @param bool $mitErloes nur mit gruppierenpositionen * * @return array|null */ public function steuerAusBelegArray($belegtyp, $id, $gruppierenpositionen = false, $ohneporto = false, $mitErloes = false) { $projekt = $this->app->DB->Select( sprintf( 'SELECT `projekt` FROM `%s` WHERE id = %d LIMIT 1', $belegtyp, $id ) ); $positionenkaufmaenischrunden = $this->app->erp->Projektdaten($projekt,'preisberechnung'); $steuerfrei = false; $funktionsname = ucfirst($belegtyp).'MitUmsatzeuer'; if(method_exists($this, $funktionsname)) { $steuerfrei = !$this->$funktionsname($id); } $steuersatzermaessigt = $this->GetSteuersatzErmaessigt(false,$id,$belegtyp); $steuersatznormal = $this->GetSteuersatzNormal(false,$id,$belegtyp); $join = ''; if($ohneporto) { $join = ' INNER JOIN artikel art ON ap.artikel = art AND art.porto <> 1 '; } if($positionenkaufmaenischrunden == 2) { if($gruppierenpositionen) { if($steuerfrei){ return $this->app->DB->SelectArr( "SELECT ap.`id`,`nummer`, ap.`bezeichnung`, ap.`artikel`, 0 as steuersatz , round( ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)),2) as netto, ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)) as nettoungerundet, if(umsatzsteuer = 'ermaessigt','ermaessigt',if(umsatzsteuer = 'befreit','befreit','normal')) as usteuer, round( ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)),2) as brutto " . ($mitErloes ? ' ,ap.erloes' : '') . " FROM `" . $belegtyp . "_position` ap $join WHERE ap.$belegtyp = '$id' " . ($belegtyp === 'angebot' ? " AND ap.optional!=1 AND (ap.explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1 LIMIT 1),0))" : '') ); } return $this->app->DB->SelectArr( "SELECT ap.`id`,`nummer`, ap.`bezeichnung`, ap.`artikel`, round(if(ifnull(ap.`steuersatz`,-1) < 0, if(umsatzsteuer = 'ermaessigt',$steuersatzermaessigt,if(umsatzsteuer = 'befreit',0,$steuersatznormal)) ,ap.`steuersatz`),2) as steuersatz , round( ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)),2) as netto, ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)) as nettoungerundet, if(umsatzsteuer = 'ermaessigt','ermaessigt',if(umsatzsteuer = 'befreit','befreit','normal')) as usteuer, round( ap.menge*(ap.preis-(ap.preis/100*ap.rabatt))*(1+ round(if(ifnull(ap.`steuersatz`,-1) < 0, if(umsatzsteuer = 'ermaessigt',$steuersatzermaessigt,if(umsatzsteuer = 'befreit',0,$steuersatznormal)) ,ap.`steuersatz`),2)/ 100),2) as brutto " . ($mitErloes ? ' ,ap.erloes' : '') . " FROM `".$belegtyp."_position` ap $join WHERE ap.$belegtyp = '$id' " .($belegtyp==='angebot' ?" AND ap.optional!=1 AND (ap.explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1 LIMIT 1),0))" :'' ) ); } if($steuerfrei) { return $this->app->DB->SelectArr( "SELECT ap.`id`,`nummer`, ap.`bezeichnung`, ap.`artikel`, 0 as steuersatz , round(sum(round( ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)),2)),2) as netto, sum(ap.menge*(ap.preis-(ap.preis/100*ap.rabatt))) as nettoungerundet, if(umsatzsteuer = 'ermaessigt','ermaessigt',if(umsatzsteuer = 'befreit','befreit','normal')) as usteuer, round( sum(round(ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)))),2) as brutto FROM `" . $belegtyp . "_position` ap $join WHERE ap.$belegtyp = '$id' " . ($belegtyp === 'angebot' ? " AND ap.optional!=1 AND (ap.explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1 LIMIT 1),0))" : '') . " group by `steuersatz`, `usteuer` HAVING round(sum(round( ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)),2)),2) <> 0" ); } return $this->app->DB->SelectArr( "SELECT ap.`id`,`nummer`, ap.`bezeichnung`, ap.`artikel`, round(if(ifnull(ap.`steuersatz`,-1) < 0, if(umsatzsteuer = 'ermaessigt',$steuersatzermaessigt,if(umsatzsteuer = 'befreit',0,$steuersatznormal)) ,ap.`steuersatz`),2) as steuersatz , round(sum(round( ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)),2)),2) as netto, sum(ap.menge*(ap.preis-(ap.preis/100*ap.rabatt))) as nettoungerundet, if(umsatzsteuer = 'ermaessigt','ermaessigt',if(umsatzsteuer = 'befreit','befreit','normal')) as usteuer, round( sum(round(ap.menge*(ap.preis-(ap.preis/100*ap.rabatt))*(1+ round(if(ifnull(ap.`steuersatz`,-1) < 0, if(umsatzsteuer = 'ermaessigt',$steuersatzermaessigt,if(umsatzsteuer = 'befreit',0,$steuersatznormal)) ,ap.`steuersatz`),2)/ 100),2)),2) as brutto FROM `".$belegtyp."_position` ap $join WHERE ap.$belegtyp = '$id' " .($belegtyp==='angebot' ?" AND ap.optional!=1 AND (ap.explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1 LIMIT 1),0))" :'' )." group by round(if(ifnull(ap.`steuersatz`,-1) < 0, if(umsatzsteuer = 'ermaessigt',$steuersatzermaessigt,if(umsatzsteuer = 'befreit',0,$steuersatznormal)) ,ap.`steuersatz`),2), `usteuer` HAVING round(sum(round( ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)),2)),2) <> 0" ); } if($positionenkaufmaenischrunden == 1 || $positionenkaufmaenischrunden == 3) { $mengevor = ''; $mengenach = ''; if($positionenkaufmaenischrunden == 3){ $mengevor = 'ROUND('; $mengenach = ',2)'; } if($gruppierenpositionen) { if($steuerfrei){ return $this->app->DB->SelectArr( "SELECT ap.`id`,`nummer`, ap.`bezeichnung`, ap.`artikel`, 0 as steuersatz , round( ap.menge*" . $mengevor . "(ap.preis-(ap.preis/100*ap.rabatt))" . $mengenach . ",2) as netto, ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)) as nettoungerundet, if(umsatzsteuer = 'ermaessigt','ermaessigt',if(umsatzsteuer = 'befreit','befreit','normal')) as usteuer, round( ap.menge*" . $mengevor . "(ap.preis-(ap.preis/100*ap.rabatt))" . $mengenach . ",2) as brutto " . ($mitErloes ? ' ,ap.erloes' : '') . " FROM `" . $belegtyp . "_position` ap $join WHERE ap.$belegtyp = '$id' " . ($belegtyp === 'angebot' ? " AND ap.optional!=1 AND (ap.explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1 LIMIT 1),0))" : '') ); } return $this->app->DB->SelectArr( "SELECT ap.`id`,`nummer`, ap.`bezeichnung`, ap.`artikel`, round(if(ifnull(ap.`steuersatz`,-1) < 0, if(umsatzsteuer = 'ermaessigt',$steuersatzermaessigt,if(umsatzsteuer = 'befreit',0,$steuersatznormal)) ,ap.`steuersatz`),2) as steuersatz , round( ap.menge*".$mengevor."(ap.preis-(ap.preis/100*ap.rabatt))".$mengenach.",2) as netto, ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)) as nettoungerundet, if(umsatzsteuer = 'ermaessigt','ermaessigt',if(umsatzsteuer = 'befreit','befreit','normal')) as usteuer, round( ap.menge*".$mengevor."(ap.preis-(ap.preis/100*ap.rabatt))* (1+ round( if(ifnull(ap.`steuersatz`,-1) < 0, if(umsatzsteuer = 'ermaessigt',$steuersatzermaessigt, if(umsatzsteuer = 'befreit',0,$steuersatznormal) ) ,ap.`steuersatz` )".$mengenach.",2)/ 100),2) as brutto " . ($mitErloes ? ' ,ap.erloes' : '') . " FROM `".$belegtyp."_position` ap $join WHERE ap.$belegtyp = '$id' " .($belegtyp==='angebot' ?" AND ap.optional!=1 AND (ap.explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1 LIMIT 1),0))" :'') ); } if($steuerfrei){ $sql = "SELECT ap.`id`,`nummer`, ap.`bezeichnung`, ap.`artikel`, 0 as steuersatz , round( sum( round( ap.menge* " . $mengevor . " (ap.preis-(ap.preis/100*ap.rabatt)) " . $mengenach . " ,2 ) ) ,2 ) as netto, sum( ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)) ) as nettoungerundet, if(umsatzsteuer = 'ermaessigt','ermaessigt',if(umsatzsteuer = 'befreit','befreit','normal')) as usteuer, round( sum( round( ap.menge*" . $mengevor . " (ap.preis-(ap.preis/100*ap.rabatt)) " . $mengenach . " ,2 ) ) ,2 ) as brutto FROM `".$belegtyp."_position` ap $join WHERE ap.$belegtyp = '$id' " .($belegtyp==='angebot' ?" AND ap.optional!=1 AND (ap.explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1 LIMIT 1),0))" :'')." group by `steuersatz`, `usteuer` HAVING round(sum(round( ap.menge*".$mengevor."(ap.preis-(ap.preis/100*ap.rabatt))".$mengenach.",2)),2) <> 0"; return $this->app->DB->SelectArr($sql); } if($positionenkaufmaenischrunden == 3) { return $this->app->DB->SelectArr( "SELECT ap.`id`,`nummer`, ap.`bezeichnung`, ap.`artikel`, round( if( ifnull(ap.`steuersatz`,-1) < 0, if( umsatzsteuer = 'ermaessigt', $steuersatzermaessigt, if( umsatzsteuer = 'befreit', 0, $steuersatznormal ) ) , ap.`steuersatz` ),2 ) as steuersatz , round(sum(round( ap.menge*".$mengevor."(ap.preis-(ap.preis/100*ap.rabatt))".$mengenach.",2)),2) as netto, sum(ap.menge*(ap.preis-(ap.preis/100*ap.rabatt))) as nettoungerundet, if(umsatzsteuer = 'ermaessigt','ermaessigt',if(umsatzsteuer = 'befreit','befreit','normal')) as usteuer, round(sum(round( ap.menge*".$mengevor."(ap.preis-(ap.preis/100*ap.rabatt))".$mengenach.",2)),2)+ round( sum(round( ap.menge*".$mengevor."(ap.preis-(ap.preis/100*ap.rabatt))".$mengenach.",2)) * round( if( ifnull(ap.`steuersatz`,-1) < 0, if( umsatzsteuer = 'ermaessigt', $steuersatzermaessigt, if( umsatzsteuer = 'befreit', 0, $steuersatznormal ) ) , ap.`steuersatz` ),2 )/100 ,2 ) as brutto FROM `".$belegtyp."_position` ap $join WHERE ap.$belegtyp = '$id' " .($belegtyp==='angebot' ?" AND ap.optional!=1 AND (ap.explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1 LIMIT 1),0))" :'')." group by round( if( ifnull(ap.`steuersatz`,-1) < 0, if( umsatzsteuer = 'ermaessigt', $steuersatzermaessigt, if( umsatzsteuer = 'befreit', 0, $steuersatznormal ) ) , ap.`steuersatz` ),2 ), `usteuer` HAVING round(sum(round( ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)),2)),2) <> 0" ); } return $this->app->DB->SelectArr( "SELECT ap.`id`,`nummer`, ap.`bezeichnung`, ap.`artikel`, round(if(ifnull(ap.`steuersatz`,-1) < 0, if(umsatzsteuer = 'ermaessigt',$steuersatzermaessigt,if(umsatzsteuer = 'befreit',0,$steuersatznormal)) ,ap.`steuersatz`),2) as steuersatz , round(sum(round( ap.menge*".$mengevor."(ap.preis-(ap.preis/100*ap.rabatt))".$mengenach.",2)),2) as netto, sum(ap.menge*(ap.preis-(ap.preis/100*ap.rabatt))) as nettoungerundet, if(umsatzsteuer = 'ermaessigt','ermaessigt',if(umsatzsteuer = 'befreit','befreit','normal')) as usteuer, round(sum(round( ap.menge*".$mengevor."(ap.preis-(ap.preis/100*ap.rabatt))".$mengenach.",2)),2) + round( round(sum(round( ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)),2)),2) * round(if(ifnull(ap.`steuersatz`,-1) < 0, if(umsatzsteuer = 'ermaessigt',$steuersatzermaessigt,if(umsatzsteuer = 'befreit',0,$steuersatznormal)) ,ap.`steuersatz`),2)/100 ,2) as brutto FROM `".$belegtyp."_position` ap $join WHERE ap.$belegtyp = '$id' " .($belegtyp==='angebot' ?" AND ap.optional!=1 AND (ap.explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1 LIMIT 1),0))" :'')." group by round(if(ifnull(ap.`steuersatz`,-1) < 0, if(umsatzsteuer = 'ermaessigt',$steuersatzermaessigt,if(umsatzsteuer = 'befreit',0,$steuersatznormal)) ,ap.`steuersatz`),2), `usteuer` HAVING round(sum(round( ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)),2)),2) <> 0" ); } if($gruppierenpositionen) { if($steuerfrei){ return $this->app->DB->SelectArr( "SELECT ap.`id`,`nummer`, ap.`bezeichnung`, ap.`artikel`, round(if(ifnull(ap.`steuersatz`,-1) < 0, if(umsatzsteuer = 'ermaessigt',$steuersatzermaessigt,if(umsatzsteuer = 'befreit',0,$steuersatznormal)) ,ap.`steuersatz`),2) as steuersatz , ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)) as netto, ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)) as nettoungerundet, 0 as usteuer, ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)) as brutto " . ($mitErloes ? ' ,ap.erloes' : '') . " FROM `" . $belegtyp . "_position` ap $join WHERE ap.$belegtyp = '$id' " . ($belegtyp === 'angebot' ? " AND ap.optional!=1 AND (ap.explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1 LIMIT 1),0))" : '') ); } return $this->app->DB->SelectArr( "SELECT ap.`id`,`nummer`, ap.`bezeichnung`, ap.`artikel`, round(if(ifnull(ap.`steuersatz`,-1) < 0, if(umsatzsteuer = 'ermaessigt',$steuersatzermaessigt,if(umsatzsteuer = 'befreit',0,$steuersatznormal)) ,ap.`steuersatz`),2) as steuersatz , ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)) as netto, ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)) as nettoungerundet, if(umsatzsteuer = 'ermaessigt','ermaessigt',if(umsatzsteuer = 'befreit','befreit','normal')) as usteuer, ap.menge*(ap.preis-(ap.preis/100*ap.rabatt))*(1+ round(if(ifnull(ap.`steuersatz`,-1) < 0, if(umsatzsteuer = 'ermaessigt',$steuersatzermaessigt,if(umsatzsteuer = 'befreit',0,$steuersatznormal)) ,ap.`steuersatz`),2)/ 100) as brutto " . ($mitErloes ? ' ,ap.erloes' : '') . " FROM `".$belegtyp."_position` ap $join WHERE ap.$belegtyp = '$id' " .($belegtyp==='angebot' ?" AND ap.optional!=1 AND (ap.explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1 LIMIT 1),0))" :'') ); } if($steuerfrei){ return $this->app->DB->SelectArr( "SELECT ap.`id`,`nummer`, ap.`bezeichnung`, ap.`artikel`, 0 as steuersatz , sum(ap.menge*(ap.preis-(ap.preis/100*ap.rabatt))) as netto, sum(ap.menge*(ap.preis-(ap.preis/100*ap.rabatt))) as nettoungerundet, if(umsatzsteuer = 'ermaessigt','ermaessigt',if(umsatzsteuer = 'befreit','befreit','normal')) as usteuer, sum(ap.menge*(ap.preis-(ap.preis/100*ap.rabatt))) as brutto FROM `" . $belegtyp . "_position` ap $join WHERE ap.$belegtyp = '$id' " . ($belegtyp === 'angebot' ? " AND ap.optional!=1 AND (ap.explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1 LIMIT 1),0))" : '') . " group by `steuersatz`, `usteuer` HAVING sum(ap.menge*(ap.preis-(ap.preis/100*ap.rabatt))) <> 0" ); } return $this->app->DB->SelectArr( "SELECT ap.`id`,`nummer`, ap.`bezeichnung`, ap.`artikel`, round( if( ifnull(ap.`steuersatz`,-1) < 0, if( ap.umsatzsteuer = 'ermaessigt', $steuersatzermaessigt, if(ap.umsatzsteuer = 'befreit', 0, $steuersatznormal ) ) , ap.`steuersatz` ),2) as steuersatz , sum(ap.menge*(ap.preis-(ap.preis/100*ap.rabatt))) as netto, sum(ap.menge*(ap.preis-(ap.preis/100*ap.rabatt))) as nettoungerundet, if(ap.umsatzsteuer = 'ermaessigt','ermaessigt',if(ap.umsatzsteuer = 'befreit','befreit','normal')) as usteuer, sum( ap.menge*(ap.preis-(ap.preis/100*ap.rabatt))* (1+ round( if( ifnull(ap.`steuersatz`,-1) < 0, if( ap.umsatzsteuer = 'ermaessigt', $steuersatzermaessigt, if( ap.umsatzsteuer = 'befreit', 0, $steuersatznormal ) ) , ap.`steuersatz` ),2)/ 100 ) ) as brutto FROM `".$belegtyp."_position` ap $join WHERE ap.$belegtyp = '$id' " .($belegtyp==='angebot' ?" AND ap.optional!=1 AND (ap.explodiert_parent = 0 OR 0 = ifnull((SELECT id FROM angebot_position WHERE id = ap.explodiert_parent AND berechnen_aus_teile = 1 LIMIT 1),0))" :'')." group by round( if( ifnull(ap.`steuersatz`,-1) < 0, if( ap.umsatzsteuer = 'ermaessigt', $steuersatzermaessigt, if(ap.umsatzsteuer = 'befreit', 0, $steuersatznormal ) ) , ap.`steuersatz` ),2), `usteuer` HAVING sum(ap.menge* (ap.preis-(ap.preis/100*ap.rabatt)) ) <> 0" ); } /** * @param array|null $ret * @param string $belegtyp * @param int $id * * @return array|null */ public function addErloesSteuerBeleg($ret, $belegtyp, $id) { if(empty($ret) || empty($belegtyp) || empty($id)) { return $ret; } $doc = $this->app->DB->SelectRow( sprintf( 'SELECT `ustid`, `ust_befreit`, `projekt` FROM `%s` WHERE `id` = %d', $belegtyp,$id ) ); $aufwendung = null; $steuertext = null; foreach($ret as $key => $row) { if(!empty($row['erloese']) || empty($row['artikel'])) { continue; } $steuersatz = $row['steuersatz']; $steuertext = null; $umsatzsteuerpos = $row['umsatzsteuer']; $this->GetArtikelSteuer( $row['artikel'], $doc['ust_befreit'], $aufwendung, $steuersatz, $steuertext, $row['erloese'], $umsatzsteuerpos, $doc['ustid'], $doc['projekt'] ); if(!empty($row['erloese'])) { $ret[$key]['erloese'] = $row['erloese']; continue; } $this->getErloesFirmendaten( $row['artikel'], $doc['ust_befreit'], $aufwendung, $steuersatz, $steuertext, $row['erloese'], $umsatzsteuerpos, $doc['ustid'], $doc['projekt'] ); if(!empty($row['erloese'])) { $ret[$key]['erloese'] = $row['erloese']; continue; } } return $ret; } /** * @param string $belegtyp * @param int $id * @param bool $gruppierenpositionen * @param bool $ohneporto * @param bool $mitErloes nur mit gruppierenpositionen * * @return array|null */ public function SteuerAusBeleg($belegtyp, $id, $gruppierenpositionen = false, $ohneporto = false, $mitErloes = false) { $projekt = $this->app->DB->Select( sprintf( 'SELECT `projekt` FROM `%s` WHERE `id` = %d LIMIT 1', $belegtyp, $id ) ); $positionenkaufmaenischrunden = $this->app->erp->Projektdaten($projekt,'preisberechnung'); if($positionenkaufmaenischrunden) { $ret = $this->steuerAusBelegArray($belegtyp, $id, $gruppierenpositionen, $ohneporto, $mitErloes); if($gruppierenpositionen && $mitErloes) { return $this->addErloesSteuerBeleg($ret, $belegtyp, $id); } return $ret; } $steuerfrei = false; $funktionsname = ucfirst($belegtyp).'MitUmsatzeuer'; if(method_exists($this, $funktionsname)) { $steuerfrei = !$this->$funktionsname($id); } $steuersatzermaessigt = $this->GetSteuersatzErmaessigt(false,$id,$belegtyp); $steuersatznormal = $this->GetSteuersatzNormal(false,$id,$belegtyp); $viernachkommastellen_belege = $this->app->erp->Firmendaten('viernachkommastellen_belege'); $sqlvor = ''; $sqlnach = ''; if($positionenkaufmaenischrunden == 1) { $sqlvor = 'round('; $sqlnach = ',2)'; } $sqlvor2 = ''; $sqlnach2 = ''; if($positionenkaufmaenischrunden == 3) { $sqlvor2 = 'round('; $sqlnach2 = ',2)'; } $join = ''; if($ohneporto) { $join = ' INNER JOIN artikel art ON ap.artikel = art AND art.porto <> 1 '; } if($gruppierenpositionen) { $arr = $this->app->DB->SelectArr( "SELECT ap.`id`,`nummer`, ap.`bezeichnung`, ap.`artikel`, if(ap.`steuersatz` < 0, null,ap.`steuersatz`) as ssatz , ".$sqlvor." ap.menge*".$sqlvor2."(ap.preis-(ap.preis/100*ap.rabatt))".$sqlnach2.$sqlnach." as netto, ap.menge*(ap.preis-(ap.preis/100*ap.rabatt)) as nettoungerundet, if(umsatzsteuer = 'ermaessigt','ermaessigt',if(umsatzsteuer = 'befreit','befreit','normal')) as usteuer ".($mitErloes?',ap.erloese ':'')." FROM `".$belegtyp."_position` ap $join WHERE ap.$belegtyp = '$id' GROUP BY `ssatz`,ap.`erloese`, `usteuer`,ap.`artikel`,ap.`id` " ); } else{ $arr = $this->app->DB->SelectArr( "SELECT if(ap.`steuersatz` < 0, null,ap.`steuersatz`) as ssatz , SUM(".$sqlvor."ap.menge*".$sqlvor2."(ap.preis-(ap.preis/100*ap.rabatt))".$sqlnach2.$sqlnach.") as netto, SUM(ap.menge*(ap.preis-(ap.preis/100*ap.rabatt))) as nettoungerundet, if(ap.umsatzsteuer = 'ermaessigt','ermaessigt',if(ap.umsatzsteuer = 'befreit','befreit','normal')) as usteuer FROM `".$belegtyp."_position` ap $join WHERE ap.$belegtyp = '$id' group by `ssatz`, `usteuer` " ); } $ret = null; if($arr) { if(!$gruppierenpositionen) { foreach($arr as $k => $v) { if($steuerfrei) { $satz = 0; } else{ if(is_null($v['ssatz']) || $v['ssatz'] < 0) { if($v['usteuer'] === 'ermaessigt') { $satz = $steuersatzermaessigt; } elseif($v['usteuer'] === 'befreit'){ $satz = 0; } else{ $satz = $steuersatznormal; } } else { $satz = $v['ssatz']; } } if(!isset($ret[$satz])) { $ret[$satz] = 0; } if(!isset($retgerundet[$satz])){ $retgerundet[$satz] = 0; } $ret[$satz] += $v['nettoungerundet']; $retgerundet[$satz]+= $v['netto']; } unset($arr); if($ret) { foreach($ret as $steuersatz => $summe) { $arr[] = array( 'steuersatz'=>$steuersatz, 'netto'=>$retgerundet[$steuersatz], 'brutto'=>$summe*(1+$steuersatz/100) ); } } } else{ foreach($arr as $k => $v) { if($steuerfrei) { $arr[$k]['steuersatz'] = 0; } else{ if(is_null($v['ssatz']) || $v['ssatz'] < 0) { if($v['usteuer'] === 'ermaessigt') { $arr[$k]['steuersatz'] = $steuersatzermaessigt; } elseif($v['usteuer'] === 'befreit') { $arr[$k]['steuersatz'] = 0; } else{ $arr[$k]['steuersatz'] = $steuersatznormal; } } else { $arr[$k]['steuersatz'] = $v['ssatz']; } } unset($arr[$k]['ssatz']); $arr[$k]['brutto'] = $v['nettoungerundet']*(1+$arr[$k]['steuersatz']/100); $arr[$k]['umsatzsteuer'] = $arr[$k]['usteuer']; unset($arr[$k]['usteuer']); } } } if($gruppierenpositionen && $mitErloes) { return $this->addErloesSteuerBeleg($arr, $belegtyp, $id); } return $arr; } /** * @param int $id * @param bool $gruppierenpositionen * @param bool $gruppierenkostenstelle * * @return array|null */ public function GutschriftZwischensummeSpezialSteuer($id, $gruppierenpositionen = false, $gruppierenkostenstelle = false) { /** @var Buchhaltungexport $buchhaltungexport */ $buchhaltungexport = $this->app->loadModule('buchhaltungexport', false); if($buchhaltungexport !== null && method_exists($buchhaltungexport, 'GutschriftZwischensummeSpezialSteuer')) { return $buchhaltungexport->GutschriftZwischensummeSpezialSteuer( $id, $gruppierenpositionen, $gruppierenKostenstelle ); } if($id > 0) { $gutschriftarr = $this->app->DB->SelectRow( "SELECT ust_befreit,ustid,projekt,kostenstelle FROM gutschrift WHERE id = '$id' LIMIT 1" ); } $ust_befreit = null; $ustid = null; $projekt = 0; $kostenstelle = ''; if(!empty($gutschriftarr)){ $ust_befreit = $gutschriftarr['ust_befreit']; $ustid = $gutschriftarr['ustid']; $projekt = $gutschriftarr['projekt']; $kostenstelle = $this->app->DB->real_escape_string($gutschriftarr['kostenstelle']); } $positionenkaufmaenischrunden = $this->app->erp->Projektdaten($projekt,'preisberechnung'); $viernachkommastellen_belege = $this->app->erp->Firmendaten('viernachkommastellen_belege'); $sqlvor = ''; $sqlnach = ''; if($positionenkaufmaenischrunden) { $sqlvor = 'round('; $sqlnach = ',2)'; } $sqlvor2 = ''; $sqlnach2 = ''; if($positionenkaufmaenischrunden == 3) { $sqlvor2 = 'round('; $sqlnach2 = ',2)'; } if($gruppierenpositionen) { $arr = $this->app->DB->SelectArr( "SELECT gp.`nummer`, gp.`bezeichnung`, gp.`artikel`, gp.`steuersatz`,gp.`erloese`, ".$sqlvor.'gp.menge*'.$sqlvor2.'(gp.preis-(gp.preis/100*gp.rabatt))'.$sqlnach2.$sqlnach." as netto, gp.menge*(gp.preis-(gp.preis/100*gp.rabatt)) as nettoungerundet , if(gp.umsatzsteuer = 'ermaessigt','ermaessigt',if(gp.umsatzsteuer = 'befreit','befreit','normal')) as usteuer , sum(gp.einkaufspreis * gp.menge) as summeeinkaufspreis, IF( IFNULL(gp.kostenstelle,'') <> '', gp.kostenstelle, IF('$kostenstelle' <> '', '$kostenstelle', art.kostenstelle) ) AS kostenstelle FROM `gutschrift_position` AS gp LEFT JOIN artikel AS art ON gp.artikel = art.id WHERE gp.gutschrift = '$id' GROUP BY gp.`steuersatz`,gp.`erloese`, gp.`umsatzsteuer`,gp.`artikel`,gp.`id` " ); } else{ $arr = $this->app->DB->SelectArr( "SELECT gp.`artikel`, gp.`steuersatz`,gp.`erloese`, SUM(".$sqlvor."gp.menge*".$sqlvor2."(gp.preis-(gp.preis/100*gp.rabatt))".$sqlnach2.$sqlnach.") as netto, SUM(gp.menge*(gp.preis-(gp.preis/100*gp.rabatt))) as nettoungerundet, if(gp.umsatzsteuer = 'ermaessigt','ermaessigt', if(gp.umsatzsteuer = 'befreit','befreit','normal')) as usteuer , sum(gp.einkaufspreis * gp.menge) as summeeinkaufspreis, IF( IFNULL(gp.kostenstelle,'')<>'', gp.kostenstelle, IF('$kostenstelle' <> '', '$kostenstelle',art.kostenstelle) ) AS kostenstelle FROM `gutschrift_position` AS gp LEFT JOIN artikel AS art ON gp.artikel = art.id WHERE gp.gutschrift = '$id' group by gp.`steuersatz`, gp.`erloese`, gp.`umsatzsteuer`, gp.`artikel` " ); } if($arr) { $steuersatzermaessigt = $this->GetSteuersatzErmaessigt(true,$id,'gutschrift'); $steuersatznormal = $this->GetSteuersatzNormal(true,$id,'gutschrift'); foreach($arr as $k => $v) { if($v['steuersatz'] !== null && $v['steuersatz'] == 0 && $ust_befreit == 0) { $ust_befreit = 3; } $erloese = $this->Gegenkonto($ust_befreit, $ustid, 'gutschrift', $id); $this->GetArtikelSteuer( $v['artikel'], $ust_befreit,0, $dummysteuersatz, $tmpsteuertext, $tmperloes, $v['usteuer'], $ustid, $projekt ); if(!$this->GutschriftMitUmsatzeuer($id)){ $v['steuersatz'] = 0; } if($v['steuersatz'] === null || $v['steuersatz'] < 0) { if($v['usteuer'] === 'ermaessigt') { $arr[$k]['steuersatz'] = $steuersatzermaessigt; }elseif($v['usteuer'] === 'befreit') { $arr[$k]['steuersatz'] = 1; }else{ $arr[$k]['steuersatz'] = $steuersatznormal; } }else { $arr[$k]['steuersatz'] = 1+$v['steuersatz']/100; } if($v['erloese'] === null || $v['erloese'] === '') { $arr[$k]['erloese'] = $erloese; if($tmperloes) { $arr[$k]['erloese'] = $tmperloes; }else{ if($v['usteuer'] === 'befreit' && $ust_befreit == 0) { $arr[$k]['erloese'] = $this->Firmendaten('steuer_erloese_inland_nichtsteuerbar'); }elseif($v['usteuer'] === 'ermaessigt' && $ust_befreit == 0) { $arr[$k]['erloese'] = $this->Firmendaten('steuer_erloese_inland_ermaessigt'); }elseif($v['usteuer'] === 'ermaessigt' && $ust_befreit == 1 && (String)$ustid === '') { $arr[$k]['erloese'] = $this->Firmendaten('steuer_erloese_inland_euermaessigt'); }elseif($ust_befreit == 1 && (String)$ustid !== ''){ $arr[$k]['erloese'] = $this->Firmendaten('steuer_erloese_inland_innergemeinschaftlich'); }elseif($v['usteuer'] !== 'ermaessigt' && $v['usteuer'] !== 'befreit' && $ust_befreit == 1 && (String)$ustid === '') { $arr[$k]['erloese'] = $this->Firmendaten('steuer_erloese_inland_eunormal'); } } } $arr[$k]['summe'] = $v['nettoungerundet'] * $arr[$k]['steuersatz']; if($gruppierenpositionen) { $arr[$k]['summe'] = round($arr[$k]['summe'], 2); } } } if($gruppierenpositionen) { return $arr; } return $this->SteuerZusammenfassen($arr, $gruppierenkostenstelle); } /** * @param array $arr * @param bool $gruppierenKostenstelle * * @return array */ public function SteuerZusammenfassen($arr, $gruppierenKostenstelle = false) { if(empty($arr)) { return $arr; } $tmparr = null; foreach($arr as $k => $v) { $kostenstelle = $gruppierenKostenstelle?(String)$v['kostenstelle']:''; if(empty($tmparr) || !isset($tmparr[$v['erloese']]) || !isset($tmparr[$v['erloese']]['s'.$v['steuersatz']]) || !isset($tmparr[$v['erloese']]['s'.$v['steuersatz']][$kostenstelle]) || !isset($tmparr[$v['erloese']]['s'.$v['steuersatz']][$kostenstelle]['s'])) { $tmparr[$v['erloese']]['s'.$v['steuersatz']][$kostenstelle]['s'] = 0; } if(empty($tmparr) || !isset($tmparr[$v['erloese']]) || !isset($tmparr[$v['erloese']]['s'.$v['steuersatz']]) || !isset($tmparr[$v['erloese']]['s'.$v['steuersatz']][$kostenstelle]) || !isset($tmparr[$v['erloese']]['s'.$v['steuersatz']][$kostenstelle]['e'])) { $tmparr[$v['erloese']]['s'.$v['steuersatz']][$kostenstelle]['e'] = 0; } $tmparr[$v['erloese']]['s'.$v['steuersatz']][$kostenstelle]['s'] += $v['summe']; $tmparr[$v['erloese']]['s'.$v['steuersatz']][$kostenstelle]['e'] += $v['summeeinkaufspreis']; } foreach($tmparr as $k1 => $v1) { foreach($v1 as $k2 => $v2) { foreach($v2 as $kostenstelle => $v3) { $newarr[] = [ 'erloese' => $k1, 'steuersatz' => str_replace('s', '', $k2), 'summe' => round($v3['s'], 2), 'summeeinkaufspreis' => round($v3['e'], 2), 'kostenstelle' => $kostenstelle ]; } } } return $newarr; } function RechnungZwischensummeSteuersaetzeBrutto($id,$art="ermaessigt") { return number_format($this->RechnungZwischensummeSteuersaetzeBrutto2($id,$art),","); } function GutschriftZwischensummeSteuersaetzeBrutto2($id,$art="ermaessigt") { $projekt = $this->app->DB->Select("SELECT projekt FROM gutschrift WHERE id = '$id' LIMIT 1"); $positionenkaufmaenischrunden = $this->app->erp->Projektdaten($projekt,"preisberechnung"); $viernachkommastellen_belege = $this->app->erp->Firmendaten('viernachkommastellen_belege'); $sqlvor = ''; $sqlnach = ''; if($art!="ermaessigt") $summe = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*(preis-(preis/100*rabatt))".$sqlnach.") FROM gutschrift_position WHERE (umsatzsteuer='normal' OR umsatzsteuer='') AND gutschrift='$id'"); else $summe = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*(preis-(preis/100*rabatt))".$sqlnach.") FROM gutschrift_position WHERE umsatzsteuer='$art' AND gutschrift='$id'"); if($art == 'befreit')return $summe; if($art=="ermaessigt") $ermaessigt_summe = $summe*$this->GetSteuersatzErmaessigt(true,$id,"gutschrift"); else $ermaessigt_summe = $summe*$this->GetSteuersatzNormal(true,$id,"gutschrift"); if($positionenkaufmaenischrunden == 1 || $positionenkaufmaenischrunden == 3)return round($ermaessigt_summe, 2); return $ermaessigt_summe; } function BelegZwischensummeSteuersaetzeBrutto2($id,$typ="",$art="ermaessigt") { $projekt = $this->app->DB->Select("SELECT projekt FROM $typ WHERE id = '$id' LIMIT 1"); $positionenkaufmaenischrunden = $this->app->erp->Projektdaten($projekt,"preisberechnung"); $viernachkommastellen_belege = $this->app->erp->Firmendaten('viernachkommastellen_belege'); $sqlvor = ''; $sqlnach = ''; if($art!="ermaessigt") $summe = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*(preis-(preis/100*rabatt))".$sqlnach.") FROM ".$typ."_position WHERE (umsatzsteuer='normal' OR umsatzsteuer='') AND ".$typ."='$id'"); else $summe = $this->app->DB->Select("SELECT SUM(".$sqlvor."menge*(preis-(preis/100*rabatt))".$sqlnach.") FROM ".$typ."_position WHERE umsatzsteuer='$art' AND ".$typ."='$id'"); if($art == 'befreit')return $summe; if($art=="ermaessigt") $ermaessigt_summe = $summe*$this->GetSteuersatzErmaessigt(true,$id,$typ); else $ermaessigt_summe = $summe*$this->GetSteuersatzNormal(true,$id,$typ); if($positionenkaufmaenischrunden == 1 || $positionenkaufmaenischrunden == 3)return round($ermaessigt_summe, 2); return $ermaessigt_summe; } function GutschriftZwischensummeSteuersaetzeBrutto($id,$art="ermaessigt") { return number_format($this->GutschriftZwischensummeSteuersaetzeBrutto2($id,$art),","); } function RechnungNeuberechnen($id) { $this->ANABREGSNeuberechnen($id,"rechnung"); } function DeleteRechnung($id) { /** @var Rechnung $obj */ $obj = $this->LoadModul('rechnung'); if(!empty($obj) && method_exists($obj,'DeleteRechnung')){ $obj->DeleteRechnung($id); } } function GetUserKalender($adresse) { return $this->app->DB->SelectArr("SELECT id, name, farbe FROM kalender WHERE id IN (SELECT kalender FROM kalender_user WHERE adresse = $adresse);"); } function GetAllKalender($adresse="") { return $this->app->DB->SelectArr("SELECT id, name, farbe".($adresse!=""?", IFNULL((SELECT 1 FROM kalender_user WHERE adresse=$adresse AND kalender_user.kalender=kalender.id),0) zugriff":"")." FROM kalender;"); } function GetUserKalenderIds($adresse) { $arr = array(); foreach ($this->GetUserKalender($adresse) as $value) array_push($arr,$value["id"]); return $arr; } function GetAllKalenderIds($adresse="") { $arr = array(); foreach ($this->GetAllKalender($adresse) as $value) array_push($arr,$value["id"]); return $arr; } function GetKalenderSelect($adresse,$selectedKalender=array()) { $arr = $this->GetUserKalender($adresse); foreach($arr as $value) { $tmp = (in_array($value["id"],$selectedKalender))?" selected=\"selected\"":""; $ret .= ""; } return $ret; } function GetKwSelect($selectedKW="") { $ret = ''; foreach(range(1,52) as $kw) { $tmp = ($selectedKW==$kw)?" selected=\"selected\"":""; $ret .= ""; } return $ret; } function GetYearSelect($selectedYear="", $yearsBefore=2, $yearsAfter=10) { $ret = ''; foreach(range(date("Y")-$yearsBefore, date("Y")+$yearsAfter) as $year) { $tmp = ($selectedYear==$year)?" selected=\"selected\"":""; $ret .= ""; } return $ret; } function DownloadFile($url,$label="tmp",$ending="") { if($ending!="") $ending = '.'.$ending; $tmpname1 = tempnam($this->GetTMP(),$label); $tmpname = $tmpname1.$ending; unlink($tmpname1); set_time_limit(0); //This is the file where we save the information $fp = fopen ($tmpname, 'w+'); //Here is the file we are downloading, replace spaces with %20 $ch = curl_init(str_replace(" ","%20",$url)); curl_setopt($ch, CURLOPT_TIMEOUT, 50); // write curl response to file curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // get curl response curl_exec($ch); curl_close($ch); fclose($fp); return $tmpname; } function CreateDateiOhneInitialeVersion($titel,$beschreibung,$nummer,$ersteller,$without_log=false) { if(!$without_log) { $this->app->DB->Insert("INSERT INTO datei (id,titel,beschreibung,nummer,firma) VALUES ('','$titel','$beschreibung','$nummer','".$this->app->User->GetFirma()."')"); } else { $this->app->DB->InsertWithoutLog("INSERT INTO datei (id,titel,beschreibung,nummer,firma) VALUES ('','$titel','$beschreibung','$nummer',1)"); } $fileid = $this->app->DB->GetInsertID(); //$this->AddDateiVersion($fileid,$ersteller,$name,"Initiale Version",$datei,$without_log); return $fileid; } function GetDMSPath($id, $path = '', $cache = false) { $ids = explode('_', $id, 2); $id = $ids[0]; if(isset($ids[1]))$cache = true; if($path == '') { $path = str_replace("index.php", "", $_SERVER['SCRIPT_FILENAME']); $path = $path."../userdata/dms/"; if(isset($this->app->Conf->WFuserdata))$path = rtrim($this->app->Conf->WFuserdata,'/').'/dms/'; $path = $path.$this->app->Conf->WFdbname; } if(!is_dir($path))return; $_path = $path; $ida = str_split($id, 2); $path .= '/d'.implode('/d',$ida); if(is_file($path.'/'.$id))return $path; if($cache && (!empty($ids)?count($ids):0) > 0) { if(is_file($path.'/'.$ids[0].'_'.$ids[1]))return $path; if(is_file($_path.'/'.$ids[0].'_'.$ids[1]))return $_path; } if($cache && is_dir($path))return $path; if($cache && is_dir($_path))return $_path; } function CreateDMSPath($path, $id) { if($path == '') { $path = str_replace("index.php", "", $_SERVER['SCRIPT_FILENAME']); $path = $path."../userdata/dms/"; if(isset($this->app->Conf->WFuserdata))$path = rtrim($this->app->Conf->WFuserdata,'/').'/dms/'; $path = $path.$this->app->Conf->WFdbname; } $ids = explode('_', $id, 2); $id = $ids[0]; if(!is_dir($path)) { $path_b = $path; if (substr(trim($path), -1) == DIRECTORY_SEPARATOR) { $path = substr(trim($path), 0, -1); } @mkdir($path); system("chmod 777 ".$path); $path = $path_b; mkdir($path,0777,true); system("chmod 777 ".$path); } if(!is_dir($path))return; $ida = str_split($id, 2); foreach($ida as $v) { $path .= '/d'.$v; if(!is_dir($path)) { if(!@mkdir($path,0777,true)) { $path_b = $path; if (substr(trim($path), -1) == DIRECTORY_SEPARATOR) { $path = substr(trim($path), 0, -1); } system("chmod 777 ".$path); $path = $path_b; @mkdir($path,0777,true); } if(!is_dir($path))return; } if(!is_dir($path))return; } return $path; } public function CheckFileSort($objekt, $parameter) { $arr = $this->app->DB->SelectArr("SELECT SQL_CALC_FOUND_ROWS s.id, s.sort FROM datei d INNER JOIN datei_stichwoerter s ON d.id=s.datei LEFT JOIN (SELECT datei, max(version) as version FROM datei_version GROUP BY datei ) v2 ON v2.datei=d.id LEFT JOIN datei_version v ON v.datei=v2.datei AND v.version = v2.version WHERE s.objekt LIKE '$objekt' AND s.parameter='$parameter' AND d.geloescht=0 ORDER BY s.sort "); if(!$arr)return; $oldsort = false; foreach($arr as $v) { if($oldsort === false) { $oldsort = $v['sort']; }elseif($v['sort'] <= $oldsort){ $oldsort = $v['sort'] + 1; $this->app->DB->Update("UPDATE datei_stichwoerter SET sort = $oldsort WHERE id = '".$v['id']."' LIMIT 1"); } } } function CreateDateiWithStichwort($name, $titel,$beschreibung,$nummer,$datei, $ersteller ,$subjekt,$objekt,$parameter, $path = "",$without_log=false) { $dateien = $this->app->DB->SelectArr("SELECT dv.datei, dv.id FROM datei_stichwoerter ds INNER JOIN datei d ON ds.datei = d.id AND ifnull(d.geloescht,0) = 0 INNER JOIN datei_version dv ON d.id = dv.datei WHERE ds.subjekt = '".$this->app->DB->real_escape_string($subjekt)."' AND ds.objekt = '".$this->app->DB->real_escape_string($objekt)."' AND ds.parameter = '".$this->app->DB->real_escape_string($parameter)."'"); if($dateien) { if(is_file($datei)) { $md5 = md5_file($datei); } else if(is_uploaded_file($datei)) { $_datei = $this->app->erp->GetTMP().$datei; if(move_uploaded_file($datei,$_datei))$datei = $_datei; $md5 = md5_file($datei); } else { $md5 = md5($datei); } if($md5 != '') { if ($path == "") { $path = str_replace("index.php", "", $_SERVER['SCRIPT_FILENAME']); $path = $path . "../userdata/dms/"; if (isset($this->app->Conf->WFuserdata)) $path = rtrim($this->app->Conf->WFuserdata, '/') . '/dms/'; $path_only = $path; $path = $path . $this->app->Conf->WFdbname; } foreach($dateien as $v) { if(is_file($path."/".$v['id']) && md5_file($path."/".$v['id']) == $md5)return $v['datei']; } } } $fileid = $this->CreateDatei($name,$titel,$beschreibung,$nummer,$datei,$ersteller,$without_log,$path); $this->AddDateiStichwort($fileid,$subjekt,$objekt,$parameter,$without_log); return $fileid; } function CreateDatei($name,$titel,$beschreibung,$nummer,$datei,$ersteller,$without_log=false,$path="") { // Anführungszeichen in Unterstriche wandeln $name = str_replace(['\\\'', '\\"', '\'', '"'], '_', $name); if(!$without_log) { $this->app->DB->Insert("INSERT INTO datei ( id, titel, beschreibung, nummer, firma ) VALUES ( '', '".$this->app->DB->real_escape_string($titel)."', '".$this->app->DB->real_escape_string($beschreibung)."', '".$this->app->DB->real_escape_string($nummer)."', '".$this->app->User->GetFirma()."' )" ); } else { $this->app->DB->InsertWithoutLog("INSERT INTO datei ( id, titel, beschreibung, nummer, firma ) VALUES ( '', '".$this->app->DB->real_escape_string($titel)."', '".$this->app->DB->real_escape_string($beschreibung)."', '".$this->app->DB->real_escape_string($nummer)."', 1 ) "); } $fileid = $this->app->DB->GetInsertID(); $this->AddDateiVersion($fileid,$ersteller,$name,"Initiale Version",$datei,$without_log,$path); return $fileid; } function AddDateiVersion($id,$ersteller,$dateiname, $bemerkung,$datei,$without_log=false,$path="") { // Anführungszeichen in Unterstriche wandeln $dateiname = str_replace(['\\\'', '\\"', '\'', '"'], '_', $dateiname); // ermittle neue Version $version = (int)$this->app->DB->Select("SELECT ifnull(max(version),0) FROM datei_version WHERE datei='$id'") + 1; $tmpfilesize = 0; if(@is_file($datei)){ $tmpfilesize = @filesize($datei); } // speichere werte ab if(!$without_log) { $this->app->DB->Insert("INSERT INTO datei_version (id,datei,ersteller,datum,version,dateiname,bemerkung,size) VALUES ('','$id','$ersteller',NOW(),'$version','$dateiname','$bemerkung','$tmpfilesize')"); } else { $this->app->DB->InsertWithoutLog("INSERT INTO datei_version (id,datei,ersteller,datum,version,dateiname,bemerkung,size) VALUES ('','$id','$ersteller',NOW(),'$version','$dateiname','$bemerkung','$tmpfilesize')"); } $versionid = $this->app->DB->GetInsertID(); $parameter = $this->app->DB->Select("SELECT parameter FROM datei_stichwoerter WHERE datei = '$id' and objekt like 'Artikel' LIMIT 1"); if($parameter){ $this->app->DB->Update("UPDATE artikel set bildvorschau = '' WHERE id = '$parameter' LIMIT 1"); } //TODO Das ist keine lösung! // if($this->app->Conf->WFdbname=="") // $this->app->Conf->WFdbname="wawision"; // Pfad anpassen if($path=="") { $path = str_replace("index.php", "", $_SERVER['SCRIPT_FILENAME']); $path = $path."../userdata/dms/"; if(isset($this->app->Conf->WFuserdata)){ $path = rtrim($this->app->Conf->WFuserdata,'/').'/dms/'; } $path_only = $path; $path = $path.$this->app->Conf->WFdbname; } else { $path_only = $path; } if(!is_dir($path)) { $path_b = $path; if (substr(trim($path), -1) == DIRECTORY_SEPARATOR) { $path = substr(trim($path), 0, -1); } if(!mkdir($path,0777, true) && !is_dir($path)){ system("chmod 777 " . $path); $path = $path_b; //system("mkdir ".$path); mkdir($path, 0777, true); system("chmod 777 " . $path); } } $userdata = isset($this->app->Conf->WFuserdata)?$this->app->Conf->WFuserdata:(str_replace('index.php', '', $_SERVER['SCRIPT_FILENAME']).'../userdata'); $cachefile = $this->app->erp->GetDMSPath( $versionid.'_100_100', $userdata.'/dms/'.$this->app->Conf->WFdbname.'/cache', true ); if(is_file($cachefile)) { @unlink($cachefile); } $path = $this->CreateDMSPath($path, $versionid); if(@is_file($datei)) { if(copy($datei,$path."/".$versionid)){ return $versionid; } return false; } if(@is_uploaded_file($datei)) { if(@move_uploaded_file($datei,$path.'/'.$versionid)) { if($tmpfilesize == 0) { if(@is_file($path.'/'.$versionid)) { $tmpfilesize = @filesize($path.'/'.$versionid); $this->app->DB->Update("UPDATE datei_version SET `size` = '$tmpfilesize' WHERE id = '$versionid'"); } } return $versionid; } return false; } // ACHTUNG !!!! ANGRIFFSGEFAHR!!!!! if($handle = fopen ($path.'/'.$versionid, "wb")) { fwrite($handle, $datei); fclose($handle); if(@is_file($path.'/'.$versionid)) { $tmpfilesize = @filesize($path.'/'.$versionid); $this->app->DB->Update("UPDATE datei_version SET `size` = '$tmpfilesize' WHERE id = '$versionid'"); } return $versionid; } return false; } function AddDateiStichwort($id,$subjekt,$objekt,$parameter,$without_log=false,$parameter2=0,$objekt2='') { if(strtolower($objekt) === 'artikel' && $parameter) { $this->app->DB->Update("UPDATE artikel SET bildvorschau = '' WHERE id = '".$parameter."' LIMIT 1"); } $sort = 1 + (int)$this->app->DB->Select("SELECT max(sort) FROM datei_stichwoerter WHERE objekt like '$objekt' AND parameter = '$parameter'"); if(!$without_log) { $this->app->DB->Insert("INSERT INTO datei_stichwoerter (id,datei,subjekt,objekt,parameter, sort, parameter2, objekt2) VALUES ('','$id','$subjekt','$objekt','$parameter','$sort','$parameter2','$objekt2')"); } else { $this->app->DB->InsertWithoutLog("INSERT INTO datei_stichwoerter (id,datei,subjekt,objekt,parameter,sort, parameter2, objekt2) VALUES ('','$id','$subjekt','$objekt','$parameter','$sort','$parameter2','$objekt2')"); } } function DeleteDateiAll($subjekt,$objekt,$parameter) { $dateien = $this->app->DB->SelectArr("SELECT ds.datei FROM datei_stichwoerter ds WHERE ds.subjekt='$subjekt' AND ds.objekt='$objekt' AND ds.parameter='$parameter' group by ds.datei"); if($dateien) { foreach($dateien as $datei) { if($datei['datei']){ $this->DeleteDatei($datei['datei']); } } } } /** * @param string $path */ public function deleteEmptyDmsPath($path) { $prefix = $this->app->Conf->WFuserdata.'/dms/'.$this->app->Conf->WFdbname.'/'; if(strpos($path, $prefix) !== 0) { return; } $prefixCache = $prefix.'cache/'; $isCacheFolder = strpos($path, $prefixCache) === 0; if($isCacheFolder) { $prefix = $prefixCache; } $dirRelative = substr($path, strlen($prefix)); if($dirRelative[0] !== 'd') { return; } $pathArr = explode('/', rtrim($dirRelative,'/')); if(substr($pathArr[(!empty($pathArr)?count($pathArr):0) - 1],0,1) !== 'd') { unset($pathArr[(!empty($pathArr)?count($pathArr):0) - 1]); } if(empty($pathArr) || !is_dir($prefix.'/'.implode('/', $pathArr))) { return; } $glob = glob($prefix.implode('/', $pathArr).'/*'); /**/ if(!empty($glob)) { return; } if(@rmdir($prefix.implode('/', $pathArr)) && (!empty($pathArr)?count($pathArr):0) > 1) { unset($pathArr[(!empty($pathArr)?count($pathArr):0) - 1]); $this->deleteEmptyDmsPath($prefix.implode('/', $pathArr)); } } function DeleteDatei($id) { $id = (int)$id; if(!$id){ return false; } $error = false; $versionen = $this->app->DB->SelectArr("SELECT * FROM datei_version WHERE datei = '".$id."'"); if($versionen) { foreach($versionen as $vers) { //$path = $this->app->Conf->WFuserdata."/dms/".$this->app->Conf->WFdbname."/".$vers['id']; $path = $this->GetDMSPath($vers['id'], $this->app->Conf->WFuserdata.'/dms/'.$this->app->Conf->WFdbname); if($path){ $path .= '/'.$vers['id']; } if($path && file_exists($path)) { if(unlink($path)) { $this->app->DB->Delete("DELETE FROM datei_version WHERE id = '".$vers['id']."'"); }else{ $error = true; } }else{ $this->app->DB->Delete("DELETE FROM datei_version WHERE id = '".$vers['id']."'"); } $this->deleteEmptyDmsPath($path); $cachedir = $this->app->Conf->WFuserdata."/dms/".$this->app->Conf->WFdbname.'/cache/'; if(is_dir($cachedir)) { $caches = glob($this->app->Conf->WFuserdata."/dms/".$this->app->Conf->WFdbname."/cache/".$vers['id'].'_*'); if(is_array($caches) && (!empty($caches)?count($caches):0) > 0) { foreach($caches as $cache)unlink($cache); } } $cachedir = $this->GetDMSPath($vers['id'], $this->app->Conf->WFuserdata."/dms/".$this->app->Conf->WFdbname."/cache", true); if(is_dir($cachedir)) { $caches = glob($cachedir.'/'.$vers['id'].'_*'); if(is_array($caches) && (!empty($caches)?count($caches):0) > 0) { foreach($caches as $cache){ unlink($cache); } } $this->deleteEmptyDmsPath($cachedir); } } } if(!$error) { $ds = $this->app->DB->SelectArr("SELECT id,objekt, parameter FROM datei_stichwoerter WHERE datei = '$id' AND objekt like 'Artikel' AND parameter <> '' AND parameter <> '0'"); $this->app->DB->Delete("DELETE FROM datei_stichwoerter WHERE datei = '$id'"); if($ds) { foreach($ds as $d) { $this->app->DB->Update("UPDATE artikel SET bildvorschau = '' WHERE id = '".$d['parameter']."' LIMIT 1"); } } $this->app->DB->Delete("DELETE FROM datei WHERE id = '$id' LIMIT 1"); return true; } return false; } function GetDateiName($id) { $version = $this->app->DB->Select("SELECT MAX(version) FROM datei_version WHERE datei='$id'"); $newid = $this->app->DB->Select("SELECT dateiname FROM datei_version WHERE datei='$id' AND version='$version' LIMIT 1"); // return $this->UmlauteEntfernen($newid); return $newid; } function GetDateiEndung($id) { $version = $this->app->DB->Select("SELECT MAX(version) FROM datei_version WHERE datei='$id'"); $newid = $this->app->DB->Select("SELECT dateiname FROM datei_version WHERE datei='$id' AND version='$version' LIMIT 1"); $tmp = pathinfo($newid); return strtolower($tmp['extension']); } /* * Retrieve files from stichwoerter and provide them in tmp for access */ function GetDateiSubjektObjektDateiname($subjekt,$objekt,$parameter,$prefix="") { $dateien = $this->app->DB->SelectArr("SELECT datei FROM datei_stichwoerter WHERE subjekt LIKE '$subjekt' AND objekt LIKE '$objekt' AND parameter='$parameter' GROUP by datei"); if(empty($dateien)) { return null; } $tmp = []; foreach($dateien as $datei) { // $tmpname = tempnam($this->GetTMP(), $prefix); $tmpname = $this->GetTMP().md5(uniqid(mt_rand(), true)); mkdir ($tmpname); $newname = $tmpname."/".$this->GetDateiName($datei['datei']); copy($this->GetDateiPfad($datei['datei']),$newname); $tmp[] = $newname; } return $tmp; } function GetDateiStichwoerter($dateiid) { $stichwoerter = $this->app->DB->SelectArr("SELECT subjekt, objekt, parameter FROM datei_stichwoerter WHERE datei=".$dateiid); if (empty($stichwoerter)) { return null; } else { return $stichwoerter; } } function GetDateiSubjektObjekt($subjekt,$objekt,$parameter) { $dateien = $this->app->DB->SelectArr("SELECT datei FROM datei_stichwoerter INNER JOIN datei d on d.id = datei WHERE subjekt LIKE '$subjekt' AND objekt LIKE '$objekt' AND parameter='$parameter' AND d.geloescht <> 1 GROUP by datei"); if(empty($dateien)) { return null; } $tmp = []; foreach($dateien as $datei) { // $tmp[] = $this->GetDateiPfad($datei['datei']); $tmp[] = $datei['datei']; // return the datei id } return $tmp; } function GetDateiPfad($id) { $version = $this->app->DB->Select("SELECT MAX(version) FROM datei_version WHERE datei='$id'"); $newid = $this->app->DB->Select("SELECT id FROM datei_version WHERE datei='$id' AND version='$version' LIMIT 1"); return $this->GetDateiPfadVersion($newid); } function GetDateiPfadVersion($id) { $dateipfad = $this->app->DB->Select("SELECT dateiname FROM datei_version WHERE id ='$id' LIMIT 1"); if(is_file($dateipfad))return $dateipfad; $path = $this->GetDMSPath($id, $this->app->Conf->WFuserdata."/dms/".$this->app->Conf->WFdbname); if($path)return $path."/".$id; $path = $this->app->Conf->WFuserdata."/dms/".$this->app->Conf->WFdbname."/".$id; return $path; } function GetDateiVersion($id) { $path = $this->GetDateiPfadVersion($id); return @file_get_contents($path); } function GetDatei($id) { $path = $this->GetDateiPfad($id); return @file_get_contents($path); } function GetDateiSize($id) { $path = $this->GetDateiPfad($id); $size = 0; if(@is_file($path)) { $size = @filesize($path); } if($size <= 1024){ return $size . ' Byte'; } if($size <= 1024*1024){ return number_format(($size / 1024), 2) . ' KB'; } return number_format(($size/1024/1024),2).' MB'; } function SendDatei($id,$versionid='') { session_write_close(); ob_end_clean(); set_time_limit(0); if($versionid>0){ $newid = $versionid; } else{ $version = 0; $newid = 0; if((int)$id > 0) { $version = $this->app->DB->Select("SELECT MAX(version) FROM datei_version WHERE datei='$id'"); $newid = $this->app->DB->Select("SELECT id FROM datei_version WHERE datei='$id' AND version='$version' LIMIT 1"); } } $name = $newid <=0?'':$this->app->DB->Select("SELECT dateiname FROM datei_version WHERE id='$newid' LIMIT 1"); $path = ''; if($id > 0){ $path = $this->GetDateiPfad($id); if(!@file_exists($path)) { $path = ''; } } //$name=basename($path); //filenames in IE containing dots will screw up the //filename unless we add this if ( strpos ( $_SERVER [ 'HTTP_USER_AGENT' ], "MSIE" ) > 0 ) { $header_name = 'Content-Disposition: attachment; filename="' . rawurlencode ( $name ) . '"' ; } else { $header_name = 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode ( $name ) ; } $contenttype= $this->content_type($name); //required, or it might try to send the serving //document instead of the file header("Content-Type: $contenttype"); header("Content-Length: " .(string)(empty($path)?0:@filesize($path)) ); //header('Content-Disposition: inline; filename="'.$name.'"'); //$name = $this->Dateinamen($name); //header('Content-Disposition: attachment; filename="'.$name.'"'); header($header_name); if(!empty($path) && $file = fopen($path, 'rb')){ while( (!feof($file)) && (connection_status()==0) ){ print(fread($file, 1024*8)); flush(); } fclose($file); } return((connection_status()==0) and !connection_aborted()); } function content_type($name) { // Defines the content type based upon the extension of the file $contenttype = 'application/octet-stream'; $contenttypes = array( 'html' => 'text/html', 'htm' => 'text/html', 'txt' => 'text/plain', 'gif' => 'image/gif', 'jpg' => 'image/jpeg', 'png' => 'image/png', 'sxw' => 'application/vnd.sun.xml.writer', 'sxg' => 'application/vnd.sun.xml.writer.global', 'sxd' => 'application/vnd.sun.xml.draw', 'sxc' => 'application/vnd.sun.xml.calc', 'sxi' => 'application/vnd.sun.xml.impress', 'xls' => 'application/vnd.ms-excel', 'ppt' => 'application/vnd.ms-powerpoint', 'doc' => 'application/msword', 'rtf' => 'text/rtf', 'zip' => 'application/zip', 'mp3' => 'audio/mpeg', 'pdf' => 'application/pdf', 'tgz' => 'application/x-gzip', 'gz' => 'application/x-gzip', 'vcf' => 'text/vcf' ); $name = str_replace("§", " ", $name); foreach ($contenttypes as $type_ext => $type_name) { if (preg_match ("/$type_ext$/i", $name)) $contenttype = $type_name; } return $contenttype; } function getDateiTypen($modul=''){ $dateiTypen=[]; switch($modul){ case 'artikel': $dateiTypen[] = ['wert' => 'Shopbild', 'beschriftung' => 'Standard Artikelbild (Shopbild)']; $dateiTypen[] = ['wert' => 'Gruppenbild', 'beschriftung' => 'Standard Gruppenbild']; $dateiTypen[] = ['wert' => 'Etikettenbild', 'beschriftung' => 'Etikettenbild']; $dateiTypen[] = ['wert' => 'Bild', 'beschriftung' => 'Sonstiges Bild']; $dateiTypen[] = ['wert' => 'Datenblatt', 'beschriftung' => 'Datenblatt']; $dateiTypen[] = ['wert' => 'Druckbild', 'beschriftung' => 'Druckbild (300dpi)']; $dateiTypen[] = ['wert' => 'Zertifikat', 'beschriftung' => 'Zertifikat Anhang (PDF)']; break; case 'projekt': $dateiTypen[] = ['wert' => 'Briefpapier1', 'beschriftung' => 'Briefpapier Seite 1']; $dateiTypen[] = ['wert' => 'Briefpapier2', 'beschriftung' => 'Briefpapier Seite 2']; break; case 'verbindlichkeit': case 'kasse': $dateiTypen[] = ['wert' => 'Belege', 'beschriftung' => 'Beleg']; $dateiTypen[] = ['wert' => 'Quittung', 'beschriftung' => 'Quittung']; break; } $dateiTypen[] = ['wert' => 'Sonstige', 'beschriftung' => 'Sonstige Datei']; $dateiTypen[] = ['wert' => 'Deckblatt', 'beschriftung' => 'Deckblatt']; $dateiTypen[] = ['wert' => 'anhang', 'beschriftung' => 'Anhang']; //adresse unter defaulttypen, da profilbild nicht als default ausgewählt werden soll OS148717 switch($modul){ case 'adresse': $dateiTypen[] = ['wert' => 'Profilbild', 'beschriftung' => 'Profilbild']; break; } if($modul !== ''){ $zusaetzlicheStichworter = $this->app->DB->SelectArr( "SELECT * FROM datei_stichwortvorlagen WHERE modul='$modul' OR modul='' ORDER by beschriftung" ); $cZusaetzlicheStichworter = empty($zusaetzlicheStichworter)?0:(!empty($zusaetzlicheStichworter)?count($zusaetzlicheStichworter):0); for($i=0;$i<$cZusaetzlicheStichworter;$i++){ $dateiTypen[] = ['wert' => $zusaetzlicheStichworter[$i]['beschriftung'], 'beschriftung' => $zusaetzlicheStichworter[$i]['beschriftung']]; } } return $dateiTypen; } function GetEtikettenbild($artikel,$return_dateiid=false) { $dateiid = $this->app->DB->Select( sprintf( "SELECT datei FROM datei_stichwoerter WHERE objekt LIKE 'Artikel' AND parameter = '%d' AND (subjekt LIKE 'Etikettenbild' OR subjekt LIKE 'Bild' OR subjekt LIKE 'Shopbild') ORDER BY (subjekt like 'Etikettenbild') DESC, (subjekt like 'Bild') DESC LIMIT 1", (int)$artikel ) ); if($artikel <= 0 || $dateiid <= 0) { return false; } if($return_dateiid) { return $dateiid; } $filename = $this->GetDateiName($dateiid); $path_info = pathinfo($filename); return array('image'=>$this->GetDatei($dateiid),'filename'=>$filename,'extension'=>$path_info['extension']); } function GetArtikelStandardbild($artikel,$return_dateiid=false) { $dateiid = $this->app->DB->Select(sprintf(" SELECT dv.datei AS datei FROM datei_stichwoerter AS ds JOIN (SELECT datei, MAX(id) AS id FROM datei_version GROUP BY datei) AS dv ON dv.datei = ds.datei WHERE ds.objekt LIKE 'Artikel' AND ds.parameter = '%d' AND (ds.subjekt LIKE 'Shopbild' OR ds.subjekt LIKE 'Druckbild' OR ds.subjekt LIKE 'Bild') ORDER BY ds.subjekt LIKE 'Shopbild' DESC, ds.subjekt LIKE 'Druckbild' DESC, ds.sort LIMIT 1", $artikel) ); if($artikel <= 0 || $dateiid <= 0) { return false; } if($return_dateiid) { return $dateiid; } $filename = $this->GetDateiName($dateiid); $path_info = pathinfo($filename); return array('image'=>$this->GetDatei($dateiid),'filename'=>$filename,'extension'=>$path_info['extension']); } function DeleteEmailbackupMail($id,$adresse="") { if($adresse > 0) { $this->app->DB->Update("UPDATE emailbackup_mails SET geloescht=1 WHERE webmail IN (SELECT id FROM emailbackup WHERE emailbackup.adresse = '$adresse' AND emailbackup.geloescht!=1) AND id='$id'"); } else { $this->app->DB->Update("UPDATE emailbackup_mails SET geloescht=1 WHERE id='$id' LIMIT 1"); } } function Wochenplan($adr_id,$parsetarget){ $this->app->Tpl->Set('SUBSUBHEADING', "Wochenplan"); $this->app->Tpl->Set('INHALT',""); $anzWochentage = 5; $startStunde = 6; $endStunde = 22; $wochentage = $this->getDates($anzWochentage); $inhalt = ""; for($i=$startStunde;$i<=$endStunde;$i++){ // fuelle Zeilen 06:00 bis 22:00 $zeile = array(); $zeileCount = 0; foreach($wochentage as $tag){ // hole Daten fuer Uhrzeit $i und Datum $tage $result = $this->checkCell($tag, $i, $adr_id); if($result[0]['aufgabe'] != "") { if($result[0]['adresse']==0) $color = '#ccc'; else $color='#BCEE68'; if($result[0]['prio']==1) $color = 'red'; $zeile[$zeileCount] = '
'.$result[0]['aufgabe'].'
'; } else $zeile[$zeileCount] = " "; $zeileCount++; } $inhalt = $inhalt.$this->makeRow($zeile, $anzWochentage,$i.":00"); } $this->app->Tpl->Set('WOCHENDATUM', $this->makeRow($wochentage, $anzWochentage)); $this->app->Tpl->Set('INHALT',$inhalt); $this->app->Tpl->Parse($parsetarget,"zeiterfassung_wochenplan.tpl"); $this->app->Tpl->Add($parsetarget,"
".$this->app->User->GetName()." Prio: Sehr Hoch (".$this->app->User->GetName().") Allgemein
"); } function getDates($anzWochentage){ // hole Datum der Wochentage von Mo bis $anzWochentage $montag = $this->app->DB->Select("SELECT DATE_SUB(CURDATE(),INTERVAL WEEKDAY(CURDATE()) day)"); $week = array(); for($i=0;$i<$anzWochentage;$i++) $week[$i] = $this->app->DB->Select("SELECT DATE_ADD('$montag',INTERVAL $i day)"); return $week; } function makeRow($data, $spalten, $erstefrei="frei"){ // erzeuge eine Zeile in der Tabelle // $erstefrei = 1 -> erste Spalte ist leer $row = ''; if($erstefrei=="frei") $row = $row.' '; else $row = $row.''.$erstefrei.''; for($i=0;$i<$spalten; $i++) $row = $row.''.$data[$i].''; $row = $row.''; return $row; } function KundeMitUmsatzsteuer($adresse) { $addressRow = $this->app->DB->SelectRow("SELECT land, ustid FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); $land = $addressRow['land']; $ustid = $addressRow['ustid']; if($land ==$this->Firmendaten('land')){ return true; } // wenn kunde EU foreach($this->GetUSTEU() as $value) { //echo $value; if($value==$land && $ustid!='') { return false; } } // alle anderen laender = export return false; } function AuftragMitUmsatzsteuer($auftrag) { return $this->AuftragMitUmsatzeuer($auftrag); } function AuftragMitUmsatzeuer($auftrag) { $docRow = $this->app->DB->SelectRow(sprintf('SELECT ust_befreit,ustid FROM auftrag WHERE id=%d LIMIT 1', $auftrag)); return $docRow['ust_befreit'] == 0 || ($docRow['ust_befreit'] == 1 && $docRow['ustid'] ==''); } function GutschriftMitUmsatzeuer($gutschrift) { $docRow = $this->app->DB->SelectRow(sprintf('SELECT ust_befreit,ustid FROM gutschrift WHERE id=%d LIMIT 1', $gutschrift)); return $docRow['ust_befreit'] == 0 || ($docRow['ust_befreit'] == 1 && $docRow['ustid'] ==''); } function PruefeMengeVPE($table, $posid, $menge) { if($posid <= 0)return $menge; $_menge = $menge; $beleg = str_replace('_position','',$table); switch($table) { case 'auftrag_position': case 'angebot_position': case 'rechnung_position': case 'gutschrift_position': if(!$this->app->erp->Firmendaten('verkaufspreisevpe'))return $menge; $artikel = $this->app->DB->Select("SELECT artikel FROM $table WHERE id = '$posid' LIMIT 1"); $belegid = $this->app->DB->Select("SELECT $beleg FROM $table WHERE id = '$posid' LIMIT 1"); $adresse = $this->app->DB->Select("SELECT adresse FROM $beleg WHERE id = '$belegid' LIMIT 1"); $waehrung = $this->app->DB->Select("SELECT waehrung FROM $beleg WHERE id = '$belegid' LIMIT 1"); $vp = $this->app->erp->GetVerkaufspreisKunde($artikel,$menge,$adresse,$waehrung,true); if(!$vp)$vp = $this->app->erp->GetVerkaufspreis($artikel,$menge,$adresse,$waehrung, $returnwaehrung,true, true); if($vp && $vp['vpe'] > 0) { if($vp['vpe'] * ceil($menge / $vp['vpe']) != $_menge) { $this->app->DB->Update("UPDATE $table SET preis = '" . $vp['preis'] . "' WHERE id = '$posid' LIMIT 1"); return $vp['vpe'] * ceil($menge / $vp['vpe']); }else return $_menge; } break; case 'bestellung_position': if(!$this->app->erp->Firmendaten('einkaufspreisevpe'))return $menge; $artikel = $this->app->DB->Select("SELECT artikel FROM $table WHERE id = '$posid' LIMIT 1"); $belegid = $this->app->DB->Select("SELECT $beleg FROM $table WHERE id = '$posid' LIMIT 1"); $adresse = $this->app->DB->Select("SELECT adresse FROM $beleg WHERE id = '$belegid' LIMIT 1"); $waehrung = $this->app->DB->Select("SELECT waehrung FROM $beleg WHERE id = '$belegid' LIMIT 1"); $ep = $this->app->erp->GetEinkaufspreisArr($artikel, $menge, $adresse, $waehrung, true); if($ep && $ep['vpe'] > 0) { if($_menge != $ep['vpe'] * ceil($menge / $ep['vpe'])) { $this->app->DB->Update("UPDATE $table SET preis = '" . $ep['preis'] . "' WHERE id = '$posid' LIMIT 1"); return $ep['vpe'] * ceil($menge / $ep['vpe']); }else return $_menge; } break; } return $menge; } function Belegegesamt($tabellen = null, $where = '') { if(is_null($tabellen) || in_array('rechnung', $tabellen))$ret[] = " select `rechnung`.`id` AS `id`,`rechnung`.`adresse` AS `adresse`,`rechnung`.`datum` AS `datum`,`rechnung`.`belegnr` AS `belegnr`,`rechnung`.`status` AS `status`,`rechnung`.`land` AS `land`,'rechnung' AS `typ`,`rechnung`.`umsatz_netto` AS `umsatz_netto`,`rechnung`.`soll` AS `umsatz_brutto`,`rechnung`.`erloes_netto` AS `erloes_netto`,`rechnung`.`deckungsbeitrag` AS `deckungsbeitrag`,`rechnung`.`provision_summe` AS `provision_summe`,`rechnung`.`vertriebid` AS `vertriebid`,`rechnung`.`gruppe` AS `gruppe`,`rechnung`.`projekt` AS `projekt`,`rechnung`.`waehrung` as `waehrung` from `rechnung` $where "; if(is_null($tabellen) || in_array('gutschrift', $tabellen))$ret[] = " select `gutschrift`.`id` AS `id`,`gutschrift`.`adresse` AS `adresse`,`gutschrift`.`datum` AS `datum`,`gutschrift`.`belegnr` AS `belegnr`,`gutschrift`.`status` AS `status`,`gutschrift`.`land` AS `land`,'gutschrift' AS `typ`,(`gutschrift`.`umsatz_netto` * -(1)) AS `umsatz_netto`,(`gutschrift`.`soll` * -(1)) AS `umsatz_brutto`,(`gutschrift`.`erloes_netto` * -(1)) AS `erloes_netto`,(`gutschrift`.`deckungsbeitrag` * -(1)) AS `deckungsbeitrag`,(`gutschrift`.`provision_summe` * -(1)) AS `provision_summe`,`gutschrift`.`vertriebid` AS `vertriebid`,`gutschrift`.`gruppe` AS `gruppe`,`gutschrift`.`projekt` AS `projekt`,`gutschrift`.`waehrung` as `waehrung` from `gutschrift` $where "; if(is_null($tabellen) || in_array('auftrag', $tabellen))$ret[] = " select `auftrag`.`id` AS `id`,`auftrag`.`adresse` AS `adresse`,`auftrag`.`datum` AS `datum`,`auftrag`.`belegnr` AS `belegnr`,`auftrag`.`status` AS `status`,`auftrag`.`land` AS `land`,'auftrag' AS `typ`,`auftrag`.`umsatz_netto` AS `umsatz_netto`,`auftrag`.`gesamtsumme` AS `umsatz_brutto`,`auftrag`.`erloes_netto` AS `erloes_netto`,`auftrag`.`deckungsbeitrag` AS `deckungsbeitrag`,`auftrag`.`provision_summe` AS `provision_summe`,`auftrag`.`vertriebid` AS `vertriebid`,`auftrag`.`gruppe` AS `gruppe`, `auftrag`.`projekt` AS `projekt`,`auftrag`.`waehrung` as `waehrung` from `auftrag` $where "; if(is_null($tabellen) || in_array('bestellung', $tabellen))$ret[] = " union all select `bestellung`.`id` AS `id`,`bestellung`.`adresse` AS `adresse`,`bestellung`.`datum` AS `datum`,`bestellung`.`belegnr` AS `belegnr`,`bestellung`.`status` AS `status`,`bestellung`.`land` AS `land`,'bestellung' AS `typ`,`bestellung`.`gesamtsumme` AS `umsatz_netto`,`bestellung`.`gesamtsumme` AS `umsatz_brutto`,'0' AS `erloes_netto`,'0' AS `deckungsbeitrag`,'0' AS `provision_summe`,'0' AS `vertriebid`,'0' AS `gruppe`, `bestellung`.`projekt` AS `projekt`,`bestellung`.`waehrung` as `waehrung` from `bestellung` $where "; if(is_null($tabellen) || in_array('lieferschein', $tabellen))$ret[] = " union all select `lieferschein`.`id` AS `id`,`lieferschein`.`adresse` AS `adresse`,`lieferschein`.`datum` AS `datum`,`lieferschein`.`belegnr` AS `belegnr`,`lieferschein`.`status` AS `status`,`lieferschein`.`land` AS `land`,'lieferschein' AS `typ`,'0' AS `umsatz_netto`,'0' AS `umsatz_brutto`,'0' AS `erloes_netto`,'0' AS `deckungsbeitrag`,'0' AS `provision_summe`,'0' AS `vertriebid`,'0' AS `gruppe`, `lieferschein`.`projekt` AS `projekt`,'' as `waehrung` from `lieferschein` $where "; return ' ('.implode(' UNION ALL ', $ret).') '; } function SQLPosBrutto($belegtab, $postab, $arttab) { return " sum( (if($belegtab.ust_befreit = 0 OR ($belegtab.ust_befreit = 1 AND $belegtab.ustid <> '' AND $belegtab.ustid <> '0'), ( if(ifnull($postab.steuersatz,-1) <0, if($postab.umsatzsteuer = 'befreit',0, if($postab.umsatzsteuer = 'ermaessigt',$belegtab.steuersatz_ermaessigt, if($postab.umsatzsteuer = 'normal',$belegtab.steuersatz_normal, if($arttab.umsatzsteuer = 'befreit',0, if($arttab.umsatzsteuer = 'ermaessigt',$belegtab.steuersatz_ermaessigt, $belegtab.steuersatz_normal ) ) ) ) ) ,$postab.steuersatz)),0)/100+1 ) * $postab.menge *($postab.preis * (1-$postab.rabatt/100))) "; } function RechnungMitUmsatzsteuer($rechnung) { $docRow = $this->app->DB->SelectRow(sprintf('SELECT ust_befreit,ustid FROM rechnung WHERE id=%d LIMIT 1', $rechnung)); return $docRow['ust_befreit'] == 0 || ($docRow['ust_befreit'] == 1 && $docRow['ustid'] ==''); } function RechnungMitUmsatzeuer($rechnung) { return $this->RechnungMitUmsatzsteuer($rechnung); } function ProformarechnungMitUmsatzeuer($rechnung) { $docRow = $this->app->DB->SelectRow(sprintf('SELECT ust_befreit,ustid FROM proformarechnung WHERE id=%d LIMIT 1', $rechnung)); return $docRow['ust_befreit'] == 0 || ($docRow['ust_befreit'] == 1 && $docRow['ustid'] ==''); // wenn lieferant DE dann mit 19% oder 7% einkaufen // wenn lieferant in der EU kann man mit 0% bezahlen // wenn lieferant in der welt sowieso keine steuer sondern zoll // wenn wir von privat EU kaufen dann muss mit steuer gekauft werden! (SPAETER KANN ES SEIN) return false; } function AngebotMitUmsatzeuer($angebot) { return $this->app->DB->Select("SELECT ust_befreit FROM angebot WHERE id='$angebot' LIMIT 1") == 0 || ($this->app->DB->Select("SELECT ust_befreit FROM angebot WHERE id='$angebot' LIMIT 1") == 1 && $this->app->DB->Select("SELECT ustid FROM angebot WHERE id='$angebot' LIMIT 1") ==""); // wenn lieferant DE dann mit 19% oder 7% einkaufen // wenn lieferant in der EU kann man mit 0% bezahlen // wenn lieferant in der welt sowieso keine steuer sondern zoll // wenn wir von privat EU kaufen dann muss mit steuer gekauft werden! (SPAETER KANN ES SEIN) } function BestellungMitUmsatzeuer($bestellung) { return $this->app->DB->Select("SELECT ust_befreit FROM bestellung WHERE id='$bestellung' LIMIT 1") == 0; // wenn lieferant DE dann mit 19% oder 7% einkaufen // wenn lieferant in der EU kann man mit 0% bezahlen // wenn lieferant in der welt sowieso keine steuer sondern zoll // wenn wir von privat EU kaufen dann muss mit steuer gekauft werden! (SPAETER KANN ES SEIN) } function BesteuerungKunde($adresse) { if($this->AdresseUSTCheck($adresse)==0){ return 'steuer'; } return ''; // steuer muss gezahlt werden! steuer, euexport, exporr // wenn kunde im export muss keine steuer bezahlt werden! // wenn kunde gepruefte ust id hat && lieferung nach EU geht (aber das land verlaesst!) } function CheckLieferantEU($adresse) { // lieferant aus der EU $land = $this->app->DB->Select("SELECT land FROM adresse WHERE id='$adresse' AND geloescht=0 LIMIT 1"); } function CheckKundeEU($adresse) { } function checkCell($datum, $stunde, $adr_id){ // ueberprueft ob in der Stunde eine Aufgabe zu erledigen ist //echo $datum." ".$stunde."
"; return $this->app->DB->SelectArr("SELECT aufgabe,adresse,prio FROM aufgabe WHERE DATE(startdatum) = '$datum' AND HOUR(TIME(startzeit)) <= $stunde AND HOUR(TIME(startzeit)) + stunden >= $stunde AND (adresse = $adr_id OR adresse = 0) OR ((DATE_SUB('$datum', INTERVAL MOD(DATEDIFF('$datum',DATE_FORMAT(startdatum, '%Y:%m:%d')),intervall_tage) day)='$datum' AND DATE_SUB('$datum', INTERVAL MOD(DATEDIFF('$datum',DATE_FORMAT(startdatum, '%Y:%m:%d')),intervall_tage) day) > abgeschlossen_am AND intervall_tage>0 AND (adresse=$adr_id OR adresse=0)) AND HOUR(TIME(startzeit)) <= $stunde AND HOUR(TIME(startzeit)) + stunden >= $stunde) OR ( DATE (abgabe_bis) = '$datum' AND abgeschlossen=0 AND adresse = $adr_id AND HOUR(TIME(startzeit)) = $stunde) LIMIT 1"); // letztes OR von Bene! } function WebmailSetReadStatus($mailid,$boolean) { $this->app->DB->Update("UPDATE emailbackup_mails SET gelesen = ".($boolean?1:0)." WHERE id = $mailid"); } function checkPDF($file,$maxSize=0,$x=0,$y=0) { return ""; } function checkFile($file,$filetype,$maxSize=0) { if($file!='') { if(is_array($file)){ $pfad = $file['tmp_name']; } else { $pfad = $file; } } $dbtype = mime_content_type($pfad); if($dbtype==='application/octet-stream' && $filetype==='application/pdf'){ return ''; } if($dbtype!=$filetype){ return "Falscher Dateityp! Es wird $filetype erwartet aber $dbtype wurde übergeben!"; } return ''; } public function checkImage($file,$maxSize=0,$x=0,$y=0,$typcheck=2) { // Prueft ein Bild auf Dateigroesse, Hoehe und Breite if($file!='') { if(is_array($file)){ $pfad = $file['tmp_name']; } else { $pfad = $file; } } $typ = GetImageSize($pfad); $size = $file['size']; if($maxSize==0){ $fileSizeLimit = 16777216; // 16MB in BYTE, 100MB stehen in der upload_max_size } else{ $fileSizeLimit = $maxSize; } //if(0 < $typ[2] && $typ[2] < 4) if($typ[2]==$typcheck) { if($size<$fileSizeLimit) { if($typ[0]>$x && $x!=0){ $error = 'Das Bild ist zu breit.'; } if($typ[1]>$y && $y!=0){ $error = 'Das Bild ist zu hoch.'; }else{ $error = ''; } }else{ $error = 'Die Datei darf eine Größe von ' . ($fileSizeLimit / 8388608) . ' MB nicht überschreiten.'; } }else{ $error = 'Die Datei muss vom korrekten Typ sein'; } return $error; } public function uploadSettigsImage($file, $name) { if(empty($file) || empty($name) || empty($file['tmp_name'])) { return false; } $pfad = $file['tmp_name']; $typ = @GetImageSize($pfad); // Bild hochladen if($filehandle = fopen($pfad,'r')){ $filedata = fread($filehandle, @filesize($pfad)); $dbtype = $typ['mime']; fclose($filehandle); }else{ return false; } $pfad2 = $this->GetUSERDATA(); if(!is_dir($pfad2)) { if(!mkdir($pfad2) && !is_dir($pfad2)) { return false; } } $pfad2 .= '/dms/'; if(!is_dir($pfad2)) { if(!mkdir($pfad2) && !is_dir($pfad2)) { return false; } } $pfad2 .= $this->app->Conf->WFdbname; if(!is_dir($pfad2)) { if(!mkdir($pfad2) && !is_dir($pfad2)) { return false; } } if(file_put_contents($pfad2.'/'.$name, $filedata)){ return array('image' => base64_encode($filedata), 'type' => $dbtype); } return false; } public function uploadImageIntoDB($file) { // Wandelt ein Bild fuer einen LONGBLOB um $pfad = $file['tmp_name']; $typ = @GetImageSize($pfad); // Bild hochladen $filehandle = fopen($pfad,'r'); $filedata = base64_encode(fread($filehandle, @filesize($pfad))); $dbtype = $typ['mime']; fclose($filehandle); return array('image'=>$filedata,'type'=>$dbtype); } function GetEinkaufspreisWaehrung($id, $menge, $waehrung='', &$originalwaehrung=null, &$originalpreis=null, $adresse = '') { $artikelRow = $this->app->DB->SelectRow( sprintf( 'SELECT adresse,verwendeberechneterek,berechneterekwaehrung,berechneterek,produktion, stueckliste FROM artikel WHERE id = %d LIMIT 1 ', (int)$id ) ); if($adresse == '') { $adresse = $artikelRow['adresse']; } if($waehrung == '') { $waehrung = 'EUR'; } if($artikelRow['verwendeberechneterek']) { $originalwaehrung = (String)$artikelRow['berechneterekwaehrung']; if($originalwaehrung === '') { $originalwaehrung = 'EUR'; } $originalpreis = $artikelRow['berechneterek']; if($originalwaehrung === $waehrung) { return $originalpreis; } $kurs = $this->GetWaehrungUmrechnungskurs($originalwaehrung,$waehrung); if($kurs==0) { $kurs=1; } return $originalpreis * $kurs; } // wenn produktionsartikel $produktion = $artikelRow['produktion']; $stueckliste = $artikelRow['stueckliste']; if($produktion) { } else if($stueckliste==1)// && $juststueckliste!=1) { $eka = $this->app->DB->SelectArr("SELECT preis, waehrung FROM einkaufspreise WHERE artikel='$id' AND adresse='$adresse' AND ab_menge<='$menge' AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') AND geloescht=0 ORDER BY waehrung = '$waehrung' DESC, waehrung = '', ab_menge DESC LIMIT 1"); if(!$eka) { $eka = $this->app->DB->SelectArr("SELECT preis, waehrung FROM einkaufspreise WHERE artikel='$id' AND ab_menge<='$menge' AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') AND geloescht=0 ORDER BY waehrung = '$waehrung' DESC, waehrung = '', ab_menge DESC LIMIT 1"); } if(!$eka) { $eka = $this->app->DB->SelectArr("SELECT preis, waehrung FROM einkaufspreise WHERE artikel='$id' AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') AND geloescht=0 ORDER BY waehrung = '$waehrung' DESC, waehrung = '', ab_menge LIMIT 1"); } if($eka && $eka[0]['preis'] != 0) { if($eka[0]['waehrung'] == '') { $eka[0]['waehrung'] = 'EUR'; } $originalwaehrung = $eka[0]['waehrung']; $originalpreis = $eka[0]['preis']; if($eka[0]['waehrung'] == $waehrung) { return $originalpreis; } return $originalpreis * $this->GetWaehrungUmrechnungskurs($originalwaehrung,$waehrung); } return $this->GetEinkaufspreisStuecklisteWaehrung($id, $waehrung); } $eka = $this->app->DB->SelectArr("SELECT preis, waehrung FROM einkaufspreise WHERE artikel='$id' AND adresse='$adresse' AND ab_menge<='$menge' AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') AND geloescht=0 ORDER BY waehrung = '$waehrung' DESC, waehrung = '', ab_menge DESC LIMIT 1"); if(!$eka) { $eka = $this->app->DB->SelectArr("SELECT preis, waehrung FROM einkaufspreise WHERE artikel='$id' AND ab_menge<='$menge' AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') AND geloescht=0 ORDER BY waehrung = '$waehrung' DESC, waehrung = '', ab_menge DESC LIMIT 1"); } if(!$eka) { $eka = $this->app->DB->SelectArr("SELECT preis, waehrung FROM einkaufspreise WHERE artikel='$id' AND (gueltig_bis>=NOW() OR ifnull(gueltig_bis,'0000-00-00')='0000-00-00') AND geloescht=0 ORDER BY waehrung = '$waehrung' DESC, waehrung = '', ab_menge LIMIT 1"); } if(!$eka) { return 0; } if($eka[0]['waehrung'] == '') { $eka[0]['waehrung'] = 'EUR'; } $originalwaehrung = $eka[0]['waehrung']; $originalpreis = $eka[0]['preis']; if($eka[0]['waehrung'] == $waehrung) { return $originalpreis; } return $originalpreis * $this->GetWaehrungUmrechnungskurs($originalwaehrung,$waehrung); } function GetEinkaufspreisArr($id, $menge, $adresse, $waehrung = "EUR", $auchpreisegrmenge = false) { $ek = $this->app->DB->SelectRow("SELECT * FROM einkaufspreise WHERE artikel='$id' AND adresse='$adresse' AND ab_menge<='$menge' AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') AND geloescht=0 ORDER by waehrung = '$waehrung' DESC, waehrung = '' DESC, ab_menge DESC LIMIT 1"); if(!$ek && $auchpreisegrmenge)$ek = $this->app->DB->SelectRow("SELECT * FROM einkaufspreise WHERE artikel='$id' AND adresse='$adresse' AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') AND geloescht=0 ORDER by waehrung = '$waehrung' DESC, waehrung = '' DESC, ab_menge ASC LIMIT 1"); if(!$ek)return; if($ek['preis'] <=0) { $ek2 = $this->app->DB->SelectRow("SELECT * FROM einkaufspreise WHERE artikel='$id' AND adresse='$adresse' AND (gueltig_bis>=NOW() OR ifnull(gueltig_bis,'0000-00-00')='0000-00-00') AND geloescht=0 ORDER by waehrung = '$waehrung' DESC, waehrung = '' DESC,preis LIMIT 1"); if($ek2)return $ek2; } return $ek; } function GetEinkaufspreis($id,$menge,$adresse="") { // wenn produktionsartikel $prodStueckliste = $this->app->DB->SelectRow("SELECT produktion, stueckliste FROM artikel WHERE id='$id' LIMIT 1"); $produktion = $prodStueckliste['produktion']; $stueckliste = $prodStueckliste['stueckliste']; if($produktion && $stueckliste) { } else if($stueckliste==1)// && $juststueckliste!=1) { $ek = $this->GetEinkaufspreisStueckliste($id); } else { $ek = $this->app->DB->Select("SELECT preis FROM einkaufspreise WHERE artikel='$id' AND adresse='$adresse' AND ab_menge<='$menge' AND (gueltig_bis>=NOW() OR ifnull(gueltig_bis,'0000-00-00')='0000-00-00') AND geloescht=0 ORDER by ab_menge DESC LIMIT 1"); if($ek <=0) { $ek = $this->app->DB->Select("SELECT preis FROM einkaufspreise WHERE artikel='$id' AND ab_menge<='$menge' AND (gueltig_bis>=NOW() OR ifnull(gueltig_bis,'0000-00-00')='0000-00-00') AND geloescht=0 ORDER by preis LIMIT 1"); if($ek <=0) { $ek = $this->app->DB->Select("SELECT MIN(preis) FROM einkaufspreise WHERE artikel='$id' AND (gueltig_bis>=NOW() OR ifnull(gueltig_bis,'0000-00-00')='0000-00-00') AND geloescht=0 "); } } } return $ek; } function Wechselkurs($von,$zu,$datum) { return 1.3; } function Rabatt($betrag,$rabatt) { $result = $betrag*(100-$rabatt)/100; return number_format($result, 4, '.', ''); } function GetGruppen($adresse) { $tmp = $this->app->DB->SelectArr("SELECT * FROM adresse_rolle WHERE adresse='$adresse' AND (bis > NOW() OR ifnull(bis,'0000-00-00')='0000-00-00') AND parameter > 0 AND objekt='Gruppe'"); if(empty($tmp)) { return null; } $result = []; foreach($tmp as $row) { $result[] = $row['parameter']; } return $result; } function MonatsListe($sprache = 'deutsch') { $monatsListe[1] = 'Januar'; $monatsListe[2] = 'Februar'; $monatsListe[3] = 'März'; $monatsListe[4] = 'April'; $monatsListe[5] = 'Mai'; $monatsListe[6] = 'Juni'; $monatsListe[7] = 'Juli'; $monatsListe[8] = 'August'; $monatsListe[9] = 'September'; $monatsListe[10] = 'Oktober'; $monatsListe[11] = 'November'; $monatsListe[12] = 'Dezember'; return $monatsListe; } function IsSpezialVerkaufspreis($artikel,$menge,$adresse=0,$waehrung='EUR') { $vkarr = null; $guenstigste_vk = $this->Firmendaten('guenstigste_vk'); $gruppenarr = $this->GetGruppen($adresse); $sql_erweiterung = ''; if(!empty($gruppenarr)) { $sql_erweiterung .= ' OR v.gruppe IN ('.implode(' ', $gruppenarr).') '; } if(!$guenstigste_vk) { $vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <= '$menge' AND (v.gueltig_bis > NOW() OR v.gueltig_bis='0000-00-00') AND (v.gueltig_ab <= curdate() OR v.gueltig_ab = '0000-00-00') AND v.artikel='".$artikel."' AND (v.adresse='$adresse') ORDER by ab_menge ASC, preis DESC LIMIT 1"); } if(empty($vkarr)) { $vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <= '$menge' AND (v.gueltig_bis > NOW() OR v.gueltig_bis='0000-00-00') AND (v.gueltig_ab <= curdate() OR v.gueltig_ab = '0000-00-00') AND v.artikel='".$artikel."' AND (v.adresse='$adresse' $sql_erweiterung) ORDER by ab_menge ASC, preis DESC LIMIT 1"); } if(empty($vkarr)) { return false; } $letzte_menge = 0;//$vkarr[0][ab_menge]; foreach($vkarr as $vkrow) { if($vkrow['adresse']==$adresse && $vkrow['adresse']>0 && $vkrow['art']==='Kunde') { return true; } if($vkrow['gruppe'] > 0 && $vkrow['art']==='Gruppe') { return true; } } return false; } var $preisliste; function GeneratePreisliste($artikel,$adresse,$rabatt=0, $waehrung = '') { $waehrungorig = $waehrung; $sqlwaehrung = ""; if($waehrung <> '') { if($waehrung == 'EUR') { $sqlwaehrung = " AND (v.waehrung = '$waehrung' OR v.waehrung = '') "; }else{ $sqlwaehrung = " AND v.waehrung = '$waehrung' "; } } $sqlwaehrung2 = $sqlwaehrung; if($waehrungorig == '')$sqlwaehrung2 = ''; $vkarr = null; $guenstigste_vk = $this->Firmendaten('guenstigste_vk'); $keinrabatterlaubt = $this->app->DB->Select("SELECT keinrabatterlaubt FROM artikel WHERE id='".$artikel."' LIMIT 1"); $gruppenarray = $this->GetGruppen($adresse); if($gruppenarray) { if((!empty($gruppenarray)?count($gruppenarray):0)>0) $sql_erweiterung = " OR "; for($gi=0;$gi<(!empty($gruppenarray)?count($gruppenarray):0);$gi++) { $sql_erweiterung .= " gruppe='" . $gruppenarray[$gi] . "' "; if ($gi < (!empty($gruppenarray)?count($gruppenarray):0) - 1) $sql_erweiterung .= " OR "; } } if(is_null($rabatt)) { $rabatt = 0; } if(!$guenstigste_vk) { $vkarr = $this->app->DB->SelectArr("SELECT v.*,if((v.adresse > 0 OR v.gruppe > 0),v.preis,(v.preis*(100-$rabatt))/100.0) as rabattpreis FROM verkaufspreise v WHERE (v.gueltig_bis > NOW() OR v.gueltig_bis='0000-00-00') AND (v.gueltig_ab <= CURDATE() OR v.gueltig_ab='0000-00-00') $sqlwaehrung2 AND v.artikel='".$artikel."' AND (v.adresse='$adresse' AND v.art='Kunde') ORDER by rabattpreis ASC"); if(!$vkarr) { $vkarr = $this->app->DB->SelectArr("SELECT v.*,if((v.adresse > 0 OR v.gruppe > 0),v.preis,(v.preis*(100-$rabatt))/100.0) as rabattpreis FROM verkaufspreise v WHERE (v.gueltig_bis > NOW() OR v.gueltig_bis='0000-00-00') AND (v.gueltig_ab <= CURDATE() OR v.gueltig_ab='0000-00-00') $sqlwaehrung2 AND v.artikel='".$artikel."' AND (v.adresse='$adresse' $sql_erweiterung ) ORDER by rabattpreis ASC"); } } if(!$vkarr) { // reinsortieren $vkarr = $this->app->DB->SelectArr("SELECT v.*,if((v.adresse > 0 OR v.gruppe > 0),v.preis,(v.preis*(100-$rabatt))/100.0) as rabattpreis FROM verkaufspreise v WHERE (v.gueltig_bis > NOW() OR v.gueltig_bis='0000-00-00') AND (v.gueltig_ab <= CURDATE() OR v.gueltig_ab='0000-00-00') AND v.artikel='".$artikel."' $sqlwaehrung2 AND (v.adresse='$adresse' $sql_erweiterung OR ((v.adresse='' OR v.adresse='0') AND v.art='Kunde')) ORDER by rabattpreis ASC"); } $letzter_preis = 0; // einmal rueckwaerts aufraeumen $cvkarr = !empty($vkarr)?count($vkarr):0; for($vi=0;$vi<$cvkarr;$vi++) { // rabatt rausrechnen if($keinrabatterlaubt!="1") $vkarr[$vi]['preis'] = $vkarr[$vi]['rabattpreis']; if($vkarr[$vi]['preis'] > $letzter_preis && (($vkarr[$vi]['ab_menge'] < $letzte_menge) || $vi==0)) { // preis behalten $letzte_menge = $vkarr[$vi]['ab_menge']; $letzter_preis = $vkarr[$vi]['preis']; } else { // preis loeschen $vkarr[$vi]['ab_menge']=0; $vkarr[$vi]['preis']=0; } } for($vi=0;$vi<$cvkarr;$vi++) { if($vkarr[$vi]['ab_menge'] > 0) $vkarr2[] = $vkarr[$vi]; } if (!is_null($vkarr2)) { $vkarr = array_reverse($vkarr2); } else { $vkarr = $vkarr2; } // an schluss pruefen und unnötige rausschmeissen return $vkarr; } /** * @param int $artikel * @param float $menge * @param int $gruppe * @param null|string $waehrung * * @return array|null */ public function getVerkaufspreisGruppeArr($artikel, $menge, $gruppe, $waehrung = null) { $vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <='$menge' AND (v.gueltig_bis >= CURDATE() OR ifnull(v.gueltig_bis,'0000-00-00')='0000-00-00') AND (v.gueltig_ab <= curdate() OR ifnull(v.gueltig_ab,'0000-00-00')='0000-00-00') AND v.artikel='".$artikel."' AND v.gruppe='$gruppe' AND v.art='Gruppe' ".($waehrung===null?'':" AND v.waehrung = '$waehrung' ")." ORDER by ab_menge DESC, preis ASC"); if(!$vkarr && ($menge < 1)) { $vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <=1 AND (v.gueltig_bis >= CURDATE() OR ifnull(v.gueltig_bis,'0000-00-00')='0000-00-00') AND (v.gueltig_ab <= curdate() OR ifnull(v.gueltig_ab,'0000-00-00')='0000-00-00') AND v.artikel='".$artikel."' AND v.gruppe='$gruppe' AND v.art='Gruppe' ".($waehrung===null?'':" AND v.waehrung = '$waehrung' ")." ORDER by ab_menge DESC, preis ASC"); } if(empty($vkarr)) { return null; } $letzte_menge = -1; //$vkarr[0][ab_menge]; $letzter_preis = 99999999999; foreach($vkarr as $vk) { if(($vk['ab_menge'] > $letzte_menge) && ($vk['preis']<$letzter_preis) && (($menge < 1?1:$menge) >= $vk['ab_menge'])) { $letzte_menge = $vk['ab_menge']; $letzter_preis = $vk['preis']; $letztesarr = $vk; } } if(isset($letztesarr)) { return $letztesarr; } return null; } function GetVerkaufspreisGruppe($artikel, $menge, $gruppe = 0,$waehrung='EUR') { $vkarr = null; if($gruppe) { $vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <='$menge' AND (v.gueltig_bis >= CURDATE() OR ifnull(v.gueltig_bis,'0000-00-00')='0000-00-00') AND (v.gueltig_ab <= curdate() OR ifnull(v.gueltig_ab,'0000-00-00')='0000-00-00') AND v.artikel='".$artikel."' AND v.gruppe='$gruppe' AND v.art='Gruppe' ORDER by ab_menge DESC, preis ASC"); if(!$vkarr && ($menge < 1))$vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <=1 AND (v.gueltig_bis >= CURDATE() OR ifnull(v.gueltig_bis,'0000-00-00')='0000-00-00') AND (v.gueltig_ab <= curdate() OR ifnull(v.gueltig_ab,'0000-00-00')='0000-00-00') AND v.artikel='".$artikel."' AND v.gruppe='$gruppe' AND v.art='Gruppe' ORDER by ab_menge DESC, preis ASC"); } if(!$vkarr) { return $this->GetVerkaufspreis($artikel, $menge, 0, $waehrung); } $letzte_menge = -1; //$vkarr[0][ab_menge]; $letzter_preis = 99999999999; for($vi=0;$vi<(!empty($vkarr)?count($vkarr):0);$vi++) { if(($vkarr[$vi]['ab_menge'] > $letzte_menge) && ($vkarr[$vi]['preis']<$letzter_preis) && (($menge < 1?1:$menge) >= $vkarr[$vi]['ab_menge'])) { $letzte_menge = $vkarr[$vi]['ab_menge']; $letzter_preis = $vkarr[$vi]['preis']; if($returnarr)$letztesarr = $vkarr[$vi]; } } if($returnarr) { if(isset($letztesarr))return $letztesarr; return null; } if($letzter_preis==99999999999) $letzter_preis=0; return $letzter_preis; } function GetVerkaufspreisKunde($artikel,$menge,$adresse=0,$waehrung='EUR',$returnarr = false) { $vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <='$menge' AND (v.gueltig_bis >= CURDATE() OR ifnull(v.gueltig_bis,'0000-00-00')='0000-00-00') AND (v.gueltig_ab <= curdate() OR ifnull(v.gueltig_ab,'0000-00-00')='0000-00-00') AND v.artikel='".$artikel."' AND v.adresse='$adresse' AND v.art='Kunde' ORDER by ab_menge DESC, preis ASC"); if(!$vkarr && ($menge < 1))$vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <=1 AND (v.gueltig_bis >= CURDATE() OR ifnull(v.gueltig_bis,'0000-00-00')='0000-00-00') AND (v.gueltig_ab <= curdate() OR ifnull(v.gueltig_ab,'0000-00-00')='0000-00-00') AND v.artikel='".$artikel."' AND v.adresse='$adresse' AND v.art='Kunde' ORDER by ab_menge DESC, preis ASC"); $letzte_menge = -1; //$vkarr[0][ab_menge]; $letzter_preis = 99999999999; for($vi=0;$vi<(!empty($vkarr)?count($vkarr):0);$vi++) { if(($vkarr[$vi]['ab_menge'] > $letzte_menge) && ($vkarr[$vi]['preis']<$letzter_preis) && (($menge < 1?1:$menge) >= $vkarr[$vi]['ab_menge'])) { $letzte_menge = $vkarr[$vi]['ab_menge']; $letzter_preis = $vkarr[$vi]['preis']; if($returnarr)$letztesarr = $vkarr[$vi]; } } if($returnarr) { if(isset($letztesarr))return $letztesarr; return null; } if($letzter_preis==99999999999) $letzter_preis=0; return $letzter_preis; } function GetVerkaufspreisWaehrung($artikel,$menge,$adresse=0) { $gruppenarr = $this->GetGruppen($adresse); $cgruppenarr = !empty($gruppenarr)?count($gruppenarr):0; for($i=0;$i<$cgruppenarr;$i++) { if($gruppenarr[$i]>0) $sql_erweiterung .= " OR gruppe='".$gruppenarr[$i]."' "; } $vkarr = null; $guenstigste_vk = $this->Firmendaten('guenstigste_vk'); $gruppenarr = $this->GetGruppen($adresse); $cgruppenarr = !empty($gruppenarr)?count($gruppenarr):0; for($i=0;$i<$cgruppenarr;$i++) { if($gruppenarr[$i]>0) $sql_erweiterung .= " OR gruppe='".$gruppenarr[$i]."' "; } if(!$guenstigste_vk) { $vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <='$menge' AND (v.gueltig_bis >= CURDATE() OR ifnull(v.gueltig_bis,'0000-00-00')='0000-00-00') AND (v.gueltig_ab <= CURDATE() OR ifnull(v.gueltig_ab,'0000-00-00')='0000-00-00') AND v.artikel='".$artikel."' AND (v.adresse='$adresse' AND v.art='Kunde') ORDER by preis ASC, ab_menge DESC"); if(!$vkarr && ($menge < 1))$vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <= 1 AND (v.gueltig_bis >= CURDATE() OR ifnull(v.gueltig_bis,'0000-00-00')='0000-00-00') AND (v.gueltig_ab <= CURDATE() OR ifnull(v.gueltig_ab,'0000-00-00')='0000-00-00') AND v.artikel='".$artikel."' AND (v.adresse='$adresse' AND v.art='Kunde') ORDER by preis ASC, ab_menge DESC"); if(!$vkarr) { $vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <='$menge' AND (v.gueltig_bis >= CURDATE() OR ifnull(v.gueltig_bis,'0000-00-00')='0000-00-00') AND (v.gueltig_ab <= CURDATE() OR ifnull(v.gueltig_ab,'0000-00-00')='0000-00-00') AND v.artikel='".$artikel."' AND (v.adresse='$adresse' $sql_erweiterung) ORDER by ab_menge DESC, preis ASC"); if(!$vkarr && ($menge < 1))$this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <=1 AND (v.gueltig_bis >= CURDATE() OR ifnull(v.gueltig_bis,'0000-00-00')='0000-00-00') AND (v.gueltig_ab <= CURDATE() OR ifnull(v.gueltig_ab,'0000-00-00')='0000-00-00') AND v.artikel='".$artikel."' AND (v.adresse='$adresse' $sql_erweiterung) ORDER by ab_menge DESC, preis ASC"); } } if(!$vkarr) { $vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <='$menge' AND (v.gueltig_bis >= CURDATE() OR ifnull(v.gueltig_bis,'0000-00-00')='0000-00-00') AND (v.gueltig_ab <= CURDATE() OR ifnull(v.gueltig_ab,'0000-00-00')='0000-00-00') AND v.artikel='".$artikel."' AND (v.adresse='$adresse' $sql_erweiterung OR ((v.adresse='' OR v.adresse='0') AND v.art='Kunde')) ORDER by ab_menge DESC, preis ASC"); if(!$vkarr && ($menge < 1))$vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <=1 AND (v.gueltig_bis >= CURDATE() OR ifnull(v.gueltig_bis,'0000-00-00')='0000-00-00') AND (v.gueltig_ab <= CURDATE() OR ifnull(v.gueltig_ab,'0000-00-00')='0000-00-00') AND v.artikel='".$artikel."' AND (v.adresse='$adresse' $sql_erweiterung OR ((v.adresse='' OR v.adresse='0') AND v.art='Kunde')) ORDER by ab_menge DESC, preis ASC"); } $letzte_menge = -1; //$vkarr[0][ab_menge]; $letzter_preis = 99999999999; $cvkarr = !empty($vkarr)?count($vkarr):0; for($vi=0;$vi<$cvkarr;$vi++) { if(($vkarr[$vi]['ab_menge'] > $letzte_menge) && ($vkarr[$vi]['preis']<$letzter_preis) && (($menge < 1?1:$menge) >= $vkarr[$vi]['ab_menge'])) { $letzte_menge = $vkarr[$vi]['ab_menge']; $letzter_preis = $vkarr[$vi]['preis']; $waehrung = $vkarr[$vi]['waehrung']; } } return $waehrung; } function GetVerkaufspreisBrutto($artikel,$menge,$adresse=0,$waehrung='EUR', &$returnwaehrung = '') { $tmp = $this->app->DB->SelectArr("SELECT *,nummer as artikelnummer, name_de as artikel_name_de FROM artikel WHERE id='$artikel' LIMIT 1"); $projekt = $tmp[0]['projekt']; if($tmp[0]['umsatzsteuer']=="ermaessigt") $steuer = ($this->GetStandardSteuersatzErmaessigt($projekt) + 100)/100.0; elseif($tmp[0]['umsatzsteuer']=="befreit") $steuer = 1; else $steuer = ($this->GetStandardSteuersatzNormal($projekt) + 100)/100.0; return $this->GetVerkaufspreis($artikel,$menge,$adresse,$waehrung)*$steuer; } function GetSteuersatzBelegpos($doctype, $doctypeid, $pos) { $arr = $this->app->DB->SelectArr("SELECT steuersatz, umsatzsteuer, artikel FROM $doctype"."_position WHERE id = '$pos' LIMIT 1"); if($arr) { if(!is_null($arr[0]['steuersatz']) && $arr[0]['steuersatz'] >= 0)return $arr[0]['steuersatz']; if($arr[0]['umsatzsteuer'] == 'befreit')return 0; if($arr[0]['umsatzsteuer'] == 'ermaessigt')return (float)$this->app->DB->Select("SELECT steuersatz_ermaessigt FROM $doctype WHERE id = '$doctypeid' LIMIT 1"); if($arr[0]['umsatzsteuer'] != '')return (float)$this->app->DB->Select("SELECT steuersatz_normal FROM $doctype WHERE id = '$doctypeid' LIMIT 1"); $umsatzsteuer = $this->app->DB->Select("SELECT umsatzsteuer FROM artikel WHERE id = '".$arr[0]['artikel']."' LIMIT 1"); if($umsatzsteuer == 'befreit')return 0; if($umsatzsteuer == 'ermaessigt')return (float)$this->app->DB->Select("SELECT steuersatz_ermaessigt FROM $doctype WHERE id = '$doctypeid' LIMIT 1"); return (float)$this->app->DB->Select("SELECT steuersatz_normal FROM $doctype WHERE id = '$doctypeid' LIMIT 1"); } } function GetVerkaufspreis($artikel,$menge,$adresse=0,$waehrung='', &$returnwaehrung = '',$returnarr = false, $auchpreisegrmenge = false) { $waehrungold = $waehrung; $firmendatenwaehrung = $this->app->erp->Firmendaten('waehrung'); if($firmendatenwaehrung == '')$firmendatenwaehrung = 'EUR'; if($waehrung == '')$waehrung = $firmendatenwaehrung; if($waehrung == $firmendatenwaehrung) { $extrasql = " AND (v.waehrung = '$waehrung' OR v.waehrung = '') "; }else{ $extrasql = " AND v.waehrung = '$waehrung' "; } $extrasql2 = $extrasql; if($waehrungold == '')$extrasql2 = ''; $vkarr = null; $guenstigste_vk = $this->Firmendaten('guenstigste_vk'); $gruppenarr = $this->GetGruppen($adresse); $sql_erweiterung = ''; if($gruppenarr) { for ($i = 0; $i < (!empty($gruppenarr)?count($gruppenarr):0); $i++) { if ($gruppenarr[$i] > 0) $sql_erweiterung .= " OR gruppe='" . $gruppenarr[$i] . "' "; } } if(!$guenstigste_vk) { $vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <='$menge' AND (v.gueltig_bis >= CURDATE() OR v.gueltig_bis='0000-00-00') AND (v.gueltig_ab <= CURDATE() OR v.gueltig_ab='0000-00-00') AND v.artikel='".$artikel."' $extrasql2 AND (v.adresse='$adresse' AND v.art='Kunde') ORDER by ab_menge DESC, preis ASC"); if(!$vkarr && ($menge < 1))$vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <= 1 AND (v.gueltig_bis >= CURDATE() OR v.gueltig_bis='0000-00-00') AND (v.gueltig_ab <= CURDATE() OR v.gueltig_ab='0000-00-00') AND v.artikel='".$artikel."' $extrasql2 AND (v.adresse='$adresse' AND v.art='Kunde') ORDER by ab_menge DESC, preis ASC"); if(!$vkarr) { $vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <='$menge' AND (v.gueltig_bis >= CURDATE() OR v.gueltig_bis='0000-00-00') AND (v.gueltig_ab <= CURDATE() OR v.gueltig_ab='0000-00-00') AND v.artikel='".$artikel."' $extrasql2 AND ((v.art <> 'Kunde' AND (0 $sql_erweiterung )) OR ((v.adresse='$adresse') AND v.art='Kunde')) ORDER by ab_menge DESC, preis ASC"); if(!$varr && ($menge < 1)) { $vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <= 1 AND (v.gueltig_bis >= CURDATE() OR ifnull(v.gueltig_bis,'0000-00-00')='0000-00-00') AND (v.gueltig_ab <= CURDATE() OR ifnull(v.gueltig_ab,'0000-00-00')='0000-00-00') AND v.artikel='".$artikel."' $extrasql2 AND ((v.art <> 'Kunde' AND (0 $sql_erweiterung )) OR ((v.adresse='$adresse') AND v.art='Kunde')) ORDER by ab_menge DESC, preis ASC"); } } } if(!$vkarr) { $vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <='$menge' AND (v.gueltig_bis >= CURDATE() OR ifnull(v.gueltig_bis,'0000-00-00')='0000-00-00') AND (v.gueltig_ab <= CURDATE() OR ifnull(v.gueltig_ab,'0000-00-00')='0000-00-00') AND v.artikel='".$artikel."' $extrasql AND ((v.art <> 'Kunde' AND (0 $sql_erweiterung )) OR ((v.adresse='' OR v.adresse='0' OR v.adresse='$adresse') AND v.art='Kunde')) ORDER by preis ASC, ab_menge DESC"); if(!$vkarr && ($menge < 1)) { $vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE v.ab_menge <=1 AND (v.gueltig_bis >= CURDATE() OR ifnull(v.gueltig_bis,'0000-00-00')='0000-00-00') AND (v.gueltig_ab <= CURDATE() OR ifnull(v.gueltig_ab,'0000-00-00')='0000-00-00') AND v.artikel='".$artikel."' $extrasql AND ((v.art <> 'Kunde' AND (0 $sql_erweiterung )) OR ((v.adresse='' OR v.adresse='0' OR v.adresse='$adresse') AND v.art='Kunde')) ORDER by preis ASC, ab_menge DESC"); } } if(!$vkarr && $auchpreisegrmenge){ $vkarr = $this->app->DB->SelectArr("SELECT * FROM verkaufspreise v WHERE (v.gueltig_bis >= CURDATE() OR ifnull(v.gueltig_bis,'0000-00-00')='0000-00-00') AND (v.gueltig_ab <= CURDATE() OR ifnull(v.gueltig_ab,'0000-00-00')='0000-00-00') AND v.artikel='".$artikel."' $extrasql AND ((v.art <> 'Kunde' AND (0 $sql_erweiterung )) OR ((v.adresse='' OR v.adresse='0' OR v.adresse='$adresse') AND v.art='Kunde')) ORDER by ab_menge ASC LIMIT 1"); }else{ $auchpreisegrmenge = false; } $letzte_menge = -1; //$vkarr[0][ab_menge]; $letzter_preis = 99999999999; if($vkarr) { for($vi=0;$vi<(!empty($vkarr)?count($vkarr):0);$vi++) { if(($vkarr[$vi]['ab_menge'] > $letzte_menge) && ($vkarr[$vi]['preis']<$letzter_preis) && ((($menge >= 1?$menge:1) >= $vkarr[$vi]['ab_menge'])|| $auchpreisegrmenge)) { $letzte_menge = $vkarr[$vi]['ab_menge']; $letzter_preis = $vkarr[$vi]['preis']; $letzte_gruppe = $vkarr[$vi]['gruppe']; if($returnarr)$letztesarr = $vkarr[$vi]; $returnwaehrung = $vkarr[$vi]['waehrung']?$vkarr[$vi]['waehrung']:'EUR'; } } } if($letzter_preis==99999999999) $letzter_preis=0; if($returnarr) { if(isset($letztesarr))return $letztesarr; return null; } return $letzter_preis; } function GetEinkaufspreisStatistikWaehrung($id,$waehrung = '', $max=false, $lvl = 0) { if($lvl > 5)return 0; //Falls Einkaufspreis definiert $menge = 1; $eka = $this->app->DB->SelectArr("SELECT preis, waehrung FROM einkaufspreise WHERE artikel='$id' AND adresse='$adresse' AND ab_menge<='$menge' AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') AND geloescht=0 ORDER BY waehrung = '$waehrung' DESC, waehrung = '', ab_menge DESC, preis ".($max?'DESC':'ASC')." LIMIT 1"); if(!$eka)$eka = $this->app->DB->SelectArr("SELECT preis, waehrung FROM einkaufspreise WHERE artikel='$id' AND ab_menge<='$menge' AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') AND geloescht=0 ORDER BY waehrung = '$waehrung' DESC, waehrung = '', ab_menge DESC LIMIT 1"); if(!$eka)$eka = $this->app->DB->SelectArr("SELECT preis, waehrung FROM einkaufspreise WHERE artikel='$id' AND (gueltig_bis>=NOW() OR gueltig_bis='0000-00-00') AND geloescht=0 ORDER BY waehrung = '$waehrung' DESC, waehrung = '', ab_menge DESC LIMIT 1"); $originalwaehrung = $eka[0]['waehrung']; $originalpreis = $eka[0]['preis']; if($eka[0]['waehrung'] == $waehrung)return $originalpreis; $ep = $originalpreis * $this->GetWaehrungUmrechnungskurs($originalwaehrung,$waehrung); if($ep)return $ep; $sql = "SELECT FORMAT( SUM( ( SELECT e.preis * if(e.waehrung != '',ifnull( (SELECT kurs FROM waehrung_umrechnung WHERE waehrung_von = '$waehrung' AND waehrung_nach = e.waehrung AND (gueltig_bis >= curdate() OR isnull(gueltig_bis) OR gueltig_bis = '0000-00-00' ) LIMIT 1), ifnull((SELECT 1/kurs FROM waehrung_umrechnung WHERE waehrung_nach = '$waehrung' AND waehrung_von = e.waehrung AND (gueltig_bis >= curdate() OR isnull(gueltig_bis) OR gueltig_bis = '0000-00-00' ) LIMIT 1),1)), ifnull((SELECT kurs FROM waehrung_umrechnung WHERE waehrung_von = '$waehrung' AND waehrung_nach = 'EUR' AND (gueltig_bis >= curdate() OR isnull(gueltig_bis) OR gueltig_bis = '0000-00-00' ) LIMIT 1), ifnull((SELECT 1/kurs FROM waehrung_umrechnung WHERE waehrung_nach = '$waehrung' AND waehrung_von = 'EUR' AND (gueltig_bis >= curdate() OR isnull(gueltig_bis) OR gueltig_bis = '0000-00-00' ) LIMIT 1),1)) ) FROM einkaufspreise e WHERE e.artikel=s.artikel AND (e.objekt='Standard' OR e.objekt='') ORDER BY waehrung = '$waehrung' DESC, waehrung = '' DESC, preis ".($min?'ASC':'DESC')." LIMIT 1 ) *s.menge) ,2) FROM stueckliste s LEFT JOIN artikel a ON a.id=s.artikel WHERE s.stuecklistevonartikel='$id'"; $preis = $this->app->DB->Select($sql); //Kein Einkaufspreis definiert => Stückliste $sql = "SELECT s.artikel FROM stueckliste s LEFT JOIN artikel a ON a.id=s.artikel WHERE s.stuecklistevonartikel='$id' and a.stueckliste = '1' "; $startikel = $this->app->DB->SelectArr($sql); if($startikel) { foreach($startikel as $art) $preis += $this->GetEinkaufspreisStatistikWaehrung($art['artikel'],$waehrung,$max, $lvl + 1); } return $preis; } function GetEinkaufspreisStatistik($id,$max=false, $lvl = 0) { if($lvl > 5)return 0; //Falls Einkaufspreis definiert if($max) { $ep = $this->app->DB->Select("SELECT FORMAT(MAX(e.preis),2) FROM einkaufspreise e where e.artikel = $id AND (e.objekt='Standard' OR e.objekt='')"); if($ep)return $ep; } else { $ep = $this->app->DB->Select("SELECT FORMAT(MIN(e.preis),2) FROM einkaufspreise e where e.artikel = $id AND (e.objekt='Standard' OR e.objekt='')"); if($ep)return $ep; } //Kein Einkaufspreis definiert => Stückliste if($max) { $preis_max = 0; $ids = $this->app->DB->SelectArr("SELECT s.artikel from stueckliste s LEFT JOIN artikel a ON a.id=s.artikel WHERE s.stuecklistevonartikel='$id' and a.stueckliste != '1' "); if($ids) { foreach($ids as $v)$subwherea[] = $v['artikel']; $swhere = " (a.id = ". implode(' OR a.id = ',$subwherea).")"; $sql = " SELECT format( SUM(if (ep>0,ep,vp)),2) from (SELECT MAX(e.preis) as ep, MAX(v.preis) vp FROM artikel a left join einkaufspreise e on a.id = e.artikel left join verkaufspreise v on a.id = v.artikel WHERE $swhere ) q "; $preis_max = $this->app->DB->Select($sql); } $sql = "SELECT s.artikel FROM stueckliste s LEFT JOIN artikel a ON a.id=s.artikel WHERE s.stuecklistevonartikel='$id' and a.stueckliste = '1' "; $startikel = $this->app->DB->SelectArr($sql); if($startikel) { foreach($startikel as $art) $preis_max += $this->GetEinkaufspreisStatistik($art['artikel'],$max, $lvl + 1); } return $preis_max; } $sql = " SELECT format( SUM(if (ep>0,ep,vp)),2) from (SELECT MIN(e.preis) as ep, MIN(v.preis) vp FROM artikel a left join einkaufspreise e on a.id = e.artikel left join verkaufspreise v on a.id = v.artikel WHERE a.id in ( SELECT s.artikel from stueckliste s LEFT JOIN artikel a ON a.id=s.artikel WHERE s.stuecklistevonartikel='$id' and a.stueckliste != '1') ) q"; $preis = $this->app->DB->Select($sql); $sql = "SELECT s.artikel FROM stueckliste s LEFT JOIN artikel a ON a.id=s.artikel WHERE s.stuecklistevonartikel='$id' and a.stueckliste = '1' "; $startikel = $this->app->DB->SelectArr($sql); if($startikel) { foreach($startikel as $art) $preis += $this->GetEinkaufspreisStatistik($art['artikel'],$max, $lvl + 1); } return $preis; } function GetEinkaufspreisStuecklisteWaehrung($id, $waehrung = '', $min = false) { if($waehrung == '')$waehrung = 'EUR'; $sql = "SELECT SUM( ( SELECT e.preis * if(e.waehrung != '',ifnull( (SELECT kurs FROM waehrung_umrechnung WHERE waehrung_von = '$waehrung' AND waehrung_nach = e.waehrung AND (gueltig_bis >= curdate() OR isnull(gueltig_bis) OR gueltig_bis = '0000-00-00' ) LIMIT 1), ifnull((SELECT 1/kurs FROM waehrung_umrechnung WHERE waehrung_nach = '$waehrung' AND waehrung_von = e.waehrung AND (gueltig_bis >= curdate() OR isnull(gueltig_bis) OR gueltig_bis = '0000-00-00' ) LIMIT 1),1)), ifnull((SELECT kurs FROM waehrung_umrechnung WHERE waehrung_von = '$waehrung' AND waehrung_nach = 'EUR' AND (gueltig_bis >= curdate() OR isnull(gueltig_bis) OR gueltig_bis = '0000-00-00' ) LIMIT 1), ifnull((SELECT 1/kurs FROM waehrung_umrechnung WHERE waehrung_nach = '$waehrung' AND waehrung_von = 'EUR' AND (gueltig_bis >= curdate() OR isnull(gueltig_bis) OR gueltig_bis = '0000-00-00' ) LIMIT 1),1)) ) FROM einkaufspreise e WHERE e.artikel=s.artikel AND (e.objekt='Standard' OR e.objekt='') AND (e.gueltig_bis >= CURDATE() OR ifnull(e.gueltig_bis, '0000-00-00') = '0000-00-00') ORDER BY waehrung = '$waehrung' DESC, waehrung = '' DESC, preis ".($min?'ASC':'DESC')." LIMIT 1 ) *s.menge) FROM stueckliste s LEFT JOIN artikel a ON a.id=s.artikel WHERE s.stuecklistevonartikel='$id'"; $preis_max = round((float)$this->app->DB->Select($sql),2); $sql = "SELECT SUM( ( SELECT e.preis * if(e.waehrung != '',ifnull( (SELECT kurs FROM waehrung_umrechnung WHERE waehrung_von = '$waehrung' AND waehrung_nach = e.waehrung AND (gueltig_bis >= curdate() OR isnull(gueltig_bis) OR gueltig_bis = '0000-00-00' ) LIMIT 1), ifnull((SELECT 1/kurs FROM waehrung_umrechnung WHERE waehrung_nach = '$waehrung' AND waehrung_von = e.waehrung AND (gueltig_bis >= curdate() OR isnull(gueltig_bis) OR gueltig_bis = '0000-00-00' ) LIMIT 1),1)), ifnull((SELECT kurs FROM waehrung_umrechnung WHERE waehrung_von = '$waehrung' AND waehrung_nach = 'EUR' AND (gueltig_bis >= curdate() OR isnull(gueltig_bis) OR gueltig_bis = '0000-00-00' ) LIMIT 1), ifnull((SELECT 1/kurs FROM waehrung_umrechnung WHERE waehrung_nach = '$waehrung' AND waehrung_von = 'EUR' AND (gueltig_bis >= curdate() OR isnull(gueltig_bis) OR gueltig_bis = '0000-00-00' ) LIMIT 1),1)) ) FROM verkaufspreise e WHERE e.artikel=s.artikel AND (e.objekt='Standard' OR e.objekt='') AND (e.gueltig_bis >= CURDATE() OR ifnull(e.gueltig_bis, '0000-00-00') = '0000-00-00') ORDER BY waehrung = '$waehrung' DESC, waehrung = '' DESC, preis ".($min?'ASC':'DESC')." LIMIT 1 ) *s.menge) FROM stueckliste s LEFT JOIN artikel a ON a.id=s.artikel WHERE s.stuecklistevonartikel='$id' AND a.stueckliste = 1"; return round($preis_max + (float)$this->app->DB->Select($sql),2); } function GetEinkaufspreisStueckliste($id,$max=false) { $sql = "SELECT SUM( (SELECT MAX(e.preis) FROM einkaufspreise e WHERE e.artikel=s.artikel AND (e.gueltig_bis>=NOW() OR e.gueltig_bis='0000-00-00') AND e.geloescht=0)*s.menge) FROM stueckliste s LEFT JOIN artikel a ON a.id=s.artikel WHERE s.stuecklistevonartikel='$id'"; $preis_max = $this->app->DB->Select($sql); $sql = "SELECT SUM( (SELECT MAX(v.preis) FROM verkaufspreise v WHERE v.artikel=s.artikel AND a.stueckliste=1 AND (v.objekt='Standard' OR v.objekt=''))*s.menge) FROM stueckliste s LEFT JOIN artikel a ON a.id=s.artikel WHERE s.stuecklistevonartikel='$id'"; $preis_max = $preis_max + $this->app->DB->Select($sql); $sql = "SELECT SUM( (SELECT MIN(e.preis) FROM einkaufspreise e WHERE e.artikel=s.artikel AND (e.gueltig_bis>=NOW() OR e.gueltig_bis='0000-00-00') AND e.geloescht=0)*s.menge) FROM stueckliste s LEFT JOIN artikel a ON a.id=s.artikel WHERE s.stuecklistevonartikel='$id'"; $preis = $this->app->DB->Select($sql); $sql = "SELECT SUM( (SELECT MIN(v.preis) FROM verkaufspreise v WHERE v.artikel=s.artikel AND a.stueckliste=1 AND (v.objekt='Standard' OR v.objekt=''))*s.menge) FROM stueckliste s LEFT JOIN artikel a ON a.id=s.artikel WHERE s.stuecklistevonartikel='$id'"; $preis = $preis + $this->app->DB->Select($sql); if($max) return $preis_max; else return $preis; } /** * @param string $name Filename * @param string $base64encoded if true return base64_encoded File * @return string Filecontent */ public function getSettingsFile($name, $base64encoded = false) { if(empty($name)) { return ''; } $pfad = $this->GetUSERDATA().'/dms/'.$this->app->Conf->WFdbname.'/'.$name; if(!is_file($name)) { $ret = $this->Firmendaten($name); if(empty($ret)) { return ''; } if($base64encoded) { return $ret; } return base64_decode($ret); } $ret = (String)file_get_contents($pfad); if(!$base64encoded) { return $ret; } return base64_encode($ret); } /** * @param array $file File from Formr * @param string $name Filename * @return array|bool content and type or false if failed */ public function uploadSettigsFile($file, $name) { if(empty($file) || empty($name) || empty($file['tmp_name'])) { return false; } $pfad = $file['tmp_name']; $dbtype = mime_content_type($pfad); // Bild hochladen $filehandle = fopen($pfad,'r'); if(!empty($filehandle)){ $filedata = fread($filehandle, @filesize($pfad)); fclose($filehandle); }else{ return false; } $pfad2 = $this->GetUSERDATA(); if(!is_dir($pfad2)) { if(!mkdir($pfad2) && !is_dir($pfad2)) { return false; } } $pfad2 .= '/dms/'; if(!is_dir($pfad2)) { if(!mkdir($pfad2) && !is_dir($pfad2)) { return false; } } $pfad2 .= $this->app->Conf->WFdbname; if(!is_dir($pfad2)) { if(!mkdir($pfad2) && !is_dir($pfad2)) { return false; } } if(file_put_contents($pfad2.'/'.$name,$filedata)) { return array('file'=>base64_encode($filedata),'type'=>$dbtype); } return false; } public function uploadFileIntoDB($file) { // Wandelt ein Bild fuer einen LONGBLOB um $pfad = $file['tmp_name']; $dbtype = mime_content_type($pfad); // Bild hochladen $filehandle = fopen($pfad,'r'); $filedata = base64_encode(fread($filehandle, @filesize($pfad))); fclose($filehandle); return array('file'=>$filedata,'type'=>$dbtype); } // im format hh:mm public function ZeitinMenge($zeit) { $zeit = explode(':', $zeit); $komma = round(100/(60/$zeit[1]),0); $komma = str_pad($komma, 2 ,'0', STR_PAD_LEFT); return $zeit[0].','.$komma; } function get_time_difference($start_time_o, $end_time_o){ $start_time = explode(':', $start_time_o); $end_time = explode(':', $end_time_o); $start_time_stamp = mktime($start_time[0], $start_time[1], 0, 0, 0, 0); $end_time_stamp = mktime($end_time[0], $end_time[1], 0, 0, 0, 0); $time_difference = $end_time_stamp - $start_time_stamp; return gmdate('H:i', $time_difference); } function is_html($str){ $html = array('A','ABBR','ACRONYM','ADDRESS','APPLET','AREA','B','BASE','BASEFONT','BDO','BIG','BLOCKQUOTE','BODY','BR','BUTTON','CAPTION','CENTER','CITE','CODE','COL','COLGROUP','DD','DEL','DFN','DIR','DIV','DL','DT','EM','FIELDSET','FONT','FORM','FRAME','FRAMESET','H1','H2','H3','H4','H5','H6','HEAD','HR','HTML','I','IFRAME','IMG','INPUT','INS','ISINDEX','KBD','LABEL','LEGEND','LI','LINK','MAP','MENU','META','NOFRAMES','NOSCRIPT','OBJECT','OL','OPTGROUP','OPTION','P','PARAM','PRE','Q','S','SAMP','SCRIPT','SELECT','SMALL','SPAN','STRIKE','STRONG','STYLE','SUB','SUP','TABLE','TBODY','TD','TEXTAREA','TFOOT','TH','THEAD','TITLE','TR','TT','U','UL','VAR'); return preg_match_all("~(<\/?)\b(".implode('|',$html).")\b([^>]*>)~i",$str,$c); } function ImportCreateLieferadresse($adresse,$data) { $this->app->DB->Insert("INSERT INTO lieferadressen (id,adresse) VALUES ('','$adresse')"); $id = $this->app->DB->GetInsertID(); if($data['land']=="") $data['land']='DE'; foreach ($data as $key => $value) { $this->app->DB->Update("UPDATE lieferadressen SET $key='".$this->app->DB->real_escape_string($value)."' WHERE id='$id' LIMIT 1"); } return $id; } function ImportCreateAnsprechpartner($adresse,$data) { $this->app->DB->Insert("INSERT INTO ansprechpartner (id,adresse) VALUES ('','$adresse')"); $id = $this->app->DB->GetInsertID(); if (!empty($id)) { $this->app->erp->RunHook('contact_person_created', 1, $id); } if($data['land']=="") $data['land']='DE'; foreach ($data as $key => $value) { $this->app->DB->Update("UPDATE ansprechpartner SET $key='".$this->app->DB->real_escape_string($value)."' WHERE id='$id' LIMIT 1"); } return $id; } function ImportCreateAdresse($data, $uf8 = true) { $this->app->DB->Insert("INSERT INTO adresse (id) VALUES ('')"); $id = $this->app->DB->GetInsertID(); if($data['firma']=="") $data['firma']=1; if($data['projekt']=="") $data['projekt']=1; $columns = $this->app->DB->GetColArray("adresse"); foreach ($columns as $keyi => $columnname) $arr_columns[] = $columnname; foreach ($data as $key => $value) { if(in_array($key, $arr_columns)) { if($tmp_fields!="") $tmp_fields .=","; if($uf8) { $tmp_fields .= " $key='".$this->ConvertForDBUTF8($value)."' "; } else { $tmp_fields .= " $key='".$value."' "; } } } $this->app->DB->Update("UPDATE adresse SET $tmp_fields WHERE id='$id'"); return $id; } function ImportCreateArtikel($data, $utf8 = true) { $this->app->DB->Insert("INSERT INTO artikel (id) VALUES ('')"); $id = $this->app->DB->GetInsertID(); if($data['firma']=="") $data['firma']=1; if($data['projekt']=="") $data['projekt']=1; foreach ($data as $key => $value) { if($utf8) { $this->app->DB->Update("UPDATE artikel SET $key='".$this->ConvertForDBUTF8($value)."' WHERE id='$id' LIMIT 1"); }else{ $this->app->DB->Update("UPDATE artikel SET $key='".$this->app->DB->real_escape_string( $value)."' WHERE id='$id' LIMIT 1"); } } return $id; } // nicht mehr verwenden function ImportCreateEinkaufspreis($data) { $this->app->DB->Insert("INSERT INTO einkaufspreise (id) VALUES ('')"); $id = $this->app->DB->GetInsertID(); if($data['firma']=="") $data['firma']=1; if($data['projekt']=="") $data['projekt']=1; foreach ($data as $key => $value) { $this->app->DB->Update("UPDATE einkaufspreise SET $key='".$this->ConvertForDBUFT8($value)."' WHERE id='$id' LIMIT 1"); } return $id; } // nicht mehr verwenden function ImportCreateVerkaufspreis($data) { $this->app->DB->Insert("INSERT INTO verkaufspreise (id) VALUES ('')"); $id = $this->app->DB->GetInsertID(); if($data['firma']=="") $data['firma']=1; if($data['projekt']=="") $data['projekt']=1; foreach ($data as $key => $value) { $this->app->DB->Update("UPDATE verkaufspreise SET $key='".$this->ConvertForDBUTF8($value)."' WHERE id='$id' LIMIT 1"); } return $id; } function ImportCreateUser($data) { $this->app->DB->Insert("INSERT INTO user (id) VALUES ('')"); $id = $this->app->DB->GetInsertID(); if($data['firma']=="") $data['firma']=1; if($data['projekt']=="") $data['projekt']=1; foreach ($data as $key => $value) { $this->app->DB->Update("UPDATE user SET $key='".$this->ConvertForDBUTF8($value)."' WHERE id='$id' LIMIT 1"); } return $id; } function ImportCreateBestellung($data) { $this->app->DB->Insert("INSERT INTO bestellung (id,angelegtam) VALUES ('',NOW())"); $id = $this->app->DB->GetInsertID(); if($data['firma']=="") $data['firma']=1; if($data['projekt']=="") $data['projekt']=1; foreach ($data as $key => $value) { $this->app->DB->Update("UPDATE bestellung SET $key='".$this->ConvertForDBUTF8($value)."' WHERE id='$id' LIMIT 1"); } return $id; } function ImportCreateRechnung($data) { $this->app->DB->Insert("INSERT INTO rechnung (id,angelegtam) VALUES ('',NOW())"); $id = $this->app->DB->GetInsertID(); if($data['firma']=="") $data['firma']=1; if($data['projekt']=="") $data['projekt']=1; foreach ($data as $key => $value) { $this->app->DB->Update("UPDATE rechnung SET $key='".$this->ConvertForDBUTF8($value)."' WHERE id='$id' LIMIT 1"); } return $id; } function ImportCreateAngebot($data) { $this->app->DB->Insert("INSERT INTO angebot (id,angelegtam) VALUES ('',NOW())"); $id = $this->app->DB->GetInsertID(); if($data['firma']=="") $data['firma']=1; if($data['projekt']=="") $data['projekt']=1; foreach ($data as $key => $value) { $this->app->DB->Update("UPDATE angebot SET $key='".$this->ConvertForDBUTF8($value)."' WHERE id='$id' LIMIT 1"); } return $id; } function ImportCreateAuftrag($data) { $this->app->DB->Insert("INSERT INTO auftrag (id,angelegtam) VALUES ('',NOW())"); $id = $this->app->DB->GetInsertID(); if($data['firma']=="") $data['firma']=1; if($data['projekt']=="") $data['projekt']=1; foreach ($data as $key => $value) { $this->app->DB->Update("UPDATE auftrag SET $key='".$this->ConvertForDBUTF8($value)."' WHERE id='$id' LIMIT 1"); } return $id; } function ImportCreateLieferschein($data) { $this->app->DB->Insert("INSERT INTO lieferschein (id,angelegtam) VALUES ('',NOW())"); $id = $this->app->DB->GetInsertID(); if($data['firma']=="") $data['firma']=1; if($data['projekt']=="") $data['projekt']=1; foreach ($data as $key => $value) { $this->app->DB->Update("UPDATE lieferschein SET $key='".$this->ConvertForDBUTF8($value)."' WHERE id='$id' LIMIT 1"); } return $id; } function ImportCreateGutschrift($data) { $this->app->DB->Insert("INSERT INTO gutschrift (id,angelegtam) VALUES ('',NOW())"); $id = $this->app->DB->GetInsertID(); if($data['firma']=="") $data['firma']=1; if($data['projekt']=="") $data['projekt']=1; foreach ($data as $key => $value) { $this->app->DB->Update("UPDATE gutschrift SET $key='".$this->ConvertForDBUTF8($value)."' WHERE id='$id' LIMIT 1"); } return $id; } function CheckArtikel($id) { $standardlieferant = $this->app->DB->Select("SELECT adresse FROM artikel WHERE id='$id' LIMIT 1"); $standardlieferant_ek = $this->app->DB->Select("SELECT adresse FROM einkaufspreise WHERE artikel='$id' AND geloescht!=1 AND standard=1 LIMIT 1"); if($standardlieferant <= 0 || ($standardlieferant_ek!=$standardlieferant && $standardlieferant > 0 && $standardlieferant_ek > 0)) { $standardlieferant = $this->app->DB->Select("SELECT adresse FROM einkaufspreise WHERE artikel='$id' AND geloescht!=1 AND (gueltig_bis='0000-00-00' OR gueltig_bis >= NOW()) ORDER by standard DESC LIMIT 1"); if($standardlieferant > 0) { $this->app->DB->Update("UPDATE artikel SET adresse='$standardlieferant' WHERE id='$id' LIMIT 1"); } } } function FirmenDatenStandard() { if($this->app->DB->Select("SELECT COUNT(id) FROM firmendaten") > 0) return; $this->app->DB->Insert("INSERT INTO `firmendaten` (`id`,`firma`, `logo`, `briefpapier`, `signatur`, `datum`, `steuersatz_normal`, `steuersatz_zwischen`, `steuersatz_ermaessigt`, `steuersatz_starkermaessigt`, `steuersatz_dienstleistung`, `deviceserials`, `lizenz`, `schluessel`, `mlm_mindestbetrag`, `mlm_letzter_tag`, `mlm_erster_tag`, `mlm_letzte_berechnung`, `mlm_01`, `mlm_02`, `mlm_03`, `mlm_04`, `mlm_05`, `mlm_06`, `mlm_07`, `mlm_08`, `mlm_09`, `mlm_10`, `mlm_11`, `mlm_12`, `mlm_13`, `mlm_14`, `mlm_15`, `zahlung_rechnung_sofort_de`, `zahlung_rechnung_de`, `zahlung_vorkasse_de`, `zahlung_lastschrift_de`, `zahlung_nachnahme_de`, `zahlung_bar_de`, `zahlung_paypal_de`, `zahlung_amazon_de`, `zahlung_kreditkarte_de`, `zahlung_ratenzahlung_de`, `briefpapier2`, `freifeld1`, `freifeld2`, `freifeld3`, `freifeld4`, `freifeld5`, `freifeld6`, `firmenfarbehell`, `firmenfarbedunkel`, `firmenfarbeganzdunkel`, `navigationfarbe`, `navigationfarbeschrift`, `unternavigationfarbe`, `unternavigationfarbeschrift`, `firmenlogo`, `rechnung_header`, `lieferschein_header`, `angebot_header`, `auftrag_header`, `gutschrift_header`, `bestellung_header`, `arbeitsnachweis_header`, `provisionsgutschrift_header`, `rechnung_footer`, `lieferschein_footer`, `angebot_footer`, `auftrag_footer`, `gutschrift_footer`, `bestellung_footer`, `arbeitsnachweis_footer`, `provisionsgutschrift_footer`, `eu_lieferung_vermerk`, `export_lieferung_vermerk`, `zahlung_amazon_bestellung_de`, `zahlung_billsafe_de`, `zahlung_sofortueberweisung_de`, `zahlung_secupay_de`, `adressefreifeld1`, `adressefreifeld2`, `adressefreifeld3`, `adressefreifeld4`, `adressefreifeld5`, `adressefreifeld6`, `adressefreifeld7`, `adressefreifeld8`, `adressefreifeld9`, `adressefreifeld10`, `zahlung_eckarte_de`, `benutzername`, `passwort`, `host`, `port`,`mailssl`,`devicekey`,`mailanstellesmtp`,`layout_iconbar`,`name`,`firmenfarbe`,`betreffszeile`,`dokumententext`,`bcc1`,`bcc2`) VALUES (1, 1, '', '', 'LS0NCk11c3RlcmZpcm1hIEdtYkgNCk11c3RlcndlZyA1DQpELTEyMzQ1IE11c3RlcnN0YWR0DQoNClRlbCArNDkgMTIzIDEyIDM0IDU2IDcNCkZheCArNDkgMTIzIDEyIDM0IDU2IDc4DQoNCk5hbWUgZGVyIEdlc2VsbHNjaGFmdDogTXVzdGVyZmlybWEgR21iSA0KU2l0eiBkZXIgR2VzZWxsc2NoYWZ0OiBNdXN0ZXJzdGFkdA0KDQpIYW5kZWxzcmVnaXN0ZXI6IE11c3RlcnN0YWR0LCBIUkIgMTIzNDUNCkdlc2Now6RmdHNmw7xocnVuZzogTWF4IE11c3Rlcm1hbg0KVVN0LUlkTnIuOiBERTEyMzQ1Njc4OQ0KDQpBR0I6IGh0dHA6Ly93d3cubXVzdGVyZmlybWEuZGUvDQo=', '0000-00-00 00:00:00', 19.00, 7.00, 7.00, 7.00, 7.00, '', '', '', 50.00, NULL, NULL, NULL, 15.00, 20.00, 28.00, 32.00, 36.00, 40.00, 44.00, 44.00, 44.00, 44.00, 50.00, 54.00, 45.00, 48.00, 60.00, 'Rechnung zahlbar sofort.', 'Rechnung zahlbar innerhalb {ZAHLUNGSZIELTAGE} Tage bis zum {ZAHLUNGBISDATUM}.', '', '', '', '', '', '', '', '', NULL, '', '', '', '', '', '', '', '', '', '#e0e0e0', '#686868', '', '', NULL, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '','mustermann3','passwort','smtp.ihr_mail_server.de','25','1','','0','0','Musterfirma GmbH','#ececec','9','9','',''"); $tmpid = $this->app->DB->GetInsertID(); $obj = $this->app->erp->LoadModul('firmendaten'); if($obj)$obj->FirmendatenBriefpapiervorlage(); } function pruefeDBgen($echo = false) { $dir = dirname(__FILE__).'/../objectapi/mysql/_gen'; if(file_exists($dir)) { if ($handle = opendir($dir)) { while (false !== ($entry = readdir($handle))) { if(strpos($entry, 'object.gen.') !== false) { $table = str_replace('.php','',str_replace('object.gen.','',$entry)); $Felder = $this->app->DB->SelectArr("Describe ".addslashes($table)); if(true) { if(isset($class_methods))unset($class_methods); if($fh = fopen($dir.'/'.$entry, 'r')) { $classfound = false; $fertig = false; while(!$fertig && $line = fgets($fh)) { if($classfound) { if(strpos($line, '=') !== false) { $funktion = trim(substr($line, 0,strpos($line, '='))); $class_methods[] = str_replace(';','',$funktion); } elseif(strpos($line, '$this->app->DB->Update') !== false) { $fertig = true; } } else { if(strpos($line,'$sql = "UPDATE') !== false) { $classfound = true; } } } fclose($fh); } $class = 'ObjGen'.ucfirst($table); } if($Felder) { //if(!class_exists($class)) include_once($dir.'/'.$entry); //$tmp = ; //if(class_exists($class)){ if($classfound && isset($class_methods)) { //$class_methods = get_class_methods(new $class($this->app)); //$class_methods = get_class_methods($class); //echo "Class: ".$class."\r\n"; foreach($class_methods as $key => $val) { if(strpos($val,'Get') !== false) { $found = false; foreach($Felder as $k => $v) { if('get'.strtolower($v['Field']) == strtolower($val))$found = true; } if(!$found)$Feldnichtgefunden[$table][] = $val; //echo "Feld ".substr($val,3)." nicht gefunden\r\n"; } } foreach($Felder as $k => $v) { if($v['Field'] != 'id'){ $found = false; foreach($class_methods as $key => $val) { if(strtolower($v['Field']) == strtolower($val))$found = true; } if(!$found)$keineFunktion[$table][] = $v['Field']; } } } } else { if($classfound && isset($class_methods)) $tablenotfound[] = $table; } $ret = false; if(isset($tablenotfound))$ret['tablenotfound'] = $tablenotfound; if(isset($Feldnichtgefunden))$ret['FeldernichtinDatenbank'] = $Feldnichtgefunden; if(isset($keineFunktion))$ret['FeldernichtinGen'] = $keineFunktion; if($echo) { if($ret){ print_r($ret); }else{ echo "Alles OK"; } } @closedir($handle); return $ret; } } @closedir($handle); return false; } @closedir($handle); } } function pdfmirrorZuArchiv($id) { $checkmirror = $this->app->DB->SelectRow("SELECT p.* FROM pdfmirror_md5pool p WHERE id = '$id' LIMIT 1"); if($checkmirror) { $filegroup = @filegroup($this->app->Conf->WFuserdata); $fileowner = @fileowner($this->app->Conf->WFuserdata); $dir = $this->app->Conf->WFuserdata."/pdfmirror/".$this->app->Conf->WFdbname."/".$checkmirror['table_name']; $dir_archiv = $this->app->Conf->WFuserdata."/pdfarchiv/".$this->app->Conf->WFdbname."/".$checkmirror['table_name']; if(!is_dir($dir)) { return false; } $vars = glob($dir."/".($checkmirror['checksum']?$checkmirror['checksum'].'_':'').$checkmirror['table_id'].'_*.pdf'); if(!$vars) { return false; } $path_parts = pathinfo($vars[0]); $datei = $path_parts['basename']; $dateia = explode('_', $path_parts['filename'],($checkmirror['checksum']?4:3)); $belegnummer = $dateia[($checkmirror['checksum']?3:2)]; if(strlen($belegnummer) < 3 && !is_numeric($belegnummer)) { $belegnr = $this->app->DB->Select("SELECT belegnr FROM ".$this->app->DB->real_escape_string(strtolower($checkmirror['table_name']))." WHERE id = '".$checkmirror['table_id']."' LIMIT 1"); if($belegnr)$belegnummer.=$belegnr; } $datum = $dateia[($checkmirror['checksum']?2:1)]; if(strlen($datum) == 8) { $datum = $datum[6].$datum[7].'.'.$datum[4].$datum[5].'.'.$datum[0].$datum[1].$datum[2].$datum[3]; }else{ $datum = ''; } $doctyporig = $belegnummer.($datum?' von '.$datum:''); if(!file_exists($dir."/".$checkmirror['checksum'].'_'.$checkmirror['table_id'])) if(!is_dir($this->app->Conf->WFuserdata."/pdfarchiv")) { mkdir($this->app->Conf->WFuserdata."/pdfarchiv",0700); if($fileowner && $fileowner != fileowner($this->app->Conf->WFuserdata."/pdfarchiv"))chown($this->app->Conf->WFuserdata."/pdfarchiv", $fileowner); if($filegroup && $filegroup != filegroup($this->app->Conf->WFuserdata."/pdfarchiv"))chgrp($this->app->Conf->WFuserdata."/pdfarchiv", $filegroup); } if(!is_dir($dir_archiv)) { if(!mkdir($dir_archiv, 0700)) { //echo "Konnte ".$dir_archiv." nicht erstellen\r\n"; return false; } else { if($fileowner && $fileowner != fileowner($dir_archiv))chown($dir_archiv, $fileowner); if($filegroup && $filegroup != filegroup($dir_archiv))chgrp($dir_archiv, $filegroup); } } $dir_archivnew = Briefpapier::getPDFfolder($dir_archiv,$checkmirror['table_id'], $datei,false,true); if($dir_archivnew === false) { $dir_archivnew = $dir_archiv."/".$datei; } //if(!copy($dir."/".$datei, $dir_archiv."/".$datei)) if(!copy($dir."/".$datei, $dir_archivnew)) { //echo "Kopieren von ".$dir."/".$datei." nach ".$dir_archiv."/".$datei." fehlgeschlagen\r\n"; return false; } else { /* if($fileowner && $fileowner != fileowner($dir_archiv."/".$datei))chown($dir_archiv."/".$datei, $fileowner); if($filegroup && $filegroup != filegroup($dir_archiv."/".$datei))chgrp($dir_archiv."/".$datei, $filegroup); */ } $this->app->DB->Insert("INSERT INTO pdfarchiv (zeitstempel,checksum, table_id, table_name, bearbeiter, erstesoriginal, dateiname,doctypeorig, belegnummer) values ('".$checkmirror['zeitstempel']."','".$this->app->DB->real_escape_string($checkmirror['checksum'])."','".$this->app->DB->real_escape_string($checkmirror['table_id'])."','".$this->app->DB->real_escape_string($checkmirror['table_name'])."','".$this->app->DB->real_escape_string($checkmirror['bearbeiter'])."','".$checkmirror['erstesoriginal']."', '".$datei."','".$this->app->DB->real_escape_string($doctyporig)."','".$this->app->DB->real_escape_string($belegnummer)."') "); if($this->app->DB->error()){ throw new Exception("SQL Error: ".$this->app->DB->error()." SQL: INSERT INTO pdfarchiv (zeitstempel,checksum, table_id, table_name, bearbeiter, erstesoriginal, dateiname,doctypeorig, belegnummer) values ('" . $checkmirror['zeitstempel'] . "','" . $this->app->DB->real_escape_string($checkmirror['checksum']) . "','" . $this->app->DB->real_escape_string($checkmirror['table_id']) . "','" . $this->app->DB->real_escape_string($checkmirror['table_name']) . "','" . $this->app->DB->real_escape_string($checkmirror['bearbeiter']) . "','" . $checkmirror['erstesoriginal'] . "', '" . $datei . "','" . $this->app->DB->real_escape_string($doctyporig) . "','" . $this->app->DB->real_escape_string($belegnummer) . "') "); } $newid = $this->app->DB->GetInsertID(); if($newid)$this->app->DB->Update("UPDATE pdfmirror_md5pool set pdfarchiv_id = '$newid' WHERE id = '$id' LIMIT 1"); return $newid; } return false; } function AnzeigeAbweichendeBezeichnung($typ) { switch($typ) { case "auftrag": $tmp = $this->app->erp->Beschriftung("bezeichnungauftragersatz"); break; case "angebot": $tmp = $this->app->erp->Beschriftung("bezeichnungangebotersatz"); break; case "rechnung": $tmp = $this->app->erp->Beschriftung("bezeichnungrechnungersatz"); break; case "lieferschein": $tmp = $this->app->erp->Beschriftung("bezeichnunglieferscheinersatz"); break; case "bestellung": $tmp = $this->app->erp->Beschriftung("bezeichnungbestellungersatz"); break; case "proformarechnung": $tmp = $this->app->erp->Beschriftung("bezeichnungproformarechnungersatz"); break; } if($tmp == "") $tmp = "Abweichende Bezeichnung"; $this->app->Tpl->Set('ABWEICHENDEBEZEICHNUNGBESCHRIFTUNG',$tmp); } function AnzeigeFreifelderPositionen($form = null) { $module = $this->app->Secure->GetGET('module'); switch($module) { case 'angebot': $kurz='an'; break; case 'auftrag': $kurz='ab'; break; case 'rechnung': $kurz='re'; break; case 'gutschrift': $kurz='gs'; break; case 'lieferschein': $kurz='ls'; break; case 'bestellung': $kurz='be'; break; case 'proformarechnung': $kurz='pr'; break; case 'preisanfrage': $kurz='pa'; break; case 'produktion': $kurz='pd'; break; default: $kurz = ''; break; } for($i=1;$i<=40;$i++) { if($this->Firmendaten('freifeld'.$i.$kurz)!='1') { $this->app->Tpl->Set('FREIFELD'.$i.'START',''); } elseif($this->Firmendaten('freifeld'.$i.'typ') === 'select') { $id = $this->app->Secure->GetGET('id'); $options = explode('|',$this->Firmendaten('freifeld'.$i)); unset($options[0]); if($form !== null) { $field = new HTMLSelect('freifeld'.$i,0,'freifeld'.$i,'','','0'); foreach($options as $option) { $option = explode('=>', $option); $key = trim($option[0]); $value = !empty($option[1])?trim($option[1]):''; $field->AddOption($key, $value); } $form->NewField($field); } }elseif($this->Firmendaten('freifeld'.$i.'typ') === 'checkbox') { $fieldName = 'freifeld'.$i; $field = new HTMLCheckbox($fieldName, '','','1'); $form->NewField($field); if(!empty($this->app->Secure->GetPOST('nummer')) && empty($this->app->Secure->GetPOST($fieldName))) { $form->HTMLList[$fieldName]->htmlvalue = '0'; } }elseif($this->Firmendaten('freifeld'.$i.'typ') === 'mehrzeilig') { $field = new HTMLTextarea('freifeld'.$i, 5,75); $form->NewField($field); } } } function OpenstreetmapGetLangLat($apikey,$query) { $query = urlencode(html_entity_decode($query)); $url = sprintf('https://api.openrouteservice.org/geocode/search?text=%s&api_key=%s', $query, $apikey); $timeout=0; while(1) { $timeout++; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Charset: utf-8') ); $result = curl_exec($ch); if(strpos($result,"404 page not")===false) break; if($timeout > 10) { $this->app->erp->LogFile("Openstreetmap GetLangLat Timeout: $url"); break; } } $data = json_decode((string)$result); return $data->{'features'}[0]->{'geometry'}->{'coordinates'}; } function OpenstreetmapGetDistance($apikey,$coord1,$coord2) { $url = "https://api.openrouteservice.org/directions?coordinates=".$coord1[0]."%2C".$coord1[1]."%7C".$coord2[0]."%2C".$coord2[1]."&profile=driving-car&preference=fastest&units=km&language=de&geometry=true&geometry_format=encodedpolyline&geometry_simplify=false&instructions=true&instructions_format=text&elevation=false&options=%7B%7D&api_key=$apikey"; $timeout=0; while(1) { $timeout++; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Charset: utf-8') ); $result = curl_exec($ch); if(strpos($result,"404 page not")===false) break; if($timeout > 10) { $this->app->erp->LogFile("Openstreetmap Distance Timeout: $url"); break; } } $data = json_decode((string)$result); return $data->{'routes'}[0]->{'summary'}->{'distance'}; } function GetFloat($str) { if(strstr($str, ',') !== false) { $str = str_replace(['.',','], ['','.'], $str); // replace dots (thousand seps) with blancs } if(preg_match("#([0-9\.]+)#", $str, $match)) { // search for number that may contain '.' return (float)$match[0]; } return (float)$str; // take some last chances with floatval } function CheckboxEntwurfsmodus($doctype,$id) { $datumentwurf = $this->app->DB->Select("SELECT datum FROM $doctype WHERE id='$id' LIMIT 1"); $datumentwurf = str_replace('-','',$datumentwurf); if($datumentwurf == date('Ymd')) { return ''; } $anzeigedatum = $this->app->DB->Select("SELECT DATE_FORMAT(datum,'%d.%m.%Y') FROM $doctype WHERE id='$id' LIMIT 1"); $check = $this->app->User->GetParameter($doctype."_create_entwurfsdatumuebernehmen"); $extra = " Entwurfsdatum vom $anzeigedatum übernehmen"; $this->app->YUI->AutoSaveUserParameter($doctype."_create_entwurfsdatumuebernehmen",$doctype."_create_entwurfsdatumuebernehmen"); return $extra; } function ZeiterfassungAllowEdit($datum_db) { if(!$this->app->erp->Firmendaten('zeiterfassung_schliessen')) { return true; } if($this->app->erp->RechteVorhanden('zeiterfassung', 'bearbeitenerlauben')) { return true; } if($datum_db != '--' && $datum_db != '0000-00-00' && $datum_db != '') { if(strtotime(date('Y-m-d')) - strtotime($datum_db) > 86400*(int)$this->app->erp->Firmendaten('zeiterfassung_schliessentage')) { return false; } } return true; } function GetBundeslaender($land = '', $bundesland = '') { if($land == '') { $land = $this->app->erp->Firmendaten('land'); } $arr = $this->app->DB->SelectArr("SELECT * FROM bundesstaaten WHERE land = '".$this->app->DB->real_escape_string($land)."' AND iso <> '' ORDER BY land, bundesstaat"); if(empty($arr)) { return null; } $ret = null; foreach($arr as $v) { if($land == $v['iso'] || $land == '') { if($v['aktiv'] || $v['iso'] == $bundesland) { $ret[$v['iso']] = $v['bundesland']; } } } return $ret; } function GetPlacetelSipuid() { $username = $this->app->User->GetUsername(); $accounts = $this->GetKonfiguration("placetel_list_accounts"); $tmp = explode(PHP_EOL,trim($accounts)); $sipuid = false; if($this->RechteVorhanden('placetel','call')) { foreach($tmp as $row) { $subtmp = explode(':',trim($row)); if((!empty($subtmp)?count($subtmp):0)>0) { $subtmp[0] = trim($subtmp[0]); $subtmp[1] = trim($subtmp[1]); if($subtmp[0]==$username) { $sipuid = $subtmp[1]; break; } } } } return $sipuid; } } function parse_csv($str,$parse_split_parameter="") { global $parse_split; if($parse_split_parameter!="") $parse_split=$parse_split_parameter; //match all the non-quoted text and one series of quoted text (or the end of the string) //each group of matches will be parsed with the callback, with $matches[1] containing all the non-quoted text, //and $matches[3] containing everything inside the quotes $str = preg_replace_callback('/([^"]*)("((""|[^"])*)"|$)/s', 'parse_csv_quotes', $str); //remove the very last newline to prevent a 0-field array for the last line $str = preg_replace('/\n$/', '', $str); //split on LF and parse each line with a callback return array_map('parse_csv_line', explode("\n", $str)); } //replace all the csv-special characters inside double quotes with markers using an escape sequence function parse_csv_quotes($matches) { global $parse_split; if($parse_split=='') { $parse_split=';'; } //anything inside the quotes that might be used to split the string into lines and fields later, //needs to be quoted. The only character we can guarantee as safe to use, because it will never appear in the unquoted text, is a CR //So we're going to use CR as a marker to make escape sequences for CR, LF, Quotes, and Commas. $str = str_replace(["\r","\n",'""',$parse_split], ["\rR","\rN","\rQ","\rC"], !empty($matches[3])?$matches[3]:''); //The unquoted text is where commas and newlines are allowed, and where the splits will happen //We're going to remove all CRs from the unquoted text, by normalizing all line endings to just LF //This ensures us that the only place CR is used, is as the escape sequences for quoted text return preg_replace('/\r\n?/', "\n", !empty($matches[1])?$matches[1]:'') . $str; } //split on comma and parse each field with a callback function parse_csv_line($line) { global $parse_split; if($parse_split=="") $parse_split=";"; return array_map('parse_csv_field', explode($parse_split, $line)); } //restore any csv-special characters that are part of the data function parse_csv_field($field) { global $parse_split; if($parse_split=="") $parse_split=";"; $field = str_replace("\rC", $parse_split, $field); $field = str_replace("\rQ", '"', $field); $field = str_replace("\rN", "\n", $field); $field = str_replace("\rR", "\r", $field); return $field; } function code2utf($num) { if ($num < 128) return chr($num); if ($num < 2048) return chr(($num >> 6) + 192) . chr(($num & 63) + 128); if ($num < 65536) return chr(($num >> 12) + 224) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128); if ($num < 2097152) return chr(($num >> 18) + 240) . chr((($num >> 12) & 63) + 128) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128); return ''; }