A new Dynamics AX partner

Nic. Christiansen Gruppen imports Land Rover and Jaguar in Denmark, Sweden and Norway as well as Hyundai in Denmark. During the implementation of Dynamics AX, Nic. Christiansen experienced that 9altitudes solved the most complex tasks

Together with their regular 9altitudes consultants, the collaboration has grown. Nic. Christiansen believes they are working with qualified consultants who offer business understanding - and honesty.

”An AX-partner you can always trust – because they are open and honest in everything they do”

Nic. Christiansen's benefits from the collaboration

Error executing template "Designs/Swift/Paragraph/Swift_Feature.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_54c0bac7ed5e4910ab954493bda733a2.ExecuteAsync()
   at RazorEngine.Templating.TemplateBase.Run(ExecuteContext context, TextWriter reader)
   at RazorEngine.Templating.RazorEngineCore.RunTemplate(ICompiledTemplate template, TextWriter writer, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.DynamicWrapperService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass23_0.<Run>b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag)
   at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
   at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.ParagraphViewModel> 2 @using System.IO 3 4 @functions 5 { 6 private string RenderCustomCSS(IEnumerable<string> decorations) 7 { 8 var cssClasses = new List<string>(); 9 10 foreach (var itemId in decorations) 11 { 12 var item = Dynamicweb.Content.Services.Items.GetItem("Swift_Css", itemId); 13 item.TryGetValue("Class", out object classes); 14 15 if (classes is null) 16 { 17 continue; 18 } 19 20 var cssString = (string)classes; 21 22 if (cssString.StartsWith("[")) 23 { 24 var cssArray = Dynamicweb.Core.Converter.Deserialize<string[]>(cssString); 25 cssClasses.AddRange(cssArray); 26 } 27 else 28 { 29 cssClasses.Add(cssString.Replace(",", " ")); 30 } 31 } 32 33 return string.Join(" ", cssClasses).Trim(); 34 } 35 } 36 37 @{ 38 string layout = Model.Item.GetRawValueString("Layout", "icon-top"); 39 string contentPadding = Model.Item.GetRawValueString("ContentPadding", string.Empty); 40 contentPadding = contentPadding == "none" ? "" : contentPadding; 41 contentPadding = contentPadding == "small" ? "p-3 p-md-3" : contentPadding; 42 contentPadding = contentPadding == "large" ? "p-5 p-md-5" : contentPadding; 43 string theme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("Theme")) ? " theme " + Model.Item.GetRawValueString("Theme").Replace(" ", "").Trim().ToLower() : string.Empty; 44 var decorations = Model.Item?.GetList("CssDecorations")?.GetRawValue().OfType<string>() ?? Enumerable.Empty<string>(); 45 string css = RenderCustomCSS(decorations); 46 47 string target = Pageview.AreaSettings.GetBoolean("OpenLinksInNewTab") && Model.Item.GetString("Link").Contains("http") ? "target=\"_blank\"" : string.Empty; 48 string rel = Pageview.AreaSettings.GetBoolean("OpenLinksInNewTab") && Model.Item.GetString("Link").Contains("http") ? "rel=\"noopener\"" : string.Empty; 49 string alignment = (!string.IsNullOrEmpty(Model.Item.GetString("Title")) && !Model.Item.GetBoolean("HideTitle")) && !string.IsNullOrEmpty(Model.Item.GetString("Text")) ? "align-items-stretch" : "align-items-center"; 50 51 string iconColor = Model.Item.GetString("iconColor", "text-inherit"); 52 string iconOpacity = Model.Item.GetString("IconOpacity", "opacity-100"); 53 54 string iconSize = Model.Item.GetRawValueString("IconSize", "2"); 55 string imageSrc = !string.IsNullOrEmpty(Model.Item.GetString("Image")) ? Model.Item.GetFile("Image").Path : string.Empty; 56 string flexGrowClass = string.Empty; 57 58 switch (layout) 59 { 60 case "icon-left": 61 case "icon-right": 62 flexGrowClass = "flex-grow-0"; 63 break; 64 } 65 66 string imagePath = imageSrc != string.Empty ? imageSrc : Model.Item.GetRawValueString("Icon", string.Empty); 67 imagePath = Path.GetExtension(imagePath).ToLower() != ".svg" ? "/Admin/Public/GetImage.ashx?image=" + imagePath + "&height=" + iconSize + "&width=" + iconSize + "&Crop=0&format=webp" : imagePath; 68 string imgAltText = Model.Item.GetRawValueString("FeatureAltText", string.Empty); 69 70 string titleFontSize = Model.Item.GetRawValueString("TitleFontSize", "h4"); 71 string titleColor = Model.Item.GetString("TitleColor", "text-inherit"); 72 string titleOpacity = Model.Item.GetString("TitleOpacity", "opacity-100"); 73 string headingLevel = Model.Item.GetString("HeadingLevel", "h2"); 74 string headingLevelStart = $"<{headingLevel} class=\"{titleFontSize} {titleColor} {titleOpacity} m-0\">"; 75 string headingLevelStop = $"</{headingLevel}>"; 76 77 string textColor = Model.Item.GetString("TextColor", "text-inherit"); 78 string textOpacity = Model.Item.GetString("TextOpacity", "opacity-100"); 79 } 80 81 <div class="h-100 @(contentPadding)@(theme) @(css) item_@Model.Item.SystemName.ToLower()"> 82 <div id="@Model.ID" class="user-select-none" style="scroll-margin-top:var(--header-height,150px)"></div> 83 @if (!string.IsNullOrEmpty(Model.Item.GetString("Link"))) 84 { 85 @:<a href="@Model.Item.GetString("Link")" class="text-decoration-none d-block h-100" @target @rel> 86 } 87 88 @switch (layout) 89 { 90 case "icon-top": 91 <div class="d-flex flex-column gap-3 text-center mb-0-last-child"> 92 @if (!string.IsNullOrEmpty(Model.Item.GetString("Image")) || !imagePath.ToLower().Contains("none") && imagePath != string.Empty) 93 {<div class="@flexGrowClass"> 94 @if (Path.GetExtension(imagePath).ToLower() == ".svg") 95 { 96 <div class="icon-auto @iconColor @iconOpacity" style="height: @(iconSize)px; width: @(iconSize)px;">@ReadFile(imagePath)</div> 97 } 98 else 99 { 100 <img loading="lazy" src="@imagePath" alt="@imgAltText" title="@Model.Item.GetString("Title")" style="height: @(iconSize)px; width: @(iconSize)px;"> 101 } 102 </div> 103 } 104 105 @if (!string.IsNullOrEmpty(Model.Item.GetString("Title")) && !Model.Item.GetBoolean("HideTitle") || !string.IsNullOrEmpty(Model.Item.GetString("Text"))) 106 { 107 <div class="mb-0-last-child"> 108 @if (!string.IsNullOrEmpty(Model.Item.GetString("Title")) && !Model.Item.GetBoolean("HideTitle")) 109 { 110 @headingLevelStart 111 @Model.Item.GetString("Title") 112 @headingLevelStop 113 } 114 115 @if (!string.IsNullOrEmpty(Model.Item.GetString("Text"))) 116 { 117 <p class="@textColor @textOpacity m-0">@Model.Item.GetString("Text")</p> 118 } 119 </div> 120 } 121 </div> 122 break; 123 case "icon-left": 124 <div class="d-flex flex-row gap-3 h-100 text-start @alignment"> 125 @if (!string.IsNullOrEmpty(Model.Item.GetString("Image")) || !imagePath.ToLower().Contains("none") && imagePath != string.Empty) 126 {<div class="@flexGrowClass"> 127 @if (Path.GetExtension(imagePath).ToLower() == ".svg") 128 { 129 <div class="icon-auto @iconColor @iconOpacity" style="height: @(iconSize)px; width: @(iconSize)px;">@ReadFile(imagePath)</div> 130 } 131 else 132 { 133 <img loading="lazy" src="@imagePath" alt="@imgAltText" title="@Model.Item.GetString("Title")" style="height: @(iconSize)px; width: @(iconSize)px;"> 134 } 135 </div> 136 } 137 138 @if (!string.IsNullOrEmpty(Model.Item.GetString("Title")) && !Model.Item.GetBoolean("HideTitle") || !string.IsNullOrEmpty(Model.Item.GetString("Text"))) 139 { 140 <div class="d-flex flex-column flex-grow-1"> 141 @if (!string.IsNullOrEmpty(Model.Item.GetString("Title")) && !Model.Item.GetBoolean("HideTitle")) 142 { 143 @headingLevelStart 144 @Model.Item.GetString("Title") 145 @headingLevelStop 146 } 147 148 @if (!string.IsNullOrEmpty(Model.Item.GetString("Text"))) 149 { 150 <p class="@textColor @textOpacity m-0">@Model.Item.GetString("Text")</p> 151 } 152 </div> 153 } 154 155 </div> 156 break; 157 case "icon-right": 158 <div class="d-flex flex-row gap-3 h-100 text-end @alignment"> 159 @if (!string.IsNullOrEmpty(Model.Item.GetString("Title")) && !Model.Item.GetBoolean("HideTitle") || !string.IsNullOrEmpty(Model.Item.GetString("Text"))) 160 { 161 <div class="d-flex flex-column flex-grow-1"> 162 @if (!string.IsNullOrEmpty(Model.Item.GetString("Title")) && !Model.Item.GetBoolean("HideTitle")) 163 { 164 @headingLevelStart 165 @Model.Item.GetString("Title") 166 @headingLevelStop 167 } 168 169 @if (!string.IsNullOrEmpty(Model.Item.GetString("Text"))) 170 { 171 <p class="@textColor @textOpacity m-0">@Model.Item.GetString("Text")</p> 172 } 173 </div> 174 } 175 176 @if (!string.IsNullOrEmpty(Model.Item.GetString("Image")) || !imagePath.ToLower().Contains("none") && imagePath != string.Empty) 177 {<div class="@flexGrowClass"> 178 @if (Path.GetExtension(imagePath).ToLower() == ".svg") 179 { 180 <div class="icon-auto @iconColor @iconOpacity" style="height: @(iconSize)px; width: @(iconSize)px;">@ReadFile(imagePath)</div> 181 } 182 else 183 { 184 <img loading="lazy" src="@imagePath" alt="@imgAltText" title="@Model.Item.GetString("Title")" style="height: @(iconSize)px; width: @(iconSize)px;"> 185 } 186 </div> 187 } 188 </div> 189 break; 190 } 191 192 @if (!string.IsNullOrEmpty(Model.Item.GetString("Link"))) 193 { 194 @:</a> 195 } 196 </div> 197

