From e5aaec7d13aa1a5fda470a8b92a5ee3f1656fbef Mon Sep 17 00:00:00 2001 From: Alex Zorkin Date: Tue, 17 Dec 2024 15:32:13 -0800 Subject: [PATCH] feat: unassociated credit trade calculations, credit validation script --- etl/database/nifi-registry-primary.mv.db | Bin 94208 -> 94208 bytes etl/nifi/conf/flow.json.gz | Bin 9990 -> 9966 bytes etl/nifi/conf/flow.xml.gz | Bin 15551 -> 15490 bytes etl/nifi_scripts/compliance_report.groovy | 81 +++++++++++- etl/nifi_scripts/credit_validation.groovy | 143 ++++++++++++++++++++++ 5 files changed, 223 insertions(+), 1 deletion(-) create mode 100644 etl/nifi_scripts/credit_validation.groovy diff --git a/etl/database/nifi-registry-primary.mv.db b/etl/database/nifi-registry-primary.mv.db index c02fd000c0568f6388ea0a127a8a36a40f99f1fe..7d5887b3c10103f8cacc6577f8b4b86872b12612 100644 GIT binary patch delta 7235 zcmeHMYj73i8UA+n>^aLJBoITA69Y*Q5HP^rFUL{?4r%E~!o@n+(aK&0fh1g|)7CwB z`Jsi1tPpRlBUMYOQ%FzoOn9jxEaRz@tXDEI5`*!ziaw3RY z`=@7ydC$AM*?rHq-*b6iN@v*88Fp_M?TU|GH+!lpc6%G$ZT32MOHp$?O%XgZKVm-H z5L|4SdF5+5CcrfTx1xQKWp-~F9Nbovbe)Hf=n8_|y>0y_wsYJvcoK&2u0KLFr&I+cNP9np#jkaq!!8 zaBkki^DUjW4B9dgVm5G-7}SI~d)@Yd4GSD2{^CVn;0`O7K9GN&!WR@BBN!TJ_WACO z>vy;-%)8yK@H4wNnLCT7Dw3niA<-S3hoeJ9(~DL|mBYo6RLKyd)iFHHbTwV--afE> ztLrS@c3ZScj+-o)W8jrCc!lpCwC(Lf=79Z;BJXSA-E{qhxGJyP+Bj%$C~Dms-GQRi zJ%lSWQdP>hNKvz^MGCS?inLVnTH-ee7r{q!`P7?~WZBc~xYla1E?+Iy!^MgcFQV?@{Ss-fBj)QwjH?k&V;1j}&j;GbXb^23c< zbUw#7PIf+EH{4sowCcjAC314m*S;3FCkgFS~jg0q8-w_6&a0x8}qAroLRiRlua zt;m9*MO1**$Krx%I9_|h^K9FZmE=)yCk#`KP%p1*pybQA zJVNwVnvPNX^!TXN#-LUss69(iD-t=E2x@`zLOF+kQEOtkkSFIce_7KP-k z)EJ0VF*bffp>(JGgBNNedCfe*gg;gsKOHFW-2lH9uf(c(d2L)gRvbSX6j9wZ+Nf-v zL+u+ePuB12%+5--dMqq(Ao07ZD9gHLYH6{$0~B?%cM44%_DkWO0E@wacd6Y+9 zrJ2~F5FD!k9B3ITBANlStDQh-(QPb*tICS* zz!%Rl6kQ1Vcl8FpdiCjY?tz!6VDJ4iqks37UwXAfL8a_T=2n_6pkV*5g*nyKp+7K# zqbCmsr(Rnf_`m))Tz_x*t=GGlT=wRCg`o?<`8Qu!#ESxWT8}d%8=MgS;yAYMN}M4p zysKy;XDFsF=#Iu2nkE>!EO3UWTCQbS!OA~eU+&l=u(^;$Ccl!w+P|RbZgyPlhZSS{ zo~UX+3wj#2eJB> zNDOfT`9uH+d_gF8rfI~K>o8Hqw3lM9DpAUcryHgj6D5@&Uc87pmmB(U%2XDy!;dYc zW)EMyiF&pk{eJU{jV&yqXePs=VPP?xkZ+=%$!*ztO>6qn=a?P8Y^prhLoH-;-<&nI ztr<8gZDb;vYFn8jDhmDm!d5(wdx!Ipth43?Jm&g!U~ zy^C5%XIqBl&g#VBkr@VUnzU&Fv%U2c*Ol@tQp_#^e{4791iv`e;zOsEOcz2+va@K3 zso_H8Qmjakrq1bb&^E=I!fLn-lFMSQihE*gs z=E!wTkFUYUo42;&*xJ$tI)>1-R3pS5bnW+E0VRk0McDLg4{E>hcMwmY_Q6{a$|BT$ z5b`V>e+PIZTSC+Q8Nd$>CDcLfhIj&XC`|}W1~k?8LM)-q>mG!70(J5<`~o%Q0zmXDtN5uGxRp@|F)}#RQXTp#>2`3nGRVM1WTPq&obW($GFf z?zv@+0~K9p{65Rp6V=P+xC!}*b(88*SLf_CtIN~=_CCkV+?*|6`k+0>%zryqo__w_ z9HW20l`mY{pJ%kC6Dp78sZ)7o$%pxhHD_bt{cupk~myq4VP?^x^Rp`k5Mq z{%NAnb88iPO03Z9Y8CoetkCXgg)YVlZ4-rt6&*F}S7H06XZ?`VQyvF1j}`g{i9+9x z75Z&9LrV{jRQ?i5Z5#c{qx(BjimJqls)v5v|5+?sO5}_MG9*vHcy($^G@w>(6LAgY zE;ZO+Hfpl3r#U11KM;`H@zwUpxNJQtJ9NcrdaFEy8m64(dN$!a+gYii0NmaW`L`qJOS~0>5^O9#;p-K4yrH&%~k}C7(c) uiDD5=_WuW>oL08pPbJFW0^oC<4O0@HOi5y0N~ud?{w3A%6x+0_=KnwV{>&Kw delta 8943 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 A9RL6T diff --git a/etl/nifi/conf/flow.json.gz b/etl/nifi/conf/flow.json.gz index 8f11783001e360b6dd75d691cf63bee303add2ff..f27e12b1ddacb020920b9b401ffb838683a475e7 100644 GIT binary patch literal 9966 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 diff --git a/etl/nifi/conf/flow.xml.gz b/etl/nifi/conf/flow.xml.gz index 021f4e38307e5278389b231d868187c718aabba7..03c72fb35d09376c2a4571d0fd6d6d6983fe6c84 100644 GIT binary patch literal 15490 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 delta 15531 zcmY+qb97(N7w;XL4IA6|#At)2jcr>^V>>6dZQHi(G`4M9x8L9MtaaD@XU@!-wf5|p zHGJ*2uWOfUG#;>$TWk-y_WQaTm*L6RxcETPUFV{ARi6-35SgD@gR$4um7j0*Na`rr zxN_n59Nqt?R?P_O)S%|+0=T#&+r^iy1BCz{kdNbBFi~c`y-x>2T)LI~5T6k-``jkn z5(Xc;Y22>20$XaH)9{(6>R8jk@=4xN`dK=8-)xxezUVC*)JY@2AD^{16irBin8JS# z0_p34|4yX>iGH#YMm;r3Z=R0@=JB(1?!t<~zmF=~q#5y;4#Hiuz3&XkOAfN72Ks3+ z4Szh50}(cfgcQdUL_~USV~;y>{_a?C`DA!h9Z*NOTMXofU3DmhML1ZM6-(VWyPzLFptHe$2XBsijU>E8enH0N6 zm*^6&v)mo{`6J#%&wWtA1_gm;>>VZuoRNWVz!v8eto7p~IbAJ_igk|l%b)t(0he<1 zt%y8hb*N$^4X-S}@S;tjQBxXD$kX)?hQ;>PER%9)$aD!X9$8e$?q#nLFY(yVyXFnb zyq<33U|CS=t_A_xl#xj{!Rqc_%(O(fY+qDP4!7QyDQ7=wB6Sq$p#!jkh8>1B ztb#|M>=%uhB6YS4oKTPQzH5?l6|z<9IxFazWv?{&$iL$cl%sWUkqO5NMED~E6dB3Z zq}ZNTJT%3-oT#hA^$CKA%Wq#~B)O*geGb`RJi;V<#0s(p)(*g4(OSLq0C$Mn0bg4R zyr~&{f}k#(CFUwDk(2@y3{K2JL7>d zcl?vCcvP|OTB5OHc)RvpfD~HD5O?Vj&xy*&XKEJFE1&;&gLzf8#;iB?mcKJBqkT{Q z!0vPp^Ch#)yaja^Ut>fpLz_fCaX`T>nN7TSVfqUvm--}=eY$-K#MIH*GF{p6d&iF0C6x=#@;H=|}+OIu&ut2PmyXk4S z^(^b08iTB0rJoI`l+Li9g%*yj4&u4KV-JQ1ieYCHRJj)09ak0 z-CP}TegfCh*JamyM$hL_))uSf%KnPuavrRh9e@XU{w5M;I~VL+3 zx{XY?O*b(mYpYkz*`eJ-ZvC7E|9dlR$gL?iN|02)GFe#-ikT=FIVJP9ScLF5gs6@n z90Ry44R-g9nEVfhNTZPGlploL=YLuWn;EUJ^_SI1XAzBZz95_6d-~T!%tO_m_B^1^ zaHjgMh?G?~PAlrI9+B2tN&=_kp}cOO;&~H)Q<0MUk{8#|~88QK2M~B(YgE zG+z&Itw6At7kJRN9pWM;86k(`7IQ1R{0WS(v zdTZA`>M8YxIECpSzpIvD;8HS8p#!|{Jj&jVxP1a3jyjjKR4tb8nq1LW278#FEdgto z-LF%f3r&|>>r>BfT<j+P)7h9Le7E zdv(KcUxXg&MTE)}#f8a?MjuR~by^fk2j_XkPbn(mfP8PUun1VC z(aSe^rRnnc8}Nd33qKY>+53_d!zKz=j<>K7 zRa{fsiGTc5I`Oz%e6#*=UQLged0#D}ehF8*qD$nD@F{aemyRI72)fgBT#X~I?bj+9m!s)wFpzm;q6u6X1F+(d@)~7@QQ})I zD2Nbs6<9aM-FryD=AkQItbXSlo=+x+b%fxoKeJKf7JBaT2EjoYr&Qp8w_bQJ9zKn% zL$#!K0b~5U8cm|&SqvkmQgc2%*PtdVTjV9|iMPsR9ZrHR?fiExgjOcGd(jYd>XsO+ zh`L%^W?L<22_*7e)AYb(u@DoF(1PFnCz9-EqPmJBsJ3E&Efhlhk9Z2*AV|T4e7YNc zY$<}&x<~D-VE>z!`A-JiFl><}$FFqF2WF}Hi@-CvOy}qMrS(|eRM-3cj}J(G047}f z^Hg{10>x-q_w%F3f|DTdY^p<-Z2-IC>b&%iv_5R%6u4cD94#s4Q{_)@r5>f^VSCSM zg?X6BFx)_Z6RlE$$u@scHa`|}{3jewAtWE31E0+M)QBS4BH9ZxQA=jOTHAYG{;`z% zhk1c&lUh#X%q2zI;LM2f&GvWkIbOUZM-KSX$pR_i#B;RS+tZ6M3Uzc|a* z=+U7>Z=8FUQRGR-E1&7Z$Y>)x_{f4ov+dvcdHCA_)(?G;cJ5b;@F*MiboJPMKACg2 zPA;z={f({Ns6*wYEAjDKFO%M2uo{K&X#?`yFQ}f#B{Nb5==O@q?9Y9A`q70$H3bLw zDVf>zqS)c?Zcc7%oAG6LzZ%GYt69IwBwM^krHvHm46D5(jm&RE=OX8iJPQA+i2dP? zUyEc4K=|6bwT+Wq*lYFZx(H(VL5%t$;#^;dq<8DX+7Z~mg8bnG`EyCOd|)jm{kwe( zS2@j0qY*>VZY>a#iQ)@8uAsV?oP3ZO>CSD(FnV>=&&oIlrWbOm99d@^kIa#!9SC1$ za;ggaEF_M~#<8`Vl5wtC`oWFCzF-z>kwVx2f+XFX^ sI`fza2}{U;QA0tVuZ5L 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 positive credits + // type_id = 4 (Credit Reduction) => negative credits + def adjustedCredits = (credit_trade_type_id == 4) ? -number_of_credits : number_of_credits + + // Create a standalone transaction for this credit trade + def transactionId = insertTransactionForReport( + statements.insertTransactionStmt, + organization_id, + adjustedCredits, + "Adjustment", + createUser, + ct_create_timestamp, + trade_effective_date + ) + totalTransactionsInserted++ + + log.warn("Created standalone transaction ${transactionId} for credit_trade_id ${credit_trade_id} (no associated compliance report)") + } + + unassocRs.close() + unassociatedTradesStmt.close() + + // Commit changes for the newly created transactions destinationConn.commit() + log.warn("Inserted ${totalInserted} compliance reports (from earlier processing), ${totalHistoryInserted} history records, and ${totalTransactionsInserted} transactions into LCFS, including standalone transactions for unassociated credit trades.") + // Re-enable and refresh the materialized views stmt = destinationConn.createStatement() stmt.execute(""" diff --git a/etl/nifi_scripts/credit_validation.groovy b/etl/nifi_scripts/credit_validation.groovy new file mode 100644 index 000000000..31289e22f --- /dev/null +++ b/etl/nifi_scripts/credit_validation.groovy @@ -0,0 +1,143 @@ +import java.sql.Connection +import java.sql.PreparedStatement +import java.sql.ResultSet + +/* +This NiFi Groovy script: +1. Fetches all credit trades from the TFRS database with status_id = 7. +2. Sums the credit balances for each organization based on credit_trade_type logic: + - Sell (type_id = 1): initiator loses credits, respondent gains credits + - Buy (type_id = 2): initiator gains credits, respondent loses credits + - Credit Validation (type_id = 3): respondent_id gains credits + - Credit Reduction (type_id = 4): respondent_id loses credits + - Part 3 Award (type_id = 5): respondent_id gains credits + (Ignore type_id = 6 for now as instructed) + +3. Fetches LCFS transactions and sums them per organization. +4. Prints out organizations where TFRS balance differs from LCFS balance, along with the discrepancy. +5. Logs how many organizations have discrepancies and how many have matching balances. +*/ + +log.warn("******* STARTING CREDIT VALIDATION *******") + +// NiFi DBCP Controller Services +def sourceDbcpService = context.controllerServiceLookup.getControllerService('3245b078-0192-1000-ffff-ffffba20c1eb') +def destinationDbcpService = context.controllerServiceLookup.getControllerService('3244bf63-0192-1000-ffff-ffffc8ec6d93') + +Connection sourceConn = null +Connection destinationConn = null + +try { + + sourceConn = sourceDbcpService.getConnection() + destinationConn = destinationDbcpService.getConnection() + + // Query TFRS for all credit trades with status_id = 7 + def TFRS_QUERY = """ + SELECT ct.id AS credit_trade_id, + ct.type_id, + ct.initiator_id, + ct.respondent_id, + ct.number_of_credits + FROM credit_trade ct + WHERE ct.status_id = 7 + """ + + PreparedStatement tfrsStmt = sourceConn.prepareStatement(TFRS_QUERY) + ResultSet tfrsRs = tfrsStmt.executeQuery() + + // Map for TFRS balances: org_id -> credits + def tfrsBalances = [:].withDefault {0} + + while (tfrsRs.next()) { + def typeId = tfrsRs.getInt("type_id") + def initiator = tfrsRs.getInt("initiator_id") + def respondent = tfrsRs.getInt("respondent_id") + def credits = tfrsRs.getInt("number_of_credits") + + // Apply logic based on type_id + switch(typeId) { + case 1: // Sell + tfrsBalances[initiator] = tfrsBalances[initiator] - credits + tfrsBalances[respondent] = tfrsBalances[respondent] + credits + break + case 2: // Buy + tfrsBalances[initiator] = tfrsBalances[initiator] + credits + tfrsBalances[respondent] = tfrsBalances[respondent] - credits + break + case 3: // Credit Validation + tfrsBalances[respondent] = tfrsBalances[respondent] + credits + break + case 4: // Credit Reduction + tfrsBalances[respondent] = tfrsBalances[respondent] - credits + break + case 5: // Part 3 Award + tfrsBalances[respondent] = tfrsBalances[respondent] + credits + break + // type_id = 6 (Admin Adjustment) not considered per requirement + } + } + + tfrsRs.close() + tfrsStmt.close() + + // Query LCFS for all transactions and sum by org + def LCFS_QUERY = """ + SELECT organization_id, SUM(compliance_units) AS total_units + FROM transaction + WHERE transaction_action = 'Adjustment' + GROUP BY organization_id + """ + + PreparedStatement lcfsStmt = destinationConn.prepareStatement(LCFS_QUERY) + ResultSet lcfsRs = lcfsStmt.executeQuery() + + def lcfsBalances = [:].withDefault {0} + + while (lcfsRs.next()) { + def orgId = lcfsRs.getInt("organization_id") + def totalUnits = lcfsRs.getInt("total_units") + lcfsBalances[orgId] = totalUnits + } + + lcfsRs.close() + lcfsStmt.close() + + // Compare balances + def allOrgs = (tfrsBalances.keySet() + lcfsBalances.keySet()).unique() + def discrepancies = [] + allOrgs.each { orgId -> + def tfrsVal = tfrsBalances[orgId] + def lcfsVal = lcfsBalances[orgId] + if (tfrsVal != lcfsVal) { + def diff = tfrsVal - lcfsVal + discrepancies << [orgId: orgId, tfrs: tfrsVal, lcfs: lcfsVal, difference: diff] + } + } + + // Print out discrepancies + if (discrepancies) { + log.warn("******** Organizations with balance discrepancies between TFRS and LCFS: ********") + discrepancies.each { d -> + log.warn("OrgID: ${d.orgId}, TFRS: ${d.tfrs}, LCFS: ${d.lcfs}, Difference (TFRS-LCFS): ${d.difference}") + } + } else { + log.warn("No discrepancies found. Balances match for all organizations.") + } + + // Log counts + def discrepancyCount = discrepancies.size() + def totalOrgs = allOrgs.size() + def matchingCount = totalOrgs - discrepancyCount + + log.warn("Number of organizations with discrepancies: ${discrepancyCount}") + log.warn("Number of organizations with matching balances: ${matchingCount}") + log.warn("Total organizations considered: ${totalOrgs}") + +} catch (Exception e) { + log.error("Error while validating organization balances", e) +} finally { + log.warn("**** FINISHED CREDIT VALIDATION ****") + if (sourceConn != null) sourceConn.close() + if (destinationConn != null) destinationConn.close() +}