Files
votianng/html/include/inc_mtf_func.inc.php
2026-03-29 10:34:57 +02:00

441 lines
21 KiB
PHP

<?php
/*=======================================================================
*
* inc_mtf_func.inc.php
*
* Autor: Marc Vollmann
*
=======================================================================*/
include_once ("../include/global.inc.php");
// Returns the input value
function mcGetIdentityValue ($value, $type, $format = "1", $decimals = "") {
$retVal = "";
if ($value != "") :
$retVal = trim($value);
if ($type == "float") :
$retVal = str_replace (",", ".", $retVal);
else :
$retVal = formatOutput($value, $type, $format, $decimals);
endif;
endif;
return $retVal;
}
// Computation of the (yearly) anniuty
// (Berechnung der (jährlichen) Annuität bei einer Kreditsumme)
// $credit_amount : Credit amount (Kreditbetrag)
// $rate_percent : Rate_percent (Zinssatz)
// $duration : Duration (Laufzeit)
// [E.g.: (1.) Zinssatz 3% => i = 0,03 und q = 1,03 | (2.) Laufzeit 10 Jahre => n = 10 | (3.) Kreditbetrag 100.000,- € (Anfangsbasis)]
function mcMathAnnuity ($credit_amount, $rate_percent, $duration, $decimals = 2) {
$retVal = "ERR";
$credit_amount = str_replace (",", ".", $credit_amount);
$rate_percent = str_replace (",", ".", $rate_percent);
$duration = str_replace (",", ".", $duration);
if (is_numeric($credit_amount) && is_numeric($rate_percent) && is_numeric($duration) && is_numeric($decimals)) :
$q = 1 + ($rate_percent / 100);
$retVal = $credit_amount * ($rate_percent / 100) * pow($q, $duration) / (pow($q, $duration) - 1);
endif;
return $retVal;
}
// Computation of a graduated price depending on a basic amount (e.g. merchandise value)
// $merchandiseValue : Merchandise value (Warenwert)
// $graduatedPriceStructure : Key-value-string of graduated prices (Staffelpreise)
// [E.g.: 100,59|200,89|300,109|90000,129 => Merchandise value 285,- => Transport price 109,-]
function mcGraduatedPriceDependingOnBasicAmount ($merchandiseValue, $graduatedPriceStructure) {
$retVal = "ERR";
$merchandiseValue = trim($merchandiseValue);
$graduatedPriceStructure = trim($graduatedPriceStructure);
if ($merchandiseValue != "" && is_numeric($merchandiseValue) && $graduatedPriceStructure != "") :
$graduatedPriceStructure = str_replace("|", "-,-", $graduatedPriceStructure);
if (!(strpos($graduatedPriceStructure, "-,-") === FALSE)) :
$tmp = spliti("-,-",$graduatedPriceStructure);
else :
$tmp = array($graduatedPriceStructure);
endif;
$lenTmp = count($tmp);
for ($i = 0; $i < $lenTmp; $i++) {
if (!(strpos($tmp[$i], ",") === FALSE)) :
$tmp2 = spliti(",",$tmp[$i]);
if ($tmp2[1] != "") :
if ($merchandiseValue <= $tmp2[0]) :
$retVal = $tmp2[1];
break;
endif;
endif;
endif;
}
endif;
return $retVal;
}
// Computation of the amount of time units x basic amount
// $amount : Amount per time unit
// $units : Units (weight) or time units, e.g. days, kg, etc.
// $freeUnits : Free (time) units
function mcAmountMultUnits ($amount, $units, $freeUnits = 0, $unitFactor = 1) {
$retVal = "ERR";
$amount = str_replace (",", ".", $amount);
$units = str_replace (",", ".", $units);
$freeUnits = str_replace (",", ".", $freeUnits);
if (is_numeric($amount) && is_numeric($units) && is_numeric($freeUnits) && is_numeric($unitFactor) && $unitFactor != 0) :
if ($units > $freeUnits) :
$retVal = $amount * (($units - $freeUnits) / $unitFactor);
else :
$retVal = 0;
endif;
endif;
return $retVal;
}
// Computation of a percent amount
// $percentValue : Percent value (e.g. 9.5 [in %])
// $amount : Amount per time unit
function mcPercentAmount ($percentValue, $amount) {
$retVal = "ERR";
$amount = str_replace (",", ".", $amount);
$percentValue = str_replace (",", ".", $percentValue);
if (is_numeric($amount) && is_numeric($percentValue)) :
$retVal = $amount * ($percentValue / 100);
endif;
return $retVal;
}
// Gets the zone price regarding a special customer and a special zipcode
// $zipcode : Zipcode
// $csId : ID of the customer
function mcGetZonePrice ($zipcode, $csId) {
global $db, $PHP_SELF;
$retVal = "ERR";
$zipcode = trim($zipcode);
if (is_numeric($csId) && $zipcode != "") :
// Get headquarters of the current customer ID
$customerHqId = getFieldValueFromId("customer", "cs_id", $csId, "hq_id");
// Get srvp_id from serviceplz
$tmpSrvpId = getFieldValueFromId("serviceplz", "srvp_plz", $zipcode, "srvp_id");
if ($tmpSrvpId != "") :
$sqlquery = "SELECT srvz.srvz_no, srvz.srvz_price, srvz.srvz_price_1, srvz.srvz_price_2, srvz.srvz_price_3 FROM servicezone AS srvz, servicezonemapping AS srvzm"
. " WHERE srvz.hq_id = '" . $customerHqId . "' AND srvz.cs_id = '" . $csId . "' AND srvz.srvz_id = srvzm.srvz_id AND srvzm.srvp_id = '" . $tmpSrvpId . "'";
$result = $db->query($sqlquery);
if (DB::isError($result)) die ("$PHP_SELF: " . $result->getMessage());
while ($row = $result->fetch_assoc()):
$retVal = array($row["srvz_no"], $row["srvz_price"], $row["srvz_price_1"], $row["srvz_price_2"], $row["srvz_price_3"]);
endwhile;
$result->free();
endif;
endif;
return $retVal;
}
// Gets the article group price regarding a special customer
// $atgKey : Key of the articlegroup
// [E.g.: 1000,25.00|1001,27.50|1002,29.90 => Article group "1001" => Transport price 27,50]
function mcGetArticleGroupPrice ($articleGroupPriceStructure, $atgKey, $quantity) {
global $db, $PHP_SELF;
$retVal = "ERR";
$atgKey = trim($atgKey);
if ($atgKey != "") :
$articleGroupPriceStructure = str_replace("|", "-,-", $articleGroupPriceStructure);
if (!(strpos($articleGroupPriceStructure, "-,-") === FALSE)) :
$tmp = spliti("-,-",$articleGroupPriceStructure);
else :
$tmp = array($articleGroupPriceStructure);
endif;
$lenTmp = count($tmp);
for ($i = 0; $i < $lenTmp; $i++) {
if (!(strpos($tmp[$i], ",") === FALSE)) :
$tmp2 = spliti(",",$tmp[$i]);
if ($tmp2[1] != "") :
if ($atgKey == $tmp2[0]) :
if ($quantity == "" || !is_numeric($quantity)) :
$quantity = 1;
endif;
$retVal = ($tmp2[1] * $quantity);
break;
endif;
endif;
endif;
}
endif;
return $retVal;
}
// Computation of the (graduated) price of a pick-up request (collection order) depending on a basic amount (e.g. merchandise value)
// $merchandiseValue : Merchandise value (Warenwert)
// $percentValue : Percent value (e.g. 100.00 [in %])
// $objId : Object ID (e.g. customer ID)
// $hqId : Headquarters ID
// $category : ID of the metafieldcategory (mtfc_id)
function mcGetPickUpRequestPrice($merchandiseValue, $percentValue, $objId, $hqId, $category) {
$retVal = mcPercentAmount($percentValue, getMtfFunctionResult($hqId, $objId, $category, "0002", $merchandiseValue));
return $retVal;
}
// Gets the correct service acceptance protocol of special job services
// $jbServices : Numeric value containing the bitstring encoding of the associated services
// $objType : E.g. "cs" for customer, etc.
// $objId : E.g. ID of the customer, etc.
// Returns the special service number to use for the selection of protocol
function mcGetServiceAcceptanceProtocolByRule ($jbServices, $objType, $objId) {
$retService = "0"; // Init service "delivery" ("Lieferung")
if ($jbServices && is_numeric($jbServices) > 0 && $objType != "" && $objId != "" && is_numeric($objId)) :
$serviceArray = mcConvertNum2Sel($jbServices); // Array of services ("mt_sort" values)
$serviceArrayLen = count($serviceArray);
if ($serviceArrayLen > 0) :
$jbSrvBoolArr = array(); // Define bool array regarding to the existing services
$numOfAllServices = getCountOfTable("metatype", "mt_type = 'service' AND mt_objtype = '' AND mt_objid = '0'"); // Number of ALL services
for ($i = 0; $i < $numOfAllServices; $i++) :
$jbSrvBoolArr[$i] = false;
if (in_array($i, $serviceArray)) :
$jbSrvBoolArr[$i] = true; // E.g. $jbSrvBoolArr[1] <=> <$jbSrvBoolArr[mt_sort]> <=> <$jbSrvBoolArr["Montage"]>
endif;
endfor;
// Get rule out of parameter
$ruleSrcCode = getParameterValue("0", "MTF_SERVICE_ACCEPTANCE_PROTOCOL_RULE_" . strtoupper($objType) . "_" . $objId, "0");
if ($ruleSrcCode != "") :
$retService = eval($ruleSrcCode);
else :
// Default rule !!!!
if ($jbSrvBoolArr[1]) :
if ($jbSrvBoolArr[6]) :
$retService = "6";
elseif ($jbSrvBoolArr[2]) :
$retService = "2";
elseif ($jbSrvBoolArr[4]) :
$retService = "4";
else :
$retService = "1";
endif;
else :
if ($jbSrvBoolArr[6]) :
$retService = "6";
else :
$retService = "0";
endif;
endif;
endif;
endif;
endif;
return $retService;
}
// Computes the result of a specified function ($funcNo) for a specified object ($objId [e.g. customer]) for a specified category
function getMtfFunctionSingleResult($hqId, $objId, $category, $funcNo, $par_01 = "", $par_02 = "", $par_03 = "", $par_04 = "", $par_05 = "") {
global $PHP_SELF, $db, $hq_id, $gHqId;
$retVal = "";
$funcNo = trim($funcNo);
if ($objId != "" && $category != "" && $funcNo != "") :
$currDate = getDateTime("7");
if ($hqId == "") : $hqId = $hq_id; endif;
if ($hqId == "") : $hqId = "0"; endif;
// Check for setting according to global usage
if ($gHqId) : $hqId = "0"; endif;
if (substr($funcNo, 0, 6) == "ident_") :
$tmpFuncNo = substr($funcNo, 6);
if (is_numeric($tmpFuncNo)) :
$tmpFuncNo = pad($tmpFuncNo, 4, "0");
endif;
$funcNo = "ident_" . $tmpFuncNo;
else :
if (is_numeric($funcNo)) :
$funcNo = pad($funcNo, 4, "0");
endif;
endif;
// Get all parameters and its values defined for the function regarding the specified object (e.g. customer)
$sqlquery = "SELECT mtfv.mtfck_id, mtfv.mtfv_value, mtfk.mtfk_type"
. " FROM metafieldvalue AS mtfv, metafieldcategorykey AS mtfck, metafieldkey AS mtfk"
. " WHERE mtfv.mtfv_id = '" . $objId . "' AND"
. " mtfv.mtfck_id = mtfck.mtfck_id AND"
. " mtfck.mtfc_id = '" . $category . "' AND"
. " mtfck.hq_id = '" . $hqId . "' AND"
. " mtfck.mtfk_id = mtfk.mtfk_id AND"
. " (LEFT(mtfk.mtfk_type, 9) = 'func:" . $funcNo . "' OR LEFT(mtfk.mtfk_type, 15) = 'func:" . $funcNo . "')"
. " ORDER BY mtfk.mtfk_type";
$result = $db->query($sqlquery);
if (DB::isError($result)) die ("$PHP_SELF: '$sqlquery':" . $result->getMessage());
$objRepaymentPercentValue = 0;
$tmpFuncParArray = array();
while ($row = $result->fetch_assoc()):
$tmpVal = $row["mtfv_value"]; // Value of the parameter
$tmpPar = $row["mtfk_type"]; // Type of the parameter for getting the base type (int, float, varchar, etc.)
$tmpArray = spliti(":", $tmpPar); // Split type for getting
$tmpFuncNo = $tmpArray[1];
$tmpFuncParNo = $tmpArray[2];
$tmpFuncParType = $tmpArray[3];
if ($tmpFuncParType == "") : $tmpFuncParType = "varchar"; endif;
if ($funcNo == $tmpFuncNo) : // Has to be equal every time!
if ($tmpFuncParNo == "activated" && $tmpVal != "1") :
return array("NA", 0); // Not activated
elseif ($tmpFuncParNo == "global_repayment") :
if ($tmpVal != "" && is_numeric($tmpVal) && $tmpVal != 0) :
$objRepaymentPercentValue = $tmpVal;
endif;
elseif ($tmpFuncParNo == "date_valid") :
$tmpVal = str_replace("|", "-,-", $tmpVal);
$tmp = spliti("-,-",$tmpVal);
$tmpFromDate = $tmp[0];
$tmpToDate = $tmp[1];
if ($currDate < $tmpFromDate || $currDate > $tmpToDate) :
// Current date is NOT in the range
return array("DNV", 0); // Date not valid
endif;
elseif ($tmpFuncParNo == "return") :
// Do nothing, because the returned result will be computed still here in this function... :-)
elseif (is_numeric($tmpFuncParNo) || (substr($funcNo, 0, 6) == "ident_" && is_numeric(substr($funcNo, 6)))) :
$tmpFuncParArray[$tmpFuncParNo] = $tmpVal;
$tmpFuncParTypeArray[$tmpFuncParNo] = $tmpFuncParType;
endif;
endif;
endwhile;
$result->free();
// Being here the called function in $funcNo is active for the current object (e.g. customer)
// HERE all functions can be tested for being correct!!!!
if (substr($funcNo, 0, 6) == "ident_") :
// Identitätsfunktion, erweitert die Calculator-Logik und gibt den übergebenen Wert zurück
// /z.B. Montagestunde, pauschale Nachmontage, etc.)
$retVal = mcGetIdentityValue($tmpFuncParArray["01"], $tmpFuncParTypeArray["01"]);
elseif ($funcNo == "0001" || $funcNo == "mcMathAnnuity") :
// Annuitätenfunktion
$retVal = mcMathAnnuity($par_01, $par_02, $par_03);
elseif ($funcNo == "0002" || $funcNo == "0015" || $funcNo == "mcGraduatedPriceDependingOnBasicAmount") :
// Preis nach Staffelpreisauswertung
$retVal = mcGraduatedPriceDependingOnBasicAmount($par_01, $tmpFuncParArray["02"]);
elseif ($funcNo == "0003" || $funcNo == "mcAmountMultTimeUnits") :
// Preis aus ((Zeiteinheiten gesamt - freie Zeiteinheiten) x Grundpreis), z.B. Lagerkosten ab dem n. Tag
$retVal = mcAmountMultUnits($tmpFuncParArray["01"], $par_01, $tmpFuncParArray["03"]);
elseif ($funcNo == "0004" || $funcNo == "mcPercentAmount") :
// Einfache Berechnung des Prozentbetrags aus einem übergebenen Betrag, z.B. p% vom Nettowarenwert
// (15% von 800,- ergibt 120,- als Rückgabe)
$retVal = mcPercentAmount($tmpFuncParArray["01"], $par_01);
elseif ($funcNo == "0005" || $funcNo == "mcGetZonePrice") :
// Zonenpreis aus der übergebenen PLZ für z.B. den Kunden
$retVal = mcGetZonePrice($par_01, $objId);
elseif ($funcNo == "0006" || $funcNo == "mcGetArticleGroupPrice") :
// Artikelgruppenpreis (Warengruppenpreis) aus dem übergebenen Schlüssel der Warengruppe für z.B. den Kunden
$retVal = mcGetArticleGroupPrice($tmpFuncParArray["01"], $par_01, $par_02);
elseif ($funcNo == "0007" || $funcNo == "mcGetPickUpRequestPrice") :
// Preisberechnung aus dem beim z.B. Kunden hinterlegten Prozentsatzes in Verbindung mit der eingetragenen Preisstaffel
// (Funktion "...0002...", s.o.) z.B für die Berechnung der Abholaufträge
$retVal = mcGetPickUpRequestPrice($par_01, $tmpFuncParArray["01"], $objId, $hqId, $category);
elseif ($funcNo == "0008" || $funcNo == "mcAmountMultWeightUnits") :
// Preis aus (((Eingegebenes Gesamtgewicht - Freigewicht) / Gewichtseinheit ) x Grundpreis pro Gewichtseinheit)
// z.B. pro 100 kg Mehrgewicht als 3000 kg ergibt sich aus 4000 kg Gesamttransportgewicht der Preis 10 x Grundpreis (wg. 10 x 100 kg = 4000 kg - 3000 kg)
$retVal = mcAmountMultUnits($tmpFuncParArray["01"], $par_01, $tmpFuncParArray["03"], $tmpFuncParArray["04"]);
elseif ($funcNo == "0009" || $funcNo == "mcGetArticleGroupPrice2") :
// Artikelgruppenpreis (Warengruppenpreis) aus dem übergebenen Schlüssel der Warengruppe für z.B. den Kunden
$retVal = mcGetArticleGroupPrice($tmpFuncParArray["01"], $par_01, $par_02);
elseif ($funcNo == "0010" || $funcNo == "0016" || $funcNo == "mcAmountMultLengthUnits") :
// Preis aus (((Eingegebenes Gesamtlänge - Freilänge) / Längeneinheit ) x Grundpreis pro Längeneinheit)
// z.B. Montage für laufenden Meter
$retVal = mcAmountMultUnits($tmpFuncParArray["01"], $par_01, $tmpFuncParArray["03"], $tmpFuncParArray["04"]);
elseif ($funcNo == "0011") :
// Please have a look at $funcNo == "0004"
$retVal = mcPercentAmount($tmpFuncParArray["01"], $par_01);
elseif ($funcNo == "0012" || $funcNo == "mcAmountMultTimeUnits") :
// Preis aus ((Kilometer - freie Kilometer) x Grundpreis), z.B. Kilometerpreis ab dem n. Kilometer
$retVal = mcAmountMultUnits($tmpFuncParArray["01"], $par_01, $tmpFuncParArray["03"]);
elseif ($funcNo == "0013") :
// Please have a look at $funcNo == "0004"
$retVal = mcPercentAmount($tmpFuncParArray["01"], $par_01);
elseif ($funcNo == "0014") :
// Please have a look at $funcNo == "0004"
$retVal = mcPercentAmount($tmpFuncParArray["01"], $par_01);
else :
return array("NF", 0); // No function
endif;
// Global repayment is activated and has a value
if ($objRepaymentPercentValue != "" && is_numeric($objRepaymentPercentValue) && $objRepaymentPercentValue != 0 && $retVal != "" && is_numeric($retVal)) :
// $objRepaymentPercentValue = getFieldValueFromId("customer", "cs_id", $objId, "cs_repayment"); // Percent for repayment
// if ($objRepaymentPercentValue == "") : $objRepaymentPercentValue = 100; endif;
// $objRepaymentPercentValue = $retVal * ($objRepaymentPercentValue / 100); // Computed repayment amount
$objRepaymentPercentValue = $retVal * ($objRepaymentPercentValue / 100); // Computed repayment amount
return array($retVal, $objRepaymentPercentValue);
endif;
endif;
return array($retVal, 0);
// return $retVal;
}
// Computes the result of a specified function ($funcNo) for a specified object ($objId [e.g. customer]) for a specified category
// THIS function iterate the sales promotions
function getMtfFunctionResult($hqId, $objId, $category, $funcNo, $par_01 = "", $par_02 = "", $par_03 = "", $par_04 = "", $par_05 = "") {
global $PHP_SELF, $db, $hq_id, $gHqId;
$retArray = array();
$tmpRetVal = "";
for ($i = 1; $i <= 5; $i++) :
$retArray = getMtfFunctionSingleResult($hqId, $objId, ($category + $i), $funcNo, $par_01, $par_02, $par_03, $par_04, $par_05);
$tmpRetVal = $retArray[0];
if ($tmpRetVal != "NA" && $tmpRetVal != "DNV" && $tmpRetVal != "ERR" && $tmpRetVal != "") :
// Got the price from a running sales promotion
break;
endif;
endfor;
if ($tmpRetVal == "NA" || $tmpRetVal == "DNV" || $tmpRetVal == "ERR" || $tmpRetVal == "") :
// No sales promotion running, get the standard price
$retArray = getMtfFunctionSingleResult($hqId, $objId, $category, $funcNo, $par_01, $par_02, $par_03, $par_04, $par_05);
endif;
return $retArray;
}
// Gets all activated formular functions (calculator functions) activated for a special customer
// $objId : Object ID (e.g. customer ID)
// $hqId : Headquarters ID
// $category : ID of the metafieldcategory (mtfc_id)
function getActivatedCalculatorFunctions ($objId, $hqId, $category) {
global $PHP_SELF, $db, $hq_id, $gHqId;
$retVal = "ERR";
if ($objId != "" && is_numeric($objId) && $category != "" && is_numeric($category)) :
if ($hqId == "") : $hqId = $hq_id; endif;
if ($hqId == "") : $hqId = "0"; endif;
// Check for setting according to global usage
if ($gHqId) : $hqId = "0"; endif;
// Get all parameters and its values defined for the function regarding the specified object (e.g. customer)
$sqlquery = "SELECT mtfk.mtfk_type"
. " FROM metafieldvalue AS mtfv, metafieldcategorykey AS mtfck, metafieldkey AS mtfk"
. " WHERE mtfv.mtfv_id = '" . $objId . "' AND"
. " mtfv.mtfck_id = mtfck.mtfck_id AND"
. " mtfck.mtfc_id = '" . $category . "' AND"
. " mtfck.hq_id = '" . $hqId . "' AND"
. " mtfck.mtfk_id = mtfk.mtfk_id AND"
. " LEFT(mtfk.mtfk_type, 5) = 'func:' AND"
. " RIGHT(mtfk.mtfk_type, 10) = ':activated' AND"
. " mtfv.mtfv_value = '1'"
. " ORDER BY mtfk.mtfk_type";
$result = $db->query($sqlquery);
if (DB::isError($result)) die ("$PHP_SELF: '$sqlquery':" . $result->getMessage());
$retVal = array();
while ($row = $result->fetch_assoc()):
$tmpType = $row["mtfk_type"]; // Type of the parameter for getting the base type (int, float, varchar, etc.)
$tmpArray = spliti(":", $tmpType); // Split type for getting
$retVal[] = $tmpArray[1];
endwhile;
$result->free();
endif;
return $retVal;
}
?>