This commit is contained in:
Zeeshaun
2026-03-31 14:32:23 -05:00
parent f4646dc97f
commit 9be174da46
485 changed files with 37290 additions and 0 deletions
@@ -0,0 +1,231 @@
--BASED ON SPEC 1.6 BATCH PAYOFF QUOTES
WITH CTE_DATES AS (
SELECT Y.*,
Y.DATE_RUN+Y.PAYOFF_DAYS AS EXPIRATION_DATE,
CASE
WHEN Y.DAYS_LEFT_IN_MONTH<=11 OR Y.DAY_OF_MONTH<=2 THEN 1
ELSE 0
END AS PAYOFF_INDICATOR
FROM (/*DO IN TWO STEPS TO TROUBLESHOOT*/
SELECT X.DATE_RUN,
11 AS PAYOFF_DAYS,
ADD_MONTHS(TRUNC(X.DATE_RUN,'YEAR'),12)-TRUNC(X.DATE_RUN,'YEAR') AS DAYS_IN_YEAR,
(ADD_MONTHS(TRUNC(X.DATE_RUN,'MONTH'),1)-1)-X.DATE_RUN AS DAYS_LEFT_IN_MONTH,
CAST(TO_CHAR(X.DATE_RUN,'DD') AS INT) AS DAY_OF_MONTH
FROM (
SELECT TO_DATE(:dateRange,'YYYY-MM-DD') AS DATE_RUN
FROM DUAL
) X
) Y
), CTE_LOANS_IN_SCOPE AS (/*PAYOFF CALCULATIONS ARE REALLY IMPORTANT, IF FAILS NEED TO FILL IN DAYS*/
SELECT A.ACCTNBR,
A.TAXRPTFORORGNBR,
A.TAXRPTFORPERSNBR,
COALESCE(CAST(AMT.VALUE AS NUMERIC(12,2)),0) AS PAYOFF_VALUE,
DR.PAYOFF_DAYS+(DR.DATE_RUN-TO_DATE(DT.VALUE,'YYYY-MM-DD')) AS PAYOFF_DAYS,
DR.EXPIRATION_DATE,
DR.PAYOFF_INDICATOR,
DR.DAYS_IN_YEAR,
DR.DATE_RUN,
A.DATEMAT
FROM OSIBANK.ACCT A
INNER JOIN CTE_DATES DR ON 1=1
INNER JOIN OSIBANK.ACCTUSERFIELD AMT ON AMT.ACCTNBR=A.ACCTNBR AND AMT.USERFIELDCD='8AUF'
INNER JOIN OSIBANK.ACCTUSERFIELD DT ON DT.ACCTNBR=AMT.ACCTNBR AND DT.USERFIELDCD='8DUF' AND DT.VALUE IS NOT NULL
WHERE A.CURRACCTSTATCD IN ('ACT','NPFM')
AND (
(A.MJACCTTYPCD='CNS' AND A.CURRMIACCTTYPCD LIKE 'DL%')
OR
(A.MJACCTTYPCD='CNS' AND A.CURRMIACCTTYPCD LIKE 'DV%')
OR
(A.MJACCTTYPCD='CML' AND A.CURRMIACCTTYPCD='BE21')
)
AND A.ACCTNBR = :accountNumber
), CTE_PRIMARY AS (
SELECT X.ACCTNBR,
UPPER(X.LASTNAME) AS LASTNAME,
UPPER(X.FIRSTNAME) AS FIRSTNAME,
UPPER(X.MDLINIT) AS MDLINIT,
X.ORGNAME,
X.PRIVACYYN AS OPTOUTCODE,
TRIM(REGEXP_REPLACE(AD.CITYNAME,'( ){2,}',' ')) AS CITY,
TRIM(AD.STATECD) AS STATE,
TRIM(REGEXP_REPLACE(AL.LINE1,'( ){2,}',' ')) AS ADDRESS_1,
TRIM(REGEXP_REPLACE(AL.LINE2||' '||AL.LINE3,'( ){2,}',' ')) AS ADDRESS_2,
TRIM(REGEXP_REPLACE(AD.ZIPCD||CASE WHEN LPAD(AD.ZIPSUF,4,'0')='0000' THEN NULL ELSE LPAD(AD.ZIPSUF,4,'0') END,'( ){2,}',' ')) AS ZIP
FROM
(
SELECT A.ACCTNBR,
PAU.ADDRNBR,
P1.PRIVACYYN,
P1.LASTNAME,
P1.FIRSTNAME,
P1.MDLINIT,
NULL AS ORGNAME
FROM CTE_LOANS_IN_SCOPE A
INNER JOIN OSIBANK.PERS P1 ON P1.PERSNBR=A.TAXRPTFORPERSNBR
LEFT JOIN OSIBANK.PERSADDRUSE PAU ON PAU.PERSNBR=P1.PERSNBR AND PAU.ADDRUSECD='PRI'
UNION ALL
SELECT A.ACCTNBR,
OAU.ADDRNBR,
O1.PRIVACYYN,
NULL AS LASTNAME,
NULL AS FIRSTNAME,
NULL AS MDLINIT,
O1.ORGNAME
FROM CTE_LOANS_IN_SCOPE A
INNER JOIN OSIBANK.ORG O1 ON O1.ORGNBR=A.TAXRPTFORORGNBR
LEFT JOIN OSIBANK.ORGADDRUSE OAU ON OAU.ORGNBR=O1.ORGNBR AND OAU.ADDRUSECD='PRI'
) X
LEFT JOIN OSIBANK.ADDR AD ON AD.ADDRNBR=X.ADDRNBR
LEFT JOIN (
SELECT X.ADDRNBR,
MAX(DECODE(X.LINENUM,1,X.TEXT,NULL)) AS LINE1,
MAX(DECODE(X.LINENUM,2,X.TEXT,NULL)) AS LINE2,
MAX(DECODE(X.LINENUM,3,X.TEXT,NULL)) AS LINE3
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY AL.ADDRNBR ORDER BY AL.LINENBR) AS LINENUM,
AL.ADDRNBR,
AL.TEXT
FROM OSIBANK.ADDRLINE AL
INNER JOIN OSIBANK.ADDRLINETYP ALT ON AL.ADDRLINETYPCD=ALT.ADDRLINETYPCD
WHERE ALT.MAILADDRYN='Y'
) X
GROUP BY X.ADDRNBR
) AL ON AL.ADDRNBR=AD.ADDRNBR
), CTE_EXCLUSIONS AS (
SELECT LIS.ACCTNBR
FROM CTE_LOANS_IN_SCOPE LIS
WHERE LIS.PAYOFF_INDICATOR=1 /*END/START OF MONTH*/
AND EXISTS (
SELECT 1
FROM OSIBANK.ACCTSUBACCT ASA
INNER JOIN OSIBANK.ACCTSUBACCTCALCVAR ASACV ON ASACV.ACCTNBR=ASA.ACCTNBR AND ASACV.SUBACCTNBR=ASA.SUBACCTNBR AND ASACV.CALCTYPCD=ASA.BALTYPCD
WHERE LIS.ACCTNBR=ASA.ACCTNBR
AND UPPER(ASA.BALTYPCD)='SINS'/*SIMPLE*/
AND UPPER(ASACV.CALCVARCD)='SCHD'/*SCHEDULE NUMBER*/
AND ASACV.CALCVALUEEFFDATE<=LIS.DATE_RUN
AND (ASACV.CALCINACTIVEDATE IS NULL OR ASACV.CALCINACTIVEDATE>=LIS.DATE_RUN)
AND (
/*MOB INSURANCE*/
UPPER(ASA.BALCATCD) IN ('JDIS'/*JOINT-DISAB*/,'JLIF'/*JOINT-LIFE*/,'SDIS'/*SINGLE-DISAB*/,'SING'/*SINGLE-LIFE*/)
OR
/*DEBT PROTECTION*/
UPPER(ASA.BALCATCD) IN ('DJD'/*DEBT-PRO-JOINT-DISAB*/,'DJL'/*DEBT-PRO-JOINT-LIFE*/,'DJLD'/*DEBT-PRO-JOINT-LIFE-DISAB*/,'DSD'/*DEBT-PRO-SINGLE-DISAB*/,'DSL'/*DEBT-PRO-SINGLE-LIFE*/,'DSLD'/*DEBT-PRO-SINGLE-LIFE-DISAB*/)
)
)
), CTE_STAGE AS (
SELECT LIS.ACCTNBR as ACCOUNTNUMBER,/*FOR TROUBLESHOOTING*/
CE.ACCTNBR AS EXCLUSIONS,/*FOR TROUBLESHOOTING*/
CAST(SUBSTR(CP.ACCTNBR,-4,4) AS VARCHAR2(4)) AS ACCOUNT,/*RIGHTMOST 4 DIGITS, MAXLENGTH 4*/
CAST(
CASE
WHEN LENGTH(AU.VALUE) IS NULL OR LENGTH(AU.VALUE)>3 THEN '1234'
ELSE AU.VALUE
END AS VARCHAR2(20)) AS LENDERID,/*LOOK IN USERFIELD MAXLENGTH 20*/
CP.OPTOUTCODE,/*MAIL MARKETING, MAXLENGTH 1*/
CAST(SUBSTR(COALESCE(CP.FIRSTNAME,CP.ORGNAME),0,20) AS VARCHAR2(20)) AS FIRSTNAME,/*MAXLENGTH 20*/
CAST(SUBSTR(CP.MDLINIT,0,1) AS VARCHAR2(1)) AS MIDDLENAME,/*MAXLENGTH 1*/
CAST(SUBSTR(COALESCE(CP.LASTNAME,CP.ORGNAME),0,20) AS VARCHAR2(20)) AS LASTNAME,/*MAXLENGTH 20*/
CAST(SUBSTR(CP.ADDRESS_1,0,20) AS VARCHAR2(20)) AS ADDRESS1,/*CLEAN UP IN ABOVE CTE, MAXLENGTH 20*/
CAST(SUBSTR(CP.ADDRESS_2,0,20) AS VARCHAR2(20)) AS ADDRESS2,/*CLEAN UP IN ABOVE CTE, MAXLENGTH 20*/
CAST(SUBSTR(CP.CITY,0,20) AS VARCHAR2(20)) AS CITY,/*CLEAN UP IN ABOVE CTE, MAXLENGTH 20*/
CAST(SUBSTR(CP.STATE,0,2) AS VARCHAR2(2)) AS STATE,/*DNA ALLOWS LONGER, MAXLENGTH 2*/
CAST(SUBSTR(CP.ZIP,0,9) AS VARCHAR2(9)) AS ZIPCODE, /*MAXLENGTH 9*/
CAST(NULL AS VARCHAR2(10)) AS HOMEPHONE, /*NULL IN PREVIOUS VERSION MAXLENGTH 10*/
CAST(NULL AS VARCHAR2(10)) AS BUSINESSPHONE, /*NULL IN PREVIOUS VERSION MAXLENGTH 10*/
CAST(SUBSTR(PR.PROPID,0,17) AS VARCHAR2(17)) AS VEHICLEVIN, /*DNA ALLOWS LONGER, MAXLENGTH 17*/
CAST(
CASE
WHEN LENGTH(PR.PROPYEARNBR)> 4 THEN NULL
ELSE PR.PROPYEARNBR
END
AS VARCHAR2(4)) AS VEHICLEYEAR, /*DNA ALLOWS LONGER, MAXLENGTH 4, NEEDS TO BE NUMERIC, WHICH DNA IS*/
CAST(SUBSTR(PR.PROPMAKE,0,20) AS VARCHAR2(20)) AS VEHICLEMAKE, /*DNA IS SHORTER, MAXLENGTH 20*/
CAST(SUBSTR(PR.PROPMODEL,0,20) AS VARCHAR2(20)) AS VEHICLEMODEL, /*DNA IS SHORTER, MAXLENGTH 20*/
CAST(NULL AS VARCHAR2(20)) AS VEHICLETRIM,/*NULL IN PREVIOUS VERSION MAXLENGTH 20*/
CAST(NULL AS VARCHAR2(40)) AS VEHICLEDESCRIPTION,/*NULL IN PREVIOUS VERSION MAXLENGTH 40*/
CAST('R' AS VARCHAR2(1)) AS PRODUCT,/*HARD-CODED IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 1*/
CAST(NULL AS VARCHAR2(20)) AS SUBPRODUCT,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 20*/
TO_CHAR(
CASE WHEN CE.ACCTNBR IS NOT NULL THEN 0
ELSE ROUND(LIS.PAYOFF_VALUE+(LIS.PAYOFF_DAYS*RATE.INTRATE/LIS.DAYS_IN_YEAR*CNB.BALAMT),2)
END
,'FM999990.00') AS NETPAYOFFAMOUNT,/*PER: KYLE MATHER-IF MOB OR DEBT PROTECTION THEN ZERO. MAXLENGTH 6.2*/
TO_CHAR(LIS.EXPIRATION_DATE,'YYYYMMDD') AS GOODUNTILDATE, /*CALCULATED, MAXLENGTH 8*/
TO_CHAR(LIS.DATEMAT,'YYYYMMDD') AS MATURITYDATE,
CASE
WHEN AC.ORIGTERM IS NULL OR AC.CONTRACTDATE IS NULL THEN 0--NO EXAMPLE OF NULL CONTRACT DATE BUT SYSTEM DOES NOT PREVENT IT
ELSE ROUND(MONTHS_BETWEEN(AC.CONTRACTDATE+AC.ORIGTERM, AC.CONTRACTDATE))
END AS TERMINMONTHS,/*MAXLENGTH2, PER KYLE MATHER SHOULD NOT BE LIMITED TO THIS*/
CASE
WHEN MONTHS_BETWEEN(LIS.DATEMAT,CDD.DUEDATE)<=0 THEN 0
ELSE MONTHS_BETWEEN(LIS.DATEMAT,CDD.DUEDATE)+1
END AS MONTHS_LEFT, /*MAXLENGTH 2, PER KYLE MATHER SHOULD NOT BE LIMITED TO THIS*/
CAST(NULL AS VARCHAR2(8)) AS NEXTPAYMENTDATE,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 8*/
TO_CHAR(ROUND(NVL(PMT.PMTAMT,0),2),'FM99990.00') AS MONTHLYPAYMENT, /*MAXLENGTH 5.2*/
CAST(NULL AS VARCHAR2(9)) AS GROSSPAYOFF,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 6.2*/
CAST(NULL AS VARCHAR2(9)) AS SECURITYDEPOSIT,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 6.2*/
CAST(NULL AS VARCHAR2(9)) AS RESIDUALVALUE,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 6.2*/
TO_CHAR(ROUND((RATE.INTRATE/LIS.DAYS_IN_YEAR*CNB.BALAMT),2),'FM999990.00') AS DOLLARDAYRATE,/*MAXLENGTH 6.2*/
CAST(NULL AS VARCHAR2(9)) AS BALLOONAMOUNT,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 6.2*/
CAST(
CASE
WHEN CE.ACCTNBR IS NOT NULL THEN 'Contact lender for payoff'
ELSE NULL
END
AS VARCHAR2(80)) AS PAYOFFMESSAGE,/*MAXLENGTH 80*/
CAST(NULL AS VARCHAR2(1)) AS PREAPPROVEDCODE,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 1*/
CAST(NULL AS VARCHAR2(20)) AS REFERENCENUMBER,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 20*/
CAST(NULL AS VARCHAR2(8)) AS EXPIRATIONDATE,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 8*/
CAST(NULL AS VARCHAR2(9)) AS BUYRATE,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 2.6*/
CAST(NULL AS VARCHAR2(8)) AS ACQUISITIONFEE,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 5.2*/
CAST(NULL AS VARCHAR2(8)) AS PARTICIPATIONPERCENT/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 3.2*/
FROM CTE_LOANS_IN_SCOPE LIS
INNER JOIN OSIBANK.ACCT AC ON AC.ACCTNBR=LIS.ACCTNBR
INNER JOIN CTE_PRIMARY CP ON CP.ACCTNBR=LIS.ACCTNBR
LEFT JOIN (
SELECT PMT.ACCTNBR,
SUM(PMT.PMTAMT) AS PMTAMT
FROM OSIBANK.ACCTPMTHIST PMT
INNER JOIN CTE_DATES CD ON 1=1
INNER JOIN OSIBANK.ACCTPMTSUBACCTHIST APSH ON APSH.ACCTNBR=PMT.ACCTNBR AND APSH.PMTNBR=PMT.PMTNBR AND APSH.EFFDATE=PMT.EFFDATE
INNER JOIN OSIBANK.ACCTSUBACCT ASA ON ASA.ACCTNBR=APSH.ACCTNBR AND ASA.SUBACCTNBR=APSH.SUBACCTNBR AND ASA.BALCATCD='NOTE' AND ASA.BALTYPCD IN ('OINT','BAL','DUE')
WHERE PMT.PMTTYPCD IN ('FB','FBI','FDUE')
AND PMT.EFFDATE<=CD.DATE_RUN
AND (PMT.INACTIVEDATE>CD.DATE_RUN OR PMT.INACTIVEDATE IS NULL)
AND (APSH.INACTIVEDATE>CD.DATE_RUN OR APSH.INACTIVEDATE IS NULL)
GROUP BY PMT.ACCTNBR
) PMT ON PMT.ACCTNBR=LIS.ACCTNBR
LEFT JOIN (
SELECT ARH.ACCTNBR,
ARH.INTRATE,
ROW_NUMBER() OVER (PARTITION BY ARH.ACCTNBR, ARH.SUBACCTNBR ORDER BY ARH.EFFDATE DESC) AS RWN
FROM OSIBANK.ACCTRATEHIST ARH
INNER JOIN OSIBANK.ACCTSUBACCT ASA ON ASA.ACCTNBR=ARH.ACCTNBR AND ASA.SUBACCTNBR=ARH.SUBACCTNBR AND ASA.BALCATCD='NOTE' AND ASA.BALTYPCD='BAL'
INNER JOIN CTE_DATES CD ON 1=1
WHERE ARH.EFFDATE<=CD.DATE_RUN AND (ARH.INACTIVEDATE>CD.DATE_RUN OR ARH.INACTIVEDATE IS NULL)
) RATE ON RATE.ACCTNBR=LIS.ACCTNBR AND RATE.RWN=1
LEFT JOIN OSIBANK.VIEW_LN_CURR_NOTEBAL CNB ON CNB.ACCTNBR=LIS.ACCTNBR
LEFT JOIN OSIBANK.ACCTPROP AP ON AP.ACCTNBR=LIS.ACCTNBR
LEFT JOIN OSIBANK.PROP PR ON PR.PROPNBR=AP.PROPNBR
LEFT JOIN OSIBANK.VIEW_LN_CURR_DUEDATE CDD ON CDD.ACCTNBR=LIS.ACCTNBR
LEFT JOIN OSIBANK.ACCTUSERFIELD AU ON AU.ACCTNBR=LIS.ACCTNBR AND AU.USERFIELDCD='DECD'
LEFT JOIN CTE_EXCLUSIONS CE ON CE.ACCTNBR=LIS.ACCTNBR
) /*MATCH REQUIREMENTS ON SPEC DOCUMENT*/
SELECT DISTINCT *
FROM CTE_STAGE S
WHERE S.ACCOUNT IS NOT NULL
AND S.LENDERID IS NOT NULL
AND S.FIRSTNAME IS NOT NULL
AND S.LASTNAME IS NOT NULL
AND S.ADDRESS1 IS NOT NULL
AND S.CITY IS NOT NULL
/*PER KYLE MATHER INCLUDE RECORDS WITHOUT STATE, REJECT ON DEALERTRACK INGEST SIDE*/
AND S.ZIPCODE IS NOT NULL
AND S.VEHICLEVIN IS NOT NULL
AND S.PRODUCT IS NOT NULL
AND S.NETPAYOFFAMOUNT IS NOT NULL
AND S.GOODUNTILDATE IS NOT NULL
AND S.MATURITYDATE IS NOT NULL
/*PER KYLE MATHER INCLUDE LOANS WITH MOB INSURANCE AND/OR DEBT PROTECTION*/
@@ -0,0 +1,233 @@
--BASED ON SPEC 1.6 BATCH PAYOFF QUOTES
WITH CTE_DATES AS (
SELECT Y.*,
Y.DATE_RUN+Y.PAYOFF_DAYS AS EXPIRATION_DATE,
CASE
WHEN Y.DAYS_LEFT_IN_MONTH<=11 OR Y.DAY_OF_MONTH<=2 THEN 1
ELSE 0
END AS PAYOFF_INDICATOR
FROM (/*DO IN TWO STEPS TO TROUBLESHOOT*/
SELECT X.DATE_RUN,
11 AS PAYOFF_DAYS,
ADD_MONTHS(TRUNC(X.DATE_RUN,'YEAR'),12)-TRUNC(X.DATE_RUN,'YEAR') AS DAYS_IN_YEAR,
(ADD_MONTHS(TRUNC(X.DATE_RUN,'MONTH'),1)-1)-X.DATE_RUN AS DAYS_LEFT_IN_MONTH,
CAST(TO_CHAR(X.DATE_RUN,'DD') AS INT) AS DAY_OF_MONTH
FROM (
SELECT TO_DATE(:dateRange,'YYYY-MM-DD') AS DATE_RUN
FROM DUAL
) X
) Y
), CTE_LOANS_IN_SCOPE AS (/*PAYOFF CALCULATIONS ARE REALLY IMPORTANT, IF FAILS NEED TO FILL IN DAYS*/
SELECT A.ACCTNBR,
A.TAXRPTFORORGNBR,
A.TAXRPTFORPERSNBR,
COALESCE(CAST(AMT.VALUE AS NUMERIC(12,2)),0) AS PAYOFF_VALUE,
DR.PAYOFF_DAYS+(DR.DATE_RUN-TO_DATE(DT.VALUE,'YYYY-MM-DD')) AS PAYOFF_DAYS,
DR.EXPIRATION_DATE,
DR.PAYOFF_INDICATOR,
DR.DAYS_IN_YEAR,
DR.DATE_RUN,
A.DATEMAT
FROM OSIBANK.ACCT A
INNER JOIN CTE_DATES DR ON 1=1
INNER JOIN OSIBANK.ACCTUSERFIELD AMT ON AMT.ACCTNBR=A.ACCTNBR AND AMT.USERFIELDCD='8AUF'
INNER JOIN OSIBANK.ACCTUSERFIELD DT ON DT.ACCTNBR=AMT.ACCTNBR AND DT.USERFIELDCD='8DUF' AND DT.VALUE IS NOT NULL
INNER JOIN OSIBANK.ACCTPROP AP ON AP.ACCTNBR=A.ACCTNBR
INNER JOIN OSIBANK.PROP PR ON PR.PROPNBR=AP.PROPNBR
WHERE A.CURRACCTSTATCD IN ('ACT','NPFM')
AND (
(A.MJACCTTYPCD='CNS' AND A.CURRMIACCTTYPCD LIKE 'DL%')
OR
(A.MJACCTTYPCD='CNS' AND A.CURRMIACCTTYPCD LIKE 'DV%')
OR
(A.MJACCTTYPCD='CML' AND A.CURRMIACCTTYPCD='BE21')
)
AND PR.PROPID = :VIN
), CTE_PRIMARY AS (
SELECT X.ACCTNBR,
UPPER(X.LASTNAME) AS LASTNAME,
UPPER(X.FIRSTNAME) AS FIRSTNAME,
UPPER(X.MDLINIT) AS MDLINIT,
X.ORGNAME,
X.PRIVACYYN AS OPTOUTCODE,
TRIM(REGEXP_REPLACE(AD.CITYNAME,'( ){2,}',' ')) AS CITY,
TRIM(AD.STATECD) AS STATE,
TRIM(REGEXP_REPLACE(AL.LINE1,'( ){2,}',' ')) AS ADDRESS_1,
TRIM(REGEXP_REPLACE(AL.LINE2||' '||AL.LINE3,'( ){2,}',' ')) AS ADDRESS_2,
TRIM(REGEXP_REPLACE(AD.ZIPCD||CASE WHEN LPAD(AD.ZIPSUF,4,'0')='0000' THEN NULL ELSE LPAD(AD.ZIPSUF,4,'0') END,'( ){2,}',' ')) AS ZIP
FROM
(
SELECT A.ACCTNBR,
PAU.ADDRNBR,
P1.PRIVACYYN,
P1.LASTNAME,
P1.FIRSTNAME,
P1.MDLINIT,
NULL AS ORGNAME
FROM CTE_LOANS_IN_SCOPE A
INNER JOIN OSIBANK.PERS P1 ON P1.PERSNBR=A.TAXRPTFORPERSNBR
LEFT JOIN OSIBANK.PERSADDRUSE PAU ON PAU.PERSNBR=P1.PERSNBR AND PAU.ADDRUSECD='PRI'
UNION ALL
SELECT A.ACCTNBR,
OAU.ADDRNBR,
O1.PRIVACYYN,
NULL AS LASTNAME,
NULL AS FIRSTNAME,
NULL AS MDLINIT,
O1.ORGNAME
FROM CTE_LOANS_IN_SCOPE A
INNER JOIN OSIBANK.ORG O1 ON O1.ORGNBR=A.TAXRPTFORORGNBR
LEFT JOIN OSIBANK.ORGADDRUSE OAU ON OAU.ORGNBR=O1.ORGNBR AND OAU.ADDRUSECD='PRI'
) X
LEFT JOIN OSIBANK.ADDR AD ON AD.ADDRNBR=X.ADDRNBR
LEFT JOIN (
SELECT X.ADDRNBR,
MAX(DECODE(X.LINENUM,1,X.TEXT,NULL)) AS LINE1,
MAX(DECODE(X.LINENUM,2,X.TEXT,NULL)) AS LINE2,
MAX(DECODE(X.LINENUM,3,X.TEXT,NULL)) AS LINE3
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY AL.ADDRNBR ORDER BY AL.LINENBR) AS LINENUM,
AL.ADDRNBR,
AL.TEXT
FROM OSIBANK.ADDRLINE AL
INNER JOIN OSIBANK.ADDRLINETYP ALT ON AL.ADDRLINETYPCD=ALT.ADDRLINETYPCD
WHERE ALT.MAILADDRYN='Y'
) X
GROUP BY X.ADDRNBR
) AL ON AL.ADDRNBR=AD.ADDRNBR
), CTE_EXCLUSIONS AS (
SELECT LIS.ACCTNBR
FROM CTE_LOANS_IN_SCOPE LIS
WHERE LIS.PAYOFF_INDICATOR=1 /*END/START OF MONTH*/
AND EXISTS (
SELECT 1
FROM OSIBANK.ACCTSUBACCT ASA
INNER JOIN OSIBANK.ACCTSUBACCTCALCVAR ASACV ON ASACV.ACCTNBR=ASA.ACCTNBR AND ASACV.SUBACCTNBR=ASA.SUBACCTNBR AND ASACV.CALCTYPCD=ASA.BALTYPCD
WHERE LIS.ACCTNBR=ASA.ACCTNBR
AND UPPER(ASA.BALTYPCD)='SINS'/*SIMPLE*/
AND UPPER(ASACV.CALCVARCD)='SCHD'/*SCHEDULE NUMBER*/
AND ASACV.CALCVALUEEFFDATE<=LIS.DATE_RUN
AND (ASACV.CALCINACTIVEDATE IS NULL OR ASACV.CALCINACTIVEDATE>=LIS.DATE_RUN)
AND (
/*MOB INSURANCE*/
UPPER(ASA.BALCATCD) IN ('JDIS'/*JOINT-DISAB*/,'JLIF'/*JOINT-LIFE*/,'SDIS'/*SINGLE-DISAB*/,'SING'/*SINGLE-LIFE*/)
OR
/*DEBT PROTECTION*/
UPPER(ASA.BALCATCD) IN ('DJD'/*DEBT-PRO-JOINT-DISAB*/,'DJL'/*DEBT-PRO-JOINT-LIFE*/,'DJLD'/*DEBT-PRO-JOINT-LIFE-DISAB*/,'DSD'/*DEBT-PRO-SINGLE-DISAB*/,'DSL'/*DEBT-PRO-SINGLE-LIFE*/,'DSLD'/*DEBT-PRO-SINGLE-LIFE-DISAB*/)
)
)
), CTE_STAGE AS (
SELECT LIS.ACCTNBR as ACCOUNTNUMBER,/*FOR TROUBLESHOOTING*/
CE.ACCTNBR AS EXCLUSIONS,/*FOR TROUBLESHOOTING*/
CAST(SUBSTR(CP.ACCTNBR,-4,4) AS VARCHAR2(4)) AS ACCOUNT,/*RIGHTMOST 4 DIGITS, MAXLENGTH 4*/
CAST(
CASE
WHEN LENGTH(AU.VALUE) IS NULL OR LENGTH(AU.VALUE)>3 THEN '1234'
ELSE AU.VALUE
END AS VARCHAR2(20)) AS LENDERID,/*LOOK IN USERFIELD MAXLENGTH 20*/
CP.OPTOUTCODE,/*MAIL MARKETING, MAXLENGTH 1*/
CAST(SUBSTR(COALESCE(CP.FIRSTNAME,CP.ORGNAME),0,20) AS VARCHAR2(20)) AS FIRSTNAME,/*MAXLENGTH 20*/
CAST(SUBSTR(CP.MDLINIT,0,1) AS VARCHAR2(1)) AS MIDDLENAME,/*MAXLENGTH 1*/
CAST(SUBSTR(COALESCE(CP.LASTNAME,CP.ORGNAME),0,20) AS VARCHAR2(20)) AS LASTNAME,/*MAXLENGTH 20*/
CAST(SUBSTR(CP.ADDRESS_1,0,20) AS VARCHAR2(20)) AS ADDRESS1,/*CLEAN UP IN ABOVE CTE, MAXLENGTH 20*/
CAST(SUBSTR(CP.ADDRESS_2,0,20) AS VARCHAR2(20)) AS ADDRESS2,/*CLEAN UP IN ABOVE CTE, MAXLENGTH 20*/
CAST(SUBSTR(CP.CITY,0,20) AS VARCHAR2(20)) AS CITY,/*CLEAN UP IN ABOVE CTE, MAXLENGTH 20*/
CAST(SUBSTR(CP.STATE,0,2) AS VARCHAR2(2)) AS STATE,/*DNA ALLOWS LONGER, MAXLENGTH 2*/
CAST(SUBSTR(CP.ZIP,0,9) AS VARCHAR2(9)) AS ZIPCODE, /*MAXLENGTH 9*/
CAST(NULL AS VARCHAR2(10)) AS HOMEPHONE, /*NULL IN PREVIOUS VERSION MAXLENGTH 10*/
CAST(NULL AS VARCHAR2(10)) AS BUSINESSPHONE, /*NULL IN PREVIOUS VERSION MAXLENGTH 10*/
CAST(SUBSTR(PR.PROPID,0,17) AS VARCHAR2(17)) AS VEHICLEVIN, /*DNA ALLOWS LONGER, MAXLENGTH 17*/
CAST(
CASE
WHEN LENGTH(PR.PROPYEARNBR)> 4 THEN NULL
ELSE PR.PROPYEARNBR
END
AS VARCHAR2(4)) AS VEHICLEYEAR, /*DNA ALLOWS LONGER, MAXLENGTH 4, NEEDS TO BE NUMERIC, WHICH DNA IS*/
CAST(SUBSTR(PR.PROPMAKE,0,20) AS VARCHAR2(20)) AS VEHICLEMAKE, /*DNA IS SHORTER, MAXLENGTH 20*/
CAST(SUBSTR(PR.PROPMODEL,0,20) AS VARCHAR2(20)) AS VEHICLEMODEL, /*DNA IS SHORTER, MAXLENGTH 20*/
CAST(NULL AS VARCHAR2(20)) AS VEHICLETRIM,/*NULL IN PREVIOUS VERSION MAXLENGTH 20*/
CAST(NULL AS VARCHAR2(40)) AS VEHICLEDESCRIPTION,/*NULL IN PREVIOUS VERSION MAXLENGTH 40*/
CAST('R' AS VARCHAR2(1)) AS PRODUCT,/*HARD-CODED IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 1*/
CAST(NULL AS VARCHAR2(20)) AS SUBPRODUCT,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 20*/
TO_CHAR(
CASE WHEN CE.ACCTNBR IS NOT NULL THEN 0
ELSE ROUND(LIS.PAYOFF_VALUE+(LIS.PAYOFF_DAYS*RATE.INTRATE/LIS.DAYS_IN_YEAR*CNB.BALAMT),2)
END
,'FM999990.00') AS NETPAYOFFAMOUNT,/*PER: KYLE MATHER-IF MOB OR DEBT PROTECTION THEN ZERO. MAXLENGTH 6.2*/
TO_CHAR(LIS.EXPIRATION_DATE,'YYYYMMDD') AS GOODUNTILDATE, /*CALCULATED, MAXLENGTH 8*/
TO_CHAR(LIS.DATEMAT,'YYYYMMDD') AS MATURITYDATE,
CASE
WHEN AC.ORIGTERM IS NULL OR AC.CONTRACTDATE IS NULL THEN 0--NO EXAMPLE OF NULL CONTRACT DATE BUT SYSTEM DOES NOT PREVENT IT
ELSE ROUND(MONTHS_BETWEEN(AC.CONTRACTDATE+AC.ORIGTERM, AC.CONTRACTDATE))
END AS TERMINMONTHS,/*MAXLENGTH2, PER KYLE MATHER SHOULD NOT BE LIMITED TO THIS*/
CASE
WHEN MONTHS_BETWEEN(LIS.DATEMAT,CDD.DUEDATE)<=0 THEN 0
ELSE MONTHS_BETWEEN(LIS.DATEMAT,CDD.DUEDATE)+1
END AS MONTHS_LEFT, /*MAXLENGTH 2, PER KYLE MATHER SHOULD NOT BE LIMITED TO THIS*/
CAST(NULL AS VARCHAR2(8)) AS NEXTPAYMENTDATE,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 8*/
TO_CHAR(ROUND(NVL(PMT.PMTAMT,0),2),'FM99990.00') AS MONTHLYPAYMENT, /*MAXLENGTH 5.2*/
CAST(NULL AS VARCHAR2(9)) AS GROSSPAYOFF,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 6.2*/
CAST(NULL AS VARCHAR2(9)) AS SECURITYDEPOSIT,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 6.2*/
CAST(NULL AS VARCHAR2(9)) AS RESIDUALVALUE,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 6.2*/
TO_CHAR(ROUND((RATE.INTRATE/LIS.DAYS_IN_YEAR*CNB.BALAMT),2),'FM999990.00') AS DOLLARDAYRATE,/*MAXLENGTH 6.2*/
CAST(NULL AS VARCHAR2(9)) AS BALLOONAMOUNT,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 6.2*/
CAST(
CASE
WHEN CE.ACCTNBR IS NOT NULL THEN 'Contact lender for payoff'
ELSE NULL
END
AS VARCHAR2(80)) AS PAYOFFMESSAGE,/*MAXLENGTH 80*/
CAST(NULL AS VARCHAR2(1)) AS PREAPPROVEDCODE,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 1*/
CAST(NULL AS VARCHAR2(20)) AS REFERENCENUMBER,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 20*/
CAST(NULL AS VARCHAR2(8)) AS EXPIRATIONDATE,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 8*/
CAST(NULL AS VARCHAR2(9)) AS BUYRATE,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 2.6*/
CAST(NULL AS VARCHAR2(8)) AS ACQUISITIONFEE,/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 5.2*/
CAST(NULL AS VARCHAR2(8)) AS PARTICIPATIONPERCENT/*NULL IN PREVIOUS VERSION IN PREVIOUS VERSION MAXLENGTH 3.2*/
FROM CTE_LOANS_IN_SCOPE LIS
INNER JOIN OSIBANK.ACCT AC ON AC.ACCTNBR=LIS.ACCTNBR
INNER JOIN CTE_PRIMARY CP ON CP.ACCTNBR=LIS.ACCTNBR
LEFT JOIN (
SELECT PMT.ACCTNBR,
SUM(PMT.PMTAMT) AS PMTAMT
FROM OSIBANK.ACCTPMTHIST PMT
INNER JOIN CTE_DATES CD ON 1=1
INNER JOIN OSIBANK.ACCTPMTSUBACCTHIST APSH ON APSH.ACCTNBR=PMT.ACCTNBR AND APSH.PMTNBR=PMT.PMTNBR AND APSH.EFFDATE=PMT.EFFDATE
INNER JOIN OSIBANK.ACCTSUBACCT ASA ON ASA.ACCTNBR=APSH.ACCTNBR AND ASA.SUBACCTNBR=APSH.SUBACCTNBR AND ASA.BALCATCD='NOTE' AND ASA.BALTYPCD IN ('OINT','BAL','DUE')
WHERE PMT.PMTTYPCD IN ('FB','FBI','FDUE')
AND PMT.EFFDATE<=CD.DATE_RUN
AND (PMT.INACTIVEDATE>CD.DATE_RUN OR PMT.INACTIVEDATE IS NULL)
AND (APSH.INACTIVEDATE>CD.DATE_RUN OR APSH.INACTIVEDATE IS NULL)
GROUP BY PMT.ACCTNBR
) PMT ON PMT.ACCTNBR=LIS.ACCTNBR
LEFT JOIN (
SELECT ARH.ACCTNBR,
ARH.INTRATE,
ROW_NUMBER() OVER (PARTITION BY ARH.ACCTNBR, ARH.SUBACCTNBR ORDER BY ARH.EFFDATE DESC) AS RWN
FROM OSIBANK.ACCTRATEHIST ARH
INNER JOIN OSIBANK.ACCTSUBACCT ASA ON ASA.ACCTNBR=ARH.ACCTNBR AND ASA.SUBACCTNBR=ARH.SUBACCTNBR AND ASA.BALCATCD='NOTE' AND ASA.BALTYPCD='BAL'
INNER JOIN CTE_DATES CD ON 1=1
WHERE ARH.EFFDATE<=CD.DATE_RUN AND (ARH.INACTIVEDATE>CD.DATE_RUN OR ARH.INACTIVEDATE IS NULL)
) RATE ON RATE.ACCTNBR=LIS.ACCTNBR AND RATE.RWN=1
LEFT JOIN OSIBANK.VIEW_LN_CURR_NOTEBAL CNB ON CNB.ACCTNBR=LIS.ACCTNBR
LEFT JOIN OSIBANK.ACCTPROP AP ON AP.ACCTNBR=LIS.ACCTNBR
LEFT JOIN OSIBANK.PROP PR ON PR.PROPNBR=AP.PROPNBR
LEFT JOIN OSIBANK.VIEW_LN_CURR_DUEDATE CDD ON CDD.ACCTNBR=LIS.ACCTNBR
LEFT JOIN OSIBANK.ACCTUSERFIELD AU ON AU.ACCTNBR=LIS.ACCTNBR AND AU.USERFIELDCD='DECD'
LEFT JOIN CTE_EXCLUSIONS CE ON CE.ACCTNBR=LIS.ACCTNBR
) /*MATCH REQUIREMENTS ON SPEC DOCUMENT*/
SELECT DISTINCT *
FROM CTE_STAGE S
WHERE S.ACCOUNT IS NOT NULL
AND S.LENDERID IS NOT NULL
AND S.FIRSTNAME IS NOT NULL
AND S.LASTNAME IS NOT NULL
AND S.ADDRESS1 IS NOT NULL
AND S.CITY IS NOT NULL
/*PER KYLE MATHER INCLUDE RECORDS WITHOUT STATE, REJECT ON DEALERTRACK INGEST SIDE*/
AND S.ZIPCODE IS NOT NULL
AND S.VEHICLEVIN IS NOT NULL
AND S.PRODUCT IS NOT NULL
AND S.NETPAYOFFAMOUNT IS NOT NULL
AND S.GOODUNTILDATE IS NOT NULL
AND S.MATURITYDATE IS NOT NULL
/*PER KYLE MATHER INCLUDE LOANS WITH MOB INSURANCE AND/OR DEBT PROTECTION*/