In Odoo’s flexible interface, the Kanban view serves as a powerful visual tool for managing records through different workflow stages. However, standard Odoo implementations often present all stages to all users, which can create confusion when different user roles need to see only relevant workflow stages. This comprehensive guide walks you through implementing conditional Kanban stage visibility in Odoo 15, allowing you to tailor the user experience based on specific criteria like user roles, record states, or custom business rules.

Why Control Kanban Stage Visibility?

Before diving into implementation, let’s understand why this capability matters:

  • Reduced Cognitive Load: Users only see stages relevant to their current responsibilities
  • Streamlined Workflows: Prevents users from attempting actions they shouldn’t perform
  • Enhanced Security: Hides stages that might expose sensitive workflow information
  • Improved User Experience: Creates a cleaner, more focused interface for each user type

Unlike simply hiding fields or buttons, stage visibility control operates at the data level—ensuring users never even see stages they shouldn’t interact with, rather than just disabling them after they appear.

Behind the Scenes: How Kanban Stage Visibility Works

Understanding Odoo’s underlying architecture is crucial for implementing this feature correctly. Here’s what happens behind the scenes when controlling Kanban stage visibility:

The Core Approach: Intercepting Data Retrieval

Odoo’s Kanban view displays stages by retrieving data through two critical methods:

  • read_group() – Used to fetch the grouped data for Kanban columns
  • search() – Used to fetch records within each stage

This happens by overriding these methods to filter out unwanted stages before the data reaches the user interface. This approach ensures:

  • Stages are hidden at the data layer, not just visually
  • No unnecessary database queries for hidden stages
  • Complete separation of concerns (business logic stays in Python)
  • Compatibility with Odoo’s standard caching mechanisms

Visual Representation of the Data Flow

The approach is

User Request


Odoo Controller


[read_group() & search() methods] ← Your custom logic lives here
(Data filtering happens here)

Filtered Data


Kanban View Renderer


Browser (Only shows permitted stages)


This approach provides significant advantages over client-side filtering:

  • Security: Hidden stages never reach the browser
  • Performance: Reduced data payload improves loading times
  • Consistency: Works across all entry points (not just the main view)

Implementation Guide

Let’s walk through implementing conditional stage visibility in your Odoo 15 module. We’ll focus on a common use case: hiding specific stages based on user roles.

Step 1: Identifying the Target Model

First, identify which model’s Kanban view you want to modify. In our example, we’ll work with a custom model called project.task (though the same principles apply to any model with stages).
Create a new file in your module: models/project_task.py

Step 2: Overriding read_group() Method

The read_group() method is responsible for retrieving the stage groups that become your Kanban columns. This is where we’ll filter out unwanted stages:

from odoo import api, models, _

class ProjectTask(models.Model):
    _inherit = 'project.task'
    
    @api.model
    def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True):
        # First, call the parent method to get the standard results
        result = super(ProjectTask, self).read_group(
            domain, fields, groupby, offset=offset, 
            limit=limit, orderby=orderby, lazy=lazy
        )
        
        # Only apply our filtering when grouping by stage_id
        if 'stage_id' in groupby:
            # Get the stage we want to potentially hide
            restricted_stage = self.env.ref('your_module_name.restricted_stage_key', raise_if_not_found=False)
            
            # Determine if current user should see this stage
            # In this example, we're checking if user is in a specific group
            user_can_see_restricted = self.env.user.has_group('your_module_name.group_admin')
            
            # If we found the stage and user shouldn't see it, filter it out
            if restricted_stage and not user_can_see_restricted:
                # Filter out the restricted stage from results
                result = [r for r in result 
                         if not r.get('stage_id') or r['stage_id'][0] != restricted_stage.id]
        
        return result

Step 3: Overriding search() Method

The read_group() method handles the column headers, but the search() method retrieves the actual records within each stage. We need to override this too to prevent records from appearing in hidden stages:

