Commit 42b3fdfb authored by suryakant's avatar suryakant

Sterlite Custom Report Updates

parent 2cc918d3
...@@ -61,6 +61,7 @@ class ReportType: ...@@ -61,6 +61,7 @@ class ReportType:
""" """
REFINERY_REPORT = "refinery_report" REFINERY_REPORT = "refinery_report"
REFINERY_WORKSHEET_NAME = "REFINERY DAILY PERFORMANCE REPORT"
figlet = """ figlet = """
......
...@@ -123,15 +123,21 @@ class CustomReportHandler: ...@@ -123,15 +123,21 @@ class CustomReportHandler:
{each_columns: None} {each_columns: None}
) )
input_json[each_blocks][CommonConstants.DATA].append(temp_data_dict) input_json[each_blocks][CommonConstants.DATA].append(temp_data_dict)
logger.info(f"Block: {input_json[each_blocks]}")
return input_json return input_json
def write_dataframe_to_excel( def write_dataframe_to_excel(
self, input_json, writer, sheet_name, start_col, start_row self,
input_json,
writer,
workbook,
sheet_name,
start_col,
start_row
): ):
""" """
:param input_json: :param input_json:
:param writer: :param writer:
:param workbook:
:param sheet_name: :param sheet_name:
:param start_col: :param start_col:
:param start_row: :param start_row:
...@@ -139,6 +145,7 @@ class CustomReportHandler: ...@@ -139,6 +145,7 @@ class CustomReportHandler:
""" """
dataframes_list = [] dataframes_list = []
logger.info("Iterating through each block to create a dataframe")
# Iterate through the categories and concatenate their data # Iterate through the categories and concatenate their data
for category, category_data in input_json.items(): for category, category_data in input_json.items():
data = category_data.get('data', []) data = category_data.get('data', [])
...@@ -147,13 +154,30 @@ class CustomReportHandler: ...@@ -147,13 +154,30 @@ class CustomReportHandler:
dataframes_list.append(data_frame) dataframes_list.append(data_frame)
# Concatenate all DataFrames vertically (along rows) # Concatenate all DataFrames vertically (along rows)
logger.info("Concatenating all dataframes to one")
result_df = pd.concat(dataframes_list, axis=1, ignore_index=False) result_df = pd.concat(dataframes_list, axis=1, ignore_index=False)
result_df.to_excel( result_df.to_excel(
writer, sheet_name=sheet_name, writer, sheet_name=sheet_name,
startcol=start_col, startrow=start_row, startcol=start_col, startrow=start_row + 1,
header=True, index=False header=False, index=False
) )
return result_df.shape[0]
# Get the xlsxwriter workbook and worksheet objects.
worksheet = writer.sheets[sheet_name]
# Write the column headers with the defined format.
for col_index, value in enumerate(result_df.columns.values):
worksheet.write(
start_row, col_index, value,
workbook.add_format(
SterliteRefineryTemplate.COLUMN_HEADER_FORMAT
))
row = result_df.shape[0]
column = result_df.shape[1]
logger.info(f"Shape of current data frame is {result_df.shape}")
return row, column, worksheet
def custom_report_handler(self, input_json): def custom_report_handler(self, input_json):
""" """
...@@ -162,15 +186,18 @@ class CustomReportHandler: ...@@ -162,15 +186,18 @@ class CustomReportHandler:
""" """
status = False status = False
message = "Error generating a message" message = "Error generating a message"
data = CommonConstants.DATA data = input_json["file_name"]
try: try:
# if str(input_json.job_type).lower() == ReportType.REFINERY_REPORT: # if str(input_json.job_type).lower() == ReportType.REFINERY_REPORT:
if str(input_json["job_type"]).lower() == ReportType.REFINERY_REPORT: if str(input_json["job_type"]).lower() == ReportType.REFINERY_REPORT:
logger.info("Generating custom date filter with in the range")
# Getting custom date range using start date and end date # Getting custom date range using start date and end date
date_filter = self.create_custom_date_filter(input_json=input_json) date_filter = self.create_custom_date_filter(input_json=input_json)
with pd.ExcelWriter("output.xlsx", engine="openpyxl") as writer: with pd.ExcelWriter(
input_json["file_name"],
engine="xlsxwriter") as writer:
for each_date_range in date_filter: for each_date_range in date_filter:
logger.info(f"date filter: {each_date_range}") logger.info(f"date filter: {each_date_range}")
...@@ -180,30 +207,56 @@ class CustomReportHandler: ...@@ -180,30 +207,56 @@ class CustomReportHandler:
) )
start_col = CommonConstants.START_COLUMN start_col = CommonConstants.START_COLUMN
start_row = CommonConstants.START_ROW start_row = CommonConstants.START_ROW
total_column = 0
workbook = writer.book
sheet_name = each_date_range[
CommonConstants.DAY_START_DATE]
worksheet = None
# Iterating over sterlite json file # Iterating over sterlite json file
for each_blocks in report_template: for each_blocks in report_template:
logger.info("Getting the data from queries") logger.info("Fetching each KPI data from queries")
each_blocks = self.get_queries_from_db( each_blocks = self.get_queries_from_db(
input_json=each_blocks, date_filter=each_date_range input_json=each_blocks, date_filter=each_date_range
) )
logger.info(f"start_row: {start_row}") logger.info(f"start_row: {start_row}")
logger.info("Writing each block into excel sheet") logger.info("Writing each block into excel sheet")
last_row_shape = self.write_dataframe_to_excel(
last_row, last_column, worksheet = \
self.write_dataframe_to_excel(
input_json=each_blocks, input_json=each_blocks,
writer=writer, writer=writer,
sheet_name=each_date_range[ workbook=workbook,
CommonConstants.DAY_START_DATE], sheet_name=sheet_name,
start_col=start_col, start_col=start_col,
start_row=start_row, start_row=start_row,
) )
logger.info(f"Last row number: {last_row_shape}") logger.info(f"Last row: {last_row}")
start_row += last_row_shape + 2 logger.info(f"Last column: {last_column}")
if total_column < last_column:
total_column = last_column
start_row += last_row + 2
logger.info(f"end_row: {start_row}") logger.info(f"end_row: {start_row}")
# Add a header format.
main_header_format = workbook.add_format(
SterliteRefineryTemplate.WORKSHEET_HEADER_FORMAT
)
logger.info("Creating Header for each sheet")
# (Merge Rows, Start Column, '', Total Column, Title, Format)
worksheet.merge_range(1, 0, 0, 0, sheet_name,
main_header_format)
worksheet.merge_range(1, 1, 0, total_column - 1,
ReportType.REFINERY_WORKSHEET_NAME,
main_header_format)
logger.info(f"Report completed for: {each_date_range}")
except GeneralException as err: except GeneralException as err:
logger.error(f"Exception in custom_report_handler: {err}") logger.error(f"Exception in custom_report_handler: {err}")
return status, message, data return status, message, data
...@@ -2,6 +2,22 @@ from scripts.core.db.postgres.custom_report_query import SterliteRefineryQuery ...@@ -2,6 +2,22 @@ from scripts.core.db.postgres.custom_report_query import SterliteRefineryQuery
class SterliteRefineryTemplate: class SterliteRefineryTemplate:
WORKSHEET_HEADER_FORMAT = {
"bold": True,
"align": "center",
"valign": "center",
"fg_color": "#e6e7eb",
"font_color": "#1b314f",
"border": 1,
}
COLUMN_HEADER_FORMAT = {
"bold": True,
"align": "center",
"valign": "center",
"fg_color": "#e6e7eb",
"font_color": "#021b5e",
"border": 1,
}
REPORT_TEMPLATE = [ REPORT_TEMPLATE = [
{ {
"ANODE AVAILABILITY": { "ANODE AVAILABILITY": {
...@@ -32,7 +48,6 @@ class SterliteRefineryTemplate: ...@@ -32,7 +48,6 @@ class SterliteRefineryTemplate:
"data_column": [ "data_column": [
"anode_availability", "uom", "norms", "anode_availability", "uom", "norms",
"on_date", "mtd", "ytd"], "on_date", "mtd", "ytd"],
"format": "",
}, },
"SAFETY REPORT": { "SAFETY REPORT": {
"columns": ["SAFETY REPORT", "UOM", "NORMS", "ON DATE", "MTD", "YTD"], "columns": ["SAFETY REPORT", "UOM", "NORMS", "ON DATE", "MTD", "YTD"],
...@@ -51,7 +66,6 @@ class SterliteRefineryTemplate: ...@@ -51,7 +66,6 @@ class SterliteRefineryTemplate:
"data": [], "data": [],
"data_column": ["safety_report", "uom", "norms", "data_column": ["safety_report", "uom", "norms",
"on_date", "mtd", "ytd"], "on_date", "mtd", "ytd"],
"format": "",
}, },
}, },
{ {
...@@ -96,7 +110,6 @@ class SterliteRefineryTemplate: ...@@ -96,7 +110,6 @@ class SterliteRefineryTemplate:
"data_column": ["power_availability", "uom", "data_column": ["power_availability", "uom",
"norms", "on_date", "mtd", "norms", "on_date", "mtd",
"ytd"], "ytd"],
"format": "",
}, },
"RM ANODE RECEIPT DETAILS": { "RM ANODE RECEIPT DETAILS": {
"columns": [ "columns": [
...@@ -111,7 +124,6 @@ class SterliteRefineryTemplate: ...@@ -111,7 +124,6 @@ class SterliteRefineryTemplate:
"data": [], "data": [],
"data_column": ["rm_anode_receipt_details", "on_date", "data_column": ["rm_anode_receipt_details", "on_date",
"mtd", "ytd", "material", "opening_stock"], "mtd", "ytd", "material", "opening_stock"],
"format": "",
}, },
}, },
{ {
...@@ -147,7 +159,6 @@ class SterliteRefineryTemplate: ...@@ -147,7 +159,6 @@ class SterliteRefineryTemplate:
"data": [], "data": [],
"data_column": ["efficiencies", "uom", "norms", "data_column": ["efficiencies", "uom", "norms",
"on_date", "mtd", "ytd"], "on_date", "mtd", "ytd"],
"format": "",
}, },
"BANK / CROP": { "BANK / CROP": {
"columns": [ "columns": [
...@@ -161,7 +172,6 @@ class SterliteRefineryTemplate: ...@@ -161,7 +172,6 @@ class SterliteRefineryTemplate:
"data": [], "data": [],
"data_column": ["bank_crop", "ce(%)", "theor_weight", "data_column": ["bank_crop", "ce(%)", "theor_weight",
"actual_weight", "stripping_time"], "actual_weight", "stripping_time"],
"format": "",
}, },
}, },
{ {
...@@ -171,14 +181,12 @@ class SterliteRefineryTemplate: ...@@ -171,14 +181,12 @@ class SterliteRefineryTemplate:
"data": [], "data": [],
"data_column": ["production", "uom", "norms", "data_column": ["production", "uom", "norms",
"on_date", "mtd", "ytd"], "on_date", "mtd", "ytd"],
"format": "",
}, },
"CIRCULATION": { "CIRCULATION": {
"columns": ["CIRCULATION", "CE%", "THEOR. WEIGHT", "ACTUAL WEIGHT"], "columns": ["CIRCULATION", "CE%", "THEOR. WEIGHT", "ACTUAL WEIGHT"],
"query": [], "query": [],
"data": [], "data": [],
"data_column": ["circulation", "ce", "theor_weight", "actual_weight"], "data_column": ["circulation", "ce", "theor_weight", "actual_weight"],
"format": "",
}, },
}, },
{ {
...@@ -208,14 +216,12 @@ class SterliteRefineryTemplate: ...@@ -208,14 +216,12 @@ class SterliteRefineryTemplate:
}, },
"data": [], "data": [],
"data_column": ["fg_inventory", "on_date", "mtd", "ytd"], "data_column": ["fg_inventory", "on_date", "mtd", "ytd"],
"format": "",
}, },
"PRODUCTION": { "PRODUCTION": {
"columns": ["PRODUCTION", "ON DATE", "MTD", "YTD"], "columns": ["PRODUCTION", "ON DATE", "MTD", "YTD"],
"query": [], "query": [],
"data": [], "data": [],
"data_column": ["production", "on_date", "mtd", "ytd"], "data_column": ["production", "on_date", "mtd", "ytd"],
"format": "",
}, },
}, },
{ {
...@@ -231,7 +237,6 @@ class SterliteRefineryTemplate: ...@@ -231,7 +237,6 @@ class SterliteRefineryTemplate:
"data": [], "data": [],
"data_column": ["crop", "banks", "total_cells", "data_column": ["crop", "banks", "total_cells",
"cell_voltage", "t_shorts"], "cell_voltage", "t_shorts"],
"format": "",
}, },
"DEPOSIT LOSS (-) / GAIN (+) DETAILS": { "DEPOSIT LOSS (-) / GAIN (+) DETAILS": {
"columns": [ "columns": [
...@@ -246,7 +251,6 @@ class SterliteRefineryTemplate: ...@@ -246,7 +251,6 @@ class SterliteRefineryTemplate:
"on_date", "on_date",
"till_date" "till_date"
], ],
"format": "",
} }
}, },
{ {
...@@ -269,7 +273,6 @@ class SterliteRefineryTemplate: ...@@ -269,7 +273,6 @@ class SterliteRefineryTemplate:
"3rd_crop", "3rd_crop",
"csm_plate_rejection" "csm_plate_rejection"
], ],
"format": "",
} }
}, },
{ {
...@@ -286,7 +289,6 @@ class SterliteRefineryTemplate: ...@@ -286,7 +289,6 @@ class SterliteRefineryTemplate:
"data_column": [ "data_column": [
"filter_availability", "on_date", "mtd", "filtered_volume", "filter_availability", "on_date", "mtd", "filtered_volume",
"total_volume_refinery"], "total_volume_refinery"],
"format": "",
} }
}, },
{ {
...@@ -309,7 +311,6 @@ class SterliteRefineryTemplate: ...@@ -309,7 +311,6 @@ class SterliteRefineryTemplate:
"mtd", "mtd",
"ytd", "ytd",
], ],
"format": "",
}, },
"SPECIFIC CONSUMPTION": { "SPECIFIC CONSUMPTION": {
"columns": ["CONSUMABLES", "UOM", "NORMS", "ON DATE", "MTD", "YTD"], "columns": ["CONSUMABLES", "UOM", "NORMS", "ON DATE", "MTD", "YTD"],
...@@ -353,7 +354,6 @@ class SterliteRefineryTemplate: ...@@ -353,7 +354,6 @@ class SterliteRefineryTemplate:
"data": [], "data": [],
"data_column": ["consumables", "uom", "norms", "on_date", "mtd", "data_column": ["consumables", "uom", "norms", "on_date", "mtd",
"ytd"], "ytd"],
"format": "",
}, },
}, },
{ {
...@@ -380,14 +380,12 @@ class SterliteRefineryTemplate: ...@@ -380,14 +380,12 @@ class SterliteRefineryTemplate:
"cir_1", "cir_1",
"cir_2", "cir_2",
], ],
"format": "",
}, },
"SUSPENDED SOLIDS": { "SUSPENDED SOLIDS": {
"columns": ["SUSPENDED SOLIDS"], "columns": ["SUSPENDED SOLIDS"],
"query": [], "query": [],
"data": [], "data": [],
"data_column": ["suspended_solids"], "data_column": ["suspended_solids"],
"format": "",
}, },
}, },
{ {
...@@ -396,14 +394,12 @@ class SterliteRefineryTemplate: ...@@ -396,14 +394,12 @@ class SterliteRefineryTemplate:
"query": [], "query": [],
"data": [], "data": [],
"data_column": ["bleeding_section", "uom", "on_date", "mtd", "ytd"], "data_column": ["bleeding_section", "uom", "on_date", "mtd", "ytd"],
"format": "",
}, },
"BANK / CROP": { "BANK / CROP": {
"columns": ["BANK / CROP", "TIME", "WEIGHT (MT)", "CELLS", "READING"], "columns": ["BANK / CROP", "TIME", "WEIGHT (MT)", "CELLS", "READING"],
"query": [], "query": [],
"data": [], "data": [],
"data_column": ["bank_crop", "time", "weight", "cells", "reading"], "data_column": ["bank_crop", "time", "weight", "cells", "reading"],
"format": "",
}, },
}, },
{ {
...@@ -419,7 +415,6 @@ class SterliteRefineryTemplate: ...@@ -419,7 +415,6 @@ class SterliteRefineryTemplate:
"department(m4)", "equipment_details", "department(m4)", "equipment_details",
"equipment_location", "duration", "equipment_location", "duration",
"production", "cause"], "production", "cause"],
"format": "",
} }
}, },
] ]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment