["de"] : "niets")."' (Duits)"); } if (isset($_POST["adminmusttranslate"])) { //POST data MAY contain umlauts etc. // ==> utf8_decode to go correctly to MySQ> Language::saveAdminMustTranslation(); PageNew::admin("Vertalingen opgeslagen: '"); } } } else { Debug::addItem("includes.php", "", "Strange admin_settings result", "crash"); } define("RECAPTCHA_PUBLIC_KEY", "6Lc-fxcTAAAAAPDqS9uBSRu9rMt5qclV4Hvk9BO4"); define("RECAPTCHA_SECRET_KEY", "6Lc-fxcTAAAAAK0Z8HKK9u5gdJFotNG2Y6OC7qxu"); /* AFTER classesRead, handle the unexpected POST data */ if (isset($_POST["newmessage"])) { Messages::saveNewMessage(); } if (isset($_POST["deletemessage"])) { Messages::deleteMessage(); } if (isset($_POST["editmessage"])) { Messages::editMessage(); } Debug::addItem("includes.php", "", "All includes done", "info"); /* VANAF DIT PUNT ALLEEN NOG MAAR FUNCTIE DECLARATIES. Er gebeurt verder niets. */ function getCaptchaResult($recaptcha) { $google_url = "https://www.google.com/recaptcha/api/siteverify"; $data_to_post = array(); $data_to_post['secret'] = RECAPTCHA_SECRET_KEY; $data_to_post['response'] = $recaptcha; $data_to_post['remoteip'] = $_SERVER['REMOTE_ADDR']; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $google_url); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POST, sizeof($data_to_post)); curl_setopt($curl, CURLOPT_POSTFIELDS, $data_to_post); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($curl, CURLOPT_TIMEOUT, 10); curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16"); if (RUNNING_ON_LOCALHOST) { //Prevent ssl hickups curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); } $res = curl_exec($curl); if (!$res) { Debug::addItem("includes.php", "function getCaptchaResult", "curl fout: ".curl_error($curl), "semicrash"); return false; } curl_close($curl); $res = json_decode($res, true); //reCaptcha success check if ($res['success']) { return true; } else { Debug::addItem("includes.php", "function getCaptchaResult", "[R][".$_SERVER['REMOTE_ADDR']."] Captcha fout op ".$_SERVER["SERVER_NAME"].$_SERVER['REQUEST_URI'], "semicrash"); } return false; } function getSearchFields($theQuestion, $options) { return "
"; } function getExtension($str) { $i = strrpos($str,"."); if (!$i) { return ""; } $l = strlen($str) - $i; $ext = substr($str,$i+1,$l); return $ext; } $odd = false; function createSnippet($image_url, $h2String, $pString, $someDate, $footerString, $adminString) { //31/12/2016 Debug::addItem("includes.php", "function createSnippet", "DO NOT USER headerOrData", "semicrash"); global $odd; $odd = !$odd; if (is_array($pString)) { dieNice("Array"); $pArray = $pString; $pString = ""; foreach ($pArray as $pNameAndValue) { $pString .= "
" ."
" ."".$pNameAndValue["name"]."" ."
" ."
" ."".$pNameAndValue["value"]."" ."
" ."
"; } } else { $pString = "

".$pString."

"; } return "" ."" ."" ."" .( $image_url == "" ? "" : "
" ) .$pString."" ."
" ."" ."" ."

".$h2String."

" .($adminString == "" ? "" : "".$adminString."") .($someDate ? "

".$someDate->getDateTimeString(false)." ".$footerString."

" : "") ."
"; } function getMini($headerOrData, $content, $bottom = "") { //31/12/2016 -- it is used in film.php //Debug::addItem("includes.php", "function getMini", "Who uses this?", "semicrash"); if ($headerOrData != "") { Debug::addItem("includes.php", "function getMini", "DO NOT USER headerOrData", "semicrash"); } return "
".$content."
".$bottom."
"; } function google_qr($url, $size ='150', $EC_level='L',$margin='0') { $url = urlencode($url); return 'QR code'; } $indexStringSQLResult = array(); function getMijnzzpIndexString() { return getMijnzzpIndexStringText().getMijnzzpIndexStringRaw(); } function getMijnzzpIndexStringText() { return "

" .Language::getString("Mijnzzp Index: rapportcijfers voor de bedrijven") ."

" .Language::getString("Bedrijven kunnen vrijwillig meedoen aan de Mijnzzp Index.")." " .Language::getString("De berekeningsmethode is geheim.")." " .Language::getString("Hoe hoger, hoe beter.")." " .HREF::getA("Index") .Language::getString("Meer informatie lees u hier.") ."

"; } function getMijnzzpIndexStringRaw($includeBars = true) { global $database; global $theUser; $mijnzzpIndexString = ""; global $indexStringSQLResult; $myQuery = "SELECT count(*) as thecount, IF(maysee = 'internet', 1, ".($theUser->isLoggedIn() ? "IF(maysee = 'members', 1, 0)" : "0").") * joinrank * ceiling((rank+1)/100) as therank from userdetails GROUP BY therank"; if (isset($indexStringSQLResult[$myQuery])) { $result = $indexStringSQLResult; } else { $result = $database->doQuery($myQuery); $indexStringSQLResult[$myQuery] = $result; } $currentRankCount = array(); $highestRankCount = 0; if (isset($result) && count($result) > 0) { foreach ($result as $someresult) { if ($someresult["therank"] != 0) { $currentRankCount[$someresult["therank"]] = $someresult["thecount"]; $highestRankCount = max($highestRankCount, $someresult["thecount"]); } else { $currentRankCount[$someresult["therank"]] = $someresult["thecount"]; $highestRankCount = max($highestRankCount, 50); //Dummy } } for ($i = 10; $i >= 5; $i--) { if (isset($currentRankCount[$i])) { $mijnzzpIndexString .= "
" .($i == 0 ? "" : HREF::getA("Bedrijven/Index", $i, $i)) ."
".$i."
" .($currentRankCount[$i] == 1 ? Language::getString("1 bedrijf") : Language::getString("***1*** bedrijven", "".$currentRankCount[$i])) .($i == 0 ? "" : "") ."
"; } } } return $mijnzzpIndexString; } function getMijnzzpIndexStringHorizontal() { $mijnzzpIndexString = ""; for ($i = 0; $i < 10; $i++) { if ($i < 5) { // } else { $mijnzzpIndexString .= "
" .($i == 0 ? "" : HREF::getA("Bedrijven/Index", $i, $i)) //."".Language::getString("Mijnzzp Index")." ".$i."/10"."" ."
".$i."
" .($i == 0 ? "" : "") ."
"; } } return $mijnzzpIndexString; } function getImagesQuickAndDirty($someHtml) { $theImages = array(); preg_match_all("/]*>/", $someHtml, $imgTagMatches); if (isset($imgTagMatches[0]) && count($imgTagMatches[0]) > 0) { foreach ($imgTagMatches[0] as $imgTagMatch) { preg_match("/image\/(\d+\/)+(.+?\.)[a-zA-Z]{3,4}/", $imgTagMatch, $matches); if (isset($matches[0])) { //We have a src! $rawImageFileName = $matches[0]; $myIdString = ""; $myFileName = ""; $exploded = explode("/", $rawImageFileName); foreach($exploded as $something) { if (is_numeric($something)) { $myIdString .= $something; } $myFileName = $something; } /* Maybe we have a title tag? */ $title = ""; preg_match("/title\=[\'\"]{1}(.*?)[\'\"]{1}/", $imgTagMatch, $titleMatches); if (isset($titleMatches[1]) && strlen($titleMatches[1]) > 0) { $title = $titleMatches[1]; } /* Test it. Is this actually an image? */ $theImage = new Image(); $theImage->setById(0 + $myIdString); if ($theImage->getFileName() == $myFileName) { $obj["imgObj"] = $theImage; if ($title != "") { $obj["titleTag"] = $title; } $theImages[] = $obj; } } } } /* echo ""; print_r($theImages); echo ""; die(); */ return $theImages; } function xHtmlCleaner($dirtyHtml) { //die("".$dirtyHtml.""); //Debug::addItem("includes.php", "function xHtmlCleaner", "Who is calling???", "semicrash"); //Debug::addItem("includes.php", "function xHtmlCleaner()", "Calling this function!", "info"); $myPrefix = "BLABLABLA"; $myLog = ""; /* Find Img tags */ $numImages = 0; $myPattern = "/]*>/"; while(preg_match($myPattern, $dirtyHtml, $matches) > 0) { $imageString[$numImages] = $matches[0]; //echo ""; print_r($matches); echo ""; $myLog .= "Found image: ".$matches[0].""; $dirtyHtml = preg_replace($myPattern, $myPrefix."IMAGENUMBER[".$numImages."]", $dirtyHtml, 1); $numImages++; } if (isset($imageString)) { foreach ($imageString as $number => $someString) { if (strpos($someString, "zanox") > 0) { //Do nothing... } else { $myLog .= "
"; $myLog .= "Analysing Image #".$number.""; $myLog .= " Img tag original is: ".$someString.""; $myNewStyleString = "max-width: 110%; "; //height (EXCLUDE: max-height) $myLog .= " ------ HEIGHT ----------"; $height = 0; $heightUnit = ""; if (preg_match("/^-height\:[\s]*([0-9]*)(px|\%)\;{0,1}/", $someString, $heightMatch) > 0) { $myLog .= " Found 'height:' (probably inside 'style=') with value ".$heightMatch[1]." and unit ".$heightMatch[2].""; $height = $heightMatch[1]; $heightUnit = $heightMatch[2]; $someString = str_replace($heightMatch[0], "", $someString); $myLog .= " --> Removed 'height:' from tag. Tag is now ".$someString.""; } else { $myLog .= " No 'height:' (probably inside 'style=') seems to be present"; } if (preg_match("/height=[\"']{0,1}([\d]+)(px|\%)[\"']{0,1}/", $someString, $heightMatch) > 0) { $myLog .= " Found 'height=' with value ".$heightMatch[1]." and unit ".$heightMatch[2].""; if ($height == 0) { $height = $heightMatch[1]; $heightUnit = $heightMatch[2]; } else if ($height != $heightMatch[1] || $heightUnit != $heightMatch[2]) { Debug::addItem("includes.php", "function xHtmlCleaner", "Conflict in height ".$height.$heightUnit." vs ".$heightMatch[1].$heightMatch[2], "semicrash"); } $someString = str_replace($heightMatch[0], "", $someString); $myLog .= " --> Removed 'height=' from tag. Tag is now ".$someString.""; } else { $myLog .= " No 'height=' seems to be present"; } if ($height != 0) { $myNewStyleString .= "height: ".$height.$heightUnit."; "; $myLog .= " --> Copied height to stylestring, stylestring is now: ".$myNewStyleString.""; } //width (EXCLUDE: max-width) $myLog .= " ------ WIDTH ----------"; $width = 0; $widthUnit = ""; if (preg_match("/^-width\:[\s]*([0-9]*)(px|\%)\;{0,1}/", $someString, $widthMatch) > 0) { $myLog .= " Found 'width:' (probably inside 'style=') with value ".$widthMatch[1]." and unit ".$widthMatch[2].""; $width = $widthMatch[1]; $widthUnit = $widthMatch[2]; $someString = str_replace($widthMatch[0], "", $someString); $myLog .= " --> Removed 'width:' from tag. Tag is now ".$someString.""; } else { $myLog .= " No 'width:' (probably inside 'style=') seems to be present"; } if (preg_match("/width=[\"']{0,1}([\d]+)(px|\%)[\"']{0,1}/", $someString, $widthMatch) > 0) { $myLog .= " Found 'width=' with value ".$widthMatch[1]." and unit ".$widthMatch[2].""; if ($width == 0) { $width = $widthMatch[1]; $widthUnit = $widthMatch[2]; } else if ($width != $widthMatch[1] || $widthUnit != $widthMatch[2]) { Debug::addItem("includes.php", "function xHtmlCleaner", "Conflict in width ".$width.$widthUnit." vs ".$widthMatch[1].$widthMatch[2], "semicrash"); } $someString = str_replace($widthMatch[0], "", $someString); $myLog .= " --> Removed 'width=' from tag. Tag is now ".$someString.""; } else { $myLog .= " No 'width=' seems to be present"; } if ($width != 0) { $myNewStyleString .= "width: ".$width.$widthUnit."; "; $myLog .= " --> Copied width to stylestring, stylestring is now: ".$myNewStyleString.""; } $myLog .= " -- OTHER STYLE THINGS -"; //hspace if (preg_match("/hspace=[\"']{0,1}([\d]+[\w]+)[\"']{0,1}/", $someString, $matches) > 0) { $myNewStyleString .= "margin-left: ".$matches[1].(is_numeric($matches[1]) ? "px" : "")."; "; $myNewStyleString .= "margin-right: ".$matches[1].(is_numeric($matches[1]) ? "px" : "")."; "; $someString = preg_replace($myPattern, "", $someString); $myLog .= " --> Moved hspace to stylestring, stylestring is now: ".$myNewStyleString.""; $myLog .= " --> Tag is now: ".$someString.""; } //align if (preg_match("/align=[\"']{0,1}([\w]+)[\"']{0,1}/", $someString, $matches) > 0) { $myNewStyleString .= "float: ".$matches[1]."; "; $someString = preg_replace($myPattern, "", $someString); $myLog .= " --> Moved align to stylestring, stylestring is now: ".$myNewStyleString.""; $myLog .= " --> Tag is now: ".$someString.""; } //Clean double spaces $someString = preg_replace("/[\s]+/", " ", $someString); $myLog .= " Removed spaces. String is now: ".$someString.""; //Insert stylestring if (strpos($someString, "style") > 0) { $someString = str_replace( array("style=\"", "style='"), array("style=\"".$myNewStyleString, "style='".$myNewStyleString), $someString ); } $myLog .= " Inserted new stylestring. Tag is now: ".$someString.""; //Clean double spaces $someString = preg_replace("/[\s]+/", " ", $someString); $myLog .= " Removed spaces. String is now: ".$someString.""; //Src attribute $myLog .= " ------ SRC ------------"; if (preg_match("/src\=[\"\']+(.*?)[\"\']+/", $someString, $srcMatch) > 0) { $originalSrcElement = $srcMatch[0]; $originalSrcUrl = $srcMatch[1]; $myLog .= " Found src: ".$originalSrcElement.", pointing to ".$originalSrcUrl.""; if (strpos($originalSrcUrl, "image/") === false) { //Nothing we can do here $myLog .= " Cannot handle this URL, except changing spaces to percent20."; if (strpos($originalSrcUrl, " ") > 0) { $someString = str_replace($originalSrcUrl, str_replace(" ", "%20", $originalSrcUrl), $someString); $myLog .= " Changed spaces. Tag is now ".$someString.""; } } else if (strpos($originalSrcUrl, "ata:")) { //This is a base-64 data uri scheme //Nothing we can do here $myLog .= " Cannot handle base-64 data"; } else { $imagePath = substr($originalSrcUrl, strpos($originalSrcUrl, "image/")); $exploded = explode("/", $imagePath); if (count($exploded) > 2) { $multiplier = 1; $calculatedId = 0; for ($i = count($exploded) - 2; $i > 0; $i--) { $calculatedId += $multiplier * (0 + $exploded[$i]); $multiplier = $multiplier * 10; } //Now we have an imageId $myLog .= " This seems to be the image with id ".$calculatedId.""; $thisImage = new Image(); $thisImage->setById($calculatedId); $newUrl = ""; if ($width > 0 && $height > 0) { $newUrl = $thisImage->getUrl(array("hostroot" => HOSTROOT, "width" => $width, "height" => $height)); } else { $newUrl = $thisImage->getUrl(array("hostroot" => HOSTROOT)); } $someString = str_replace($originalSrcUrl, str_replace(" ", "%20", $newUrl), $someString); $myLog .= " --> Replaced url. Tag is now ".$someString.""; } } if (strpos($originalSrcUrl, "ata:")) { //This is a base-64 data uri scheme //Nothing we can do here } else { if (strpos($someString, "1x1_") > 0) { // Debug::addItem("includes.php", "function xHtmlCleaner()", "Second time? Image string is already: ".$someString, "semicrash"); } else { //Let's get this image lazy-loading $someString = str_replace("src=", "src=\"".HOSTROOT."image/1x1_placeholder.png\" class=\"lazy\" data-src=", $someString); $myLog .= "Lazy ".$someString.""; } } } if ($width > 0 && $widthUnit == "px") { $someString = str_replace(""; } if ($height > 0 && $heightUnit == "px") { $someString = str_replace(""; } } //Insert in dirtyHtml $dirtyHtml = str_replace($myPrefix."IMAGENUMBER[".$number."]", $someString, $dirtyHtml); $myLog .= "Re-inserted this image."; } } /* Find youtube tags / iFrames */ $youtubeSecretCode = '

'; $dirtyHtml = str_replace($youtubeSecretCode, "", $dirtyHtml); //DE REST van YouTube afhandeling zit in classPage.php /* Eggie: ads */ $eggieCode = '

'; $eggieCodePos = strpos($dirtyHtml, $eggieCode); if ($eggieCodePos > 0) { /* Eggie has placed Ads AND >1 ads are allowed*/ while ($eggieCodePos > 0) { /* DOT NOT str_replace all at once. We need a unique id in each replacement */ $dirtyHtml = substr_replace( $dirtyHtml, AdServer::getBannerNewNew(GOOGLE_NIEUWE_LAYOUT_DOOR_EGGIE_GEPLAATST), $eggieCodePos, strlen($eggieCode) ); $myLog .= "Replaced input hans/reclame by Google ad."; $eggieCodePos = strpos($dirtyHtml, $eggieCode); } } /* Eggie: ads ZANOX */ $eggieCode = '

'; $eggieCodePos = strpos($dirtyHtml, $eggieCode); if ($eggieCodePos > 0) { /* Eggie has placed Ads AND >1 ads are allowed*/ while ($eggieCodePos > 0) { /* DOT NOT str_replace all at once. We need a unique id in each replacement */ $dirtyHtml = substr_replace( $dirtyHtml, AdServer::getBannerNewNew(GOOGLE_NIEUWE_LAYOUT_DOOR_EGGIE_GEPLAATST), $eggieCodePos, strlen($eggieCode) ); $myLog .= "Replaced input h/r by Zanox ad."; $eggieCodePos = strpos($dirtyHtml, $eggieCode); } } $eggieCode = '

'; $eggieCodePos = strpos($dirtyHtml, $eggieCode); if ($eggieCodePos === False) { //No, it is not here } else { preg_match_all("/(.*?<\/h[23]>)/", $dirtyHtml, $matches); if (isset($matches[0]) && count($matches[0]) > 0) { $contents = ""; $num = 1; foreach ($matches[0] as $match) { if ($contents != "") { $contents .= "
"; } $thisString = strip_tags($match); $tagId = str_replace(" ", "-", $thisString); $tagId = str_replace("'", "", $tagId); $tagId = str_replace("\"", "", $tagId); $tagId = str_replace("?", "", $tagId); $tagId = str_replace("!", "", $tagId); if (strpos($match, "h2") > 0) { $matchReplace = str_replace("

", "

", $match); $dirtyHtml = str_replace($match, $matchReplace, $dirtyHtml); $contents .= "".$thisString.""; $num++; } else if (strpos($match, "h3") > 0) { $matchReplace = str_replace("

", "

", $match); $dirtyHtml = str_replace($match, $matchReplace, $dirtyHtml); $contents .= "• ".$thisString.""; } } } $dirtyHtml = str_replace($eggieCode, "

Inhoudsopgave
".$contents, $dirtyHtml); } return $dirtyHtml; } function standardHTMLBannerCode($size, $urlToSWF, $urlToDestination) { return " ".$urlToDestination." Mijn zzp "; } function displayableBanner($size, $urlToSWF, $urlToDestination) { //Random id $myId = substr("myId".md5(time().rand(1, 10000)), 1, 5); return "

"; } function getTitleFromUrl($someUrl) { $allData = getDataFromUrl($someUrl); return $allData["title"]; } $no200headers = array(); function checkFor200header($url) { /* From Mijnzzp.nl pages, there MAY be urls with white space in them... */ $url = str_replace(" ", "%20", $url); global $theUser; global $no200headers; if (isset($no200headers[$url])) { return false; } //Let's check the status code $headers = @get_headers($url); if ($headers !== false && isset($headers[0]) && ($headers[0] == "HTTP/1.0 200 OK" || $headers[0] == "HTTP/1.1 200 OK")) { return true; } else { $no200headers[$url] = true; if ($theUser->isAdmin()) { if ($headers !== false && isset($headers[0])) { PageNew::admin("
In plaats van code 200 kreeg ik: ".$headers[0]."
"); PageNew::admin("
Betreft: ".$url."
"); } else { PageNew::admin("
Geen header resultaat: ".$url."
"); } } } return false; } function getDataFromHTML($srcHTML, $srcUrl = "") { //Get rid of newline characters, they break the matching $srcHTML = str_replace("\r", " ", $srcHTML); $srcHTML = str_replace("\n", " ", $srcHTML); $allData = array(); /* TITLE */ $cleanMatch = ""; $myPattern = "/

.*<\/h1>/"; preg_match($myPattern, $srcHTML, $matches); if (isset($matches) && count($matches) == 1) { $rawMatch = $matches[0]; $cleanMatch = preg_replace("/<[^<>]*>/", "", $rawMatch); if (strlen($cleanMatch) < 40) { $cleanMatch = ""; } } else { //Maybe, there is a TITLE tag? $myPattern = "/.*<\/title>/"; preg_match($myPattern, $srcHTML, $matches); if (isset($matches) && count($matches) == 1) { $rawMatch = $matches[0]; $cleanMatch = preg_replace("/<[^<>]*>/", "", $rawMatch); if (strlen($cleanMatch) < 40) { $cleanMatch = ""; } } } $allData["title"] = $cleanMatch; /* IMAGE (absolute) */ $cleanMatch = ""; preg_match("/\<img(.*?)src=[\"\']+(http[^>]*?[.JPG|.PNG|.GIF|.gif|.jpg|.png])[\"\']+ (.*?)\>/", $srcHTML, $match); $allData["image_url"] = ""; if (isset($match[0])) { if (checkFor200header($match[2])) { $allData["image_url"] = $match[2]; } } if ($srcUrl != "" && $allData["image_url"] == "") { /* IMAGE (relative) */ $cleanMatch = ""; $tmpResult = parse_url($srcUrl); $host = $tmpResult["scheme"]."://".$tmpResult["host"]; preg_match("/\<img(.*?)src=[\"\']+\/([^>]*?[.JPG|.PNG|.GIF|.gif|.jpg|.png])[\"\']+ (.*?)\>/", $srcHTML, $match); if (isset($match[0])) { if (checkFor200header($host."/".$match[2])) { $allData["image_url"] = $host."/".$match[2]; } } } /* IMAGES (absolute) */ $cleanMatch = ""; preg_match_all("/\<img(.*?) src=[\"\']+(http[^>]*?[.JPG|.PNG|.GIF|.gif|.jpg|.png])[\"\']+ (.*?)\>/", $srcHTML, $matches); /* ^ This SPACE prevents from grabbing data-src attributes */ $allData["images_urls"] = array(); if (isset($matches[2])) { foreach ($matches[2] as $match) { if (strpos($match, "\"") === false) { if (!in_array($match, $allData["images_urls"]) && count($allData["images_urls"]) < 80) { if (checkFor200header($match)) { $allData["images_urls"][] = $match; } } } } } return $allData; } function getDataFromUrl($someUrl) { $allData = array(); $srcHTML = false; $srcHTML = @file_get_contents($someUrl); //MAY fail if ($srcHTML === false) { Debug::addItem("includes.php", "function getTitleFromUrl", "Lezen van ".$someUrl." is mislukt", "infoEg"); return $allData; } return getDataFromHTML($srcHTML, $someUrl); } function getDistance($lat1, $lon1, $lat2, $lon2) { $lat1 = floatval($lat1); $lat2 = floatval($lat2); $lon1 = floatval($lon1); $lon2 = floatval($lon2); $theta = $lon1 - $lon2; $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); $dist = acos($dist); $dist = rad2deg($dist); $miles = $dist * 60 * 1.1515; $km = $miles * 1.609344; return $km; } function createCKEditor($fieldName, $value, $width, $height, $basic = true, $allowupload = false) { global $theUser; PageNew::set("youtubelazyloading", false); /* TEMP */ $ssl = false; if (isset($_SERVER['HTTPS']) ) { if ('on' == strtolower($_SERVER['HTTPS']) ) $ssl = true; if ('1' == $_SERVER['HTTPS'] ) $ssl = true; } elseif (isset($_SERVER['SERVER_PORT']) && ('443' == $_SERVER['SERVER_PORT'] ) ) { $ssl = true; } $returnString = "<textarea id='".$fieldName."' name='".$fieldName."'></textarea><p></p>"; //The <p></p> at the end creates a white space below the editor if ($basic) { $returnString .= " <script> me = CKEDITOR.replace( '".$fieldName."', { customConfig: 'configbasic.js', width: ".$width.", height: ".$height. ($allowupload ? ", filebrowserUploadUrl: '".($ssl ? SAFEROOT : HOSTROOT)."code/upload.php'" : ""). ($theUser->isAdmin() ? ", filebrowserBrowseUrl: '".($ssl ? SAFEROOT : HOSTROOT)."code/imagebrowse.php'" : "")." } ); me.setData('".$value."'); </script> "; } else { $returnString .= " <script>". ($theUser->isAdmin() ? "CKEDITOR.config.extraPlugins = 'audio';" : "")." me = CKEDITOR.replace( '".$fieldName."', { width: ".$width.", height: ".$height. ($allowupload ? ", filebrowserUploadUrl: '".($ssl ? SAFEROOT : HOSTROOT)."code/upload.php'" : ""). ($theUser->isAdmin() ? ", filebrowserBrowseUrl: '".($ssl ? SAFEROOT : HOSTROOT)."code/imagebrowse.php'" : ""). ($theUser->isAdmin() ? ", extraAllowedContent: 'audio[*]{*}(*);source[*]{*}(*)'" : "")." } ); me.setData('".$value."'); </script> "; } return $returnString; } function simonSaysRaw() { $simonSays = substr(uniqid(), 6, 4).substr(uniqid(), 6, 4); return $simonSays."|".md5($simonSays.date("Ymd")."aapnootmieshahahierkomjenooitachter"); } function simonSays() { //echo date("Ymd").date("Ymd", time() - 60*60*24); $simonSays = simonSaysRaw(); return "<input type='hidden' name='simonsays' value='".simonSaysRaw()."' />"; } function checkSimonSays($someSimonSays) { $simonSays = explode("|", $someSimonSays); if (isset($simonSays) && count($simonSays) == 2) { if ($simonSays[1] == md5($simonSays[0].date("Ymd")."aapnootmieshahahierkomjenooitachter")) { //Ok return true; } else if ($simonSays[1] == md5($simonSays[0].date("Ymd", time() - 60 * 60 * 24)."aapnootmieshahahierkomjenooitachter")) { //Ok return true; } else if ($simonSays[1] == md5($simonSays[0].date("Ymd", time() + 60 * 60 * 2)."aapnootmieshahahierkomjenooitachter")) { //This DOES happen; server time may be off one hour, e.g. winter/summertime. Allow a +2 hr future time return true; } } //Debug::addItem("includes.php", "start", "Simon Says: verkeerde vorm", "crash"); if (RUNNING_ON_LOCALHOST) { global $pageReady; $pageReady = true; dieNice("Simon says is verkeerd (2)"); } else { if (class_exists("Debug")) { Debug::addItem("includes.php", "function checkSimonSays", "Simon Says is verkeerd", "crash"); } else { dieToDisk("WrongSimonSays"); } } } function getGoogleH1Code() { return AdServer::getBannerNew("all", "dynamisch"); } function h1($someString, $style="") { return "<h1".($style == "" ? "" : " style='".$style."'").">".$someString."</h1>".getGoogleH1Code(); } function openGraphAction($actions) { /* information in the FB.api response.error: message type code alert('Error (type: ' + response.error.type + ', code: ' + response.error.code + '): ' + response.error.message); response.error.code == 200: needs more permissions response.error.code == 2500: requires login */ $returnString = "<script>"; foreach($actions as $key => $action) { $returnString .= " function action".$key."() { FB.api( '".$action["action"]."', 'post', function(response) { if (!response || response.error) { if (response.error.code == 2500) { FB.login(function(response) { if (response.authResponse) { console.log('Welcome! Fetching your information.... '); FB.api('/me', function(response) { console.log('Good to see you, ' + response.name + '.'); action".$key."(); }); } else { console.log('User cancelled login or did not fully authorize.'); } }, {scope: 'publish_actions'}); } else { xmlhttp.open('GET', 'ajax.php?task=informwebmaster&code=' + response.error.code + '&info=opengrapherror&message=' + response.error.message, true); xmlhttp.onreadystatechange=function() {}; xmlhttp.send(null); alert('Er is helaas een fout opgetreden, wij hebben de webmaster geinformeerd.'); } } else { xmlhttp.open('GET', 'ajax.php?task=informwebmaster&info=opengraphsuccess', true); xmlhttp.onreadystatechange=function() {}; xmlhttp.send(null); alert('Uw Facebook Timeline is geupdate'); } } ); }"; } $returnString .= "</script>"; foreach($actions as $key => $action) { $returnString .= "<p class='clearleft'><img src=\"".STATICROOT."/image/facebook3.png\"><a href='#' class='graybutton' onclick=\"action".$key."()\">".$action["button"]."</a></p>"; } return $returnString; } function getDefaultForm($searchString, $currentType = "alles", $addReturnLink = false) { return "<form class='search' onsubmit=' if (document.getElementById(\"selectedtype\").value == \"alles\") { window.location = \"".HREF::getUrl("Zoeken")."\" + (document.getElementById(\"searchstring\").value == \"\" ? \"\" : \"/\" + document.getElementById(\"searchstring\").value.replace(\"&\", \"\")); return false; } if (document.getElementById(\"selectedtype\").value == \"bedrijven\") { window.location = \"".HREF::getUrl("Zoeken")."/".Language::getString("Bedrijf")."\" + (document.getElementById(\"searchstring\").value == \"\" ? \"\" : \"/\" + document.getElementById(\"searchstring\").value.replace(\"&\", \"\")); return false; } if (document.getElementById(\"selectedtype\").value == \"beroepen\") { window.location = \"".HREF::getUrl("Zoeken")."/".Language::getString("Beroep")."\" + (document.getElementById(\"searchstring\").value == \"\" ? \"\" : \"/\" + document.getElementById(\"searchstring\").value.replace(\"&\", \"\")); return false; } if (document.getElementById(\"selectedtype\").value == \"werk\") { window.location = \"".HREF::getUrl("Zoeken")."/".Language::getString("Werk")."\" + (document.getElementById(\"searchstring\").value == \"\" ? \"\" : \"/\" + document.getElementById(\"searchstring\").value.replace(\"&\", \"\")); return false; } if (document.getElementById(\"selectedtype\").value == \"advertentie\") { window.location = \"".HREF::getUrl("Zoeken")."/".Language::getString("Advertentie")."\" + (document.getElementById(\"searchstring\").value == \"\" ? \"\" : \"/\" + document.getElementById(\"searchstring\").value.replace(\"&\", \"\")); return false; } if (document.getElementById(\"selectedtype\").value == \"blog\") { window.location = \"".HREF::getUrl("Zoeken")."/".Language::getString("Blog")."\" + (document.getElementById(\"searchstring\").value == \"\" ? \"\" : \"/\" + document.getElementById(\"searchstring\").value.replace(\"&\", \"\")); return false; } '>" ."<input type='text' id='searchstring' placeholder='Zoeken' value='".$searchString."' style='width: 70%; display: inline;' /> " ."<input type='submit' value='".Language::getString("Zoeken")."' />" ."</form>" ."<p class='center' style='font-size: .7em; font-weight: 400; letter-spacing: .25em; line-height: 2.5; margin-top: -1em; text-transform: uppercase;'>" ."<input type='hidden' id='selectedtype' value='".$currentType."'>" ."<input type='radio' id='searchtype_alles' name='searchtype' value='alles' ".($currentType == "alles" ? "checked" : "")." onclick='document.getElementById(\"selectedtype\").value = \"alles\";'>" ."<label for='searchtype_alles'>".Language::getString("Alles")."</label>" ."<input type='radio' id='searchtype_bedrijven' name='searchtype' value='bedrijven' ".($currentType == "bedrijven" ? "checked" : "")." onclick='document.getElementById(\"selectedtype\").value = \"bedrijven\";'>" ."<label for='searchtype_bedrijven'>".Language::getString("Bedrijven")."</label>" ."<input type='radio' id='searchtype_beroepen' name='searchtype' value='beroepen' ".($currentType == "beroepen" ? "checked" : "")." onclick='document.getElementById(\"selectedtype\").value = \"beroepen\";'>" ."<label for='searchtype_beroepen'>".Language::getString("Beroepen")."</label>" ."<input type='radio' id='searchtype_werk' name='searchtype' value='werk' ".($currentType == "werk" ? "checked" : "")." onclick='document.getElementById(\"selectedtype\").value = \"werk\";'>" ."<label for='searchtype_werk'>".Language::getString("Zzp")." ".Language::getString("werk")."</label>" ."<input type='radio' id='searchtype_advertentie' name='searchtype' value='advertentie' ".($currentType == "advertentie" ? "checked" : "")." onclick='document.getElementById(\"selectedtype\").value = \"advertentie\";'>" ."<label for='searchtype_advertentie'>".Language::getString("Advertenties")."</label>" ."<input type='radio' id='searchtype_blog' name='searchtype' value='blog' ".($currentType == "blog" ? "checked" : "")." onclick='document.getElementById(\"selectedtype\").value = \"blog\";'>" ."<label for='searchtype_blog'>".Language::getString("Blogs")."</label>" ."</p>" .($addReturnLink ? "<p>".HREF::getA("Zoeken").Language::getString("Ga terug naar de zoekpagina.")."</a></p>" : "") .""; } function do403() { global $pageReady; $pageReady = true; Debug::addItem("includes.php", "function do403", "403 pagina (FORBIDDEN): ".str_replace("'", "", $_SERVER["SERVER_NAME"].$_SERVER['REQUEST_URI']), "infoHans"); header("HTTP/1.1 403 Unauthorized" ); die("Er is een fout opgetreden."); } function do404($mainPageInfo, $h1 = "", $alternatives = array(), $zoekterm = "", $zoekgebied = "alles") { PageNew::$overruleAUTO_CACHE = true; //DO NOT cache this page, ignore all previous instructions if (RUNNING_ON_LOCALHOST) { //Debug::addItem("includes.php", "function do404", "Functie do404 in includes.php is aangeroepen", "crash"); } PageNew::set("description|checklength", false); PageNew::set("description", Language::getString("Dit is de 404 pagina van mijnzzp.nl.")); //Pge::$refuseZipping = true; ini_set("zlib.output_compression", "Off"); header('HTTP/1.1 404 Not Found'); header('Status: 404 Not Found'); Debug::addItem("includes.php", "function do404", "Switch naar 404 pagina", "info"); /* Forget what we have untill now... */ PageNew::clear(); if ( strpos($_SERVER['REQUEST_URI'], "obots.txt") > 0 || $mainPageInfo == "SHORT-NOTFOUND" || strpos($_SERVER['REQUEST_URI'], "me/og_mijnzzp") > 0 || $_SERVER['REQUEST_URI'] == "/piwik/misc/user/favicon.png" ) { global $pageReady; $pageReady = true; $errorType = "OTHER"; if ($mainPageInfo == "SHORT") { $errorType = "SHORT"; } if ($mainPageInfo == "SHORT-NOTFOUND") { $errorType = "SHORT-NOTFOUND"; } Debug::addItem("includes.php", "function do404 ".$errorType, $errorType." 404 pagina: ".str_replace("'", "", $_SERVER["SERVER_NAME"].$_SERVER['REQUEST_URI'])." ".(isset($_SERVER['HTTP_REFERER']) ? "REFERER: ".$_SERVER['HTTP_REFERER'] : "NO REFERER"), "infoHans"); header('HTTP/1.1 404 Not Found'); header('Status: 404 Not Found'); die(); } $logInfo = "ANDERS"; if ($mainPageInfo == "SHORT" || $mainPageInfo == "SHOULDNEVERBESHOWN") { $logInfo = $mainPageInfo; $mainPageInfo = "<h3>Zoeken door Mijnzzp.nl</h3>"; $h1 = "Pagina niet gevonden"; } /* Did you mean... */ global $database; $didYouMeanString = ""; if ($zoekterm != "") { $deelZoektermen = explode(" ", $zoekterm); $maxPerTerm = 3; //floor(count($deelZoektermen) / 10) + 1; foreach($deelZoektermen as $deelZoekterm) { if (strlen($deelZoekterm) > 3) { $results = $database->doQuery("SELECT * FROM suggestions WHERE suggestion LIKE '%".$deelZoekterm."%' ORDER BY frequency DESC LIMIT 0, ".$maxPerTerm); if (isset($results) && count($results) > 0) { foreach ($results as $result) { $didYouMeanString = str_replace(" of ", ", ", $didYouMeanString); $didYouMeanString .= ($didYouMeanString == "" ? "" : " of ") .HREF::getA("Zoeken", urlencode($result["suggestion"]), $result["suggestion"]) .$result["suggestion"] ."</a>"; } } } } } if ($didYouMeanString != "") { $didYouMeanString = "<h2>" .Language::getString("Suggesties") ."</h2><p>" .Language::getString("Onze database kan u misschien verder helpen.")." " .Language::getString("Bedoelde u misschien ***1***?", $didYouMeanString) ."</p>"; } if ($mainPageInfo == "") { $mainPageInfo = "<h2>Oeps</h2>"; Debug::addItem("includes.php", "function do404", "Geen mainpageinfo bij NIET SHORT 404 pagina", "semicrash"); } if ($h1 == "") { $h1 = "Pagina niet gevonden"; Debug::addItem("includes.php", "function do404", "Geen h1 bij NIET SHORT", "semicrash"); } PageNew::addToSideBar( (object)array( "type" => "mini-post", "h3" => Language::getString("Niet gevonden"), "p" => Language::getString("De pagina die u zoekt, bestaat niet"), "url" => HREF::getUrl("ZakenPartners"), "img" => (object)array( "obj" => new ExternalImage(HOSTROOT."image/testbeeld_klein.png"), "src" => HOSTROOT."image/testbeeld_klein.png", "alt" => $h1 ), "postdate" => DateTimeHandle::now(), "author" => PageNew::getTeamMijnzzpUser()->getAuthorObject() ) ); $page = "<p>" .Language::getString("De pagina die u zoekt, bestaat niet").". " .Language::getString("Wij proberen u te helpen om te vinden wat u zoekt.") ."</p><h3>" .Language::getString("Bedankt voor uw hulp en begrip") ."</h3><p>" .Language::getString("Deze niet gevonden pagina is doorgegeven aan onze webmaster, zodat wij Mijnzzp.nl nog verder kunnen verbeteren.") ." " .Language::getString("Wij hebben een code 404 doorgegeven aan uw browser.") ." " .Language::getString("Wij danken u voor uw hulp en begrip.") ."</p><p>" .HREF::getA("", "", "", "", "", "button") .Language::getString("Naar de homepage") ."</a>" .($zoekterm == "" ? "" : " ".HREF::getA("Zoeken", urlencode($zoekterm), "", "", "", "button").Language::getString("Zoek ***1*** op Mijnzzp", $zoekterm)."</a>") ." " .HREF::getA("Contact", "", "", "", "", "button") .Language::getString("Contact met ons") ."</a></p>"; PageNew::set("header|h1", $h1); $page .= $mainPageInfo .$didYouMeanString ."<p>" .Language::getString("Probeert u onderstaande mogelijkheden om te vinden wat u zoekt.") ."</p>" .getDefaultForm($zoekterm, $zoekgebied) ."<p>" .Language::getString("Of") ."</p>"; if (count($alternatives) > 0) { foreach ($alternatives as $alternative) { $page .= "<p class='c'>".$alternative."</p>" ."<p class='c'>" .Language::getString("Of") ."</p>"; } } $page .= '<div> <form action="http://www.google.nl/cse" id="cse-search-box"> <p>'.Language::getString('Zoek door Mijnzzp.nl met Google').':</p> <input type="hidden" name="cx" value="partner-pub-8489168902633626:i67tuv55mrx" /> <input type="hidden" name="ie" value="ISO-8859-1" /> <input type="text" name="q" size="60" /> <input type="submit" name="sa" value="'.Language::getString("Zoeken").'" /> </form> </div> <script src="https://www.google.nl/cse/brand?form=cse-search-box&lang=nl"></script>'; if (!RUNNING_ON_LOCALHOST) { Debug::addItem("includes.php", "function do404", "404 pagina (".$logInfo."): ".str_replace("'", "", $_SERVER["SERVER_NAME"].$_SERVER['REQUEST_URI']), "infoHans"); } PageNew::addToMain( (object)array( "type" => "post", "h2" => $h1, "p" => "404 pagina", "url" => HREF::getUrl(""), "html" => $page, "postdate" => DateTimeHandle::now(), "author" => PageNew::getTeamMijnzzpUser()->getAuthorObject() ) ); global $pageReady; $pageReady = true; PageNew::displayIt(); die(); } function getNon301URL($someUrl, $depth) { /* Used for getting a REAL (non 301-ing) link from a tweet (example: bla.bit.ly => aap.goo.gl ==> nu.nl/bla) */ if ($depth > 3) { Debug::addItem("includes.php", "function getNon301URL", "Onverwachte diepte voor ".$someUrl, "crash"); } $thisLocationHeader = get_headers($someUrl, 1); if (isset($thisLocationHeader)) { if ($thisLocationHeader[0] == "HTTP/1.0 301 Moved Permanently" || $thisLocationHeader[0] == "HTTP/1.1 301 Moved") { if (isset($thisLocationHeader["Location"])) { if (is_array($thisLocationHeader["Location"])) { $nextUrl = $thisLocationHeader["Location"][0]; } else { $nextUrl = $thisLocationHeader["Location"]; } return getNon301URL($nextUrl, $depth + 1); } else if (isset($thisLocationHeader["location"])) { if (is_array($thisLocationHeader["location"])) { $nextUrl = $thisLocationHeader["location"][0]; } else { $nextUrl = $thisLocationHeader["location"]; } return getNon301URL($nextUrl, $depth + 1); } else { Debug::addItem("includes.php", "function getNon301URL", "Vreemde array voor ".$someUrl, "semicrash"); } } else { return $someUrl; } } else { Debug::addItem("includes.php", "function getNon301URL", "!isset(get_headers(".$someUrl."))", "semicrash"); } } include "brutonetto2015-2023.php"; function doBrutoNetto2025($amountPerYear, $isWerknemer, $displayPer, $brutoNettoData = array(), $untaxedWinst = 0 /* Dit is de MKB winstvrijstelling */, $isOld = false /* TRUE als ouder dan AOW leeftijd */, $isOldAlleenstaand = false /* Bepaalt alleenstaanden ouderen korting. Ja het is echt zo. */, $theSkill = false) { /* Dit is 2025. Berekeningen testen: - https://services.vismaraet.nl/proformalite/ - https://www.berekenhet.nl/ondernemen/netto-inkomen-zzp-er.html - http://www.loonwijzer.nl/home/salaris/brutonetto */ $termName = array("YEAR" => "jaar", "MONTH" => "maand"); if ($displayPer == "MONTH") { $numTerms = 12; } else if ($displayPer == "YEAR") { $numTerms = 1; } else { dieNice("Vreemde displayPer: ".$displayPer); } /* Inhoudingen */ //Bron: belastingdienst if ($isOld) { $taxDiscs = array( 1 => array("from" => 0, "to" => 38441, "rate" => 0.1792, "readable" => "Schijf 1 (2025): 17,92% van jaarloon/winst tot 38.441 (ouder dan AOW leeftijd, geboren op of na 1 januari 1946)"), 2 => array("from" => 38441, "to" => 76817, "rate" => 0.3748, "readable" => "Schijf 2 (2025): 37,48% van jaarloon/winst van 38.441 tot 76.817 (ouder dan AOW leeftijd, geboren op of na 1 januari 1946)"), 3 => array("from" => 76817, "to" => 0, "rate" => 0.4950, "readable" => "Schijf 3 (2025): 49,5% van jaarloon/winst vanaf 76.817 (ouder dan AOW leeftijd, geboren op of na 1 januari 1946)"), ); } else { $taxDiscs = array( 1 => array("from" => 0, "to" => 38441, "rate" => 0.3582, "readable" => "Schijf 1 (2025): 35,82% van jaarloon/winst tot 38.441 (jonger dan AOW leeftijd)"), 2 => array("from" => 38441, "to" => 76817, "rate" => 0.3748, "readable" => "Schijf 2 (2025): 37,48% van jaarloon/winst vanaf 38.441 tot 76.817 (jonger dan AOW leeftijd)"), 3 => array("from" => 76817, "to" => 0, "rate" => 0.4950, "readable" => "Schijf 3 (2025): 49,5% van jaarloon/winst vanaf 76.817 (jonger dan AOW leeftijd)"), ); } $discStart = 0; $discNum = 1; foreach ($taxDiscs as $disc) { if ($amountPerYear > $disc["from"]) { $newInfo = array(); if ($disc["to"] > 0) { $taxAppliesTo = min($disc["to"] - $disc["from"], $amountPerYear - $disc["from"]); } else { $taxAppliesTo = $amountPerYear - $disc["from"]; } $newInfo["description"] = $disc["readable"]; $newInfo["amount"] = round(floor($disc["rate"] * $taxAppliesTo) / $numTerms, 2); $brutoNettoData["inhoudingen"][] = $newInfo; } } if (!$isWerknemer || $isOld) { //Inkomensafhankelijke bijdrage ZVW //Bron (van de getallen): http://www.zorgwijzer.nl/faq/wat-is-de-inkomensafhankelijke-bijdrage $newInfo = array(); $newInfo["description"] = "Inkomensafhankelijke bijdrage ZVW (2025) (tarief voor ondernemers en gepensioneerden)"; $newInfo["amount"] = round(floor(0.0526 * min(75860, $amountPerYear) / $numTerms), 2); $brutoNettoData["inhoudingen"][] = $newInfo; } $totalInhoudingen = 0; foreach ($brutoNettoData["inhoudingen"] as $inhouding) { $totalInhoudingen += $inhouding["amount"]; } $newInfo = array(); $newInfo["description"] = "Inhoudingen per ".$termName[$displayPer]; $newInfo["details_key"] = "inhoudingen"; $newInfo["amount"] = "- € ".number_format($totalInhoudingen, 2, ",", "."); $brutoNettoData["primary"][] = $newInfo; $newInfo = array(); /* Kortingen */ //Bron (van de getallen): belastingdienst $newInfo = array(); $newInfo["description"] = "Algemene heffingskorting (2025)"; if ($isOld) { $newInfo["amount"] = round(1536 / $numTerms, 2); } else { $newInfo["amount"] = round(3068 / $numTerms, 2); } $brutoNettoData["kortingen"][] = $newInfo; if ($amountPerYear > 22600) { $newInfo = array(); $newInfo["description"] = "Afbouw algemene heffingskorting (2025)"; if ($isOld) { $newInfo["amount"] = - round(min(1536, floor(0.0317 * ($amountPerYear - 28406))) / $numTerms, 2); } else { $newInfo["amount"] = - round(min(3068, floor(0.063375 * ($amountPerYear - 28406))) / $numTerms, 2); } $brutoNettoData["kortingen"][] = $newInfo; } $newInfo = array(); /* Arbeidskorting wordt geheven over het arbeidsinkomen, dit is winst uit onderneming vóór ondernemersaftrek en mkb-winstvrijstelling. Zie http://www.belastingdienst.nl/wps/wcm/connect/bldcontentnl/belastingdienst/prive/inkomstenbelasting/heffingskortingen_boxen_tarieven/heffingskortingen/arbeidskorting/inkomen_uit_werk */ //Bron (van de getallen): belastingdienst if ($isOld) { $newInfo["description"] = "Arbeidskorting (2025) (hele jaar ouder dan AOW leeftijd)"; if (($amountPerYear + $untaxedWinst) <= 12169) { $newInfo["amount"] = round(ceil(0.04029 * ($amountPerYear + $untaxedWinst)), 2); } else if (($amountPerYear + $untaxedWinst) <= 26288) { $newInfo["amount"] = round(491 + 0.15023 * (($amountPerYear + $untaxedWinst) - 12169), 2); } else if (($amountPerYear + $untaxedWinst) <= 43071) { $newInfo["amount"] = round(2612 + 0.01130 * (($amountPerYear + $untaxedWinst) - 26228), 2); } else if (($amountPerYear + $untaxedWinst) <= 129078) { $newInfo["amount"] = round(2802 - 0.03257 * (($amountPerYear + $untaxedWinst) - 43071), 2); } else { $newInfo["amount"] = 0; } $newInfo["amount"] = round($newInfo["amount"] / $numTerms); $brutoNettoData["kortingen"][] = $newInfo; } else { $newInfo["description"] = "Arbeidskorting (2025) (hele jaar jonger dan AOW leeftijd)"; if (($amountPerYear + $untaxedWinst) <= 12169) { $newInfo["amount"] = round(ceil(0.08053 * ($amountPerYear + $untaxedWinst)), 2); } else if (($amountPerYear + $untaxedWinst) <= 26288) { $newInfo["amount"] = round(980 + 0.30030 * (($amountPerYear + $untaxedWinst) - 12169), 2); } else if (($amountPerYear + $untaxedWinst) <= 43071) { $newInfo["amount"] = round(5220 + 0.02258 * (($amountPerYear + $untaxedWinst) - 26288), 2); } else if (($amountPerYear + $untaxedWinst) <= 129078) { $newInfo["amount"] = round(5599 - 0.06510 * (($amountPerYear + $untaxedWinst) - 43071), 2); } else { $newInfo["amount"] = 0; } $newInfo["amount"] = round($newInfo["amount"] / $numTerms); $brutoNettoData["kortingen"][] = $newInfo; } /* Werkbonus (voor bijna bejaarden) is per 1/1/2018 vervallen. */ if ($isOld) { $newInfo["description"] = "Ouderenkorting (2025) (op 31/12/2025 ouder dan AOW leeftijd)"; if (($amountPerYear) <= 45308) { $newInfo["amount"] = round(2035 / $numTerms, 2); } else if (($amountPerYear) <= 58875) { $newInfo["amount"] = round(2035 - floor(0.15 * ($amountPerYear - 45308)) / $numTerms, 2); } else { $newInfo["amount"] = 0; } $brutoNettoData["kortingen"][] = $newInfo; if ($isOldAlleenstaand) { $newInfo["description"] = "Alleenstaandeouderenkorting (2025)"; $newInfo["amount"] = round(531 / $numTerms, 2); $brutoNettoData["kortingen"][] = $newInfo; } } $totalKortingen = 0; foreach ($brutoNettoData["kortingen"] as $inhouding) { $totalKortingen += $inhouding["amount"]; } $totalKortingen = round($totalKortingen, 2); /* Kortingen kunnen nooit meer zijn dan de inhoudingen */ if ($totalKortingen > $totalInhoudingen) { $totalKortingen = $totalInhoudingen; } $newInfo = array(); $newInfo["description"] = "Kortingen per ".$termName[$displayPer]; $newInfo["amount"] = "<span style='text-decoration: underline;'>+ € ".number_format($totalKortingen, 2, ",", ".")."</span>"; $newInfo["details_key"] = "kortingen"; $brutoNettoData["primary"][] = $newInfo; if ($isWerknemer) { $newInfo = array(); $newInfo["description"] = "Netto per ".$termName[$displayPer]; $newInfo["amount"] = "€ ".number_format( ($amountPerYear / $numTerms) - $totalInhoudingen + $totalKortingen, 2, ",", "."); $brutoNettoData["primary"][] = $newInfo; } else { $newInfo = array(); $newInfo["description"] = "Netto per ".$termName[$displayPer]; $newInfo["amount"] = "€ ".number_format( ($amountPerYear / $numTerms) - $totalInhoudingen + $totalKortingen, 2, ",", ".")." (exclusief vrijgestelde winst)"; $brutoNettoData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = "Netto per ".$termName[$displayPer]; $newInfo["amount"] = "€ ".number_format( ( ($amountPerYear + $untaxedWinst) / $numTerms) - $totalInhoudingen + $totalKortingen, 2, ",", ".")." (inclusief vrijgestelde winst)"; $brutoNettoData["primary"][] = $newInfo; } $newInfo = array(); $newInfo["description"] = ""; $newInfo["amount"] = "<strong>Grondslag: berekening op basis van tarief loonbelasting 1 januari 2025</strong><br /><br />".getGrondslag($isOld); $brutoNettoData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = ""; $newInfo["amount"] = "<strong>Disclaimer</strong><br /><br />".getDisclaimer($theSkill); $brutoNettoData["primary"][] = $newInfo; return $brutoNettoData; } function getGrondslag($isOld = false) { return "Berekening inclusief heffingskortingen, exclusief ondernemersaftrek zoals zelfstandigen- en startersaftrek (ondernemers). " .( $isOld ? "Wij zijn uitgegaan van een leeftijd die het gehele jaar boven de AOW leeftijd ligt (in 2025 is dit 67 jaar) en dat u bent geboren op of na 1 januari 1946. " ."Onze berekeningen gelden niet bij een (zeer) hoge leeftijd zoals geboren voor 1 januari 1946. " ."Onze berekeningen gelden niet voor mensen die dit jaar de AOW leeftijd bereiken. " : "Wij zijn uitgegaan van een leeftijd die het gehele jaar onder de AOW leeftijd ligt (in 2025 is dit 67 jaar). " ) ."Er is geen rekening gehouden met (meestal verplichte) pensioenpremies (werknemers) of uw eigen (fiscale) oudedagsvoorziening (ondernemers). " ."Er is geen rekening gehouden met een eventuele auto van de zaak, (fiscaal) sparen zoals levensloop en dergelijke, en overige vergoedingen en inhoudingen. " ."Er is geen rekening gehouden met mogelijke aftrekposten, zoals hypotheekrente, zorgkosten en dergelijke. " ."Er is geen rekening gehouden met uw (fiscale) partner en eventueel gecombineerde voor- of nadelen, zoals op de algemene heffingskorting."; } function getDisclaimer($theSkill = false) { return "De bedragen en voorbeeldberekeningen op Mijnzzp.nl zijn indicatief, er kunnen op geen enkele manier rechten aan worden ontleend. " ."De bedragen en berekeningen zijn tot stand gekomen door het verzamelen van openbare informatie op het internet en moeten gezien worden als een indicatie. " ."Er kan sprake zijn van persoonlijke omstandigheden en aanvullende of gewijzigde wetgeving. " ."Er zijn veel invloeden die AOW- en pensioenuitkeringen, salaris, winst en belasting kunnen beinvloeden zoals leeftijd, werkervaring, CAO afspraken, pensioen, mogelijke opleidingen, rentestand, levensverwachting, samenlevingsvorm, auto van de zaak, woning en dergelijke. " ."De bedragen op maand- en jaarbasis kunnen afrondingsverschillen bevatten. " ."Kapitaalberekeningen zijn gebaseerd op een fictief rendement en houden geen rekening met eenmalige en/of doorlopende kosten." ."<br /><br />" ."De gepresenteerde bedragen en berekeningen zijn niet gecontroleerd noch goedgekeurd door een accountant, de belastingdienst of anderen." ."<br /><br />" ."Vindt u een fout in onze berekeningen? " ."Laat het ons weten." ."<br /><br />" ."Het inkomen van zelfstandig ondernemers kan zeer varieren door onkosten zoals verzekeringen, huisvesting, gereedschap en mogelijke bedrijfsauto's. " ."Daarnaast kunnen de meeste zelfstandig ondernemers lang niet al hun tijd factureren, omdat ze ook bezig zijn met acquisitie, " .($theSkill ? $theSkill->getA("/Boekhoudsoftware-vergelijken", "", "Boekhoudsoftware vergelijken voor een ***1***")."boekhouding</a>" : "<a href='https://www.mijnzzp.nl/Boekhoudsoftware-vergelijken' title='Online zzp boekhoudprogramma vergelijken'>boekhouding</a>") .", administratie et cetera."; } function doBrutoNettoPensionado($amountPerMonth, $hasPartner, $year) { $brutoNettoData = array(); $newInfo = array(); $newInfo["description"] = "Bruto per jaar"; $newInfo["amount"] = "€ ".number_format(round(12 * $amountPerMonth, 2), 2, ",", "."); $brutoNettoData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = "<strong>Netto berekening</strong>"; $newInfo["amount"] = ""; $brutoNettoData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = "Bruto per maand"; $newInfo["amount"] = "€ ".number_format($amountPerMonth, 2, ",", "."); $brutoNettoData["primary"][] = $newInfo; if ($year == 2017) { $brutoNettoData = doBrutoNetto2017(12 * $amountPerMonth, true, "MONTH", $brutoNettoData, 0, true, !$hasPartner); } else if ($year == 2018) { $brutoNettoData = doBrutoNetto2018(12 * $amountPerMonth, true, "MONTH", $brutoNettoData, 0, true, !$hasPartner); } else if ($year == 2019) { $brutoNettoData = doBrutoNetto2019(12 * $amountPerMonth, true, "MONTH", $brutoNettoData, 0, true, !$hasPartner); } else if ($year == 2020) { $brutoNettoData = doBrutoNetto2020(12 * $amountPerMonth, true, "MONTH", $brutoNettoData, 0, true, !$hasPartner); } else if ($year == 2021) { $brutoNettoData = doBrutoNetto2021(12 * $amountPerMonth, true, "MONTH", $brutoNettoData, 0, true, !$hasPartner); } else if ($year == 2023) { $brutoNettoData = doBrutoNetto2023(12 * $amountPerMonth, true, "MONTH", $brutoNettoData, 0, true, !$hasPartner); } else if ($year == 2025) { $brutoNettoData = doBrutoNetto2025(12 * $amountPerMonth, true, "MONTH", $brutoNettoData, 0, true, !$hasPartner); } else { Debug::addItem("function doBrutoNettoPensionado", "Jaar kiezen", "Jaar ".$year." is niet beschikbaar", "crash"); } $newInfo = array(); $newInfo["description"] = AdServer::getBannerNewNew(GOOGLE_NIEUWE_LAYOUT_DOOR_EGGIE_GEPLAATST); $newInfo["amount"] = ""; $brutoNettoData["primary"][] = $newInfo; return $brutoNettoData; } function doBrutoNettoWerknemer($amountPerMonth, $year, $theSkill = false) { $brutoNettoData = array(); $newInfo = array(); $newInfo["description"] = "Bruto per jaar"; $newInfo["amount"] = "€ ".number_format(12 * $amountPerMonth, 2, ",", ".")." (exclusief vakantiegeld)"; $brutoNettoData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = "Bruto per jaar"; $newInfo["amount"] = "€ ".number_format(round(12.96 * $amountPerMonth, 2), 2, ",", ".")." (inclusief 8% vakantiegeld)"; $brutoNettoData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = "<strong>Netto berekening</strong>"; $newInfo["amount"] = ""; $brutoNettoData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = "Bruto per maand"; $newInfo["amount"] = "€ ".number_format($amountPerMonth, 2, ",", "."); $brutoNettoData["primary"][] = $newInfo; if ($year == 2016) { $brutoNettoData = doBrutoNetto2016(12 * $amountPerMonth, true, "MONTH", $brutoNettoData); } else if ($year == 2017) { $brutoNettoData = doBrutoNetto2017(12 * $amountPerMonth, true, "MONTH", $brutoNettoData); } else if ($year == 2018) { $brutoNettoData = doBrutoNetto2018(12 * $amountPerMonth, true, "MONTH", $brutoNettoData); } else if ($year == 2019) { $brutoNettoData = doBrutoNetto2019(12 * $amountPerMonth, true, "MONTH", $brutoNettoData); } else if ($year == 2020) { $brutoNettoData = doBrutoNetto2020(12 * $amountPerMonth, true, "MONTH", $brutoNettoData); } else if ($year == 2021) { $brutoNettoData = doBrutoNetto2021(12 * $amountPerMonth, true, "MONTH", $brutoNettoData); } else if ($year == 2023) { $brutoNettoData = doBrutoNetto2023(12 * $amountPerMonth, true, "MONTH", $brutoNettoData, 0, false, false, $theSkill); } else if ($year == 2025) { $brutoNettoData = doBrutoNetto2025(12 * $amountPerMonth, true, "MONTH", $brutoNettoData, 0, false, false, $theSkill); } else { Debug::addItem("function doBrutoNettoWerknemer", "Jaar kiezen", "Jaar ".$year." is niet beschikbaar", "crash"); } $newInfo = array(); $newInfo["description"] = AdServer::getBannerNewNew(GOOGLE_NIEUWE_LAYOUT_DOOR_EGGIE_GEPLAATST); $newInfo["amount"] = ""; $brutoNettoData["primary"][] = $newInfo; return $brutoNettoData; } function doOmzet($rate, $rateUnit, $rateUnitPerWeek, $year) { $omzetData = array(); $newInfo = array(); $newInfo["description"] = "Tarief"; $newInfo["amount"] = "€ ".number_format($rate, 0, ",", ".")." per ".$rateUnit." ex BTW"; $omzetData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = "Declarabele uren"; $newInfo["amount"] = $rateUnitPerWeek." ".$rateUnit." per week"; $omzetData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = ""; $newInfo["amount"] = "Wij gaan er vanuit dat u ongeveer 5 weken per jaar niet werkt, bijvoorbeeld om vakantie te vieren. Wij gaan dus uit van 47 declarabele weken per jaar."; $omzetData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = AdServer::getBannerNewNew(GOOGLE_NIEUWE_LAYOUT_DOOR_EGGIE_GEPLAATST); $newInfo["amount"] = ""; $omzetData["primary"][] = $newInfo; if ($rateUnitPerWeek < 31) { //Ok } else if ($rateUnitPerWeek < 50) { $newInfo = array(); $newInfo["description"] = ""; $newInfo["amount"] = "Let op!<br /><br />U heeft tijd nodig voor acquisitie, administratie, netwerken, overleg, en dergelijke. Deze tijd kunt u niet declareren bij uw klanten. Ook kunnen er weken zijn, dat u geen of weinig werk heeft.<br /><br />Het ingeschatte aantal declarabele uren op weekbasis is aan de hoge kant."; $omzetData["primary"][] = $newInfo; } else if ($rateUnitPerWeek < 169) { $newInfo = array(); $newInfo["description"] = ""; $newInfo["amount"] = "Let op!<br /><br />U gaat 50 uur of meer per week declareren. Heeft u ooit overwogen om <a href='http://www.mijnzzp.nl/Beroep/1135-Komiek'>komiek</a> te worden? Anders kunt u misschien een goede <a href='http://www.mijnzzp.nl/Beroep/670-Masseur'>massage</a> tegen de stress gebruiken."; $omzetData["primary"][] = $newInfo; } else { $newInfo = array(); $newInfo["description"] = ""; $newInfo["amount"] = "<strong>Een week op aarde kent maar 168 uur. U kunt niet meer dan 168 uur per week declareren.</strong>"; $omzetData["primary"][] = $newInfo; $rateUnitPerWeek = 168; } $newInfo = array(); $newInfo["description"] = "<strong>Omzet</strong>"; $newInfo["amount"] = ""; $omzetData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = "Omzet per week"; $newInfo["amount"] = "€ ".number_format($rate * $rateUnitPerWeek, 0, ",", ".")." ex BTW"; $omzetData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = "Omzet per maand"; $newInfo["amount"] = "€ ".number_format($rate * $rateUnitPerWeek * 13 / 3, 0, ",", ".")." ex BTW"; $omzetData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = "Omzet per jaar"; $newInfo["amount"] = "€ ".number_format($rate * $rateUnitPerWeek * 47, 0, ",", ".")." ex BTW"; $omzetData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = ""; $newInfo["amount"] = "Let op!<br /><br />Als u materialen levert of anderen inhuurt, moet dit nog bij uw omzet opgeteld worden. In onze voorbeeldberekening worden deze bedragen niet meegenomen. Het gaat dus alleen om uw eigen declarabele uren."; $omzetData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = ""; $newInfo["amount"] = "Let op!<br /><br />Omzet is bruto. U moet al uw inkoop, inhuur, kosten, verzekeringen, pensioen, belasting en dergelijke hier nog van betalen. Hieronder vindt u een voorbeeldberekening."; $omzetData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = "<strong>Winst</strong>"; $newInfo["amount"] = ""; $omzetData["primary"][] = $newInfo; /* $newInfo = array(); $newInfo["description"] = "Omzet per jaar"; $newInfo["amount"] = "€ ".number_format($rate * $rateUnitPerWeek * 52, 0, ",", ".")." ex BTW"; $omzetData["primary"][] = $newInfo; */ $inkoop = 0; /* $newInfo = array(); $newInfo["description"] = "Inkoop en/of inhuur per jaar"; $newInfo["amount"] = "<span style='text-decoration: underline;'>- € ".number_format($inkoop, 0, ",", ".")." ex BTW</span> (stelpost)"; $omzetData["primary"][] = $newInfo; */ $newInfo = array(); $newInfo["description"] = "Bruto winst per jaar"; $newInfo["amount"] = "€ ".number_format($rate * $rateUnitPerWeek * 47 - $inkoop, 0, ",", ".")." ex BTW"; $omzetData["primary"][] = $newInfo; $kostenEnAfschrijvingen = $rate * $rateUnitPerWeek * 52 * 0.33; $newInfo = array(); $newInfo["description"] = "Kosten en afschrijvingen per jaar"; $newInfo["amount"] = "<span style='text-decoration: underline;'>- € ".number_format($kostenEnAfschrijvingen, 0, ",", ".")." ex BTW</span> (stelpost)"; $omzetData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = "Winst uit onderneming per jaar"; $newInfo["amount"] = "€ ".number_format($rate * $rateUnitPerWeek * 47 - $inkoop - $kostenEnAfschrijvingen, 0, ",", ".")." ex BTW"; $omzetData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = "<strong>Belastbare winst</strong>"; $newInfo["amount"] = ""; $omzetData["primary"][] = $newInfo; /* We need to remember this amount */ $winstUitOnderneming = $rate * $rateUnitPerWeek * 47 - $inkoop - $kostenEnAfschrijvingen; $newInfo = array(); $newInfo["description"] = "Winst uit onderneming per jaar"; $newInfo["amount"] = "€ ".number_format($winstUitOnderneming, 0, ",", ".")." ex BTW"; $omzetData["primary"][] = $newInfo; //Bron (van de getallen) http://financieel.infonu.nl/belasting/175667-mkb-winstvrijstelling-2016-2017-voorwaarden-en-hoogte.html //De vrijstelling is 14%, ongewijzigd in 2019, 2018, 2017 en 2016. //LET OP, vanaf 2020 wordt de aftrek tegen het toptarief (in 2019: 51,75%) in stappen afgebouwd naar 37,05% in 2023 //In 2020 is de winstvrijstelling ongewijzigd, 14%, maar de maximale aftrek is 46% //In 2020 is de winstvrijstelling ongewijzigd, 14%, maar de maximale aftrek is 43% if ($year == 2016 || $year == 2017 || $year == 2018 || $year == 2019) { $mkbWinstVrijstelling = floor(0.14 * $winstUitOnderneming); $newInfo = array(); $newInfo["description"] = "MKB Winst vrijstelling (2016 t/m 2019)"; $newInfo["amount"] = "<span style='text-decoration: underline;'>- € ".number_format($mkbWinstVrijstelling, 0, ",", ".")." ex BTW</span>"; $omzetData["primary"][] = $newInfo; } if ($year == 2020) { $mkbWinstVrijstelling = floor(0.14 * $winstUitOnderneming); $newInfo = array(); $newInfo["description"] = "MKB Winst vrijstelling (2020) (let op! Maximale aftrek is over 46%)"; $newInfo["amount"] = "<span style='text-decoration: underline;'>- € ".number_format($mkbWinstVrijstelling, 0, ",", ".")." ex BTW</span>"; $omzetData["primary"][] = $newInfo; } if ($year == 2021) { $mkbWinstVrijstelling = floor(0.14 * $winstUitOnderneming); $newInfo = array(); $newInfo["description"] = "MKB Winst vrijstelling (2021) (let op! Maximale aftrek is over 43%)"; $newInfo["amount"] = "<span style='text-decoration: underline;'>- € ".number_format($mkbWinstVrijstelling, 0, ",", ".")." ex BTW</span>"; $omzetData["primary"][] = $newInfo; } if ($year == 2023) { $mkbWinstVrijstelling = floor(0.14 * $winstUitOnderneming); $newInfo = array(); $newInfo["description"] = "MKB Winst vrijstelling (2023) (let op! Maximale aftrek is over 36,93%)"; $newInfo["amount"] = "<span style='text-decoration: underline;'>- € ".number_format($mkbWinstVrijstelling, 0, ",", ".")." ex BTW</span>"; $omzetData["primary"][] = $newInfo; } if ($year == 2025) { $mkbWinstVrijstelling = floor(0.127 * $winstUitOnderneming); $newInfo = array(); $newInfo["description"] = "MKB Winst vrijstelling (2025) (let op! Maximale aftrek is over 37,48%)"; $newInfo["amount"] = "<span style='text-decoration: underline;'>- € ".number_format($mkbWinstVrijstelling, 0, ",", ".")." ex BTW</span>"; $omzetData["primary"][] = $newInfo; } $newInfo = array(); $newInfo["description"] = "Belastbare winst per jaar"; $newInfo["amount"] = "€ ".number_format($winstUitOnderneming - $mkbWinstVrijstelling, 0, ",", ".")." ex BTW"; $omzetData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = "<strong>Netto berekening</strong>"; $newInfo["amount"] = ""; $omzetData["primary"][] = $newInfo; $newInfo = array(); $newInfo["description"] = "Belastbare winst per jaar"; $newInfo["amount"] = "€ ".number_format($winstUitOnderneming - $mkbWinstVrijstelling, 0, ",", ".")." ex BTW"; $omzetData["primary"][] = $newInfo; if ($year == 2016) { $omzetData = doBrutoNetto2016($winstUitOnderneming - $mkbWinstVrijstelling, false, "YEAR", $omzetData, $mkbWinstVrijstelling); } else if ($year == 2017) { $omzetData = doBrutoNetto2017($winstUitOnderneming - $mkbWinstVrijstelling, false, "YEAR", $omzetData, $mkbWinstVrijstelling); } else if ($year == 2018) { $omzetData = doBrutoNetto2018($winstUitOnderneming - $mkbWinstVrijstelling, false, "YEAR", $omzetData, $mkbWinstVrijstelling); } else if ($year == 2019) { $omzetData = doBrutoNetto2019($winstUitOnderneming - $mkbWinstVrijstelling, false, "YEAR", $omzetData, $mkbWinstVrijstelling); } else if ($year == 2020) { $omzetData = doBrutoNetto2020($winstUitOnderneming - $mkbWinstVrijstelling, false, "YEAR", $omzetData, $mkbWinstVrijstelling); } else if ($year == 2021) { $omzetData = doBrutoNetto2021($winstUitOnderneming - $mkbWinstVrijstelling, false, "YEAR", $omzetData, $mkbWinstVrijstelling); } else if ($year == 2023) { $omzetData = doBrutoNetto2023($winstUitOnderneming - $mkbWinstVrijstelling, false, "YEAR", $omzetData, $mkbWinstVrijstelling); } else if ($year == 2025) { $omzetData = doBrutoNetto2025($winstUitOnderneming - $mkbWinstVrijstelling, false, "YEAR", $omzetData, $mkbWinstVrijstelling); } else { Debug::addItem("function doOmzet", "Jaar kiezen", "Jaar ".$year." is niet beschikbaar", "crash"); } return $omzetData; } function brutoNettoToTable($omzetData, $title) { $exampleCalculations = "<table style='width: 95%;'><tr><td colspan=2><h2>".$title."</h2></td></tr>"; foreach ($omzetData["primary"] as $someOmzet) { $value = $someOmzet["amount"]; if ($value == "") { $exampleCalculations .= "<tr><td colspan=2>".$someOmzet["description"]."</td></tr>"; } else { $randomThingToAddToKey = substr(md5("".rand()), 0, 6); if (isset($someOmzet["details_key"])) { $value .= " <span style='font-size: 90%'>(<a href='javascript:void(0);' onclick='document.getElementById(\""."ondernemer_".$someOmzet["details_key"].$randomThingToAddToKey."\").style.display = \"block\";' title='Details'>details</a>)</span>" ."<div style='display: none;' id='ondernemer_".$someOmzet["details_key"].$randomThingToAddToKey."'>" ."<ul>"; foreach ($omzetData[$someOmzet["details_key"]] as $someDetail) { $value .= "<li style='font-size: 90%'>".$someDetail["description"].": "."€ ".number_format($someDetail["amount"], 2, ",", ".")."</li>"; } $value .= "</ul></div>"; } if ($someOmzet["description"] == "") { $exampleCalculations .= "<tr><td style='font-size: 80%;' colspan=2>".$value."</td></tr>"; } else { $exampleCalculations .= "<tr><td style='font-size: 80%;'>".$someOmzet["description"]."</td><td style='width: 70%;".($someOmzet["description"] == "" ? " font-size: 80%;" : "")."'>".$value."</td></tr>"; } } } $exampleCalculations .= "</table>"; return $exampleCalculations; } function getPensionPage($year = 2021, $partner = true, $birthdate = "1910-01-01", $currentSpaar = 0, $spaarPerMaand = 0, $rente = "1%", $skill = null) { $cbsLevensVerwachting = array( 0 => 81.31, 1 => 81.07, 2 => 80.11, 3 => 79.13, 4 => 78.14, 5 => 77.14, 6 => 76.15, 7 => 75.16, 8 => 74.16, 9 => 73.17, 10 => 72.17, 11 => 71.18, 12 => 70.19, 13 => 69.19, 14 => 68.20, 15 => 67.21, 16 => 66.21, 17 => 65.22, 18 => 64.24, 19 => 63.25, 20 => 62.27, 21 => 61.28, 22 => 60.30, 23 => 59.32, 24 => 58.33, 25 => 57.35, 26 => 56.37, 27 => 55.39, 28 => 54.41, 29 => 53.42, 30 => 52.44, 31 => 51.46, 32 => 50.49, 33 => 49.51, 34 => 48.53, 35 => 47.55, 36 => 46.58, 37 => 45.60, 38 => 44.63, 39 => 43.66, 40 => 42.69, 41 => 41.72, 42 => 40.76, 43 => 39.80, 44 => 38.84, 45 => 37.88, 46 => 36.93, 47 => 35.98, 48 => 35.04, 49 => 34.11, 50 => 33.17, 51 => 32.25, 52 => 31.33, 53 => 30.41, 54 => 29.51, 55 => 28.61, 56 => 27.72, 57 => 26.83, 58 => 25.95, 59 => 25.08, 60 => 24.23, 61 => 23.37, 62 => 22.53, 63 => 21.69, 64 => 20.86, 65 => 20.04, 66 => 19.23, 67 => 18.43, 68 => 17.64, 69 => 16.86, 70 => 16.09, 71 => 15.33, 72 => 14.59, 73 => 13.86, 74 => 13.13, 75 => 12.42, 76 => 11.73, 77 => 11.05, 78 => 10.39, 79 => 9.76, 80 => 9.14, 81 => 8.55, 82 => 7.99, 83 => 7.45, 84 => 6.93, 85 => 6.44, 86 => 5.96, 87 => 5.53, 88 => 5.12, 89 => 4.73, 90 => 4.36, 91 => 4.02, 92 => 3.71, 93 => 3.44, 94 => 3.19, 95 => 2.96, 96 => 2.74, 97 => 2.55, 98 => 2.36, 99 => 2.22 ); if (isset($skill)) { $salaryInfo = $skill->getSalaryInfo(); if (isset($salaryInfo["pensioenfonds_id"]) && $salaryInfo["pensioenfonds_id"] > 0 && $salaryInfo["pensioenfonds_id"] != 3) { $pensioenfondsobject = new Pensioenfonds($salaryInfo["pensioenfonds_id"]); $pensioenfonds = (object)array("naam" => $pensioenfondsobject->getName(), "url" => $pensioenfondsobject->getWWWUrl()); } } if ($year == 2017) { //2017, zie http://www.svb.nl/int/nl/aow/hoogte_aow/bedragen/index.jsp $aowPerMaandPartner = 794.59; $aowPerMaandAlleenstaand = 1153.35; } else if ($year == 2018) { //2018, bedragen per 1 juli 2018, https://www.svb.nl/int/nl/aow/hoogte_aow/bedragen/aow_bedragen_tabel.jsp $aowPerMaandPartner = 814.74; $aowPerMaandAlleenstaand = 1181.36; } else if ($year == 2019) { //2019, bedragen per 1 januari 2019, zie SVB website $aowPerMaandPartner = 835.04; $aowPerMaandAlleenstaand = 1215.81; } else if ($year == 2020) { //2020, bedragen per 1 januari 2020, zie SVB website https://www.svb.nl/nl/aow/bedragen-aow/aow-bedragen $aowPerMaandPartner = 859.55; $aowPerMaandAlleenstaand = 1255.87; } else if ($year == 2021) { //2021, bedragen per 1 januari 2021, zie SVB website https://www.svb.nl/nl/aow/bedragen-aow/aow-bedragen $aowPerMaandPartner = 883.67; $aowPerMaandAlleenstaand = 1292.50; } else if ($year == 2023) { //2023, bedragen per 1 januari 2023, zie SVB website https://www.svb.nl/nl/aow/bedragen-aow/aow-bedragen $aowPerMaandPartner = 920.98; $aowPerMaandAlleenstaand = 1353.11; } else if ($year == 2025) { //2025, bedragen per 1 januari 2025, zie SVB website https://www.svb.nl/nl/aow/bedragen-aow/aow-bedragen $aowPerMaandPartner = 1081.50; $aowPerMaandAlleenstaand = 1580.92; } else { Debug::addItem("includes.php", "function getPensionPage", "Kan jaar niet afhandelen: ".$year, "crash"); } $samenvatting = "<table>"; $defaultDate = new DateTimeHandle(); $defaultDate->setFromString($birthdate); $pensionForm = new FormObject( array( "partner" => array("auto-instantiate" => ($partner ? 1 : 0), "type" => "boolean", "is_radio" => true, "label_true" => "Ik heb een partner.", "label_false" => "Ik ben alleenstaand.", "required" => false), "birthdate" => array("auto-instantiate" => $defaultDate, "type" => "date", "required" => false), "currentspaar" => array("auto-instantiate" => $currentSpaar, "type" => "int", "unit" => "€", "required" => false), "spaarpermaand" => array("auto-instantiate" => $spaarPerMaand, "type" => "int", "unit" => "€", "required" => false), "rente" => array("auto-instantiate" => "".$rente, "type" => "set", "set" => "1%|2%|3%"), ) ); $buttons[] = (object)array( "tekst" => "Berekenen", ); $htmlLayout = "<table>" ."<tr><td>[[[partner]]]" ."<td></td>" ."</tr><tr>" ."<td>" ."<p>Mijn geboortedatum (jjjj-mm-dd):</p></td>" ."<td>[[[birthdate]]]" ."</td></tr>" ."<tr><td>" ."<p>Hoeveel spaargeld wilt u voor aanvullend pensioen gebruiken?</p>" ."</td><td>[[[currentspaar]]]</td>" ."</tr><tr><td>" ."<p>Hoeveel wilt u per maand sparen voor aanvullend pensioen?</p>" //2-1-2022 //."<p><a href='https://ds1.nl/c/?si=12895&li=1600467&wi=336572&ws=' title='Ontdek de mogelijkheden om bij Binck zelf voor uw pensioen te beleggen'>Ontdek hier de mogelijkheden bij Binck om zelf voor uw pensioen te beleggen</a>.</p>" ."</td><td style='width: 30%;'>" ."[[[spaarpermaand]]]" ."</td></tr>" ."<tr><td>" ."<p>Met hoeveel rente wilt u rekening houden?</p>" ."</td><td style='width: 30%;'>" ."[[[rente]]]" ."</td></tr>" ."</table>"; $html = "<p>Op deze pagina vindt u alles over AOW, pensioen en aanvullend pensioen".(isset($skill) ? " voor u als ".$skill->getSkill() : "").". U hoeft niets in te vullen, maar hoe meer u invult, hoe meer informatie we kunnen geven.</p>" ."<h2>Uw situatie</h2>" .$pensionForm->getForm(Array("buttons" => $buttons, "layout" => $htmlLayout)) ."<h2>Samenvatting</h2>" ."[SAMENVATTING]"; $html .= "<h2>Wat is uw pensioen- en AOW leeftijd?</h2>" ."<ul>"; $aowYear = 0; if ($birthdate == "1910-01-01" || strtotime($birthdate) === false) { $html .= "<li>U heeft uw geboortedatum niet ingevuld, dus wij weten niet hoe oud u nu bent.</li>" ."<li>U krijgt AOW vanaf de dag dat u de AOW leeftijd bereikt. "; if ($year == 2017) { $html .= "In 2017 is de AOW leeftijd <strong>65 jaar en 9 maanden</strong>. "; } else if ($year == 2018) { $html .= "In 2018 is de AOW leeftijd <strong>66 jaar</strong>. "; } else if ($year == 2019 || $year == 2020 || $year == 2021) { $html .= "In 2019, 2020 en 2021 is de AOW leeftijd <strong>66 jaar en 4 maanden</strong>. "; } else if ($year == 2023) { $html .= "In 2023 is de AOW leeftijd <strong>66 jaar en 10 maanden</strong>. "; } else if ($year == 2025) { $html .= "In 2025 is de AOW leeftijd <strong>67 jaar</strong>. "; } else { Debug::addItem("includes.php", "function getPensionPage", "Kan jaar niet afhandelen (2): ".$year, "crash"); } $html .= "Houd er rekening mee dat uw AOW leeftijd fors hoger kan uitvallen. Vul uw geboortedatum in voor meer informatie."; $samenvatting .= "<tr><td>AOW leeftijd (huidig)</td><td>67 jaar</td></tr>"; } else { $birthdateUnix = strtotime($birthdate); $aowAgeYear = 0; $aowAgeMonths = 0; $isSure = true; $isVeryUnsure = false; if ($birthdateUnix < mktime(0, 0, 0, 1, 1, 1948)) { $aowAgeYear = 65; $aowAgeMonths = 0; } else if ($birthdateUnix < mktime(0, 0, 0, 12, 1, 1948)) { $aowAgeYear = 65; $aowAgeMonths = 1; } else if ($birthdateUnix < mktime(0, 0, 0, 11, 1, 1949)) { $aowAgeYear = 65; $aowAgeMonths = 2; } else if ($birthdateUnix < mktime(0, 0, 0, 10, 1, 1950)) { $aowAgeYear = 65; $aowAgeMonths = 3; } else if ($birthdateUnix < mktime(0, 0, 0, 7, 1, 1951)) { $aowAgeYear = 65; $aowAgeMonths = 6; } else if ($birthdateUnix < mktime(0, 0, 0, 4, 1, 1952)) { $aowAgeYear = 65; $aowAgeMonths = 9; } else if ($birthdateUnix < mktime(0, 0, 0, 1, 1, 1953)) { $aowAgeYear = 66; $aowAgeMonths = 0; } else if ($birthdateUnix < mktime(0, 0, 0, 9, 1, 1953)) { $aowAgeYear = 66; $aowAgeMonths = 4; } else if ($birthdateUnix < mktime(0, 0, 0, 5, 1, 1954)) { $aowAgeYear = 66; $aowAgeMonths = 8; } else if ($birthdateUnix < mktime(0, 0, 0, 1, 1, 1955)) { $aowAgeYear = 67; $aowAgeMonths = 0; } else if ($birthdateUnix < mktime(0, 0, 0, 10, 1, 1955)) { $aowAgeYear = 67; $aowAgeMonths = 3; } else if ($birthdateUnix < mktime(0, 0, 0, 10, 1, 1956)) { $aowAgeYear = 67; $aowAgeMonths = 3; $isSure = false; } else { $aowAgeYear = 67; $aowAgeMonths = 3; $isSure = false; $isVeryUnsure = true; } $aowLeeftijdString = $aowAgeYear." jaar".($aowAgeMonths == 0 ? "" : " en ".$aowAgeMonths." maanden").($isSure ? "" : ($isVeryUnsure ? " of (veel) ouder" : " of ouder")); $age = date("Y") - date("Y", $birthdateUnix); $aowDay = 0 + date("j", $birthdateUnix); $aowMonth = 0 + $aowAgeMonths + date("n", $birthdateUnix); $aowYear = $aowAgeYear + date("Y", $birthdateUnix); if ($aowMonth > 12) { $aowMonth -= 12; $aowYear++; } $html .= "<li>"; if ($age > 0) { $html .= "U wordt dit jaar ".$age." jaar oud."; } else { $html .= "U bent nog niet geboren."; } if ($age >= 0 && $age < 100) { $html .= " Uw levensverwachting is ".number_format($age + $cbsLevensVerwachting[$age], 1, ",", ".")." jaar (prognose gebaseerd op de CBS levensverwachting 2011-2016)"; } $html .= "</li>"; if ($age > 75) { $html .= "<li>Uw AOW en pensioen zijn <strong>al lang geleden ingegaan</strong>. "; $samenvatting .= "<tr><td>Uw AOW leeftijd</td><td>Lang geleden al</td></tr>"; } else { $html .= "<li>Uw AOW leeftijd is <strong>".$aowLeeftijdString."</strong>. "; $html .= " Uw AOW gaat in op <strong>".$aowDay." ".DateTimeHandle::$monthNames['nl'][$aowMonth]["long"]." ".$aowYear.($isSure ? "" : ($isVeryUnsure ? " of (veel) later" : " of later"))."</strong>. "; $meer = "U krijgt AOW vanaf de dag dat u de AOW leeftijd bereikt."; if (!$isSure) { $meer .= " Omdat de AOW leeftijd vanaf 2022 afhankelijk is van de gemiddelde levensverwachting, is uw AOW datum nog niet zeker. U weet 5 jaar van te voren wanneer u AOW krijgt. Houd er rekening mee dat uw AOW leeftijd hoger kan worden."; if ($isVeryUnsure) { $meer .= " In uw geval kan de AOW leeftijd veel hoger uitvallen dan de huidige leeftijd."; } } $html .= "</li><li>".$meer; $samenvatting .= "<tr><td>Uw AOW leeftijd</td><td>".$aowLeeftijdString."</td></tr>"; } } $html .= "</li>"; if (isset($age) && $age > 75) { // } else { if (isset($pensioenfonds)) { $html .= "<li>Als u".(isset($skill) ? " als ".$skill->getSkill() : "")." in loondienst werkt, of heeft gewerkt, heeft u misschien een pensioen van het pensioenfonds <a href='".$pensioenfonds->url."' class='externallink' title='".$pensioenfonds->naam."'>".$pensioenfonds->naam."</a> of een ander pensioenfonds. " ."Dat pensioen gaat dan in op uw <strong>pensioendatum</strong>. " ."Bezoek de website van het pensioenfonds of de website <a href='https://www.mijnpensioenoverzicht.nl/pensioenregister/' class='externallink' title='Mijn Pensioenoverzicht'>Mijn Pensioenoverzicht</a> van de overheid voor meer informatie.</li>"; } else { $html .= "<li>Als u".(isset($skill) ? " als ".$skill->getSkill() : "")." in loondienst werkt, of heeft gewerkt, heeft u misschien een pensioen van een pensioenfonds. " ."Dat pensioen gaat dan in op uw <strong>pensioendatum</strong>. " ."Bezoek de website <a href='https://www.mijnpensioenoverzicht.nl/pensioenregister/' class='externallink' title='Mijn Pensioenoverzicht'>Mijn Pensioenoverzicht</a> van de overheid voor meer informatie.</li>"; } $html .= "<li><strong>Let op!</strong> Het kan zijn, dat uw AOW leeftijd niet gelijk is aan uw pensioenleeftijd. U heeft dan misschien een <strong>AOW gat</strong>. Vanaf een bepaalde datum krijgt u al wel uw pensioen, maar nog geen AOW. U komt dan misschien geld tekort. Ga na of u hierdoor een tussenliggende periode moet overbruggen.</li>"; } $html .= "</ul>"; $html .= "<h2>Hoeveel krijgt u per maand?</h2>"; $html .= "<ul>"; if ($partner) { $aowPerMaand = $aowPerMaandPartner; $html .= "<li>U heeft een partner. "; $samenvatting .= "<tr><td>AOW uitkering (met partner)</td><td>€ ".number_format($aowPerMaand, 2, ",", ".")." bruto per maand</td></tr>"; } else { $aowPerMaand = $aowPerMaandAlleenstaand; $html .= "<li>U heeft geen partner. "; $samenvatting .= "<tr><td>AOW uitkering (alleenstaand)</td><td>€ ".number_format($aowPerMaand, 2, ",", ".")." bruto per maand</td></tr>"; } if ($aowYear == 0 || $aowYear > date("Y")) { $html .= "Als u op dit moment AOW zou krijgen, dan krijgt u "; } else { $html .= "U hebt de AOW leeftijd al bereikt. U krijgt "; } $html .= "een <a href='https://www.svb.nl/nl/' class='externallink' title='Meer informatie over AOW vindt u bij de Sociale Verzekeringsbank'>AOW uitkering</a> van <strong>€ ".number_format($aowPerMaand, 2, ",", ".")." bruto per maand</strong>."; if ($aowYear == 0 || $aowYear > date("Y")) { $html .= " Houd er rekening mee, dat de AOW bedragen jaarlijks veranderen. Dit bedrag is dus geen garantie voor de toekomst."; } else { $html .= " Mogelijk krijgt u ook een AOW toeslag."; } $html .= " Heeft u in het buitenland gewerkt of gewoond? Dan heeft u misschien <a href='https://www.rijksoverheid.nl/onderwerpen/uitkering-meenemen-naar-buitenland/vraag-en-antwoord/bouw-ik-aow-op-als-ik-in-het-buitenland-ga-wonen-of-werken' title='AOW buitenland werken of wonen' class='externallink'>minder of geen recht op AOW</a>."; $html .= "</li>"; if (isset($pensioenfonds)) { $html .= "<li>Als u".(isset($skill) ? " als ".$skill->getSkill() : "")." in loondienst werkt, of heeft gewerkt, heeft u misschien een pensioen van het pensioenfonds <a href='".$pensioenfonds->url."' class='externallink' title='".$pensioenfonds->naam."'>".$pensioenfonds->naam."</a> of een ander pensioenfonds. " ."Dat pensioen gaat dan in op uw <strong>pensioendatum</strong>. " ."Bezoek de website van het pensioenfonds of de website <a href='https://www.mijnpensioenoverzicht.nl/pensioenregister/' class='externallink' title='Mijn Pensioenoverzicht'>Mijn Pensioenoverzicht</a> van de overheid voor meer informatie.</li>"; $samenvatting .= "<tr><td>Pensioenfonds</td><td><a href='".$pensioenfonds->url."' class='externallink' title='".$pensioenfonds->naam."'>".$pensioenfonds->naam."</a></td></tr>"; } else { $html .= "<li>Als u".(isset($skill) ? " als ".$skill->getSkill() : "")." in loondienst werkt, of heeft gewerkt, heeft u misschien een pensioen van een pensioenfonds. " ."Dat pensioen gaat dan in op uw <strong>pensioendatum</strong>. " ."Bezoek de website <a href='https://www.mijnpensioenoverzicht.nl/pensioenregister/' class='externallink' title='Mijn Pensioenoverzicht'>Mijn Pensioenoverzicht</a> van de overheid voor meer informatie.</li>"; $samenvatting .= "<tr><td>Pensioen</td><td><a href='https://www.mijnpensioenoverzicht.nl/pensioenregister/' class='externallink' title='Mijn Pensioenoverzicht'>Mijn Pensioenoverzicht</a></td></tr>"; } $html .= "<li>Het kan zijn dat u zelf spaart of wilt gaan sparen voor een <strong>aanvullend pensioen</strong>. Op Mijnzzp.nl kunt u een voorbeeldberekening maken.</li>"; $html .= "</ul>"; $html .= "<h2>Aanvullend pensioen sparen</h2>" ."<p>U kunt op verschillende manieren sparen (ook wel kapitaal opbouwen, vermogen opbouwen genoemd) om uw pensioen aan te vullen. " //."<a href='https://ds1.nl/c/?si=12895&li=1600467&wi=336572&ws=' title='Ontdek de mogelijkheden om bij Binck zelf voor uw pensioen te beleggen'>Ontdek bijvoorbeeld de mogelijkheden bij Binck om zelf voor uw pensioen te beleggen</a>. " ."Uw boekhouder, fiscalist, accountant of adviseur kan u meer vertellen over de mogelijkheden. " ."Wij kunnen een indicatie geven van de bedragen. " ."</p>" ."<h3>Voorbeeld berekening aanvullend pensioen</h3>"; if ($birthdate == "1910-01-01" || strtotime($birthdate) === false) { $html .= "<p>U heeft geen geboortedatum ingevuld. Wij gaan er voor deze voorbeeldberekening vanuit dat u geboren bent op 1 januari 1977 en dat uw pensioen en AOW in 2042 ingaan."; $html .= " Omdat de AOW leeftijd vanaf 2022 afhankelijk is van de gemiddelde levensverwachting, is de AOW datum nog niet zeker. U weet 5 jaar van te voren wanneer u AOW krijgt. Houd er rekening mee dat uw AOW leeftijd fors hoger kan worden. "; $aowYear = 2042; } else { $html .= "<p>Op grond van uw geboortedatum gaan wij er vanuit dat uw pensioen en AOW in ".$aowYear." ingaan."; if (!$isSure) { $html .= " Omdat de AOW leeftijd vanaf 2022 afhankelijk is van de gemiddelde levensverwachting, is uw AOW datum nog niet zeker. U weet 5 jaar van te voren wanneer u AOW krijgt. Houd er rekening mee dat uw AOW leeftijd hoger kan worden."; if ($isVeryUnsure) { $html .= " In uw geval kan de AOW leeftijd veel hoger uitvallen dan de huidige leeftijd."; } } } $yearsToGo = max(0, $aowYear - date("Y")); $html .= " U heeft <strong>nog ".$yearsToGo." jaar</strong> om te sparen voor aanvullend pensioen.</p>"; $endSpaar = $currentSpaar; $renteVal = array("1%" => 0.01, "2%" => 0.02, "3%" => 0.03); for ($year = date("Y"); $year < $aowYear; $year++) { for ($month = 1; $month < 13; $month++) { $endSpaar += $spaarPerMaand; $endSpaar += ($endSpaar * $renteVal[$rente]) / 12; } } /* BEREKENINGEN, gedaan 2/1/2017, die op een factor 43 per 1000 uit komen. - https://www.berekenhet.nl/modules/beleggen/uitkeringen-uit-lijfrentekapitaal.html LET OP KOSTEN 0 - Direct e10000, ingangsdatum 67 jaar, rendement 0,2% ==> jaarlijks e604 - Direct e10000, ingangsdatum 67 jaar, rendement 0,4% ==> jaarlijks e615 - Direct e10000, ingangsdatum 67 jaar, rendement 2% ==> jaarlijks e700 - Direct e100000, ingangsdatum 67 jaar, rendement 0,2% ==> jaarlijks e6045 - Direct e100000, ingangsdatum 67 jaar, rendement 0,4% ==> jaarlijks e6152 - Direct e100000, ingangsdatum 67 jaar, rendement 2% ==> jaarlijks e7053 - https://www.nn.nl/Particulier/Pensioen/Uitkering-lijfrente-berekenen.htm - Direct e10000, nu 67 jaar ==> jaarlijks 427 (==> 43 per 1000) - Direct e100000, nu 67 jaar ==> jaarlijks 4747 (==> 47 per 1000) - Direct e200000, nu 67 jaar ==> jaarlijks 9777 (==> 49 per 1000) - https://www.123lijfrente.nl/ - Direct e10000 ==> 38 per maand = 456 per jaar (==> 46 per 1000) - Direct e100000 ==> 409 per maand = 4908 per jaar (==> 49 per 1000) - Direct e200000 ==> 826 per maand = 9912 per jaar (==> 50 per 1000) - Ook gecheckt met https://www.zzppensioen.nl/compares/berekenen-kosten/ - zij rekenen met 6,7% rendement(!) */ $brutoAanvullend = 43 * floor($endSpaar / 1000); $html .= "<h3>Uitkomst aanvullend pensioen</h3>" ."<p>U wilt eenmalig € ".number_format($currentSpaar, 0, ",", ".")." inleggen en vervolgens € ".number_format($spaarPerMaand, 0, ",", ".")." per maand. " ."U houdt rekening met een (spaar)rente van ".$rente.".</p>" ."<p>U bouwt een spaartegoed op van ongeveer <strong>€ ".number_format(1000 * floor($endSpaar / 1000), 0, ",", ".")."</strong>.</p>" ."<p>Met dit spaartegoed kunt u een jaarlijkse aanvullende pensioen uitkering (bijvoorbeeld een <a href='https://nl.wikipedia.org/wiki/Lijfrente' class='externallink' title='Lijfrente verzekering'>lijfrente uitkering</a>) kopen van € ".number_format($brutoAanvullend, 0, ",", ".")." per jaar. " ."Dat is <strong>€ ".number_format($brutoAanvullend / 12, 0, ",", ".")." bruto per maand</strong>. " ."Let op! Hoeveel aanvullende pensioen uitkering u werkelijk kunt krijgen hangt van veel factoren af, zoals de rente en levensverwachting op het moment van afsluiten, eenmalige en doorlopende kosten, en dergelijke. " ."Deze indicatie gaat er vanuit dat u vandaag 65 bent geworden en een product aankoopt." ."</p>" ."<p>Samen met uw AOW uitkering van € ".number_format($aowPerMaand, 2, ",", ".")." bruto per maand heeft u dan een inkomen van € ".number_format($aowPerMaand + $brutoAanvullend / 12, 2, ",", ".")." bruto per maand.</p>"; $samenvatting .= "<tr><td>Aanvullend pensioen<br />Bij een inleg van € ".number_format($currentSpaar, 0, ",", ".")." eenmalig en € ".number_format($spaarPerMaand, 0, ",", ".")." per maand gedurende ".$yearsToGo." jaar</td><td>€ ".number_format($brutoAanvullend / 12, 0, ",", ".")." bruto per maand</td></tr>"; $omzetData = doBrutoNettoPensionado($aowPerMaand + $brutoAanvullend / 12, $partner, 2025); $html .= brutoNettoToTable($omzetData, Language::getString("Voorbeeldberekening bruto netto")); //Quick and dirty foreach ($omzetData["primary"] as $data) { if ($data["description"] == "Netto per maand") { $samenvatting .= "<tr><td>Netto per maand</td><td>".$data["amount"]."</td></tr>"; } } $woord = "arbeidsongeschiktheidspensioen"; if (isset($skill)) { $woord = $skill->getA("/Arbeidsongeschiktheidsverzekering", "", "Arbeidsongeschiktheidsverzekering voor een ***1***")."arbeidsongeschiktheidsverzekering (AOV)</a>"; } $html .= "<h2>Over deze pagina</h2><p>Wij hebben geen rekening gehouden met partnerpensioen, wezenpensioen, ".$woord.", uitkering(en) bij overlijden en andere niet genoemde onderwerpen.</p>"; $samenvatting .= "</table>"; $html = str_replace("[SAMENVATTING]", $samenvatting, $html); $myObject = (object)array( "type" => "post", "h2" => (isset($skill) ? Language::getString("Pensioen van een ***1***", $skill->getSkill()) : "(Aanvullend) pensioen en AOW"), "p" => "Oudedag voorzieningen", "author" => PageNew::getTeamMijnzzpUser()->getAuthorObject(), "html" => $html, "overrideadsense" => AdServer::getBannerNewNew(GOOGLE_NIEUWE_LAYOUT_BOVEN_WEBLOG_ITEM), "postdate" => DateTimeHandle::now(), ); return $myObject; } function readMore($title, $more) { $id = substr(md5(rand(0, 1000)."Bla".time()), 0, 6); return "<a href='javascript: void(0);' title='".$more."' onclick='this.style.display = \"none\"; document.getElementById(\"".$id."\").style.display = \"inline\";' >".$title."</a><span id='".$id."' class='displaynone'>".$more."</span>"; } /* SEARCH */ function cmpSearchResultTypes($a, $b) { $aVal = 0; $bVal = 0; $aNum = 0; $bNum = 0; foreach ($a as $aEl) { $aNum++; $aVal += $aEl["relevancy"]; } $aVal = floor($aVal/$aNum); foreach ($b as $bEl) { $bNum++; $bVal += $bEl["relevancy"]; } $bVal = floor($bVal/$bNum); return $aVal < $bVal; } function cmpSearchResults($a, $b) { return $a["relevancy"] < $b["relevancy"]; } function doSearch($searchString, $filter = array("user" => 30, "skill" => 20 /* includes branche */, "work" => 15, "ad" => 15, "news" => 10, "blog" => 10) /* MUST add up to 100 */, $maxResult = 10) { $searchResults = array(); /* Remove all but a-z, 0-9, whitespace, - */ $searchString = preg_replace("/[^a-zA-Z0-9\s\-]/", " ", $searchString); /* Shrink whitespaces */ $searchString = preg_replace("/\s+/", " ", $searchString); /* We may end up with one space character */ if ($searchString == " ") { $searchString = ""; } if (!isset($filter["user"]) || !isset($filter["skill"]) || !isset($filter["news"]) || !isset($filter["blog"])) { Debug::addItem("function doSearch", "Inspecteren filter", "Ontbrekend(e) filter(s)", "crash"); } //Create a unique identifier for this search $myUniqueId = "srch-".md5($searchString.implode($filter).$maxResult); $success = false; $result = VarCacher::fetch($myUniqueId, $success); if ($success) { return $result; } if ($searchString == "") { if ($filter["user"] > 0) { $searchResults = doSearchOneWord("", $searchResults, "", 70, "user"); } if ($filter["skill"] > 0) { $searchResults = doSearchOneWord("", $searchResults, "", 70, "skill"); } if ($filter["work"] > 0) { $searchResults = doSearchOneWord("", $searchResults, "", 70, "work"); } if ($filter["ad"] > 0) { $searchResults = doSearchOneWord("", $searchResults, "", 70, "ad"); } if ($filter["news"] > 0) { $searchResults = doSearchOneWord("", $searchResults, "", 70, "news"); } if ($filter["blog"] > 0) { $searchResults = doSearchOneWord("", $searchResults, "", 70, "blog"); } } else { $words = explode(" ", $searchString); foreach ($words as $word) { if ($word != "") { if ($filter["user"] > 0) { $searchResults = doSearchOneWord($word, $searchResults, "", 70, "user"); } if ($filter["skill"] > 0) { $searchResults = doSearchOneWord($word, $searchResults, "", 70, "skill"); } if ($filter["work"] > 0) { $searchResults = doSearchOneWord($word, $searchResults, "", 70, "work"); } if ($filter["ad"] > 0) { $searchResults = doSearchOneWord($word, $searchResults, "", 70, "ad"); } if ($filter["news"] > 0) { $searchResults = doSearchOneWord($word, $searchResults, "", 70, "news"); } if ($filter["blog"] > 0) { $searchResults = doSearchOneWord($word, $searchResults, "", 70, "blog"); } } } } /* Special: if searching for work AND for ads, we prefer work */ if (isset($searchResults["ad"]) && isset($searchResults["work"])) { foreach ($searchResults["ad"] as $key => $result) { if (isset($searchResults["work"][$key])) { unset($searchResults["ad"][$key]); } } if (count($searchResults["ad"]) == 0) { unset($searchResults["ad"]); } } /* Apply the maxresults, divided over the desired filter */ $toFetch = 0; foreach ($searchResults as $type => $searchResultsByType) { if ($filter[$type] == 0) { unset($searchResults[$type]); } else { $toFetch += floor($maxResult * $filter[$type] / 100); foreach ($searchResults[$type]["results"] as $key => $searchResult) { if ($toFetch > 0) { $toFetch--; } else { if (isset($searchResults[$type]["hasmore"])) { $searchResults[$type]["hasmore"]++; } else { $searchResults[$type]["hasmore"] = 1; } unset($searchResults[$type]["results"][$key]); } } } } $searchResults = fillSearchResultsWithActuals($searchResults); VarCacher::store($myUniqueId, $searchResults, 0); return $searchResults; } function addResultToSearchresults($searchResults, $type, $key, $relevancy, $hint, $log) { if (isset($searchResults[$type]["results"][$key])) { /* Not first time */ if ($searchResults[$type]["results"][$key]["hint"] == "" || $relevancy > $searchResults[$type]["results"][$key]["relevancy"]) { $searchResults[$type]["results"][$key]["hint"] = $hint; } $searchResults[$type]["results"][$key]["relevancy"] = $searchResults[$type]["results"][$key]["relevancy"] + floor((100 - $searchResults[$type]["results"][$key]["relevancy"]) * $relevancy / 100); $searchResults[$type]["results"][$key]["refound"] = true; $searchResults[$type]["results"][$key]["log"] .= "<br />".$log."<br />Relevancy is now ".$searchResults[$type]["results"][$key]["relevancy"]; } else { /* First time */ $searchResult = array(); $searchResult["html"] = ""; //To be filled AFTER the filter is applied $searchResult["url"] = ""; //To be filled AFTER the filter is applied $searchResult["relevancy"] = $relevancy; $searchResult["hint"] = $hint; $searchResult["refound"] = true; $searchResult["log"] = $log."<br />Newly found, relevancy ".$searchResult["relevancy"]; $searchResults[$type]["results"][$key] = $searchResult; } return $searchResults; } function fillSearchResultsWithActuals($searchResults) { foreach ($searchResults as $type => $searchResultsByType) { foreach ($searchResultsByType["results"] as $key => $searchResult) { if ($type == "user") { $usersArray = Users::getByUserData($key); $searchResults[$type]["results"][$key]["object"] = $usersArray[$key]; } else if ($type == "skill") { $keyArray = explode("|", $key); if ($keyArray[0] == "skill") { $skillsArray = Skills::getById($keyArray[1]); if (isset($skillsArray[$keyArray[1]])) { $searchResults[$type]["results"][$key]["object"] = $skillsArray[$keyArray[1]]; } } else if ($keyArray[0] == "branche") { $branchesArray = Branches::getById($keyArray[1]); if (isset($branchesArray[$keyArray[1]])) { $searchResults[$type]["results"][$key]["object"] = $branchesArray[$keyArray[1]]; } } else { Debug::addItem("function addResultToSearchresults", "Afhandelen skill", "Vreemde id, zou skill of branche moeten zijn: ".$key, "crash"); } } else if ($type == "ad" || $type == "work") { $keyArray = explode("|", $key); if ($keyArray[0] == "marktplaats") { $marktplaats = new Marktplaats($keyArray[1]); $searchResults[$type]["results"][$key]["object"] = $marktplaats; /* 25/2/2020 } else if ($keyArray[0] == "stepstone") { global $database; $results = $database->doQuery("SELECT * FROM stepstone WHERE id = ".$keyArray[1]); if (isset($results) && count($results) == 1) { foreach ($results as $result) { $ad = new stepStoneAd(); $ad->title = $result["title"]; $ad->location = $result["location"]; $ad->region = $result["region"]; $ad->url = $result["url"]; $ad->company_logo = $result["company_logo"]; $ad->description = $result["description"]; $ad->thedate = new DateTimeHandle(); $ad->thedate->setFromMySQLDate($result["thedate"]); $searchResults[$type]["results"][$key]["object"] = $ad; } } else { Debug::addItem("function addResultToSearchresults", "Afhandelen subtype stepstone", "Niet (uniek) gevonden: ".$key, "crash"); } */ } else if ($keyArray[0] == "manpower") { global $database; $results = $database->doQuery("SELECT * FROM manpower WHERE id = ".$keyArray[1]); if (isset($results) && count($results) == 1) { foreach ($results as $result) { $ad = new manPowerAd(); $ad->title = $result["title"]; $ad->location = $result["location"]; $ad->region = $result["region"]; $ad->url = $result["url"]; $ad->job_type = $result["job_type"]; $ad->description = $result["description"]; $ad->thedate = new DateTimeHandle(); $ad->thedate->setFromMySQLDate($result["thedate"]); $searchResults[$type]["results"][$key]["object"] = $ad; } } else { Debug::addItem("function addResultToSearchresults", "Afhandelen subtype manpower", "Niet (uniek) gevonden: ".$key, "crash"); } } else if ($keyArray[0] == "randstad") { global $database; $results = $database->doQuery("SELECT * FROM randstad WHERE id = ".$keyArray[1]); if (isset($results) && count($results) == 1) { foreach ($results as $result) { $ad = new randStadAd(); $ad->title = $result["title"]; $ad->location = $result["location"]; $ad->region = $result["region"]; $ad->url = $result["url"]; $ad->job_type = $result["job_type"]; $ad->description = $result["description"]; $ad->thedate = new DateTimeHandle(); $ad->thedate->setFromMySQLDate($result["thedate"]); $searchResults[$type]["results"][$key]["object"] = $ad; } } else { Debug::addItem("function addResultToSearchresults", "Afhandelen subtype randstad", "Niet (uniek) gevonden: ".$key, "crash"); } } else if ($keyArray[0] == "tempoteam") { global $database; $results = $database->doQuery("SELECT * FROM tempoteam WHERE id = ".$keyArray[1]); if (isset($results) && count($results) == 1) { foreach ($results as $result) { $ad = new tempoTeamAd(); $ad->title = $result["title"]; $ad->location = $result["location"]; $ad->region = $result["region"]; $ad->url = $result["url"]; $ad->job_type = $result["job_type"]; $ad->description = $result["description"]; $ad->thedate = new DateTimeHandle(); $ad->thedate->setFromMySQLDate($result["thedate"]); $searchResults[$type]["results"][$key]["object"] = $ad; } } else { Debug::addItem("function addResultToSearchresults", "Afhandelen subtype tempoteam", "Niet (uniek) gevonden: ".$key, "crash"); } } else if ($keyArray[0] == "brunel") { global $database; $results = $database->doQuery("SELECT * FROM brunel WHERE id = ".$keyArray[1]); if (isset($results) && count($results) == 1) { foreach ($results as $result) { $ad = new brunelAd(); $ad->title = $result["title"]; $ad->location = $result["location"]; $ad->region = $result["region"]; $ad->url = $result["url"]; $ad->job_type = $result["job_type"]; $ad->description = $result["description"]; $ad->thedate = new DateTimeHandle(); $ad->thedate->setFromMySQLDate($result["thedate"]); $searchResults[$type]["results"][$key]["object"] = $ad; } } else { Debug::addItem("function addResultToSearchresults", "Afhandelen subtype brunel", "Niet (uniek) gevonden: ".$key, "crash"); } } else { Debug::addItem("function addResultToSearchresults", "Afhandelen subtype", "Vreemde key: ".$key, "crash"); } } else if ($type == "news") { $newsItemsArray = NewsItems::getById($key); $searchResults[$type]["results"][$key]["object"] = $newsItemsArray[$key]; $searchResults[$type]["results"][$key]["hint"] = $newsItemsArray[$key]->getDateTime()->getDateTimeString(false); } else if ($type == "blog") { $blogItem = Weblogs::getWeblogItemById($key); $searchResults[$type]["results"][$key]["object"] = $blogItem; } else { Debug::addItem("function addResultToSearchresults", "Afhandelen type", "Vreemd type: ".$type, "crash"); } } } return $searchResults; } function doSearchOneWord($searchString, $searchResults = array() /* MIGHT be pre-filled */, $maySee = "", $minimumRelevancy = 70, $searchingFor = "") { global $database; if (strpos($searchString, "'") !== false) { Debug::addItem("function doSearchOneWord", "Inspectie zoekstring", "Zoekstring bevat enkel haakje", "semicrash"); return $searchString; } /* In the pre-filled results, flag FALSE for found-again. If not found again, it will be removed. */ foreach ($searchResults as $key => $searchResultsByType) { foreach ($searchResults[$key]["results"] as $elementKey => $result) { $searchResults[$key]["results"][$elementKey]["refound"] = false; } } if ($searchingFor == "user") { $results = $database->doQuery("SELECT user_id, company FROM userdetails WHERE ".($searchString == "" ? "" : "company LIKE '".$searchString."%' AND ")."maysee = 'internet'"); if (isset($results) && count($results) > 0) { $relevancy = 100; if ($relevancy > $minimumRelevancy) { foreach ($results as $result) { $searchResults = addResultToSearchresults($searchResults, "user", "user|".$result["user_id"], $relevancy, "", "Found by start of name, relevancy ".$relevancy); } } } if (strlen($searchString) > 2) { /* Override killing of our database */ /* ONLY do this search for long strings */ /* ... by company name */ $results = $database->doQuery("SELECT user_id, company FROM userdetails WHERE company LIKE '%".$searchString."%' AND maysee = 'internet'"); if (isset($results) && count($results) > 0) { $relevancy = max(10, 90 - count($results)); if ($relevancy > $minimumRelevancy) { foreach ($results as $result) { $searchResults = addResultToSearchresults($searchResults, "user", "user|".$result["user_id"], $relevancy, "", "Found by name, relevancy ".$relevancy); } } } /* ... by extratext */ $results = $database->doQuery("SELECT user_id, extratext FROM userdetails WHERE extratext LIKE '%".$searchString."%' AND maysee = 'internet'"); if (isset($results) && count($results) > 0) { $relevancy = max(10, 80 - count($results)); if ($relevancy > $minimumRelevancy) { foreach ($results as $result) { /* Remove &anything; */ $result["extratext"] = preg_replace("/\&[^\;]*\;/", " ", $result["extratext"]); /* Remove <anything> */ $result["extratext"] = preg_replace("/\<[^\>]*\>/", " ", $result["extratext"]); /* Remove all but a-z, 0-9, comma, dot */ $result["extratext"] = preg_replace("/[^a-zA-Z0-9\s\.\,]/", " ", $result["extratext"]); /* Shrink whitespaces */ $result["extratext"] = preg_replace("/\s+/", " ", $result["extratext"]); $searchResults = addResultToSearchresults($searchResults, "user", "user|".$result["user_id"], $relevancy, "...".substr($result["extratext"], stripos($result["extratext"], $searchString) - 30, 100)."...", "Found by extratext, relevancy ".$relevancy); //stripos is CASE iNsEnSiTiVe } } } /* ... by extratext (match against) */ $results = $database->doQuery("SELECT user_id, extratext, MATCH(extratext) AGAINST ('".$searchString."') AS relevancy FROM userdetails HAVING relevancy > 0 ORDER BY relevancy DESC"); if (isset($results) && count($results) > 0) { foreach ($results as $result) { $relevancy = min(90, 10 + 10 * $result["relevancy"]); /* Remove &anything; */ $result["extratext"] = preg_replace("/\&[^\;]*\;/", " ", $result["extratext"]); /* Remove <anything> */ $result["extratext"] = preg_replace("/\<[^\>]*\>/", " ", $result["extratext"]); /* Remove all but a-z, 0-9, comma, dot */ $result["extratext"] = preg_replace("/[^a-zA-Z0-9\s\.\,]/", " ", $result["extratext"]); /* Shrink whitespaces */ $result["extratext"] = preg_replace("/\s+/", " ", $result["extratext"]); $searchResults = addResultToSearchresults($searchResults, "user", "user|".$result["user_id"], $relevancy, "...".substr($result["extratext"], stripos($result["extratext"], $searchString) - 30, 100)."...", "Found by extratext MATCH, relevancy ".$relevancy); //stripos is CASE iNsEnSiTiVe } } } } if ($searchingFor == "skill" || $searchingFor == "work") { $foundSkills = array(); $results = $database->doQuery("SELECT id, skill, parent_id FROM jos_zzp_skills".($searchString == "" ? "" : " WHERE skill LIKE '".$searchString."%'")." #Searching for ".$searchingFor); if (isset($results) && count($results) > 0) { $relevancy = 100; if ($relevancy > $minimumRelevancy) { foreach ($results as $result) { if ($searchingFor == "skill") { $searchResults = addResultToSearchresults($searchResults, "skill", ($result["parent_id"] == 0 ? "branche" : "skill")."|".$result["id"], $relevancy, "", "Found by skillname, relevancy ".$relevancy); } else { $foundSkills[$result["id"]] = $result["id"]; } } } } if (strlen($searchString) > 2) { /* Override killing of our database */ /* ONLY do this search for long strings */ /* Search skills... */ $results = $database->doQuery("SELECT id, skill, parent_id FROM jos_zzp_skills WHERE skill LIKE '%".$searchString."%'"." #Searching for ".$searchingFor); if (isset($results) && count($results) > 0) { $relevancy = max(10, 90 - count($results)); if ($relevancy > $minimumRelevancy) { if ($searchingFor == "skill") { foreach ($results as $result) { $searchResults = addResultToSearchresults($searchResults, "skill", ($result["parent_id"] == 0 ? "branche" : "skill")."|".$result["id"], $relevancy, "", "Found by skillname, relevancy ".$relevancy); } } else { foreach ($results as $result) { $foundSkills[$result["id"]] = $result["id"]; } } } } /* ... and search skills by "pages" ... */ $results = $database->doQuery("SELECT specialcode FROM pages WHERE specialcode LIKE 'skill%' AND (content LIKE '%".$searchString."%' OR content_uitgelicht LIKE '%".$searchString."%')"." #Searching for ".$searchingFor); if (isset($results) && count($results) > 0) { $relevancy = max(10, 90 - count($results)); if (1==1 || $relevancy > $minimumRelevancy) { if ($searchingFor == "skill") { foreach ($results as $result) { $exploded = explode("|", $result["specialcode"]); $searchResults = addResultToSearchresults($searchResults, "skill", "skill|".$exploded[1], $relevancy, "", "Found by page for this skill id, relevancy ".$relevancy); } } else { foreach ($results as $result) { $exploded = explode("|", $result["specialcode"]); $foundSkills[$exploded[1]] = $exploded[1]; } } } } /* ... and search skills by "alias" ... */ $results = $database->doQuery("SELECT skill_id FROM skill_alias WHERE alias LIKE '%".$searchString."%'"." #Searching for ".$searchingFor); if (isset($results) && count($results) > 0) { $relevancy = max(10, 90 - count($results)); if ($relevancy > $minimumRelevancy) { if ($searchingFor == "skill") { foreach ($results as $result) { $searchResults = addResultToSearchresults($searchResults, "skill", "skill|".$result["skill_id"], $relevancy, "", "Found by alias for this skill id, relevancy ".$relevancy); } } else { foreach ($results as $result) { $foundSkills[$result["skill_id"]] = $result["skill_id"]; } } } } /* ... Maybe we are actually searching for a branche ...? */ if (strtolower($searchString) == "branche") { $results = $database->doQuery("SELECT id, skill, parent_id FROM jos_zzp_skills WHERE parent_id = 0 #Searching for ".$searchingFor); if (isset($results) && count($results) > 0) { $relevancy = 100; if ($relevancy > $minimumRelevancy) { foreach ($results as $result) { if ($searchingFor == "skill") { $searchResults = addResultToSearchresults($searchResults, "skill", ($result["parent_id"] == 0 ? "branche" : "skill")."|".$result["id"], $relevancy, "", "Found by Branche keyword, relevancy ".$relevancy); } else { $foundSkills[$result["id"]] = $result["id"]; } } } } } } if ($searchingFor == "work") { $relevancy = 90; if (count($foundSkills) > 0) { foreach ($foundSkills as $skillId) { /* Do we have ads? */ $ads = array(); $results = $database->doQuery("SELECT marktplaats.id AS id FROM marktplaats LEFT JOIN jos_users ON marktplaats.clientid = CONCAT('user|', jos_users.id) WHERE state = 'done' AND thetype = 'DIENST' AND category = ".$skillId." AND jos_users.id IS NOT NULL ORDER BY thedatetime DESC #Finding ads for ".$searchString); if (isset($results) && count($results) > 0) { foreach ($results as $result) { $searchResults = addResultToSearchresults($searchResults, "work", "marktplaats|".$result["id"], $relevancy, "", "Found by skillname, relevancy ".$relevancy); } } /* 25/2/2020 $results = $database->doQuery("SELECT * FROM stepstone WHERE state != 'oud' AND FIND_IN_SET(".$skillId.", skillsandbranches) > 0 #Finding ads for ".$searchString); if (isset($results) && count($results) > 0) { foreach ($results as $result) { $searchResults = addResultToSearchresults($searchResults, "work", "stepstone|".$result["id"], $relevancy, "", "Found by skillname, relevancy ".$relevancy); } } */ /* 18/7/2020 $results = $database->doQuery("SELECT * FROM manpower WHERE state != 'oud' AND FIND_IN_SET(".$skillId.", skillsandbranches) > 0 #Finding ads for ".$searchString); if (isset($results) && count($results) > 0) { foreach ($results as $result) { $searchResults = addResultToSearchresults($searchResults, "work", "manpower|".$result["id"], $relevancy, "", "Found by skillname, relevancy ".$relevancy); } } */ } } } } if ($searchingFor == "ad") { /* Search ads ... MARKTPLAATS... */ //2024-12-31 DO NOT allow non-existent users $results = $database->doQuery("SELECT marktplaats.id AS id, title FROM marktplaats LEFT JOIN jos_users ON marktplaats.clientid = CONCAT('user|', jos_users.id) WHERE ".($searchString == "" ? "" : "(title LIKE '%".$searchString."%' OR tekst LIKE '%".$searchString."%') AND ")."state = 'done'"." AND jos_users.id IS NOT NULL #Searching for ".$searchingFor); if (isset($results) && count($results) > 0) { $relevancy = max(10, 90 - count($results)); if ($relevancy > $minimumRelevancy) { foreach ($results as $result) { $searchResults = addResultToSearchresults($searchResults, "ad", "marktplaats|".$result["id"], $relevancy, "", "Found by title and/or tekst, relevancy ".$relevancy); } } } /* Stepstone */ /* 25/2/2020 $results = $database->doQuery("SELECT * FROM stepstone WHERE ".($searchString == "" ? "" : "(title LIKE '%".$searchString."%' OR description LIKE '%".$searchString."%') AND ")."state != 'oud'"." #Searching for ".$searchingFor); if (isset($results) && count($results) > 0) { $relevancy = 100; if ($relevancy > $minimumRelevancy) { foreach ($results as $result) { $searchResults = addResultToSearchresults($searchResults, "ad", "stepstone|".$result["id"], $relevancy, "", "Found by title and/or tekst, relevancy ".$relevancy); } } } */ /* Manpower */ /* 18/7/2020 $results = $database->doQuery("SELECT * FROM manpower WHERE ".($searchString == "" ? "" : "(title LIKE '%".$searchString."%' OR description LIKE '%".$searchString."%') AND ")."state != 'oud'"." #Searching for ".$searchingFor); if (isset($results) && count($results) > 0) { $relevancy = 100; if ($relevancy > $minimumRelevancy) { foreach ($results as $result) { $searchResults = addResultToSearchresults($searchResults, "ad", "manpower|".$result["id"], $relevancy, "", "Found by title and/or tekst, relevancy ".$relevancy); } } } */ } if ($searchingFor == "news") { /* Search news */ $results = $database->doQuery("SELECT id, MATCH(title) AGAINST ('".$searchString."') + MATCH(introtext) AGAINST ('".$searchString."') AS relevancy FROM news HAVING relevancy > 0 ORDER BY relevancy DESC LIMIT 0,10"); if (isset($results) && count($results) > 0) { $relevancy = max(10, 90 - count($results)); if ($relevancy > $minimumRelevancy) { foreach ($results as $result) { $relevancy = floor($relevancy * $result["relevancy"] / $results[0]["relevancy"]); if ($relevancy > $minimumRelevancy) { $searchResults = addResultToSearchresults($searchResults, "news", $result["id"], $relevancy, "", "Found by title and introtext, relevancy ".$relevancy); } } } } } if ($searchingFor == "blog") { /* Search blogs */ $results = $database->doQuery("SELECT id, titel FROM jos_zzp_weblogitems WHERE active = 1 AND (titel LIKE '%".$searchString."%' OR inhoud LIKE '%".$searchString."%' OR tags LIKE '%".$searchString."%')"); if (isset($results) && count($results) > 0) { $relevancy = max(10, 90 - count($results)); if (1==1 || $relevancy > $minimumRelevancy) { foreach ($results as $result) { $searchResults = addResultToSearchresults($searchResults, "blog", $result["id"], $relevancy, "", "Found by titel, inhoud or tags, relevancy ".$relevancy); } } } } if (isset($searchResults[$searchingFor])) { /* Sort the searched type by relevancy Downgrade not found elements from the pre-filled search results, if they have low relevancy */ $searchResults[$searchingFor]["total"] = 0; foreach ($searchResults[$searchingFor]["results"] as $key => $result) { $searchResults[$searchingFor]["total"]++; if ($searchResults[$searchingFor]["results"][$key]["refound"]) { //This is always good $searchResults[$searchingFor]["results"][$key]["relevancy"] = ceil((100 + $searchResults[$searchingFor]["results"][$key]["relevancy"]) / 2); } else { /* 22/9/2016 if ($searchResults[$type]["results"][$key]["relevancy"] < $minimumRelevancy) { $searchResults[$type]["total"]--; unset($searchResults[$type]["results"][$key]); } else { $searchResults[$type]["results"][$key]["relevancy"] -= 10; } */ if ($searchResults[$searchingFor]["results"][$key]["relevancy"] > 10 ) { $searchResults[$searchingFor]["results"][$key]["relevancy"] -= 10; } else { $searchResults[$searchingFor]["total"]--; unset($searchResults[$searchingFor]["results"][$key]); } } } if ($searchResults[$searchingFor]["total"] == 0) { unset($searchResults[$searchingFor]); } else { uasort($searchResults[$searchingFor]["results"], 'cmpSearchResults'); } } return $searchResults; } function doHint($oneWord) { //Let's find a hint global $database; $results = $database->doQuery("SELECT id, suggestion FROM suggestions WHERE LEFT(suggestion, ".strlen($oneWord).") = '".$oneWord."' ORDER BY frequency DESC"); if (isset($results) && count($results) > 0) { $relevancy = 100; if (1==1 || $relevancy > $minimumRelevancy) { foreach ($results as $result) { echo "<p>".$result["suggestion"]."</p>"; } } } } function getHeaderHTML($title, $states) { $returnString = " <style>td.flow {vertical-align: top;} td.flow a {color: #ffffff;} </style> <table style='width: 95%;'> <tr> <td colspan=".count($states)." style='background-color: #165eaa; padding: 3px; text-align: center;'><strong style='color: #ffffff;'>".$title."</strong></td> </tr><tr>"; foreach ($states as $i => $state) { $returnString .= "<td class='flow' style='width: ".floor(100/count($states))."%; background-color: #".($state["allow"] ? ($state["active"] ? "114b88" : "165eaa") : "1d7bde")."; padding: 3px; color: #".($state["allow"] ? "ffffff" : "d0d0d0")."; text-align: center;'>" ."<p class='".($state["active"] ? "strong" : "")."' id='headerState".$i."'>" //MAY be restyled by javascript .($state["allow"] && !$state["active"] ? $state["a"] : "") ."<span style='font-size: 3em;'>".($i + 1)."</span><br /><br />" .$state["name"] .($state["active"] && !$state["active"] ? "</a>" : "") ."</p></td>"; } $returnString .= "</tr>"; $returnString .= " </table> "; return $returnString; } function dumpToDisk($description) { $string = "Oeps - ".$description.PHP_EOL.PHP_EOL ."=========== REQUEST DATA ==================================".PHP_EOL ."Document root: ".$_SERVER["DOCUMENT_ROOT"].PHP_EOL ."Request URI: ".$_SERVER['REQUEST_URI'].PHP_EOL ."Server name: ".$_SERVER["SERVER_NAME"].PHP_EOL ."Dus: ".$_SERVER["SERVER_NAME"].$_SERVER['REQUEST_URI'].PHP_EOL ."Script: ".$_SERVER["SCRIPT_NAME"].PHP_EOL ."Referrer: ".(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "NOT SET").PHP_EOL ."IP: ".$_SERVER['REMOTE_ADDR'].PHP_EOL ."HTTP_ORIGIN: ".(isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : "NOT SET").PHP_EOL ."memory_get_peak_usage(true): ".memory_get_peak_usage(true).PHP_EOL ."User agent: ".(isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : "NOT SET").PHP_EOL ."=========== GET, POST, SESSION and COOKIE ================".PHP_EOL .print_r($_GET, true).PHP_EOL .print_r($_POST, true).PHP_EOL .print_r($_SESSION, true).PHP_EOL .print_r($_COOKIE, true).PHP_EOL ."==========================================================="; if (RUNNING_ON_LOCALHOST) { dieNice("<xmp>".$string."</xmp>"); } else { global $pageReady; $pageReady = true; file_put_contents("..".DS."log".DS.$description.date("Y-m-d Hi").".txt", $string); } } function dieToDisk($description) { dumpToDisk($description); header('HTTP/1.1 403 Forbidden'); header('Status: 403 Forbidden'); die(); } function dieNice($someString = "") { global $theUser; if (RUNNING_ON_LOCALHOST || $theUser->isAdmin()) { $trace = debug_backtrace(); $i = 1; while (isset($trace[$i]['function']) && $i < 20) { echo $i." > ".$trace[$i]['function']." (".(isset($trace[$i]['file']) ? $trace[$i]['file'] : "unknown file").", line ".(isset($trace[$i]['line']) ? $trace[$i]['line'] : "unknown" ).")"."<br />"; $i++; } die($someString); } else { Debug::addItem("includes.php", "function dieNice", ($someString == "" ? "Geen info" : $someString), "crash"); } } /* LET OP vervang getURL overal door getUrl ARE OK: - classAgendaItem - classBranche - classGroup - classImage - classNewsItem WORKING ON - */ /* ELK ELEMENT MOET HEBBEN - getDomElement(controlparameters) = HTML dom Element, kleinst mogelijk, met link naar mij if any <a>ik</a> of <img> - getUrl()= URL van mij - getLocation() = mijn coördinaten op de kaart, if any OF ZO - setById or setByUserData En OVERSTIJGEND - getById or getByUserData - getBySearching */ interface zzpObject { public function getDomElement($parameters = array()); public function getUrl($parameters = array()); //Returns http://bla-bla.bl/bla/me } interface hasStates { public function highestState(); //Get number (1, 2, 3, ...) of highest reachable state public function getStateChangeA($newStateNumber); //Get a URL for applying a state change to newStateNumber public function lowerState($newStateNumber); //Lower the state to newStateNumber. Tests wether $newStateNumber < highestState() } function getRequestData() { // Gebruiker $variabelen1 = "Gebruiker: "; global $theUser; if (isset($theUser)) { if ($theUser->isLoggedIn()) { $variabelen1 .= $theUser->getUserIdData().PHP_EOL; } else { $variabelen1 .= "Niemand ingelogd".PHP_EOL; } } else { $variabelen1 .= "Nog niet gedefinieerd".PHP_EOL; } //De GET en POST variabelen uitkleden $variabelen2 = ""; if (isset($_GET) && count($_GET) > 0) { $variabelen2 .= "GET: ".PHP_EOL; foreach ($_GET as $key => $aGet) { $variabelen2 .= " - [".$key."] = ".$aGet.PHP_EOL; } } else { $variabelen2 .= "GET: (geen)".PHP_EOL; } if (isset($_POST) && count($_POST) > 0) { $variabelen2 .= "POST: ".PHP_EOL; foreach ($_POST as $key => $aPost) { $variabelen2 .= " - [".$key."] = ".$aPost.PHP_EOL; } } else { $variabelen2 .= "POST: (geen)".PHP_EOL; } if (isset($_FILES) && count($_FILES) > 0) { $variabelen2 .= "FILES: ".PHP_EOL; foreach($_FILES as $key => $filesEntry) { if (is_array($filesEntry)) { foreach($filesEntry as $key2 => $filesEntry2) { $variabelen2 .= " - ".$key."[".$key2."] = ".$filesEntry2.PHP_EOL; } } else { $variabelen2 .= " - [".$key."] = ".$filesEntry.PHP_EOL; } } } else { $variabelen2 .= "FILES: (geen)".PHP_EOL; } if (isset($_COOKIE) && count($_COOKIE) > 0) { $variabelen2 .= "COOKIE: ".PHP_EOL; foreach($_COOKIE as $key => $cookieEntry) { $variabelen2 .= " - [".$key."] = ".$cookieEntry.PHP_EOL; } } else { $variabelen2 .= "COOKIE: (geen)".PHP_EOL; } if (isset($_SESSION) && count($_SESSION) > 0) { $variabelen2 .= "SESSION: ".PHP_EOL; foreach($_SESSION as $key => $sessionEntry) { $variabelen2 .= " - [".$key."] = ".$sessionEntry.PHP_EOL; } } else { $variabelen2 .= "COOKIE: (geen)".PHP_EOL; } $returnString = "=========== REQUEST DATA ==================================".PHP_EOL ."Document root: ".$_SERVER["DOCUMENT_ROOT"].PHP_EOL ."Request URI: ".$_SERVER['REQUEST_URI'].PHP_EOL ."Server name: ".$_SERVER["SERVER_NAME"].PHP_EOL ."Dus: ".$_SERVER["SERVER_NAME"].$_SERVER['REQUEST_URI'].PHP_EOL ."Script: ".$_SERVER["SCRIPT_NAME"].PHP_EOL ."Referrer: ".(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "NOT SET").PHP_EOL ."IP: ".$_SERVER['REMOTE_ADDR'].PHP_EOL ."HTTP_ORIGIN: ".(isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : "NOT SET").PHP_EOL ."memory_get_peak_usage(true): ".memory_get_peak_usage(true).PHP_EOL ."User agent: ".(isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : "NOT SET").PHP_EOL ."=========== GEBRUIKER =====================================".PHP_EOL .$variabelen1 ."=========== GET, POST, FILES, SESSION and COOKIE ==========".PHP_EOL .$variabelen2 ."===========================================================".PHP_EOL; return $returnString; } function getDebugBackTrace() { $toLogString = "=========== debug_backtrace() =============================".PHP_EOL; $i = 1; // '0' is THIS FUNCTION $trace = debug_backtrace(); while(isset($trace[$i]['function']) && $i < 16) { $toLogString .= $i ." > " .(isset($trace[$i]['function']) ? $trace[$i]['function'] : "Onbekende functie").PHP_EOL ." - " .(isset($trace[$i]['file']) ? $trace[$i]['file'] : "Onbekende filenaam").PHP_EOL ." - line " .(isset($trace[$i]['line']) ? $trace[$i]['line'] : "Onbekend regelnummer") .PHP_EOL; $i++; } return $toLogString; } function myErrorHandler($errno, $errstr, $errfile, $errline) { global $classesRead; if (error_reporting() === 0) { //The error was surpressed using @, see http://uk.php.net/manual/en/language.operators.errorcontrol.php return true; } $e_type = ""; $exit_now = false; switch ($errno) { case 1: $e_type = 'E_ERROR'; $exit_now = true; break; case 2: $e_type = 'E_WARNING'; break; case 4: $e_type = 'E_PARSE'; break; case 8: $e_type = 'E_NOTICE'; break; case 16: $e_type = 'E_CORE_ERROR'; $exit_now = true; break; case 32: $e_type = 'E_CORE_WARNING'; break; case 64: $e_type = 'E_COMPILE_ERROR'; $exit_now = true; break; case 128: $e_type = 'E_COMPILE_WARNING'; break; case 256: $e_type = 'E_USER_ERROR'; $exit_now = true; break; case 512: $e_type = 'E_USER_WARNING'; break; case 1024: $e_type = 'E_USER_NOTICE'; break; case 2048: $e_type = 'E_STRICT'; break; case 4096: $e_type = 'E_RECOVERABLE_ERROR'; $exit_now = true; break; case 8192: $e_type = 'E_DEPRECATED'; break; case 16384: $e_type = 'E_USER_DEPRECATED'; break; case 30719: $e_type = 'E_ALL'; $exit_now = true; break; default: $e_type = 'E_UNKNOWN'; break; } if (RUNNING_ON_LOCALHOST) { if ($e_type == "E_DEPRECATED") { //Nothing } else { $exit_now = true; } } // Do something other than output message. $toLogString = "======== PHP Foutmelding (classes ".($classesRead ? "wel" : "NOG NIET")." ingelezen) =========".PHP_EOL; $toLogString .= $e_type.": ".$errstr.PHP_EOL; $toLogString .= "Exit now: ".($exit_now ? "YES" : "NO").PHP_EOL; $toLogString .= "Locatie: ".$errfile." op regel ".$errline.PHP_EOL; $toLogString .= getDebugBackTrace(); $toLogString .= getRequestData(); if (RUNNING_ON_LOCALHOST) { return true; echo "<div style='background-color: #ffffff; border: #ff0000 5px solid; position: absolute; top: 100px; z-index: 1000; padding: 5px;'>"; echo "<input type=button value='Weg jij' onclick='this.parentNode.style.display = \"none\";' />"; echo "<xmp>".$toLogString."</xmp>"; echo "<input type=button value='Weg jij' onclick='this.parentNode.style.display = \"none\";' />"; echo "</div>"; if ($exit_now) { global $pageReady; $pageReady = true; exit(1); } else { return true; } } else { global $database; if (isset($database) && isset($classesRead) && $classesRead) { $longInfo = Debug::getHTML(); $database->doQueryWithoutResult(" INSERT INTO log (from1, from2, thetext, severity) VALUES ( '".(isset($_SERVER["SERVER_NAME"]) ? $_SERVER["SERVER_NAME"] : "").(isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : "")."', 'PHP Fout: ".$e_type."', '".str_replace("'", "\'", $toLogString)."', '".$e_type."' )" ); global $pageReady; if ($exit_now) { global $pageReady; $pageReady = true; exit(1); } } else { //die("Geen database of niet alle classes ingelezen"); } } if ($exit_now) { global $pageReady; $pageReady = true; exit(1); } // Don't execute PHP internal error handler return true; } function handleShutdown() { $error = error_get_last(); //Will NOT report an error if that error was handled by myErrorHandler. $toLogString = ""; global $pageReady; if ($error !== NULL) { if (strpos($error['message'], "magic_quotes_gpc") > 0) { /* NOODGREEP, nog oplossen */ $pageReady = true; } else if ($error['type'] === E_NOTICE) { /* This is no problem */ $pageReady = true; } else if ($error['type'] === E_CORE_WARNING ) { /* This is TEMPORARY no problem */ /* 21/12/2015, strange imagick errors */ // type:32 | file:Unknown | ln:0 | msg:PHP Startup: Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-20100525/imagick.so' - libMagickWand.so.2: cannot open shared object file: No such file or directory $pageReady = true; } else { $toLogString .= "!!! SHUTDOWN BY ERROR, type:".$error['type']." | file:".$error['file']." | ln:".$error['line']." | msg:".$error['message'].PHP_EOL; $toLogString .= "============ debug_backtrace() ==============".PHP_EOL; $trace = debug_backtrace(); $i = 0; while(isset($trace[$i]['function']) && $i < 5) { $toLogString .= $i ." > " .(isset($trace[$i]['function']) ? $trace[$i]['function'] : "Onbekende functie") ." (" .(isset($trace[$i]['file']) ? $trace[$i]['file'] : "Onbekende filenaam") .", line " .(isset($trace[$i]['line']) ? $trace[$i]['line'] : "Onbekend regelnummer") .")" .PHP_EOL; $i++; } $toLogString .= "=============================================".PHP_EOL; } } if (!isset($pageReady)) { $toLogString .= "!!! PAGINA WERD NIET AFGEROND !!!".PHP_EOL; } if ($toLogString != "") { $toLogString = "========== Bericht van handleShutdown() ===================".PHP_EOL .getRequestData() .$toLogString; global $database; global $classesRead; if (isset($classesRead) && $classesRead) { $toLogString .= "========== Debug::getHTML() ===============================".PHP_EOL .Debug::getHTML(); } else { $toLogString .= "========== Debug::getHTML() ... nog niet ingelezen ========".PHP_EOL; } global $theUser; if (RUNNING_ON_LOCALHOST || (isset($theUser) && $theUser->isAdmin())) { echo "<div style='background-color: #ffffff; border: #ff0000 5px solid; position: absolute; top: 5px; z-index: 1000; padding: 5px;'>"; echo "<input type=button value='Weg jij' onclick='this.parentNode.style.display = \"none\";' />"; echo "<xmp>".$toLogString."</xmp>"; echo "<input type=button value='Weg jij' onclick='this.parentNode.style.display = \"none\";' />"; echo "</div>"; } $toLogString = str_replace("\\", "/", $toLogString); if (isset($database) && isset($classesRead) && $classesRead) { // There seems to be a database. Let's log this entry. global $database; $database->doQueryWithoutResult("INSERT INTO log (from1, from2, thetext, status, severity) VALUES ('includes.php', 'function handleShutdown', '".str_replace("'", "\'", $toLogString)."', 'nieuw', 'incorrectshutdown')", true); } else { if (RUNNING_ON_LOCALHOST) { dieNice("FOUT: ".(isset($database) ? "" : "GEEN DATABASE").(isset($classesRead) && $classesRead ? "" : "GEEN CLASSES")); } } } } function stringToPartnershipArray($aString) { $returnValue = array(); //Invited, Ok, NotOk, WillAccept, InvitedBy if (strpos($aString, "x")) { $interimArray = explode("x", $aString); } else { $interimArray[0] = $aString; } foreach ($interimArray as $interimValue) { if (strpos($interimValue, "|")) { $anotherInterimArray = explode("|", $interimValue); } else { $anotherInterimArray[0] = $interimValue; } foreach ($anotherInterimArray as $key => $anotherInterimValue) { if ($key != 0) { $returnValue[$anotherInterimArray[0]][] = $anotherInterimValue; } } } return $returnValue; } function partnerShipArrayToString($anArray) { $returnString = ""; foreach ($anArray as $key=>$Item) { if ($returnString != "") { $returnString .= "x"; } $returnString .= $key; foreach ($Item as $itemValue) { $returnString .= "|".$itemValue; } } return $returnString; } function deleteValueFromPartnershipArray($theId, $anArray) { $newArray = array(); foreach ($anArray as $aStatus => $aSubArray) { foreach ($aSubArray as $aSubSubArray) { if ($aSubSubArray != $theId) { $newArray[$aStatus][] = $aSubSubArray; } } } return $newArray; } function addValueToPartnershipArray($theNewType, $theId, $anArray) { //Now add it $anArray[$theNewType][] = $theId; return $anArray; } function getStatusByUserIdFromPartnershipArray($aUserId, $anArray) { if (is_array($anArray)) { $statusStringExplodable = "none"; foreach ($anArray as $aStatus => $aSubArray) { foreach ($aSubArray as $aSubSubArray) { if ($aSubSubArray == $aUserId) { //return $aStatus; if ($statusStringExplodable == "none") { $statusStringExplodable = $aStatus; } else { $statusStringExplodable .= "|".$aStatus; } } } } return $statusStringExplodable; } else { return "none"; } return "none"; } function getWwwThumbURL($someUrl) { $thumbsFilename = substr($someUrl, 7); $thumbsImageSrc = HOSTROOT."thumbs/thumb.php?url=".$thumbsFilename; $dirTmp = substr(md5("http://thumbs.mijnzzp.nl/index.php?url=".$thumbsFilename), 0, 2); $dir = ""; for ($i = 0; $i < strlen($dirTmp); $i++) { $dir .= "/".substr($dirTmp, $i, 1); } $fileName = str_replace("/", ".", $thumbsFilename); $fileName = str_replace(":", ".", $fileName); $fileName = $fileName.".jpg"; //die($dir."/".$fileName); if (is_file("../thumbs".$dir."/".$fileName)) { // 2018-4-29 // Check size ... list($width, $height) = @getimagesize("../thumbs".$dir."/".$fileName); //MAY fail... if ($width == 200) { //Nice! return HOSTROOT."thumbs".$dir."/".$fileName; } } return HOSTROOT."thumbs/thumb.php?url=".$thumbsFilename; } ?>