@api.model
def search(self, domain, offset=0, limit=None, order=None, count=False):
    # Get the stage we want to potentially hide
    restricted_stage = self.env.ref('your_module_name.restricted_stage_key', raise_if_not_found=False)
    
    # Determine if current user should see this stage
    user_can_see_restricted = self.env.user.has_group('your_module_name.group_admin')
    
    # If stage exists and user shouldn't see it, modify the domain
    if restricted_stage and not user_can_see_restricted:
        # Add condition to exclude the restricted stage
        new_domain = domain + [('stage_id', '!=', restricted_stage.id)]
        return super(ProjectTask, self).search(
            new_domain, offset=offset, 
            limit=limit, order=order, count=count
        )
    
    # Otherwise, proceed with standard search
    return super(ProjectTask, self).search(
        domain, offset=offset, 
        limit=limit, order=order, count=count
    )

Key Design Decisions Explained:

  • Two-Point Filtering: By overriding both read_group() and search(), we ensure:
    • The stage column never appears (read_group)
    • Records never appear in that column (search)
  • Reference-Based Stage Identification: Using env.ref() with XML IDs makes the code:
    • More maintainable (no hardcoded IDs)
    • Safer (fails gracefully if stage doesn’t exist)
    • Clearer (shows the stage’s purpose via its key)
  • Conditional Application: The filtering only applies when:
    • The stage exists in the database
    • The specific condition (user group check) is met

Step 4: Creating Custom Action with Pre-Filtered Domain

Sometimes you need a dedicated action that always shows filtered stages. Here’s how to create one:

@api.model
def action_filtered_tasks(self):
    """Action to open tasks with restricted stage filtered out"""
    # Determine if current user should see restricted stage
    user_can_see_restricted = self.env.user.has_group('your_module_name.group_admin')
    
    # Get the restricted stage
    restricted_stage = self.env.ref('your_module_name.restricted_stage_key', raise_if_not_found=False)
    
    # Build domain
    domain = []
    if restricted_stage and not user_can_see_restricted:
        domain = [('stage_id', '!=', restricted_stage.id)]
    
    # Build context
    context = {
        'group_by': 'stage_id',
        'default_view_mode': 'kanban',
        'user_can_see_restricted': user_can_see_restricted,
    }
    
    return {
        'name': _('My Tasks'),
        'type': 'ir.actions.act_window',
        'res_model': 'project.task',
        'view_mode': 'kanban,tree,form',
        'views': [
            (self.env.ref('your_module_name.view_task_kanban').id, 'kanban'),
            (False, 'tree'),
            (False, 'form')
        ],
        'domain': domain,
        'context': context,
        'help': '''<p class="o_view_nocontent_smiling_face">No tasks found!</p>
                <p>Only tasks in visible stages are displayed here.</p>''',
    }

Advanced Implementation Scenarios

Scenario 1: Hiding Stages Based on Record Properties

Sometimes you need to hide stages based on properties of the records themselves, not just user roles:

@api.model
def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True):
    result = super().read_group(domain, fields, groupby, offset, limit, orderby, lazy)
    
    if 'stage_id' in groupby:
        # Get current user's department
        user_department = self.env.user.department_id
        
        # Find stages associated with departments
        department_stages = self.env['project.task.stage'].search([
            ('department_ids', '!=', False)
        ])
        
        # Filter out stages not relevant to user's department
        if department_stages and user_department:
            result = [
                r for r in result 
                if not r.get('stage_id') or 
                not self.env['project.task.stage'].browse(r['stage_id'][0]).department_ids or
                user_department in self.env['project.task.stage'].browse(r['stage_id'][0]).department_ids
            ]
    
    return result

Scenario 2: Context-Based Stage Visibility

You might want different visibility rules depending on how the view is accessed:

@api.model
def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True):
    result = super().read_group(domain, fields, groupby, offset, limit, orderby, lazy)
    
    if 'stage_id' in groupby:
        # Check if we're in a specific context
        if self.env.context.get('hide_restricted_stages', True):
            restricted_stage = self.env.ref('your_module_name.restricted_stage', False)
            if restricted_stage:
                result = [r for r in result 
                         if not r.get('stage_id') or r['stage_id'][0] != restricted_stage.id]
    
    return result


