";
if ($srvId != "" && $srvtId != "" && $cDateTime != ""):
$sqlquery = "SELECT srvh.srvh_price, srvh.srvh_discount, srvh.srvh_cr_price, srvh.srvh_cr_discount, srvh.srvh_validfrom"
. " FROM servicehistory AS srvh"
. " WHERE srvh.srv_id = $srvId"
. " AND srvh.srvt_id = $srvtId"
. " AND srvh.hq_id = $hq_id"
. " AND srvh.cs_id = $csId"
. " AND srvh.srvh_validfrom <= '$cDateTime'"
. " ORDER BY srvh.srvh_validfrom DESC";
$result = $db->query($sqlquery);
//echo $sqlquery . "
\n";
//writeLog_("../log/services_func.inc.php_", $sqlquery);
if (DB::isError($result)) die ("$PHP_SELF: '$sqlquery':" . $result->getMessage());
$price = "0";
$discount = "0";
$validfrom = "0000-00-00 00:00:00";
if ($row = $result->fetch_assoc()):
$price = $row["srvh_price"];
$discount = $row["srvh_discount"];
$crPrice = $row["srvh_cr_price"];
$crDiscount = $row["srvh_cr_discount"];
$validfrom = $row["srvh_validfrom"];
endif;
$result->free();
endif;
switch($mode) {
case "0" :
return array($price,$discount,$validfrom); break;
case "1" :
return $price; break;
case "2" :
return $discount; break;
case "3" :
return array($price, $crPrice); break;
case "4" :
return array($price, $crPrice, $discount, $crDiscount, $validfrom); break;
default :
return array($price,$discount,$validfrom);
};
}
// Returns the price and the discount for a specified zipcode-pair and (optional) customer
// $srvpId : id of the from-zipcode
// $srvpId2 : id of the to-zipcode
// $csId : id of the customer (0 = general price or discount)
// $hqId : id of the headquarter
// $cDateTime : point of time (format: "yyyy-mm-dd HH:MM:SS")
// $mode : mode of the return-value
// 0 = 2-component-array with price (component 1) and discount (component 2)
// 1 = only the price
// 2 = only the discount
function getZipcodeServiceValues($srvpId, $srvp2Id, $csId = 0, $hq_id, $cDateTime, $mode = 0, $vhtId = 0) {
global $db, $PHP_SELF;
$price = "";
$crPrice = "";
$discount = "";
$crDiscount = "";
$validfrom = "";
if ($srvpId != "" && $srvp2Id != "" && $cDateTime != ""):
$vhtId = getServiceVehicleTypeMappingId($vhtId);
$sqlquery = "SELECT srvph.srvph_price, srvph.srvph_cr_price, srvph.srvph_discount, srvph.srvph_cr_discount, srvph.srvph_validfrom"
. " FROM serviceplzhistory AS srvph"
. " WHERE srvph.srvp_id = $srvpId"
. " AND srvph.srvp2_id = $srvp2Id"
. " AND srvph.hq_id = $hq_id"
. " AND srvph.cs_id = $csId"
. " AND srvph.vht_id = $vhtId"
. " AND srvph.srvph_validfrom <= '$cDateTime'"
. " ORDER BY srvph.srvph_validfrom DESC";
//echo $sqlquery . "
\n";
//--writeLog_("../log/services_func.inc.php_", $sqlquery);
$result = $db->query($sqlquery);
if (DB::isError($result)) die ("$PHP_SELF: '$sqlquery':" . $result->getMessage());
$price = "0";
$discount = "0";
$validfrom = "0000-00-00 00:00:00";
if ($row = $result->fetch_assoc()):
$price = $row["srvph_price"];
$discount = $row["srvph_discount"];
$crPrice = $row["srvph_cr_price"];
$crDiscount = $row["srvph_cr_discount"];
$validfrom = $row["srvph_validfrom"];
endif;
$result->free();
endif;
switch($mode) {
case "0" :
return array($price,$discount,$validfrom); break;
case "1" :
return $price; break;
case "2" :
return $discount; break;
case "3" :
return array($price, $crPrice); break;
case "4" :
return array($price, $crPrice, $discount, $crDiscount, $validfrom); break;
default :
return array($price,$discount,$validfrom);
};
}
// Returns the same like function getZipcodeServiceValues, but input values are zipcodes
function getZipcodeServiceValuesByZipcodes($zipcodeFrom, $zipcodeTo, $csId = 0, $hq_id, $cDateTime, $mode = 0, $vhtId = 0) {
$retVal = "";
if ($zipcodeFrom != "" && $zipcodeTo != "") :
$srvpId = getFieldValueFromId("serviceplz", "srvp_plz", $zipcodeFrom, "srvp_id");
$srvp2Id = getFieldValueFromId("serviceplz", "srvp_plz", $zipcodeTo, "srvp_id");
$retVal = getZipcodeServiceValues($srvpId, $srvp2Id, $csId, $hq_id, $cDateTime, $mode, $vhtId);
endif;
return $retVal;
}
// Returns the price and the discount for a specified zipcode-pair and (optional) customer
// $srvpaId : id of the from-zipcode area
// $srvpaId2 : id of the to-zipcode area
// $csId : id of the customer (0 = general price or discount)
// $hqId : id of the headquarter
// $cDateTime : point of time (format: "yyyy-mm-dd HH:MM:SS")
// $mode : mode of the return-value
// 0 = 2-component-array with price (component 1) and discount (component 2)
// 1 = only the price
// 2 = only the discount
function getZipcodeAreaServiceValues($srvpaId, $srvpa2Id, $csId = 0, $hq_id, $cDateTime, $mode = 0, $vhtId = 0) {
global $db, $PHP_SELF;
$price = "";
$crPrice = "";
$discount = "";
$crDiscount = "";
$validfrom = "";
if ($srvpaId != "" && $srvpa2Id != "" && $cDateTime != ""):
$vhtId = getServiceVehicleTypeMappingId($vhtId);
$sqlquery = "SELECT srvpah.srvpah_price, srvpah.srvpah_cr_price, srvpah.srvpah_discount, srvpah.srvpah_cr_discount, srvpah.srvpah_validfrom"
. " FROM serviceplzareahistory AS srvpah"
. " WHERE srvpah.srvpa_id = $srvpaId"
. " AND srvpah.srvpa2_id = $srvpa2Id"
. " AND srvpah.hq_id = $hq_id"
. " AND srvpah.cs_id = $csId"
. " AND srvpah.vht_id = $vhtId"
. " AND srvpah.srvpah_validfrom <= '$cDateTime'"
. " ORDER BY srvpah.srvpah_validfrom DESC";
$result = $db->query($sqlquery);
if (DB::isError($result)) die ("$PHP_SELF: '$sqlquery':" . $result->getMessage());
$price = "0";
$discount = "0";
$validfrom = "0000-00-00 00:00:00";
if ($row = $result->fetch_assoc()):
$price = $row["srvpah_price"];
$discount = $row["srvpah_discount"];
$crPrice = $row["srvpah_cr_price"];
$crDiscount = $row["srvpah_cr_discount"];
$validfrom = $row["srvpah_validfrom"];
endif;
$result->free();
endif;
switch($mode) {
case "0" :
return array($price,$discount,$validfrom); break;
case "1" :
return $price; break;
case "2" :
return $discount; break;
case "3" :
return array($price, $crPrice); break;
case "4" :
return array($price, $crPrice, $discount, $crDiscount, $validfrom); break;
default :
return array($price,$discount,$validfrom);
};
}
// Returns the id of an area, an empty string if no result or a defined error code (see below)
function getAreaIdFromAddress($adStreet, $adZipcode, $adHsno, $hqId = "0") {
global $db, $PHP_SELF, $hq_id;
$retZipcodeAreaId = "";
if ($hqId == "0") : $hqId = $hq_id; endif;
$adHsnoOri = str_replace(" ", "", trim($adHsno));
// Remove alphanumeric chars (e.g "124a" => "124")
$adHsno = ereg_replace("[^[:digit:]+]","-",$adHsno);
if (!(strpos($adHsno, "-") === FALSE)) :
$adHsno = substr($adHsno, 0, strpos($adHsno, "-"));
endif;
if ($adStreet != "" && $adZipcode != "" && $adHsno != "" && is_numeric($adHsno)) :
$hsnoMaxValue = 99999;
$adHsnoIsEven = TRUE;
if (($adHsno % 2) == 1) :
$adHsnoIsEven = FALSE;
endif;
$sqlquery = "SELECT srvpaa.srvpaa_id, srvpaa.srvpaa_hsno_from, srvpaa.srvpaa_hsno_to, srvpaa.srvpaa_mode, srvpa.srvpa_id"
. " FROM address AS ad, serviceplzarea AS srvpa, serviceplzareaaddress AS srvpaa"
. " WHERE ad.ad_id = srvpaa.ad_id AND"
. " srvpa.srvpa_id = srvpaa.srvpa_id AND"
. " srvpaa.hq_id = '" . $hqId . "' AND"
. " ad.ad_zipcode LIKE '" . $adZipcode . "' AND"
. " ad.ad_street LIKE '" . $adStreet . "%'";
$result = $db->query($sqlquery);
if (DB::isError($result)) die ("$PHP_SELF: " . $result->getMessage());
// Check all rows on matching the housenumber
$hsnoMaxValueLowerRange = 0;
$hsnoMinValueUpperRange = $hsnoMaxValue;
while ($row = $result->fetch_assoc()):
$hsnoFrom = $row["srvpaa_hsno_from"];
$hsnoTo = $row["srvpaa_hsno_to"];
$hsnoMode = $row["srvpaa_mode"];
if ($hsnoFrom == "" || !is_numeric($hsnoFrom)) : $hsnoFrom = 0; endif;
if ($hsnoTo == "" || !is_numeric($hsnoTo)) : $hsnoTo = $hsnoMaxValue; endif;
// Check range
if (($hsnoMaxValueLowerRange <= $hsnoFrom && $hsnoFrom <= $adHsno) &&
($hsnoMinValueUpperRange >= $hsnoTo && $hsnoTo >= $adHsno)) :
if (($adHsnoIsEven && ($hsnoMode == "0" || $hsnoMode == "2")) ||
(!$adHsnoIsEven && ($hsnoMode == "0" || $hsnoMode == "1"))) :
$hsnoMaxValueLowerRange = $hsnoFrom;
$hsnoMinValueUpperRange = $hsnoTo;
$retZipcodeAreaId = $row["srvpa_id"];
$areaIdSpecial = getParameterValue("0", "MASK_AREA_ID_FROM_ADDRESS_" . $row["srvpaa_id"], "0");
//echo "MASK_AREA_ID_FROM_ADDRESS_" . $row["srvpaa_id"] . ": " . "$areaIdSpecial" . "
\n";
if ($areaIdSpecial != ""):
$areaIdSpecialArr = explode(";", $areaIdSpecial);
foreach($areaIdSpecialArr as $areaIdSpecialPair) {
$areaIdSpecialPairArr = explode(",", $areaIdSpecialPair);
if ($areaIdSpecialPairArr[0] == $adHsnoOri):
$retZipcodeAreaId = $areaIdSpecialPairArr[1];
endif;
}
endif;
endif;
endif;
endwhile;
$result->free();
else :
if ($adStreet == "") : $retZipcodeAreaId = -10; endif; // Err.-Code -10 : Street empty
if ($adZipcode == "") : $retZipcodeAreaId = -11; endif; // Err.-Code -11 : Zipcode empty
if ($adHsno == "") : $retZipcodeAreaId = -12; endif; // Err.-Code -12 : Housenumber empty
if ($adHsno != "" && !is_numeric($adHsno) == "") : $retZipcodeAreaId = -13; endif; // Err.-Code -13 : Housenumber not empty, but NaN
endif;
//echo "$adStreet, $adZipcode, $adHsnoOri: $retZipcodeAreaId" . "
\n";
return $retZipcodeAreaId;
}
// Returns the id of a zipcode, an empty string if no result or a defined error code (see below)
function getZipcodeIdFromAddress($adStreet, $adZipcode, $adHsno, $hqId = "0") {
global $db, $PHP_SELF;
$retZipcodeId = "";
if ($hqId == "0") : $hqId = $hq_id; endif;
// Remove alphanumeric chars (e.g "124a" => "124")
$adHsno = ereg_replace("[^[:digit:]+]","-",$adHsno);
if (!(strpos($adHsno, "-") === FALSE)) :
$adHsno = substr($adHsno, 0, strpos($adHsno, "-"));
endif;
if ($adStreet != "" && $adZipcode != "" && $adHsno != "" && is_numeric($adHsno)) :
$hsnoMaxValue = 99999;
$adHsnoIsEven = TRUE;
if (($adHsno % 2) == 1) :
$adHsnoIsEven = FALSE;
endif;
$sqlquery = "SELECT srvpxa.srvpxa_id, srvpxa.srvpxa_hsno_from, srvpxa.srvpxa_hsno_to, srvpxa.srvpxa_mode, srvp.srvp_id"
. " FROM address AS ad, serviceplz AS srvp, serviceplzaddress AS srvpxa"
. " WHERE ad.ad_id = srvpxa.ad_id AND"
. " srvp.srvp_id = srvpxa.srvp_id AND"
. " srvpxa.hq_id = '" . $hqId . "' AND"
. " ad.ad_zipcode LIKE '" . $adZipcode . "' AND"
. " ad.ad_street LIKE '" . $adStreet . "%'";
$result = $db->query($sqlquery);
if (DB::isError($result)) die ("$PHP_SELF: " . $result->getMessage());
// Check all rows on matching the housenumber
$hsnoMaxValueLowerRange = 0;
$hsnoMinValueUpperRange = $hsnoMaxValue;
while ($row = $result->fetch_assoc()):
$hsnoFrom = $row["srvpxa_hsno_from"];
$hsnoTo = $row["srvpxa_hsno_to"];
$hsnoMode = $row["srvpxa_mode"];
if ($hsnoFrom == "" || !is_numeric($hsnoFrom)) : $hsnoFrom = 0; endif;
if ($hsnoTo == "" || !is_numeric($hsnoTo)) : $hsnoTo = $hsnoMaxValue; endif;
// Check range
if (($hsnoMaxValueLowerRange <= $hsnoFrom && $hsnoFrom <= $adHsno) &&
($hsnoMinValueUpperRange >= $hsnoTo && $hsnoTo >= $adHsno)) :
if (($adHsnoIsEven && ($hsnoMode == "0" || $hsnoMode == "2")) ||
(!$adHsnoIsEven && ($hsnoMode == "0" || $hsnoMode == "1"))) :
$hsnoMaxValueLowerRange = $hsnoFrom;
$hsnoMinValueUpperRange = $hsnoTo;
$retZipcodeId = $row["srvp_id"];
endif;
endif;
endwhile;
$result->free();
else :
if ($adStreet == "") : $retZipcodeId = -10; endif; // Err.-Code -10 : Street empty
if ($adZipcode == "") : $retZipcodeId = -11; endif; // Err.-Code -11 : Zipcode empty
if ($adHsno == "") : $retZipcodeId = -12; endif; // Err.-Code -12 : Housenumber empty
if ($adHsno != "" && !is_numeric($adHsno) == "") : $retZipcodeId = -13; endif; // Err.-Code -13 : Housenumber not empty, but NaN
endif;
return $retZipcodeId;
}
function getServicePrices($srv_name, $srvt_name, $cs_id, $hq_id, $cDateTime, $final_price_correction, $final_discount, $final_discount_correction, $customer_specific, $vht_id = 0)
{
global $db;
writeLog_("../log/services_func.inc.php_", "getServicePrices: \$srv_name = $srv_name, \$srvt_name = $srvt_name, \$cs_id = $cs_id, \$hq_id = $hq_id, \$cDateTime = $cDateTime"
. "\$final_price_correction = $final_price_correction, \$final_discount = $final_discount, \$final_discount_correction = $final_discount_correction, \$customer_specific = $customer_specific, \$vht_id = $vht_id");
$final_cr_discount = 0;
//echo "'$vht_id'
\n";
$srvt_id = $db->getOne(
"SELECT srvt_id FROM servicetype WHERE srvt_name = '$srvt_name' AND srvt_mode = 0 AND hq_id = '$hq_id'");
// if no headquarter-specific type is found, search for common type
if (trim($srvt_id) == ""):
$srvt_id = $db->getOne(
"SELECT srvt_id FROM servicetype WHERE srvt_name = '$srvt_name' AND srvt_mode = 0 AND hq_id = '0'");
$hq_id = 0;
endif;
// srv_id has to be selected second, as hq_id could change by selecting of srvt_id
$srv_id = $db->getOne(
"SELECT srv_id FROM service WHERE srv_name = '$srv_name' AND srv_mode = 0 AND hq_id = '$hq_id'");
// check whether there is a customer-specific price
list($trs_price, $cr_price, $trs_discount, $cr_discount, $validfrom) =
getServiceValues($srv_id, $srvt_id, $cs_id, $hq_id, $cDateTime, 4, $vht_id);
$final_price = $trs_price;
if ($final_discount == 0)
$final_discount = $trs_discount;
if ($final_price != 0 || $final_discount != 0)
// customer-specific price has to be marked
if ($cs_id != 0 && $cs_id != "")
$customer_specific = true;
// NEW: If customer-spcific is negative, then it has to be subtracted from the regular price!
// So the regular price has to be taken also
if ($final_price < 0)
$final_price_correction = $final_price;
if ($final_discount < 0)
$final_discount_correction = $final_discount;
// if ($final_price <= 0 || $final_discount <= 0):
if ($final_price <= 0):
// no customer-specific price: get common price
list($trs_price, $cr_price, $trs_discount, $cr_discount, $validfrom) =
getServiceValues($srv_id, $srvt_id, 0, $hq_id, $cDateTime, 4, $vht_id);
if ($final_price <= 0):
$final_price = $trs_price;
endif;
if ($final_discount <= 0):
$final_discount = $trs_discount;
endif;
endif;
$final_cr_price = $cr_price;
if (round((float) $final_price * 100) == 1): $final_price = 0; endif;
if (round((float) $final_cr_price * 100) == 1): $final_cr_price = 0; endif;
writeLog_("../log/services_func.inc.php_", "getServicePrices: \$final_price = $final_price, \$final_price_correction = $final_price_correction, \$final_discount = $final_discount, "
. "\$final_discount_correction = $final_discount_correction, \$final_cr_price = $final_cr_price, \$final_cr_discount = $final_cr_discount, \$customer_specific = $customer_specific, \$validfrom = $validfrom");
return array($final_price, $final_price_correction, $final_discount, $final_discount_correction, $final_cr_price, $final_cr_discount, $customer_specific, $validfrom);
}
function getFuelMarkup($srvt_name, $cs_id, $hq_id, $cDateTime)
{
global $db, $PHP_SELF;
//~ writeLog_("../log/services_func.inc.php_", "getFuelMarkup: \$srvt_name = $srvt_name, \$cs_id = $cs_id, \$hq_id = $hq_id, \$cDateTime = $cDateTime");
$final_markup = 0;
$final_markup_correction = 0;
$final_markup_discount = 0;
$final_markup_discount_correction = 0;
$customer_specific = false;
$cr_price = 0;
$cs_markup_prov = 0;
if ($cs_id == 0):
$cs_markup = 1;
else:
// globale Kunden-Einstellungen overrulen alles
$cs_markup = $db->getOne("SELECT cs_markup FROM customer WHERE cs_id = '$cs_id'");
endif;
//~ writeLog_("../log/services_func.inc.php_", "getFuelMarkup: \$cs_markup = $cs_markup");
if ($cs_markup == 1):
// globale Einstellung: Zuschlag ziehen - ja
$cs_markup_prov = (float) $db->getOne("SELECT cs_markup_prov FROM customer WHERE cs_id = '$cs_id'");
// wenn auch globaler Zuschlag vorhanden, dann den nehmen, sonst wie üblich ermitteln
//~ writeLog_("../log/services_func.inc.php_", "getFuelMarkup: \$cs_markup_prov = $cs_markup_prov");
//auch ein negativer Aufschlag (= "Dieselrabatt") soll berücksichtigt werden
if ($cs_markup_prov > 0 || $cs_markup_prov < 0):
// Historie berücksichtigen
include("../jobs/job_courier.inc.newbies.php");
for($i = 0; $i < count($cs_markup_prov_list); $i++):
if ($cs_id == $cs_markup_prov_list[$i][0] && strtotime($cDateTime) > strtotime($cs_markup_prov_list[$i][1])):
$cs_markup_prov = (float) $cs_markup_prov_list[$i][2];
//~ writeLog_("../log/services_func.inc.php_", "getFuelMarkup: \$cs_markup_prov = " . $cs_markup_prov_list[$i][2] . " \$i = " . $i);
break;
endif;
endfor;
$final_markup = $cs_markup_prov;
//~ writeLog_("../log/services_func.inc.php_", "getFuelMarkup: \$cs_markup_prov = $final_markup after job_courier.inc.newbies.php");
else:
list($final_markup, $final_markup_correction, $final_markup_discount, $final_markup_discount_correction, $cr_price, $cr_discount, $customer_specific, $validfrom) =
getServicePrices("Aufschlag
Sprit [%]", $srvt_name, $cs_id, $hq_id, $cDateTime, 0, 0, 0, false);
//~ writeLog_("../log/services_func.inc.php_", "getFuelMarkup: \$cs_markup_prov = $final_markup after getServicePrices.php");
endif;
endif;
//echo "$cs_markup, $cs_markup_prov, $final_markup, $final_markup_correction, $final_markup_discount, $final_markup_discount_correction, $customer_specific" . "
";
if ($final_markup == "")
$final_markup = 0;
if ($final_markup_correction == "")
$final_markup_correction = 0;
$final_markup += $final_markup_correction;
if ($final_markup_discount == "")
$final_markup_discount = 0;
if ($final_markup_discount_correction == "")
$final_markup_discount_correction = 0;
$final_markup_discount += $final_markup_discount_correction;
//echo "$final_markup, $final_markup_discount" . "
";
// prozentualer Rabatt auf einen prozentualen Zuschlag... oh mann...
$final_markup *= (1 - ($final_markup_discount / 100));
//die($final_markup);
return $final_markup;
}
function getFuelMarkupCr($srvt_name, $cs_id, $hq_id, $cDateTime)
{
global $db, $PHP_SELF;
//## writeLog_("../log/services_func.inc.php_", "getFuelMarkupCr: \$srvt_name = $srvt_name, \$cs_id = $cs_id, \$hq_id = $hq_id, \$cDateTime = $cDateTime");
list($final_markup, $final_markup_correction, $final_markup_discount, $final_markup_discount_correction, $cr_price, $cr_discount, $customer_specific, $validfrom) =
getServicePrices("Aufschlag
Sprit [%]", $srvt_name, $cs_id, $hq_id, $cDateTime, 0, 0, 0, false);
//-- writeLog_("../log/services_func.inc.php_", "getFuelMarkupCr: \$trs_price_dummy = $trs_price_dummy, \$cr_price = $cr_price");
// get normal markup for customer if no special markup for courier is specified for this customer
//## writeLog_("../log/services_func.inc.php_", "getFuelMarkupCr: \$cr_price = $cr_price");
if ($cr_price == 0 || $cr_price == "") {
$cr_price = getFuelMarkup($srvt_name, $cs_id, $hq_id, $cDateTime);
//## writeLog_("../log/services_func.inc.php_", "getFuelMarkupCr: \$cr_price = $cr_price");
}
// special treatment for the value 0.01: This is a placeholder for 0
if (round($cr_price * 100) == 1)
$cr_price = 0;
//- writeLog_("../log/services_func.inc.php_", "\$cr_price = $cr_price");
return $cr_price;
}
function getZipCodeServiceValuesWrapper($srvp_id, $srvp2_id, $cs_id, $hq_id, $cDateTime, $mode, $vht_id)
{
list ($price, $cr_price, $discount, $cr_discount, $validfrom) = getZipCodeServiceValues($srvp_id, $srvp2_id, $cs_id, $hq_id, $cDateTime, $mode, $vht_id);
if ($price == 0)
return getZipCodeServiceValues($srvp_id, $srvp2_id, $cs_id, $hq_id, $cDateTime, $mode, 0);
return array($price, $cr_price, $discount, $cr_discount, $validfrom);
}
function getZipcodeAreaServiceValuesWrapper($srvpa_id, $srvpa2_id, $cs_id, $hq_id, $cDateTime, $mode, $vht_id, $srvp_id = 0, $srvp2_id = 0)
{
list ($price, $cr_price, $discount, $cr_discount, $validfrom) = getZipcodeAreaServiceValues($srvpa_id, $srvpa2_id, $cs_id, $hq_id, $cDateTime, $mode, $vht_id);
//echo ("\$price=|".$price.", \$vht_id=|".$vht_id."|
\n");
if ($price == 0)
list ($price, $cr_price, $discount, $cr_discount, $validfrom) = getZipcodeAreaServiceValues($srvpa_id, $srvpa2_id, $cs_id, $hq_id, $cDateTime, $mode, 0);
//echo ("\$price=|".$price.", \$vht_id=|0|
\n");
if ($price == 0 && $srvp_id > 0 && $srvp2_id > 0 && getParameterValue("0", "MASK_INVMODE_FALLBACK", $hq_id) == "1")
return getZipCodeServiceValuesWrapper($srvp_id, $srvp2_id, $cs_id, $hq_id, $cDateTime, $mode, $vht_id);
return array($price, $cr_price, $discount, $cr_discount, $validfrom);
}
// saves the invoiceposition specified by the parameters in table 'tourservice'
// OR just returns the price
function saveServiceCosts($srv_name, $srvt_name, $hq_id, $cs_id, $jb_id, $tr_sort, $cDateTime, $count = 0, $costsplit_count = 1, $savemode = 0, $jb_cash = "false", $csc_id_payer = "0", $jb_storno = 0, $zipcode1 = false, $zipcode2 = false, $fullAddress = false, $fuel_markup, $fuel_cr_markup, $vht_id)
{
global $db, $PHP_SELF, $self_service_discount;
//-- writeLog_("../log/services_func.inc.php_", "saveServiceCosts(\$srv_name = $srv_name, \$srvt_name = $srvt_name, \$hq_id = $hq_id, \$cs_id = $cs_id, \$jb_id = $jb_id, \$tr_sort = $tr_sort, \$cDateTime = $cDateTime, \$count = $count, \$costsplit_count = $costsplit_count,\n " . "\$savemode = $savemode, \$jb_cash = $jb_cash, \$csc_id_payer = $csc_id_payer, \$jb_storno = $jb_storno, \$zipcode1 = $zipcode1, \$zipcode2 = $zipcode2, \$fullAddress = $fullAddress, \$fuel_markup = $fuel_markup, \$vht_id = $vht_id)");
// "\$savemode = $savemode, \$jb_cash = $jb_cash, \$csc_id_payer = $csc_id_payer, \$jb_storno = $jb_storno, \$zipcode1 = $zipcode1, \$zipcode2 = $zipcode2, \$fullAddress = $fullAddress, \$fuel_markup = $fuel_markup, \$fuel_cr_markup = $fuel_cr_markup, \$vht_id = $vht_id)");
if ($cs_id == -1 || $cs_id == -2):
$cs_invmode = $cs_id * -1;
$cs_id = 0;
else:
if (($csc_id_payer == 0 || $csc_id_payer == "") && MASK_CASH_PAYER_SELECT != "1"): // csc_id_payer == 0 ==> Kostensplit
$cs_invmode = getFieldValueFromId("headquarters", "hq_id", "$hq_id", "hq_invmode");
$cs_id = 0;
else:
if ($cs_id == 0 || $cs_id == ""):
$cs_invmode = getFieldValueFromId("headquarters", "hq_id", "$hq_id", "hq_invmode"); // default: siehe headquarters
else:
if (getParameterValue("0", "COSTCENTER_INV_MODE_" . $csc_id_payer, "0") != "") {
$cs_invmode = getParameterValue("0", "COSTCENTER_INV_MODE_" . $csc_id_payer, "0");
} else {
$cs_invmode = getFieldValueFromId("customer", "cs_id", "$cs_id", "cs_invmode");
}
endif;
endif;
endif;
$final_price = 0;
$final_cr_price = 0;
$vhtSrvt_name = $srvt_name; // save $srvt_name for correction of cr_price see end of funtion
$final_discount = $db->getOne("SELECT cs_discount FROM customer WHERE cs_id = '$cs_id'");
if ($final_discount == "")
$final_discount = 0;
if ($cs_id == "")
$cs_id = 0;
// general customer-specific discount overrides all other discounts
if (trim($cDateTime) == "" || $cDateTime == "0000-00-00 00:00:00")
$cDateTime = $db->getOne("SELECT jb_ordertime FROM job WHERE jb_id = '$jb_id'");
$customer_specific = false;
$special_address = false;
$validfrom = "0000-00-00 00:00:00";
$final_price_correction = 0;
$final_discount_correction = 0;
//echo ("'srv_name', srvt_name, hq_id, cs_id, jb_id, tr_sort, cDateTime, count, costsplit_count, save_mode:
");
//echo ("'$srv_name', $srvt_name, $hq_id, $cs_id, $jb_id, $tr_sort, $cDateTime, $count, $costsplit_count, $save_mode
");
//echo ("honk: \$cs_invmode: '" . $cs_invmode . "'
");
if ($cs_invmode == 0):
// list($final_price, $final_price_correction, $final_discount, $final_discount_correction, $final_cr_price, $final_cr_discount, $customer_specific, $validfrom) =
// getServicePrices($srv_name, $srvt_name, $cs_id, $hq_id, $cDateTime, $final_price_correction, $final_discount, $final_discount_correction, $customer_specific);
// // some services need calculation
// switch($srv_name) {
// case "km-Preis":
// $srv_name = "$count Entfernungs-km";
// $final_price = $count * $final_price;
// $final_discount = $count * $final_discount;
// break;
// case "Weitere km":
// $srv_name = "$count zusätzliche km";
// $final_price = $count * $final_price;
// $final_discount = $count * $final_discount;
// break;
// case "Weitere
Servicezeit" :
// $srv_name = "$count zusätzliche Servicezeit-Einheiten";
// $final_price = $count * $final_price;
// $final_discount = $count * $final_discount;
// break;
// default:
// // the other services don't need calculation
// }
else:
// die Berliner Extra-Wurst hat hier mal wieder heftig Nerven gekostet...
$srv_name_arr = explode("³", $srv_name);
$srvt_name_arr = explode("³", $srvt_name);
if ($fullAddress == false):
//echo "fullAddress == false
";
$ad_plz1 = getFieldValueFromId("address", "ad_id", $srv_name_arr[0], "ad_zipcode");
$ad_plz2 = getFieldValueFromId("address", "ad_id", $srvt_name_arr[0], "ad_zipcode");
$ad_street1 = getFieldValueFromId("address", "ad_id", $srv_name_arr[0], "ad_street");
$ad_street2 = getFieldValueFromId("address", "ad_id", $srvt_name_arr[0], "ad_street");
$ad_hsno1 = (isset($srv_name_arr[1]) ? $srv_name_arr[1] : "");
$ad_hsno2 = (isset($srvt_name_arr[1]) ? $srvt_name_arr[1] : "");
else:
//echo "fullAddress == true
";
$ad_plz1 = $srv_name_arr[0];
$ad_plz2 = $srvt_name_arr[0];
$ad_street1 = (isset($srv_name_arr[1]) ? $srv_name_arr[1] : "");
$ad_street2 = (isset($srvt_name_arr[1]) ? $srvt_name_arr[1] : "");
$ad_hsno1 = (isset($srv_name_arr[2]) ? $srv_name_arr[2] : "");
$ad_hsno2 = (isset($srvt_name_arr[2]) ? $srvt_name_arr[2] : "");
endif;
if ($zipcode1 == true)
$ad_plz1 = getFieldValueFromId("serviceplz", "srvp_id", "$srv_name", "srvp_plz");
if ($zipcode2 == true)
$ad_plz2 = getFieldValueFromId("serviceplz", "srvp_id", "$srvt_name", "srvp_plz");
if ($srv_name == "Grundpreis"):
list($final_price, $final_price_correction, $final_discount, $final_discount_correction, $final_cr_price, $final_cr_discount, $customer_specific, $validfrom) =
getServicePrices($srv_name, $srvt_name, $cs_id, $hq_id, $cDateTime, $final_price_correction, $final_discount, $final_discount_correction, $customer_specific);
// special treatment for the value 0.01: This is a placeholder for 0
if (round($final_price * 100) == 1):
$final_price = 0;
endif;
// echo ("$final_price, $final_price_correction, $final_discount, $final_discount_correction");
//echo "$srv_name: \$final_price = '$final_price', \$final_discount = '$final_discount'
";
else:
//echo ("cs_invmode: '$cs_invmode'
");
$srv_name = "PLZ $ad_plz1 nach PLZ $ad_plz2";
$srvt_name = "";
$srvp_id = $db->getOne(
"SELECT srvp_id FROM serviceplz WHERE srvp_plz = '$ad_plz1'");
$srvp2_id = $db->getOne(
"SELECT srvp_id FROM serviceplz WHERE srvp_plz = '$ad_plz2'");
if ($cs_invmode > 1):
// ... und wieder die Berliner Extra-Wurst ...
$srvpa_id = getAreaIdFromAddress($ad_street1, $ad_plz1, $ad_hsno1, $hq_id);
if ($srvpa_id == "" || $srvpa_id < "0"):
$srvpa_id = $db->getOne(
"SELECT srvpam.srvpa_id FROM serviceplzareamapping AS srvpam, serviceplzarea AS srvpa WHERE srvpam.srvp_id = '$srvp_id' AND srvpam.srvpa_id = srvpa.srvpa_id AND srvpa.hq_id = '$hq_id'");
else:
$special_address = true;
endif;
$srvpa2_id = getAreaIdFromAddress($ad_street2, $ad_plz2, $ad_hsno2, $hq_id);
if ($srvpa2_id == "" || $srvpa2_id < "0"):
$srvpa2_id = $db->getOne(
"SELECT srvpam.srvpa_id FROM serviceplzareamapping AS srvpam, serviceplzarea AS srvpa WHERE srvpam.srvp_id = '$srvp2_id' AND srvpam.srvpa_id = srvpa.srvpa_id AND srvpa.hq_id = '$hq_id'");
else:
$special_address = true;
endif;
$srv_name =
$db->getOne("SELECT srvpa_name FROM serviceplzarea WHERE srvpa_id = '$srvpa_id'") .
" (" .
$db->getOne("SELECT srvpa_longname FROM serviceplzarea WHERE srvpa_id = '$srvpa_id'") .
")" .
" nach " .
$db->getOne("SELECT srvpa_name FROM serviceplzarea WHERE srvpa_id = '$srvpa2_id'") .
" (" .
$db->getOne("SELECT srvpa_longname FROM serviceplzarea WHERE srvpa_id = '$srvpa2_id'") .
")";
endif;
//die ("'$srvpa_id' '$srvpa2_id'");
list($trs_price, $final_cr_price, $trs_discount, $final_cr_discount, $validfrom) =
$cs_invmode == 1
? getZipCodeServiceValuesWrapper($srvp_id, $srvp2_id, $cs_id, $hq_id, $cDateTime, 4, $vht_id)
: getZipcodeAreaServiceValuesWrapper($srvpa_id, $srvpa2_id, $cs_id, $hq_id, $cDateTime, 4, $vht_id);
//die("$cs_id $cs_invmode $trs_price, $trs_discount");
//echo "saveServiceCosts specific: \$cs_invmode='$cs_invmode', \$cs_id='$cs_id', \$trs_price=$trs_price, \$trs_discount=$trs_discount
";
$final_price = $trs_price;
if ($final_discount == 0)
$final_discount = $trs_discount;
if ($final_price != 0 || $final_discount != 0)
// customer-specific price has to be marked
if ($cs_id != 0 && $cs_id != "")
$customer_specific = true;
if ($final_price < 0)
$final_price_correction = $final_price;
if ($final_discount < 0)
$final_discount_correction = $final_price;
if ($final_price <= 0 || $final_discount <= 0):
//die ("$final_price, $final_discount");
// no customer-specific price: get common price
list($trs_price, $final_cr_price, $trs_discount, $final_cr_discount, $validfrom) =
$cs_invmode == 1
? getZipCodeServiceValuesWrapper($srvp_id, $srvp2_id, 0, $hq_id, $cDateTime, 4, $vht_id)
: getZipcodeAreaServiceValuesWrapper($srvpa_id, $srvpa2_id, 0, $hq_id, $cDateTime, 4, $vht_id, $srvp_id, $srvp2_id);
//die ("$trs_price=|".$trs_price."|
\n");
if ($final_price <= 0):
$final_price = $trs_price;
endif;
if ($final_discount <= 0):
$final_discount = $trs_discount;
endif;
//die ("$srvp_id, $srvp2_id, $hq_id, $cDateTime, $trs_price, $trs_discount");
endif;
endif;
endif;
//echo "saveServiceCosts common: \$cs_invmode='$cs_invmode', \$cs_id='$cs_id', \$trs_price=$trs_price, \$trs_discount=$trs_discount
";
// check costsplit
// if ($costsplit_count > 1 && $jb_cash != "true"):
// $srv_name .= " (anteilig 1/$costsplit_count)";
// $trs_price /= $costsplit_count;
// $trs_discount /= $costsplit_count;
// endif;
// die ("$srv_name: \$trs_price = '$trs_price', \$final_price = '$final_price', \$final_discount = '$final_discount'
");
if (is_string($final_price))
$final_price = (float) $final_price;
$final_price += (float) $final_price_correction;
if (is_string($final_discount))
$final_discount = (float) $final_discount;
$final_discount += (float) $final_discount_correction;
if ($final_cr_price == 0 || $final_cr_price == "") {
// Fallback for cr_price if none is defined
list($final_cr_price, $final_cr_price_rate) =
$final_cr_price = getCr_price_global($final_price, $hq_id, $cs_id, $cDateTime, $vhtSrvt_name, $vht_id);
}
// NEW: Treibstoffzuschlag
// Sonderregelung StaBo Hamburg/Berlin: Kein Treibstoffzuschlag auf Grundpreis
$final_price_markup = $final_price;
$final_cr_price_markup = $final_cr_price;
$vhtSrvt_name = $db->getOne("SELECT mt_value FROM metatype WHERE mt_sort = '$vht_id' AND mt_type = 'vehicletype'");
// $fuel_markup_cr = getFuelMarkupCr($vhtSrvt_name, (trim($cs_id) != "" ? $cs_id : 0), $hq_id, $cDateTime);
if (!($srv_name == "Grundpreis" && getParameterValue("0", "MASK_NO_MARKUP_ON_VEHICLE_PRICE", $hq_id) == "1")):
$final_price = round($final_price * (1 + ($fuel_markup / 100)), 2);
$final_cr_price = round($final_cr_price * (1 + ($fuel_cr_markup / 100)), 2);
endif;
//echo "\$final_cr_price_markup = $final_cr_price_markup
\n";
//die("$final_price, $fuel_markup, $customer_specific");
//echo ("\n
$final_price, $final_discount, $final_price_markup
");
if ($savemode == 0 && $jb_storno == 0):
// wenn der csc_id_payer der CSC_ID_PAYER_EXTERN ist, dann darf dieser natürlich nicht abgespeichert werden, sondern stattdessen der echte CSC_ID_PAYER_CASH;
// der CSC_ID_PAYER_EXTERN könnte einen eigenen inv_mode haben, der unterschiedlich zum CSC_ID_PAYER_CASH ist (z.B. in Berlin), deshalb kann diese
// Situation überhaupt erst entstehen
insertStmt("tourservice",
array("jb_id", $jb_id, "tr_sort", $tr_sort, "srv_id", (isset($srv_id) ? $srv_id : 0), "trs_srv_name",
$srv_name, "srvt_id", (isset($srvt_id) ? $srvt_id : 0), "trs_srvt_name", $srvt_name,
"trs_price", round($final_price * ((100 - $self_service_discount) / 100), 2), "trs_discount", $final_discount, "csc_id", ($jb_cash == "true" ? getParameterValue("0", "CSC_ID_PAYER_CASH", $hq_id) : $csc_id_payer)));
endif;
//return(array($costsplit_count, $jb_cash));
//if ($customer_specific) die ("customer_specific = true");
//echo ("\n
$final_price, $final_discount, $final_price_markup, $final_cr_price, $final_cr_discount, $final_cr_price_markup, $customer_specific, $special_address, $validfrom
");
//if ($srv_name != "Grundpreis") die();
//- writeLog_("../log/services_func.inc.php_", "saveServiceCosts returns: \$final_price = $final_price, \$final_discount = $final_discount, \$final_price_markup = $final_price_markup, \$final_cr_price = $final_cr_price," ." \$final_cr_discount = $final_cr_discount, \$final_cr_price_markup = $final_cr_price_markup, \$customer_specific = $customer_specific, \$special_address = $special_address, \$validfrom = $validfrom\n");
// " \$final_cr_discount = $final_cr_discount, \$final_cr_price_markup = $final_cr_price_markup, \$customer_specific = $customer_specific, \$special_address = $special_address, \$validfrom = $validfrom\n");
return(array($final_price, $final_discount + (float) $self_service_discount, $final_price_markup, $final_cr_price, $final_cr_discount, $final_cr_price_markup, $customer_specific, $special_address, $validfrom));
}
function getCr_price_global($final_price, $hq_id, $cs_id, $cDateTime, $vhtSrvt_name, $vht_id) {
global $db;
if (trim($cs_id) == "")
$cs_id = 0;
//- writeLog_("../log/services_func.inc.php_", "getCr_price_global(\$final_price = $final_price, \$cs_id = $cs_id, \$hq_id = $hq_id, \$cDateTime = $cDateTime, \$vhtSrvt_name = $vhtSrvt_name, \$vht_id = $vht_id)");
if ($vht_id != 0)
$vhtSrvt_name = $db->getOne("SELECT mt_value FROM metatype WHERE mt_sort = '$vht_id' AND mt_type = 'vehicletype'");
$vhtSrvt_id = $db->getOne(
"SELECT srvt_id FROM servicetype WHERE srvt_name = '$vhtSrvt_name' AND srvt_mode = 0 AND hq_id = '$hq_id'");
$vhtSrv_id = $db->getOne(
"SELECT srv_id FROM service WHERE srv_name = 'Globaler
Frachtverg.-Abschlag [%]' AND srv_mode = 0 AND hq_id = '$hq_id'");
list($trs_price, $cr_price, $trs_discount, $cr_discount, $validfrom) =
getServiceValues($vhtSrv_id, $vhtSrvt_id, $cs_id, $hq_id, $cDateTime, 4);
//echo "$trs_price, $cr_price, $trs_discount, $cr_discount, $validfrom
\n";
if ($cr_price == 0 || $cr_price == "")
list($trs_price, $cr_price, $trs_discount, $cr_discount, $validfrom) =
getServiceValues($vhtSrv_id, $vhtSrvt_id, 0, $hq_id, $cDateTime, 4);
if (!is_numeric($final_price))
$final_price = 0;
if (!is_numeric($cr_price))
$cr_price = 0;
$final_cr_price = round($final_price * (1 - ($cr_price / 100)), 2);
//- writeLog_("../log/services_func.inc.php_", "$price, $price_correction, $discount, $discount_correction, $cr_price, $cr_discount, $customer_specific, $validfrom");
//- writeLog_("../log/services_func.inc.php_", "getCr_price_global returns: \$final_cr_price = $final_cr_price, \$cr_price = $cr_price");
return array($final_cr_price, $cr_price);
}
function get_cr_price_rate($hq_id, $cs_id, $cDateTime, $vhtSrvt_name, $vht_id) {
global $db;
if (trim($cs_id) == "")
$cs_id = 0;
if ($vht_id != 0)
$vhtSrvt_name = $db->getOne("SELECT mt_value FROM metatype WHERE mt_sort = '$vht_id' AND mt_type = 'vehicletype'");
$vhtSrvt_id = $db->getOne(
"SELECT srvt_id FROM servicetype WHERE srvt_name = '$vhtSrvt_name' AND srvt_mode = 0 AND hq_id = '$hq_id'");
$vhtSrv_id = $db->getOne(
"SELECT srv_id FROM service WHERE srv_name = 'Globaler
Fuhrlohnabschlag [%]' AND srv_mode = 0 AND hq_id = '$hq_id'");
list($trs_price, $cr_price_rate, $trs_discount, $cr_discount, $validfrom) =
getServiceValues($vhtSrv_id, $vhtSrvt_id, $cs_id, $hq_id, $cDateTime, 4);
if ($cr_price_rate == 0 || $cr_price_rate == "")
list($trs_price, $cr_price_rate, $trs_discount, $cr_discount, $validfrom) =
getServiceValues($vhtSrv_id, $vhtSrvt_id, 0, $hq_id, $cDateTime, 4);
return $cr_price_rate;
}
function get_cr_price_longhaul($cr_id, $cs_id, $vht_id, $jb_km, $round_km, $starting_m, $jb_km_unrounded, $cDateTime, $hq_id_dispo, $jbprc_cr_subtotal) {
// $jb_km = round($db->getOne("SELECT jbprc_price FROM jobprice WHERE jb_id = " . $jb_id . " AND mt_sort = 11"), 2);
global $db;
writeLog_("../log/services_func.inc.php_", "get_cr_price_longhaul: \$cr_id = " . $cr_id . ", \$cs_id = " . $cs_id . ", \$vht_id = " . $vht_id . ", \$jb_km = " . $jb_km . ", \$round_km = " . $round_km . ", \$starting_m = " . $starting_m . ", \$jb_km_unrounded = " . $jb_km_unrounded . ", \$cDateTime = " . $cDateTime . ", \$hq_id_dispo = " . $hq_id_dispo);
// $hq_id = $db->getOne("SELECT hq_id FROM courier WHERE cr_id = " . $cr_id);
$cr_price_longhaul = 0;
$srvt_name = $db->getOne("SELECT mt_value FROM metatype WHERE mt_sort = '" . $vht_id . "' AND mt_type = 'vehicletype'");
$cr_fuel_markup = getFuelMarkupCr($srvt_name, $cs_id, $hq_id_dispo, $cDateTime);
// Frachtvergütung nach Rundkilometern
list($price_per_km_rund, $price_per_km_rund_correction, $final_discount, $final_discount_correction, $cr_price_per_km_rund, $final_cr_discount, $customer_specific) =
getServicePrices("Rund-km-Preis", $srvt_name, $cs_id, $hq_id_dispo, $cDateTime, 0, $final_discount, 0, false);
if ($price_per_km_rund == "")
$price_per_km_rund = 0;
if ($cr_price_per_km_rund == 0 || $cr_price_per_km_rund == "") {
// Fallback for cr_price if none is defined
list($cr_price_per_km_rund, $cr_price_per_km_rund_rate) =
getCr_price_global($price_per_km_rund, $hq_id_dispo, $cs_id, $cDateTime, $srvt_name, $vht_id);
writeLog_("../log/services_func.inc.php_", "get_cr_price_longhaul: \$hq_id_dispo = " . $hq_id_dispo . ", \$cs_id = " . $cs_id . ", \$vht_id = " . $vht_id . ", \$cr_price_per_km_rund = " . $cr_price_per_km_rund . ", \$price_per_km_rund = " . $price_per_km_rund . ", \$cr_price_per_km_rund_rate = " . $cr_price_per_km_rund_rate . ", \$srvt_name = " . $srvt_name . ", \$cDateTime = " . $cDateTime);
}
if ($cr_price_per_km_rund == "")
$cr_price_per_km_rund = 0;
list($basic_price, $basic_price_correction, $basic_discount, $basic_discount_correction, $basic_cr_price, $basic_cr_discount, $customer_specific) =
getServicePrices("Grundpreis", $srvt_name, $cs_id, $hq_id_dispo, $cDateTime, 0, $final_discount, 0, false);
if ($basic_price == "")
$basic_price = 0;
if ($basic_cr_price == 0 || $basic_cr_price == "") {
// Fallback for cr_price if none is defined
list($basic_cr_price, $basic_cr_price_rate) =
getCr_price_global($basic_price, $hq_id_dispo, $cs_id, $cDateTime, $srvt_name, $vht_id);
}
if ($basic_cr_price == "")
$basic_cr_price = 0;
$cr_price_longhaul_sub_rund = $basic_cr_price + ($round_km * $cr_price_per_km_rund);
// Frachtvergütung nach Lastkilometern
// list($price_per_km_last, $price_per_km_last_correction, $final_discount, $final_discount_correction, $cr_price_per_km_last, $final_cr_discount, $customer_specific) =
// getServicePrices("km-Preis", $srvt_name, $cs_id, $hq_id_dispo, $cDateTime, 0, $final_discount, 0, false);
// if ($price_per_km_last == "")
// $price_per_km_last = 0;
// if ($cr_price_per_km_last == 0 || $cr_price_per_km_last == "") {
// // Fallback for cr_price if none is defined
// list($cr_price_per_km_last, $cr_price_per_km_last_rate) =
// getCr_price_global($price_per_km_last, $hq_id_dispo, $cs_id, $cDateTime, $srvt_name, $vht_id);
// }
// if ($cr_price_per_km_last == "")
// $cr_price_per_km_last = 0;
// $cr_price_longhaul_sub_last = $jb_km * $cr_price_per_km_last;
$cr_price_longhaul_sub_last = $jbprc_cr_subtotal;
// das günstigere von beiden Ergebnissen wird genommen
$cr_price_longhaul_sub = min($cr_price_longhaul_sub_rund, $cr_price_longhaul_sub_last);
$cr_price_longhaul = round($cr_price_longhaul_sub * (100 + $cr_fuel_markup) / 100, 2);
// Frachtvergütung nur Hinfahrt nach Rundkilometern
$cr_price_longhaul_one_way_sub = $basic_cr_price + (round($starting_m / 1000 + $jb_km_unrounded) * $cr_price_per_km_rund);
$cr_price_longhaul_one_way = round($cr_price_longhaul_one_way_sub * (100 + $cr_fuel_markup) / 100, 2);
writeLog_("../log/services_func.inc.php_", "get_cr_price_longhaul: \$srvt_name = " . $srvt_name . ", \$cr_fuel_markup = " . $cr_fuel_markup . ", \$basic_cr_price = " . $basic_cr_price . ", \$cr_price_per_km_rund = " . $cr_price_per_km_rund . ", \$cr_price_longhaul_sub_rund = " . $cr_price_longhaul_sub_rund . ", \$cr_price_per_km_last = " . $cr_price_per_km_last . ", \$cr_price_longhaul_sub_last = " . $cr_price_longhaul_sub_last . ", \$cr_price_longhaul_sub = " . $cr_price_longhaul_sub . ", \$cr_price_longhaul = " . $cr_price_longhaul . ", \$cr_price_longhaul_one_way_sub = " . $cr_price_longhaul_one_way_sub . ", \$cr_price_longhaul_one_way = " . $cr_price_longhaul_one_way);
return array($cr_price_longhaul, $cr_price_longhaul_sub, round($cr_price_longhaul_sub_rund * (100 + $cr_fuel_markup) / 100, 2), round($cr_price_longhaul_sub_last * (100 + $cr_fuel_markup) / 100, 2), $cr_price_longhaul_one_way, $cr_price_longhaul_one_way_sub, $basic_cr_price, $cr_price_per_km_rund, $cr_price_per_km_last, $cr_fuel_markup);
}
function getJobCosts($job, $mode = "")
{
global $PHP_SELF, $db2, $dbh_jb, $dbh_trs;
if (!isset($dbh_jb) || trim($dbh_jb) == "")
$dbh_jb = "job";
if (!isset($dbh_trs) || trim($dbh_trs) == "")
$dbh_trs = "tourservice";
$hq_id_job = $db2->getOne("SELECT hq_id FROM $dbh_jb WHERE jb_id = " . $job["jb_id"]);
$job_sum = 0;
// bei Kurieren erst abchecken, ob ein Unternehmerfuhrlohn vorhanden ist
if ($mode == "courier"):
if ($hq_id_job > 1000):
$crvh_prov = $db2->getOne("SELECT crvh_prov FROM couriervehicle WHERE crvh_sid = '" . $db2->getOne("SELECT cr_sid FROM $dbh_jb WHERE jb_id = " . $job["jb_id"]) . "'");
$tmp_price = $db2->getOne("SELECT jb_cr_price FROM $dbh_jb WHERE jb_id = " . $job["jb_id"]);
$job_sum = round($tmp_price * (100 - $crvh_prov) / 100, 2);
elseif ($db2->getOne("SELECT hq_id FROM $dbh_jb WHERE jb_id = " . $job["jb_id"]) > 100):
$job_sum = $db2->getOne("SELECT jb_cr_subprice FROM $dbh_jb WHERE jb_id = " . $job["jb_id"]);
else:
$job_sum = $db2->getOne("SELECT jb_cr_price FROM $dbh_jb WHERE jb_id = " . $job["jb_id"]);
endif;
endif;
if ($hq_id_job > 1000):
$jb_totalprice = round($db2->getOne("SELECT jb_totalprice FROM $dbh_jb WHERE jb_id = " . $job["jb_id"]) * 1.19, 2);
$sum_jbp_price_counter = round($db2->getOne("SELECT SUM(jbp_price) FROM jobpayment WHERE jb_id = " . $job["jb_id"] . " AND jbp_counter = 1") * 1.19, 2);
$sum_jbp_price_bar = round($db2->getOne("SELECT SUM(jbp_price) FROM jobpayment WHERE jb_id = " . $job["jb_id"] . " AND jbp_counter = 0 AND jbp_mode = 0") * 1.19, 2);
$sum_jbp_price_ec = round($db2->getOne("SELECT SUM(jbp_price) FROM jobpayment WHERE jb_id = " . $job["jb_id"] . " AND jbp_counter = 0 AND jbp_mode = 1") * 1.19, 2);
$sum_jbp_price_soll = $jb_totalprice - $sum_jbp_price_counter;
$costArr[] = array("FuhrlohnFixpreis", $job_sum * 1.19);
$costArr[] = array("Soll", $sum_jbp_price_soll);
$costArr[] = array("EC", $sum_jbp_price_ec);
$costArr[] = array("Bar", $sum_jbp_price_bar);
$costArr[] = array("offen", $sum_jbp_price_soll - $sum_jbp_price_ec - $sum_jbp_price_bar);
return $costArr;
endif;
$jb_ordertime = $db2->getOne("SELECT jb_ordertime FROM $dbh_jb WHERE jb_id = " . $job["jb_id"]);
// Achtung: Aufträge mit $job_sum != 0 vor MASK_CR_PRICE_MODE_DATE (z.B. Fuhrlohn aus Calculator) fallen hier durchs Raster!
// Problem: Nach dem 01.03. nacherfasste Aufträge mit Erledigungsdatum vor dem 01.03. haben zwar $job_sum != 0 (d.h. jb_cr_price != 0), werden aber noch ohne jb_cr_price exportiert
if ($mode == "courier" && (($job_sum != 0 && ($hq_id_job > 100 || MASK_CR_PRICE_MODE != "1")) || (MASK_CR_PRICE_MODE == "1" && strtotime(MASK_CR_PRICE_MODE_DATE) < strtotime($jb_ordertime)))):
$costArr[] = array("FuhrlohnFixpreis", $job_sum);
$costArr[] = array("FuhrlohnAuftragssumme", $job_sum);
return $costArr;
else:
$job_sum = 0;
// fetch costs and return them
$sqlquery =
"SELECT tr_sort, trs_srv_name, trs_srvt_name, trs_price, trs_discount " .
"FROM $dbh_trs WHERE jb_id = '" . $job["jb_id"] . "' AND NOT (trs_srvt_name = 'z' AND trs_price = 0)";
$res = $db2->query($sqlquery);
//echo "services_func.inc.php: [" . $sqlquery . "]\n";
if (DB::isError($res)):
reportDie ("$PHP_SELF: '$sqlquery' : " . $res->getMessage());
endif;
$costArr = array();
$prev_tr_sort = -1;
while (($row = $res->fetch_assoc()) || (isset($is_jb_fixprice) && $is_jb_fixprice)):
$tmp_srv_name = str_replace("
", " ", $row["trs_srv_name"]) . " " . $row["trs_srvt_name"];
$tmp_srv_name = str_replace(" ", " ", $tmp_srv_name);
// Kostensplit: Anteil ausweisen
if ($job["cnt_costsplit"] > 1):
$tmp_srv_name .= " (anteilig 1/" . $job["cnt_costsplit"] . ")";
endif;
// Posten nur übernehmen, wenn kein Kostensplit bzw.
// bei Kostensplit nur einmal pro Posten
if ($job["cnt_costsplit"] == 1 || ($job["cnt_costsplit"] > 1 && $prev_tr_sort != $row["tr_sort"])):
$crvh_prov = 0;
$tmp_price = ($row["trs_price"] * ((100 - $row["trs_discount"]) / 100));
if ($mode == "courier" && INV_JB_CR_PRICE == 1):
$crvh_prov = $db2->getOne("SELECT crvh_prov FROM couriervehicle WHERE crvh_sid = '" . $db2->getOne("SELECT cr_sid FROM $dbh_jb WHERE jb_id = " . $job["jb_id"]) . "'");
$tmp_price = round($tmp_price * (100 - $crvh_prov) / 100, 2);
endif;
$job_sum += $tmp_price;
$costArr[] = array($tmp_srv_name, $tmp_price);
$prev_tr_sort = $row["tr_sort"];
endif;
endwhile;
$res->free();
endif;
$costArr[] = array("Auftragssumme", $job_sum);
// print_r($costArr);
// echo "
";
return $costArr;
}
function getJobCostsByID($jb_id)
{
global $PHP_SELF, $db;
$jobCostArr = array();
$sqlquery = "SELECT DISTINCT job.jb_id, job.csc_id, job.jb_ordertime, " .
"job.cr_id, job.jb_finishtime, job.emp_id, job.jb_fixprice, job.csc_id_payer, tour.csc_id AS csc_id_tour " .
"FROM job, tour WHERE job.jb_id = '$jb_id' AND job.jb_id = tour.jb_id " .
"ORDER BY job.jb_finishtime, tour.tr_sort";
$job_list = mk_job_list($sqlquery, false);
foreach ($job_list as $job)
{
if ($job["csc_id_payer"] == "-1"): // cash payment
$jobCostArr[] = array(
"BARZAHLUNG",
getJobCosts($job));
else:
$jobCostArr[] = array(
$db->getOne("SELECT csc_name FROM costcenter WHERE csc_id = '" . $job["csc_id_payer"] . "'"),
getJobCosts($job)
);
endif;
}
return $jobCostArr;
}
// Returns the price for a specified article, group/customer and (optional) metatype "mt_sort" for special kind of price (e.g. "familycard")
// $at Id : id of the article
// $cDateTime : point of time (format: "yyyy-mm-dd HH:MM:SS")
// $grpId : id of the group
// $csId : id of the customer (0 = no special customer, look for group)
// $mtSort : value for the kind of special price (e.g. "familycard") ["" <=> standard price, >=0 <=> special price]
// $mode : mode of the return-value
// 0 = price only
// 1 = array with computed conditions inclusive the price
function getArticleServiceValues($atId, $cDateTime, $grpId, $csId = "", $mtSort = "", $mode = 0) {
global $db, $PHP_SELF;
$price = "";
if (($atId != "" && is_numeric($atId) && $atId > "0") && $cDateTime != "" && (($grpId != "" && is_numeric($grpId) && $grpId > "0") || ($csId != "" && is_numeric($csId) && $csId > "0"))):
$whereClause = " atp.grp_id = '" . $grpId . "' AND atp.cs_id = '0' AND "; // "cs_id" has to be "0" because exclusion of customer specific prices (group only) !!!!
if ($csId != "" && is_numeric($csId) && $csId > 0) :
$whereClause = " atp.cs_id = '" . $csId . "' AND ";
endif;
$sqlquery = "SELECT atp.atp_price"
. " FROM articleprice AS atp"
. " WHERE atp.at_id = '" . $atId . "' AND"
. " atp.mt_sort = '" . $mtSort . "' AND"
. $whereClause
. " atp.atp_validfrom <= '" . $cDateTime . "'"
. " ORDER BY atp.atp_validfrom DESC";
$result = $db->query($sqlquery);
if (DB::isError($result)) die ("$PHP_SELF: '$sqlquery':" . $result->getMessage());
// $price = "0";
if ($row = $result->fetch_assoc()):
$price = $row["atp_price"];
endif;
$result->free();
endif;
switch($mode) {
case "0" :
return $price; break;
case "1" :
return array($price,$discount); break;
default :
return $price; break;
};
}
// Returns the price and the discount for a specified service, servicetype and (optional) customer
// $srvprchObjType : type of the service price
// $srvprchObjId : id of the service price
// $srvprchFieldname : field name of the value
// $srvprchValidfrom : point of time (format: "yyyy-mm-dd HH:MM:SS")
// $mode : mode of the return-value
// 0 = price only
// 1 = array with price and context
function getServicePriceHistoryValues($srvprchObjType, $srvprchObjId, $srvprchFieldname, $srvprchValidfrom, $mode = 0) {
global $db, $PHP_SELF;
$price = "";
$discount = "";
// echo "'$srvprchObjType' '$srvprchObjId' '$srvprchFieldname' '$srvprchValidfrom'" . "\n\n";
if ($srvprchObjType != "" && $srvprchObjId != "" && $srvprchFieldname != "" && $srvprchValidfrom != ""):
$sqlquery = "SELECT srvprch.srvprch_price, srvprch.srvprch_context, srvprch.srvprch_validfrom"
. " FROM servicepricehistory AS srvprch"
. " WHERE srvprch.srvprch_obj_type = '" . $srvprchObjType . "'"
. " AND srvprch.srvprch_obj_id = '" . $srvprchObjId . "'"
. " AND srvprch.srvprch_fieldname = '" . $srvprchFieldname . "'"
. " AND srvprch.srvprch_validfrom <= '" . $srvprchValidfrom . "'"
. " ORDER BY srvprch.srvprch_validfrom DESC";
$result = $db->query($sqlquery);
// echo $sqlquery . "\n\n";
//writeLog_("../log/services_func.inc.php_", $sqlquery);
if (DB::isError($result)) die ("$PHP_SELF: '$sqlquery':" . $result->getMessage());
$price = "0";
$context = "";
$validfrom = "0000-00-00 00:00:00";
if ($row = $result->fetch_assoc()):
$price = $row["srvprch_price"];
$context = $row["srvprch_context"];
$validfrom = $row["srvprch_validfrom"];
endif;
$result->free();
endif;
switch($mode) {
case "0" :
return $price; break;
case "1" :
return array($price,$context,$validfrom); break;
default :
return $price; break;
};
}
?>