Professional Documents
Culture Documents
Docshare - Tips Mileage
Docshare - Tips Mileage
XXEAM_ZONAR_MILEAGE_PKG
IS
/* *************************************************************************** *
/
/* $Header : XXEAM_ZONAR_MILEAGE_PKG.pkb 1.0 06-JUN-2012 *
/
/* Name : XXEAM_ZONAR_MILEAGE_PKG.pkb *
/
/* Copyright : Global PTM *
/
/* *
/
/* Created On: 22-MAY-2012 *
/
/* Created By: Malathy Muthu *
/
/* Purpose : Package to perform Zonar Mileage Integration *
/
/* *************************************************************************** *
/
/* Modification History: *
/
/* Version By Date Comments *
/
/* 1.0 Malathy Muthu 06-JUN-2012 Initial Version *
/
/* *
/
/* *************************************************************************** *
/
pv_request_id NUMBER (15) := FND_GLOBAL.conc_request_id;-- Request Id
pv_user_id NUMBER (15) := FND_GLOBAL.user_id; -- User Id
pv_login_id NUMBER (15) := FND_GLOBAL.login_id; -- Login Id
pv_date DATE := SYSDATE;
PROCEDURE debug(p_message VARCHAR2)
IS
BEGIN
fnd_file.put_line(fnd_file.LOG,p_message);
END;
PROCEDURE print(p_message VARCHAR2)
IS
BEGIN
fnd_file.put_line(fnd_file.OUTPUT,p_message);
END;
PROCEDURE SEND_EMAIL(
P_SUBJECT IN VARCHAR2,
P_MESSAGE IN VARCHAR2,
P_RET_STATUS OUT NUMBER,
P_RET_MESSAGE OUT VARCHAR2)
IS
P_SENDER VARCHAR2(4000);
P_RECIPIENTS VARCHAR2(4000);
P_CC VARCHAR2(4000) := NULL;
P_MESSAGE1 VARCHAR2(4000);
BEGIN
P_MESSAGE1 := P_MESSAGE||' Request Id is :'||pv_request_id;
IF PV_USER_ID IS NOT NULL THEN
BEGIN
SELECT email_address
INTO p_recipients
FROM fnd_user
WHERE user_id = pv_user_id
AND start_date <= TRUNC(SYSDATE)
AND NVL(end_date,TRUNC(SYSDATE+1)) > TRUNC(SYSDATE);
EXCEPTION WHEN OTHERS THEN
p_recipients := NULL;
END;
END IF;
debug('Global User id is :'||pv_user_id);
debug('Email Address associated with the user id is :'||p_recipients);
debug('Inside Send_Email Procedure');
IF p_recipients IS NOT NULL THEN
debug('Inside If');
IF (( P_RECIPIENTS IS NOT NULL) AND
( P_CC IS NOT NULL ) AND
( P_SUBJECT IS NOT NULL) AND ( P_MESSAGE IS NOT NULL)
) THEN
UTL_MAIL.SEND ( SENDER => P_RECIPIENTS,
RECIPIENTS => P_RECIPIENTS,
CC => P_CC,
SUBJECT => P_SUBJECT,
MESSAGE => P_MESSAGE1);
P_RET_STATUS := 0;
P_RET_MESSAGE := 'Success';
debug('Inside Send_Email Procedure :Success');
ELSIF ( P_CC IS NULL ) THEN
debug('Inside elsif');
UTL_MAIL.SEND ( SENDER => P_RECIPIENTS,
RECIPIENTS => P_RECIPIENTS,
SUBJECT => P_SUBJECT,
MESSAGE => P_MESSAGE1);
P_RET_STATUS := 0;
P_RET_MESSAGE := 'Success';
debug('Inside Send_Email Procedure :Success');
END IF;
END IF;
EXCEPTION
WHEN OTHERS THEN
debug('Error inside Send_Email Procedure. '||sqlcode||' '||sqlerrm);
P_RET_STATUS := SQLCODE;
P_RET_MESSAGE := SUBSTR(SQLERRM,1,150);
END SEND_EMAIL;
PROCEDURE PULL_FROM_ZONAR (p_customer IN VARCHAR2
,p_username IN VARCHAR2
,p_password IN VARCHAR2
,p_from_date IN DATE
,p_to_date IN DATE
,p_return_status OUT VARCHAR2
,p_err_msg OUT VARCHAR2
)
IS
/* *************************************************************************
*/
/* Purpose : procedure to read data from the zonar and convert the xml
*/
/* Parameters: file in oracle table
*/
/*
*/
/*
*/
/* *************************************************************************
*/
req UTL_HTTP.REQ;
resp UTL_HTTP.RESP;
value VARCHAR2(1024);
fileHandler UTL_FILE.FILE_TYPE;
l_datetime VARCHAR2(20);
f_file_name VARCHAR2(50) := 'xxeam_zonar_mileage' ;
ln_start_date NUMBER;
ln_end_date NUMBER;
x_doc_id NUMBER;
lv_dir_name VARCHAR2(200) := 'XXEAM_ZONAR_WO_MILAGE_IN';
p_dest_dir VARCHAR2(200) := 'XXEAM_ZONAR_WO_MILAGE_IN_ARC';
p_file_content CLOB;
lv_url_zonar VARCHAR2(2000);
lv_return_status VARCHAR2(50) := 'SUCCESS';
lv_err_msg VARCHAR2(4000);
ln_count NUMBER;
ln_line_count NUMBER:=0;
ln_tot_count NUMBER;
ld_check_date DATE;
p_ACCOUNT_CODE VARCHAR2(20);
p_ASSET_ID VARCHAR2(20);
p_TAGID VARCHAR2(20);
p_FLEET VARCHAR2(20);
p_EXSID VARCHAR2(20);
p_START_DATE VARCHAR2(30);
p_END_DATE VARCHAR2(30);
p_DISTANCE NUMBER;
p_UNITS VARCHAR2(20);
p_ZONE_NAME VARCHAR2(30);
p_xml_data SYS.XMLTYPE;
l_err_msg VARCHAR2(4000);
l_err_CODE NUMBER;
CURSOR cu_mileage_xml
IS SELECT *
FROM
XXEAM_MILEAGE_XML_V;
BEGIN
-- Start date and End Date of the previous day midnight
DEBUG('Executing...Start date and End Date of :' ||to_date(p_from_date,'dd-mon-
rrrr')||' '||to_Date(p_to_date,'dd-mon-rrrr'));
BEGIN
SELECT to_char(SYSDATE,'DDMMYYHH24MISS')
INTO l_datetime
FROM DUAL;
EXCEPTION WHEN OTHERS THEN
lv_return_status:= 'ERROR';
p_return_status:= 'ERROR';
lv_err_msg := 'Error while processing the start date and end date parame
ter for the zonar:'||sqlerrm||sqlcode;
PRINT(lv_err_msg);
DEBUG(lv_err_msg);
END;
BEGIN
f_file_name := f_file_name||l_datetime||'.xml';
fileHandler := UTL_FILE.FOPEN('XXEAM_ZONAR_WO_MILAGE_IN', f_file_name, 'W');
DEBUG('http://necmulticsc.zonarsystems.net/interface.php?customer='||p_custom
er||'&username='||p_username||'&password='||p_password||'&action=showposition&op
eration=multiaccntmileage&format=xml'
||'&start='||to_char(ln_start_date) ||'&end='||to_char(ln_end_date));
BEGIN
x_doc_id:= NULL;
SELECT XXNEC.XXEAM_ZONAR_MILEAGE_IN_SEQ.nextval
INTO x_doc_id
FROM dual;
p_file_content := xxeam_zonar2eam_xml_utility.GET_FILE_CONTENTS(f_file_nam
e,lv_dir_name);
INSERT INTO XXEAM_ZONAR_MILEAGE_IN_IDOCS
(
DOCUMENT_ID
, TRX_TYPE
, DOC
, DOCUMENT_NAME
, CREATION_DATE
, CREATED_BY
, UPDATE_DATE
, UPDATED_BY
, FILE_STATUS
)
VALUES
(
x_doc_id
, 'MILEAGE'
, xmltype.createXML(p_file_content)
, f_file_name
, SYSDATE
, NVL(apps.fnd_global.user_id,-1)
, SYSDATE
, NVL(apps.fnd_global.user_id,-1)
, 'ENTERED'
);
--PRINT('20-Insert the XML file from Zonar to a staging table COMPLETED SUCC
ESSFULL');
DEBUG('20-Insert the XML file from Zonar to a staging table COMPLETED SUCCES
SFULL');
SELECT count(1)
INTO ln_line_count
FROM XXEAM_MILEAGE_XML_V;
IF ln_line_count >0 THEN
INSERT INTO XXEAM_ZONAR_MILEAGE_BATCH VALUES
(
XXEAM_ZONAR_MILEAGE_BATCH_SEQ.NEXTVAL
, f_file_name
, ln_line_count
, p_from_date
, p_to_date
, ln_start_date
, ln_end_date
, NVL(apps.fnd_global.user_id,-1)
, TRUNC(SYSDATE)
, NVL(apps.fnd_global.user_id,-1)
, SYSDATE
);
COMMIT;
--PRINT('40-XML file view created successfully for the meter reading process
COMPLETED SUCCESSFULL');
DEBUG('40-XML file view created successfully for the meter reading process C
OMPLETED SUCCESSFULL');
EXCEPTION WHEN OTHERS THEN
ROLLBACK;
lv_return_status:= 'ERROR';
p_return_status:= 'ERROR';
lv_err_msg := 'Error while creating XML file view from the staged
zonar data:'||sqlerrm||sqlcode;
PRINT(lv_err_msg);
DEBUG(lv_err_msg);
END;
END IF;
p_return_status:=lv_return_status;
p_err_msg :=lv_err_msg;
END;
PROCEDURE PROCESS_DAY
IS
/* *************************************************************************
*/
/* Purpose : Procedure to process and group all the day
*/
/*
*/
/* *************************************************************************
*/
CURSOR cu_mileage
IS SELECT * FROM XXEAM_MILEAGE_PROCESS;
P_GPS_FLAG VARCHAR2(100);
P_EXSID VARCHAR2(30);
L_COUNT NUMBER;
l_err_msg VARCHAR2(4000);
l_err_CODE NUMBER;
BEGIN
-- Loop through to add the 4 hours to a day.
UPDATE XXEAM_ZONAR_MILEAGE_LINE
SET STATUS = 'NACSC'
,ERROR_MSG = 'Not Applicable CSC code.'
WHERE STATUS = 'NEW'
AND SUBSTR(ACCOUNT_CODE,LENGTH(ACCOUNT_CODE)-3,LENGTH(ACCOUNT_CODE)) IN (
SELECT MEANING FROM FND_LOOKUP_VALUES
WHERE LOOKUP_TYPE = 'NEC_ZONAR_MILEAGE_ORG_LIST
'
AND NVL(END_DATE_ACTIVE,SYSDATE)>= SYSDATE
and enabled_flag = 'Y');
COMMIT;
UPDATE XXEAM_ZONAR_MILEAGE_LINE
SET STATUS = 'NA-METER'
,ERROR_MSG = 'Asset Meter Association does not exist .'
WHERE STATUS = 'NEW'
AND EXSID NOT IN (
SELECT NAME FROM CSI_COUNTERS_TL
);
COMMIT;
UPDATE XXEAM_ZONAR_MILEAGE_LINE
SET STATUS = 'NULL-EXSID'
WHERE EXSID IS NULL;
COMMIT;
END;
BEGIN
lv_msg_err1 := NULL;
fnd_file.put_line ( fnd_file.log,'+---------***********************************
********************************************************************************
--------+');
FOR lcu_meter_reading IN cu_meter_reading
LOOP
lv_continue_flag := 'Y';
Begin
select substr(lcu_meter_asc.account_code,-4,4)
into l_wip_class
from dual;
exception
when others then
l_wip_class := Null;
end;
BEGIN
SELECT INVENTORY_ITEM_ID,
SERIAL_NUMBER,
CURRENT_ORGANIZATION_ID,
INV_ORGANIZATION_CODE
INTO lv_inventory_item_id,
lv_serial_number,
lv_organization_id,
lv_organization_code
FROM MTL_EAM_ASSET_NUMBERS_ALL_V EAMA
WHERE 1=1
AND INSTANCE_NUMBER = lcu_meter_asc.EXSID
AND WIP_ACCOUNTING_CLASS_CODE = l_wip_class
AND EAMA.MAINTAINABLE_FLAG = 'Y'
AND SYSDATE BETWEEN EAMA.ACTIVE_START_DATE AND NVL(EAMA.ACTIVE_
END_DATE,SYSDATE);
EXCEPTION
WHEN OTHERS THEN
lv_status_code := 'ERROR';
lv_err_msg := SUBSTR (SQLERRM, 1, 250);
UPDATE XXEAM_ZONAR_MILEAGE_LINE_PRO
SET status = 'INVALID-ASSET'
,error_msg = lv_err_msg
,update_date = pv_date
,updated_by = pv_user_id
WHERE line_id = lcu_meter_asc.line_id;
UPDATE XXEAM_ZONAR_MILEAGE_LINE
set status = 'INVALID-ASSET'
,ERROR_MSG = LV_ERR_MSG
,UPDATE_DATE = PV_DATE
,UPDATED_BY = PV_USER_ID
WHERE EXSID = lcu_meter_asc.EXSID
AND TRUNC(RUN_DATE) = TRUNC(lcu_meter_asc.RUN_DATE)
AND ACCOUNT_CODE = lcu_meter_asc.ACCOUNT_CODE;
COMMIT;
DEBUG('Exception WHEN OTHERS while validating asset number -
'||lcu_meter_asc.EXSID
||SUBSTR (SQLERRM, 1, 250)
);
END;
IF lv_continue_flag = 'Y' THEN
-- Check if Meter exists
BEGIN
SELECT meter_id
,meter_name
INTO ln_meter_id
,lv_meter_name
FROM eam_counters_v ECV
WHERE ECV.meter_name = lcu_meter_asc.EXSID
AND nvl(ECV.to_effective_date,sysdate) >= sysdate;
EXCEPTION
WHEN OTHERS
THEN
END IF;
END IF;
ELSE
BEGIN
debug('Updating staging table.');
UPDATE XXEAM_ZONAR_MILEAGE_LINE_PRO
SET status = 'UN-PROCESS'
,error_msg = NULL
,update_date = pv_date
,updated_by = pv_user_id
WHERE line_id = lcu_meter_asc.line_id;
debug('Rows updated for record id '||lcu_meter_reading.line_id
||' = '
||SQL%ROWCOUNT);
EXCEPTION
WHEN OTHERS THEN
debug('Exception: WHEN OTHERS -'||SUBSTR (SQLERRM, 1, 250));
fnd_file.put_line(fnd_file.log,( 'Unable to update staging t
able'
||' for record id :
'
|| lcu_meter_readin
g.line_id
|| '|'
|| 'Error :'
|| SUBSTR (SQLERRM,
1, 250)
));
END;
END IF; -- Continue flag end if
COMMIT;
END LOOP; -- Inner Loop
SELECT COUNT(DECODE(status,'NA-CSC',1))/6
,COUNT(DECODE(status,'NA-METER',1))/6
,COUNT(DECODE(status,'NULL-EXSID',1))/6
INTO lv_csc_count
,lv_meter_error
,lv_exsid_null
FROM XXEAM_ZONAR_MILEAGE_LINE
WHERE TRUNC(UPDATE_DATE) = TRUNC(SYSDATE);
debug('Load Summary report for the Date :'||TO_CHAR(TRUNC(SYSDATE),'D
D-MON-RRRR'));
-- debug('Total Number of Records :' || lv_total_record);
debug('Total Number of Processed Records :' || lv_success_count);
debug('Total Number of UnProcessed Records :' || lv_total_unprocess);
debug('Total Number of Error Records :' || lv_total_error);
fnd_file.put_line ( fnd_file.LOG,'+---------******************************
********************************************************************************
*****--------+');
fnd_file.put_line ( fnd_file.LOG,
(
'+------------------------------ Zonar Mileage Interface Statistics '||TO_
CHAR(TRUNC(SYSDATE),'DD-MON-RRRR')
||'-----------------------------+'
));
/* fnd_file.put_line ( fnd_file.output,
(
'Total Number of Records : ' || lv_total_record
));*/
fnd_file.put_line ( fnd_file.LOG,
(
'Total Number of Processed Records : ' || lv_success_count
));
fnd_file.put_line ( fnd_file.LOG,
(
'Total Number of Error Records : ' || lv_total_error
));
fnd_file.put_line ( fnd_file.LOG,
(
'Total Number of UnProcessed Records : ' || lv_total_unproces
s
));
fnd_file.put_line ( fnd_file.LOG,
(
'Total Number of Not Applicable CSC Records : ' || lv_csc_cou
nt
));
fnd_file.put_line ( fnd_file.LOG,
(
'Total Number of errors on Asset-Meter Association Records :
' || lv_meter_error
));
fnd_file.put_line ( fnd_file.LOG,
(
'Total Number of errors having null exsid in zonar : ' || lv_
exsid_null
));
END IF;
IF lv_total_error >0
THEN
debug('Error records exist.');
fnd_file.put_line ( fnd_file.LOG,
(
' '
));
fnd_file.put_line ( fnd_file.LOG,
('+----------------------------- Error Details '
||'-----------------------------+'
));
fnd_file.put_line ( fnd_file.LOG,
( RPAD ('Meter Name', 20)
|| ' '
|| RPAD ('Date', 30)
|| ' '
|| RPAD ('Elapsed', 20)
|| ' '
|| RPAD ('Status', 20)
|| ' '
|| RPAD ('Error Message', 50)
));
fnd_file.put_line ( fnd_file.LOG,
(RPAD ('-----------', 20)
|| ' '
|| RPAD ('-----------------', 30)
|| ' '
|| RPAD ('-----------------', 20)
|| ' '
|| RPAD ('-----------------', 20)
|| ' '
|| RPAD ('-------------', 50)
));
debug('Printing error details');
FOR meter_error IN ( SELECT DISTINCT exsid NAME, TO_CHAR(run_date,'DD
-MON-RRRR') run_date,distance,status,error_msg
FROM XXEAM_ZONAR_MILEAGE_LINE_PRO
WHERE status = 'ERROR'
AND TRUNC(UPDATE_DATE) = TRUNC(SYSDATE)
ORDER BY NAME)
LOOP
fnd_file.put_line ( fnd_file.LOG,
(RPAD (meter_error.NAME,20)
|| ' '
|| RPAD (meter_error.run_date, 30)
|| ' '
|| RPAD (meter_error.distance, 20)
|| ' '
|| RPAD (meter_error.status, 20)
|| ' '
|| meter_error.error_msg
));
END LOOP;
END IF;
IF lv_total_unprocess >0 THEN
fnd_file.put_line ( fnd_file.LOG,'+----------------------------------Pr
inting Unprocessed meter details'
||'---------------------------------
-+');
fnd_file.put_line ( fnd_file.LOG,
( RPAD ('Meter Name', 20)
|| ' '
|| RPAD ('Date', 30)
|| ' '
|| RPAD ('Elapsed', 20)
|| ' '
|| RPAD ('Status', 20)
|| ' '
|| RPAD ('Error Message', 50)
));
fnd_file.put_line ( fnd_file.LOG,
(RPAD ('-----------', 20)
|| ' '
|| RPAD ('-----------------', 30)
|| ' '
|| RPAD ('-----------------', 20)
|| ' '
|| RPAD ('-----------------', 20)
|| ' '
|| RPAD ('-------------', 50)
));
END IF;
END IF;
END IF;
debug('print_process_details complete');
fnd_file.put_line ( fnd_file.LOG,'+---------*******************************
********************************************************************************
****--------+');
l_return_status VARCHAR2(80):='SUCCESS';
l_msg_data VARCHAR2(2000);
p_from_date DATE;
p_to_date DATE;
lv_msg_err1 varchar2(4000) := null;
BEGIN
IF p_action = 'VALIDATE' THEN
LOOP
BEGIN
-- FIND THE FROM DATE FROM THE LAST RUN
SELECT run_date +1/6
INTO p_from_date
FROM xxeam_zonar_mileage_batch ZBAT
,xxeam_zonar_mileage_line BLIN
WHERE ZBAT.batch_id = BLIN.batch_id
AND ZBAT.batch_id = (SELECT MAX(BATCH_ID) FROM xxeam_zonar_mileage_batch)
AND ROWNUM=1;
p_to_date:= p_from_date +1/6;
debug('p_from_date:'||to_char(p_from_date,'dd-mon-rrrr'));
debug('p_to_date:'||to_char(p_to_date,'dd-mon-rrrr'));
EXCEPTION WHEN OTHERS THEN
p_from_date := TRUNC(sysdate)-1;
p_to_date := (TRUNC(sysdate)-1)+1/6;
END;
EXIT WHEN (trunc(p_FROM_date) >= TRUNC(sysdate) OR l_return_status= 'ERROR')
;
PULL_FROM_ZONAR ( p_customer
,p_username
,p_password
,p_from_date
,p_to_date
,l_return_status
,l_msg_data
);
IF l_return_status = 'ERROR' THEN
p_retcode := 2;
PRINT('Import from Zonar to the Staging table failed. Please review output
and log file to correct it.');
ELSE
DEBUG('Import from Zonar to the Staging table COMPLETED SUCCESSFULLY.'||to_
char(p_to_date,'dd-mon-rrrr'));
-- Call the process to create the meter reading.
END IF;
END LOOP;
PROCESS_DAY;
CREATE_METER_READING(lv_msg_err1);
if lv_msg_err1 is not null then
p_retcode := 1;
print('Meter Reading API errors. Check the log file for details');
end if;
PRINT_IMPORT_STATUS;
END IF;
IF p_action = 'IMPORT' THEN
CREATE_METER_READING(lv_msg_err1);