This allows you to control visibility through URL parameters or action contexts.

Best Practices and Considerations

Performance Optimization

  • Cache Reference Lookups: If you’re using the same stage references repeatedly, cache them at the class level
  • Minimize Database Queries: Avoid making database calls inside loops
  • Use Efficient Filtering: Prefer list comprehensions over multiple filter calls
# Good practice: Cache the stage reference
RESTRICTED_STAGE_ID = None

@api.model
def _get_restricted_stage_id(self):
    global RESTRICTED_STAGE_ID
    if RESTRICTED_STAGE_ID is None:
        stage = self.env.ref('your_module_name.restricted_stage', raise_if_not_found=False)
        RESTRICTED_STAGE_ID = stage.id if stage else None
    return RESTRICTED_STAGE_ID

@api.model
def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True):
    result = super().read_group(domain, fields, groupby, offset, limit, orderby, lazy)
    
    if 'stage_id' in groupby:
        restricted_stage_id = self._get_restricted_stage_id()
        if restricted_stage_id and not self.user_can_access_restricted():
            result = [r for r in result 
                     if not r.get('stage_id') or r['stage_id'][0] != restricted_stage_id]
    
    return result

Error Handling and Graceful Degradation

Always design your code to work even if stages are missing:

@api.model
def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True):
    result = super().read_group(domain, fields, groupby, offset, limit, orderby, lazy)
    
    if 'stage_id' in groupby:
        try:
            # Attempt to get the stage
            restricted_stage = self.env.ref('your_module_name.restricted_stage')
            
            # Only filter if user shouldn't see it
            if not self.user_can_see_restricted():
                result = [r for r in result 
                         if not r.get('stage_id') or r['stage_id'][0] != restricted_stage.id]
        except ValueError:
            # Stage doesn't exist - proceed without filtering
            pass
    
    return result

Conclusion

Implementing conditional Kanban stage visibility in Odoo 15 is a powerful way to tailor the user experience to specific roles and scenarios. By understanding and properly overriding the read_group() and search() methods, you can create a more focused, efficient interface that guides users through appropriate workflows while hiding irrelevant options.

The key to success lies in:

  • Understanding Odoo’s underlying data flow
  • Implementing filtering at the appropriate data layer
  • Handling edge cases and missing references gracefully
  • Optimizing for performance in your filtering logic

When done correctly, this technique significantly enhances user experience without compromising data integrity or security. Your users will appreciate the cleaner interface, and your business processes will benefit from reduced errors and more focused workflows.

Remember that the most effective implementations are those that blend seamlessly into the Odoo experience—users shouldn’t even notice the filtering is happening, they’ll just find their interface more intuitive and relevant to their daily tasks.

In today’s fast-paced business world, companies are always on the lookout for ways to streamline operations and boost productivity. One effective solution gaining popularity is Employee Self-Service (ESS) systems. Let’s dive into what ESS is, how it works, essential features to consider, and the benefits it offers. Plus, we’ll highlight how our OfficeKit HR software incorporates ESS.

What is Employee Self-Service?

Employee Self-Service (ESS) puts power in employees’ hands by allowing them to manage various aspects of their job without constant HR involvement. From updating personal details to checking pay stubs and requesting time off, ESS makes it easy, all through a user-friendly interface.

What is an Employee Self-Service Portal?

Think of an Employee Self-Service portal as a one-stop shop for employees to access ESS features. It’s like their own secure online hub where they can manage their info, submit requests, and communicate with HR hassle-free.

How Do Employee Self-Service Portals Work?

These portals seamlessly integrate with your company’s existing HR systems. Employees simply log in with their credentials to access a range of features tailored to their needs, like updating personal info or checking their schedules.

Key Features of ESS Systems

