Commit 8895f195 authored by mohammed.akhib's avatar mohammed.akhib

Merge remote-tracking branch 'origin/develop_suryakant' into develop_akhib

# Conflicts:
#	scripts/core/db/postgres/custom_report_query.py
parents 9df295c4 0c4f8863
...@@ -60,6 +60,7 @@ class PostgresDetails(BaseSettings): ...@@ -60,6 +60,7 @@ class PostgresDetails(BaseSettings):
port: str port: str
username: str username: str
password: str password: str
database: str = ""
class Config: class Config:
env_prefix = "POSTGRES_" env_prefix = "POSTGRES_"
......
...@@ -53,7 +53,8 @@ class CommonConstants: ...@@ -53,7 +53,8 @@ class CommonConstants:
FREQUENCY = 'D' FREQUENCY = 'D'
START_COLUMN = 0 START_COLUMN = 0
START_ROW = 2 START_ROW = 2
OVERALL_COLUMN_WIDTH = 27 REFINERY_COLUMN_WIDTH = 27
ACP_COLUMN_WIDTH = 24
class ReportType: class ReportType:
...@@ -64,8 +65,9 @@ class ReportType: ...@@ -64,8 +65,9 @@ class ReportType:
REFINERY_REPORT = "refinery_report" REFINERY_REPORT = "refinery_report"
ACP_REPORT = "acp_report" ACP_REPORT = "acp_report"
REFINERY_WORKSHEET_NAME = "REFINERY DAILY PERFORMANCE REPORT" REFINERY_WORKSHEET_NAME = "REFINERY DAILY PERFORMANCE REPORT"
ACP_WORKSHEET_NAME = "VEDANTA LIMITED \n ANODE CASTING PLANT (ACP) - " \ ACP_WORKSHEET_NAME_1 = "VEDANTA LIMITED"
"SHIFT INCHARGE LOG SHEET" ACP_WORKSHEET_NAME_2 = "ANODE CASTING PLANT (ACP) - SHIFT INCHARGE LOG SHEET"
DATE = "DATE"
class PostgresConstant: class PostgresConstant:
......
...@@ -3835,10 +3835,10 @@ class ACPQuery: ...@@ -3835,10 +3835,10 @@ class ACPQuery:
""" Persons on duty """ """ Persons on duty """
QUERY_1 = """ QUERY_1 = """
SELECT SELECT
PERSONS_ON_DUTY, PERSONS_ON_DUTY AS persons_on_duty,
A_SHIFT, A_SHIFT as a,
B_SHIFT, B_SHIFT as b,
C_SHIFT C_SHIFT as c
FROM SEMANTIC_PROD.SHIFT_MANPOWER_ACP FROM SEMANTIC_PROD.SHIFT_MANPOWER_ACP
WHERE DATE='{day_start_date}' WHERE DATE='{day_start_date}'
""" """
...@@ -3990,8 +3990,14 @@ class ACPQuery: ...@@ -3990,8 +3990,14 @@ class ACPQuery:
class MeltTemperature: class MeltTemperature:
""" PARAMETERS """ """ PARAMETERS """
QUERY_1 = """ QUERY_1 = """
SELECT
'MELT TEMPERATURE' AS parameters,
'1120-1140 DEG C' AS range,
SUM(COALESCE(MELT_TEMP, 0)) AS value
AND DATE(date) = '{day_start_date}' FROM SEMANTIC_PROD.FURNACE_1_CTP
WHERE DATE = '{day_start_date}'
GROUP BY 1;
""" """
class MouldTemperature: class MouldTemperature:
...@@ -4062,7 +4068,7 @@ class ACPQuery: ...@@ -4062,7 +4068,7 @@ class ACPQuery:
QUERY_1 = """ QUERY_1 = """
SELECT SELECT
'Barium Sulphate Solution Specific Gravity' AS parameters, 'Barium Sulphate Solution Specific Gravity' AS parameters,
'1 - 1.2' AS RANGE, '1 - 1.2' AS range,
SUM(COALESCE(BARIUM_SULPHATE, 0)) AS value SUM(COALESCE(BARIUM_SULPHATE, 0)) AS value
FROM SEMANTIC_PROD.FURNACE_1_CTP FROM SEMANTIC_PROD.FURNACE_1_CTP
...@@ -4085,9 +4091,9 @@ class ACPQuery: ...@@ -4085,9 +4091,9 @@ class ACPQuery:
""" PARAMETERS """ """ PARAMETERS """
QUERY_1 = """ QUERY_1 = """
SELECT SELECT
CONCAT('HEAT NO - ', REFINARY_LABDATA_BATCH, ' ARSENIC') AS KPI, CONCAT('HEAT NO - ', REFINARY_LABDATA_BATCH, ' ARSENIC') AS parameters,
'500-1000 PPM' AS RANGE, '500-1000 PPM' AS range,
REFINARY_LABDATA_ARSENIC AS METRIC_VALUE REFINARY_LABDATA_ARSENIC AS value
FROM SEMANTIC_PROD.ANODE_REFINERY_LAB FROM SEMANTIC_PROD.ANODE_REFINERY_LAB
WHERE LOWER(SUBSTRING(ANODE_SHIFT_SELECTION, 1,1)) = 'a' WHERE LOWER(SUBSTRING(ANODE_SHIFT_SELECTION, 1,1)) = 'a'
...@@ -4098,9 +4104,9 @@ class ACPQuery: ...@@ -4098,9 +4104,9 @@ class ACPQuery:
""" PARAMETERS """ """ PARAMETERS """
QUERY_1 = """ QUERY_1 = """
SELECT SELECT
CONCAT('HEAT NO - ', REFINARY_LABDATA_BATCH, ' ARSENIC') AS KPI, CONCAT('HEAT NO - ', REFINARY_LABDATA_BATCH, ' ARSENIC') AS parameters,
'500-1000 PPM' AS RANGE, '500-1000 PPM' AS range,
REFINARY_LABDATA_ARSENIC AS METRIC_VALUE REFINARY_LABDATA_ARSENIC AS value
FROM SEMANTIC_PROD.ANODE_REFINERY_LAB FROM SEMANTIC_PROD.ANODE_REFINERY_LAB
WHERE LOWER(SUBSTRING(ANODE_SHIFT_SELECTION, 1, 1)) = 'b' WHERE LOWER(SUBSTRING(ANODE_SHIFT_SELECTION, 1, 1)) = 'b'
...@@ -4110,15 +4116,57 @@ class ACPQuery: ...@@ -4110,15 +4116,57 @@ class ACPQuery:
class HeatNoArsenicC: class HeatNoArsenicC:
""" PARAMETERS """ """ PARAMETERS """
QUERY_1 = """ QUERY_1 = """
SELECT CONCAT('HEAT NO - ', REFINARY_LABDATA_BATCH, ' ARSENIC') AS KPI, SELECT CONCAT('HEAT NO - ', REFINARY_LABDATA_BATCH, ' ARSENIC') AS parameters,
'500-1000 PPM' AS RANGE, '500-1000 PPM' AS range,
REFINARY_LABDATA_ARSENIC AS METRIC_VALUE REFINARY_LABDATA_ARSENIC AS value
FROM SEMANTIC_PROD.ANODE_REFINERY_LAB FROM SEMANTIC_PROD.ANODE_REFINERY_LAB
WHERE LOWER(SUBSTRING(ANODE_SHIFT_SELECTION,1,1)) = 'c' WHERE LOWER(SUBSTRING(ANODE_SHIFT_SELECTION,1,1)) = 'c'
AND DATE(date) = '{day_start_date}' AND DATE(date) = '{day_start_date}'
""" """
class FurnaceShiftA:
""" FURNACE SHIFT A """
QUERY_1 = """
SELECT
SHIFTA_FURNACE AS furnace,
BURNER_1 as burner_1,
BURNER_2 as burner_2,
BURNER_3 as burner_3
FROM SEMANTIC_PROD.ACP_BURNER_CLEANING
WHERE LOWER(SHIFT) = 'shift a'
AND DATE(date) = '{day_start_date}'
"""
class FurnaceShiftB:
""" FURNACE SHIFT B """
QUERY_1 = """
SELECT
SHIFTB_FURNACE AS furnace,
BURNER1_B AS burner_1,
BURNER2_B AS burner_2,
BURNER3_B AS burner_3
FROM SEMANTIC_PROD.ACP_BURNER_CLEANING
WHERE LOWER(SHIFT) = 'shift b'
AND DATE(date) = '{day_start_date}'
"""
class FurnaceShiftC:
""" FURNACE SHIFT C """
QUERY_1 = """
SELECT
SHIFTC_FURNACE AS furnace,
BURNER1_C AS burner_1,
BURNER2_C AS burner_2,
BURNER3_C AS burner_3
FROM SEMANTIC_PROD.ACP_BURNER_CLEANING
WHERE LOWER(SHIFT) = 'shift c'
AND DATE(date) = '{day_start_date}'
"""
class SterliteCCPCQuery: class SterliteCCPCQuery:
""" """
......
...@@ -20,45 +20,57 @@ class CustomReportHandler: ...@@ -20,45 +20,57 @@ class CustomReportHandler:
:param input_json: :param input_json:
:return: :return:
""" """
flag = False
date_range_list = [] date_range_list = []
# Fetching Start date
start_date = datetime.strptime(
input_json[CommonConstants.PROPERTY][CommonConstants.START_DATE],
CommonConstants.DATE_TIME_FORMAT
)
# Fetching End date
end_date = datetime.strptime(
input_json[CommonConstants.PROPERTY][CommonConstants.END_DATE],
CommonConstants.DATE_TIME_FORMAT
)
logger.info(f"Creating list of dates starting from {start_date} to {end_date}") if CommonConstants.PROPERTY in input_json and CommonConstants.START_DATE \
# Generating a date range in input_json[CommonConstants.PROPERTY] and CommonConstants.END_DATE \
date_list = pd.date_range(start_date, end_date, freq=CommonConstants.FREQUENCY) in input_json[CommonConstants.PROPERTY]:
# Iterating and creating where clause filters # Fetching Start date
for each_dates in date_list.strftime( start_date = datetime.strptime(
CommonConstants.DATE_TIME_FORMAT).to_list(): input_json[CommonConstants.PROPERTY][CommonConstants.START_DATE],
CommonConstants.DATE_TIME_FORMAT
# To get the each_dates - financial year )
financial_year = None # Fetching End date
date_obj = datetime.strptime(each_dates, CommonConstants.DATE_TIME_FORMAT) end_date = datetime.strptime(
if date_obj.month >= 4: input_json[CommonConstants.PROPERTY][CommonConstants.END_DATE],
financial_year = str(date_obj.year) CommonConstants.DATE_TIME_FORMAT
elif date_obj.month < 4:
financial_year = str(date_obj.year - 1)
date_range_list.append(
dict(
day_start_date=each_dates,
day_end_date=each_dates,
month_start_date=each_dates[:-2] + "01",
month_end_date=each_dates,
year_start_date=financial_year + "-04-01",
year_end_date=each_dates,
)
) )
return date_range_list
logger.info(f"Creating list of dates starting from {start_date} "
f"to {end_date}")
# Generating a date range
date_list = pd.date_range(start=start_date,
end=end_date,
freq=CommonConstants.FREQUENCY)
# Iterating and creating where clause filters
for each_dates in date_list.strftime(
CommonConstants.DATE_TIME_FORMAT).to_list():
# To get the each_dates - financial year
financial_year = None
date_obj = datetime.strptime(each_dates,
CommonConstants.DATE_TIME_FORMAT)
if date_obj.month >= 4:
financial_year = str(date_obj.year)
elif date_obj.month < 4:
financial_year = str(date_obj.year - 1)
date_range_list.append(
dict(
day_start_date=each_dates,
day_end_date=each_dates,
month_start_date=each_dates[:-2] + "01",
month_end_date=each_dates,
year_start_date=financial_year + "-04-01",
year_end_date=each_dates,
)
)
flag = True
return flag, date_range_list
def get_queries_from_db(self, input_json, date_filter): def get_queries_from_db(self, input_json, date_filter):
""" """
...@@ -184,6 +196,7 @@ class CustomReportHandler: ...@@ -184,6 +196,7 @@ class CustomReportHandler:
column_counter = 0 column_counter = 0
previous_category_cols = 0 previous_category_cols = 0
header_flag = False header_flag = False
color_json = dict()
logger.info("Iterating through each block to create a dataframe") 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
...@@ -209,6 +222,13 @@ class CustomReportHandler: ...@@ -209,6 +222,13 @@ class CustomReportHandler:
column_counter += shape[1] column_counter += shape[1]
previous_category_cols = column_counter previous_category_cols = column_counter
# Checking if color in addition section
if "addition" in category_data and "column_color" in category_data[
"addition"]:
color_json.update(
category_data["addition"]["column_color"]
)
if header_flag: if header_flag:
start_row += 1 start_row += 1
...@@ -226,17 +246,28 @@ class CustomReportHandler: ...@@ -226,17 +246,28 @@ class CustomReportHandler:
# Generating merged header for each dataframe # Generating merged header for each dataframe
for merge_index, border_value in border_json.items(): for merge_index, border_value in border_json.items():
# (Start Rows, Start Column, End Row, End Column, Title, Format) if border_value and border_value in color_json:
worksheet.merge_range(*merge_index, border_value, merge_style_format = copy.deepcopy(header_merge_format)
workbook.add_format(header_merge_format)) merge_style_format["fg_color"] = color_json[border_value]
worksheet.merge_range(*merge_index, border_value,
workbook.add_format(merge_style_format))
else:
worksheet.merge_range(*merge_index, border_value,
workbook.add_format(header_merge_format))
# Write the column headers with the defined format. # Write the column headers with the defined format.
for col_index, value in enumerate(result_df.columns.values): for col_index, value in enumerate(result_df.columns.values):
if value: if value:
worksheet.write( if color_json and value in color_json:
start_row, col_index, value, style_format = copy.deepcopy(column_merge_format)
workbook.add_format(column_merge_format) style_format["fg_color"] = color_json[value]
) worksheet.write(
start_row, col_index, value,
workbook.add_format(style_format))
else:
worksheet.write(
start_row, col_index, value,
workbook.add_format(column_merge_format))
else: else:
worksheet.write( worksheet.write(
start_row, col_index, value, start_row, col_index, value,
...@@ -251,168 +282,231 @@ class CustomReportHandler: ...@@ -251,168 +282,231 @@ class CustomReportHandler:
:param input_json: :param input_json:
:return: :return:
""" """
status = False response_json = dict(
message = "Error generating a message" job_id=input_json['job_id'],
data = input_json["file_name"] file_path="",
file_name=input_json["file_name"],
is_schedule="",
project_id=input_json["project_id"]
)
try: try:
logger.info(f"Report: {str(input_json['job_type']).lower()}") logger.info(f"Report: {str(input_json['job_type']).lower()}")
# 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")
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_flag, date_filter = self.create_custom_date_filter(
input_json=input_json)
with pd.ExcelWriter(
input_json["file_name"],
engine="xlsxwriter") as writer:
for each_date_range in date_filter:
logger.info(f"date filter: {each_date_range}")
report_template = copy.deepcopy(
SterliteRefineryTemplate.REPORT_TEMPLATE
)
start_col = CommonConstants.START_COLUMN
start_row = CommonConstants.START_ROW
total_column = 0
workbook = writer.book
sheet_name = datetime.strptime(
each_date_range[CommonConstants.DAY_START_DATE],
"%Y-%m-%d").strftime("%d %b %Y")
worksheet = None
# Iterating over sterlite json file
for each_blocks in report_template:
logger.info("Fetching each KPI data from queries")
each_blocks = self.get_queries_from_db(
input_json=each_blocks, date_filter=each_date_range
)
logger.info("Writing each block into excel sheet")
shape, worksheet, header_flag = \
self.write_dataframe_to_excel(
input_json=each_blocks,
writer=writer,
workbook=workbook,
sheet_name=sheet_name,
start_col=start_col,
start_row=start_row,
header_merge_format=SterliteRefineryTemplate.COLUMN_HEADER_FORMAT,
column_merge_format=SterliteRefineryTemplate.COLUMN_HEADER_FORMAT,
blank_merge_format=SterliteRefineryTemplate.BLANK_COLUMN_HEADER_FORMAT
)
if total_column < shape[1]:
total_column = shape[1]
start_row += shape[0] + 2
if header_flag: if date_flag:
start_row += 1 with pd.ExcelWriter(
input_json["file_name"],
engine="xlsxwriter") as writer:
# Add a header format. for each_date_range in date_filter:
main_header_format = workbook.add_format( logger.info(f"date filter: {each_date_range}")
SterliteRefineryTemplate.WORKSHEET_HEADER_FORMAT)
logger.info("Creating Header for each sheet") report_template = copy.deepcopy(
SterliteRefineryTemplate.REPORT_TEMPLATE
)
start_col = CommonConstants.START_COLUMN
start_row = CommonConstants.START_ROW
total_column = 0
workbook = writer.book
sheet_name = datetime.strptime(
each_date_range[CommonConstants.DAY_START_DATE],
"%Y-%m-%d").strftime("%d %b %Y")
worksheet = None
# Iterating over sterlite json file
for each_blocks in report_template:
logger.info("Fetching each KPI data from queries")
each_blocks = self.get_queries_from_db(
input_json=each_blocks, date_filter=each_date_range
)
# (Merge Rows, Start Column, '', Total Column, Title, Format) logger.info("Writing each block into excel sheet")
worksheet.merge_range(1, 0, 0, 0, sheet_name,
main_header_format) shape, worksheet, header_flag = \
worksheet.merge_range(1, 1, 0, total_column - 1, self.write_dataframe_to_excel(
ReportType.REFINERY_WORKSHEET_NAME, input_json=each_blocks,
main_header_format) writer=writer,
workbook=workbook,
sheet_name=sheet_name,
start_col=start_col,
start_row=start_row,
header_merge_format=SterliteRefineryTemplate.COLUMN_HEADER_FORMAT,
column_merge_format=SterliteRefineryTemplate.COLUMN_HEADER_FORMAT,
blank_merge_format=SterliteRefineryTemplate.BLANK_COLUMN_HEADER_FORMAT
)
if total_column < shape[1]:
total_column = shape[1]
start_row += shape[0] + 2
if header_flag:
start_row += 1
logger.info("Creating Header for each sheet")
self.merge_worksheet(
start_row=1, start_col=0, end_row=0,
end_col=0, title=sheet_name,
style=SterliteRefineryTemplate.WORKSHEET_HEADER_FORMAT,
worksheet=worksheet, workbook=workbook,
)
self.merge_worksheet(
start_row=1, start_col=1, end_row=0,
end_col=total_column - 1,
title=ReportType.REFINERY_WORKSHEET_NAME,
style=SterliteRefineryTemplate.WORKSHEET_HEADER_FORMAT,
worksheet=worksheet, workbook=workbook,
)
# Setting width to the column # Setting width to the column
worksheet.set_column(0, total_column, worksheet.set_column(0, total_column,
CommonConstants.OVERALL_COLUMN_WIDTH) CommonConstants.REFINERY_COLUMN_WIDTH)
# Center alignment of Excel data # Center alignment of Excel data
workbook.formats[0].set_align('center') workbook.formats[0].set_align('center')
logger.info(f"Report completed for: {each_date_range}") logger.info(f"Report completed for: {each_date_range}")
else:
logger.error("Missing: Start Date or End Date")
if str(input_json["job_type"]).lower() == ReportType.ACP_REPORT: if str(input_json["job_type"]).lower() == ReportType.ACP_REPORT:
logger.info("Generating custom date filter with in the range") 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_flag, date_filter = self.create_custom_date_filter(
input_json=input_json
with pd.ExcelWriter( )
input_json["file_name"],
engine="xlsxwriter") as writer:
for each_date_range in date_filter:
logger.info(f"date filter: {each_date_range}")
report_template = copy.deepcopy(
ACPReportTemplate.REPORT_TEMPLATE
)
start_col = CommonConstants.START_COLUMN
start_row = CommonConstants.START_ROW
total_column = 0
workbook = writer.book
sheet_name = datetime.strptime(
each_date_range[CommonConstants.DAY_START_DATE],
"%Y-%m-%d").strftime("%d %b %Y")
worksheet = None
# Iterating over sterlite json file
for each_blocks in report_template:
logger.info("Fetching each KPI data from queries")
each_blocks = self.get_queries_from_db(
input_json=each_blocks, date_filter=each_date_range
)
logger.info("Writing each block into excel sheet") if date_flag:
with pd.ExcelWriter(
shape, worksheet, header_flag = \ input_json["file_name"],
self.write_dataframe_to_excel( engine="xlsxwriter") as writer:
input_json=each_blocks,
writer=writer,
workbook=workbook,
sheet_name=sheet_name,
start_col=start_col,
start_row=start_row,
header_merge_format=ACPReportTemplate.COLUMN_HEADER_FORMAT,
column_merge_format=ACPReportTemplate.COLUMN_HEADER_FORMAT,
blank_merge_format=ACPReportTemplate.BLANK_COLUMN_HEADER_FORMAT
)
if total_column < shape[1]: for each_date_range in date_filter:
total_column = shape[1] logger.info(f"date filter: {each_date_range}")
start_row += shape[0] + 2
if header_flag: report_template = copy.deepcopy(
start_row += 1 ACPReportTemplate.REPORT_TEMPLATE
)
start_col = CommonConstants.START_COLUMN
start_row = CommonConstants.START_ROW
total_column = 0
workbook = writer.book
sheet_name = datetime.strptime(
each_date_range[CommonConstants.DAY_START_DATE],
"%Y-%m-%d").strftime("%d %b %Y")
worksheet = None
# Iterating over sterlite json file
for each_blocks in report_template:
logger.info("Fetching each KPI data from queries")
each_blocks = self.get_queries_from_db(
input_json=each_blocks, date_filter=each_date_range
)
# Add a header format. logger.info("Writing each block into excel sheet")
main_header_format = workbook.add_format(
ACPReportTemplate.WORKSHEET_HEADER_FORMAT) shape, worksheet, header_flag = \
self.write_dataframe_to_excel(
input_json=each_blocks, writer=writer,
workbook=workbook, sheet_name=sheet_name,
start_col=start_col, start_row=start_row,
header_merge_format=ACPReportTemplate.COLUMN_HEADER_FORMAT,
column_merge_format=ACPReportTemplate.COLUMN_HEADER_FORMAT,
blank_merge_format=ACPReportTemplate.BLANK_COLUMN_HEADER_FORMAT
)
if total_column < shape[1]:
total_column = shape[1]
start_row += shape[0] + 2
if header_flag:
start_row += 1
logger.info("Creating Header for each sheet")
# -------- Image Section --------
logger.info("Adding Image in header")
self.merge_worksheet(
start_row=0, start_col=0, end_row=2, end_col=2,
title="",
style=ACPReportTemplate.WORKSHEET_IMAGE_HEADER_FORMAT,
worksheet=worksheet, workbook=workbook,
)
worksheet.insert_image('A1', 'logo.png')
# -------- Heading Section --------
logger.info("Adding Heading in Header")
self.merge_worksheet(
start_row=0, start_col=3, end_row=1,
end_col=total_column - 1,
title=ReportType.ACP_WORKSHEET_NAME_1,
style=ACPReportTemplate.WORKSHEET_HEADER_FORMAT,
worksheet=worksheet, workbook=workbook,
)
self.merge_worksheet(
start_row=2, start_col=3,
end_row=2, end_col=total_column - 1,
title=ReportType.ACP_WORKSHEET_NAME_2,
style=ACPReportTemplate.WORKSHEET_HEADER_FORMAT,
worksheet=worksheet, workbook=workbook,
)
logger.info("Creating Header for each sheet") # -------- Date HEADER Section --------
logger.info("Adding Date time in header")
self.merge_worksheet(
start_row=3, start_col=0, end_row=3, end_col=1,
title=ReportType.DATE,
style=ACPReportTemplate.WORKSHEET_DATE_HEADER_FORMAT,
worksheet=worksheet, workbook=workbook,
)
# (Merge Rows, Start Column, '', Total Column, Title, Format) # -------- Date Section --------
worksheet.merge_range(1, 0, 0, 0, sheet_name, logger.info("Adding Date time in header")
main_header_format) self.merge_worksheet(
worksheet.merge_range(1, 1, 0, total_column - 1, start_row=3, start_col=2,
ReportType.ACP_WORKSHEET_NAME, end_row=3, end_col=3, title=sheet_name,
main_header_format) style=ACPReportTemplate.WORKSHEET_DATE_FORMAT,
worksheet=worksheet, workbook=workbook,
)
# Setting width to the column # Setting width to the column
worksheet.set_column(0, total_column, worksheet.set_column(0, total_column,
CommonConstants.OVERALL_COLUMN_WIDTH) CommonConstants.ACP_COLUMN_WIDTH)
# Center alignment of Excel data # Center alignment of Excel data
workbook.formats[0].set_align('center') workbook.formats[0].set_align('center')
logger.info(f"Report completed for: {each_date_range}") logger.info(f"Report completed for: {each_date_range}")
else:
logger.error("Missing: Start Date or End Date")
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 response_json
def merge_worksheet(self, start_row, start_col,
end_row, end_col, title, style, worksheet, workbook):
"""
This method is to merge the worksheet
:param start_row:
:param start_col:
:param end_row:
:param end_col:
:param title:
:param style:
:param worksheet:
:param workbook:
:return:
"""
style_format = workbook.add_format(style)
worksheet.merge_range(
start_row, start_col, end_row, end_col, title, style_format
)
...@@ -14,6 +14,8 @@ class ReportInput(BaseModel): ...@@ -14,6 +14,8 @@ class ReportInput(BaseModel):
class ReportOutput(BaseModel): class ReportOutput(BaseModel):
status: bool job_id: str
message: str file_path: str = ""
data: str file_name: Optional[str] = None
is_schedule: Optional[bool] = False
project_id: str
...@@ -63,10 +63,10 @@ async def custom_report_function(input_json: custom_report_input_model): ...@@ -63,10 +63,10 @@ async def custom_report_function(input_json: custom_report_input_model):
""" """
try: try:
status, message, data = report_handler_obj.custom_report_handler( response = report_handler_obj.custom_report_handler(
input_json=input_json input_json=input_json
) )
return {"status": status, "message": message, "data": data} return response
except Exception as err: except Exception as err:
logger.exception( logger.exception(
CommonConstants.EXCEPTION_RAISER.format(str(err)), CommonConstants.EXCEPTION_RAISER.format(str(err)),
......
from scripts.constants import PostgresConstant
from scripts.core.db.postgres.custom_report_query import ACPQuery from scripts.core.db.postgres.custom_report_query import ACPQuery
class ACPReportTemplate: class ACPReportTemplate:
""" HEADER STYLING FORMAT """
WORKSHEET_IMAGE_HEADER_FORMAT = {
"bold": True,
"align": "center",
"valign": "center",
"border": 1,
}
WORKSHEET_HEADER_FORMAT = { WORKSHEET_HEADER_FORMAT = {
"bold": True, "bold": True,
"align": "center", "align": "center",
"valign": "center", "valign": "center",
"fg_color": "#e6e7eb",
"font_color": "#1b314f",
"border": 1, "border": 1,
'font_size': '20', "fg_color": "#1AC5F3",
'font_size': '18',
}
""" DATE HEADER """
WORKSHEET_DATE_HEADER_FORMAT = {
"bold": True,
"align": "center",
"valign": "center",
"border": 1,
"fg_color": "#F4AD66",
'font_size': '12',
} }
WORKSHEET_DATE_FORMAT = {
"bold": True,
"align": "center",
"valign": "center",
"border": 1,
"fg_color": "#F4CE84",
'font_size': '12',
}
""" COLUMN HEADER FORMAT """
COLUMN_HEADER_FORMAT = { COLUMN_HEADER_FORMAT = {
"bold": True, "bold": True,
"align": "center", "align": "center",
...@@ -25,6 +50,8 @@ class ACPReportTemplate: ...@@ -25,6 +50,8 @@ class ACPReportTemplate:
"align": "center", "align": "center",
"valign": "center", "valign": "center",
} }
""" REPORT TEMPLATE """
REPORT_TEMPLATE = [ REPORT_TEMPLATE = [
{ {
"BLANK": { "BLANK": {
...@@ -47,17 +74,11 @@ class ACPReportTemplate: ...@@ -47,17 +74,11 @@ class ACPReportTemplate:
"FO": [ "FO": [
ACPQuery.FO.QUERY_1, ACPQuery.FO.QUERY_1,
ACPQuery.FO.QUERY_2, ACPQuery.FO.QUERY_2,
],
"PNG/LPG": [
], ],
"Rejection": [ "Rejection": [
ACPQuery.Rejection.QUERY_1, ACPQuery.Rejection.QUERY_1,
ACPQuery.Rejection.QUERY_2, ACPQuery.Rejection.QUERY_2,
], ],
"Power": [
]
}, },
"data": [], "data": [],
"data_column": [ "data_column": [
...@@ -83,6 +104,13 @@ class ACPReportTemplate: ...@@ -83,6 +104,13 @@ class ACPReportTemplate:
"data_column": [ "data_column": [
"persons_on_duty", "a", "b", "c" "persons_on_duty", "a", "b", "c"
], ],
"addition": {
"column_color": {
"A": "#51E02A",
"B": "#51E02A",
"C": "#51E02A",
}
}
}, },
"BLANK1": { "BLANK1": {
"columns": [None], "columns": [None],
...@@ -103,6 +131,12 @@ class ACPReportTemplate: ...@@ -103,6 +131,12 @@ class ACPReportTemplate:
"data_column": [ "data_column": [
"anode_lug_thickness", "anode_body_thickness" "anode_lug_thickness", "anode_body_thickness"
], ],
"addition": {
"column_color": {
"ANODE LUG THICKNESS (22-32 mm)": "#51E02A",
"ANODE BODY THICKNESS (31-41 mm)": "#51E02A",
}
}
}, },
}, },
{ {
...@@ -119,6 +153,11 @@ class ACPReportTemplate: ...@@ -119,6 +153,11 @@ class ACPReportTemplate:
"data_column": [ "data_column": [
"s_no", "a_shift_comm" "s_no", "a_shift_comm"
], ],
"addition": {
"column_color": {
"A-SHIFT COMMUNICATION": "#51E02A",
}
}
}, },
"A SHIFTWISE DATA": { "A SHIFTWISE DATA": {
"columns": [ "columns": [
...@@ -134,7 +173,10 @@ class ACPReportTemplate: ...@@ -134,7 +173,10 @@ class ACPReportTemplate:
"mould", "set_value", "field_wt" "mould", "set_value", "field_wt"
], ],
"addition": { "addition": {
"merge_header": "SHIFTWISE DATA" "merge_header": "SHIFTWISE DATA",
"column_color": {
"SHIFTWISE DATA": "#FDCD78",
}
} }
} }
}, },
...@@ -152,6 +194,11 @@ class ACPReportTemplate: ...@@ -152,6 +194,11 @@ class ACPReportTemplate:
"data_column": [ "data_column": [
"s_no", "b_shift_comm" "s_no", "b_shift_comm"
], ],
"addition": {
"column_color": {
"B-SHIFT COMMUNICATION": "#51E02A",
}
}
}, },
"B SHIFTWISE DATA": { "B SHIFTWISE DATA": {
"columns": [ "columns": [
...@@ -167,7 +214,10 @@ class ACPReportTemplate: ...@@ -167,7 +214,10 @@ class ACPReportTemplate:
"mould", "set_value", "field_wt" "mould", "set_value", "field_wt"
], ],
"addition": { "addition": {
"merge_header": "SHIFTWISE DATA" "merge_header": "SHIFTWISE DATA",
"column_color": {
"SHIFTWISE DATA": "#FDCD78",
}
} }
} }
}, },
...@@ -185,6 +235,11 @@ class ACPReportTemplate: ...@@ -185,6 +235,11 @@ class ACPReportTemplate:
"data_column": [ "data_column": [
"s_no", "a_shift_comm" "s_no", "a_shift_comm"
], ],
"addition": {
"column_color": {
"C-SHIFT COMMUNICATION": "#51E02A",
}
}
}, },
"C SHIFTWISE DATA": { "C SHIFTWISE DATA": {
"columns": [ "columns": [
...@@ -200,7 +255,10 @@ class ACPReportTemplate: ...@@ -200,7 +255,10 @@ class ACPReportTemplate:
"mould", "set_value", "field_wt" "mould", "set_value", "field_wt"
], ],
"addition": { "addition": {
"merge_header": "SHIFTWISE DATA" "merge_header": "SHIFTWISE DATA",
"column_color": {
"SHIFTWISE DATA": "#FDCD78",
}
} }
} }
}, },
...@@ -223,7 +281,7 @@ class ACPReportTemplate: ...@@ -223,7 +281,7 @@ class ACPReportTemplate:
ACPQuery.Furnace2OilFlow.QUERY_1, ACPQuery.Furnace2OilFlow.QUERY_1,
], ],
"MeltTemperature": [ "MeltTemperature": [
ACPQuery.MeltTemperature.QUERY_1,
], ],
"MouldTemperature": [ "MouldTemperature": [
ACPQuery.MouldTemperature.QUERY_1, ACPQuery.MouldTemperature.QUERY_1,
...@@ -261,5 +319,59 @@ class ACPReportTemplate: ...@@ -261,5 +319,59 @@ class ACPReportTemplate:
"parameters", "range", "value" "parameters", "range", "value"
], ],
}, },
},
{
"FURNACE SHIFT A": {
"columns": [
"FURNACE", "BURNER 1", "BURNER 2", "BURNER 3"
],
"query": {
"FurnaceShiftA": [
ACPQuery.FurnaceShiftA.QUERY_1,
],
},
"data": [],
"data_column": [
"furnace", "burner_1", "burner_2", "burner_3"
],
"addition": {
"merge_header": "SHIFT - A DATA"
}
},
"FURNACE SHIFT B": {
"columns": [
"FURNACE", "BURNER 1", "BURNER 2", "BURNER 3"
],
"query": {
"FurnaceShiftB": [
ACPQuery.FurnaceShiftB.QUERY_1,
],
},
"data": [],
"data_column": [
"furnace", "burner_1", "burner_2", "burner_3"
],
"addition": {
"merge_header": "SHIFT - B DATA"
}
},
"FURNACE SHIFT C": {
"columns": [
"FURNACE", "BURNER 1", "BURNER 2", "BURNER 3"
],
"query": {
"FurnaceShiftC": [
ACPQuery.FurnaceShiftC.QUERY_1,
],
},
"data": [],
"data_column": [
"furnace", "burner_1", "burner_2", "burner_3"
],
"addition": {
"merge_header": "SHIFT - C DATA"
}
}
} }
] ]
...@@ -3,6 +3,7 @@ from scripts.core.db.postgres.custom_report_query import SterliteRefineryQuery ...@@ -3,6 +3,7 @@ from scripts.core.db.postgres.custom_report_query import SterliteRefineryQuery
class SterliteRefineryTemplate: class SterliteRefineryTemplate:
""" HEADER STYLING FORMAT """
WORKSHEET_HEADER_FORMAT = { WORKSHEET_HEADER_FORMAT = {
"bold": True, "bold": True,
"align": "center", "align": "center",
...@@ -12,6 +13,8 @@ class SterliteRefineryTemplate: ...@@ -12,6 +13,8 @@ class SterliteRefineryTemplate:
"border": 1, "border": 1,
'font_size': '20', 'font_size': '20',
} }
""" COLUMN HEADER FORMAT """
COLUMN_HEADER_FORMAT = { COLUMN_HEADER_FORMAT = {
"bold": True, "bold": True,
"align": "center", "align": "center",
...@@ -25,6 +28,8 @@ class SterliteRefineryTemplate: ...@@ -25,6 +28,8 @@ class SterliteRefineryTemplate:
"align": "center", "align": "center",
"valign": "center", "valign": "center",
} }
""" REPORT TEMPLATE """
REPORT_TEMPLATE = [ REPORT_TEMPLATE = [
{ {
"CATHODE PRODUCTION REVISED": { "CATHODE PRODUCTION REVISED": {
......
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