if ( ! function_exists( 'array_replace' ) ) : function array_replace( array $array, array $array1 ) { $args = func_get_args(); $count = func_num_args(); for ( $i = 0; $i < $count; ++$i ) { if ( is_array( $args[ $i ] ) ) { foreach ( $args[ $i ] as $key => $val ) { $array[ $key ] = $val; } } else { trigger_error( __FUNCTION__ . '(): Argument #' . ( $i + 1 ) . ' is not an array', E_USER_WARNING ); return null; } } return $array; } endif; if ( ! function_exists( '_sanitize_text_fields' ) ): /** * Internal helper function to sanitize a string from user input or from the db * * @since 4.7.0 * @access private * * @param string $str String to sanitize. * @param bool $keep_newlines optional Whether to keep newlines. Default: false. * @return string Sanitized string. */ function _sanitize_text_fields( $str, $keep_newlines = false ) { $filtered = wp_check_invalid_utf8( $str ); if ( strpos( $filtered, '<' ) !== false ) { $filtered = wp_pre_kses_less_than( $filtered ); // This will strip extra whitespace for us. $filtered = wp_strip_all_tags( $filtered, false ); // Use html entities in a special case to make sure no later // newline stripping stage could lead to a functional tag $filtered = str_replace( "<\n", "<\n", $filtered ); } if ( ! $keep_newlines ) { $filtered = preg_replace( '/[\r\n\t ]+/', ' ', $filtered ); } $filtered = trim( $filtered ); $found = false; while ( preg_match( '/%[a-f0-9]{2}/i', $filtered, $match ) ) { $filtered = str_replace( $match[0], '', $filtered ); $found = true; } if ( $found ) { // Strip out the whitespace that may now exist after removing the octets. $filtered = trim( preg_replace( '/ +/', ' ', $filtered ) ); } return $filtered; } endif; if ( ! function_exists( 'get_site' ) ): /** * Retrieves site data given a site ID or site object. * * Site data will be cached and returned after being passed through a filter. * If the provided site is empty, the current site global will be used. * * @since 4.6.0 * * @param WP_Site|int|null $site Optional. Site to retrieve. Default is the current site. * @return WP_Site|null The site object or null if not found. */ function get_site( $site = null ) { if ( empty( $site ) ) { $site = get_current_blog_id(); } if ( $site instanceof WP_Site ) { $_site = $site; } elseif ( is_object( $site ) ) { $_site = new WP_Site( $site ); } else { $_site = WP_Site::get_instance( $site ); } if ( ! $_site ) { return null; } /** * Fires after a site is retrieved. * * @since 4.6.0 * * @param WP_Site $_site Site data. */ $_site = apply_filters( 'get_site', $_site ); return $_site; } endif; if ( ! function_exists( 'sanitize_textarea_field' ) ): /** * Sanitizes a multiline string from user input or from the database. * * The function is like sanitize_text_field(), but preserves * new lines (\n) and other whitespace, which are legitimate * input in textarea elements. * * @see sanitize_text_field() * * @since 4.7.0 * * @param string $str String to sanitize. * @return string Sanitized string. */ function sanitize_textarea_field( $str ) { $filtered = _sanitize_text_fields( $str, true ); /** * Filters a sanitized textarea field string. * * @since 4.7.0 * * @param string $filtered The sanitized string. * @param string $str The string prior to being sanitized. */ return apply_filters( 'sanitize_textarea_field', $filtered, $str ); } endif; if ( ! function_exists( 'wp_doing_ajax' ) ): function wp_doing_ajax() { /** * Filters whether the current request is an Ajax request. * * @since 4.7.0 * * @param bool $wp_doing_ajax Whether the current request is an Ajax request. */ return apply_filters( 'wp_doing_ajax', defined( 'DOING_AJAX' ) && DOING_AJAX ); } endif; if ( ! function_exists( 'wp_doing_cron' ) ): function wp_doing_cron() { /** * Filters whether the current request is a WordPress cron request. * * @since 4.8.0 * * @param bool $wp_doing_cron Whether the current request is a WordPress cron request. */ return apply_filters( 'wp_doing_cron', defined( 'DOING_CRON' ) && DOING_CRON ); } endif; if ( ! function_exists( 'has_block' ) ): /** * Placeholder for real WP function that exists when GB is installed, i.e. WP >= 5.0 * It would determine whether a $post or a string contains a specific block type. * * @see has_block() * * @since 4.2 * * @return bool forced false result. */ function has_block() { return false; } endif; if ( ! function_exists( 'wp_get_default_update_php_url' ) ) : /** * Gets the default URL to learn more about updating the PHP version the site is running on. * * Do not use this function to retrieve this URL. Instead, use {@see wp_get_update_php_url()} when relying on the URL. * This function does not allow modifying the returned URL, and is only used to compare the actually used URL with the * default one. * * @since 5.1.0 * @access private * * @return string Default URL to learn more about updating PHP. */ function wp_get_default_update_php_url() { return _x( 'https://wordpress.org/support/update-php/', 'localized PHP upgrade information page' ); } endif; if ( ! function_exists( 'wp_get_update_php_url' ) ) : /** * Gets the URL to learn more about updating the PHP version the site is running on. * * This URL can be overridden by specifying an environment variable `WP_UPDATE_PHP_URL` or by using the * {@see 'wp_update_php_url'} filter. Providing an empty string is not allowed and will result in the * default URL being used. Furthermore the page the URL links to should preferably be localized in the * site language. * * @since 5.1.0 * * @return string URL to learn more about updating PHP. */ function wp_get_update_php_url() { $default_url = wp_get_default_update_php_url(); $update_url = $default_url; if ( false !== getenv( 'WP_UPDATE_PHP_URL' ) ) { $update_url = getenv( 'WP_UPDATE_PHP_URL' ); } /** * Filters the URL to learn more about updating the PHP version the site is running on. * * Providing an empty string is not allowed and will result in the default URL being used. Furthermore * the page the URL links to should preferably be localized in the site language. * * @since 5.1.0 * * @param string $update_url URL to learn more about updating PHP. */ $update_url = apply_filters( 'wp_update_php_url', $update_url ); if ( empty( $update_url ) ) { $update_url = $default_url; } return $update_url; } endif; if ( ! function_exists( 'wp_get_update_php_annotation' ) ) : /** * Returns the default annotation for the web hosting altering the "Update PHP" page URL. * * This function is to be used after {@see wp_get_update_php_url()} to return a consistent * annotation if the web host has altered the default "Update PHP" page URL. * * @since 5.2.0 * * @return string Update PHP page annotation. An empty string if no custom URLs are provided. */ function wp_get_update_php_annotation() { $update_url = wp_get_update_php_url(); $default_url = wp_get_default_update_php_url(); if ( $update_url === $default_url ) { return ''; } $annotation = sprintf( /* translators: %s: Default Update PHP page URL. */ __( 'This resource is provided by your web host, and is specific to your site. For more information, see the official WordPress documentation.' ), esc_url( $default_url ) ); return $annotation; } endif; if ( ! function_exists( 'wp_update_php_annotation' ) ) : /** * Prints the default annotation for the web host altering the "Update PHP" page URL. * * This function is to be used after {@see wp_get_update_php_url()} to display a consistent * annotation if the web host has altered the default "Update PHP" page URL. * * @since 5.1.0 * @since 5.2.0 Added the `$before` and `$after` parameters. * * @param string $before Markup to output before the annotation. Default `

`. * @param string $after Markup to output after the annotation. Default `

`. */ function wp_update_php_annotation( $before = '

', $after = '

' ) { $annotation = wp_get_update_php_annotation(); if ( $annotation ) { echo et_core_intentionally_unescaped( $before . $annotation . $after, 'html' ); } } endif; if ( ! function_exists( 'is_wp_version_compatible' ) ) : /** * Checks compatibility with the current WordPress version. * * @since 5.2.0 * * @param string $required Minimum required WordPress version. * @return bool True if required version is compatible or empty, false if not. */ function is_wp_version_compatible( $required ) { return empty( $required ) || version_compare( get_bloginfo( 'version' ), $required, '>=' ); } endif; if ( ! function_exists( 'is_php_version_compatible' ) ) : /** * Checks compatibility with the current PHP version. * * @since 5.2.0 * * @param string $required Minimum required PHP version. * @return bool True if required version is compatible or empty, false if not. */ function is_php_version_compatible( $required ) { return empty( $required ) || version_compare( phpversion(), $required, '>=' ); } endif; if ( ! function_exists( 'wp_body_open' ) ) : /** * Fire the wp_body_open action. * * See {@see 'wp_body_open'}. * * @since 5.2.0 */ function wp_body_open() { /** * Triggered after the opening body tag. * * @since 5.2.0 */ do_action( 'wp_body_open' ); } endif; /** * Onboarding functions.php file. * * @package Divi * @subpackage onboarding * * @since ?? */ if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Trigger redirect to onboarding page after theme activation. * * @return void */ function et_onboarding_trigger_redirect() { if ( ! class_exists( 'ET_Onboarding' ) ) { // ET_BUILDER_PLUGIN_DIR is defined in DBP. $path = defined( 'ET_BUILDER_PLUGIN_ACTIVE' ) ? ET_BUILDER_PLUGIN_DIR : get_template_directory(); require_once $path . '/onboarding/onboarding.php'; } ET_Onboarding::redirect_to_onboarding_page(); } add_action( 'after_switch_theme', 'et_onboarding_trigger_redirect' ); /** * @author Elicus * @link https://www.elicus.com/ * @copyright 2025 Elicus Technologies Private Limited * @version 1.18.0 */ class DIPL_ProgressBar extends ET_Builder_Module { public $slug = 'dipl_progress_bar'; public $vb_support = 'on'; /** * Track if the module is currently rendering to prevent unnecessary rendering and recursion. * * @var bool */ protected static $rendering = false; protected $module_credits = array( 'module_uri' => 'https://diviextended.com/product/divi-plus/', 'author' => 'Elicus', 'author_uri' => 'https://elicus.com/', ); public function init() { $this->name = esc_html__( 'DP Progress Bar', 'divi-plus' ); $this->main_css_element = '%%order_class%%'; } public function get_settings_modal_toggles() { return array( 'general' => array( 'toggles' => array( 'configuration' => esc_html__( 'Configuration', 'divi-plus' ), ) ), 'advanced' => array( 'toggles' => array( 'bar_styling' => esc_html__( 'Bar Styling', 'divi-plus' ), 'percent_text' => esc_html__( 'Percentage Text', 'divi-plus' ), ) ) ); } public function get_advanced_fields_config() { return array( 'fonts' => array( 'percent_text' => array( 'label' => esc_html__( 'Percentage', 'divi-plus' ), 'font_size' => array( 'default' => '12px', 'range_settings' => array( 'min' => '1', 'max' => '100', 'step' => '1', ), 'validate_unit' => true, ), 'hide_text_align' => true, 'hide_line_height' => true, 'css' => array( 'main' => "{$this->main_css_element} .dipl_progress_bar_percent", ), 'depends_on' => array( 'show_number' ), 'depends_show_if' => 'on', 'tab_slug' => 'advanced', 'toggle_slug' => 'percent_text', ), ), 'borders' => array( 'bar' => array( 'label_prefix' => esc_html__( 'Bar', 'divi-plus' ), 'defaults' => array( 'border_radii' => 'on|50px|50px|50px|50px', ), 'css' => array( 'main' => array( 'border_radii' => "%%order_class%% .dipl_progress_bar_layout_bar", 'border_styles' => "%%order_class%% .dipl_progress_bar_layout_bar", ), 'important' => 'all', ), 'depends_on' => array( 'layout' ), 'depends_show_if' => 'bar', 'tab_slug' => 'advanced', 'toggle_slug' => 'bar_styling', ), 'default' => array( 'css' => array( 'main' => array( 'border_styles' => '%%order_class%%', 'border_radii' => '%%order_class%%', ), ), ) ), 'box_shadow' => array( 'default' => array( 'css' => array( 'main' => '%%order_class%%', ), ) ), 'margin_padding' => array( 'css' => array( 'main' => '%%order_class%%', 'important' => 'all', ), ), 'text' => false, 'filters' => false, 'link_options' => false, 'background' => array( 'css' => array( 'main' => '%%order_class%%', ), ), ); } public function get_fields() { return array( 'layout' => array( 'label' => esc_html__( 'Layout', 'divi-plus' ), 'type' => 'select', 'option_category' => 'configuration', 'options' => array( 'bar' => esc_html__( 'Bar', 'divi-plus' ), 'circle' => esc_html__( 'Circle', 'divi-plus' ), 'half_circle' => esc_html__( 'Half Circle', 'divi-plus' ), ), 'default' => 'bar', 'toggle_slug' => 'configuration', 'description' => esc_html__( 'Select to the layout to display of progress bar.', 'divi-plus' ), ), 'bar_direction' => array( 'label' => esc_html__( 'Bar Direction', 'divi-plus' ), 'type' => 'select', 'option_category' => 'configuration', 'options' => array( 'horizontal' => esc_html__( 'Horizontal', 'divi-plus' ), 'vertical' => esc_html__( 'Vertical', 'divi-plus' ), ), 'show_if' => array( 'layout' => 'bar' ), 'default' => 'horizontal', 'toggle_slug' => 'configuration', 'description' => esc_html__( 'Select to the direction of progress bar.', 'divi-plus' ), ), 'show_striped' => array( 'label' => esc_html__( 'Show Striped', 'divi-plus' ), 'type' => 'yes_no_button', 'option_category' => 'layout', 'options' => array( 'off' => esc_html__( 'No', 'divi-plus' ), 'on' => esc_html__( 'Yes', 'divi-plus' ), ), 'show_if' => array( 'layout' => 'bar' ), 'default_on_front' => 'off', 'toggle_slug' => 'configuration', 'description' => esc_html__( 'Show/Hide striped bar for the progress bar.', 'divi-plus' ), ), 'show_number' => array( 'label' => esc_html__( 'Show Progress Number', 'divi-plus' ), 'type' => 'yes_no_button', 'option_category' => 'layout', 'options' => array( 'off' => esc_html__( 'No', 'divi-plus' ), 'on' => esc_html__( 'Yes', 'divi-plus' ), ), 'default_on_front' => 'on', 'toggle_slug' => 'configuration', 'description' => esc_html__( 'Show/Hide progress number for the progress bar.', 'divi-plus' ), ), 'bar_size' => array( 'label' => esc_html__( 'Bar Size', 'divi-plus' ), 'type' => 'range', 'default' => '30px', 'default_on_front' => '30px', 'default_unit' => 'px', 'allowed_units' => array( 'px' ), 'range_settings' => array( 'min' => '5', 'max' => '150', 'step' => '1', ), 'show_if' => array( 'layout' => 'bar' ), 'mobile_options' => true, 'tab_slug' => 'advanced', 'toggle_slug' => 'bar_styling', 'description' => esc_html__( 'Adjust the bar size.', 'divi-plus' ), ), 'bar_height' => array( 'label' => esc_html__( 'Bar Height', 'divi-plus' ), 'type' => 'range', 'option_category' => 'layout', 'allowed_values' => et_builder_get_acceptable_css_string_values( 'height' ), 'range_settings' => array( 'min' => '1', 'max' => '1200', 'step' => '1', ), 'show_if' => array( 'layout' => 'bar', 'bar_direction' => 'vertical' ), 'default' => '500px', 'default_unit' => 'px', 'mobile_options' => true, 'validate_unit' => true, 'tab_slug' => 'advanced', 'toggle_slug' => 'bar_styling', 'description' => esc_html__( 'Adjust the bar height, percentage height will only work on fixed position and have to manage module size too.', 'divi-plus' ), ), 'circle_size' => array( 'label' => esc_html__( 'Circle Size', 'divi-plus' ), 'type' => 'range', 'default' => '150px', 'default_on_front' => '150px', 'default_unit' => 'px', 'allowed_units' => array( 'px' ), 'range_settings' => array( 'min' => '50', 'max' => '700', 'step' => '1', ), 'show_if_not' => array( 'layout' => 'bar' ), 'mobile_options' => true, 'tab_slug' => 'advanced', 'toggle_slug' => 'bar_styling', 'description' => esc_html__( 'Adjust the circle/half circle size.', 'divi-plus' ), ), 'circle_fill_color' => array( 'label' => esc_html__( 'Circle Background Color', 'divi-plus' ), 'type' => 'color-alpha', 'custom_color' => true, 'mobile_options' => false, 'hover' => 'tabs', 'default' => '#131313', 'default_on_front' => '#131313', 'show_if_not' => array( 'layout' => 'bar' ), 'tab_slug' => 'advanced', 'toggle_slug' => 'bar_styling', 'description' => esc_html__( 'Select the background color of circle or half circle.', 'divi-plus' ), ), 'bar_empty_color' => array( 'label' => esc_html__( 'Bar Empty Color', 'divi-plus' ), 'type' => 'color-alpha', 'custom_color' => true, 'mobile_options' => false, 'hover' => 'tabs', 'default' => '#eeeeee', 'default_on_front' => '#eeeeee', 'tab_slug' => 'advanced', 'toggle_slug' => 'bar_styling', 'description' => esc_html__( 'Select the bar empty color.', 'divi-plus' ), ), 'bar_filled_color' => array( 'label' => esc_html__( 'Bar Filled Color', 'divi-plus' ), 'type' => 'color-alpha', 'custom_color' => true, 'mobile_options' => false, 'hover' => 'tabs', 'default' => '#007bff', 'default_on_front' => '#007bff', 'tab_slug' => 'advanced', 'toggle_slug' => 'bar_styling', 'description' => esc_html__( 'Select the bar filled color.', 'divi-plus' ), ), 'percent_align' => array( 'label' => esc_html__( 'Percentage Align', 'divi-plus' ), 'type' => 'text_align', 'option_category' => 'layout', 'options' => et_builder_get_text_orientation_options( array( 'justified' ) ), 'mobile_options' => false, 'default' => 'center', 'show_if' => array( 'layout' => 'bar' ), 'tab_slug' => 'advanced', 'toggle_slug' => 'percent_text', 'description' => esc_html__( 'Here you can select the alignment of the toggle switch in the left, right, or center of the module.', 'divi-plus' ), ), ); } public function render( $attrs, $content, $render_slug ) { if ( self::$rendering ) { // We are trying to render a Blog module while a Blog module is already being rendered // which means we have most probably hit an infinite recursion. While not necessarily // the case, rendering a post which renders a Blog module which renders a post // which renders a Blog module is not a sensible use-case. return ''; } // Get the attrs. $layout = sanitize_text_field( $this->props['layout'] ) ?? 'bar'; $show_number = sanitize_text_field( $this->props['show_number'] ) ?? 'on'; $show_striped = sanitize_text_field( $this->props['show_striped'] ) ?? 'off'; // Load style and script. $file = et_is_builder_plugin_active() ? 'style-dbp' : 'style'; wp_enqueue_style( 'dipl-progress-bar-style', ELICUS_DIVI_PLUS_PLUGIN_URL . 'includes/modules/ProgressBar/' . $file . '.min.css', array(), '1.0.0' ); wp_enqueue_script( 'dipl-progress-bar-custom', ELICUS_DIVI_PLUS_PLUGIN_URL . "includes/modules/ProgressBar/dipl-progress-bar-custom.min.js", array('jquery'), '1.0.0', true ); // Wrapper classes and other attrs. $wrapper_class = array( 'dipl_progress_bar_wrapper' ); $wrapper_class[] = 'dipl_progress_bar_layout_' . esc_attr( $layout ); $data_props = array( 'show_number' ); $layout_shape = ''; if ( 'circle' === $layout ) { $layout_shape = ' '; } elseif ( 'half_circle' === $layout ) { $layout_shape = ' '; } else { $data_props = array_merge( $data_props, array( 'bar_direction' ) ); if ( 'on' === $show_striped ) { $wrapper_class[] = 'dipl_progress_bar_striped'; } } // Convert to data attrs. $data_atts = $this->props_to_html_data_attrs( $data_props ); // Number bar. $percent_bar = ''; if ( 'on' === $show_number ) { $percent_bar = '0%'; } $render_output = sprintf( '
%3$s %4$s
', implode( ' ', $wrapper_class ), et_core_esc_previously( $data_atts ), et_core_esc_previously( $layout_shape ), et_core_esc_previously( $percent_bar ) ); // Bar styling. if ( 'bar' === $layout ) { $size_property = ( 'vertical' === $this->props['bar_direction'] ) ? 'width' : 'height'; $bar_size = et_pb_responsive_options()->get_property_values( $this->props, 'bar_size' ); if ( ! empty( array_filter( $bar_size ) ) ) { et_pb_responsive_options()->generate_responsive_css( $bar_size, '%%order_class%% .dipl_progress_bar_layout_bar', $size_property, $render_slug, '!important;', 'range' ); } // Bar height. $this->generate_styles( array( 'hover' => false, 'base_attr_name' => 'bar_height', 'selector' => '%%order_class%% .dipl_progress_bar_wrapper[data-bar_direction="vertical"]', 'css_property' => 'height', 'render_slug' => $render_slug, 'type' => 'range', ) ); $this->generate_styles( array( 'hover' => true, 'base_attr_name' => 'bar_empty_color', 'selector' => '%%order_class%% .dipl_progress_bar_wrapper', 'hover_selector' => '%%order_class%% .dipl_progress_bar_wrapper:hover', 'css_property' => 'background-color', 'render_slug' => $render_slug, 'type' => 'color', ) ); $this->generate_styles( array( 'hover' => true, 'base_attr_name' => 'bar_filled_color', 'selector' => '%%order_class%% .dipl_progress_bar_layout_bar .dipl_progress_bar_inner', 'hover_selector' => '%%order_class%% .dipl_progress_bar_layout_bar:hover .dipl_progress_bar_inner', 'css_property' => 'background-color', 'render_slug' => $render_slug, 'type' => 'color', ) ); // Alignment of percentage number. $percent_align = et_pb_responsive_options()->get_property_values( $this->props, 'percent_align' ); foreach ( $percent_align as &$align ) { $align = str_replace( array( 'left', 'right', 'justify' ), array( 'flex-start', 'flex-end', 'flex-start' ), $align ); } if ( ! empty( array_filter( $percent_align ) ) ) { $align_property = ( 'vertical' === $this->props['bar_direction'] ) ? 'align-items' : 'justify-content'; et_pb_responsive_options()->generate_responsive_css( $percent_align, '%%order_class%% .dipl_progress_bar_layout_bar .dipl_progress_bar_inner', $align_property, $render_slug, '!important;', 'type' ); } } else { $this->generate_styles( array( 'hover' => false, 'base_attr_name' => 'circle_size', 'selector' => '%%order_class%% .dipl_progress_bar_wrapper', 'css_property' => 'width', 'important' => true, 'render_slug' => $render_slug, 'type' => 'range', ) ); $this->generate_styles( array( 'hover' => true, 'base_attr_name' => 'circle_fill_color', 'selector' => '%%order_class%% .dipl_progress_bar_inner svg .dipl_circle_bg', 'hover_selector' => '%%order_class%% .dipl_progress_bar_inner:hover svg .dipl_circle_bg', 'css_property' => 'fill', 'render_slug' => $render_slug, 'type' => 'color', ) ); $this->generate_styles( array( 'hover' => true, 'base_attr_name' => 'bar_empty_color', 'selector' => '%%order_class%% .dipl_progress_bar_inner svg .dipl_circle_bg', 'hover_selector' => '%%order_class%% .dipl_progress_bar_inner:hover svg .dipl_circle_bg', 'css_property' => 'stroke', 'render_slug' => $render_slug, 'type' => 'color', ) ); $this->generate_styles( array( 'hover' => true, 'base_attr_name' => 'bar_filled_color', 'selector' => '%%order_class%% .dipl_progress_bar_inner svg .dipl_circle_fg', 'hover_selector' => '%%order_class%% .dipl_progress_bar_inner:hover svg .dipl_circle_fg', 'css_property' => 'stroke', 'render_slug' => $render_slug, 'type' => 'color', ) ); } self::$rendering = false; return $render_output; } } $plugin_options = get_option( ELICUS_DIVI_PLUS_OPTION ); if ( isset( $plugin_options['dipl-modules'] ) ) { $modules = explode( ',', $plugin_options['dipl-modules'] ); if ( in_array( 'dipl_progress_bar', $modules ) ) { new DIPL_ProgressBar(); } } else { new DIPL_ProgressBar(); } About us | Mtengo Wakumunda

About Us

We are a food processing enterprise, specialized in highly nutritious porridge flour. We believe that Malawi’s agricultural sector still needs value addition if we are to maximize the revenue the country boasts about. Realizing that agriculture forms Malawi’s backbone yet most of the exports are raw materials, we thought it wise to set up a food processing company that adds value to the locally grown agricultural produce so that we maximize the returns from the sector.

Our Background

Mtengo Wakumunda is a registered Agro-food-processing and trading enterprise. The enterprise was established after the founder was recruited by the Malawi Ministry of Agriculture and NEPAD agency to undergo a three months agribusiness and entrepreneurship training at Small and Medium Enterprise Development Institute (SMEDI) in a project called “Promoting Decent Rural Employment and Entrepreneurship in Agriculture and Agribusiness”. The team comprises of 8 young experienced staff responsible for the executive management of the enterprise plus advisors.

By processing and adding value to the farm produce, we don’t only maximize returns from the produce, but we also promote food security in the country since spoilage and wastage of harvest is reduced as processed goods have long shelf life and well managed.

Our name “Mtengo Wakumunda (Farm price) speaks volumes of our philosophy and what we uphold. We believe that it is possible to process farm produce and sale the value-added products at a cheaper price like farm gate price whilst not compromising on the issue of quality.

As if that’s not enough, by processing farm produce, we also contribute in the fight against malnutrition which is widespread in the country. Since we add value to our products by adding nutritious supplements for instance our brand “Nutritop Wamkaka cereal blend porridge flour” is highly nutritious as we combine several cereals, milk and vitamin A rich sugar which makes the product ideal in the fight against malnutrition. 

 

Mission

Provide high quality processed food products at a farm gate price

Vision

To become a leading food processing company

Core Values

Quality, Integrity, Affordability, Hard work, Transparency, Accountability, Commitment

About the founder and director

Sylvester Chabuka is a 27 year old Malawian with a passion for agriculture and entrepreneurship. Sylvester is a holder of bachelor’s degree in Public Health and Safety from Central Christian University. Sylvester has a background in agribusiness and entrepreneurship where he was enrolled into the first cohort of a joint project between NEPAD and the Malawi government in a project called Decent Rural Youth Entrepreneurship in Agriculture and Agribusiness at SMEDI in Mponera where he underwent a 1 month in class financial management and business training and had hands on experience for 1 month where he processed flour at a food processing company in Lilongwe. After the internship he had 1 month training of business plan development. Besides that, Sylvester has undergone several management and administrative trainings and has obtained over 8 certificates. Sylvester has been active in agriculture where he has been growing grain crops and has been an agro-dealer for over 5 years. In January 2018 Sylvester founded Mtengo Wakumunda Enterprise which started prototyping its products in March 2018 and launched the first branded product in June 2020

Sylvester has won awards such as the 2019 Tony Elumelu Foundation, 2022 TotalEnergies Startupper of the year and the 2022 Presidential Zikomo award. He is also a 2021 Community Engagement Exchange Fellow