When choosing an ESS system, keep an eye out for features such as:

  1. Personal Information Management: Allows employees to update their contact details, emergency contacts, and other personal info.
  2. Time and Attendance Tracking: Allowing them to view work schedules, clock in/out, and request time off with ease.
  3. Payroll and Benefit Management: Giving employees access to pay stubs, tax forms, and allowing them to enroll and manage benefits such as health insurance, retirement plans, and flexible spending accounts.
  4. Performance Management: Helping employees set goals, track their progress, and participate in performance reviews.
  5. Communication Tools: Providing channels to submit queries, and receive updates from HR.

Benefits of Implementing ESS Systems

Implementing an ESS system offers numerous benefits, including:

  1. Efficiency: By automating tasks, you reduce the workload on HR.
  2. Engagement: Empowering employees fosters a sense of ownership and engagement.
  3. Accessibility: Available anytime, anywhere, ESS makes life easier for remote and on-the-go employees.
  4. Data Accuracy: With employees updating their info directly, you can say goodbye to errors.
  5. Cost Savings: Less paperwork means lower costs and more time for strategic initiatives.
  6. Compliance and Security: Rest easy knowing your data is secure and compliant with regulations.

OfficeKit HR’s Employee Self-Service Feature

At Acugence, we understand the importance of empowering employees and simplifying HR processes. Our HR software, OfficeKit HR’s ESS feature is designed to simplify HR processes and put employees in the driver’s seat. From managing personal info to accessing pay stubs and requesting time off, it’s all there on one secure platform. Plus, it’s easy to use and keeps your data safe.

In conclusion, implementing an Employee Self-Service system can revolutionize your business. With the right system in place, you can empower your workforce, boost productivity, and stay ahead of the competition. Ready to see the difference OfficeKit HR can make for your business? Contact us for a demo today!

In the fast-paced corporate world of Qatar, staying ahead of administrative tasks is vital for business success. With advancements in technology, HR professionals are turning to automation solutions to streamline their processes. One such powerful tool in the market is Office Kit HR, a mobile application designed to automate all administrative tasks from the hiring of an employee to their retirement.

How do you automate HR processes?

Office Kit HR simplifies the intricate web of HR responsibilities by providing a comprehensive suite of automation features. Through this intuitive mobile application, HR professionals can automate the entire employee lifecycle management process. The platform allows seamless digital onboarding, enabling new hires to fill out forms, submit documents, and complete necessary training, all within a few clicks on their mobile devices. The automation of these processes not only saves HR professionals time, but allows them to focus on more strategic tasks. With the Office Kit HR mobile application, businesses can ensure accuracy, save time, and reduce human errors, leading to enhanced productivity and employee satisfaction.

What is the use of a mobile application in HR functions?

The use of a mobile application in HR functions offers unparalleled convenience and accessibility. Office Kit HR’s mobile app allows HR professionals to manage tasks on the go. Whether it’s approving leave requests, accessing employee records, or generating reports, the mobile application provides real-time access to crucial HR data. This mobility ensures that HR professionals can respond promptly to employee queries, fostering a responsive and engaged workforce.

What can HR management software be used to automate?

HR management software like Office Kit HR can automate a myriad of tasks, including but not limited to:

  • Onboarding and Offboarding: Streamlining the onboarding process by automating document submission, training modules, and access provisioning. Similarly, offboarding tasks like exit interviews and equipment returns can be efficiently managed through automation.
  • Leave and Attendance Management: By automating leave requests, approvals, and tracking attendance the software reduces the administrative burden on HR staff and minimizes errors in attendance records.
  • Payroll Processing: Automating payroll calculations reduces errors and ensures employees are paid accurately and on time.
  • Performance Appraisals: Simplifies performance evaluation processes by automating performance review reminders, feedback collection, and report generation.
  • Compliance and Reporting: Helps to ensure compliance with regulations by automating the generation of compliance reports, tax documents, and other necessary paperwork.
  • Employee Self-Service: Allows employees to update their personal information, view payslips, and apply for leave through a self-service portal, reducing the need for HR intervention in routine tasks.

How to use RPA in HR?

