This script will delete iexpense report from backend, also it will realesed credit card (if any) transaction related to this expense report. So we can create new expense report against that credit card transaction.
Script:
Script:
DECLARE
P_ReportID NUMBER := &report_header_id;
l_TempReportHeaderID NUMBER;
l_TempReportLineID NUMBER;
l_childItemKeySeq NUMBER;
l_wf_active BOOLEAN := FALSE;
l_wf_exist BOOLEAN := FALSE;
l_end_date wf_items.end_date%TYPE;
l_child_item_key varchar2(2000);
CURSOR ReportLines IS
(SELECT REPORT_HEADER_ID, REPORT_LINE_ID FROM AP_EXPENSE_REPORT_LINES_ALL WHERE REPORT_HEADER_ID = P_ReportID);
BEGIN
DBMS_OUTPUT.PUT_LINE('Start Deleting Report ' || P_ReportID);
DBMS_OUTPUT.PUT('Delete Distributions - ');
DELETE FROM AP_EXP_REPORT_DISTS_ALL WHERE REPORT_HEADER_ID = P_ReportID;
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
DBMS_OUTPUT.PUT('Delete Attendees - ');
DELETE FROM OIE_ATTENDEES_ALL oat WHERE oat.REPORT_LINE_ID IN ( SELECT REPORT_LINE_ID FROM ap_expense_report_lines_all WHERE report_header_id = P_ReportID);
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
DBMS_OUTPUT.PUT('Delete Add on Mileage Rates - ');
DELETE FROM OIE_ADDON_MILEAGE_RATES addon WHERE addon.REPORT_LINE_ID IN ( SELECT REPORT_LINE_ID FROM ap_expense_report_lines_all WHERE report_header_id = P_ReportID);
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
DBMS_OUTPUT.PUT('Delete Perdiem Daily Breakup - ');
DELETE FROM OIE_PDM_DAILY_BREAKUPS db WHERE db.REPORT_LINE_ID IN ( SELECT REPORT_LINE_ID FROM ap_expense_report_lines_all WHERE report_header_id = P_ReportID);
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
DBMS_OUTPUT.PUT('Delete Perdiem Destinations - ');
DELETE FROM OIE_PDM_DESTINATIONS db WHERE db.REPORT_LINE_ID IN ( SELECT REPORT_LINE_ID FROM ap_expense_report_lines_all WHERE report_header_id = P_ReportID);
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
DBMS_OUTPUT.PUT('Delete Policy Violations - ');
DELETE FROM AP_POL_VIOLATIONS_ALL WHERE REPORT_HEADER_ID = P_ReportID;
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
DBMS_OUTPUT.PUT('Update CC transactions, make them available for future reports - ');
UPDATE AP_CREDIT_CARD_TRXNS_ALL SET REPORT_HEADER_ID = NULL, EXPENSED_AMOUNT = 0 WHERE REPORT_HEADER_ID = P_ReportID;
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
OPEN ReportLines;
DBMS_OUTPUT.PUT_LINE('Delete Attachments');
LOOP
FETCH ReportLines into l_TempReportHeaderID, l_TempReportLineID;
EXIT WHEN ReportLines%NOTFOUND;
/* Delete attachments assocated with the line */
fnd_attached_documents2_pkg.delete_attachments(
X_entity_name => 'OIE_LINE_ATTACHMENTS',
X_pk1_value => l_TempReportLineID,
X_delete_document_flag => 'Y'
);
END LOOP;
CLOSE ReportLines;
DBMS_OUTPUT.PUT('Delete Report Lines - ');
DELETE FROM ap_expense_report_lines_all WHERE report_header_id = P_ReportID;
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
AP_WEB_NOTES_PKG.DeleteERNotes (
p_src_report_header_id => P_ReportID
);
fnd_attached_documents2_pkg.delete_attachments(
X_entity_name => 'OIE_HEADER_ATTACHMENTS',
X_pk1_value => P_ReportID,
X_delete_document_flag => 'Y'
);
DBMS_OUTPUT.PUT('Delete Report - ');
DELETE FROM ap_expense_report_headers_all WHERE report_header_id = P_ReportID;
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
DBMS_OUTPUT.PUT_LINE('Stop and purge all workflows');
begin
select end_date
into l_end_date
from wf_items
where item_type = 'APEXP'
and item_key = to_char(P_ReportID);
if l_end_date is NULL then
l_wf_active := TRUE;
else
l_wf_active := FALSE;
end if;
l_wf_exist := TRUE;
exception
when no_data_found then
l_wf_active := FALSE;
l_wf_exist := FALSE;
end;
IF l_wf_exist THEN
IF l_wf_active THEN
wf_engine.AbortProcess (itemtype => 'APEXP',
itemkey => to_char(P_ReportID),
cascade => TRUE);
END IF;
begin
l_childItemKeySeq := WF_ENGINE.GetItemAttrNumber('APEXP',
P_ReportID,
'AME_CHILD_ITEM_KEY_SEQ');
exception
when others then
if (wf_core.error_name = 'WFENG_ITEM_ATTR') then
l_childItemKeySeq := 0;
else
raise;
end if;
end;
IF (l_childItemKeySeq IS NOT NULL AND l_childItemKeySeq > 0) THEN
FOR i in 1 .. l_childItemKeySeq LOOP
l_child_item_key := to_char(P_ReportID) || '-' || to_char(i);
begin
select end_date
into l_end_date
from wf_items
where item_type = 'APEXP'
and item_key = l_child_item_key;
if l_end_date is NULL then
l_wf_active := TRUE;
else
l_wf_active := FALSE;
end if;
l_wf_exist := TRUE;
exception
when no_data_found then
l_wf_active := FALSE;
l_wf_exist := FALSE;
end;
IF (l_wf_exist) THEN
IF l_wf_active THEN
wf_engine.AbortProcess (itemtype => 'APEXP',
itemkey => l_child_item_key,
cascade => TRUE);
END IF;
wf_purge.Items(itemtype => 'APEXP',
itemkey => l_child_item_key);
wf_purge.TotalPerm(itemtype => 'APEXP',
itemkey => l_child_item_key,
runtimeonly => TRUE);
END IF;
END LOOP;
END IF;
wf_purge.Items(itemtype => 'APEXP',
itemkey => to_char(P_ReportID));
wf_purge.TotalPerm(itemtype => 'APEXP',
itemkey => to_char(P_ReportID),
runtimeonly => TRUE);
END IF;
DBMS_OUTPUT.PUT_LINE('Done Deleting Report ' || P_ReportID);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
Dbms_Output.put_line(SQLERRM);
END;
Great Blog. Thank you for sharing Expense Report Software | Expense Tracker
ReplyDeleteYour Blog is really great, it was so interesting to read & thanks to you for posting such a good blog, keep updates regularly. Expense Report Software | Expense Tracker
ReplyDelete