- More than 20 years experience
- Complete assessments
- No agency fees
Error executing template "Designs/ClientBase_generated/Paragraph/JumbotronContainer.cshtml" System.Data.SqlClient.SqlException (0x80131904): Violation of PRIMARY KEY constraint 'PK__ItemType__3214EC07EAC40CA3'. Cannot insert duplicate key in object 'dbo.ItemType_JumbotronConfiguration'. The duplicate key value is (154784). The statement has been terminated. at System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount) at System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount) at System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping) at System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping) at System.Data.Common.DbDataAdapter.Update(DataSet dataSet, String srcTable) at Dynamicweb.Content.Items.Queries.Repository.Update(IEnumerable`1 items, ItemContext context, Boolean synchronizePages) at Dynamicweb.Content.Items.Queries.Repository.Update(ItemEntry item, ItemContext context) at Dynamicweb.Content.Items.ItemEntry.Save(ItemContext context) at Bluedesk.DynamicWeb.ItemTypes.Configuration.JumbotronConfiguration.GetJumbotronStylesheet() at CompiledRazorTemplates.Dynamic.RazorEngine_6a7a84173e0c4a7aa4bf0f44fb90ea57.Execute() in D:\dynamicweb.net\Solutions\Bluedesk\worldemp.cloud.dynamicweb-cms.com\files\Templates\Designs\ClientBase_generated\Paragraph\JumbotronContainer.cshtml:line 276 at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader) at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer) at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter) at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template) at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template) at Dynamicweb.Rendering.Template.RenderRazorTemplate() ClientConnectionId:ce4f18cc-3da9-417d-a8bf-737acd256995 Error Number:2627,State:1,Class:14
1 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 2 @using Dynamicweb; 3 @using Dynamicweb.Content.Items; 4 @using Dynamicweb.Content.Items.Metadata; 5 @using Bluedesk.DynamicWeb.ItemTypes; 6 @using Bluedesk.DynamicWeb.ItemTypes.Settings; 7 8 9 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 10 @using Dynamicweb; 11 @using Dynamicweb.Content.Items; 12 @using Bluedesk.DynamicWeb.ItemTypes; 13 @using Bluedesk.DynamicWeb.ItemTypes.Extensions; 14 @using Bluedesk.DynamicWeb.ItemTypes.Configuration; 15 @using Bluedesk.DynamicWeb.ItemTypes.Settings.Configuration; 16 @using Dynamicweb; 17 @using Dynamicweb.Frontend 18 @using Bluedesk.DynamicWeb.ItemTypes.BaseSolution; 19 20 @helper RenderButton(CTAButton button, PageView Pageview) 21 { 22 23 if (!string.IsNullOrWhiteSpace(button.GetLink(Pageview))) 24 { 25 string Template = button.GetButtonTemplate().Replace("{{ ButtonLink }}", button.GetLink(Pageview)); 26 @Template; 27 } 28 } 29 30 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 31 @using Dynamicweb; 32 @using Dynamicweb.Content.Items; 33 @using Bluedesk.DynamicWeb.ItemTypes; 34 35 @functions { 36 37 Dictionary<string, string> GetFontConfiguration(string TextColor, FontConfigurationItemTab FontConfiguration) 38 { 39 var colorService = new ColorSwatchService(); 40 TextColor = !string.IsNullOrWhiteSpace(TextColor) ? TextColor : "" ; 41 TextColor = !TextColor.Contains("#") ? colorService.GetHexColor(Pageview.AreaID, TextColor) : TextColor; 42 Dictionary<string, string> FontConfig = new Dictionary<string, string>() { 43 { "textColor" , TextColor }, 44 { "fontSize" , FontConfiguration.FontSize }, 45 { "lineHeight", FontConfiguration.LineHeight}, 46 { "fontFamily" , FontConfiguration.FontConfiguration.FontFamily }, 47 { "fontWeight" , FontConfiguration.FontWeight }, 48 { "fontStyle" , FontConfiguration.FontStyle } 49 }; 50 return FontConfig; 51 } 52 53 public string GenerateButtonConfigVariables(ButtonConfiguration BC, MasterConfig mc, int areaId) 54 { 55 string ButtonLabelAlignment = BC.ButtonLabelAlignment; 56 switch (ButtonLabelAlignment) 57 { 58 case "align-left": 59 ButtonLabelAlignment = "flex-start"; 60 break; 61 case "align-center": 62 ButtonLabelAlignment = "center"; 63 break; 64 case "align-right": 65 ButtonLabelAlignment = "flex-end"; 66 break; 67 case "align-full": 68 ButtonLabelAlignment = "space-between"; 69 break; 70 default: 71 ButtonLabelAlignment = "flex-start"; 72 break; 73 } 74 75 var btnStyleBlock = new System.Text.StringBuilder(); 76 77 // General Config 78 btnStyleBlock.Append(GenerateCssVar("btn-min-height", $"{mc.GeneralConfiguration.ButtonHeight}px")); 79 btnStyleBlock.Append(GenerateCssVar("btn-border-radius", $"{mc.GeneralConfiguration.RoundedCornerValue}px")); 80 81 // Button Config 82 btnStyleBlock.Append(GenerateCssVar("btn-border-width", $"{BC.BorderSize.ToString()}px")); 83 btnStyleBlock.Append(GenerateCssVar("btn-label-alignment", ButtonLabelAlignment)); 84 85 // Button Config Tab 86 btnStyleBlock.Append(GenerateCssVar("btn-bg-color", BC.ButtonColorConfiguration.BackgroundColor.GetColorCode(areaId))); 87 btnStyleBlock.Append(GenerateCssVar("btn-font-color", BC.ButtonColorConfiguration.FontColor.GetColorCode(areaId))); 88 btnStyleBlock.Append(GenerateCssVar("btn-border-color", BC.ButtonColorConfiguration.BorderColor.GetColorCode(areaId))); 89 90 // Button Config Hover tab 91 btnStyleBlock.Append(GenerateCssVar("btn-bg-color-hover", BC.ButtonHoverColorConfiguration.BackgroundColor.GetColorCode(areaId))); 92 btnStyleBlock.Append(GenerateCssVar("btn-font-color-hover", BC.ButtonHoverColorConfiguration.FontColor.GetColorCode(areaId))); 93 btnStyleBlock.Append(GenerateCssVar("btn-border-color-hover", BC.ButtonHoverColorConfiguration.BorderColor.GetColorCode(areaId))); 94 95 // Button Config Font Config 96 btnStyleBlock.Append(GenerateCssVar("btn-font-size", BC.FontConfiguration.FontSize)); 97 btnStyleBlock.Append(GenerateCssVar("btn-font-config-color", BC.FontConfiguration.Color.GetColorCode(areaId))); 98 btnStyleBlock.Append(GenerateCssVar("btn-font-line-height", BC.FontConfiguration.LineHeight)); 99 btnStyleBlock.Append(GenerateCssVar("btn-font-family", BC.FontConfiguration.FontConfiguration.FontFamily)); 100 btnStyleBlock.Append(GenerateCssVar("btn-font-weight", BC.FontConfiguration.FontWeight)); 101 btnStyleBlock.Append(GenerateCssVar("btn-font-transform", BC.FontConfiguration.FontStyle)); 102 103 return btnStyleBlock.ToString(); 104 } 105 106 public string GenerateCssVar(string name, string value) 107 { 108 if (!string.IsNullOrWhiteSpace(value)) { 109 return $"--{name}: {value};"; 110 } else { 111 return ""; 112 } 113 } 114 } 115 116 117 @{ 118 119 JumbotronContainer _data = Dynamicweb.Content.Services.Items.GetItem("JumbotronContainer", Pageview.CurrentParagraph.ItemId).ToCodeFirstItem<JumbotronContainer>() ?? new JumbotronContainer(); 120 121 var colorService = new ColorSwatchService(); 122 123 string backgroundClass = !string.IsNullOrWhiteSpace(_data.JumbotronConfiguration.BackgroundClass) ? string.Format("bg-{0}", _data.JumbotronConfiguration.BackgroundClass) : ""; 124 string JumbotronHeight = _data.JumbotronHeight + "px"; 125 126 string BackgroundHorizontalPosition = ""; 127 string BackgroundVerticalPosition = ""; 128 129 string QuickmenuWidth = _data.QuickmenuWidth + "px"; 130 int JumbotronListCount = _data.JumbotronList.Count; 131 132 string JumbotronCarouselClass = JumbotronListCount != 1 ? "jumbotron__carousel" : "jumbotron__no-carousel"; 133 string JumbotronCarouselMobClass = JumbotronListCount != 1 ? "jumbotron__carousel-mob" : "jumbotron__no-carousel-mob"; 134 135 var paragraphID = Pageview.CurrentParagraph.ID; 136 var JumbotronBackgroundClassName = ""; 137 138 string ShoutboxBackgroundColor = _data.JumbotronConfiguration.ShoutboxBackgroundColor; 139 string ShoutBoxGradient = _data.JumbotronConfiguration.ShoutboxBackgroundGradient; 140 141 string ShoutboxBackgroundImage = _data.JumbotronConfiguration.ShoutboxBackgroundImage; 142 143 string QuickmenuBackgoundImage = _data.JumbotronConfiguration.QuickmenuBackgroundImage; 144 145 ShoutboxBackgroundColor = colorService.GetHexColor(Pageview.AreaID, ShoutboxBackgroundColor); 146 147 bool infiniteLoop = _data.Infinite; 148 bool autoPlay = _data.AutoPlay; 149 bool controls = _data.AddControls; 150 int duration = _data.Duration; 151 bool showDots = _data.ShowDots; // If slider or multicolumn has to be in container or full widthof the page 152 153 } 154 155 <!-- 156 ***************************** 157 **** BEGIN DESKTOP SETUP **** 158 ***************************** 159 --> 160 161 <section class="jumbotron__playground jumbotron-mask jumbotron__playground-@paragraphID jumbotron--desktop jumboConfig--@_data.JumbotronConfigurationID @_data.CssClass @backgroundClass"> 162 163 <section class="@JumbotronCarouselClass" 164 data-dots="@showDots" 165 data-loop="@infiniteLoop" 166 data-autoplay="@autoPlay" 167 data-controls="@controls" 168 data-duration="@duration" 169 > 170 171 @foreach (var _item in _data.JumbotronList) 172 { 173 174 BackgroundHorizontalPosition = _item.BackgroundHorizontalPosition; 175 BackgroundVerticalPosition = _item.BackgroundVerticalPosition != "center" ? _item.BackgroundVerticalPosition : "middle"; 176 JumbotronBackgroundClassName = "jumbotron__image_background_" + paragraphID + "_" + _item.Id; 177 string jumbotronImage = _item.Image.Image.Replace("?x","&x"); 178 <div class="jumbotron @_item.CssClass" id="@_item.Id"> 179 180 <style> 181 182 @@media screen and (min-width: 994px) { 183 .@JumbotronBackgroundClassName { 184 background-image: url('/Admin/Public/GetImage.ashx?Image=@jumbotronImage&Crop=7&Format=webp&Width=1200&height=@_data.JumbotronHeight&Quality=-1&Compression=100'); 185 } 186 } 187 188 @@media screen and (min-width: 1200px) { 189 .@JumbotronBackgroundClassName { 190 background-image: url('/Admin/Public/GetImage.ashx?Image=@jumbotronImage&Crop=7&Format=webp&Width=2000&height=@_data.JumbotronHeight&Quality=-1&Compression=100'); 191 } 192 } 193 194 </style> 195 196 <figure class="jumbotron__image rellaxOff @BackgroundHorizontalPosition @BackgroundVerticalPosition @JumbotronBackgroundClassName"></figure> 197 198 @RenderShoutbox(_data, _item) 199 </div> 200 } 201 202 </section> 203 204 <!-- BEGIN QUICKMENU --> 205 206 @RenderQuickmenu(_data) 207 208 <!-- END QUICKMENU --> 209 210 <div class="jumbotron__shaper-container"><!--// 211 <svg width="100%" height="500" viewBox="0 0 1600 600" preserveAspectRatio="none"> 212 <defs> 213 <style> 214 .cls-1 { 215 fill: #cccccb; 216 } 217 218 .cls-2 { 219 fill: #fff; 220 opacity: 0.2; 221 } 222 223 </style> 224 </defs> 225 <title></title> 226 <path class="jumbotron__shaper-homepage" d="M2.59,495,237,553l122-48,132,54,360,16,262-48,176-90,154,120,112,12,206-102,159.79,65v71H1.56S1.31,493.72,2.59,495Z" /> 227 <polygon class="cls-2" points="359 505 317 599 491 559 359 505" /> 228 <polygon class="cls-2" points="1289 437 1443 557 1177 601 1289 437" /> 229 <polygon class="cls-2" points="1761 467 1696.44 604.28 1920.8 603 1920.8 532.03 1761 467" /> 230 </svg> 231 <svg width="100%" height="600" viewBox="0 0 2000 600" preserveAspectRatio="none"> 232 <clipPath id="myClip"> 233 <path class="cls-1" d="M1999.57,425c-123.24,53.94-329.82,96.6-581.35,119.35q33.6-6.59,65.7-14.19c104.82-24.86,197.33-58,276-98.78,21.37-11.08,49.25-53.51,49.25-53.51C1609,504.41,1328.64,545.78,1128.7,558.21c-31.7,2-62.42,3.29-91.8,4.12q-18.23.13-36.6.13c-81.34,0-160.65-1.95-237.08-5.65-16.15-1.19-25.6-1.31-25.6-1.31C416.39,538.15,148.8,489.67,1,425H.3V600h2000V425Z"></path> 234 </clipPath> 235 </svg> 236 //--> 237 238 <!--// 239 <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" height="0" width="0" viewBox="0 0 2000 600" preserveAspectRatio=""> 240 <clipPath id="myClip"> 241 <path class="st0" d="M0,0v325h0.2C37.1,389.7,104,438.2,184.3,455.5c0,0,2.4,0.1,6.4,1.3c19.1,3.7,38.9,5.7,59.3,5.7 242 c3.1,0,6.1,0,9.2-0.1c7.3-0.8,15-2.1,23-4.1c50-12.4,120.1-53.8,170.1-180.3c0,0-7,42.4-12.3,53.5c-19.7,40.8-42.8,73.9-69,98.8 243 c-5.4,5.1-10.8,9.8-16.4,14.2C417.4,421.6,469,378.9,499.8,325h0.2V0H0z" /> 244 </clipPath> 245 </svg> 246 //--> 247 248 <!--<img src="https://images.unsplash.com/photo-1592006256125-1e7622ead3b0?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjE0NTg5fQ" alt="Photographer in a market." height="1000" width="1000" /> 249 <svg width="0" height="0"> 250 <clipPath id="svgClip" clipPathUnits="objectBoundingBox"> 251 <path d="M0.75815095, 0.0579477769 C0.879893708, 0.187288937 0.902165272, 0.677587654 0.799370955, 0.785996249 C0.627963035, 0.966765889 0.26163708, 0.91434951 0.111342491,0.755791573 C-0.0332137967,0.603287436 -0.035795248,0.382887577 0.0965066612,0.173955315 C0.200239457,0.0101396315 0.648923894,-0.0580965318 0.75815095,0.0579477769 Z"></path> 252 </clipPath> 253 </svg> 254 <style> 255 .jumbotron-mask { 256 clip-path: url(#svgClip); 257 width: 18em; 258 height: 18em; 259 object-fit: cover; 260 display: block; 261 margin-right: auto; 262 margin-left: auto; 263 } 264 </style>--> 265 </div> 266 267 </section> 268 269 <!-- 270 *************************** 271 **** END DESKTOP SETUP **** 272 *************************** 273 --> 274 275 <style> 276 @_data.JumbotronConfiguration.GetJumbotronStylesheet() 277 </style> 278 279 <!-- 280 **************************** 281 **** BEGIN MOBILE SETUP **** 282 **************************** 283 --> 284 285 <section class="jumbotron__playground jumbotron__playground-@paragraphID jumbotron--mobile @_data.CssClass"> 286 287 <section class="@JumbotronCarouselMobClass" 288 data-dots="@showDots" 289 data-loop="@infiniteLoop" 290 data-autoplay="@autoPlay" 291 data-controls="@controls" 292 data-duration="@duration" 293 > 294 @{ int mobIndex = 0; } 295 @foreach (var _item in _data.JumbotronList) 296 { 297 298 BackgroundHorizontalPosition = _item.BackgroundHorizontalPosition; 299 BackgroundVerticalPosition = _item.BackgroundVerticalPosition != "center" ? _item.BackgroundVerticalPosition : "middle"; 300 string lazyLoad = mobIndex > 0 ? "loading='lazy'" : ""; 301 string jumbotronImage = _item.Image.Image.Replace("?x","&x"); 302 <div class="jumbotron @_item.CssClass"> 303 304 <!-- BEGIN IMAGE --> 305 306 <figure class="jumbotron__image-container"> 307 <picture class="jumbotron__image w-full h-full"> 308 <source media="(max-width: 400px)" srcset="/Admin/Public/GetImage.ashx?Image=@jumbotronImage&Crop=7&Format=webp&Quality=-1&Width=400&Compression=90"> 309 <source media="(max-width: 500px)" srcset="/Admin/Public/GetImage.ashx?Image=@jumbotronImage&Crop=7&Format=webp&Quality=-1&Width=500&Compression=90"> 310 <source media="(max-width: 600px)" srcset="/Admin/Public/GetImage.ashx?Image=@jumbotronImage&Crop=7&Format=webp&Quality=-1&Width=600&Compression=90"> 311 <source media="(max-width: 700px)" srcset="/Admin/Public/GetImage.ashx?Image=@jumbotronImage&Crop=7&Format=webp&Quality=-1&Width=700&Compression=90"> 312 <source media="(max-width: 994px)" srcset="/Admin/Public/GetImage.ashx?Image=@jumbotronImage&Crop=7&Format=webp&Quality=-1&Width=994&Compression=90"> 313 <img src="/Admin/Public/GetImage.ashx?Image=@jumbotronImage&Crop=7&Format=webp&Width=400&Quality=-1&Compression=90" width="1980" height="500" alt="@_item.Image.ImageAlt" @lazyLoad /> 314 </picture> 315 </figure> 316 317 <!-- END IMAGE --> 318 <!-- BEGIN SHOUTBOX --> 319 320 @RenderShoutbox(_data, _item) 321 322 <!-- END SHOUTBOX --> 323 </div> 324 mobIndex++; 325 } 326 327 </section> 328 329 <!-- BEGIN QUICKMENU --> 330 331 @RenderQuickmenu(_data) 332 333 <!-- END QUICKMENU --> 334 335 </section> 336 337 <!-- 338 ************************ 339 *** END MOBILE SETUP *** 340 ************************ 341 --> 342 343 <style> 344 .jumbotron__playground, 345 .jumbotron { 346 height: auto; 347 } 348 349 @@media screen and (min-width: 991px){ 350 .jumbotron__playground-@paragraphID .jumbotron__carousel, 351 .jumbotron__playground-@paragraphID .jumbotron { 352 height: @JumbotronHeight; 353 overflow: hidden; 354 } 355 356 .jumbotron__playground-@paragraphID .jumbotron__container { 357 width: 100%; 358 } 359 360 .jumbotron__playground-@paragraphID .quickmenu { 361 width: @QuickmenuWidth; 362 } 363 364 .jumbotron__playground-@paragraphID .jumbotron__no-carousel, 365 .jumbotron__playground-@paragraphID .jumbotron__carousel { 366 width: calc(100% - @QuickmenuWidth); 367 368 } 369 370 .jumbotron__playground-@paragraphID .jumbotron__shoutbox { 371 background-color: @ShoutboxBackgroundColor; 372 @if (!string.IsNullOrWhiteSpace(ShoutBoxGradient)) { 373 374 <text> @ShoutBoxGradient </text> 375 376 } 377 @if (!string.IsNullOrWhiteSpace(ShoutboxBackgroundImage)) { 378 379 <text> 380 background-image: url('@ShoutboxBackgroundImage'); 381 </text> 382 383 } 384 } 385 386 .jumbotron__playground-@paragraphID .quickmenu { 387 @if (!string.IsNullOrWhiteSpace(QuickmenuBackgoundImage)) { 388 389 <text> 390 background-image: url('@QuickmenuBackgoundImage'); 391 </text> 392 393 } 394 } 395 396 397 } 398 </style> 399 400 @helper RenderShoutbox(JumbotronContainer _data, JumbotronListItem _item) 401 { 402 string ShoutboxFullHeightClass = _data.ShoutboxFullHeight ? "fullheight" : ""; 403 string ShoutboxBackgroundTransparentClass = _data.ShoutboxBackgroundTransparent ? "transparent" : ""; 404 405 string ShoutboxHorizontalPositionClass = _data.ShoutboxHorizontalPosition; 406 string ShoutboxVerticalPositionClass = _data.ShoutboxVerticalPosition != "center" ? @_data.ShoutboxVerticalPosition : "middle"; 407 408 <section class="jumbotron__container container @ShoutboxHorizontalPositionClass @ShoutboxVerticalPositionClass "> 409 410 @if (_item.HasShoutbox) 411 { 412 <div class="jumbotron__shoutbox @ShoutboxBackgroundTransparentClass @ShoutboxFullHeightClass"> 413 <section class="jumbotron__shoutbox-header"> 414 415 @_item.SubHeader.HeaderFormatted("jumbotron__subheading") 416 @_item.Header.HeaderFormatted("jumbotron__heading") 417 418 @if (!string.IsNullOrWhiteSpace(_item.Content.Text)) 419 { 420 <div class="jumbotron__shoutbox-intro">@_item.Content.Text</div> 421 } 422 423 @RenderButton(_item.Button, Pageview) 424 425 </section> 426 </div> 427 } 428 </section> 429 } 430 431 @helper RenderQuickmenu(JumbotronContainer _data) 432 { 433 int quickmenuWidth = _data.QuickmenuWidth; 434 435 if (quickmenuWidth > 0) 436 { 437 <div class="quickmenu"> 438 <h2 class="quickmenu__header">@_data.QuickmenuHeader</h2> 439 <nav class="quickmenu__list"> 440 @foreach (var _link in _data.QuickmenuLinks) 441 { 442 var highlightedClass = _link.Highlighted ? "highlighted" : ""; 443 var targetLink = _link.NewWindow ? "target='_blank'" : ""; 444 445 <a href="@_link.Link" class="quickmenu__link @highlightedClass" @targetLink> @_link.Name </a> 446 } 447 </nav> 448 </div> 449 } 450 } 451
Energietransitie onder druk. Hoe blijf jij voorop lopen?
Energietransitie vraagt om slagkracht
Zonneparken, windparken onshore en offshore, BESS en elektrificatieprojecten stapelen zich op. Projectontwikkelaars, energiebedrijven, netbeheerders, EPC(M)-partijen en exploitanten van microgrids en laadinfra moeten meer projecten parallel draaien. Tegelijk worden gridstudies, kabelroutes, stationsontwerpen, selectiviteits- en kabelberekeningen complexer. Je kernteam is druk met strategische keuzes en stakeholdermanagement, maar verzuipt in tekenwerk, berekeningen, documentatie en compliance-eisen van DSO’s en TSO’s.
Tekort aan power engineers remt de energietransitie
De markt kampt met een structureel tekort aan ervaren electrical en power engineers, grid specialisten, designers en dataspecialisten. Daardoor lopen engineeringtrajecten uit, verschuiven bouwseizoenen en neemt het risico toe dat je grid connection of financiering vertraging oploopt. Incomplete dossiers zorgen voor herwerk op site en lastige audits. De druk op CAPEX en OPEX laat weinig ruimte voor inefficiënte processen of steeds nieuwe tijdelijke inhuur. Jij hebt een stabiele, schaalbare capaciteitsoplossing nodig naast je kernteam.
WorldEmp heeft de oplossing voor het tekort
Waar loop jij vandaag op vast
De dagelijkse realiteit in jouw projecten
Door de groei van je zonne, wind en BESS-portfolio schuift er steeds meer technisch werk jouw organisatie in. Maar je team is dun bemand en de markt voor specialisten is krap. Je moet keuzes maken welke projecten voorrang krijgen, terwijl tenders, gridstudies, vergunningen en FID’s gewoon doorlopen. Dat zorgt voor stress in teams, druk op deadlines en risico op fouten die later veel geld kosten.
-
Structurele krapte aan ervaren electrical en power engineers
-
Lange doorlooptijden in engineering en gridstudies
-
Versnipperde tekeningen en documentatie over systemen en assets
-
Veel handmatig werk in berekeningen en layouts
-
Hoge coördinatielast met netbeheerders en stakeholders
-
Druk op CAPEX en OPEX per kWh, weinig foutmarge
-
Moeilijk om kennis vast te houden door verloop en tijdelijke inhuur
Zonder extra, betrouwbare capaciteit blijven projecten schuiven, groeit de werkvoorraad verder en neemt het risico toe dat je strategische roadmap voor renewables en gridinfrastructuur niet wordt gehaald.
Hoe voeg je snel capaciteit toe
Internationale collega’s op afstand als verlengstuk van jouw kernteam
Met WorldEmp bouw je structureel aan je projectteam. We koppelen je aan een vaste groep internationale engineers, designers, dataspecialisten, planners en document controllers die langdurig met jouw organisatie meedraaien. Geen losse freelancers, maar ervaren professionals die jouw standaarden, systemen en werkwijze kennen. Zij werken als collega op afstand in jouw team en pakken teken, reken en documentatiewerk op, terwijl jouw lokale team focust op conceptkeuzes, reviews en stakeholdermanagement. Zo houd jij controle én vergroot je je slagkracht.
Meer projecten parallel, zonder in te leveren op kwaliteit
Met een schaalbaar team van collega’s op afstand kun je meer zonne, wind en BESS-projecten tegelijk ontwikkelen en realiseren, zonder steeds opnieuw te zoeken naar schaarse profielen. Je verkort doorlooptijden van basic en detailengineering, voorkomt vertraging in grid-connectiondossiers en levert completere documentatie op voor netbeheerders, financiers en auditors. Door een mix van lokaal kernteam en internationale professionals verlaag je de totale projectkosten en bouw je duurzame kennis en continuïteit op.
Meer slagkracht, minder druk in je organisatie
Met extra capaciteit van internationale professionals die als collega op afstand meewerken, werk je ontwerpen sneller uit, houd je documentatie op orde en loop je gridstudies en vergunningstrajecten niet meer achterna. Je pipeline wordt realistischer planbaar, teams ervaren minder piekdruk en je benut je schaarse specialisten daar waar hun kennis het meeste waarde toevoegt.
Zo versnelt jouw bijdrage aan de energietransitie zonder dat je organisatie overbelast raakt.
Welke profielen kun jij opschalen
Rollen die jouw programma vooruithelpen
Jij bepaalt welke rollen je nodig hebt, WorldEmp helpt je een passend team van internationale professionals op te bouwen. Altijd dedicated, langdurig en ingericht op jouw processen, tooling en standaarden, zodat zij echt als collega’s op afstand in jouw organisatie werken.
-
Electrical en power engineers grid, protection, LV/MV/HV
-
Design en CAD BIM-professionals voor layouts en single lines
-
Planners, werkvoorbereiders en projectcoördinatoren
-
Document controllers en configuration managers
-
Data en performance specialisten voor monitoring en reporting
-
Business IT-professionals voor koppeling tussen ontwerp en assets
Zo creëer je op alle niveaus een flexibele schil van collega’s op afstand die voelt als onderdeel van je eigen organisatie.
Kennismaking & inzicht
We bespreken jouw technische uitdaging en bepalen samen het gewenste profiel, inclusief tools, systemen en vakspecialisatie.
Selectie & voorstel
Binnen enkele dagen ontvang je het profiel van een engineer met de juiste expertise en ervaring. Jij beslist of je een kennismaking wilt plannen.
Kick-off & onboarding
Na akkoord zorgen we voor een snelle onboarding. De engineer werkt in jouw systemen en processen, als volwaardig lid van je team.
Samenwerking & kwaliteit
Je blijft in regie. Wij faciliteren heldere communicatie, vaste contactmomenten en actieve kwaliteitscontrole via een dedicated aanspreekpunt.
Van schaarste naar schaalbaarheid
Met WorldEmp haal je een stabiel en schaalbaar capaciteitsplatform in huis voor je renewable power en gridinfrastructuur projecten. Je verkort de tijd van eerste ontwerp tot bouwstart en ingebruikname, vermindert herwerk op site en levert completere dossiers op richting DSO’s, TSO’s, financiers en auditors. Dat verlaagt risico’s op vertraging, boetes of afkeuring en geeft je meer grip op kosten en planning.
Rust in je teams, meer focus op strategische projecten
Omdat repetitief teken, reken en documentatiewerk door je collega’s op afstand wordt opgepakt, kan jouw kernteam zich richten op waar zij echt het verschil maken. Je verhoogt de kwaliteit van gridstudies, ontwerpen en compliance dossiers, terwijl je projectportefeuille sneller beweegt. Met een dedicated team van internationale professionals bouw je duurzame kennis op, in plaats van elke paar maanden opnieuw te beginnen met tijdelijke inhuur.
Klaar om je capaciteit te versterken?
Plan een gesprek, ik denk graag met je mee
Ik ben Jan Joosten, Business Partner bij WorldEmp en ondernemer in de solar- en energietransitiesector.
Als voormalig co-founder van een internationale PV-distributeur en strategisch business coach weet ik precies welke uitdagingen je in de praktijk tegenkomt: van een volle pipeline en krappe marges tot het versnellen van groeiplannen.