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; } ?>