How the process of a car service facility can be automated

Car Service Process Automation

This application is about a "car service facility". The requirement on the application is to automate the "procedure" of "service". This means that the successive "steps" of the procedure are automatically forwarded from one employee to another without any kind of "manager" intervention. At any time the manager has the ability to see on what tasks (steps) the employees are engaged. He can also see what tasks are "scheduled" for the next days. After a certain period of time the manager has a complete report on what tasks each employee has been assigned, when has started and when has finished the tasks.


The requirements put on the application from the supposed "car service facility" owner, are the following:


"Every employee can take calls from customers in order to arrange a service appointment. The customer gives a name and the car number and model. A date and time are provided from our employee. The customer arrives at the facility's gate at the specified date and time. The gate personnel gives him the permission to enter. The customer goes to Chief Mechanic. Here the Chief Mechanic defines who is going to disassemble the car's engine, what are the required parts and  who is the Reassembling Mechanic. After that the Disassembling Mechanic work's on the car while at the same time the personnel on the warehouse collect's the required parts. After both of the tasks are finished the Reassembling Mechanic starts to put the parts and reassemble. While the technical personnel takes care of the customer's car he can have a coffee at the facility's cafeteria.  After the customer finishes his/her coffee and also the car is serviced the customer goes to office in order to pay and have a goodbye. That's all."


All of the above requirements are put on a coordinator agent. The action_code of the agent's is the following:




   call bpm_setprocedureowner(__activation_user)                   {.....set the procedure owner}


  {(1)....any user can put a new service request}


   callwait bpm_assign_job ( "new service request" , __activation_user , "" , 0)


   serv_id = bpm_getrecid(1,__au_step)                         {......get the record id of the service request}

   app_date = LookUp("SERV","SERV",serv_id,"ADATE","")

   customer = LookUp("SERV","SERV",serv_id,"CUSTOMER","")

   car_no = LookUp("SERV","SERV",serv_id,"CAR_NO","")


   comm = strcat(customer," with car ",car_no)

   call bpm_setprocedurecomment(comm)                             {.....set the procedures comment}


  {(2) date (app_date) the GATE SECURITY waits the customer to come for the appoinment}


   app_date_num = DateToNum(app_date)

   callwait bpm_assign_job ( "service appointment" , "" , "GATE SECURITY" , app_date_num , serv_id )


  {(3)....the CHIEF MECHANIC makes the first estimation of labor and materials, assigns a mechanic}


   callwait bpm_assign_job ( "service estimation" , "" , "CHIEF MECHANIC" , 0 , serv_id )

   disas_mechanic = LookUp("SERV","SERV",serv_id,"MECHANIC1","")     {....disassemble mechanic}

   reass_mechanic = LookUp("SERV","SERV",serv_id,"MECHANIC2","")     {....reassemble mechanic}


  {split the same time, the warehouse prepares the materials,}

   {       the mechanic starts working, the cafeteria hosts the cutomer}


   split_in_branch                                 {parallel split....the technical department does the job while in...}


      split_in_branch         {parallel split...(4) the warehouse prepares the required parts while ...}


          callwait bpm_assign_job ( "collect parts" , "" , "WAREHOUSE" , 0 , serv_id )


      and_branch               {(5).... the assigned mechanic disassebles the engine}


          callwait bpm_assign_job ( "disassemble" , disas_mechanic , "" , 0 , serv_id )




    {(6).... the assigned mechanic puts the parts and reassebles the engine}


      callwait bpm_assign_job ( "reassemble" , reass_mechanic , "" , 0 , serv_id )


   and_branch                                     {(7).... the cafeteria the customer takes a cofee}


      callwait bpm_assign_job ( "host customer" , "" , "HOSTESS" , 0 , serv_id )


   join_branches               {...the customer finished his/her coffee and the job has been done}


   {(8)....the customer goes to the office in order to pay}


   callwait bpm_assign_job ( "payment and goodbye" , "" , "OFFICE" , 0 , serv_id )





We can see the callwait (or split_in_branch) keywords. Those keywords give the opportunity to the agent to wait (until a job has been finished) or to have parallel code execution. Those are capabilities that are not presented every day in a programming language (ok script!). Notice that the callwait "calls" the user's activity as it would be a "program's subroutine". Notice also that we have flow of procedure that is defined by conditions into the code (who mechanic to assign). This is a case of ad hoc control flow (not known in advance to the programmer!)


We have to admit that the effect (coordination and historic data collection of the procedure) is far too big for the  lines of code that are written by the application programmer. To be precise the code is a little bigger (the agent contains the code that "describes" the task (activities) assigned to employees). 

The agent (agent prototype precisely) can be viewed form Right Mouse Click on Application's Background->Developer->Resources->Agent Prototypes. The system creates, for every "service" requested, a new "alive" agent that starts to execute his action_code.


Where we define users and roles?


Another issue is that the jobs are assigned to users (employees) not only by name but also (and mainly) by their roles into the company. The users and roles as they are defined into the application can be found at Menu->System->Users/Positions.


How we activate the agent?


A "new customer complaint" can be activated on the application from the "New Action" button in the left on the application window. In order the users see the activities (jobs) that are assigned to them exit the demo application and logon as the user in question. 


How can the user see the incoming jobs?


Every user has the incoming activities window defined as "Tasks" in the menu. Notice that the same activity is send to all users that happen to have the same role into the company or organization. When the user "completes" the data that the activity required, he/she "forwards" the completed activity to the next step. Then the activity disappears from the window.


In order a user to see activities that assigned to him for today or are uncompleted from yesterday he/she has to activate "Finished Tasks".


How the manager can see the current jobs?


By activating Menu->CPO Control Panel->Active Tasks we see every activity (job) that is assigned at the time and is in phase of completion, i.e. presented to users "incoming activities" and are worked by them.


How we can evaluate our employees?


When we activate Menu->System->Associates we can see a button captioned "Has Done". By activating it we get all the activities that the user (employee) has finished and by witch role. The time of staring and completing for each activity is also available. This way the real effort that the user has given to the company can be estimated.


How we can improve the demo application?


The demo application comes with "Developer" capabilities. That means we have the opportunity to change the database schema (Right Click->Developer->Resources->Database Manager->Edit Schema). We can also change the forms (Right Click over a form->Designing).

You can download the client and connect to our Demo Mykosmos Application Server

Download Demo