The solution supports the business

Strong collaboration with dedicated consultants

Strategic partner - not just a supplier

When Nic. Christiansen implemented Dynamics AX, 9altitudes was involved at the end of the process. 9altitudes was given specific tasks, which were solved successfully. Today, 9altitudes is their preferred Dynamics AX partner.
In the initial collaboration, Nic. Christiansen realised that 9altitudes is a consulting company that has quality employees and stands for an open, flexible and yet well-structured collaboration.

‘9altitudes has proven to be able to handle tasks that are relatively complex. They do quality work. You can't underestimate their approach and their consultants.

A business-driven collaboration

9altitudes' handling of the automotive group's tasks is, to a large extent, business-driven.

‘They familiarise themselves with our business and try to find an existing solution. If a standard solution doesn't work, they are good at describing and developing what we want and need.’

Nic. Christiansen also appreciates the flexibility of the collaboration - if things get busy, 9altitudes will provide more people to meet deadlines.

Open honesty - the path to strong collaboration

At Nic. Christiansen, they experience openness and honesty in their co-operation.
‘We have honest communication. If there's a problem, we don't feel like it's being hidden. Even though the truth can hurt, honesty is far more important. We find a solution every time.’

A number of 9altitudes' consultants are permanent members of Nic. Christiansen's complex organisational culture, so they don't bring in new consultants in the middle of a process.

Services and solutions used

About Nic. Christiansen Gruppen

Nic. Christiansen Group was founded in 1967 with the import of BMW to Denmark. Today, the group operates in Denmark, Germany, Finland and the Baltics and employs over 1,200 people. The company's main activities include import and distribution of car brands such as Hyundai, BYD, Honda, Land Rover and Jaguar.

The group has a clear ambition to actively contribute to the future of transport and mobility and strives to develop itself, its employees and the industry as a whole.

Get in touch

Digital business transformation is what we do. Making sure organizations are ready to deliver for the end customer of today and those of tomorrow. Thanks to our industry expertise, we are able to combine speed and quality into your digital transformation journey.