Produkt Extrafeld auf der Rechnung anzeigen

Guten Tag, ich versuche gerade verzweifelt ein Extrafeld aus dem Produkt-Modul auf meiner Rechnung anzeigen zu lassen.
Das Tutorial von Dolibarr hilft mir leider wenig da ich in meiner „pdf_sponge.modules“ bestimmte Teile des Tutorials nicht mal finde/vorhanden sind.

Unter Produkte habe ich ein Extrafeld mit dem Namen "Verfahren welches für jedes Teil einzeln gewählt wird (dropdown mit einer Option).
Besagtes Verfahren soll nun auf der Rechnung im Zusammenhang mit den Teilen des Auftrags gezeigt werden,da der Kunde ja wissen soll für welches Verfahren er nun bezahlt.

Für Hilfe wäre ich dankbar :slight_smile:

1 „Gefällt mir“

Hallo EdelstahlBarr,
eventuell hilft Dir meine letzte Info aus folgendem Link

Muttergesellschaft - Dolibarr anwenden - Dolibarr Forum in deutscher Sprache

Es soll möglich sein in den Vorlagen auf alle Daten zuzugreifen, Sven hatte mir da sehr Geholfen, Danke nochmal an @digitalcentric.de

LG
Jason.

2 „Gefällt mir“

Hallo @EdelstahlBarr,

wenn ich das richtig verstehe, dann möchtest du in einem PDF Template auf die zugehörigen Extrafelder zugreifen. Ohne genaueren Beispielcode ist das schwer, aber im Prinzip musst du dafür folgende Schritte ausführen:

  1. Produkt laden:
$product = new Product($db);
$product->fetch($lineid); // $lineid ist die rowid/id deines Produktes in der jeweiligen Zeile
  1. Laden der Extrafelder im Object:
$product->fetch_optionals();
  1. Zugriff auf die Daten:
$andereVariable = $product->array_options['options_xyz']; // xyz muss durch deinen Namen des extrafeldes ersetzt werden.

Viele Grüße
Sven

2 „Gefällt mir“

Fortsetzung der Diskussion von Produkt Extrafeld auf der Rechnung anzeigen:

Erstmal vielen Dank für die rasche Antwort! :slight_smile:

Genau,ich möchte quasi wenn ich eine Rechnung erstelle,dass das Programm mir auf dieser dann die Information Verfahren ( Extrafeld welches ich im Produkt Modul erstellt habe) dieses in Kombination mit dem Produkt auf der Rechnung ausweist.

Also zb sowas wie:
Blechteil - Schweißarbeiten 2 x 78,50€ (hoffe man kann es halbwegs verstehen)

Ich kann dem Tutorial von Dolibarr nicht ganz folgen da ich manche Teile des sponge_modules gar nicht im Code habe.

Es würde mir evtl schon helfen falls jemand eine Vorlage eines sponge.modules hat in welchem Rechnungs Extrafelder für Positionen schon geschrieben sind,sodass ich diese nur umbennen müsste…

Vielen Dank dir :slight_smile:

Ich habe im Produkt Modul ein Extrafeld erstellt mit dem Titel : _verfahren.
Wie wäre denn dann die komplette Bezeichnung für dieses im Code bei der Rechnung (Extrafeld für Position)

Konnte es leider immer noch nicht lösen,kann mir jemand sagen wo genau ich diese Sachen in dem „sponge_module.php“ eintragen muss?

