Falls für das Briefpapier weitere Informationen benötigt werden, wie zum Beispiel zusätzlich bei einer Artikelposition zur Artikelbeschreibung das Gewicht oder die Höhe, so kann ein eigenes Briefpapier zum Überladen angelegt werden.
Die Datei die das Briefpapier überladen soll, muss class.briefpapier_custom.php heißen. Diese Datei muss im xentral ordner nach www/lib/dokumente hochgeladen werden und ist dann für alle Belege gültig.
Tipp
Den Quellcode kannst du dir aus der Datei aus der Open Source Version holen.
Im folgenden Beispiel soll zusätzlich das Gewicht sowie die Höhe, Breite, Länge und Ursprungsregion des Artikels zur Artikelbeschreibung einer Position hinzugefügt werden.
Bisher gibt es noch kein Custom Briefpapier, weshalb das Briefpapier vorerst wie in den Standardeinstellungen festgelegt aussieht:

Als Erstes ist die Datei class.briefpapier_custom.php zu erstellen. Das Grundgerüst für das Custom Briefpapier sieht wie folgt aus:
?php include_once "class.stationery.php"; class StationeryCustom extends Stationery { function __construct(&$app) { $this->app = $app; parent::__construct($app); } } ?>
Als Nächstes ist die Datei class.briefpapier.php zu öffnen, die derzeit für das Layout des Briefpapiers zuständig ist und sucht sich die Funktion heraus, die überladen werden soll, kopiert und fügt diese unter der Funktion "construct" ein. In diesem Fall ist die Funktion renderItems zu kopieren, da diese für die Darstellung der Artikelpositionen zuständig ist. Da die Funktion renderItems recht lang ist, wird hier im Bsp. nur angedeutet, wie der Code von class.briefpapier_custom.php dann aussieht.
?php
include_once "class.stationery.php";
class StationeryCustom extends Stationery {
function __construct(&$app) { $this->app = $app; parent::__construct($app); }
public function renderItems() {
$posWidth = $this->app->erp->company_data("width_position");
$amWidth = $this->app->erp->company_data("width_amount");
$itemNoWidth = $this->app->erp->company_data("width_number");
...
...
...
}
} ?>
Unterhalb von
if($item['ean']!="" && $item['ean']!="0"){ if($item['desc']!=""){ $item['desc']=$item['desc']."\r\n".$this->app->erp->label("document_ean").": ".$item['ean']; }else{ $item['desc']=$this->app->erp->label("document_ean").": ".$item['ean']; } }
wird nun die Größe, sowie die Höhe, Breite, Länge und Ursprungsregion des Artikels zur Variablen $item['desc'] hinzugefügt, da diese den Beschreibungstext beinhaltet und zu diesem die weiteren Werte hinzukommen sollen.
Der fertige Abschnitt sieht dann so aus:
if($item['ean']!="" && $item['ean']!="0"){ if($item['desc']!=""){ $item['desc']=$item['desc']."\r\n".$this->app->erp->label("document_ean").": ".$item['ean']; }else{ $item['desc']=$this->app->erp->label("document_ean").": ".$item['ean']; } } $data = $this->app->DB->SelectArr("SELECT weight, length, width, height, region of origin FROM article WHERE id = '".$item['article']."'); $data = reset($data); if($item['desc'] != ""){ if($data['weight'] != "" AND $data['weight'] > 0){ $item['desc'] = $item['desc']."\r\n". "weight: ".$data['weight']." kg"; } }else{ if($data['weight'] != "" AND $data['weight'] > 0){ $item['desc'] = $item['desc']."Weight: ".$data['weight']." kg"; } } if($item['desc'] != ""){ if($data['length'] != "" AND $data['length'] > 0){ $item['desc'] = $item['desc']. "length: ".$data['length']." cm"; } }else{ if($data['length'] != "" AND $data['length'] > 0){ $item['desc'] = $item['desc']. "Length: ".$data['length']." cm"; } } if($item['desc'] != ""){ if($data['width'] != "" AND $data['width'] > 0){ $item['desc'] = $item['desc']. "width: ".$data['width']." cm"; } }else{ if($data['width'] != "" AND $data['width'] > 0){ $item['desc'] = $item['desc']. "Width: ".$data['width']." cm"; } } if($item['desc'] != ""){ if($data['height'] != "" AND $data['height'] > 0){ $item['desc'] = $item['desc']. "height: ".$data['height']." cm"; } }else{ if($data['height'] != "" AND $data['height' > 0]){ $item['desc'] = $item['desc']. "Height: ".$data['height']." cm"; } } $origin region = ""; switch($data['origin region']){ case "01": $origin region = "Schleswig-Holstein"; break; case "02": $origin region = "Hamburg"; break; case "03": $origin region = "Lower Saxony"; break; case "04": $origin region = "Bremen"; break; case "05": $origin region = "North Rhine-Westphalia"; break; case "06": $origin region = "Hesse"; break; case "07": $origin region = "Rhineland-Palatinate"; break; case "08": $origin region = "Baden-Württemberg"; break; case "09": $origin region = "Bavaria"; break; case "10": $origin region = "Saarland"; break; case "11": $origin region = "Berlin"; break; case "12": $origin region = "Brandenburg"; break; case "13": $origin region = "Mecklenburg-Vorpommern"; break; case "14": $origin region = "Saxony"; break; case "15": $origin region = "Saxony-Anhalt"; break; case "16": $origin region = "Thuringia"; break; case "99": $origin region = "foreign origin"; break; } if($item['desc'] != ""){ if($item['desc'] != ""){ $item['desc'] = $item['desc']. "region of origin: ".$region of origin; } }else{ if($item['desc'] != ""){ $item['desc'] = $item['desc']. "region of origin: ".$region of origin; } }
Das Ergebnis sieht nun so aus:

Des Weiteren gibt es die Möglichkeit nur bestimmte Belege zu überladen. In folgendem Beispiel soll zur Artikelbeschreibung einer Position das nächste, also kleinste, Mindesthaltbarkeitsdatum aus dem Lager für diesen Artikel auf einem Kommissionierschein angezeigt werden. Dazu muss der Lieferschein überladen werden, da der Kommissionierschein ebenfalls mit der class.lieferschein.php erstellt wird. Um die class.lieferschein.php Datei zu überladen, wird eine Datei namens class.lieferschein_custom.php erstellt und diese in den xentralsordner nach www/lib/dokumente abgelegt. Bisher gibt es keine class.lieferschein_custom.php Datei, somit sieht der Kommissionierschein so aus:

Das Grundgerüst der Datei sieht wie folgt aus:
?php if(!class_exists('StationeryCustom')) { class StationeryCustom extends Stationery { } } class DeliveryNotePDFCustom extends StationeryCustom { public $doctype; function __construct($app,$project="") { $this->app=&$app; //parent::stationery(); $this->doctype="delivery bill"; $this->doctypeOrig="delivery bill"; parent::__construct($this->app,$project); } } ?>
Als nächstes ist die passende Funktion zu suchen, die in der class.lieferschein.php überladen werden soll. In diesem Fall ist es die Funktion GetLieferschein. Diese Funktion wird kopiert und unter dem Konstruktor "construct" eingefügt. Da die Funktion GetLieferschein recht lang ist, wird hier nur angedeutet, wie die Datei derzeit aussieht:
?php if(!class_exists('StationeryCustom')) { class StationeryCustom extends Stationery { } } class DeliveryNotePDFCustom extends StationeryCustom { public $doctype; function __construct($app,$project="") { $this->app=&$app; //parent::stationery(); $this->doctype="delivery bill"; $this->doctypeOrig="delivery bill"; parent::__construct($this->app,$project); } function GetDeliveryNote($id,$info="",$extrafreitext="") { $this->doctypeid = $id; if(method_exists($this->app->erp,'CalculateDeliveryNumber'))$this->app->erp->CalculateDeliveryNumber($id); $letter_paper_processor_hide = $this->app->erp->Company_data('letter_paper_processor_hide'); $letter_paper_sales_hide = $this->app->erp->company_data('letter_paper_distribution_hide'); $address = $this->app->DB->Select("SELECT address FROM delivery_note WHERE id='$id' LIMIT 1"); ... ... ... } } ?>
Nun werden die Anpassungen im Code vorgenommen. Wenn diese nun einfach hinzugefügt werden würde, wären diese für Lieferscheine und Kommissionierscheine gültig. Allerdings sollen hier nur die Kommissionierscheine angepasst werden, weshalb mit einem if Statement vorher geprüft wird, ob es sich um einen Kommissionierschein handelt. Die Änderungen werden unter
/* if(!empty($chargen)){ foreach($chargen as $chargen=>$charge){ $chargelist = $chargelist.$charge['charge'].";"; } $chargelist=substr($chargelist, 0, -1); $value['charge'] = $this->app->DB->Select("SELECT charge management FROM article WHERE id='".$value[article]."' LIMIT 1"); if($value['chargen']=="0"){ $value['description'] = $value['description']; }else{ $value['description'] = $value['description']."\r\n".$this->app->erp->label("document_charge").": ". $chargelist; } } */
hinzugefügt. Das Ganze sieht dann so aus:
if($info == "pick ticket"){ if($value['freefield1'] != ""){ //$value['description'] .= "\r\n". "Please select the following MHD: ".$value['freefield1']; }else{ $mhd = $this->app->DB->Select("SELECT MIN(mhddatum) FROM stock_minimum_expiration_date WHERE item= '".$value['article']."' AND mhdate > CURDATE()"); $value['description'] .= ["description" ]."Smallest MHD in the warehouse: ".$mhd; } }
Endergebnis:
