Commit 90b1895163e17b86ac662e08bc18fa1dfcdeeb05

Authored by hitier
1 parent 17b05589

New db method: charges by project for stacked data

Showing 1 changed file with 48 additions and 1 deletions   Show diff stats
app/db_mgr.py
... ... @@ -60,7 +60,6 @@ def charges_by_project(project_id):
60 60 where project_id = {project_id}
61 61 order by c.period_id
62 62 """
63   - print(req_sql)
64 63 req_res = db.session.execute(req_sql)
65 64 results = list(req_res)
66 65 # Remove comma
... ... @@ -73,6 +72,54 @@ def charges_by_project(project_id):
73 72 return nocomma_results
74 73  
75 74  
  75 +def charges_by_project_stacked(project_id, category="service"):
  76 + """
  77 + Build the list of charges for one project, period by period
  78 + :param project_id: the project's id we want to return data for
  79 + :param category: what dict to build for each period, 'service' or 'capacity' ?
  80 + :return: a 2 dim table with header as first line and datas next, of the form
  81 + period, category_0, category_1, ....., category_n,
  82 + sem_0, value_00, value_01, ....., value_0n,
  83 + sem_1, value_10, value_11, ....., value_1n,
  84 + .
  85 + .
  86 + sem_n, value_n0, value_n1, ....., value_nn,
  87 + """
  88 + if category == 'service':
  89 + category_table = 'service'
  90 + sql_req = """
  91 + select c.charge_rate
  92 + from capacity c1 left join
  93 + charge c on c1.id = c.capacity_id and project_id = {} and period_id={}
  94 + order by c1.id
  95 + """
  96 + elif category == 'capacity':
  97 + category_table = 'capacity'
  98 + sql_req = """
  99 + select c.charge_rate
  100 + from service s left join
  101 + charge c on s.id = c.service_id and project_id = {} and period_id={}
  102 + order by s.id
  103 + """
  104 + else:
  105 + raise ValueError("Waiting for 'service' or 'capacity'")
  106 + categories_req = "select name from {} order by id".format(category)
  107 + categories = [c for (c,) in db.session.execute(categories_req)]
  108 + headers = ['period']+categories
  109 + all_charges = [headers]
  110 + for (period_id, period_name) in db.session.execute("select id, name from period order by id"):
  111 + # build the request from the string previously set
  112 + charge_by_categorie_req = sql_req.format(project_id, period_id)
  113 + # build the charges line for the current period
  114 + category_charges = [period_name]
  115 + for (category_rate,) in db.session.execute(charge_by_categorie_req):
  116 + category_rate = '0' if category_rate is None else str(category_rate)
  117 + category_charges.append(category_rate)
  118 + all_charges.append(category_charges)
  119 +
  120 + return all_charges
  121 +
  122 +
76 123 def charges_by_agent_tabled(agent_id):
77 124 """
78 125 Build the flatten list of charges for one agent, period by period
... ...