Rechnungen/Angebote/… im vtigerCRM mit Produkten über Webservice anlegen

Hallo,

Endlich bin ich dazugekommen meinen aktuellsten Post auch in meinem deutschen Blog zu posten, da es sich doch um eine relativ wichtige Funktion handelt, welche dem Vtiger eine bessere und zentralere Rolle zukommen lässt.
Es geht um das Erstellen von Rechnungen/Angeboten/… über den Webservice.
Normalerweise kein Problem, aber sobald man Produkte in diesen Eintrag einfügen möchte, lernt man an eine Grenze des Open Source CRM kennen. -> Das geht nämlich nicht.

Die notwendige Funktion ist auch bereits vorhanden und wird nur für externe Webservice Anbindungen nicht ausgewertet. Deshalb sind es auch nur sehr wenige Anpassungen um die Funktion zu bekommen.

Getestet habe ich es unter VTiger 5.40. Es sollte aber auch unter 5.21 und 5.30 funktionieren, da sich dabei nicht sehr viel geändert hat.

Datei: /include/utils/InventoryUtils.php

Suchen:

function saveInventoryProductDetails(&$focus, $module, $update_prod_stock='false', $updateDemand='')
{
  global $log, $adb;

Danach einfügen:

/* CHANGES BY SWARNAT BEGIN */
$resetREQUEST = false;
if(!isset($_REQUEST["totalProductCount"]) && $_REQUEST["operation"] == "create") {
  $resetREQUEST = $_REQUEST;
  if(get_magic_quotes_gpc() == 1) {
    $_REQUEST = array_merge($_REQUEST, json_decode(stripslashes($_REQUEST["element"]), true));
  } else {
    $_REQUEST = array_merge($_REQUEST, json_decode($_REQUEST["element"], true));
  }
}/* CHANGES BY SWARNAT END */

Suchen:

$updatequery .= " subtotal=?,";
array_push($updateparams, $subtotal);

Ersetzen mit:

# Changed by SWARNAT
if(!empty($subtotal) && $subtotal != 0) {
  $updatequery .= " subtotal=?,";
  array_push($updateparams, $subtotal);
}
# Changed by swarnat

Suchen:

$updatequery .= " total=?";
array_push($updateparams, $total);

komplett Ersetzen mit:

if(!empty($total) && $total != 0) {
  $updatequery .= " total=?";
  array_push($updateparams, $total);
}

Suchen:

$log->debug("Exit from function saveInventoryProductDetails($module).");

ZUVOR einfügen:


/* CHANGES BY SWARNAT BEGIN */
 if($resetREQUEST !== false) {
   $_REQUEST = $resetREQUEST;
 }
 /* CHANGES BY SWARNAT END */

Jetzt könnt Ihr mit folgendem Beispiel-PHP-Code neue Einträge mit Produkten erstellen.
Achtung! Evtl. existieren die angegebenen account_id und contact_id in eurem System nicht, sodass Ihr diese anpassen müsst.
Ich habe die DEMO Daten der Standardinstallation vom vtigerCRM verwendet.
invoice_posting
 

Ebenso müsst Ihr die verwendete product_id an eure ID’s anpassen. (Bekommt Ihr einfach über die URL, wenn Ihr das Produkt aufruft.)

Die Array-Werte für die korrekte Steuer-Generierung müssen aus der Datenbank geholt werden. Diese sind in der Tabelle ‘vtiger_taxclass’ zu finden.
Wenn Ihr nicht in der Datenbank suchen wollt, bekommt Ihr die korrekte Angaben auch von den Input-Elementen aus dem normalen Rechnungs Formular.
(siehe Bild)

Vtiger/WSClient.php ist die normale PHP vtiger Webservice Klasse.

<?php
	include_once("Vtiger/WSClient.php");

	$client = new Vtiger_WSClient("<vtigerPath>");
	$result = $client->doLogin("<username>", "<accesskey>");

	$values = array(
		"account_id" => "11x4",
		"contact_id" => "12x23",
		"ship_city" => "Shipping Street",
		"ship_code" => "Shipping Code",
		"ship_country" => "Shipping Country",
		"ship_street" => "Shipping Street",
		"bill_city" => "Billing City",
		"bill_code" => "Billing Code",
		"bill_country" => "Billing Country",
		"bill_street" => "Billing Street",
		"subject" => "Invoice WebService",
		"invoicestatus" => "Created",
		"hdnTaxType" => "individual",
		"taxtype" => "individual",

		"currency_id" => "21x1",

		"assigned_user_id" => "19x1",

		"totalProductCount" => 2

	);

	$tax = 19;

	/* Product 1 */
	$values["hdnProductId1"] = "53";		# Nur die ID und NICHT im normalen Webservice Format
	$values["productDescription1"] = "Produktbeschreibung 1";
	$values["qty1"] = 12;
	$values["listPrice1"] = 150;
	$values["comment1"] = "Kommentar 1";
	$values["tax2_percentage1"] = $tax;

	$values["total"] += ($values["listPrice1"] * (int)$values["qty1"] * (($tax / 100) + 1));
	$values["subtotal"] += ($values["listPrice1"] * (int)$values["qty1"] * (($tax / 100) + 1));
	$values["hdnGrandTotal"] += ($values["listPrice1"] * (int)$values["qty1"] * (($tax / 100) + 1));
	$values["hdnSubTotal"] += ($values["listPrice1"] * (int)$values["qty1"] * (($tax / 100) + 1));

	/* Product 2 */
	$values["hdnProductId2"] = "54";		# Nur die ID und NICHT im normalen Webservice Format
	$values["productDescription2"] = "Product Description 2";
	$values["qty2"] = 2;
	$values["listPrice2"] = 30;
	$values["comment2"] = "Product Comment 2";
	$values["tax2_percentage2"] = $tax;

	$values["total"] += ($values["listPrice2"] * (int)$values["qty2"] * (($tax / 100) + 1));
	$values["subtotal"] += ($values["listPrice2"] * (int)$values["qty2"] * (($tax / 100) + 1));
	$values["hdnGrandTotal"] += ($values["listPrice2"] * (int)$values["qty2"] * (($tax / 100) + 1));
	$values["hdnSubTotal"] += ($values["listPrice2"] * (int)$values["qty2"] * (($tax / 100) + 1));

	try {
		$invoice = $client->doCreate("Invoice", $values);
	} catch (Exception $exp) {
		var_dump($exp);
	}

	var_dump($invoice);

Viel Spaß!

Stefan

Schreibe einen Kommentar