from app.models import db def projects(): """ Build the list of all agents, with their charges summed up in one total :return: """ sql_txt = """ select p.id, p.name, sum(tc.charge_rate) as total_charge from project as p left join ( select c.project_id, c.charge_rate from charge c ) tc on p.id = tc.project_id group by p.id order by total_charge desc; """ all_projects = db.session.execute(sql_txt).fetchall() return all_projects def agents(): """ Build the list of all agents, with their charges summed up in one total :return: """ sql_txt = """ select a.id, a.firstname, a.secondname, sum(tc.charge_rate) as total_charge from agent as a left join ( select c.agent_id, c.charge_rate from charge c ) tc on a.id = tc.agent_id group by a.id order by total_charge desc; """ all_agents = db.session.execute(sql_txt).fetchall() return all_agents def charges_by_project(project_id): """ Build the flatten list of charges for one project, period by period :param project_id: :return: """ req_sql = f""" select p.name as period_name, a.firstname ||" "|| a.secondname as agent_name, s.name as service_name, c2.name as capacity_name, c.charge_rate as charge_rate from charge as c join period p on c.period_id = p.id join project p2 on c.project_id = p2.id join service s on c.service_id = s.id join agent a on a.id = c.agent_id join capacity c2 on c2.id = c.capacity_id where project_id = {project_id} order by c.period_id """ print(req_sql) req_res = db.session.execute(req_sql) results = list(req_res) # Remove comma nocomma_results = [] for line in results: nocomma_line = [str(cell) for cell in line] nocomma_results.append(nocomma_line) headers = ["Periode", "Agent", "Service", "Fonction", "Charge"] nocomma_results.insert(0, headers) return nocomma_results def charges_by_agent_tabled(agent_id): """ Build the flatten list of charges for one agent, period by period :param agent_id: :return: """ req_sql = f""" select p.name as period_name, p2.name as project_name, s.name as service_name, c2.name as capacity_name, c.charge_rate as charge_rate from charge as c join period p on c.period_id = p.id join project p2 on c.project_id = p2.id join service s on c.service_id = s.id join agent a on a.id = c.agent_id join capacity c2 on c2.id = c.capacity_id where agent_id = {agent_id} order by c.period_id """ req_res = db.session.execute(req_sql) results = list(req_res) # Remove comma nocomma_results = [] for line in results: nocomma_line = [str(cell) for cell in line] nocomma_results.append(nocomma_line) headers = ["Periode", "Projet", "Service", "Fonction", "Charge"] nocomma_results.insert(0, headers) return nocomma_results def charges_by_agent_stacked(agent_id): """ Build the list of charges for one agent, period by period :param agent_id: :return: """ all_charges = {} for (period_id, period_name) in db.session.execute("select id, name from period order by id"): charge_by_project_req = """select p.name, c.charge_rate from project p left join charge c on p.id = c.project_id and agent_id = {} and period_id={} order by p.id""".format(agent_id, period_id) period_charge = {} for project_name, project_rate in db.session.execute(charge_by_project_req): period_charge[project_name] = project_rate all_charges[period_name] = period_charge return all_charges def charges_by_agent(agent_id): periods = db.session.execute("select name from period") sql_txt = "select p.name, sum(charge_rate) from charge inner join period p on charge.period_id = p.id\ where agent_id={} group by period_id order by p.name" \ .format(agent_id) request = db.session.execute(sql_txt) all_charges = [] charges_list = [(period, charge) for (period, charge) in request.fetchall()] charges_dict = dict(charges_list) for (p,) in periods: if p in charges_dict.keys(): all_charges.append([p, charges_dict[p]]) else: all_charges.append([p, 0]) return all_charges