Robotic Process Automation (RPA) is transforming HR automation. By integrating RPA into HR processes, tasks like data entry, validation, and report generation are streamlined, reducing the likelihood of errors. Office Kit HR utilizes RPA to enhance operational efficiency, enabling HR professionals to shift their focus to strategic initiatives. With RPA-powered HR automation, routine tasks are handled quickly and accurately, allowing the HR team to concentrate on vital aspects of talent management and employee engagement.

Tailored for Qatari Clients in Arabic

What sets Office Kit HR apart is its localization for Qatari clients. The software is designed in Arabic, catering specifically to the language preferences of Qatari businesses. Understanding the unique needs of the local market, Office Kit HR is tailored to align with the cultural nuances and business practices of Qatar. This localization ensures that Qatari clients can seamlessly integrate the software into their HR operations, enhancing efficiency while maintaining alignment with local customs and language preferences.

In conclusion, Office Kit HR stands as a beacon of innovation in the realm of HR automation. Its user-friendly interface, coupled with robust automation capabilities, empowers HR professionals to manage the entire employee lifecycle seamlessly. By automating HR processes and harnessing the power of RPA, organizations can achieve unprecedented efficiency, accuracy, and compliance in their HR operations.

Ready to transform your HR department? Explore the endless possibilities with Office Kit HR, and experience the future of HR automation today.

In the fast-paced world of sales, smooth operations and efficient workflows are the keys to success. For businesses in Qatar, a cutting-edge solution has emerged – DR. SALES. This advanced mobile application serves as a complete sales-force workflow automation tool, addressing the intricate needs of the modern sales landscape.

What is Van Sales Software?

Van sales software is the backbone of businesses engaged in mobile sales operations. It transforms ordinary delivery vans into fully functional sales hubs. These software solutions empower sales representatives to conduct transactions, manage inventory, and provide immediate services, all from the convenience of their delivery vehicles. In Qatar, where market dynamics are ever-changing, van sales software like DR. SALES is redefining how businesses operate on the move.

Fully Integrated Supply Chain Management System

DR. Sales goes beyond traditional van sales software by offering a fully integrated supply chain management system. Businesses can manage their inventory, track product movement, and optimize stock levels seamlessly. This software makes sure businesses have the right product at the right time, reducing wastage and maximizing profits. With DR. Sales, Qatari businesses can streamline their entire supply chain, from procurement to delivery, leading to enhanced operational efficiency.

Fleet Management: Seamlessly Incorporated

One of the standout features of DR. Sales is its incorporation of fleet management capabilities. Managing a fleet of vehicles efficiently is essential for timely deliveries and customer satisfaction. DR. Sales provides businesses with real-time insights into their fleet, allowing them to track vehicle locations, monitor fuel consumption, and schedule maintenance tasks. By optimizing their fleet operations, businesses can ensure timely deliveries, reduce operational costs, and enhance the overall customer experience.

Elevating Shop Visits: Advanced Monitoring and Insights

What sets DR. SALES apart are its advanced monitoring capabilities during shop visits. It empowers sales representatives to efficiently plan their routes and shop visits. This application makes sure they have the right stocks customized to each client’s needs. Coupled with its advanced capabilities such as precise location tracking, effective management of credit card limits, mapping of credit ages, and instantaneous sales tracking, the application offers invaluable insights during shop visits. In addition to optimizing time management, these features empower sales executives to make better decisions based on data. The ability to track locations guarantees punctual deliveries, while credit limit management and age mapping provide essential data for strategic planning. Furthermore, real-time sales tracking allows businesses to monitor their performance instantly and adjust strategies as needed, ensuring ongoing growth and customer satisfaction.

In conclusion, DR. SALES isn’t just a mobile application; it’s a transformative force in Qatar’s sales landscape. By embracing its features – from unified platforms to advanced monitoring and seamless integrations – businesses are poised to revolutionize their operations and delight their customers.

Ready to redefine your sales strategy? Explore the power of DR. SALES, your gateway to a future where efficiency meets excellence in every sale.