/** * Note: This file may contain artifacts of previous malicious infection. * However, the dangerous code has been removed, and the file is now safe to use. */ /** * @file * Pathologic text filter for Drupal. * * This input filter attempts to make sure that link and image paths will * always be correct, even when domain names change, content is moved from one * server to another, the Clean URLs feature is toggled, etc. */ /** * Implements hook_filter_info(). */ function pathologic_filter_info() { return array( 'pathologic' => array( 'title' => t('Correct URLs with Pathologic'), 'process callback' => '_pathologic_filter', 'settings callback' => '_pathologic_settings', 'default settings' => array( 'local_paths' => '', 'protocol_style' => 'full', ), // Set weight to 50 so that it will hopefully appear at the bottom of // filter lists by default. 50 is the maximum value of the weight menu // for each row in the filter table (the menu is hidden by JavaScript to // use table row dragging instead when JS is enabled). 'weight' => 50, ) ); } /** * Settings callback for Pathologic. */ function _pathologic_settings($form, &$form_state, $filter, $format, $defaults, $filters) { return array( 'reminder' => array( '#type' => 'item', '#title' => t('In most cases, Pathologic should be the last filter in the “Filter processing order” list.'), '#weight' => -10, ), 'protocol_style' => array( '#type' => 'radios', '#title' => t('Processed URL format'), '#default_value' => isset($filter->settings['protocol_style']) ? $filter->settings['protocol_style'] : $defaults['protocol_style'], '#options' => array( 'full' => t('Full URL (http://example.com/foo/bar)'), 'proto-rel' => t('Protocol relative URL (//example.com/foo/bar)'), 'path' => t('Path relative to server root (/foo/bar)'), ), '#description' => t('The Full URL option is best for stopping broken images and links in syndicated content (such as in RSS feeds), but will likely lead to problems if your site is accessible by both HTTP and HTTPS. Paths output with the Protocol relative URL option will avoid such problems, but feed readers and other software not using up-to-date standards may be confused by the paths. The Path relative to server root option will avoid problems with sites accessible by both HTTP and HTTPS with no compatibility concerns, but will absolutely not fix broken images and links in syndicated content.'), '#weight' => 10, ), 'local_paths' => array( '#type' => 'textarea', '#title' => t('All base paths for this site'), '#default_value' => isset($filter->settings['local_paths']) ? $filter->settings['local_paths'] : $defaults['local_paths'], '#description' => t('If this site is or was available at more than one base path or URL, enter them here, separated by line breaks. For example, if this site is live at http://example.com/ but has a staging version at http://dev.example.org/staging/, you would enter both those URLs here. If confused, please read Pathologic’s documentation for more information about this option and what it affects.', array('!docs' => 'http://drupal.org/node/257026')), '#weight' => 20, ), ); } /** * Pathologic filter callback. * * Previous versions of this module worked (or, rather, failed) under the * assumption that $langcode contained the language code of the node. Sadly, * this isn't the case. * @see http://drupal.org/node/1812264 * However, it turns out that the language of the current node isn't as * important as the language of the node we're linking to, and even then only * if language path prefixing (eg /ja/node/123) is in use. REMEMBER THIS IN THE * FUTURE, ALBRIGHT. * * @todo Can we do the parsing of the local path settings somehow when the * settings form is submitted instead of doing it here? */ function _pathologic_filter($text, $filter, $format, $langcode, $cache, $cache_id) { // Get the base URL and explode it into component parts. We add these parts // to the exploded local paths settings later. global $base_url; $base_url_parts = parse_url($base_url . '/'); // Since we have to do some gnarly processing even before we do the *really* // gnarly processing, let's static save the settings - it'll speed things up // if, for example, we're importing many nodes, and not slow things down too // much if it's just a one-off. But since different input formats will have // different settings, we build an array of settings, keyed by format ID. $settings = &drupal_static(__FUNCTION__, array()); if (!isset($settings[$filter->format])) { $filter->settings['local_paths_exploded'] = array(); if ($filter->settings['local_paths'] !== '') { // Build an array of the exploded local paths for this format's settings. // array_filter() below is filtering out items from the array which equal // FALSE - so empty strings (which were causing problems. // @see http://drupal.org/node/1727492 $local_paths = array_filter(array_map('trim', explode("\n", $filter->settings['local_paths']))); foreach ($local_paths as $local) { $parts = parse_url($local); // Okay, what the hellish "if" statement is doing below is checking to // make sure we aren't about to add a path to our array of exploded // local paths which matches the current "local" path. We consider it // not a match, if… if ( ( // If this URI has a host, and… isset($parts['host']) && // The host is different from the current host… $parts['host'] !== $base_url_parts['host'] ) || // Or… ( // The URI doesn't have a host… !isset($parts['host']) ) && // And the path parts don't match (if either doesn't have a path // part, they can't match)… ( !isset($parts['path']) || !isset($base_url_parts['path']) || $parts['path'] !== $base_url_parts['path'] ) ) { // Add it to the list. $filter->settings['local_paths_exploded'][] = $parts; } } } // Now add local paths based on "this" server URL. $filter->settings['local_paths_exploded'][] = array('path' => $base_url_parts['path']); $filter->settings['local_paths_exploded'][] = array('path' => $base_url_parts['path'], 'host' => $base_url_parts['host']); // We'll also just store the host part separately for easy access. $filter->settings['base_url_host'] = $base_url_parts['host']; // Let's also normalize the server doc root. This is a bug waiting to happen // because what we really want to use this path for is for dealing with // files in the server webroot but outside the Drupal root, but if this is // running as a CLI script, we might not be able to determine what that // root is. In that case, we'll use the Drupal root. // @see http://drupal.org/node/1780398 $filter->settings['docroot'] = (drupal_is_cli() || !isset($_SERVER) || !isset($_SERVER['DOCUMENT_ROOT'])) ? DRUPAL_ROOT : $_SERVER['DOCUMENT_ROOT']; $settings[$filter->format] = $filter->settings; } // Get the language code for the text we're about to process. $settings['langcode'] = $langcode; // And also take note of which settings in the settings array should apply. $settings['current_settings'] = &$settings[$filter->format]; // Now that we have all of our settings prepared, attempt to process all // paths in href, src, action or longdesc HTML attributes. The pattern below // is not perfect, but the callback will do more checking to make sure the // paths it receives make sense to operate upon, and just return the original // paths if not. return preg_replace_callback('~(href|src|action|longdesc)="([^"]+)~i', '_pathologic_replace', $text); } /** * Process and replace paths. preg_replace_callback() callback. */ function _pathologic_replace($matches) { // Get the settings for the filter. Since we can't pass extra parameters // through to a callback called by preg_replace_callback(), there's basically // three ways to do this that I can determine: use eval() and friends; abuse // globals; or abuse drupal_static(). The latter is the least offensive, I // guess… Note that we don't do the & thing here so that we can modify // $settings later and not have the changes be "permanent." $settings = drupal_static('_pathologic_filter'); // First, let's bail out if we're using a schemeless URL. // @see http://drupal.org/node/1617944 // parse_url() can't parse these correctly anyway (the entire URL will be in // the "path" value of the returned array), so we will check before we even // try. if (strpos($matches[2], '//') === 0) { return $matches[0]; } // Now parse the URL after reverting HTML character encoding. // @see http://drupal.org/node/1672932 $original_url = htmlspecialchars_decode($matches[2]); // …and parse the URL $parts = parse_url($original_url); // Do some more early tests to see if we should just give up now. if ( // If parse_url() failed, give up. $parts === FALSE // If there's a scheme part and it doesn't look useful, bail out. // "files" and "internal" are for Path Filter compatibility. || (isset($parts['scheme']) && !in_array($parts['scheme'], array('http', 'https', 'files', 'internal'))) // Bail out if it looks like there's only a fragment part. || (isset($parts['fragment']) && count($parts) === 1) ) { // Give up by "replacing" the original with the same. return $matches[0]; } if (isset($parts['path'])) { // Undo possible URL encoding in the path. // @see http://drupal.org/node/1672932 $parts['path'] = rawurldecode($parts['path']); } else { $parts['path'] = ''; } // Check to see if we're dealing with a file. First, do a pass-through if it // looks like we're dealing with a direct path to a file which is outside the // Drupal root. Use realpath() and the server's (?) docroot to iron out // wrinkles to the file's actual path. // @see http://drupal.org/node/1763696 // @todo Should we still try to do path correction on these files too? $filepath = realpath($settings['current_settings']['docroot'] . '/' . $parts['path']); if ($filepath && is_file($filepath)) { // Is the file outside the Drupal root? if (strpos($filepath, DRUPAL_ROOT) !== 0) { return $matches[0]; } else { // Linking to a file inside the Drupal root. Okay. $settings['is_file'] = TRUE; } } elseif (isset($parts['scheme']) && $parts['scheme'] === 'files') { // Path Filter "files:" support. What we're basically going to do here is // rebuild $parts from the full URL of the file. $new_parts = parse_url(file_create_url(file_default_scheme() . '://' . $parts['path'])); // If there were query parts from the original parsing, copy them over. if (!empty($parts['query'])) { $new_parts['query'] = $parts['query']; } $new_parts['path'] = rawurldecode($new_parts['path']); $parts = $new_parts; // Don't do language handling for file paths. $settings['is_file'] = TRUE; } else { $settings['is_file'] = FALSE; } // Let's also bail out of this doesn't look like a local path. $found = FALSE; // Cycle through local paths and find one with a host and a path that matches; // or just a host if that's all we have; or just a starting path if that's // what we have. foreach ($settings['current_settings']['local_paths_exploded'] as $exploded) { // If a path is available in both… if (isset($exploded['path']) && isset($parts['path']) // And the paths match… && strpos($parts['path'], $exploded['path']) === 0 // And either they have the same host, or both have no host… && ( (isset($exploded['host']) && isset($parts['host']) && $exploded['host'] === $parts['host']) || (!isset($exploded['host']) && !isset($parts['host'])) ) ) { // Remove the shared path from the path. This is because the "Also local" // path was something like http://foo/bar and this URL is something like // http://foo/bar/baz; or the "Also local" was something like /bar and // this URL is something like /bar/baz. And we only care about the /baz // part. $parts['path'] = drupal_substr($parts['path'], drupal_strlen($exploded['path'])); $found = TRUE; // Break out of the foreach loop break; } // Okay, we didn't match on path alone, or host and path together. Can we // match on just host? Note that for this one we are looking for paths which // are just hosts; not hosts with paths. elseif ((isset($parts['host']) && !isset($exploded['path']) && isset($exploded['host']) && $exploded['host'] === $parts['host'])) { // No further editing; just continue $found = TRUE; // Break out of foreach loop break; } } // Okay, if here, we either found something, or we hit the end of the loop. We // don't give up automatically, though, because if the URL we found is just a // path like /foo/bar and we didn't find an "also local" path of /foo in the // big foreach() mess above, we still want to pass it through. if (!$found && !(isset($parts['path']) && !isset($parts['host']))) { return $matches[0]; } // Examine the query part of the URL. Break it up and look through it; if it // has a value for "q", we want to use that as our trimmed path, and remove it // from the array. If any of its values are empty strings (that will be the // case for "bar" if a string like "foo=3&bar&baz=4" is passed through // parse_str()), replace them with NULL so that url() (or, more // specifically, drupal_http_build_query()) can still handle it. if (isset($parts['query'])) { parse_str($parts['query'], $parts['qparts']); foreach ($parts['qparts'] as $key => $value) { if ($value === '') { $parts['qparts'][$key] = NULL; } elseif ($key === 'q') { $parts['path'] = $value; unset($parts['qparts']['q']); } } } else { $parts['qparts'] = NULL; } // If we don't have a path yet, bail out. if (!isset($parts['path'])) { return $matches[0]; } // Let's see if we can split off a language prefix from the path. if (!$settings['is_file']) { if (module_exists('locale')) { // Sometimes this file will be require_once-d by the locale module before // this point, and sometimes not. We require_once it ourselves to be sure. require_once DRUPAL_ROOT . '/includes/language.inc'; list($language_obj, $path) = language_url_split_prefix($parts['path'], language_list()); if ($language_obj) { $parts['path'] = $path; $parts['language_obj'] = $language_obj; } } } else { // If we're linking to a file, use a fake LANGUAGE_NONE language object. // Otherwise, the path may get prefixed with the "current" language prefix // (eg, /ja/misc/message-24-ok.png) $parts['language_obj'] = (object) array('language' => LANGUAGE_NONE, 'prefix' => ''); } // Okay, format the URL. // If there's still a slash lingering at the start of the path, chop it off. // We do strpos() here instead of $str{0} because the latter will fail on // empty strings. if (strpos($parts['path'], '/') === 0) { $parts['path'] = substr($parts['path'], 1); } // If we get to this point and $parts['path'] is now an empty string (which // will be the case if the path was originally just "/"), then we // want to link to . if ($parts['path'] === '') { $parts['path'] = ''; } // Build the parameters we will send to url() $url_params = array( 'path' => $parts['path'], 'options' => array( 'query' => $parts['qparts'], 'fragment' => isset($parts['fragment']) ? $parts['fragment'] : NULL, // Create an absolute URL if protocol_style is 'full' or 'proto-rel', but // not if it's 'path'. 'absolute' => $settings['current_settings']['protocol_style'] !== 'path', // If we seem to have found a language for the path, pass it along to // url(). Otherwise, ignore the 'language' parameter. 'language' => isset($parts['language_obj']) ? $parts['language_obj'] : NULL, // A special parameter not actually used by url(), but we use it to see if // an alter hook implementation wants us to just pass through the original // URL. 'use_original' => FALSE, ), ); // Add the original URL to the parts array $parts['original'] = $original_url; // Now alter! // @see http://drupal.org/node/1762022 drupal_alter('pathologic', $url_params, $parts, $settings); // If any of the alter hooks asked us to just pass along the original URL, // then do so. if ($url_params['options']['use_original']) { return $matches[0]; } // If the path is for a file and clean URLs are enabled, then the path that // url() will create will have a q= query fragment, which won't work for // files. To avoid that, we use this trick to temporarily turn clean URLs on. // This is horrible, but it seems to be the sanest way to do this. // @see http://drupal.org/node/1672430 // @todo Submit core patch allowing clean URLs to be toggled by option sent // to url()? if (!empty($settings['is_file'])) { $settings['orig_clean_url'] = !empty($GLOBALS['conf']['clean_url']); if (!$settings['orig_clean_url']) { $GLOBALS['conf']['clean_url'] = TRUE; } } // Now for the url() call. Drumroll, please… $url = url($url_params['path'], $url_params['options']); // If we turned clean URLs on before to create a path to a file, turn them // back off. if ($settings['is_file'] && !$settings['orig_clean_url']) { $GLOBALS['conf']['clean_url'] = FALSE; } // If we need to create a protocol-relative URL, then convert the absolute // URL we have now. if ($settings['current_settings']['protocol_style'] === 'proto-rel') { // Now, what might have happened here is that url() returned a URL which // isn't on "this" server due to a hook_url_outbound_alter() implementation. // We don't want to convert the URL in that case. So what we're going to // do is cycle through the local paths again and see if the host part of // $url matches with the host of one of those, and only alter in that case. $url_parts = parse_url($url); if (!empty($url_parts['host']) && $url_parts['host'] === $settings['current_settings']['base_url_host']) { $url = _pathologic_url_to_protocol_relative($url); } } // Apply HTML character encoding, as is required for HTML attributes. // @see http://drupal.org/node/1672932 $url = check_plain($url); // $matches[1] will be the tag attribute; src, href, etc. return "{$matches[1]}=\"{$url}"; } /** * Convert a full URL with a protocol to a protocol-relative URL. * * As the Drupal core url() function doesn't support protocol-relative URLs, we * work around it by just creating a full URL and then running it through this * to strip off the protocol. * * Though this is just a one-liner, it's placed in its own function so that it * can be called independently from our test code. */ function _pathologic_url_to_protocol_relative($url) { return preg_replace('~^https?://~', '//', $url); } Livet leker för SIA-glass! OBS: detta blogginlägg kan innehålla spår av nötter. | IHM

Livet leker för SIA-glass! OBS: detta blogginlägg kan innehålla spår av nötter.

För ett par veckor sedan så åkte jag ner till SIA-glass i Slöinge för att träffa deras marknadschef Stefan Carlsson igen. Det är andra gången vi träffas och lite mer bakgrundsfakta om Stefan hittar ni i det förra blogginlägget. Nu är jag här för att höra hur det går med deras satsning på kompetensutveckling av säljarna och kanske få Stefan att avslöja nästa års nyhet på glassfronten, nu kör vi!


– Hej, Jättekul att vara här igen. Nu är det ungefär ett halvår sedan som jag var här sist och då pratade vi om att ni 2015 hade ca 13 % ökning av er försäljning trots dålig sommar, och ni har högt ställda mål till 2020. Nu har sommaren 2016 hunnit passera, hur har det gått?

– Det har gått jättebra ackumulerat ligger vi på 10 % tillväxt, näst intill budget. Mina områden dagligvaruhandel och servicehandel ligger på budget, men vi har tappat något på andra områden. Senaste statistiken, som vi fick nu i veckan, visar att de sista 8 veckorna har vi varit de som drivit marknaden. Vi har, mätt under den perioden, närmat oss marknadsledaren rejält, och har nu en marknadsandel på nästan 20 % mot ungefär 19 % förra året. 20 % är all time high, 1 % låter inte mycket – men det är väldigt mycket.

– Om jag minns rätt så har ni som mål att ha en marknadsandel på 25 % år 2020?

– Ja målet är 25 % 2021, vi har flyttat fram ett år då nästa år är planerat att bli ett konsolideringsår.

– Tanken är att växa drygt 1 % per år då?

– Ja det är ungefär den takten vi har hållit senaste åren. 1 -2 % per år – det ska gå! Vi är väldigt nöjda så här långt. Vi håller budget och det ser ut att bli ett jättebra år försäljningsmässigt.

– Låter helt fantastiskt. Det är ju tuffa mål. När vi sågs senast hade ni era största andelar i Stockholm, Halland, Skåne – har det förändrats?

– Ja det har faktiskt förändrats. Utöver våra tidigare starka regioner, visade sista mätningen att vi nu ligger på plats nummer två på Norrlandsmarknaden, mot tidigare tredjeplats. Och vi har åkt upp i Göteborg och ligger på andraplats även här. Det är fantastiskt roligt! Marknadsandelen speglar ju vår tillväxt. Och det är en trigger för säljkåren. För dem är det det ultimata beviset; de ser att det arbete som de lägger ner där ute ger resultat. 

– Om vi kopplar det till er säljakademi ihop med IHM?

– Säljakademin har absolut bidragit, det finns många faktorer som gör att vi når målen men en del är säljakademin. Jag gjorde en undersökning med några av våra säljare och generellt är de extremt positiva till utbildningen och tycker att den är jättebra.

– Sist pratade vi om faran att tappa folk. Din inställning var att du såg det som en morot med möjligheten att få kompetensutveckla sig, och det även ska vara en fördel vid rekrytering. Även om man kan komma att tappa någon eller några. Har det synsättet ändrats något?

– Visst man kan ju sitta och vara sur på att man tappar folk som man spenderar pengar på, men jag tror man måste tänka tvärtom. Om de lämnar oss så går de till bättre jobb och då har ju vi på något sätt lyckats bra genom att få ha dem under den tiden de varit hos oss?

– Finns det bättre jobb? 

– Tveksamt, haha. En del i IHM Säljakademi är att vi vill öka den positiva upplevelsen, kring hur man värderar sin säljkår. Säljarna ska tycka om att gå till jobbet och det ska vara meriterande på cv:t att ha jobbat på SIA Glass. Och det tror jag absolut att det gör. Namnet IHM bidrar ju också till det.

– Ser du att säljarna utvecklas jämnt eller ser du att något ligger efter?

– Ibland är det vissa som behöver extra stöd, i e-learningsystemet ser Anders Börjesson (IHM:s handledare red. anm.) om de ligger i fas med utbildningen. Där får han stöta på vissa mer än andra.

– Hur uppfattar de det?

– Jo de flesta upplever det bra, men i våras när vi hade en hög arbetsbelastning samtidigt som de skulle genomföra ett av de något svårare ekonomiblocken – kände man att det var tufft.
Jag träffade Anders tidigare i veckan och gick igenom upplägget inför 2017 och då bestämde vi att förstärka med ytterligare ett block som vi inte hade med i ursprungsplanen, där vi märkt att det finns ett utökat behov efter feedback från säljarna. Bland annat kommer vi splitta upp säljarna, där de får ekonomidelarna anpassade till just sina branschområden. 

– Så ni skruvar på säljakademin hela tiden?

– Ja det gör vi, Anders och jag stämmer löpande av vad vi kan göra bättre till nästa gång.

– IHM Säljakademi rent konkret är ett antal fysiska träffar och där emellan så har de tillgång till e-learningsystemet. Har de någon personlig coachning också?

– Ja det har de i form av Anders som dels följer upp dem digitalt och dels har telefonavstämningar med dem. De har uppgifter att göra inför varje block, och dessutom blir de första dagen tilldelade ett projektarbete som ska göras i grupp, och som också är en del av IHM Säljakademi. 

Exempelvis har en grupp fått uppgiften: ”År 2020 kommer 25 % av Sveriges befolkning att ha invandrarbakgrund, hur påverkar det glasskonsumtionen?” Projektgrupperna får en person i ledningsgruppen som de kan bolla frågor med, och sista dagen ska de presentera för hela ledningsgruppen vad de har kommit fram till. 

– Det är ju oerhört spännande!

– Ja det är det verkligen, och här kan de behöva lite extra stöttning och coachning i processen från Anders. 

– Ja, det är klart, eftersträvar man positionen som svensk gräddglass skyddsängel, så kanske man har väldigt fokus på traditionella smaker. Nu vet jag ju sen tidigare att ni redan tänjer på de gränserna.

– Ja det gör vi men vi måste kanske vidga vyerna ännu mer. Titta på smaker som man har i andra delar av världen. 

– Min frus nya favorit är blodgrape! Själv försöker jag hålla inne något på kolhydraterna…

– Ja blodgrape är grymt fin, och skulle du vilja synda rejält så är en kula blodgrape och en 4 snaps en bra kombo. Perfekt som en mellanrätt vid en flerrätters-middag.  

– Du spådde ju att storsäljaren för sommaren skulle vara kladdkaka blev det så? 

– Det blev det!

– Och popcorn?

– Den floppade tyvärr. Och det berodde på att vi inte riktigt lyckades med produkten, så den tog vi bort ur sortimentet.  Kladdkaka däremot, blev en oerhörd succé.

– Whiskeyglassen pratade du om sist, var det också en nyhet?

– Ja whiskeypinnen kom i fjol – den har till och med gått så bra så den blev restad under en period.

– Och rödbeta-peppar?

– Den har gått som förväntat. Vi gjorde en batch. Vi vet att den inte kommer bli en storsäljare men den har blivit en snackis. Den har dock en väldigt publik smak, så hade den haft ett mer publikt namn så hade den nog sålt bättre – vi konsumenter köper ju ibland baserat på namn. 

– Vad det någon som du inte hade räknat med som gick bra då?

– En av årets bästa femliters-nyheter blev ”Vrooom” med smak av de röda godis-ferraribilarna, den har gått lite bättre än vad jag trodde.

– Var det ett samarbete med godistillverkaren?

– Vi jobbar inte med co-branding men Toms var med i processen att ta fram smakpreferensen och sedan validera smaken.

 

 

– Och så fick ni priset ”Årets marknadsförare Halland 2016” grattis, vad händer i bolaget då?

– Tack, på kvällen firande vi med champagne, på måndag morgon blev det ett stort tack till marknadsavdelningen som tillsammans skapat detta. Vi kommer dubbla prispengen vi fick av IHM och dedikera beloppet helt till utbildning för marknadsavdelningen.

– Har ni fått mycket extern publicitet med anledning av detta?

– Ja vi har synts i Hallands Nyheter, IHM:s flöde, och pressreleasen har varit ute på många andra ställen, och vi har fått vara gästföreläsare vid ett par tillfällen. I och med utmärkelsen blir vi med automatik nominerade till årets marknadsförare Sverige 2017, vilket är fantastiskt kul och en ökad chans till publicitet.

– Halland är företagsintensiv del av landet med stor tillväxt. Vad får det för betydelse i rekryteringssammanhang att synas i media? 

– Vi är även med bland de nominerade till 100-wattaren*, där vinnaren koras nästa vecka så håll tummarna! Ju mer vi är i bruset ju populärare blir det att komma och jobba hos oss, så blir det ju. 

– Sedan vi tog avstampet 2014 och gjorde en repositionering där vi förändrade hela vår kommunikationsstrategi och bland annat gick in i tv-reklam så har det hänt mycket – både uppmärksamhet och publicitet och det har gett resultat det visar säljsiffrorna.

– Vi pratade senast om att ni har en utvecklingsavdelning med två personer som tog fram ca 80 nya smaker om året varav 20-30 kom ut på marknaden. Hur ser det ut nu?

– Det fortsätter i samma takt. I år däremot har vi investerat i en ny fabriksdel och en ny produktionslina som togs i bruk vid årsskiftet. Igångkörningsproblem tillhör vanligheterna, men vi har haft större problem än vad som kan anses normalt. Det har lett till stora produktionsstörningar där vi fått lägga mycket fokus på övertid, men ändå varit tvungna att resta en hel del varor i sommar. 

Så trots sommarens tillväxt på 10 % hade vi kanske legat på 12-13 % om vi inte behövt resta varor. Vi har ett otroligt stort goodwill hos våra kunder som vi nu fått äta av. Det innebär att vi måste vi hålla en ännu högre service- och leveransgrad nästa år för att arbeta upp det som vi tappat i år. Vi kommer nu rationalisera och minska sortimentet med 20 artiklar, och det gör vi för att kunna köra längre serier i produktionen, få en stabilare produktion och få en bättre leveransprecision inför nästa år. Lansering av 2017 års smaker är klara men 2018 kommer vi hålla igen även om vi säkert kommer kunna presentera en hel del nyheter även då. 

– Sist funderade vi om det finns äcklig glass, och du sa att du hade provat ölglass som du inte var så förtjust i har du testat något mer?

– Ja, i förra veckan testade vi ett gäng glassar som inte var gjorda på grädde utan istället hade malda cashewnötter, mandelmjölk eller soya som grund. Bland annat en glass som var gjort på stout och mörk choklad, gjord på cashewnötter – och den var riktigt bra! Så jag har hittat en ölglass som funkar! Ofta är inte smaken utan sammansättning som inte funkar. Det finns bra glass och mindre bra glass. Nu har jag hittat en ölglass som funkar men jag vet inte om vi kommer lansera den. Det är ett väldigt smalt segment. 

– Nu har ni ju klättrat i Göteborg som är Sveriges ölbälte, med flest mikrobryggerier i landet så det kanske finns en öppning där. På tal om mikrobryggerier hur ser glassbranschen ut? 

– Glassbranschen har många mikroproducenter, där nya tillkommer och den trenden verkar hålla i sig. I det stora hela är det positivt för hela branschen eftersom det hjälper till att lyfta glasskonsumtionen. Det hjälper också till att lyfta snittvärdet för glassens del eftersom deras glass ofta är dyrare än genomsnittet. 

– Restauranger tillverkar ju också egen glass, där tycker jag man ser spännande smaker som till exempel avocadoglass och pepparkaksglass som jag själv sett på menyn.

 – Det är fortfarande en stark trend att man för över andra kategorier t ex konfektyr, bageri eller snacks och implementerar de smakerna i glass som t ex pepparkaksglass.

– Vågar man avslöja redan nu nästa års nyheter?

– Nej det vågar man inte haha – det är strikt hemligt. Det avslöjas på vår kickoff strax efter årsskiftet. 

– Med tanke på uppgiften till projektarbetet som du nämnde tidigare så tippar jag att ni 2018 landar i någon lime-chili-koriander variant?

– Vem vet, vi får se. ;)

– Har du inte någon ny smak som jag inte har testat?

– Vänta, ska jag hämta vår nyhet som kom vecka 38: Hazlenut som ingår i vår finaste dessertglass-serie. Det är en lite finare glass, lite kompaktare, bättre råvaror. 

– Riktigt krämig och fin! Verkligen en fin glass till jul! Vi får nog avsluta intervjun här, tack!

– Tack själv och välkommen åter!

*Efter intervjun tog SIA Glass hem priset ”50W Konsument - Strategisk design: SIA Dessertglass. Juryns motivering: "En produkt som med en re-design inte bara starkt ökar sin egen försäljning, utan även bidrar till att kategorin växer, är imponerande. Att sen den kreativa idén med att bryta kategorikoderna med en strategiskt vald färg var lika enkel som smart, ger SIA:s premiumglass årets 50-wattare." http://100wattaren.se/vinnarna

Er man vid glassdisken

Aludd

20 december 2016
Läs mer om IHM Sales Performance B2B här!
Accelerera digitaliseringen av er affär med IHM!
Allt vi gör i öppna program kan anpassas till ditt företag.
MTA Bygg & Anläggning fick utmärkelsen av organisationen Great Place to Work