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,110 @@
WITH PersonLookup AS
(
SELECT DISTINCT
MAX(n.PERSNBR) AS PERSNBR,
MAX(n.SHAREACCTNBR) AS SHAREACCTNBR,
MAX(n.MEMBERAGREENBR) AS MEMBERAGREENBR,
MAX(n.PRIORITY) AS PRIORITY
FROM (
SELECT a.TAXRPTFORPERSNBR AS PERSNBR, a.ACCTNBR AS SHAREACCTNBR, m.MEMBERAGREENBR, 0 AS PRIORITY
FROM ACCT a
LEFT OUTER JOIN MEMBERAGREEMENT m ON m.PRIMARYPERSNBR = a.TAXRPTFORPERSNBR
LEFT OUTER JOIN OSIBANK.ACCTACCTROLEPERS a1 ON a1.ACCTNBR = a.ACCTNBR AND a.TAXRPTFORPERSNBR <> a1.PERSNBR AND a1.ACCTROLECD = 'CUST'
WHERE a1.ACCTROLECD IS NULL
UNION
SELECT DISTINCT a.PERSNBR, a3.ACCTNBR AS SHAREACCTNBR, NULL AS MEMBERAGREENBR, 1 AS PRIORITY
FROM OSIBANK.ACCTACCTROLEPERS a
INNER JOIN OSIBANK.ACCTROLE a2 ON a.ACCTROLECD = a2.ACCTROLECD AND a2.TRANSACTYN = 'Y'
INNER JOIN ACCT a3 ON a.ACCTNBR IN (a3.ACCTNBR, a3.STMTACCTNBR)
LEFT OUTER JOIN MEMBERAGREEMENT e ON e.SHAREACCTNBR = a3.STMTACCTNBR
WHERE a.EFFDATE <= CURRENT_DATE
AND a.EFFDATE IS NOT NULL
) n
WHERE n.PERSNBR = :personNumber
GROUP BY (n.PERSNBR, n.SHAREACCTNBR, n.MEMBERAGREENBR)
ORDER BY (MAX(n.PRIORITY))
)
,Person AS
(
SELECT DISTINCT e.FIRSTNAME||COALESCE(nullif(' '||e.MDLINIT,' '), '')||' '||e.LASTNAME AS PERSONNAME, l.PERSNBR, l.MEMBERAGREENBR, l.SHAREACCTNBR
FROM OSIBANK.PERS e
INNER JOIN PersonLookup l ON l.PERSNBR=e.PERSNBR
)
,Phone_list AS
(
SELECT DISTINCT p.PERSNBR, p.AREACD||p.EXCHANGE||p.PHONENBR AS phone_number, p.PHONEUSECD AS phone_type, p.PHONESEQ,
ROW_NUMBER () OVER(PARTITION BY p.PERSNBR, p.PHONEUSECD ORDER BY PREFERREDYN DESC, p.PHONESEQ DESC) AS rn
FROM OSIBANK.PERSPHONE p
INNER JOIN PersonLookup l ON l.PERSNBR=p.PERSNBR
WHERE p.PHONEUSECD IN ('PER', 'CELL', 'BUS')
)
,phone_part AS
(
SELECT * FROM
(
SELECT PERSNBR, phone_type, phone_number
FROM Phone_list
WHERE rn=1
)
PIVOT
(
MAX(phone_number) FOR phone_type IN ('PER' AS Home_Phone, 'CELL' AS Cell_Phone, 'BUS' AS Business_Phone)
)
)
,SharedAcctTran AS
(
SELECT t.ACCTNBR, a.PERSNBR, t.RTXNTYPCD, t.ORIGPOSTDATE, t.TRANAMT, a.SHAREACCTNBR,
CASE WHEN t.RTXNTYPCD = 'WTH' THEN 'WTH'
WHEN t.RTXNTYPCD IN ('DEP', 'XDEP') THEN 'DEP' END AS TransType
FROM PersonLookup a
INNER JOIN OSIBANK.RTXN t ON t.ACCTNBR=a.SHAREACCTNBR AND t.RTXNTYPCD IN ('WTH','DEP','XDEP')
ORDER BY t.ORIGPOSTDATE DESC
FETCH FIRST 1000 ROWS ONLY
)
,SharedAcctTranOrder AS
(
SELECT ACCTNBR, PERSNBR, ORIGPOSTDATE, TRANAMT, RTXNTYPCD, TransType, SHAREACCTNBR,
ROW_NUMBER() OVER(PARTITION BY ACCTNBR, TransType ORDER BY ORIGPOSTDATE DESC) AS rn
FROM SharedAcctTran
)
,SharedAcctTran_Part AS
(
SELECT ACCTNBR, PERSNBR, TransType, SHAREACCTNBR,
CASE WHEN TransType='WTH' THEN ORIGPOSTDATE END AS Last_ShareAcct_Withdrawal_DateTime,
CASE WHEN TransType='DEP' THEN ORIGPOSTDATE END AS Last_Share_Deposit_Date,
CASE WHEN TransType='DEP' THEN TRANAMT END AS Last_Share_Deposit_Amount
FROM SharedAcctTranOrder
WHERE rn=1
)
,Autoloan_Part AS
(
SELECT DISTINCT MAX(l.PERSNBR) AS PERSNBR, MAX(pr.PROPDESC) AS PROPDESC
FROM OSIBANK.ACCT a
INNER JOIN PersonLookup l ON a.ACCTNBR = l.SHAREACCTNBR OR a.TAXRPTFORPERSNBR = l.PERSNBR
INNER JOIN OSIBANK.ACCTPROP AP ON AP.ACCTNBR=a.ACCTNBR
INNER JOIN OSIBANK.prop pr ON pr.propnbr=ap.PROPNBR
WHERE a.MJACCTTYPCD='CNS'
AND a.CURRMIACCTTYPCD IN ('DL01','DL02','DL03','DL04','DV01','DV02','DV03','DV04')
GROUP BY (l.PERSNBR)
ORDER BY a.CONTRACTDATE DESC
)
SELECT DISTINCT
MAX(p.PERSNBR) AS PersonNumber,
MAX(e.PERSONNAME) AS PERSONNAME,
MAX(e.MEMBERAGREENBR) AS MemberNumber,
MAX(p.Home_Phone) AS HomePhone,
MAX(p.Cell_Phone) AS CellPhone,
MAX(p.Business_Phone) AS BusinessPhone,
MAX(w.Last_ShareAcct_Withdrawal_DateTime) AS LastShareAcctWithdrawalTime,
MAX(d.Last_Share_Deposit_Date) AS LastShareDepositDate,
MAX(d.Last_Share_Deposit_Amount) AS LastShareDepositAmount,
MAX(l.PROPDESC) AS VehicleYearMakeModelVin,
MAX(puf.VALUE) AS PassPhrase
FROM phone_part p
LEFT JOIN Person e ON p.PERSNBR=e.PERSNBR
LEFT JOIN PERSUSERFIELD puf on p.PERSNBR=puf.PERSNBR AND puf.userfieldcd='PASS'
LEFT JOIN SharedAcctTran_Part w ON e.SHAREACCTNBR=w.SHAREACCTNBR AND w.TransType='WTH'
LEFT JOIN SharedAcctTran_Part d ON e.SHAREACCTNBR=d.SHAREACCTNBR AND d.TransType='DEP'
LEFT JOIN Autoloan_Part l ON p.PERSNBR=l.PERSNBR
GROUP BY (p.PERSNBR)
FETCH FIRST 2 ROWS ONLY
@@ -0,0 +1,115 @@
WITH PersonLookup AS
(
SELECT DISTINCT
MAX(n.PERSNBR) AS PERSNBR,
MAX(n.SHAREACCTNBR) AS SHAREACCTNBR,
MAX(n.MEMBERAGREENBR) AS MEMBERAGREENBR,
MAX(n.PRIORITY) AS PRIORITY
FROM (
SELECT a.TAXRPTFORPERSNBR AS PERSNBR, a.ACCTNBR AS SHAREACCTNBR, m.MEMBERAGREENBR, 0 AS PRIORITY
FROM ACCT a
LEFT OUTER JOIN MEMBERAGREEMENT m ON m.PRIMARYPERSNBR = a.TAXRPTFORPERSNBR
LEFT OUTER JOIN OSIBANK.ACCTACCTROLEPERS a1 ON a1.ACCTNBR = a.ACCTNBR AND a.TAXRPTFORPERSNBR <> a1.PERSNBR AND a1.ACCTROLECD = 'CUST'
WHERE a1.ACCTROLECD IS NULL
UNION
SELECT DISTINCT a.PERSNBR, a3.ACCTNBR AS SHAREACCTNBR, NULL AS MEMBERAGREENBR, 1 AS PRIORITY
FROM OSIBANK.ACCTACCTROLEPERS a
INNER JOIN OSIBANK.ACCTROLE a2 ON a.ACCTROLECD = a2.ACCTROLECD AND a2.TRANSACTYN = 'Y'
INNER JOIN ACCT a3 ON a.ACCTNBR IN (a3.ACCTNBR, a3.STMTACCTNBR)
LEFT OUTER JOIN MEMBERAGREEMENT e ON e.SHAREACCTNBR = a3.STMTACCTNBR
WHERE a.EFFDATE <= CURRENT_DATE
AND a.EFFDATE IS NOT NULL
) n
INNER JOIN (
SELECT DISTINCT p2.PERSNBR
FROM PERSPHONE p2
WHERE p2.AREACD||p2.EXCHANGE||p2.PHONENBR = :phoneNumber
FETCH FIRST 50 ROWS ONLY
) l ON l.PERSNBR = n.PERSNBR
GROUP BY (n.PERSNBR, n.SHAREACCTNBR)
ORDER BY (MAX(n.PRIORITY))
)
,Person AS
(
SELECT DISTINCT e.FIRSTNAME||COALESCE(nullif(' '||e.MDLINIT,' '), '')||' '||e.LASTNAME AS PERSONNAME, l.PERSNBR, l.MEMBERAGREENBR, l.SHAREACCTNBR
FROM OSIBANK.PERS e
INNER JOIN PersonLookup l ON l.PERSNBR=e.PERSNBR
)
,Phone_list AS
(
SELECT DISTINCT p.PERSNBR, p.AREACD||p.EXCHANGE||p.PHONENBR AS phone_number, p.PHONEUSECD AS phone_type, p.PHONESEQ,
ROW_NUMBER () OVER(PARTITION BY p.PERSNBR, p.PHONEUSECD ORDER BY PREFERREDYN DESC, p.PHONESEQ DESC) AS rn
FROM OSIBANK.PERSPHONE p
INNER JOIN PersonLookup l ON l.PERSNBR=p.PERSNBR
WHERE p.PHONEUSECD IN ('PER', 'CELL', 'BUS')
)
,phone_part AS
(
SELECT * FROM
(
SELECT PERSNBR, phone_type, phone_number
FROM Phone_list
WHERE rn=1
)
PIVOT
(
MAX(phone_number) FOR phone_type IN ('PER' AS Home_Phone, 'CELL' AS Cell_Phone, 'BUS' AS Business_Phone)
)
)
,SharedAcctTran AS
(
SELECT t.ACCTNBR, a.PERSNBR, t.RTXNTYPCD, t.ORIGPOSTDATE, t.TRANAMT, a.SHAREACCTNBR,
CASE WHEN t.RTXNTYPCD = 'WTH' THEN 'WTH'
WHEN t.RTXNTYPCD IN ('DEP', 'XDEP') THEN 'DEP' END AS TransType
FROM PersonLookup a
INNER JOIN OSIBANK.RTXN t ON t.ACCTNBR=a.SHAREACCTNBR AND t.RTXNTYPCD IN ('WTH','DEP','XDEP')
ORDER BY t.ORIGPOSTDATE DESC
FETCH FIRST 1000 ROWS ONLY
)
,SharedAcctTranOrder AS
(
SELECT ACCTNBR, PERSNBR, ORIGPOSTDATE, TRANAMT, RTXNTYPCD, TransType, SHAREACCTNBR,
ROW_NUMBER() OVER(PARTITION BY ACCTNBR, TransType ORDER BY ORIGPOSTDATE DESC) AS rn
FROM SharedAcctTran
)
,SharedAcctTran_Part AS
(
SELECT ACCTNBR, PERSNBR, TransType, SHAREACCTNBR,
CASE WHEN TransType='WTH' THEN ORIGPOSTDATE END AS Last_ShareAcct_Withdrawal_DateTime,
CASE WHEN TransType='DEP' THEN ORIGPOSTDATE END AS Last_Share_Deposit_Date,
CASE WHEN TransType='DEP' THEN TRANAMT END AS Last_Share_Deposit_Amount
FROM SharedAcctTranOrder
WHERE rn=1
)
,Autoloan_Part AS
(
SELECT DISTINCT MAX(l.PERSNBR) AS PERSNBR, MAX(pr.PROPDESC) AS PROPDESC
FROM OSIBANK.ACCT a
INNER JOIN PersonLookup l ON a.ACCTNBR = l.SHAREACCTNBR OR a.TAXRPTFORPERSNBR = l.PERSNBR
INNER JOIN OSIBANK.ACCTPROP AP ON AP.ACCTNBR=a.ACCTNBR
INNER JOIN OSIBANK.prop pr ON pr.propnbr=ap.PROPNBR
WHERE a.MJACCTTYPCD='CNS'
AND a.CURRMIACCTTYPCD IN ('DL01','DL02','DL03','DL04','DV01','DV02','DV03','DV04')
GROUP BY (l.PERSNBR)
ORDER BY a.CONTRACTDATE DESC
)
SELECT DISTINCT
MAX(p.PERSNBR) AS PersonNumber,
MAX(e.PERSONNAME) AS PERSONNAME,
MAX(e.MEMBERAGREENBR) AS MemberNumber,
MAX(p.Home_Phone) AS HomePhone,
MAX(p.Cell_Phone) AS CellPhone,
MAX(p.Business_Phone) AS BusinessPhone,
MAX(w.Last_ShareAcct_Withdrawal_DateTime) AS LastShareAcctWithdrawalTime,
MAX(d.Last_Share_Deposit_Date) AS LastShareDepositDate,
MAX(d.Last_Share_Deposit_Amount) AS LastShareDepositAmount,
MAX(l.PROPDESC) AS VehicleYearMakeModelVin,
MAX(puf.VALUE) AS PassPhrase
FROM phone_part p
LEFT JOIN Person e ON p.PERSNBR=e.PERSNBR
LEFT JOIN PERSUSERFIELD puf on p.PERSNBR=puf.PERSNBR AND puf.userfieldcd='PASS'
LEFT JOIN SharedAcctTran_Part w ON e.SHAREACCTNBR=w.SHAREACCTNBR AND w.TransType='WTH'
LEFT JOIN SharedAcctTran_Part d ON e.SHAREACCTNBR=d.SHAREACCTNBR AND d.TransType='DEP'
LEFT JOIN Autoloan_Part l ON p.PERSNBR=l.PERSNBR
GROUP BY (p.PERSNBR)
FETCH FIRST 2 ROWS ONLY
@@ -0,0 +1,143 @@
/*New Activity Manager Incentive Referral Query
----------------------------------
DESCRIPTION:
Get all Activity Manager entries associated with incented referrals.
Supplies Activity Data, Associate Name information, as well as the Agreement Number, Card Status (Should always be ISS (issue)),
CardAgreementTypeCd, AccountNumber for the associated agreement as well as the account status at time the activity was generated.
RETURNS: Models/Activity/ActivityManagerIncentiveReferral.cs
PARAMS:
|afterActivityOd : Null or Int (as string)
|------------------------------------------------------------------------------
|Returns all Activity Manager entries with a ID after the supplied ID
|If null defaults to -1 which will return all Checking SalesActivities
|newerThanOriginationDate : Null or Datetime in format 'YYYY-MM-DD HH24:MI:SS' (as string)
|-----------------------------------------------------------------------------
|Returns all Activity Manager entries that were created after specified date time.
|The origination date is always the date that the activity was first entered into the system
|regardless of its initial station or what station it is in now
|If null defaults to '0001-01-01 00:00:00' which is oracles MIN Date time, this effectively
|returns all Checking Sales Activities
NOTES:
- When an activity's station is updated, its activity stays the same, but its created date and date last maintained
dates are updated to the StationDate. They are always with respect to the current station. To get the date that
the activity first entered activity manager, use OriginationDate
- When a referral is for a business the LF_PERS.EXTID3 column has a O in front of the OrgNbr,
When a referral is for a person the LFPERS.EXTID3 coulumn has a P in front of the PersNbr
- Remember that these fields are all entered manually by an employee. This should not be used as a source of truth for any given activity.
This data is supplied with the intention of matching this referral to a sale. It is the best plan to focus on the referred person,
and manually query for related accounts as opposed to using the 'custom fields'. We include them here for audit purposes.
CUSTOM FIELD INFO (ActivityManager.LF_LEAD_CUSTOM):
Credit Card Balance Transfer
--LeadCust_39 = External CC Account Number
--LeadCust_31 = Landmark Credit Card Number
--LeadCust_29 = Transfer Ammount
--LeadCust_28 = Payment State + Zip
--LeadCust_27 = Payment City
--LeadCust_26 = Payment Address Line 1
--LeadCust_24 = Transfer Institution
Direct Deposit
--LeadCust_38 = Direct Deposit is Qualified Referral
--LeadCust_4 = Direct Deposit Account Number
LF_PERSON-><COMM{int}TYPE>
B = PAGER
C = MOBILE
E = BUSINESS EMAIL
F = FAX
H = HOME
J = PERSONAL EMAIL
P = PHONE
*/
WITH EmployeeEmail AS (
SELECT pers.USERID AS SafUserId,
prod.PERSNBR AS SafPersNbr,
prod.PRODPERSID AS CorePersNbr,
addr.TEXT AS EmployeeEmail
FROM SAF.PERSUSER pers
JOIN SAF.PERSPROD prod ON
pers.PERSNBR = PROD.PERSNBR
AND prod.PRODNBR = '3'
JOIN OSIBANK.PERSADDRUSE paddr ON
prod.PRODPERSID = PADDR.PERSNBR
JOIN OSIBANK.ADDRLINE addr ON
paddr.ADDRNBR = addr.ADDRNBR
AND paddr.ADDRUSECD = 'EBUS'
)
SELECT ll.ID AS ActivityId,
-- These custom fields can be reused, guarentee their contents by only using them for their respective campaigns
(CASE WHEN ll.CAMPAIGN = 'CC Balance Transfer' THEN llc.LEADCUST_31 ELSE NULL END) AS LandmarkCreditCardNumber,
(CASE WHEN ll.CAMPAIGN = 'Direct Deposit' THEN llc.LEADCUST_4 ELSE NULL END) AS DirectDepositAccountNumber,
ll.ORIGINATOR AS OriginatorUserId,
safprod.PRODPERSID AS OriginatorPersNbr,
p.FIRSTNAME AS OriginatorFirstName,
p.LASTNAME AS OriginatorLastName,
p.MDLINIT AS OriginatorMiddleInitial,
ee.EmployeeEmail AS EmployeeEmail,
ll.CAMPAIGN AS Campaign,
ll.CATEGORY AS Category,
ll.STATION AS ReferralStation,
ll.DATELASTMAINT AS LastUpdatedDateTime,
(CASE WHEN att.INITIAL_STATION = 'Yes' THEN 1 ELSE 0 END) AS IsInitialStation,
(CASE WHEN att.FINAL_STATION = 'Yes' THEN 1 ELSE 0 END) AS IsFinalStation,
att.ACTIVITY_ORIGINATION_DATE AS OriginationDateTime,
att.ENTER_STATION_DATETIME AS StationDateTime,
ll.SOURCE AS OriginatingBranchName,
(CASE WHEN SUBSTR(lp.EXTID3, 1, 1) = 'P' THEN REGEXP_SUBSTR(lp.EXTID3, '\d+') ELSE NULL END) AS ReferredPersonNbr,
(CASE WHEN SUBSTR(lp.EXTID3, 1, 1) = 'O' THEN REGEXP_SUBSTR(lp.EXTID3, '\d+') ELSE NULL END) AS ReferredOrgNbr,
CASE WHEN REFPERS.LASTNAME IS NOT NULL THEN CONCAT(CONCAT(REFPERS.LASTNAMEUPPER, ','), REFPERS.FIRSTNAMEUPPER)
WHEN lp.LastName IS NOT NULL THEN CONCAT(CONCAT(UPPER(lp.LastName), ','), UPPER(lp.FirstName)) ELSE NULL END AS ReferredPersonName,
REFORG.ORGNAME AS ReferredOrgName,
lp.EXTID3 AS ReferredPersOrgNbr,
lp.PREFERRED_PHONE AS PreferredPhone,
COALESCE(lp.COMM1, '') AS COMM1,
COALESCE(lp.COMM2, '') AS COMM2,
COALESCE(lp.COMM3, '') AS COMM3,
COALESCE(lp.COMM4, '') AS COMM4,
COALESCE(lp.COMM5, '') AS COMM5,
COALESCE(lp.COMM6, '') AS COMM6,
COALESCE(lp.COMM7, '') AS COMM7
FROM ACTIVITYMANAGER.LF_LEAD ll
JOIN ACTIVITYMANAGER.LF_LEAD_CUSTOM llc ON
ll.ID = llc.ID
JOIN SAF.PERSUSER safp ON
safp.USERID = ll.ORIGINATOR
JOIN SAF.PERSPROD safprod ON
SAFPROD.PERSNBR = safp.PERSNBR AND
SAFPROD.PRODNBR = '3'
JOIN OSIBANK.PERS p ON
p.PERSNBR = SAFPROD.PRODPERSID
LEFT JOIN EmployeeEmail ee ON
ee.SafPersNbr = SAFP.PERSNBR
JOIN ACTIVITYMANAGER.LF_PERSON lp ON
lp.ID = ll.PERSONID
JOIN ACTIVITYMANAGER.ACTIVITY_TIME_TRACKING att
ON att.ACTIVITY_ID = ll.ID AND SEQUENCE_NUMBER = (
SELECT MAX(SEQUENCE_NUMBER)
FROM ACTIVITYMANAGER.ACTIVITY_TIME_TRACKING att2
WHERE att2.ACTIVITY_ID = ll.ID
)
LEFT JOIN OSIBANK.ORG REFORG ON reforg.ORGNBR = (CASE WHEN SUBSTR(lp.EXTID3, 1, 1) = 'O' THEN REGEXP_SUBSTR(lp.EXTID3, '\d+') ELSE NULL END)
LEFT JOIN OSIBANK.PERS REFPERS ON refpers.PERSNBR = (CASE WHEN SUBSTR(lp.EXTID3, 1, 1) = 'P' THEN REGEXP_SUBSTR(lp.EXTID3, '\d+') ELSE NULL END)
WHERE ll.CAMPAIGN IN (
'ATM Card',
'Check Card Referral',
'Checking Referral',
'Direct Deposit',
'CC Balance Transfer',
'Mortgage Referral',
'LIC Referral',
'First Mortgage Referral',
'eStatement Referral')
AND ll.ID > TO_NUMBER(COALESCE(:afterActivityId, '-1'))
AND att.ACTIVITY_ORIGINATION_DATE >= TO_TIMESTAMP(COALESCE(:newerThanOriginationDate, '0001-01-01 00:00:00'), 'YYYY-MM-DD HH24:MI:SS')
@@ -0,0 +1,136 @@
/*New ATM/Check Cards Sale Query
----------------------------------
DESCRIPTION:
Get all Activities related to New Check or ATM Cards (ActvType = AGRE and SubActivity contains a change
to the 'CardAgreement' table where the AgreeTypCd = 'DBT', 'DBT2', 'BDBT', 'ATM')
after a supplied DateTime (inclusive) or after a supplied ActivityNumber (not inclusive) or both.
Supplies Activity Data, Associate Name information, as well as the Agreement Number, Card Status (Should always be ISS (issue)),
CardAgreementTypeCd, AccountNumber for the associated agreement as well as the account status at time the activity was generated.
RETURNS: Models/Activity/NewAtmCheckCardActivity.cs
PARAMS:
|afterActivityNbr : Null or Int (as string)
|------------------------------------------------------------------------------
|Returns all Checking Sales with ActivityNbrs larger than the supplied number.
|If null defaults to -1 which will return all Checking SalesActivities
|newerThanDateTime : Null or Datetime in format 'YYYY-MM-DD HH24:MI:SS' (as string)
|-----------------------------------------------------------------------------
|Returns all Checking Sales with ActivityNbrs that occured on or after the supplied date
|If null defaults to '0001-01-01 00:00:00' which is oracles MIN Date time, this effectively
|returns all Checking Sales Activities
|limitAmount : Null or Int (as string)
|------------------------------------------------------------------------------
|Return record count
|If null defaults to '100'
NOTES:
- 'AGRE' activity is an activity related to a change or update to an agreement
- 'DBT', 'DBT2', 'BDBT' abd 'ATM are the only CardTypes that are incented
- This will return all new ATM/Check card sales, even those that were created when a new account was created,
Note that these are not incented. Uncommment the line in the where clause to filter out unincented accounts.
- Though not explicitly filtered these results will only include cards in the 'ISS' issued status. This is because
of the join with CARDMEMBERISSUEHIST
- The AcctStatDuringActivity column is the last status of the account (from ACCTACCTSTATHIST table) before or when
the activity occured. We do not return the current status at the time of the query.
- When Card is in APPR state, sometimes personNbr will be missing. When creating this query there were no situations
Where the cards was in ACT state and did not have a person number assigned to them
*/
WITH EmployeeEmail AS (
SELECT p.PERSNBR As CorePersNbr,
addr.TEXT AS EmployeeEmail
FROM OSIBANK.PERSEMPL p
JOIN OSIBANK.PERSADDRUSE paddr ON
p.PERSNBR = PADDR.PERSNBR
JOIN OSIBANK.ADDRLINE addr ON
paddr.ADDRNBR = addr.ADDRNBR
AND paddr.ADDRUSECD = 'EBUS'
),
ActivitySubActivity AS (
SELECT *
FROM OSIBANK.ACTVSUBACTV asa
WHERE asa.TABLEID = 'CardAgreement'
),
AGREEMENTACTIVITYDATA AS (
SELECT a.ACTVNBR AS ActivityNbr,
a.ACTVDATETIME AS ActivityDateTime,
a.RESPPERSNBR AS ResponsiblePersonNbr,
a.ACTVTYPCD AS ActivityTypeCde,
-- CardAgreement table has only one row in value table. Other rows may have duplicate unmatching data for Non-owner users
max(CASE WHEN asa.COLUMNID = 'AgreeNbr' THEN asa.NEWVALUE END) AS AgreementNbr,
max(CASE WHEN asa.COLUMNID = 'AgreeTypCd' THEN asa.NEWVALUE END) AS CardState,
max(CASE WHEN asa.COLUMNID = 'AgreeTypCd' THEN asa.NEWVALUE END) AS CardType,
max(CASE WHEN asa.COLUMNID = 'ServChgAcctNbr' THEN asa.NEWVALUE END) AS AccountNbr,
max(CASE WHEN asa.COLUMNID = 'OwnerPersNbr' THEN asa.NEWVALUE END) AS OwnerPersonNbr,
max(CASE WHEN asa.COLUMNID = 'OwnerOrgNbr' THEN asa.NEWVALUE END) AS OwnerOrgNbr
FROM OSIBANK.ACTV a
LEFT JOIN ActivitySubActivity asa ON asa.ACTVNBR = a.ACTVNBR
WHERE a.ACTVTYPCD = 'AGRE'
GROUP BY a.ACTVNBR, a.ACTVDATETIME, a.RESPPERSNBR, a.ACTVTYPCD
),
PHONEMETADATA AS (
SELECT p.PERSNBR,
LISTAGG((pp.AREACD || pp.EXCHANGE || pp.PHONENBR), ',') AS PhoneNumbers
FROM OSIBANK.PERS p
LEFT JOIN OSIBANK.PERSPHONE pp ON p.PERSNBR = pp.PERSNBR AND pp.PHONEUSECD != 'BUS'
GROUP BY p.PERSNBR
),
EMAILMETADATA AS (
SELECT p.PERSNBR,
LISTAGG(al.TEXT, ',') AS EmailAddresses
FROM OSIBANK.PERS p
LEFT JOIN OSIBANK.PERSADDRUSE pa ON p.PERSNBR = pa.PERSNBR AND pa.ADDRUSECD IN ('EHOM', 'EML')
LEFT JOIN OSIBANK.ADDRLINE al ON pa.ADDRNBR = al.ADDRNBR AND al.LINENBR = 1
GROUP BY p.PERSNBR
)
SELECT ActvData.*,
acc.CURRACCTSTATCD AS AcctStatAtQueryTime,
hist.ACCTSTATCD AS AcctStateAtActivity,
hist.EFFDATETIME AS AcctStateEffDateTime,
p.FIRSTNAME AS AssociateFirst,
p.LASTNAME AS AssociateLast,
p.MDLINIT AS AssociateMiddleInit,
CASE
WHEN acc.TAXRPTFORPERSNBR IS NOT NULL THEN CONCAT(CONCAT(TAXPERS.LASTNAMEUPPER, ','), TAXPERS.FIRSTNAMEUPPER)
ELSE NULL
END AS TaxPersonName,
TAXORG.ORGNAME AS TaxOrgName,
ee.EmployeeEmail AS EmployeeEmail,
pmd.PhoneNumbers AS TaxPersonPhoneNumbers,
emd.EmailAddresses AS TaxPersonEmailAddresses
FROM AGREEMENTACTIVITYDATA ActvData
-- Sometimes a card activity shows up with identical data but a different date time Seconds apart.
-- There seems to always be an entry created in CARDMEMBERISSUEHIST that has one record matching these timestamps
JOIN OSIBANK.CARDMEMBERISSUEHIST c ON
c.AGREENBR = ActvData.AgreementNbr
AND c.EFFDATETIME = ActvData.ActivityDateTime
JOIN OSIBANK.ACCT acc ON acc.ACCTNBR = ActvData.AccountNbr
LEFT JOIN OSIBANK.PERS taxpers ON ActvData.OwnerPersonNbr = TAXPERS.PERSNBR
LEFT JOIN OSIBANK.ORG taxorg ON ActvData.OwnerOrgNbr = TAXORG.ORGNBR
--Check for most recent account status before the Activity was recorded
--This has been verified to not produce duplicate rows and not eliminate rows
JOIN OSIBANK.ACCTACCTSTATHIST hist ON ActvData.AccountNbr = hist.ACCTNBR AND hist.TIMEUNIQUEEXTN = (
SELECT MAX(TIMEUNIQUEEXTN)
FROM OSIBANK.ACCTACCTSTATHIST histsearch
WHERE histsearch.EFFDATETIME <= ActvData.ActivityDateTime
AND histsearch.ACCTNBR = ActvData.AccountNbr
)
JOIN OSIBANK.PERS p ON ActvData.ResponsiblePersonNbr = p.PERSNBR
JOIN EmployeeEmail ee ON ActvData.ResponsiblePersonNbr = ee.CorePersNbr
LEFT JOIN PHONEMETADATA pmd ON taxpers.PERSNBR = pmd.PERSNBR
LEFT JOIN EMAILMETADATA emd ON taxpers.PERSNBR = emd.PERSNBR
WHERE (ActvData.AgreementNbr IS NOT NULL AND ActvData.CardState IS NOT NULL AND ActvData.CARDTYPE IS NOT NULL)
AND ActvData.CardType IN ('DBT', 'DBT2', 'BDBT', 'ATM')
--AND ACCTSTATCD = 'ACT' (Uncomment to only return cards that we issued to active accounts)
AND ActivityNbr > TO_NUMBER(COALESCE(:afterActivityNbr, '-1'))
AND ActivityDateTime >= TO_TIMESTAMP(COALESCE(:newerThanDateTime, '0001-01-01 00:00:00'), 'YYYY-MM-DD HH24:MI:SS')
ORDER BY ActvData.ActivityDateTime ASC
FETCH NEXT TO_NUMBER(COALESCE(:limitAmount, '100')) ROWS ONLY
@@ -0,0 +1,126 @@
/*New Checking Account Sale Query
----------------------------------
DESCRIPTION:
Get all Activities related to New checking accounts (ActvType = AADD and AccountType = 'Checking')
after a supplied DateTime (inclusive) or after a supplied ActivityNumber (not inclusive) or both.
Supplies Activity Data as well as the Account Number of the new account and the account status at the time of querying
RETURNS: Models/Activity/NewCheckingAccountActivity.cs
PARAMS:
|afterActivityNbr : Null or Int (as string)
|------------------------------------------------------------------------------
|Returns all Checking Sales with ActivityNbrs larger than the supplied number.
|If null defaults to -1 which will return all Checking SalesActivities
|newerThanDateTime : Null or Datetime in format 'YYYY-MM-DD HH24:MI:SS' (as string)
|-----------------------------------------------------------------------------
|Returns all Checking Sales with ActivityNbrs that occured on or after the supplied date
|If null defaults to '0001-01-01 00:00:00' which is oracles MIN Date time, this effectively
|returns all Checking Sales Activities
|limitAmount : Null or Int (as string)
|------------------------------------------------------------------------------
|Return record count
|If null defaults to '100'
NOTES:
- Activity Type Code 'AADD' are activities related to 'Adding an account'
- Limitation: You get the status of the account when querying. This could be different immediately after creation
- When Acct is associated with person, the TAXRPTFORPERSNBR will populate, when associated with organizations the
when associated with an organization the TAXRPTFORORGNBR will populate
- Using both the following sub account filters resulted in the same number of activities to be found (638) and removed duplicates. When neither of these are checked for null values, there are 662 (24 duplicates)
1. max(CASE WHEN a2.OLDVALUE = 'Key=' AND a2.TABLEID = 'Acct' AND a2.COLUMNID = 'AcctNbr' AND a2.DATABASEACTVCD = 'UPD' THEN a2.NEWVALUE END) AS SubActivityAccount (638 results)
2. max(CASE WHEN a2.COLUMNID = 'ACCTNBR' AND a2.TABLEID = 'ACCT' AND a2.DATABASEACTVCD = 'ADD' THEN a2.NEWVALUE END) AS SubActivityAccount (638 results)
*/
WITH EmployeeEmail AS (
SELECT p.PERSNBR As CorePersNbr,
addr.TEXT AS EmployeeEmail
FROM OSIBANK.PERSEMPL p
JOIN OSIBANK.PERSADDRUSE paddr ON
p.PERSNBR = PADDR.PERSNBR
JOIN OSIBANK.ADDRLINE addr ON
paddr.ADDRNBR = addr.ADDRNBR
AND paddr.ADDRUSECD = 'EBUS'
),
OriginalBalance AS (
--This assumes there is only 1 Note/Bal sub account for every account
--So far that has been true.
SELECT ACCTNBR, ORIGBAL
FROM OSIBANK.ACCTSUBACCT a2
WHERE a2.BALCATCD = 'NOTE'
AND a2.BALTYPCD = 'BAL'
),
ActivitySubActivity AS (
SELECT *
FROM OSIBANK.ACTVSUBACTV asa
WHERE asa.TABLEID = 'Acct'
),
NEWCHECKINGACTIVITYDATA AS (
SELECT a.ACTVNBR AS ActivityNbr,
a.ACTVDATETIME AS ActivityDateTime,
a.SUBJACCTNBR AS SubjectAccountNbr,
a.RESPPERSNBR AS ResponsiblePersonNbr,
a.ACTVTYPCD AS ActivityTypeCode,
--2 activities are sometimes created for adding an account, only 1 will update the account from key= to the actual account number value
max(CASE
WHEN asa.OLDVALUE = 'Key=' AND asa.COLUMNID = 'AcctNbr' AND asa.DATABASEACTVCD = 'UPD' THEN asa.NEWVALUE
END) AS SubActivityAccount
FROM OSIBANK.ACTV a
LEFT JOIN ActivitySubActivity asa ON asa.ACTVNBR = a.ACTVNBR
WHERE a.ACTVTYPCD = 'AADD'
GROUP BY a.ACTVNBR, a.ACTVDATETIME, a.SUBJACCTNBR, a.RESPPERSNBR, a.ACTVTYPCD
),
PHONEMETADATA AS (
SELECT p.PERSNBR,
LISTAGG((pp.AREACD || pp.EXCHANGE || pp.PHONENBR), ',') AS PhoneNumbers
FROM OSIBANK.PERS p
LEFT JOIN OSIBANK.PERSPHONE pp ON p.PERSNBR = pp.PERSNBR AND pp.PHONEUSECD != 'BUS'
GROUP BY p.PERSNBR
),
EMAILMETADATA AS (
SELECT p.PERSNBR,
LISTAGG(al.TEXT, ',') AS EmailAddresses
FROM OSIBANK.PERS p
LEFT JOIN OSIBANK.PERSADDRUSE pa ON p.PERSNBR = pa.PERSNBR AND pa.ADDRUSECD IN ('EHOM', 'EML')
LEFT JOIN OSIBANK.ADDRLINE al ON pa.ADDRNBR = al.ADDRNBR AND al.LINENBR = 1
GROUP BY p.PERSNBR
)
SELECT ActvData.*,
p.FIRSTNAME AS AssociateFirst,
p.LASTNAME AS AssociateLast,
p.MDLINIT AS AssociateMiddleInit,
ee.EmployeeEmail AS EmployeeEmail,
acc.CURRACCTSTATCD AS CurrentAccountStatus,
acc.TAXRPTFORPERSNBR AS TaxPersonNbr,
acc.TAXRPTFORORGNBR AS TaxOrgNbr,
CASE
WHEN acc.TAXRPTFORPERSNBR IS NOT NULL THEN CONCAT(CONCAT(TAXPERS.LASTNAMEUPPER, ','), TAXPERS.FIRSTNAMEUPPER)
ELSE NULL
END AS TaxPersonName,
TAXORG.ORGNAME AS TaxOrgName,
acc.BranchOrgNbr As BranchOrgNbr,
acc.CONTRACTDATE AS AccountContractDate,
acc.CURRMIACCTTYPCD AS MinorAccountType,
org.ORGNAME AS BranchOrgName,
ob.ORIGBAL AS OriginalBalance,
pmd.PhoneNumbers AS TaxPersonPhoneNumbers,
emd.EmailAddresses AS TaxPersonEmailAddresses
FROM NEWCHECKINGACTIVITYDATA ActvData
JOIN OSIBANK.PERS p ON p.PERSNBR = ActvData.ResponsiblePersonNbr
LEFT JOIN EmployeeEmail ee ON ee.CorePersNbr = ActvData.ResponsiblePersonNbr
JOIN OSIBANK.ACCT acc ON acc.ACCTNBR = ActvData.SubjectAccountNbr
JOIN OSIBANK.ORG org ON acc.BranchOrgNbr = org.ORGNBR
LEFT JOIN OSIBANK.PERS taxpers ON acc.TAXRPTFORPERSNBR = TAXPERS.PERSNBR
LEFT JOIN OSIBANK.ORG taxorg ON acc.TAXRPTFORORGNBR = TAXORG.ORGNBR
LEFT JOIN OriginalBalance ob ON acc.ACCTNBR = ob.AcctNbr
LEFT JOIN PHONEMETADATA pmd ON taxpers.PERSNBR = pmd.PERSNBR
LEFT JOIN EMAILMETADATA emd ON taxpers.PERSNBR = emd.PERSNBR
WHERE ActvData.SubActivityAccount IS NOT NULL
AND acc.CURRMIACCTTYPCD IN ('CK04', 'CK01', 'CK02', 'CK03', 'BC10', 'BC20', 'MMC5', 'BOC1', 'BOC2', 'BC01', 'MMC1', 'CK05', 'BC11', 'CK06')
AND ActivityNbr > TO_NUMBER(COALESCE(:afterActivityNbr, '-1'))
AND ActivityDateTime >= TO_TIMESTAMP(COALESCE(:newerThanDateTime, '0001-01-01 00:00:00'), 'YYYY-MM-DD HH24:MI:SS')
ORDER BY ActvData.ActivityDateTime ASC
FETCH NEXT TO_NUMBER(COALESCE(:limitAmount, '100')) ROWS ONLY
@@ -0,0 +1,103 @@
/*New Checking Account Sale Query
----------------------------------
DESCRIPTION:
Get all Activities related to New checking accounts (ActvType = ADAC and AccountType = 'Checking')
after a supplied DateTime (inclusive) or after a supplied ActivityNumber (not inclusive) or both.
Supplies Activity Data as well as the Account Number of the new account and the account status at the time of querying
RETURNS: Models/Activity/NewCheckingAccountActivity.cs
PARAMS:
|afterActivityNbr : Null or Int (as string)
|------------------------------------------------------------------------------
|Returns all Checking Sales with ActivityNbrs larger than the supplied number.
|If null defaults to -1 which will return all Checking SalesActivities
|newerThanDateTime : Null or Datetime in format 'YYYY-MM-DD HH24:MI:SS' (as string)
|-----------------------------------------------------------------------------
|Returns all Checking Sales with ActivityNbrs that occured on or after the supplied date
|If null defaults to '0001-01-01 00:00:00' which is oracles MIN Date time, this effectively
|returns all Checking Sales Activities
NOTES:
- Activity Type Code 'ADAC' are activities related to 'Adding an account'
- Limitation: You get the status of the account when querying. This could be different immediately after creation
- When Acct is associated with person, the TAXRPTFORPERSNBR will populate, when associated with organizations the
when associated with an organization the TAXRPTFORORGNBR will populate
- Using both the following sub account filters resulted in the same number of activities to be found (638) and removed duplicates. When neither of these are checked for null values, there are 662 (24 duplicates)
1. max(CASE WHEN a2.OLDVALUE = 'Key=' AND a2.TABLEID = 'Acct' AND a2.COLUMNID = 'AcctNbr' AND a2.DATABASEACTVCD = 'ADD' THEN a2.NEWVALUE END) AS SubActivityAccount (638 results)
2. max(CASE WHEN a2.COLUMNID = 'ACCTNBR' AND a2.TABLEID = 'ACCT' AND a2.DATABASEACTVCD = 'ADD' THEN a2.NEWVALUE END) AS SubActivityAccount (638 results)
*/
WITH OriginalBalance AS (
--This assumes there is only 1 Note/Bal sub account for every account
--So far that has been true.
SELECT ACCTNBR, ORIGBAL
FROM OSIBANK.ACCTSUBACCT a2
WHERE a2.BALCATCD = 'NOTE'
AND a2.BALTYPCD = 'BAL'
),
NEWCHECKINGACTIVITYDATA AS (
SELECT a.ACTVNBR AS ActivityNbr,
a.ACTVDATETIME AS ActivityDateTime,
a.SUBJACCTNBR AS SubjectAccountNbr,
a.RESPPERSNBR AS ResponsiblePersonNbr,
a.ACTVTYPCD AS ActivityTypeCode,
--2 activities are sometimes created for adding an account, only 1 will update the account from key= to the actual account number value
max(CASE
WHEN asa.OLDVALUE = 'Key=' AND asa.COLUMNID = 'AcctNbr' AND asa.DATABASEACTVCD = 'ADD' THEN asa.NEWVALUE
END) AS SubActivityAccount
FROM OSIBANK.ACTV a
LEFT JOIN OSIBANK.ACTVSUBACTV asa ON asa.ACTVNBR = a.ACTVNBR and asa.TABLEID = 'Acct'
WHERE a.ACTVTYPCD = 'ADAC'
GROUP BY a.ACTVNBR, a.ACTVDATETIME, a.SUBJACCTNBR, a.RESPPERSNBR, a.ACTVTYPCD
),
PHONEMETADATA AS (
SELECT p.PERSNBR,
LISTAGG((pp.AREACD || pp.EXCHANGE || pp.PHONENBR), ',') AS PhoneNumbers
FROM OSIBANK.PERS p
LEFT JOIN OSIBANK.PERSPHONE pp ON p.PERSNBR = pp.PERSNBR AND pp.PHONEUSECD != 'BUS'
GROUP BY p.PERSNBR
),
EMAILMETADATA AS (
SELECT p.PERSNBR,
LISTAGG(al.TEXT, ',') AS EmailAddresses
FROM OSIBANK.PERS p
LEFT JOIN OSIBANK.PERSADDRUSE pa ON p.PERSNBR = pa.PERSNBR AND pa.ADDRUSECD IN ('EHOM', 'EML')
LEFT JOIN OSIBANK.ADDRLINE al ON pa.ADDRNBR = al.ADDRNBR AND al.LINENBR = 1
GROUP BY p.PERSNBR )
SELECT ActvData.*,
'Digital' AS AssociateFirst,
'Banking' AS AssociateLast,
p.MDLINIT AS AssociateMiddleInit,
acc.CURRACCTSTATCD AS CurrentAccountStatus,
acc.TAXRPTFORPERSNBR AS TaxPersonNbr,
acc.TAXRPTFORORGNBR AS TaxOrgNbr,
'[email protected]' AS EmployeeEmail, --we will not have employee email for Digital Banking
CASE
WHEN acc.TAXRPTFORPERSNBR IS NOT NULL THEN CONCAT(CONCAT(TAXPERS.LASTNAMEUPPER, ','), TAXPERS.FIRSTNAMEUPPER)
ELSE NULL
END AS TaxPersonName,
TAXORG.ORGNAME AS TaxOrgName,
acc.BranchOrgNbr As BranchOrgNbr,
acc.CONTRACTDATE AS AccountContractDate,
acc.CURRMIACCTTYPCD AS MinorAccountType,
org.ORGNAME AS BranchOrgName,
ob.ORIGBAL AS OriginalBalance,
pmd.PhoneNumbers AS TaxPersonPhoneNumbers,
emd.EmailAddresses AS TaxPersonEmailAddresses
FROM NEWCHECKINGACTIVITYDATA ActvData
JOIN OSIBANK.PERS p ON p.PERSNBR = ActvData.ResponsiblePersonNbr
JOIN OSIBANK.ACCT acc ON acc.ACCTNBR = ActvData.SubjectAccountNbr
JOIN OSIBANK.ORG org ON acc.BranchOrgNbr = org.ORGNBR
LEFT JOIN OSIBANK.PERS taxpers ON acc.TAXRPTFORPERSNBR = TAXPERS.PERSNBR
LEFT JOIN OSIBANK.ORG taxorg ON acc.TAXRPTFORORGNBR = TAXORG.ORGNBR
LEFT JOIN OriginalBalance ob ON acc.ACCTNBR = ob.AcctNbr
LEFT JOIN PHONEMETADATA pmd ON taxpers.PERSNBR = pmd.PERSNBR
LEFT JOIN EMAILMETADATA emd ON taxpers.PERSNBR = emd.PERSNBR
WHERE acc.CURRMIACCTTYPCD IN ('CK04', 'CK01', 'CK02', 'CK03', 'BC10', 'BC20', 'MMC5', 'BOC1', 'BOC2', 'BC01', 'MMC1', 'CK05', 'BC11', 'CK06')
AND ActivityNbr > TO_NUMBER(COALESCE(:afterActivityNbr, '-1'))
AND ActivityDateTime >= TO_TIMESTAMP(COALESCE(:newerThanDateTime, '0001-01-01 00:00:00'), 'YYYY-MM-DD HH24:MI:SS')
ORDER BY ActvData.ActivityDateTime ASC
FETCH NEXT TO_NUMBER(COALESCE(:limitAmount, '200')) ROWS ONLY
@@ -0,0 +1,175 @@
/*New Debt Protected Loan Sale Query
----------------------------------
DESCRIPTION:
All activities related to new loans that can have debt protection associated with them, but are not
incentivised like Mortgages and Vehicles.
RETURNS: Models/Activity/NewCheckingAccountActivity.cs
PARAMS:
|afterActivityNbr : Null or Int (as string)
|------------------------------------------------------------------------------
|Returns all Sales with ActivityNbrs larger than the supplied number.
|If null defaults to -1 which will return all Checking SalesActivities
|newerThanDateTime : Null or Datetime in format 'YYYY-MM-DD HH24:MI:SS' (as string)
|-----------------------------------------------------------------------------
|Returns all Sales with ActivityNbrs that occured on or after the supplied date
|If null defaults to '0001-01-01 00:00:00' which is oracles MIN Date time, this effectively
|returns all Checking Sales Activities
NOTES:
- Use ContractDate as the date of the sale. This is the day that the customer signs for the loan. There is a legal grace-period between
When a loan is signed and when the loan is booked into the banking system. This is why there is a gap between contract date and activity date.
-Only need to know if an account has debt protection not how many debt protection policies the account has. We select the earliest sold
debt protection and add the date and type to signify that the loan has debt protection
- LADD type activities seem to produce duplicates occasionally, None were found for mortgage type accounts
*/
WITH EmployeeEmail AS (
SELECT p.PERSNBR As CorePersNbr,
addr.TEXT AS EmployeeEmail
FROM OSIBANK.PERSEMPL p
JOIN OSIBANK.PERSADDRUSE paddr ON
p.PERSNBR = PADDR.PERSNBR
JOIN OSIBANK.ADDRLINE addr ON
paddr.ADDRNBR = addr.ADDRNBR
AND paddr.ADDRUSECD = 'EBUS'
),
OriginatorRole AS (
SELECT ACCTNBR, PERSNBR, ACCTROLECD, DATELASTMAINT, EFFDATE
from OSIBANK.ACCTACCTROLEPERS a
WHERE ACCTROLECD = 'OEMP'
GROUP BY ACCTNBR, ACCTROLECD, DATELASTMAINT, EFFDATE, PERSNBR
HAVING DATELASTMAINT = MAX(DATELASTMAINT)
),
LoanLimit AS (
SELECT a2.ACCTNBR, a2.CREDITLIMITAMT, a2.DATELASTMAINT
FROM OSIBANK.ACCTLOANLIMITHIST a2
WHERE a2.CREDITLIMITAMT > '0'
GROUP BY a2.ACCTNBR, a2.CREDITLIMITAMT, a2.DATELASTMAINT
HAVING MIN(a2.DATELASTMAINT) = a2.DATELASTMAINT
ORDER BY CREDITLIMITAMT
),
OriginalBalance AS (
--This assumes there is only 1 Note/Bal sub account for every account
--So far that has been true.
SELECT ACCTNBR, ORIGBAL
FROM OSIBANK.ACCTSUBACCT a2
WHERE a2.BALCATCD = 'NOTE'
AND a2.BALTYPCD = 'BAL'
),
DebtProtection AS (
SELECT a.ACCTNBR,
MIN(var.CALCTYPEFFDATE) AS EffectiveDate,
a.BALCATCD
FROM OSIBANK.ACCTSUBACCT a
INNER JOIN (
SELECT ACCTNBR, MIN(SUBACCTNBR) AS SUBACCTNBR
FROM OSIBANK.ACCTSUBACCT sa
WHERE sa.BALTYPCD = 'SINS'
GROUP BY ACCTNBR
) b ON a.ACCTNBR = b.ACCTNBR AND a.SUBACCTNBR = b.SUBACCTNBR
INNER JOIN OSIBANK.ACCTSUBACCTCALCVAR var ON var.ACCTNBR = a.ACCTNBR AND a.SUBACCTNBR = var.SUBACCTNBR
GROUP BY a.ACCTNBR, var.CALCTYPEFFDATE, a.BALCATCD
),
BorrowerAge AS (
SELECT a.ACCTNBR, MAX(p.DATEBIRTH) AS YoungestBirthdate
FROM OSIBANK.ACCTACCTROLEPERS a
LEFT JOIN OSIBANK.ACCT acc ON a.ACCTNBR = acc.ACCTNBR
LEFT JOIN OSIBANK.ACCTROLE r ON r.ACCTROLECD = a.ACCTROLECD
LEFT JOIN OSIBANK.PERS p ON a.PERSNBR = p.PERSNBR
WHERE a.ACCTROLECD IN ('TRO', 'NTO', 'SIGN')
AND (p.DATEDEATH IS NULL OR p.DATEDEATH > acc.CONTRACTDATE)
GROUP BY a.ACCTNBR
),
PHONEMETADATA AS (
SELECT p.PERSNBR,
LISTAGG((pp.AREACD || pp.EXCHANGE || pp.PHONENBR), ',') AS PhoneNumbers
FROM OSIBANK.PERS p
LEFT JOIN OSIBANK.PERSPHONE pp ON p.PERSNBR = pp.PERSNBR AND pp.PHONEUSECD != 'BUS'
GROUP BY p.PERSNBR
),
EMAILMETADATA AS (
SELECT p.PERSNBR,
LISTAGG(al.TEXT, ',') AS EmailAddresses
FROM OSIBANK.PERS p
LEFT JOIN OSIBANK.PERSADDRUSE pa ON p.PERSNBR = pa.PERSNBR AND pa.ADDRUSECD IN ('EHOM', 'EML')
LEFT JOIN OSIBANK.ADDRLINE al ON pa.ADDRNBR = al.ADDRNBR AND al.LINENBR = 1
GROUP BY p.PERSNBR
)
SELECT a.ACTVNBR AS ActivityNbr,
a.ACTVDATETIME AS ActivityDateTime,
a.SUBJACCTNBR AS SubjectAccountNbr,
a.RESPPERSNBR AS ActivityResponsiblePersonNbr,
oe.PERSNBR AS OriginatingPersonNbr,
a.ACTVTYPCD AS ActivityTypeCode,
p.FIRSTNAME AS AssociateFirst,
p.LASTNAME AS AssociateLast,
p.MDLINIT AS AssociateMiddleInit,
--NEW = "New" | REFI = "Refinance"
ll.CREDITLIMITAMT AS LoanLimit,
ob.OrigBal AS OriginalBalance,
COALESCE(ll.CREDITLIMITAMT, ob.ORIGBAL) AS LoanAmount,
al.LOANSOURCECD AS LoanSourceCode,
--ABS(r.TRANAMT) AS LoanDispersalAmmount,
ee.EmployeeEmail AS EmployeeEmail,
acc.CURRACCTSTATCD AS CurrentAccountStatus,
acc.TAXRPTFORPERSNBR AS TaxPersonNbr,
acc.TAXRPTFORORGNBR AS TaxOrgNbr,
CASE WHEN acc.TAXRPTFORPERSNBR IS NOT NULL THEN CONCAT(CONCAT(TAXPERS.LASTNAMEUPPER, ','), TAXPERS.FIRSTNAMEUPPER) ELSE NULL END AS TaxPersonName,
TAXORG.ORGNAME AS TaxOrgName,
acc.BranchOrgNbr As BranchOrgNbr,
acc.MjAcctTypCd AS MajorAccountType,
acc.CURRMIACCTTYPCD AS MinorAccountType,
acc.CONTRACTDATE AS AccountContractDate,
org.ORGNAME AS BranchOrgName,
dp.EffectiveDate AS DebtProtectionEffectiveDate,
dp.BALCATCD AS DebtProtectionCategory,
CASE
WHEN
ba.YoungestBirthdate IS NOT NULL AND
p2.DATEBIRTH IS NOT NULL
THEN
GREATEST(ba.YOUNGESTBIRTHDATE, p2.DATEBIRTH)
ELSE
COALESCE(ba.YOUNGESTBIRTHDATE, p2.DATEBIRTH)
END AS YoungestBirthdateOnLoan,
CASE
WHEN
acc.ACCTNBR IN (
SELECT acctnbr
FROM OSIBANK.ACCTACCTROLEORG aro
Where aro.ACCTROLECD IN ('DBA', 'LLC', 'UNAS')
) OR
acc.TAXRPTFORORGNBR IS NOT NULL
THEN 1
ELSE 0
END AS HasOrgRoles,
pmd.PhoneNumbers AS TaxPersonPhoneNumbers,
emd.EmailAddresses AS TaxPersonEmailAddresses
FROM OSIBANK.ACTV a
LEFT JOIN OSIBANK.ACCT acc ON acc.ACCTNBR = a.SUBJACCTNBR
LEFT JOIN OriginatorRole oe ON acc.ACCTNBR = oe.AcctNbr
LEFT JOIN OSIBANK.PERS p ON p.PERSNBR = oe.PERSNBR
LEFT JOIN OSIBANK.PERS taxpers ON acc.TAXRPTFORPERSNBR = TAXPERS.PERSNBR
LEFT JOIN OSIBANK.ORG taxorg ON acc.TAXRPTFORORGNBR = TAXORG.ORGNBR
JOIN OSIBANK.ORG org ON org.ORGNBR = acc.BRANCHORGNBR
LEFT JOIN EmployeeEmail ee ON p.PERSNBR = ee.CorePersNbr
--Uncomment to get Loan Dispersal Transaction Information
--LEFT JOIN OSIBANK.RTXN r ON acc.ACCTNBR = r.ACCTNBR AND r.RTXNTYPCD = 'NDSB'
LEFT JOIN OSIBANK.ACCTLOAN al ON acc.ACCTNBR = al.ACCTNBR
LEFT JOIN LoanLimit ll ON ll.AcctNbr = acc.ACCTNBR
LEFT JOIN OriginalBalance ob ON ob.AcctNbr = acc.ACCTNBR
LEFT JOIN DebtProtection dp ON dp.ACCTNBR = acc.ACCTNBR
LEFT JOIN OSIBANK.ACTVSUBACTV sa ON sa.ACTVNBR = a.ACTVNBR
LEFT JOIN BorrowerAge ba ON ba.AcctNbr = acc.ACCTNBR
LEFT JOIN OSIBANK.PERS p2 ON acc.TAXRPTFORPERSNBR = p2.PERSNBR
LEFT JOIN PHONEMETADATA pmd ON taxpers.PERSNBR = pmd.PERSNBR
LEFT JOIN EMAILMETADATA emd ON taxpers.PERSNBR = emd.PERSNBR
WHERE acc.CURRMIACCTTYPCD IN ('SC01', 'SC02', 'SG01')
AND (a.ACTVTYPCD = 'ADAC' OR a.ACTVTYPCD = 'LADD')
AND LOWER(sa.TABLEID) = 'acct'
AND LOWER(sa.COLUMNID) = 'acctnbr'
AND a.ACTVNBR > TO_NUMBER(COALESCE(:afterActivityNbr, '-1'))
AND a.ACTVDATETIME >= TO_TIMESTAMP(COALESCE(:newerThanDateTime, '0001-01-01 00:00:00'), 'YYYY-MM-DD HH24:MI:SS')
@@ -0,0 +1,186 @@
/*New Mortgagage Account Sale Query
----------------------------------
DESCRIPTION:
Get all Activities related to New Mortgage Accounts (ActvType = AADD and AccountType = ('FE01', 'MF01', 'FE02', 'FLML')
after a supplied DateTime (inclusive) or after a supplied ActivityNumber (not inclusive) or both.
Supplies Activity Data as well as the Account Number of the new account and the account status at the time of querying
RETURNS: Models/Activity/NewCheckingAccountActivity.cs
PARAMS:
|afterActivityNbr : Null or Int (as string)
|------------------------------------------------------------------------------
|Returns all Checking Sales with ActivityNbrs larger than the supplied number.
|If null defaults to -1 which will return all Checking SalesActivities
|newerThanDateTime : Null or Datetime in format 'YYYY-MM-DD HH24:MI:SS' (as string)
|-----------------------------------------------------------------------------
|Returns all Checking Sales with ActivityNbrs that occured on or after the supplied date
|If null defaults to '0001-01-01 00:00:00' which is oracles MIN Date time, this effectively
|returns all Checking Sales Activities
NOTES:
- ALL HELOC type loans are technically 'children' of a mainline loan. A person may get approved for a 100,000 mainline loan
but take out only 5k at a time via fixed loans. For incentive purposes we do not want to pull in the activity for HELOC's children loans
instead we pull in Flex Mainline (FLML) Loans.
- For mainline loans we use the first credit limit amount that is not 0 as the loan amount (the amount the customer was approved for)
- For loans that do not have a parent mainline we use the original balance amount on the loan (the amount the customer has available after approval)
- Use ContractDate as the date of the sale. This is the day that the customer signs for the loan. There is a legal grace-period between
When a loan is signed and when the loan is booked into the banking system. This is why there is a gap between contract date and activity date.
-Only need to know if an account has debt protection not how many debt protection policies the account has. We select the earliest sold
debt protection and add the date and type to signify that the loan has debt protection
- LADD type activities seem to produce duplicates occasionally, None were found for mortgage type accounts
*/
WITH EmployeeEmail AS (
SELECT p.PERSNBR As CorePersNbr,
addr.TEXT AS EmployeeEmail
FROM OSIBANK.PERSEMPL p
JOIN OSIBANK.PERSADDRUSE paddr ON
p.PERSNBR = PADDR.PERSNBR
JOIN OSIBANK.ADDRLINE addr ON
paddr.ADDRNBR = addr.ADDRNBR
AND paddr.ADDRUSECD = 'EBUS'
),
OriginatorRole AS (
SELECT ACCTNBR, PERSNBR, ACCTROLECD, DATELASTMAINT, EFFDATE
from OSIBANK.ACCTACCTROLEPERS a
WHERE ACCTROLECD = 'OEMP'
GROUP BY ACCTNBR, ACCTROLECD, DATELASTMAINT, EFFDATE, PERSNBR
HAVING DATELASTMAINT = MAX(DATELASTMAINT)
),
LoanLimit AS (
SELECT a2.ACCTNBR, a2.CREDITLIMITAMT, a2.DATELASTMAINT
FROM OSIBANK.ACCTLOANLIMITHIST a2
WHERE a2.CREDITLIMITAMT > '0'
GROUP BY a2.ACCTNBR, a2.CREDITLIMITAMT, a2.DATELASTMAINT
HAVING MIN(a2.DATELASTMAINT) = a2.DATELASTMAINT
ORDER BY CREDITLIMITAMT
),
OriginalBalance AS (
--This assumes there is only 1 Note/Bal sub account for every account
--So far that has been true.
SELECT ACCTNBR, ORIGBAL
FROM OSIBANK.ACCTSUBACCT a2
WHERE a2.BALCATCD = 'NOTE'
AND a2.BALTYPCD = 'BAL'
),
DebtProtection AS (
SELECT a.ACCTNBR,
MIN(var.CALCTYPEFFDATE) AS EffectiveDate,
a.BALCATCD
FROM OSIBANK.ACCTSUBACCT a
INNER JOIN (
SELECT ACCTNBR, MIN(SUBACCTNBR) AS SUBACCTNBR
FROM OSIBANK.ACCTSUBACCT sa
WHERE sa.BALTYPCD = 'SINS'
GROUP BY ACCTNBR
) b ON a.ACCTNBR = b.ACCTNBR AND a.SUBACCTNBR = b.SUBACCTNBR
INNER JOIN OSIBANK.ACCTSUBACCTCALCVAR var ON var.ACCTNBR = a.ACCTNBR AND a.SUBACCTNBR = var.SUBACCTNBR
GROUP BY a.ACCTNBR, var.CALCTYPEFFDATE, a.BALCATCD
),
BorrowerAge AS (
SELECT a.ACCTNBR, MAX(p.DATEBIRTH) AS YoungestBirthdate
FROM OSIBANK.ACCTACCTROLEPERS a
LEFT JOIN OSIBANK.ACCT acc ON a.ACCTNBR = acc.ACCTNBR
LEFT JOIN OSIBANK.ACCTROLE r ON r.ACCTROLECD = a.ACCTROLECD
LEFT JOIN OSIBANK.PERS p ON a.PERSNBR = p.PERSNBR
WHERE a.ACCTROLECD IN ('TRO', 'NTO', 'SIGN')
AND (p.DATEDEATH IS NULL OR p.DATEDEATH > acc.CONTRACTDATE)
GROUP BY a.ACCTNBR
),
PHONEMETADATA AS (
SELECT p.PERSNBR,
LISTAGG((pp.AREACD || pp.EXCHANGE || pp.PHONENBR), ',') AS PhoneNumbers
FROM OSIBANK.PERS p
LEFT JOIN OSIBANK.PERSPHONE pp ON p.PERSNBR = pp.PERSNBR AND pp.PHONEUSECD != 'BUS'
GROUP BY p.PERSNBR
),
EMAILMETADATA AS (
SELECT p.PERSNBR,
LISTAGG(al.TEXT, ',') AS EmailAddresses
FROM OSIBANK.PERS p
LEFT JOIN OSIBANK.PERSADDRUSE pa ON p.PERSNBR = pa.PERSNBR AND pa.ADDRUSECD IN ('EHOM', 'EML')
LEFT JOIN OSIBANK.ADDRLINE al ON pa.ADDRNBR = al.ADDRNBR AND al.LINENBR = 1
GROUP BY p.PERSNBR
)
SELECT a.ACTVNBR AS ActivityNbr,
a.ACTVDATETIME AS ActivityDateTime,
a.SUBJACCTNBR AS SubjectAccountNbr,
a.RESPPERSNBR AS ActivityResponsiblePersonNbr,
oe.PERSNBR AS OriginatingPersonNbr,
a.ACTVTYPCD AS ActivityTypeCode,
p.FIRSTNAME AS AssociateFirst,
p.LASTNAME AS AssociateLast,
p.MDLINIT AS AssociateMiddleInit,
--NEW = "New" | REFI = "Refinance"
ll.CREDITLIMITAMT AS LoanLimit,
ob.OrigBal AS OriginalBalance,
COALESCE(ll.CREDITLIMITAMT, ob.ORIGBAL) AS LoanAmount,
al.LOANSOURCECD AS LoanSourceCode,
--ABS(r.TRANAMT) AS LoanDispersalAmmount,
ee.EmployeeEmail AS EmployeeEmail,
acc.CURRACCTSTATCD AS CurrentAccountStatus,
acc.TAXRPTFORPERSNBR AS TaxPersonNbr,
acc.TAXRPTFORORGNBR AS TaxOrgNbr,
CASE WHEN acc.TAXRPTFORPERSNBR IS NOT NULL THEN CONCAT(CONCAT(TAXPERS.LASTNAMEUPPER, ','), TAXPERS.FIRSTNAMEUPPER) ELSE NULL END AS TaxPersonName,
TAXORG.ORGNAME AS TaxOrgName,
acc.BranchOrgNbr As BranchOrgNbr,
acc.MjAcctTypCd AS MajorAccountType,
acc.CURRMIACCTTYPCD AS MinorAccountType,
acc.CONTRACTDATE AS AccountContractDate,
org.ORGNAME AS BranchOrgName,
dp.EffectiveDate AS DebtProtectionEffectiveDate,
dp.BALCATCD AS DebtProtectionCategory,
CASE
WHEN
ba.YOUNGESTBIRTHDATE IS NOT NULL AND
p2.DATEBIRTH IS NOT NULL
THEN
GREATEST(ba.YOUNGESTBIRTHDATE, p2.DATEBIRTH)
ELSE
COALESCE(ba.YOUNGESTBIRTHDATE, p2.DATEBIRTH)
END AS YoungestBirthdateOnLoan,
CASE
WHEN
acc.ACCTNBR IN (
SELECT acctnbr
FROM OSIBANK.ACCTACCTROLEORG aro
Where aro.ACCTROLECD IN ('DBA', 'LLC', 'UNAS')
) OR
acc.TAXRPTFORORGNBR IS NOT NULL
THEN 1
ELSE 0
END AS HasOrgRoles,
pmd.PhoneNumbers AS TaxPersonPhoneNumbers,
emd.EmailAddresses AS TaxPersonEmailAddresses
FROM OSIBANK.ACTV a
LEFT JOIN OSIBANK.ACCT acc ON acc.ACCTNBR = a.SUBJACCTNBR
LEFT JOIN OriginatorRole oe ON acc.ACCTNBR = oe.AcctNbr
LEFT JOIN OSIBANK.PERS p ON p.PERSNBR = oe.PERSNBR
LEFT JOIN OSIBANK.PERS taxpers ON acc.TAXRPTFORPERSNBR = TAXPERS.PERSNBR
LEFT JOIN OSIBANK.ORG taxorg ON acc.TAXRPTFORORGNBR = TAXORG.ORGNBR
JOIN OSIBANK.ORG org ON org.ORGNBR = acc.BRANCHORGNBR
LEFT JOIN EmployeeEmail ee ON p.PERSNBR = ee.CorePersNbr
--Uncomment to get Loan Dispersal Transaction Information
--LEFT JOIN OSIBANK.RTXN r ON acc.ACCTNBR = r.ACCTNBR AND r.RTXNTYPCD = 'NDSB'
LEFT JOIN OSIBANK.ACCTLOAN al ON acc.ACCTNBR = al.ACCTNBR
LEFT JOIN LoanLimit ll ON ll.AcctNbr = acc.ACCTNBR
LEFT JOIN OriginalBalance ob ON ob.AcctNbr = acc.ACCTNBR
LEFT JOIN DebtProtection dp ON dp.ACCTNBR = acc.ACCTNBR
LEFT JOIN OSIBANK.ACTVSUBACTV sa ON sa.ACTVNBR = a.ACTVNBR
LEFT JOIN BorrowerAge ba ON ba.AcctNbr = acc.ACCTNBR
LEFT JOIN OSIBANK.PERS p2 ON acc.TAXRPTFORPERSNBR = p2.PERSNBR
LEFT JOIN PHONEMETADATA pmd ON taxpers.PERSNBR = pmd.PERSNBR
LEFT JOIN EMAILMETADATA emd ON taxpers.PERSNBR = emd.PERSNBR
WHERE acc.MJACCTTYPCD IN ('CNS', 'MLN', 'MTG')
AND acc.CURRMIACCTTYPCD IN ('HE01', 'FE01', 'MF01', 'FE02', 'FNMA', 'FRML', 'FRMH', 'MPFR', 'MJ30', 'HM01', 'HM02',
'MF10', 'HM03', 'HM04', 'DEF3', 'ML01', 'ML03', 'MJ03', 'MJ05', 'MJ07', 'MF15', 'MF20', 'MF30', 'MC93', 'MA55', 'MS30',
'MS10', 'MS15', 'MS20', 'MS40', 'MC09', 'ML02', 'MA01', 'MP05', 'MA05', 'MC01', 'MI05', 'MC03', 'MJ55', 'MC91', 'MF40',
'MS05', 'MS07', 'MI03', 'MA03', 'MA07', 'MA27', 'ML23', 'ML21', 'MP25', 'MC21', 'MA21', 'MJ27', 'HM05', 'MA23', 'MA25',
'MI25', 'MJ23', 'MJ25')
AND (a.ACTVTYPCD = 'ADAC' OR a.ACTVTYPCD = 'LADD')
AND LOWER(sa.TABLEID) = 'acct'
AND LOWER(sa.COLUMNID) = 'acctnbr'
AND a.ACTVNBR > TO_NUMBER(COALESCE(:afterActivityNbr, '-1'))
AND a.ACTVDATETIME >= TO_TIMESTAMP(COALESCE(:newerThanDateTime, '0001-01-01 00:00:00'), 'YYYY-MM-DD HH24:MI:SS')
@@ -0,0 +1,164 @@
/*New Vehicle Account Sale Query
----------------------------------
DESCRIPTION:
Get all Activities related to New Mortgage Accounts (ActvType = AADD and AccountType = ('FE01', 'MF01', 'FE02', 'FLML')
after a supplied DateTime (inclusive) or after a supplied ActivityNumber (not inclusive) or both.
Supplies Activity Data as well as the Account Number of the new account and the account status at the time of querying
RETURNS: Models/Activity/NewCheckingAccountActivity.cs
PARAMS:
|afterActivityNbr : Null or Int (as string)
|------------------------------------------------------------------------------
|Returns all Checking Sales with ActivityNbrs larger than the supplied number.
|If null defaults to -1 which will return all Checking SalesActivities
|newerThanDateTime : Null or Datetime in format 'YYYY-MM-DD HH24:MI:SS' (as string)
|-----------------------------------------------------------------------------
|Returns all Checking Sales with ActivityNbrs that occured on or after the supplied date
|If null defaults to '0001-01-01 00:00:00' which is oracles MIN Date time, this effectively
|returns all Checking Sales Activities
Potential Types: DLxx may be added in the future
'BE21','DL01','DL06','DL07','DL08','DL09','DL10','DL11','DL12','DL13','DL14','DL16','DV01','DV02','DV03','DV04','DV05','DV06','DV07','DV08',
NOTES:
- See Mortgage Loan Notes
-Only need to know if an account has debt protection not how many debt protection policies the account has. We select the earliest sold
debt protection and add the date and type to signify that the loan has debt protection
- LADD type activities seem to produce duplicates occasionally, None were found for vehicle type accounts
*/
WITH EmployeeEmail AS (
SELECT
p.PERSNBR As CorePersNbr,
addr.TEXT AS EmployeeEmail
FROM
OSIBANK.PERSEMPL p
JOIN OSIBANK.PERSADDRUSE paddr ON
p.PERSNBR = PADDR.PERSNBR
JOIN OSIBANK.ADDRLINE addr ON
paddr.ADDRNBR = addr.ADDRNBR
AND paddr.ADDRUSECD = 'EBUS'
),
OriginatorRole AS (
SELECT ACCTNBR, PERSNBR, ACCTROLECD, DATELASTMAINT, EFFDATE from OSIBANK.ACCTACCTROLEPERS a
WHERE ACCTROLECD = 'OEMP'
GROUP BY ACCTNBR, ACCTROLECD, DATELASTMAINT, EFFDATE, PERSNBR
HAVING DATELASTMAINT = MAX(DATELASTMAINT)
),
OriginalBalance AS (
--This assumes there is only 1 Note/Bal sub account for every account
--So far that has been true.
SELECT ACCTNBR, ORIGBAL FROM OSIBANK.ACCTSUBACCT a2
WHERE a2.BALCATCD = 'NOTE' AND a2.BALTYPCD = 'BAL'
),
DebtProtection AS (
SELECT
a.ACCTNBR,
MIN(var.CALCTYPEFFDATE) AS EffectiveDate,
a.BALCATCD
FROM OSIBANK.ACCTSUBACCT a
INNER JOIN (
SELECT ACCTNBR, MAX(SUBACCTNBR) AS SUBACCTNBR FROM OSIBANK.ACCTSUBACCT sa
WHERE sa.BALTYPCD = 'SINS'
GROUP BY ACCTNBR
) b ON a.ACCTNBR = b.ACCTNBR AND a.SUBACCTNBR = b.SUBACCTNBR
INNER JOIN OSIBANK.ACCTSUBACCTCALCVAR var ON var.ACCTNBR = a.ACCTNBR AND a.SUBACCTNBR = var.SUBACCTNBR
GROUP BY a.ACCTNBR, var.CALCTYPEFFDATE, a.BALCATCD
),
BorrowerAge AS (
SELECT a.ACCTNBR, MAX(p.DATEBIRTH) AS YoungestBirthdate FROM OSIBANK.ACCTACCTROLEPERS a
LEFT JOIN OSIBANK.ACCT acc ON a.ACCTNBR = acc.ACCTNBR
LEFT JOIN OSIBANK.ACCTROLE r ON r.ACCTROLECD = a.ACCTROLECD
LEFT JOIN OSIBANK.PERS p ON a.PERSNBR = p.PERSNBR
WHERE a.ACCTROLECD IN ('TRO','NTO','SIGN') AND (p.DATEDEATH IS NULL OR p.DATEDEATH > acc.CONTRACTDATE)
GROUP BY a.ACCTNBR
),
PHONEMETADATA AS (
SELECT
p.PERSNBR,
LISTAGG((pp.AREACD || pp.EXCHANGE || pp.PHONENBR),',') AS PhoneNumbers
FROM OSIBANK.PERS p
LEFT JOIN OSIBANK.PERSPHONE pp ON p.PERSNBR = pp.PERSNBR AND pp.PHONEUSECD != 'BUS'
GROUP BY p.PERSNBR
),
EMAILMETADATA AS (
SELECT
p.PERSNBR,
LISTAGG(al.TEXT,',') AS EmailAddresses
FROM OSIBANK.PERS p
LEFT JOIN OSIBANK.PERSADDRUSE pa ON p.PERSNBR = pa.PERSNBR AND pa.ADDRUSECD IN ('EHOM','EML')
LEFT JOIN OSIBANK.ADDRLINE al ON pa.ADDRNBR = al.ADDRNBR AND al.LINENBR = 1
GROUP BY p.PERSNBR
)
SELECT
a.ACTVNBR AS ActivityNbr,
a.ACTVDATETIME AS ActivityDateTime,
a.SUBJACCTNBR AS SubjectAccountNbr,
a.RESPPERSNBR AS ActivityResponsiblePersonNbr,
oe.PERSNBR AS OriginatingPersonNbr,
a.ACTVTYPCD AS ActivityTypeCode,
p.FIRSTNAME AS AssociateFirst,
p.LASTNAME AS AssociateLast,
p.MDLINIT AS AssociateMiddleInit,
--NEW = "New" | REFI = "Refinance"
ob.OrigBal AS LoanAmount,
al.LOANSOURCECD AS LoanSourceCode,
--ABS(r.TRANAMT) AS LoanDispersalAmmount,
ee.EmployeeEmail AS EmployeeEmail,
acc.CURRACCTSTATCD AS CurrentAccountStatus,
acc.TAXRPTFORPERSNBR AS TaxPersonNbr,
acc.TAXRPTFORORGNBR AS TaxOrgNbr,
CASE WHEN acc.TAXRPTFORPERSNBR IS NOT NULL THEN CONCAT(CONCAT(TAXPERS.LASTNAMEUPPER, ','),TAXPERS.FIRSTNAMEUPPER) ELSE NULL END AS TaxPersonName,
TAXORG.ORGNAME AS TaxOrgName,
acc.BranchOrgNbr As BranchOrgNbr,
acc.MjAcctTypCd AS MajorAccountType,
acc.CURRMIACCTTYPCD AS MinorAccountType,
acc.CONTRACTDATE AS AccountContractDate,
org.ORGNAME AS BranchOrgName,
dp.EffectiveDate AS DebtProtectionEffectiveDate,
dp.BALCATCD AS DebtProtectionCategory,
CASE
WHEN
ba.YOUNGESTBIRTHDATE IS NOT NULL AND
p2.DATEBIRTH IS NOT NULL
THEN
GREATEST(ba.YoungestBirthdate, p2.DATEBIRTH)
ELSE
COALESCE (ba.YoungestBirthdate, p2.DATEBIRTH)
END AS YoungestBirthdateOnLoan,
CASE
WHEN
acc.ACCTNBR IN (
SELECT acctnbr FROM OSIBANK.ACCTACCTROLEORG aro
Where aro.ACCTROLECD IN ('DBA', 'LLC','UNAS')
) OR
acc.TAXRPTFORORGNBR IS NOT NULL
THEN 1
ELSE 0
END AS HasOrgRoles,
pmd.PhoneNumbers AS TaxPersonPhoneNumbers,
emd.EmailAddresses AS TaxPersonEmailAddresses
FROM OSIBANK.ACTV a
JOIN OSIBANK.ACCT acc ON acc.ACCTNBR = a.SUBJACCTNBR
LEFT JOIN OriginatorRole oe ON acc.ACCTNBR = oe.AcctNbr
LEFT JOIN OSIBANK.PERS p ON p.PERSNBR = oe.PERSNBR
LEFT JOIN OSIBANK.PERS taxpers ON acc.TAXRPTFORPERSNBR = TAXPERS.PERSNBR
LEFT JOIN OSIBANK.ORG taxorg ON acc.TAXRPTFORORGNBR = TAXORG.ORGNBR
JOIN OSIBANK.ORG org ON org.ORGNBR = acc.BRANCHORGNBR
LEFT JOIN EmployeeEmail ee ON p.PERSNBR = ee.CorePersNbr
--Uncomment to get Loan Dispersal Transaction Information
--LEFT JOIN OSIBANK.RTXN r ON acc.ACCTNBR = r.ACCTNBR AND r.RTXNTYPCD = 'NDSB'
LEFT JOIN OSIBANK.ACCTLOAN al ON acc.ACCTNBR = al.ACCTNBR
LEFT JOIN OriginalBalance ob ON ob.AcctNbr = acc.ACCTNBR
LEFT JOIN DebtProtection dp ON dp.ACCTNBR = acc.ACCTNBR
LEFT JOIN OSIBANK.ACTVSUBACTV sa ON sa.ACTVNBR = a.ACTVNBR
LEFT JOIN BorrowerAge ba ON ba.AcctNbr = acc.ACCTNBR
LEFT JOIN OSIBANK.PERS p2 ON acc.TAXRPTFORPERSNBR = p2.PERSNBR
LEFT JOIN PHONEMETADATA pmd ON taxpers.PERSNBR = pmd.PERSNBR
LEFT JOIN EMAILMETADATA emd ON taxpers.PERSNBR = emd.PERSNBR
WHERE
acc.MJACCTTYPCD IN ('CNS','CML')
AND acc.CURRMIACCTTYPCD IN ('BE21','DV01','DV02','DV03','DV04','DV05','DV06','DV07','DV08')
AND (a.ACTVTYPCD = 'ADAC' OR a.ACTVTYPCD = 'LADD') AND LOWER(sa.TABLEID) = 'acct' AND LOWER(sa.COLUMNID) = 'acctnbr'
AND a.ACTVNBR > TO_NUMBER(COALESCE( :afterActivityNbr, '-1'))
AND a.ACTVDATETIME >= TO_TIMESTAMP(COALESCE(:newerThanDateTime, '0001-01-01 00:00:00'), 'YYYY-MM-DD HH24:MI:SS')
@@ -0,0 +1,80 @@
/*
CUSTOM FIELD INFO (ActivityManager.LF_LEAD_CUSTOM):
Credit Card Balance Transfer
--LeadCust_39 = External CC Account Number
--LeadCust_31 = Landmark Credit Card Number
--LeadCust_29 = Transfer Ammount
--LeadCust_28 = Payment State + Zip
--LeadCust_27 = Payment City
--LeadCust_26 = Payment Address Line 1
--LeadCust_24 = Transfer Institution
Direct Deposit
--LeadCust_38 = Direct Deposit is Qualified Referral
--LeadCust_4 = Direct Deposit Account Number
*/
WITH EmployeeEmail AS (
SELECT pers.USERID AS SafUserId,
prod.PERSNBR AS SafPersNbr,
prod.PRODPERSID AS CorePersNbr,
addr.TEXT AS EmployeeEmail
FROM SAF.PERSUSER pers
JOIN SAF.PERSPROD prod ON
pers.PERSNBR = PROD.PERSNBR
AND prod.PRODNBR = '3'
JOIN OSIBANK.PERSADDRUSE paddr ON
prod.PRODPERSID = PADDR.PERSNBR
JOIN OSIBANK.ADDRLINE addr ON
paddr.ADDRNBR = addr.ADDRNBR
AND paddr.ADDRUSECD = 'EBUS'
)
SELECT ll.ID AS ActivityId,
-- These custom fields can be reused, guarentee their contents by only using them for their respective campaigns
(CASE WHEN ll.CAMPAIGN = 'CC Balance Transfer' THEN llc.LEADCUST_31 ELSE NULL END) AS LandmarkCreditCardNumber,
(CASE WHEN ll.CAMPAIGN = 'Direct Deposit' THEN llc.LEADCUST_4 ELSE NULL END) AS DirectDepositAccountNumber,
ll.ORIGINATOR AS OriginatorUserId,
safprod.PRODPERSID AS OriginatorPersNbr,
p.FIRSTNAME AS OriginatorFirstName,
p.LASTNAME AS OriginatorLastName,
p.MDLINIT AS OriginatorMiddleInitial,
ee.EmployeeEmail AS EmployeeEmail,
ll.CAMPAIGN AS Campaign,
ll.CATEGORY AS Category,
ll.STATION AS ReferralStation,
ll.DATELASTMAINT AS LastUpdatedDateTime,
(CASE WHEN att.INITIAL_STATION = 'Yes' THEN 1 ELSE 0 END) AS IsInitialStation,
(CASE WHEN att.FINAL_STATION = 'Yes' THEN 1 ELSE 0 END) AS IsFinalStation,
att.ACTIVITY_ORIGINATION_DATE AS OriginationDateTime,
att.ENTER_STATION_DATETIME AS StationDateTime,
ll.SOURCE AS OriginatingBranchName,
(CASE
WHEN SUBSTR(lp.EXTID3, 1, 1) = 'P' THEN REGEXP_SUBSTR(lp.EXTID3, '\d+')
ELSE NULL END
) AS ReferredPersonNbr,
(CASE
WHEN SUBSTR(lp.EXTID3, 1, 1) = 'O' THEN REGEXP_SUBSTR(lp.EXTID3, '\d+')
ELSE NULL END
) AS ReferredOrgNbr,
lp.EXTID3 AS ReferredPersOrgNbr
FROM ACTIVITYMANAGER.LF_LEAD ll
JOIN ACTIVITYMANAGER.LF_LEAD_CUSTOM llc ON
ll.ID = llc.ID
JOIN SAF.PERSUSER safp ON
safp.USERID = ll.ORIGINATOR
JOIN SAF.PERSPROD safprod ON
SAFPROD.PERSNBR = safp.PERSNBR AND
SAFPROD.PRODNBR = '3'
JOIN OSIBANK.PERS p ON
p.PERSNBR = SAFPROD.PRODPERSID
LEFT JOIN EmployeeEmail ee ON
ee.SafPersNbr = SAFP.PERSNBR
JOIN ACTIVITYMANAGER.LF_PERSON lp ON
lp.ID = ll.PERSONID
JOIN ACTIVITYMANAGER.ACTIVITY_TIME_TRACKING att
ON att.ACTIVITY_ID = ll.ID AND SEQUENCE_NUMBER = (
SELECT MAX(SEQUENCE_NUMBER)
FROM ACTIVITYMANAGER.ACTIVITY_TIME_TRACKING att2
WHERE att2.ACTIVITY_ID = ll.ID
)
WHERE ll.Id IN :activityIds
@@ -0,0 +1,43 @@
With PhoneMetaData as (
Select p.persnbr, ListAgg((pp.areacd || pp.exchange || pp.phonenbr), ',') As PhoneNumbers
From Osibank.Pers p
Left Join Osibank.PersPhone pp on p.persnbr = pp.persnbr and pp.phoneusecd != 'BUS'
Group By p.persnbr
),
EmailMetaData as (
Select p.persnbr, ListAgg(al.text, ',') As EmailAddresses
From Osibank.Pers p
Left Join Osibank.PersAddrUse pa on p.persnbr = pa.persnbr and pa.ADDRUSECD IN ('EHOM', 'EML')
Left Join Osibank.AddrLine al on pa.addrnbr = al.addrnbr and al.linenbr = 1
Group By p.persnbr),
ActivityData as (
Select activity.subjacctnbr as AccountNumber, activity.actvnbr as ActivityNumber, activity.datelastmaint as ActivityDateTime
From (Select av.subjacctnbr, asv.actvnbr, asv.datelastmaint, ROW_NUMBER() Over (Partition by av.subjacctnbr Order by asv.datelastmaint asc) deliveryUpdate
From Osibank.ActvSubActv asv
Join Osibank.Actv av on asv.actvnbr = av.actvnbr
where (
asv.columnID = 'OvrDeliveryMethCd'
and asv.OldValue = 'PRNT'
and asv.databaseactvcd = 'UPD'
and asv.NewValue = 'WWW'
and asv.datelastmaint > TO_TIMESTAMP(:newerThanDateTime, 'YYYY-MM-DD HH24:MI:SS')
)
) activity
Where deliveryUpdate = 1 and activity.datelastmaint > TO_TIMESTAMP(:newerThanDateTime, 'YYYY-MM-DD HH24:MI:SS'))
Select ad.*, ma.shareacctnbr as ShareAccountNumber,
ma.primarypersnbr as PersonNumber,
ac.taxrptfororgnbr as OrganizationNumber,
ac.currmiaccttypcd as MinorAccountType,
pe.firstname as FirstName, pe.lastname as LastName,
pmd.phonenumbers, emd.emailaddresses
From Osibank.Acct ac
Join ActivityData ad on ad.AccountNumber = ac.acctnbr
Join Osibank.MemberAgreement ma on ma.shareacctnbr = ac.acctnbr
Join Osibank.Pers pe on pe.persnbr = ma.primarypersnbr
Left Join PhoneMetaData pmd on pe.persnbr = pmd.persnbr
Left Join EmailMetaData emd on pe.persnbr = emd.persnbr
where ac.OvrDeliveryMethCd = 'WWW'