<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Java Spring - Inero Software - Software Consulting</title>
	<atom:link href="https://inero-software.com/tag/java-spring/feed/" rel="self" type="application/rss+xml" />
	<link>https://inero-software.com/tag/java-spring/</link>
	<description>We unleash innovations using cutting-edge technologies, modern design and AI</description>
	<lastBuildDate>Wed, 06 Nov 2024 07:29:20 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://inero-software.com/wp-content/uploads/2018/11/inero-logo-favicon.png</url>
	<title>Java Spring - Inero Software - Software Consulting</title>
	<link>https://inero-software.com/tag/java-spring/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">153509928</site>	<item>
		<title>Keycloak Integration Guide: Securing Java Spring Endpoints with Keycloak</title>
		<link>https://inero-software.com/securing-java-spring-endpoints-with-keycloak/</link>
		
		<dc:creator><![CDATA[Marceli Formela]]></dc:creator>
		<pubDate>Mon, 27 May 2024 13:19:53 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Keycloak]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[Java Spring]]></category>
		<category><![CDATA[keycloak]]></category>
		<category><![CDATA[RBAC]]></category>
		<category><![CDATA[Role-Based Access Control]]></category>
		<category><![CDATA[Spring Boot]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=5759</guid>

					<description><![CDATA[<p>&#160; &#160;</p>
<p>Artykuł <a href="https://inero-software.com/securing-java-spring-endpoints-with-keycloak/">Keycloak Integration Guide: Securing Java Spring Endpoints with Keycloak</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>&nbsp;</p>
<div class="row"><div class="col-sm-1"></div><div class="col-sm-10">
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">In the world of web application development, securing endpoints is a critical task to ensure that only authorized users can access certain resources. One of the most robust ways to handle authentication and authorization in Java Spring applications is by integrating with Keycloak, an open-source identity and access management solution.</span></p>
<p><span style="font-weight: 400;">Spring Security is a powerful and customizable authentication and access-control framework for the Java Spring ecosystem. However, managing and implementing security policies and authentication mechanisms from scratch can be cumbersome and error-prone. By integrating Keycloak, developers can offload many of these responsibilities to a robust, external system. Keycloak handles user management, roles, and permissions, and provides an easy-to-use interface for administrators.</span></p>
<p><span style="font-weight: 400;">In this article, we will demonstrate how to seamlessly integrate Keycloak with Spring Boot and secure endpoints based on Role-Based Access Control (RBAC). We&#8217;ll guide you through the necessary steps to configure Keycloak, set up roles, and apply security constraints to your application. By the end of this tutorial, you will have authentication and authorization system implemented in your Spring Boot project.</span></p>
<p>&nbsp;</p>
<h3><b>Setting Up Keycloak</b></h3>
<p><span style="font-weight: 400;">Before integrating Keycloak with a Spring Boot application, you need to set up a Keycloak server. Here&#8217;s a quick guide to getting started:</span></p>
<ol>
<li><b></b><span style="font-weight: 400;">   </span> <b>Download and Install Keycloak</b></li>
</ol>
<p><span style="font-weight: 400;">Download the latest version of <a href="https://www.keycloak.org/">Keycloak from the official website</a>. Extract the downloaded archive and start the server by navigating to the bin directory and executing:</span></p>
<pre><i><span style="font-weight: 400;">bin/kc.sh start-dev</span></i>
<i><span style="font-weight: 400;">2024-05-23 06:59:48,625 INFO  [io.quarkus] (main) Keycloak 24.0.4 on JVM (powered by Quarkus 3.8.4) started in 5.096s. Listening on: http://0.0.0.0:8080</span></i></pre>
<p>&nbsp;</p>
<ol start="2">
<li><b></b><span style="font-weight: 400;">   </span> <b>Access the Admin Console</b></li>
</ol>
<p><span style="font-weight: 400;">Open a browser and navigate to</span><a href="http://localhost:8080"> <span style="font-weight: 400;">http://localhost:8080</span></a><span style="font-weight: 400;">. After creating admin account and logging in you should be redirected to /admin/master/console/.</span></p>
<p><img fetchpriority="high" decoding="async" data-attachment-id="5769" data-permalink="https://inero-software.com/securing-java-spring-endpoints-with-keycloak/keyclock1-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/05/KEYCLOCK1-2.png" data-orig-size="1920,1080" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="KEYCLOCK1 (2)" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/05/KEYCLOCK1-2-300x169.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/05/KEYCLOCK1-2-1030x579.png" tabindex="0" role="button" class="wp-image-5769 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/05/KEYCLOCK1-2-300x169.png" alt="" width="500" height="282" srcset="https://inero-software.com/wp-content/uploads/2024/05/KEYCLOCK1-2-300x169.png 300w, https://inero-software.com/wp-content/uploads/2024/05/KEYCLOCK1-2-1030x579.png 1030w, https://inero-software.com/wp-content/uploads/2024/05/KEYCLOCK1-2-768x432.png 768w, https://inero-software.com/wp-content/uploads/2024/05/KEYCLOCK1-2-1536x864.png 1536w, https://inero-software.com/wp-content/uploads/2024/05/KEYCLOCK1-2-533x300.png 533w, https://inero-software.com/wp-content/uploads/2024/05/KEYCLOCK1-2.png 1920w" sizes="(max-width: 500px) 100vw, 500px" /></p>
<ol start="3">
<li><b></b><span style="font-weight: 400;">   </span> <b>Create a Realm</b></li>
</ol>
<p><span style="font-weight: 400;">A successful login will take us to the console and open up the default Master realm for us. In this scenario we will create a custom realm. Create a new realm by clicking on the &#8220;Add Realm&#8221; button. After clicking the </span><i><span style="font-weight: 400;">Create</span></i><span style="font-weight: 400;"> button, a new realm will be created and we’ll be redirected to it. All the operations in the next sections will be performed in this new </span><i><span style="font-weight: 400;">custom</span></i><span style="font-weight: 400;"> realm.</span></p>
<p><span style="font-weight: 400;">A realm represents a logical grouping of users, credentials, roles, and configurations. It basicly acts as an isolated environment within the Keycloak server where you can manage users and define security policies independently from other realms. This separation allows for enabling different applications or organizations to have their own distinct security domains within a single Keycloak instance. Realms provide the flexibility to customize authentication and authorization settings to meet the specific needs of different projects or clients.</span></p>
<p><img decoding="async" data-attachment-id="5774" data-permalink="https://inero-software.com/securing-java-spring-endpoints-with-keycloak/keycloak-blog-1/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1.png" data-orig-size="3600,2025" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Keycloak blog 1" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1-300x169.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1-1030x579.png" tabindex="0" role="button" class="wp-image-5774 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1-300x169.png" alt="" width="730" height="411" srcset="https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1-300x169.png 300w, https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1-1030x579.png 1030w, https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1-768x432.png 768w, https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1-1536x864.png 1536w, https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1-2048x1152.png 2048w, https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1-533x300.png 533w" sizes="(max-width: 730px) 100vw, 730px" /></p>
<ol start="4">
<li><b></b><span style="font-weight: 400;">   </span> <b>Create a Client</b></li>
</ol>
<p><span style="font-weight: 400;">Now we’ll navigate to the Clients page. As we can see in the image below, Keycloak comes with Clients that are already built-in. We still need to add a new client to our application, so we’ll click </span><i><span style="font-weight: 400;">Create</span></i><span style="font-weight: 400;">.</span></p>
<p><span style="font-weight: 400;">A client in Keycloak represents an application or service that requests authentication and authorization from the Keycloak server. Clients are configured within a realm and can have specific roles, credentials, and access policies. They can be web applications, mobile apps, or other types of services that require secure access control. By defining clients, Keycloak can manage how different applications interact with the authentication server, ensuring that each client follows the appropriate security protocols and has the necessary permissions to access protected resources.</span></p>
<p><img decoding="async" data-attachment-id="5775" data-permalink="https://inero-software.com/securing-java-spring-endpoints-with-keycloak/keycloak-blog-1-1/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1-1.png" data-orig-size="3600,2025" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Keycloak blog 1 (1)" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1-1-300x169.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1-1-1030x579.png" tabindex="0" role="button" class="wp-image-5775 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1-1-300x169.png" alt="" width="731" height="412" srcset="https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1-1-300x169.png 300w, https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1-1-1030x579.png 1030w, https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1-1-768x432.png 768w, https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1-1-1536x864.png 1536w, https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1-1-2048x1152.png 2048w, https://inero-software.com/wp-content/uploads/2024/05/Keycloak-blog-1-1-533x300.png 533w" sizes="(max-width: 731px) 100vw, 731px" /></p>
<ol start="5">
<li><b></b><span style="font-weight: 400;">   </span> <b>Creating Roles and Users</b></li>
</ol>
<p><span style="font-weight: 400;">Define roles and users for your application. Navigate to the Roles and Users sections to add and configure them accordingly.</span></p>
<p>&nbsp;</p>
<h3><b>Integrating Keycloak with Spring Boot</b></h3>
<p>&nbsp;</p>
<ol>
<li><b></b><strong>       Add dependencies</strong></li>
</ol>
<p><span style="font-weight: 400;">We use the Spring Security OAuth2.0 Client to connect to the Keycloak server.</span></p>
<p><span style="font-weight: 400;">Let’s start by declaring spring-boot-starter-oauth2-client dependency in a Spring Boot application in the pom.xml:</span></p>
<pre><span style="font-weight: 400;">&lt;dependency&gt;</span>
<span style="font-weight: 400;">    &lt;groupId&gt;</span><span style="font-weight: 400;">org.springframework.boot</span><span style="font-weight: 400;">&lt;/groupId&gt;</span>
<span style="font-weight: 400;">        &lt;artifactId&gt;</span><span style="font-weight: 400;">spring-boot-starter-oauth2-client</span><span style="font-weight: 400;">&lt;/artifactId&gt;</span>
<span style="font-weight: 400;">&lt;/dependency&gt;</span></pre>
<p><span style="font-weight: 400;">Also, as we need to use Spring Security with Spring Boot, we must add this dependency:</span></p>
<pre><span style="font-weight: 400;">&lt;dependency&gt;</span>
<span style="font-weight: 400;">    &lt;groupId&gt;</span><span style="font-weight: 400;">org.springframework.boot</span><span style="font-weight: 400;">&lt;/groupId&gt;</span>
<span style="font-weight: 400;">    &lt;artifactId&gt;</span><span style="font-weight: 400;">spring-boot-starter-security</span><span style="font-weight: 400;">&lt;/artifactId&gt;</span>
<span style="font-weight: 400;">&lt;/dependency&gt;</span></pre>
<p><span style="font-weight: 400;">In order to delegate the identification control to a Keycloak server, we’ll use the spring-boot-starter-oauth2-resource-server library. This library facilitates the validation of a JWT token with the Keycloak server. Therefore, let&#8217;s include it in our project&#8217;s pom.xml file.</span></p>
<pre><span style="font-weight: 400;">&lt;dependency&gt;</span>
<span style="font-weight: 400;">    &lt;groupId&gt;</span><span style="font-weight: 400;">org.springframework.boot</span><span style="font-weight: 400;">&lt;/groupId&gt;</span>
<span style="font-weight: 400;">    &lt;artifactId&gt;</span><span style="font-weight: 400;">spring-boot-starter-oauth2-resource-server</span><span style="font-weight: 400;">&lt;/artifactId&gt;</span>
<span style="font-weight: 400;">&lt;/dependency&gt;</span></pre>
<p>&nbsp;</p>
<ol start="2">
<li><strong>      Configure Keycloak in application.properties</strong></li>
</ol>
<p><span style="font-weight: 400;">This grant type is suitable for server-to-server communication, where the client application itself is considered the resource owner. It involves exchanging the client’s credentials (client ID and client secret) for an access token.</span></p>
<pre style="padding-left: 40px;"><b>spring.security.oauth2.client.registration.keycloak.authorization-grant-type=client_credentials</b></pre>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">These properties define the client ID and secret that the application will use to authenticate with Keycloak. In this example, the secret is set to placeholder value.</span></p>
<pre style="padding-left: 40px;"><b>spring.security.oauth2.client.registration.keycloak.client-id=back-end-resource-server</b>

<b>spring.security.oauth2.client.registration.keycloak.client-secret=test-secret</b></pre>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Finally, let’s add the configuration needed for validating JWT token against our Keycloak server:</span></p>
<pre style="padding-left: 40px;"><b>spring.security.oauth2.client.provider.keycloak.token-uri=${test.keycloak-base-url}/realms/test/protocol/openid-connect/token</b>

<b>spring.security.oauth2.resourceserver.jwt.issuer-uri=${app.keycloak-base-url}/realms/test-realm</b></pre>
<p><span style="font-weight: 400;">By combining these configurations, your Spring Boot application will be able to authenticate itself to Keycloak using the client credentials flow and validate JWTs issued by Keycloak, ensuring secure access to its endpoints.</span></p>
<p><span style="font-weight: 400;">Now, the Spring Boot application can interact with Keycloak.</span></p>
<p><a href="https://inero-software.com/keycloak-services/"><img loading="lazy" decoding="async" data-attachment-id="5752" data-permalink="https://inero-software.com/best-keycloak-practices/_baner-en-300x60-1/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/05/baner-en-300x60-1-1.png" data-orig-size="825,165" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="_baner en 300&amp;#215;60 (1)" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/05/baner-en-300x60-1-1-300x60.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/05/baner-en-300x60-1-1.png" tabindex="0" role="button" class="wp-image-5752 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/05/baner-en-300x60-1-1-300x60.png" alt="" width="755" height="151" srcset="https://inero-software.com/wp-content/uploads/2024/05/baner-en-300x60-1-1-300x60.png 300w, https://inero-software.com/wp-content/uploads/2024/05/baner-en-300x60-1-1-768x154.png 768w, https://inero-software.com/wp-content/uploads/2024/05/baner-en-300x60-1-1.png 825w" sizes="(max-width: 755px) 100vw, 755px" /></a></p>
<ol start="3">
<li><b></b><strong>       Spring Security configuration</strong></li>
</ol>
<p><span style="font-weight: 400;">Now, let&#8217;s examine the resource server configuration. We need to extract Keycloak-specific information from the JWT. All requests with an Authorization header must include a user&#8217;s token with the necessary scope.</span></p>
<p><span style="font-weight: 400;">In this example CORS is enabled and session management is set to stateless, which is typial for APIs to ensure each request is independently authenticated. We’ve also disabled CSRF protection since our API is stateless.</span></p>
<p><span style="font-weight: 400;">The application is set up as an OAuth 2 resource server that uses JWT for authentication and jwtAuthenticationConverter is specified to handle the conversion of JWT claims into authorities.</span></p>
<pre><span style="font-weight: 400;">@Bean</span>
<span style="font-weight: 400;">public </span><span style="font-weight: 400;">SecurityFilterChain </span><span style="font-weight: 400;">setupOAuth</span><span style="font-weight: 400;">(HttpSecurity http) </span><span style="font-weight: 400;">throws </span><span style="font-weight: 400;">Exception {</span>
<span style="font-weight: 400;">          http.cors().and()</span>
<span style="font-weight: 400;">        </span> <span style="font-weight: 400;">.sessionManagement().sessionCreationPolicy(</span><i><span style="font-weight: 400;">STATELESS</span></i><span style="font-weight: 400;">).and()</span>
<span style="font-weight: 400;">        </span> <span style="font-weight: 400;">.csrf().disable()
</span>  <span style="font-weight: 400;">.oauth2ResourceServer().jwt().jwtAuthenticationConverter(getJwtAuthenticationConverter()).and().and()</span>
<span style="font-weight: 400;">        </span> <span style="font-weight: 400;">.authorizeHttpRequests(authz -&gt; authz</span>
<span style="font-weight: 400;">                </span> <span style="font-weight: 400;">.dispatcherTypeMatchers(DispatcherType.</span><i><span style="font-weight: 400;">ERROR</span></i><span style="font-weight: 400;">).permitAll()</span>
<span style="font-weight: 400;">                </span> <span style="font-weight: 400;">.anyRequest().hasAnyAuthority(</span><span style="font-weight: 400;">"SCOPE_back-end-resource-server"</span><span style="font-weight: 400;">)</span>
<span style="font-weight: 400;">        </span> <span style="font-weight: 400;">)</span><span style="font-weight: 400;">;</span>
<span style="font-weight: 400;">    return </span><span style="font-weight: 400;">http.build()</span><span style="font-weight: 400;">;</span>
<span style="font-weight: 400;">}</span>
<span style="font-weight: 400;">private </span><span style="font-weight: 400;">CompositeJwtAuthenticationConverter </span><span style="font-weight: 400;">getJwtAuthenticationConverter</span><span style="font-weight: 400;">() {</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">return new </span><span style="font-weight: 400;">CompositeJwtAuthenticationConverter()</span>
<span style="font-weight: 400;">        </span> <span style="font-weight: 400;">.extractAuthorities(</span><span style="font-weight: 400;">"ROLE_"</span><span style="font-weight: 400;">, </span><span style="font-weight: 400;">"realm_access"</span><span style="font-weight: 400;">, </span><span style="font-weight: 400;">"roles"</span><span style="font-weight: 400;">)</span>
<span style="font-weight: 400;">        </span> <span style="font-weight: 400;">.extractAuthorities(</span><span style="font-weight: 400;">"SCOPE_"</span><span style="font-weight: 400;">, </span><span style="font-weight: 400;">"scope"</span><span style="font-weight: 400;">)</span><span style="font-weight: 400;">;</span>
<span style="font-weight: 400;">}</span></pre>
<h3><b>Securing REST API</b></h3>
<p><span style="font-weight: 400;">This specific configuration guarantees that only verified users possessing the correct roles can reach secured content. Suppose there&#8217;s a role named ADMIN established, and we aim to restrict access to the list of entities exclusively to users assigned to this role.</span></p>
<pre><span style="font-weight: 400;">@RolesAllowed</span><span style="font-weight: 400;">({Roles.</span><i><span style="font-weight: 400;">ADMIN</span></i><span style="font-weight: 400;">})</span>
<span style="font-weight: 400;">@GetMapping</span><span style="font-weight: 400;">(</span><span style="font-weight: 400;">"/vehicles"</span><span style="font-weight: 400;">)</span>
<span style="font-weight: 400;">public </span><span style="font-weight: 400;">ResponseEntity&lt;?&gt; </span><span style="font-weight: 400;">getVehicles</span><span style="font-weight: 400;">() {</span>
<span style="font-weight: 400;">return </span><span style="font-weight: 400;">vehicleRepository.findAll()</span><span style="font-weight: 400;">;</span>
<span style="font-weight: 400;">}</span></pre>
<p><span style="font-weight: 400;">One way to obtain the JWT token in a user-friendly way is to integrate Keycloak in the front-end client, e.g. using appropriate Angular libraries, but this will be probably the subject of another post, so let&#8217;s take a quick look at initializing KeycloakService (from keycloak-angular library) and move on.</span></p>
<pre><span style="font-weight: 400;">function </span><span style="font-weight: 400;">initializeKeycloak</span><span style="font-weight: 400;">(keycloak: KeycloakService) {</span>
<span style="font-weight: 400;">return </span><span style="font-weight: 400;">() =&gt;</span>
<span style="font-weight: 400;">    </span> <span style="font-weight: 400;">keycloak.</span><span style="font-weight: 400;">init</span><span style="font-weight: 400;">({</span>
<span style="font-weight: 400;">        </span> <span style="font-weight: 400;">config</span><span style="font-weight: 400;">: {</span>
<span style="font-weight: 400;">            </span> <span style="font-weight: 400;">url</span><span style="font-weight: 400;">: </span><b><i>environment</i></b><span style="font-weight: 400;">.</span><span style="font-weight: 400;">keycloakUrl</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">            </span> <span style="font-weight: 400;">realm</span><span style="font-weight: 400;">: </span><span style="font-weight: 400;">'test'</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">    </span> <span style="font-weight: 400;">        </span><span style="font-weight: 400;">clientId</span><span style="font-weight: 400;">: </span><span style="font-weight: 400;">'front-end'</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">        </span> <span style="font-weight: 400;">}</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">        </span> <span style="font-weight: 400;">initOptions</span><span style="font-weight: 400;">: {</span>
<span style="font-weight: 400;">            </span> <span style="font-weight: 400;">checkLoginIframe</span><span style="font-weight: 400;">: </span><span style="font-weight: 400;">false,</span>
<span style="font-weight: 400;">            </span> <span style="font-weight: 400;">scope</span><span style="font-weight: 400;">: </span><span style="font-weight: 400;">'back-end-resource-server'</span>
<span style="font-weight: 400;">        </span> <span style="font-weight: 400;">}</span>
<span style="font-weight: 400;">    </span> <span style="font-weight: 400;">})</span><span style="font-weight: 400;">;</span>
<span style="font-weight: 400;">}</span></pre>
<p><span style="font-weight: 400;">After successful authentication, we should receive a JWT token with similar structure.</span></p>
<pre><span style="font-weight: 400;">"realm_access"</span><span style="font-weight: 400;">: {</span>
<span style="font-weight: 400;">"roles"</span><span style="font-weight: 400;">: [</span>
<span style="font-weight: 400;">    </span> <span style="font-weight: 400;">"offline_access"</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">    </span> <span style="font-weight: 400;">"default-roles-test"</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">    </span> <span style="font-weight: 400;">"uma_authorization"</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;"> </span> <span style="font-weight: 400;">   </span><span style="font-weight: 400;">"ADMIN"</span>
<span style="font-weight: 400;">]</span>
<span style="font-weight: 400;">}</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">"scope"</span><span style="font-weight: 400;">: </span><span style="font-weight: 400;">"openid profile email back-end-resource-server"</span></pre>
<p><span style="font-weight: 400;">While running a local server, we could use cURL to test our new endpoint:</span></p>
<pre><span style="font-weight: 400;">curl -H "Authorization: Bearer {valid_jwt_token}"</span><a href="http://localhost:4200/api/vehicles"> <span style="font-weight: 400;">http://localhost:4200/api/vehicles</span></a></pre>
<p><span style="font-weight: 400;">Even if we have the JWT token, the lack of the admin role will result in 403 response.</span></p>
<pre><i><span style="font-weight: 400;">StatusCode: 403</span></i>
<i><span style="font-weight: 400;">StatusDescription: Forbidden</span></i></pre>
<p><span style="font-weight: 400;">Let&#8217;s consider a scenario where the user logged in to the admin account:</span></p>
<pre><i><span style="font-weight: 400;">StatusCode: 200</span></i>
<i><span style="font-weight: 400;">StatusDescription: OK</span></i></pre>
<p><span style="font-weight: 400;">As we can see using Keycloak Role-Based Access Control (RBAC) in web applications offers several advantages. Firstly, it provides a robust and scalable solution for managing access to resources based on user roles and permissions. By defining roles within Keycloak and assigning them to users or groups, administrators can easily control who can access specific functionalities or data in the application. This granular access control enhances security by ensuring that only authorized users can perform certain actions or view sensitive information.</span></p>
<p><span style="font-weight: 400;">Moreover, Keycloak RBAC simplifies the management of access control policies across multiple applications or microservices. Centralizing user roles and permissions in Keycloak eliminates the need to implement and maintain separate authorization mechanisms in each application. This centralization streamlines administration tasks, reduces development overhead, and ensures consistency in access control policies across the entire ecosystem of applications.</span></p>
<p><span style="font-weight: 400;">In summary, leveraging Keycloak RBAC in web applications brings about enhanced security, modularity, centralization, and adaptability in access control management. These benefits contribute to building more secure, maintainable, and scalable web applications while simplifying administration tasks and ensuring consistent access control policies across the application ecosystem.</span></p>
<p>&nbsp;</p>
<p></p></div><div class="col-sm-1"></div></div>
<p>&nbsp;</p>
<p>Artykuł <a href="https://inero-software.com/securing-java-spring-endpoints-with-keycloak/">Keycloak Integration Guide: Securing Java Spring Endpoints with Keycloak</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5759</post-id>	</item>
		<item>
		<title>How Advanced Routing and Optimization can support an emergency response actions &#8211; use case study</title>
		<link>https://inero-software.com/how-advanced-routing-and-optimization-can-support-an-emergency-response-actions-use-case-study/</link>
		
		<dc:creator><![CDATA[Adrian Chojnacki]]></dc:creator>
		<pubDate>Wed, 27 Jan 2021 11:03:37 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[DeliverM8]]></category>
		<category><![CDATA[Emergency systems]]></category>
		<category><![CDATA[Java Spring]]></category>
		<category><![CDATA[Kiosk Mode]]></category>
		<category><![CDATA[navigation]]></category>
		<category><![CDATA[push notifications]]></category>
		<category><![CDATA[runtime]]></category>
		<guid isPermaLink="false">https://sandbox-www.devel.inero.com.pl/?p=3234</guid>

					<description><![CDATA[<p>&#160;</p>
<p>Artykuł <a href="https://inero-software.com/how-advanced-routing-and-optimization-can-support-an-emergency-response-actions-use-case-study/">How Advanced Routing and Optimization can support an emergency response actions &#8211; use case study</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3></h3>
<p>&nbsp;</p>
<div class="row"><div class="col-sm-3"></div><div class="col-sm-6">
<p style="text-align: left;"><span style="font-weight: 400;"><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />The aspects of optimizing route parameters and creating a supply chain using </span><span style="font-weight: 400;"><a href="https://inero-software.com/machine-learning-professionals/">artificial intelligence</a></span><span style="font-weight: 400;"> have been presented in our blog posts recently. In one of our </span><a href="https://inero-software.com/redistribution-supply-chain-network/"><span style="font-weight: 400;">recent posts</span></a><span style="font-weight: 400;">, we presented how AI <a href="https://inero-software.com/deliverm8-advanced-routing/">route optimization</a> may be used not only for the logistics industry but also for pharmacy medicine transport coordination for corporate pharmacy networks. Another application that we developed recently for one of our corporate clients is a support decision system for emergency actions aimed at improving the operational effectiveness of local rescue operations. </span></p>
<p style="text-align: left;"><span style="font-weight: 400;">In this post, we described how we utilized <a href="http://deliverm8.com">DeliverM8 logistics optimization platform</a>, as support of entities in emergency situations. We will briefly present how modern IT technologies such as mobile apps, push notifications and web applications can bring observable benefits and even improve security and effectiveness of operations, which is crucial in emergency situations.</span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><span style="color: #800080;"><b>Use Case</b></span></h3>
<p><b><span style="font-weight: 400;"><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></span>The use case </b><span style="font-weight: 400;">described in this article is a system supporting local fire brigade teams in real-time navigation and communication during actions which is archived by providing team members with the current traffic, roadblock and general current situational awareness regarding the route availability and supporting real-time decisions in the scope of route selection.</span></p>
<p><span style="font-weight: 400;">The implemented system must meet the following requirements:</span></p>
<ul>
<li><span style="font-weight: 400;">enable entering the address of the incident,</span></li>
<li><span style="font-weight: 400;">generate three alternative routes to the selected incident destination,</span></li>
<li><span style="font-weight: 400;">inform the fire brigade via push notifications, text messages or other options&#8230;</span></li>
<li><span style="font-weight: 400;">transmit the route seamlessly to a built-in navigation device (Android),</span></li>
<li><span style="font-weight: 400;">display the route and the locations of emergency infrastructure (nearest hydrants, evacuation points etc)  around the incident, allowing the selection of the target destination,</span></li>
<li><span style="font-weight: 400;">navigation to the selected destination via the built-in navigation system.</span></li>
</ul>
<p><span style="font-weight: 400;">To meet these requirements, we have built a three-layer architecture, where the database is located on a central server, and access to it is possible through the data management and processing module. Operating server provides functionalities available via REST API for a user interface dedicated for web browsers and mobile applications. The communication structure between the individual components is shown in the figure below.</span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="3242" data-permalink="https://inero-software.com/how-advanced-routing-and-optimization-can-support-an-emergency-response-actions-use-case-study/architecture/" data-orig-file="https://inero-software.com/wp-content/uploads/2021/01/architecture.png" data-orig-size="697,508" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="architecture" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2021/01/architecture-300x219.png" data-large-file="https://inero-software.com/wp-content/uploads/2021/01/architecture.png" tabindex="0" role="button" class="aligncenter wp-image-3242 size-full" src="https://inero-software.com/wp-content/uploads/2021/01/architecture.png" alt="The communication structure between the individual components" width="697" height="508" srcset="https://inero-software.com/wp-content/uploads/2021/01/architecture.png 697w, https://inero-software.com/wp-content/uploads/2021/01/architecture-300x219.png 300w, https://inero-software.com/wp-content/uploads/2021/01/architecture-412x300.png 412w" sizes="(max-width: 697px) 100vw, 697px" /></p>
<p><span style="font-weight: 400;">The target application was implemented using Java Spring with the PostgreSQL, while the web and Android application was provided by the </span><a href="https://angular.io/"><span style="font-weight: 400;">Angular framework</span></a><span style="font-weight: 400;">.</span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><span style="color: #800080;"><b>An example of using the system</b></span></h3>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />One of the most important for the end-user to work with the proposed system is appropriate handling of real-time passability of chosen routes and passes. Therefore, we proposed a solution where our system communicates via dedicated interfaces with an internal infrastructure of our clients and verifies passability of the chosen route. In the case of road-block, the system is capable of choosing different routes that pass it to the navigation device seamlessly. Generating routes works on the basis of an iterative process and successive avoidance of waypoints, which in this case are railway crossings. Having the visualization and the necessary parameters, the user may choose the best alternative at a given moment.</span></p>
<p><span style="font-weight: 400;">In order to illustrate how the system works, the generated solution is shown in the figure below.</span></p>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" data-attachment-id="3235" data-permalink="https://inero-software.com/how-advanced-routing-and-optimization-can-support-an-emergency-response-actions-use-case-study/article/" data-orig-file="https://inero-software.com/wp-content/uploads/2021/01/article.png" data-orig-size="1912,1225" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="article" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2021/01/article-300x192.png" data-large-file="https://inero-software.com/wp-content/uploads/2021/01/article-1030x660.png" tabindex="0" role="button" class="aligncenter wp-image-3235 size-full" src="https://inero-software.com/wp-content/uploads/2021/01/article.png" alt="Visualisation of the system" width="1912" height="1225" srcset="https://inero-software.com/wp-content/uploads/2021/01/article.png 1912w, https://inero-software.com/wp-content/uploads/2021/01/article-300x192.png 300w, https://inero-software.com/wp-content/uploads/2021/01/article-768x492.png 768w, https://inero-software.com/wp-content/uploads/2021/01/article-1030x660.png 1030w, https://inero-software.com/wp-content/uploads/2021/01/article-468x300.png 468w, https://inero-software.com/wp-content/uploads/2021/01/article-466x300.png 466w" sizes="(max-width: 1912px) 100vw, 1912px" /></span></p>
<p><span style="font-weight: 400;">Additionally, by clicking on the &#8220;</span><b><i>Plan</i></b><span style="font-weight: 400;">&#8221; section as in the figure above, the user may analyze a route data such as railroad crossings, distance in kilometres and ETA (estimated time of arrival). The next step is to select the route by clicking on the map and uploading it to the navigation application for the emergency brigade. Thanks to this, the system informs a built-in navigation subsystem tablet about the event from the backend side, e.g. via a push or SMS notification.</span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="4934" data-permalink="https://inero-software.com/how-advanced-routing-and-optimization-can-support-an-emergency-response-actions-use-case-study/pushcomp/" data-orig-file="https://inero-software.com/wp-content/uploads/2021/01/pushcomp.gif" data-orig-size="660,996" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="pushcomp" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2021/01/pushcomp-199x300.gif" data-large-file="https://inero-software.com/wp-content/uploads/2021/01/pushcomp.gif" tabindex="0" role="button" class="aligncenter wp-image-4934 size-full" src="https://inero-software.com/wp-content/uploads/2021/01/pushcomp.gif" alt="push notification" width="660" height="996" /></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">After approving this notification, the system displays a map component with the destination route and the information required to perform emergency action such as locations of hydrants in the vicinity of the event location. Clicking on the target allows the user to navigate via using built-in navigation functionality button. We showed it in GIF animations below. </span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="4931" data-permalink="https://inero-software.com/how-advanced-routing-and-optimization-can-support-an-emergency-response-actions-use-case-study/mapcomp/" data-orig-file="https://inero-software.com/wp-content/uploads/2021/01/mapcomp.gif" data-orig-size="660,996" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="mapcomp" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2021/01/mapcomp-199x300.gif" data-large-file="https://inero-software.com/wp-content/uploads/2021/01/mapcomp.gif" tabindex="0" role="button" class="aligncenter wp-image-4931 size-full" src="https://inero-software.com/wp-content/uploads/2021/01/mapcomp.gif" alt="map navigation" width="660" height="996" /><img loading="lazy" decoding="async" data-attachment-id="4932" data-permalink="https://inero-software.com/how-advanced-routing-and-optimization-can-support-an-emergency-response-actions-use-case-study/navigationcomp/" data-orig-file="https://inero-software.com/wp-content/uploads/2021/01/navigationcomp.gif" data-orig-size="664,994" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="navigationcomp" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2021/01/navigationcomp-200x300.gif" data-large-file="https://inero-software.com/wp-content/uploads/2021/01/navigationcomp.gif" tabindex="0" role="button" class="aligncenter wp-image-4932 size-full" src="https://inero-software.com/wp-content/uploads/2021/01/navigationcomp.gif" alt="map navigation" width="664" height="994" /> <img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><span style="color: #800080;"><b>Summary</b></span></h3>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />In this short use-case blog, we presented how <a href="https://deliverm8.com">our logistic transport optimization platform</a> helps to support real-time emergency actions performance. An example of using a fully connected system for a standard user takes about</span><b><i> a minute</i></b><span style="font-weight: 400;"> from pointing a target to send navigation data to a mobile tablet. There is a significant time difference compared to the previous execution of all activities. In addition, the desired route is selected based on the decision block and the input information analyzed in real-time. Moreover, the system provides specialized tools tailored to the client&#8217;s needs., namely the archiving and reporting on previous incidents and their visualization and analysis in a dedicated responsive user interface.</span></p>
<p></p></div><div class="col-sm-3"></div></div>
<p>Artykuł <a href="https://inero-software.com/how-advanced-routing-and-optimization-can-support-an-emergency-response-actions-use-case-study/">How Advanced Routing and Optimization can support an emergency response actions &#8211; use case study</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3234</post-id>	</item>
		<item>
		<title>Redistribution supply chain network</title>
		<link>https://inero-software.com/redistribution-supply-chain-network/</link>
		
		<dc:creator><![CDATA[Adrian Chojnacki]]></dc:creator>
		<pubDate>Tue, 13 Oct 2020 14:44:44 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[angular]]></category>
		<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[Cargo flow]]></category>
		<category><![CDATA[DeliverM8]]></category>
		<category><![CDATA[Heuristic Methods]]></category>
		<category><![CDATA[Java Spring]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[Redistribution Network]]></category>
		<category><![CDATA[Supply Chain]]></category>
		<guid isPermaLink="false">https://sandbox-www.devel.inero.com.pl/?p=2998</guid>

					<description><![CDATA[<p>Redistribution supply chain network  (RSCN) &#8211; modelling and optimization One of our teams field of specialization is the use of artificial intelligence for modeling and optimizing complex transport models. From the practical point of view, the optimal planning of transport resources and supervision of their implementation is one of the&#8230;</p>
<p>Artykuł <a href="https://inero-software.com/redistribution-supply-chain-network/">Redistribution supply chain network</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3><span style="color: #800080;"><strong>Redistribution supply chain network  (RSCN) &#8211; modelling and optimization</strong></span></h3>
<h4></h4>
<p><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<p><span data-contrast="auto">One of our teams field of specialization is the use of artificial intelligence for modeling and optimizing complex transport models. From the practical point of view, the optimal planning of transport resources and supervision of their implementation is one of the key tasks in the area of ​​supply chain management.  </span><span data-contrast="auto">In this type of solutions, <a href="https://inero-software.com/machine-learning-professionals/">using artificial intelligence</a> and advanced computing IT systems can bring  observable</span><span data-contrast="auto"> benefits</span><span data-contrast="auto">. One of the solutions this post refers to is the </span><span data-contrast="auto">optimization </span><span data-contrast="auto">of redistribution network of the supply chain (RCSN).</span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><span style="color: #800080;"><strong><span class="TextRun SCXW152906754 BCX0" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SCXW152906754 BCX0">Pros, cons and uses</span></span></strong></span></h3>
<p><span class="TextRun SCXW96807580 BCX0" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SCXW96807580 BCX0"><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />RCSN is an alternative to the centralized distribution networks (CDN) that consist of one central warehouse for the storage and distribution of goods. CDN is effective if we carry out large, repetitive orders to destinations that are close to each other. If our supply chain get&#8217;s more complicated we can add some a number of local warehouses to place the goods closer to final destination. While the CDN generally simplifies transport management, it does not allow to optimally distribute costs of supply for complicated logistic models. Though the RCSN is more complex and more expensive to manage compared to the classic versions of warehousing, with the support of a specified IT solutions it guarantees a stable level of services, maintaining the performance of order management and distribution.</span></span><span class="EOP SCXW96807580 BCX0" data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559731&quot;:708,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><span style="color: #800080;"><strong>Use case</strong></span></h3>
<p><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<p><span class="TextRun SCXW187513915 BCX0" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SCXW187513915 BCX0">In this article, we will show <a href="https://inero-software.com/inero-software-team-work/">how Inero Software team deals with the above-mentioned problems</a> in an example use case. Let&#8217;s assume that we have a company with many branches and we need to exchange the necessary materials between them for proper functioning. To optimize costs and efficiency, we don&#8217;t always need to complete another large order from the supplier, but </span></span><span class="TextRun SCXW187513915 BCX0" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SCXW187513915 BCX0">we</span></span><span class="TextRun SCXW187513915 BCX0" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SCXW187513915 BCX0"> exchange materials between nearby branches. It is a much better and faster solution, and one of the most important aspects is that it minimizes the workload.</span></span><span class="EOP SCXW187513915 BCX0" data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559731&quot;:360,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>
<p><span data-contrast="auto">Let us assume, that in our showcase , we have 4 drivers and 40 company branches between, where each branch belongs to 1 of 4 groups( indicated by pin color in figure below). In the given use case, it was assumed that the goods may be stored and exchanged only between locations from the same group (a pin of the same color on the map), but the transport flow must be maximized between all locations. In order to optimize the total supply chain, it was assumed that the closest locations in a given group are the warehouses in the vincity of the particular driver&#8217;s home-base. This means that before the commodities are exchanged between individual points, the driver must pick up the goods from the defined warehouse and store them at the end of the daily route.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559731&quot;:360,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>
<p><span data-contrast="auto">In addition, when generating routes by the system, optimization algorithms takes under consideration following constraints: </span></p>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="2" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">each driver starts and finishes his/hers route at the warehouse. This means that the driver cannot leave any goods in the car for the night</span><span data-ccp-props="{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> before/after the route;</span></li>
<li data-leveltext="" data-font="Symbol" data-listid="2" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">goods are intended to be transferred among one group and cannot not be stored in the local warehouse (destination) of other groups. However, commodities dedicated for different groups, can be transported by the same vehicle;</span></li>
<li data-leveltext="" data-font="Symbol" data-listid="2" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1">every destination (location) can be considered as a local warehouse;</li>
<li data-leveltext="" data-font="Symbol" data-listid="2" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1">the driver cannot exceed the driving time and daily mileage limit;</li>
</ul>
<p><span data-contrast="auto">Moreover, some other specific limitations can be defined in the system, e.g. that the driver can only move in a restricted area, maximum 9 hours a day, can be defined. In this context </span><strong>the goal of the optimization is to maximize cargo flow between different branches of the company. </strong></p>
<p><span data-contrast="auto">The picture below shows an example of the result <a href="http://deliverm8.com">optimization of redistributing goods using our solutions. </a></span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="4557" data-permalink="https://inero-software.com/redistribution-supply-chain-network/step1-kompres-3/" data-orig-file="https://inero-software.com/wp-content/uploads/2020/10/step1-kompres.jpg" data-orig-size="1898,932" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="step1 kompres" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2020/10/step1-kompres-300x147.jpg" data-large-file="https://inero-software.com/wp-content/uploads/2020/10/step1-kompres-1030x506.jpg" tabindex="0" role="button" class="aligncenter wp-image-4557 size-full" src="https://inero-software.com/wp-content/uploads/2020/10/step1-kompres.jpg" alt="Visualisation of the system" width="1898" height="932" srcset="https://inero-software.com/wp-content/uploads/2020/10/step1-kompres.jpg 1898w, https://inero-software.com/wp-content/uploads/2020/10/step1-kompres-300x147.jpg 300w, https://inero-software.com/wp-content/uploads/2020/10/step1-kompres-1030x506.jpg 1030w, https://inero-software.com/wp-content/uploads/2020/10/step1-kompres-768x377.jpg 768w, https://inero-software.com/wp-content/uploads/2020/10/step1-kompres-1536x754.jpg 1536w, https://inero-software.com/wp-content/uploads/2020/10/step1-kompres-611x300.jpg 611w" sizes="(max-width: 1898px) 100vw, 1898px" /></p>
<p><span data-contrast="auto">As you can see in the picture above, the system has generated a driving plan for each driver for each day of the week. Thanks to this, we can ensure the exchange of the necessary goods in a given area, even several times a week.</span><span data-contrast="auto"> </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>
<p><span data-contrast="auto">As part of defining individual locations of the </span><span data-contrast="auto">local warehouses</span><span data-contrast="auto">, each of them was given a unique id in the range 10-49.  The illustration below shows the generated driver&#8217;s work plan divided into individual days.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="3009" data-permalink="https://inero-software.com/redistribution-supply-chain-network/plan/" data-orig-file="https://inero-software.com/wp-content/uploads/2020/10/plan.png" data-orig-size="1918,938" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Redistribution Supply Chain Network" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2020/10/plan-300x147.png" data-large-file="https://inero-software.com/wp-content/uploads/2020/10/plan-1030x504.png" tabindex="0" role="button" class="aligncenter wp-image-3009 size-full" src="https://inero-software.com/wp-content/uploads/2020/10/plan.png" alt="result of the optimization of redistributing goods" width="1918" height="938" srcset="https://inero-software.com/wp-content/uploads/2020/10/plan.png 1918w, https://inero-software.com/wp-content/uploads/2020/10/plan-300x147.png 300w, https://inero-software.com/wp-content/uploads/2020/10/plan-768x376.png 768w, https://inero-software.com/wp-content/uploads/2020/10/plan-1030x504.png 1030w, https://inero-software.com/wp-content/uploads/2020/10/plan-613x300.png 613w" sizes="(max-width: 1918px) 100vw, 1918px" /></p>
<p><span data-contrast="auto">It can be seen that the simulation requirements were met. If we visit a certain group on a given day, we initially pick up the goods and finally store them in the same unit belonging to the same group. </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>
<p><span data-contrast="auto">If the problem would require the exchange of goods between larger areas, e.g. from the western part of Poland to the northern part, etc., the implemented software could be extended with drivers&#8217; meeting points and the exchange. Then, the cargo can be delivered depending on the demand to specific branches of the company. This process is based on the previously generated solution. The system&#8217;s algorithms determine which locations have been selected for drivers&#8217; routes. On this basis, the route-based, the system finds the closest point on the map where drivers can potentially meet. If there are such places, they are added at certain times, (e.g. 12pm to 1pm, Monday) to the driver&#8217;s schedule. In the next stages, the system intelligently selects the remaining locations, maintaining continuity and increasing the area of exchange.</span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="4561" data-permalink="https://inero-software.com/redistribution-supply-chain-network/meet_2-kompres/" data-orig-file="https://inero-software.com/wp-content/uploads/2020/10/meet_2-kompres.jpg" data-orig-size="1299,777" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="meet_2 kompres" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2020/10/meet_2-kompres-300x179.jpg" data-large-file="https://inero-software.com/wp-content/uploads/2020/10/meet_2-kompres-1030x616.jpg" tabindex="0" role="button" class="aligncenter wp-image-4561" src="https://inero-software.com/wp-content/uploads/2020/10/meet_2-kompres.jpg" alt="Route on the map" width="1229" height="735" srcset="https://inero-software.com/wp-content/uploads/2020/10/meet_2-kompres.jpg 1299w, https://inero-software.com/wp-content/uploads/2020/10/meet_2-kompres-300x179.jpg 300w, https://inero-software.com/wp-content/uploads/2020/10/meet_2-kompres-1030x616.jpg 1030w, https://inero-software.com/wp-content/uploads/2020/10/meet_2-kompres-768x459.jpg 768w, https://inero-software.com/wp-content/uploads/2020/10/meet_2-kompres-502x300.jpg 502w" sizes="(max-width: 1229px) 100vw, 1229px" /></p>
<p><img loading="lazy" decoding="async" data-attachment-id="3007" data-permalink="https://inero-software.com/redistribution-supply-chain-network/meet_1/" data-orig-file="https://inero-software.com/wp-content/uploads/2020/10/meet_1.png" data-orig-size="1231,803" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="meet_1" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2020/10/meet_1-300x196.png" data-large-file="https://inero-software.com/wp-content/uploads/2020/10/meet_1-1030x672.png" tabindex="0" role="button" class="aligncenter wp-image-3007 size-full" src="https://inero-software.com/wp-content/uploads/2020/10/meet_1.png" alt="routes on the map" width="1231" height="803" srcset="https://inero-software.com/wp-content/uploads/2020/10/meet_1.png 1231w, https://inero-software.com/wp-content/uploads/2020/10/meet_1-300x196.png 300w, https://inero-software.com/wp-content/uploads/2020/10/meet_1-768x501.png 768w, https://inero-software.com/wp-content/uploads/2020/10/meet_1-1030x672.png 1030w, https://inero-software.com/wp-content/uploads/2020/10/meet_1-460x300.png 460w" sizes="(max-width: 1231px) 100vw, 1231px" /></p>
<p><span data-contrast="auto">The figure below shows the location of meeting points on the Monday route for drivers&#8217; routes (</span><i><span data-contrast="auto">Szczecin &#8211; Gdańsk</span></i><span data-contrast="auto">) and (</span><i><span data-contrast="auto">Wrocław &#8211; Legionowo</span></i><span data-contrast="auto">).  </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>
<p><span data-contrast="auto">Cargo swap points have been given a unique id to include them along the route.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="1" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">(</span><i><span data-contrast="auto">Szczecin – Gdańsk</span></i><span data-contrast="auto">)</span><span data-contrast="auto"> &#8211; 100,</span><span data-ccp-props="{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></li>
<li data-leveltext="" data-font="Symbol" data-listid="1" aria-setsize="-1" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">(</span><i><span data-contrast="auto">Legionowo – Wrocław</span></i><span data-contrast="auto">)</span><span data-contrast="auto"> &#8211; 101.</span></li>
</ul>
<p><img loading="lazy" decoding="async" data-attachment-id="3010" data-permalink="https://inero-software.com/redistribution-supply-chain-network/plan_2/" data-orig-file="https://inero-software.com/wp-content/uploads/2020/10/plan_2.png" data-orig-size="1893,163" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="plan_2" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2020/10/plan_2-300x26.png" data-large-file="https://inero-software.com/wp-content/uploads/2020/10/plan_2-1030x89.png" tabindex="0" role="button" class="aligncenter wp-image-3010 size-full" src="https://inero-software.com/wp-content/uploads/2020/10/plan_2.png" alt="routes on the map" width="1893" height="163" srcset="https://inero-software.com/wp-content/uploads/2020/10/plan_2.png 1893w, https://inero-software.com/wp-content/uploads/2020/10/plan_2-300x26.png 300w, https://inero-software.com/wp-content/uploads/2020/10/plan_2-768x66.png 768w, https://inero-software.com/wp-content/uploads/2020/10/plan_2-1030x89.png 1030w, https://inero-software.com/wp-content/uploads/2020/10/plan_2-1400x121.png 1400w" sizes="(max-width: 1893px) 100vw, 1893px" /></p>
<p><span class="TextRun SCXW247470407 BCX0" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SCXW247470407 BCX0">As you can see, meetings are held at designated times. Thanks to this operation, we exchange goods between larger areas, and in the next days we can distribute it to other locations.</span></span><span class="EOP SCXW247470407 BCX0" data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><strong><span style="color: #800080;">Solution</span></strong></h3>
<p><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<p><span class="TextRun SCXW104707151 BCX0" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SCXW104707151 BCX0">In our solutions, we use <a href="https://inero-software.com/machine-learning-professionals/">methods and techniques of artificial intelligence to model the problem of redistribution of goods</a> and then optimize the commodities flow in distributed network. In situations where a large amount of calculations is required, various heuristic methods come to the rescue. They allow to </span></span><span class="TextRun SCXW104707151 BCX0" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SCXW104707151 BCX0">minimize</span></span><span class="TextRun SCXW104707151 BCX0" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SCXW104707151 BCX0"> calculation costs and speeding up finding the optimal solution. Heuristic searches are suitable for complex problems. The </span></span><span class="TextRun SCXW104707151 BCX0" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SCXW104707151 BCX0">artificial intelligence estimates quality of available solutions</span></span><span class="TextRun SCXW104707151 BCX0" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SCXW104707151 BCX0">, and every iteration </span></span><span class="TextRun SCXW104707151 BCX0" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SCXW104707151 BCX0">improves </span></span><span class="TextRun SCXW104707151 BCX0" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SCXW104707151 BCX0">output result.</span></span><span class="TextRun SCXW104707151 BCX0" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SCXW104707151 BCX0"> </span></span><span class="TextRun SCXW104707151 BCX0" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SCXW104707151 BCX0">I</span></span><span class="TextRun SCXW104707151 BCX0" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SCXW104707151 BCX0">n the case of a logistic redistribution network, every step of the</span></span><span class="TextRun SCXW104707151 BCX0" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SCXW104707151 BCX0"> optimization</span></span><span class="TextRun SCXW104707151 BCX0" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SCXW104707151 BCX0">, extends the resulting node (i.e. in our case the route) with the node with the lowest value of the predefined evaluation function.</span></span><span class="EOP SCXW104707151 BCX0" data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>
<p><span data-contrast="auto">In our solutions, for example, we use the greedy algorithm. The model at each step makes the optimal choice at the moment, based on the given evaluation function. In the case of transport problems, it will certainly be the number of kilometres imposed converted into costs compared to the current fuel price. The algorithm, by adding new customers along the route, makes the optimal </span><span data-contrast="auto">decision</span><span data-contrast="auto">, i.e. the cheapest one at the moment.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>
<p><span data-contrast="auto">The simplest form of the evaluation function can be defined as:</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>
<pre>cost = new_distance - current_distance</pre>
<p>where:</p>
<p><em>new_distance</em><span data-contrast="auto"> – total distance to the new point from the driver’s location,</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>
<p><span data-contrast="auto"><em>current_distance</em> –</span><span data-contrast="auto"> current distance, from the driver&#8217;s location to the actually last point.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><strong><span style="color: #800080;">Summary</span></strong></h3>
<p><span style="text-indent: 0em;" data-contrast="auto">The use of IT systems supporting the supply chain redistribution network definitely allows for an optimized flow of goods. In addition, it can provide many additional analytical tools, such as:</span><span style="text-indent: 0em;" data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="15" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">order and invoice reports,</span></li>
<li data-leveltext="" data-font="Symbol" data-listid="15" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">archiving statistics,</span></li>
<li data-leveltext="" data-font="Symbol" data-listid="15" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">delivery time information system,</span><span data-ccp-props="{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></li>
</ul>
<p><span data-contrast="auto">and many others tailored to customer needs&#8230;</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<p>Artykuł <a href="https://inero-software.com/redistribution-supply-chain-network/">Redistribution supply chain network</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2998</post-id>	</item>
	</channel>
</rss>