// Loop on each lines
				for ($i = 0; $i < $nblines; $i++) {
					if ($object->lines[$i]->fk_product)
					{
						require_once (DOL_DOCUMENT_ROOT."/product/class/product.class.php");
						$product = new Product($this->db);
						$product->fetch($object->lines[$i]->fk_product);
						
						$extrafields_product = new ExtraFields($this->db);
						$extralabels_product = $extrafields_product->fetch_name_optionals_label($product->table_element);
						$product->fetch_optionals($product->rowid, $extralabels_product);
						$andereVariable = $product->array_options['options__verfahren'];
					
					}
					$curY = $nexY;
					$pdf->SetFont('', '', $default_font_size - 1); // Into loop to work with multipage
					$pdf->SetTextColor(0, 0, 0);

Hi,
Extrafelder hatte ich schon verwendet, aber die erschienen nicht im Bereich der Produkte, ich verstehe noch nicht so ganz wozu im obigen Beispiel ein Extrafeld benötigt wird, für mich sieht "Blechteil - Schweißarbeiten"nach einer Leistung aus, also würde ich dies auch als Leistung hinterlegen.

lg
Jason.

Hallo EdelstahlBarr,

wenn ich es richtig verstanden habe, dann möchtest du das Extrafeld als Teil des Textes in der Beschreibungsspalte anzeigen, richtig?
D.h. dieser Code Abschnitt müsste der richtige sein (etwas tiefer als dein Codeausschnitt im php File):

					if ($this->getColumnStatus('desc')) {
						$pdf->startTransaction();

						$this->printColDescContent($pdf, $curY, 'desc', $object, $i, $outputlangs, $hideref, $hidedesc);
						$pageposafter = $pdf->getPage();

						if ($pageposafter > $pageposbefore) {	// There is a pagebreak
							$pdf->rollbackTransaction(true);
							$pageposafter = $pageposbefore;
							$pdf->setPageOrientation('', 1, $heightforfooter); // The only function to edit the bottom margin of current page to set it.

							$this->printColDescContent($pdf, $curY, 'desc', $object, $i, $outputlangs, $hideref, $hidedesc);

							$pageposafter = $pdf->getPage();
							$posyafter = $pdf->GetY();
							//var_dump($posyafter); var_dump(($this->page_hauteur - ($heightforfooter+$heightforfreetext+$heightforinfotot))); exit;
							if ($posyafter > ($this->page_hauteur - ($heightforfooter + $heightforfreetext + $heightforinfotot))) {	// There is no space left for total+free text
								if ($i == ($nblines - 1)) {	// No more lines, and no space left to show total, so we create a new page
									$pdf->AddPage('', '', true);
									if (!empty($tplidx)) {
										$pdf->useTemplate($tplidx);
									}
									$pdf->setPage($pageposafter + 1);
								}
							} else {
								// We found a page break
								// Allows data in the first page if description is long enough to break in multiples pages
								if (!empty($conf->global->MAIN_PDF_DATA_ON_FIRST_PAGE)) {
									$showpricebeforepagebreak = 1;
								} else {
									$showpricebeforepagebreak = 0;
								}
							}
						} else // No pagebreak
						{
							$pdf->commitTransaction();
						}
						$posYAfterDescription = $pdf->GetY();
					}

Darin wird eine Funktion aufgerufen: $this->printColDescContent. Darin müsste wahrscheinlich die Änderung gemacht werden.

Gruß Sven

1 „Gefällt mir“

Hallo,
nochmal eine kleine Korrektur. Ich habe gerade gesehen, dass die Funktion auch von vielen anderen aufgerufen wird. D.h. wenn diese geändert wird, dann kann sich das auch auf andere Dokumente auswirken. Das einfachste wäre es die Funktion zu kopieren mit den entsprechenden Änderungen und dann nur von der aktuellen Datei aufzurufen.

Gruß Sven

War etwas doof formuliert,es sind quasi Werkstücke die immer wieder kommen mit eigener Seriennummer,diese werden immer dem selben Verfahren unterzogen,dabei hat jedes Werkstück 1-3 verschiedene Verfahren.
Ich wollte eigentlich nur das er auf der Rechnung,dass zu dem jeweiligen Werkstück hinterlegte Verfahren anzeigt.

Okay danke,werde ich mal testen.
Ist dann aber wieder ein anderer Abschnitt als der aus dem Tutorial von Dolibarr zum Thema „Extrafelder in PDF“ oder?

EDIT:
Ich glaube ich habs fast, fehlt nur noch der Abschnitt hier $outputlangs->convToOutputCharset($product->array_options['options_my_product_extra'])

Wo genau muss ich diesen denn einsetzen,dazu finde ich nämlich leider nicht viel :confused:

Hi,
ich habe jetzt auch das Tutorial gefunden und gelesen was du meintest: Add Extrafields on PDF Models - Dolibarr ERP CRM Wiki
Ich verstehe das auch so, dass das Beispiel nicht mehr 100% passt, aber es hat ein paar wichtige Hinweise gegeben. So wie ich das verstehe, warst du schon ganz nah dran. Es fehlt glaube ich nur noch eine Zeile in dem von mir schon geposteten Code:

if ($this->getColumnStatus('desc')) {
	$pdf->startTransaction();

	$this->printColDescContent($pdf, $curY, 'desc', $object, $i, $outputlangs, $hideref, $hidedesc);
	$pdf->writeHTMLCell (190,3, $pdf->getX(), $curY + 10, $andereVariable,0,1); // NEUE ZEILE
	$pageposafter = $pdf->getPage();

	if ($pageposafter > $pageposbefore) {	// There is a pagebreak
		$pdf->rollbackTransaction(true);
		$pageposafter = $pageposbefore;
		$pdf->setPageOrientation('', 1, $heightforfooter); // The only function to edit the bottom margin of current page to set it.

		$this->printColDescContent($pdf, $curY, 'desc', $object, $i, $outputlangs, $hideref, $hidedesc);

		$pageposafter = $pdf->getPage();
		$posyafter = $pdf->GetY();
		//var_dump($posyafter); var_dump(($this->page_hauteur - ($heightforfooter+$heightforfreetext+$heightforinfotot))); exit;
		if ($posyafter > ($this->page_hauteur - ($heightforfooter + $heightforfreetext + $heightforinfotot))) {	// There is no space left for total+free text
			if ($i == ($nblines - 1)) {	// No more lines, and no space left to show total, so we create a new page
				$pdf->AddPage('', '', true);
				if (!empty($tplidx)) {
					$pdf->useTemplate($tplidx);
				}
				$pdf->setPage($pageposafter + 1);
			}
		} else {
			// We found a page break
			// Allows data in the first page if description is long enough to break in multiples pages
			if (!empty($conf->global->MAIN_PDF_DATA_ON_FIRST_PAGE)) {
				$showpricebeforepagebreak = 1;
			} else {
				$showpricebeforepagebreak = 0;
			}
		}
	} else // No pagebreak
	{
		$pdf->commitTransaction();
	}
	$posYAfterDescription = $pdf->GetY();
}

Die 4. Zeile ist neu hinzugefügt. Ich habe es nur mit einem fixen String getestet, aber das Prinzip sollte ja klar sein. Du musst noch die X und Y Werte richtig anpassen und noch etwas testen. Ich vermute mal, dass für einen Seitenumbruch noch etwas im unteren Code Teil getan werden muss, aber das habe ich wie gesagt nicht getestet.

Gruß Sven

1 „Gefällt mir“

Habe es gelöst bekommen,vielen Dank dir !!! :grinning: :grinning: :grinning: