Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
sterlite_custom_reports
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
CI / CD Analytics
Repository Analytics
Value Stream Analytics
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
suryakant
sterlite_custom_reports
Commits
fab8800d
Commit
fab8800d
authored
Oct 17, 2023
by
suryakant
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ACP Custom Report Changes
parent
e7346d40
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
406 additions
and
15 deletions
+406
-15
scripts/constants/__init__.py
scripts/constants/__init__.py
+3
-0
scripts/core/db/postgres/custom_report_query.py
scripts/core/db/postgres/custom_report_query.py
+168
-0
scripts/core/handler/event_handler.py
scripts/core/handler/event_handler.py
+94
-15
scripts/template/acp_report_template.py
scripts/template/acp_report_template.py
+141
-0
scripts/template/refinery_report_template.py
scripts/template/refinery_report_template.py
+0
-0
No files found.
scripts/constants/__init__.py
View file @
fab8800d
...
...
@@ -62,7 +62,10 @@ class ReportType:
"""
REFINERY_REPORT
=
"refinery_report"
ACP_REPORT
=
"acp_report"
REFINERY_WORKSHEET_NAME
=
"REFINERY DAILY PERFORMANCE REPORT"
ACP_WORKSHEET_NAME
=
"VEDANTA LIMITED
\n
ANODE CASTING PLANT (ACP) - "
\
"SHIFT INCHARGE LOG SHEET"
class
PostgresConstant
:
...
...
scripts/core/db/postgres/custom_report_query.py
View file @
fab8800d
...
...
@@ -3713,3 +3713,171 @@ class SterliteRefineryQuery:
FROM PUBLIC.REFINERY_PRODUCTION_DAY_WISE RPDW
WHERE DATE("Date") = '{day_start_date}'
"""
class
ACPQuery
:
"""
Refinery report queries
"""
class
Particulars
:
""" PARTICULARS """
QUERY_1
=
"""
SELECT
'anode_poduction' AS particulars,
'MT' AS units,
ROUND(SUM(ANODE_PRODUCTION_FURNANCE_1 + ANODE_PRODUCTION_FURNANCE_2)::NUMERIC,
2) AS on_date
FROM SEMANTIC_PROD.ACP_DAILY_DATAENTRY
WHERE DATE='{day_start_date}'
GROUP BY 1
"""
QUERY_2
=
"""
SELECT
'anode_poduction' AS particulars,
'MT' AS units,
ROUND(SUM(ANODE_PRODUCTION_FURNANCE_1 + ANODE_PRODUCTION_FURNANCE_2)::NUMERIC,
2) AS mtd
FROM SEMANTIC_PROD.ACP_DAILY_DATAENTRY
WHERE DATE BETWEEN '{month_start_date}' AND '{month_end_date}'
GROUP BY 1
"""
class
FO
:
""" PARTICULARS """
QUERY_1
=
"""
SELECT
'fo_consumption_actual'::text AS particulars,
'Lits/MT' AS units,
ROUND((SUM(METRIC_VALUE) / SUM(ACTUAL_METRIC))::NUMERIC, 2) AS on_date
FROM
(SELECT SUM(ACP_DAILY_PRODUCTION_DATA_2.FO_CONSUMPTION_TOTAL_CONS) AS
METRIC_VALUE,
DATE(ACP_DAILY_PRODUCTION_DATA_2.DATE) AS date
FROM SEMANTIC_PROD.ACP_DAILY_PRODUCTION_DATA_2
GROUP BY 'fo_consumption_actual'::text,
(DATE(ACP_DAILY_PRODUCTION_DATA_2.DATE)))MAIN
INNER JOIN
(SELECT SUM(ANODE_PRODUCTION_FURNANCE_1 + ANODE_PRODUCTION_FURNANCE_2)
AS ACTUAL_METRIC, date
FROM SEMANTIC_PROD.ACP_DAILY_DATAENTRY
GROUP BY 2) ACP ON DATE(ACP.DATE) = DATE(MAIN.DATE)
WHERE MAIN.DATE BETWEEN '{day_start_date}' AND '{day_end_date}'
GROUP BY 1,2
"""
QUERY_2
=
"""
SELECT
'fo_consumption_actual'::text AS particulars,
'Lits/MT' AS units,
ROUND((SUM(METRIC_VALUE) / SUM(ACTUAL_METRIC))::NUMERIC, 2) AS mtd
FROM
(SELECT SUM(ACP_DAILY_PRODUCTION_DATA_2.FO_CONSUMPTION_TOTAL_CONS) AS
METRIC_VALUE,
DATE(ACP_DAILY_PRODUCTION_DATA_2.DATE) AS date
FROM SEMANTIC_PROD.ACP_DAILY_PRODUCTION_DATA_2
GROUP BY 'fo_consumption_actual'::text,
(DATE(ACP_DAILY_PRODUCTION_DATA_2.DATE)))MAIN
INNER JOIN
(SELECT SUM(ANODE_PRODUCTION_FURNANCE_1 + ANODE_PRODUCTION_FURNANCE_2)
AS ACTUAL_METRIC, date
FROM SEMANTIC_PROD.ACP_DAILY_DATAENTRY
GROUP BY 2) ACP ON DATE(ACP.DATE) = DATE(MAIN.DATE)
WHERE MAIN.DATE BETWEEN '{month_start_date}' AND '{month_end_date}'
GROUP BY 1,2
"""
class
Rejection
:
""" PARTICULARS """
QUERY_1
=
"""
SELECT KPI AS particulars,
"uom" AS units,
ROUND((CASE
WHEN KPI LIKE 'Anode Rejection Actual'
THEN SUM(VALUE) / NULLIF(SUM(TOTAL), 0) * 100
ELSE NULL END)::NUMERIC,
2) on_date
FROM (
(SELECT KPI,
'
%
' AS UOM,
ACP_REJ + PROD_ACP AS TOTAL,
ACP_REJ AS VALUE, date
FROM SEMANTIC_PROD.ANODE_REJECTION_KPI_VIEW
WHERE KPI = 'Anode Rejection Actual')) MAIN
WHERE DATE BETWEEN '{day_start_date}' AND '{day_end_date}'
GROUP BY 1,2;
"""
QUERY_2
=
"""
SELECT KPI AS particulars,
"uom" AS units,
ROUND((CASE
WHEN KPI LIKE 'Anode Rejection Actual'
THEN SUM(VALUE) / NULLIF(SUM(TOTAL), 0) * 100
ELSE NULL END)::NUMERIC,
2) mtd
FROM (
(SELECT KPI,
'
%
' AS UOM,
ACP_REJ + PROD_ACP AS TOTAL,
ACP_REJ AS VALUE, date
FROM SEMANTIC_PROD.ANODE_REJECTION_KPI_VIEW
WHERE KPI = 'Anode Rejection Actual')) MAIN
WHERE DATE BETWEEN '{month_start_date}' AND '{month_end_date}'
GROUP BY 1,2;
"""
class
PersonsOnDuty
:
""" Persons on duty """
QUERY_1
=
"""
SELECT
PERSONS_ON_DUTY,
A_SHIFT,
B_SHIFT,
C_SHIFT
FROM SEMANTIC_PROD.SHIFT_MANPOWER_ACP
WHERE DATE='{day_start_date}'
"""
class
AnodeLugThickness
:
""" ANODE LUG THICKNESS """
QUERY_1
=
"""
SELECT
ANODE_DIMENSION_LUG_THICKNESS AS anode_lug_thickness,
ANODE_DIMENSION_BODY_THICKNESS AS anode_body_thickness
FROM SEMANTIC_PROD.ACP_CTQ
WHERE DATE = '{day_start_date}'
"""
class
AShiftCommunication
:
""" A-SHIFT COMMUNICATION """
QUERY_1
=
"""
SELECT
SI_NUMBER AS s_no,
ACP_DESCRIPTION AS a_shift_comm
FROM SEMANTIC_PROD.ACP_SHIFT_ACTIVITY_TRACKER_1
WHERE
SHIFT = 'Shift A'
AND DATE = '{day_start_date}'
"""
class
ShiftwiseData
:
""" A-SHIFT COMMUNICATION """
QUERY_1
=
"""
SELECT
ANODE_POSITION_A AS mould,
SET_ANODE_WEIGHT_A AS set_value,
WEIGH_BRIDGE_A AS field_wt
FROM SEMANTIC_PROD.ACP_ANODE_WEIGHT
WHERE LOWER(SHIFT) = 'shift a'
AND DATE(date) = '{day_start_date}'
"""
\ No newline at end of file
scripts/core/handler/event_handler.py
View file @
fab8800d
...
...
@@ -3,7 +3,8 @@ import copy
import
pandas
as
pd
from
datetime
import
datetime
from
scripts.constants
import
ReportType
,
CommonConstants
,
PostgresConstant
from
scripts.template.sterlite_report_template
import
SterliteRefineryTemplate
from
scripts.template.refinery_report_template
import
SterliteRefineryTemplate
from
scripts.template.acp_report_template
import
ACPReportTemplate
from
scripts.core.logging.application_logging
import
logger
from
scripts.core.exception.app_exceptions
import
GeneralException
from
scripts.core.utilities.postgresql_db_utils
import
PostgresDBUtility
...
...
@@ -160,12 +161,9 @@ class CustomReportHandler:
def
write_dataframe_to_excel
(
self
,
input_json
,
writer
,
workbook
,
sheet_name
,
start_col
,
start_row
input_json
,
writer
,
workbook
,
sheet_name
,
start_col
,
start_row
,
header_merge_format
,
column_merge_format
,
blank_merge_format
):
"""
:param input_json:
...
...
@@ -174,6 +172,9 @@ class CustomReportHandler:
:param sheet_name:
:param start_col:
:param start_row:
:param header_merge_format:
:param column_merge_format:
:param blank_merge_format:
:return:
"""
dataframes_list
=
[]
...
...
@@ -227,23 +228,19 @@ class CustomReportHandler:
for
merge_index
,
border_value
in
border_json
.
items
():
# (Start Rows, Start Column, End Row, End Column, Title, Format)
worksheet
.
merge_range
(
*
merge_index
,
border_value
,
workbook
.
add_format
(
SterliteRefineryTemplate
.
COLUMN_HEADER_FORMAT
)
)
workbook
.
add_format
(
header_merge_format
))
# Write the column headers with the defined format.
for
col_index
,
value
in
enumerate
(
result_df
.
columns
.
values
):
if
value
:
worksheet
.
write
(
start_row
,
col_index
,
value
,
workbook
.
add_format
(
SterliteRefineryTemplate
.
COLUMN_HEADER_FORMAT
)
workbook
.
add_format
(
column_merge_format
)
)
else
:
worksheet
.
write
(
start_row
,
col_index
,
value
,
workbook
.
add_format
(
SterliteRefineryTemplate
.
BLANK_COLUMN_HEADER_FORMAT
)
workbook
.
add_format
(
blank_merge_format
)
)
logger
.
info
(
f
"Shape of current data frame is {result_df.shape}"
)
...
...
@@ -258,9 +255,10 @@ class CustomReportHandler:
message
=
"Error generating a message"
data
=
input_json
[
"file_name"
]
try
:
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
:
logger
.
info
(
"Generating custom date filter with in the range"
)
# Getting custom date range using start date and end date
...
...
@@ -304,6 +302,9 @@ class CustomReportHandler:
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
]:
...
...
@@ -334,6 +335,84 @@ class CustomReportHandler:
workbook
.
formats
[
0
]
.
set_align
(
'center'
)
logger
.
info
(
f
"Report completed for: {each_date_range}"
)
if
str
(
input_json
[
"job_type"
])
.
lower
()
==
ReportType
.
ACP_REPORT
:
logger
.
info
(
"Generating custom date filter with in the range"
)
# Getting custom date range using start date and end date
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"
)
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
# Add a header format.
main_header_format
=
workbook
.
add_format
(
ACPReportTemplate
.
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
.
ACP_WORKSHEET_NAME
,
main_header_format
)
# Setting width to the column
worksheet
.
set_column
(
0
,
total_column
,
CommonConstants
.
OVERALL_COLUMN_WIDTH
)
# Center alignment of Excel data
workbook
.
formats
[
0
]
.
set_align
(
'center'
)
logger
.
info
(
f
"Report completed for: {each_date_range}"
)
except
GeneralException
as
err
:
logger
.
error
(
f
"Exception in custom_report_handler: {err}"
)
return
status
,
message
,
data
scripts/template/acp_report_template.py
0 → 100644
View file @
fab8800d
from
scripts.constants
import
PostgresConstant
from
scripts.core.db.postgres.custom_report_query
import
ACPQuery
class
ACPReportTemplate
:
WORKSHEET_HEADER_FORMAT
=
{
"bold"
:
True
,
"align"
:
"center"
,
"valign"
:
"center"
,
"fg_color"
:
"#e6e7eb"
,
"font_color"
:
"#1b314f"
,
"border"
:
1
,
'font_size'
:
'20'
,
}
COLUMN_HEADER_FORMAT
=
{
"bold"
:
True
,
"align"
:
"center"
,
"valign"
:
"center"
,
"fg_color"
:
"#e6e7eb"
,
"font_color"
:
"#021b5e"
,
"border"
:
1
,
}
BLANK_COLUMN_HEADER_FORMAT
=
{
"bold"
:
True
,
"align"
:
"center"
,
"valign"
:
"center"
,
}
REPORT_TEMPLATE
=
[
{
"BLANK"
:
{
"columns"
:
[
None
],
"data"
:
[],
"query"
:
{},
"data_column"
:
[
None
]
},
},
{
"PARTICULARS"
:
{
"columns"
:
[
"PARTICULARS"
,
"UNITS"
,
"ON DATE"
,
"MTD"
],
"query"
:
{
"Production"
:
[
ACPQuery
.
Particulars
.
QUERY_1
,
ACPQuery
.
Particulars
.
QUERY_2
,
],
"FO"
:
[
ACPQuery
.
FO
.
QUERY_1
,
ACPQuery
.
FO
.
QUERY_2
,
],
"PNG/LPG"
:
[
],
"Rejection"
:
[
ACPQuery
.
Rejection
.
QUERY_1
,
ACPQuery
.
Rejection
.
QUERY_2
,
],
"Power"
:
[
]
},
"data"
:
[],
"data_column"
:
[
"particulars"
,
"units"
,
"on_date"
,
"mtd"
],
},
"BLANK"
:
{
"columns"
:
[
None
],
"data"
:
[],
"query"
:
{},
"data_column"
:
[
None
]
},
"PERSONS ON DUTY"
:
{
"columns"
:
[
"PERSONS ON DUTY"
,
"A"
,
"B"
,
"C"
],
"query"
:
{
"PersonsOnDuty"
:
[
ACPQuery
.
PersonsOnDuty
.
QUERY_1
,
]
},
"data"
:
[],
"data_column"
:
[
"persons_on_duty"
,
"a"
,
"b"
,
"c"
],
},
"BLANK1"
:
{
"columns"
:
[
None
],
"data"
:
[],
"query"
:
{},
"data_column"
:
[
None
]
},
"ANODE LUG THICKNESS"
:
{
"columns"
:
[
"ANODE LUG THICKNESS (22-32 mm)"
,
"ANODE BODY THICKNESS (31-41 mm)"
],
"query"
:
{
"AnodeLugThickness"
:
[
ACPQuery
.
AnodeLugThickness
.
QUERY_1
,
]
},
"data"
:
[],
"data_column"
:
[
"anode_lug_thickness"
,
"anode_body_thickness"
],
},
},
{
"A-SHIFT COMMUNICATION"
:
{
"columns"
:
[
"S.No"
,
"A-SHIFT COMMUNICATION"
],
"query"
:
{
"AShiftCommunication"
:
[
ACPQuery
.
AShiftCommunication
.
QUERY_1
,
],
},
"data"
:
[],
"data_column"
:
[
"s_no"
,
"a_shift_comm"
],
},
"SHIFTWISE DATA"
:
{
"columns"
:
[
"MOULD"
,
"SET VALUE"
,
"FIELD WT"
],
"query"
:
{
"ShiftwiseData"
:
[
ACPQuery
.
PersonsOnDuty
.
QUERY_1
,
]
},
"data"
:
[],
"data_column"
:
[
"mould"
,
"set_value"
,
"field_wt"
],
"addition"
:
{
"merge_header"
:
"SHIFTWISE DATA"
}
}
}
]
scripts/template/
sterlite
_report_template.py
→
scripts/template/
refinery
_report_template.py
View file @
fab8800d
File moved
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment