def get_salary_for_interval(request, responder): """ If a user asks for the salary of a specific person for a given time interval (recur_ent: hourly, daily, weekly, monthly, yearly; default = hourly), this dialogue state fetches the hourly salary from the knowledge base and returns it after converting it to the requested time interval. """ recur_ent = [ e['value'][0]['cname'] for e in request.entities if e['type'] == 'time_recur' ][0] responder = _get_person_info(request, responder, 'money') money = responder.slots['money'] total_money = _get_interval_amount(recur_ent, money) responder.slots['money'] = total_money responder.slots['interval'] = recur_ent try: replies = [ "{name}'s {interval} salary is ${money}", "{name}'s {interval} wage is ${money}" ] responder.reply(replies) except: responder.reply(_not_an_employee())
def get_hierarchy_up(request, responder): """ If a user asks about any employees manager or whether they are some other employee's manager, this function captures all the names in the query and returns the employee-manager mapping for each one of them. """ try: name_ent = [ e['value'][0]['cname'] for e in request.entities if e['type'] == 'name' ] # if no name, shift to exception flow assert name_ent[0] for name in name_ent: if name == '': responder.reply(_not_an_employee()) responder = _fetch_from_kb(responder, name, 'manager') reply = ["{manager} is {name}'s manager"] responder.reply(reply) except: responder.reply( "Who's manager would you like to know? (You can try saying 'Mia's manager')" )
def get_hierarchy_down(request, responder): """ If a user asks about any employees subordinates or who reports to them, this function fetches that info from the KB. """ try: name_ent = [ e['value'][0]['cname'] for e in request.entities if e['type'] == 'name' ] # if no name, shift to exception flow assert name_ent[0] for name in name_ent: if name == '': responder.reply(_not_an_employee()) responder = _fetch_from_kb(responder, name, 'subordinates') if len(responder.slots['subordinates']) == 0: responder.reply("{name} has no subordinates") return reply = ["The following people work under {name}: {subordinates}"] responder.reply(reply) except: responder.reply( "Who's subordinates would you like to know? (You can try saying 'which employees report to Mia?')" )
def get_salary(request, responder): """ If a user asks for the salary of a specific person, this function returns their hourly salary by querying into the knowledge base according to the employee name. """ responder = _get_person_info(request, responder, 'money') try: responder.reply("{name}'s hourly salary is {money}") except: responder.reply(_not_an_employee())
def get_date(request, responder): """ If a user asks for a date related information of any person, this function returns the required date. In case of a termination date related query, it also informs the user of the reason for termination. For non-terminated employees, it informs the user about the active current state of the employee in question. """ # Look for name from the context of previous turn name = request.frame.get('name') # If user presents a new name, update the name in context try: name_ent = [e for e in request.entities if e['type'] == 'name'] name = name_ent[0]['value'][0]['cname'] except: pass # If neither context nor the current query has an employee name, return not an employee if not name: responder.reply(_not_an_employee()) responder.listen() return # If name is found but not in the database, return not an employee if name == '': responder.reply(_not_an_employee()) responder.slots['name'] = name responder.frame['name'] = name employee = app.question_answerer.get(index='employee_data', emp_name=name)[0] # 'action' entities represent employment action such as hiring or termination action_entity = [ e['value'][0]['cname'] for e in request.entities if e['type'] == 'employment_action' ] # 'dob' entities represent the date of birth entity dob_entity = [e for e in request.entities if e['type'] == 'dob'] # Search for the determined action entity or date of birth in the KB and return. # 'doh' - 'date of hire', 'dot' - 'date of termination', 'dob' - 'date of birth' if action_entity: action_entity = action_entity[0] if action_entity == 'hired': date = employee['doh'] responder.slots['date'] = date responder.reply("{name}'s date of hire was {date}") # If action is that of termination: # If employee was not terminated, express the active employment status of the employee # If the employee was terminated, return both the reason for termination and the date of temrination elif action_entity == 'fired': date = employee['dot'] responder.slots['date'] = date responder.slots['reason'] = employee['rft'] if responder.slots['reason'] == 'N/A - still employed': responder.reply("{name} is still employed.") else: responder.reply( "{name}'s date of termination was {date}. The reason for termination was: {reason}." ) elif dob_entity: date = employee['dob'] responder.slots['date'] = date responder.reply("{name}'s date of birth is {date}") # If no action of dob entities specified by the user, prompt them for specifics in the next turn # If the user wants to exit this state they can choose to do that in the return prompt by invoking the 'exit' intent. else: if request.frame.get('date_visited'): responder.reply("If you want to know something else, say 'exit'") responder.frame['date_visited'] = False else: responder.reply( 'What would you like to know about {name}? You can ask about date of hire, date of termination or date of birth.' ) responder.frame['date_visited'] = True responder.params.allowed_intents = ('date.get_date', 'general.get_info', 'salary.get_salary', 'hierarchy.*', 'greeting.*') responder.listen()