From 5dd7f61cd08ad1120a53d3809626ed431092c1e3 Mon Sep 17 00:00:00 2001 From: Potenz Date: Tue, 15 Jul 2025 08:49:07 +0530 Subject: [PATCH] selenium eligibility done till now --- .../src/pages/insurance-eligibility-page.tsx | 15 +- apps/SeleniumService/agent.py | 2 +- .../MassDHP_Member_Eligibility_1497211726.pdf | 615 ++++++++++++++++++ .../selenium_claimSubmitWorker.py | 1 - .../selenium_eligibilityCheckWorker.py | 286 ++------ 5 files changed, 677 insertions(+), 242 deletions(-) create mode 100644 apps/SeleniumService/seleniumDownloads/MassDHP_Member_Eligibility_1497211726.pdf diff --git a/apps/Frontend/src/pages/insurance-eligibility-page.tsx b/apps/Frontend/src/pages/insurance-eligibility-page.tsx index 4b6d824..01ddfa4 100644 --- a/apps/Frontend/src/pages/insurance-eligibility-page.tsx +++ b/apps/Frontend/src/pages/insurance-eligibility-page.tsx @@ -80,8 +80,6 @@ export default function InsuranceEligibilityPage() { setLastName(selectedPatient.lastName ?? ""); const dob = selectedPatient.dateOfBirth - ? new Date(selectedPatient.dateOfBirth) - : undefined; setDateOfBirth(dob); } else { setMemberId(""); @@ -168,7 +166,10 @@ export default function InsuranceEligibilityPage() { // handle selenium const handleSelenium = async () => { - const data = {memberId, dateOfBirth, insuranceSiteKey: "MH", }; + + const formattedDob = dateOfBirth ? format(dateOfBirth, "yyyy-MM-dd") : ""; + + const data = {memberId, dateOfBirth: formattedDob, insuranceSiteKey: "MH", }; try { dispatch( setTaskStatus({ @@ -181,13 +182,13 @@ export default function InsuranceEligibilityPage() { "/api/insuranceEligibility/check", { data: JSON.stringify(data) } ); - const result1 = await response.json(); - if (result1.error) throw new Error(result1.error); + const result = await response.json(); + if (result.error) throw new Error(result.error); dispatch( setTaskStatus({ - status: "pending", - message: "Submitted to Selenium. Awaiting PDF...", + status: "success", + message: "Submitted to Selenium.", }) ); diff --git a/apps/SeleniumService/agent.py b/apps/SeleniumService/agent.py index 8570dbc..4e0093e 100644 --- a/apps/SeleniumService/agent.py +++ b/apps/SeleniumService/agent.py @@ -65,9 +65,9 @@ async def start_workflow(request: Request): waiting_jobs -= 1 active_jobs += 1 try: - print(data) bot = AutomationMassHealthEligibilityCheck(data) result = bot.main_workflow("https://providers.massdhp.com/providers_login.asp") + print(result) if result.get("status") != "success": return {"status": "error", "message": result.get("message")} diff --git a/apps/SeleniumService/seleniumDownloads/MassDHP_Member_Eligibility_1497211726.pdf b/apps/SeleniumService/seleniumDownloads/MassDHP_Member_Eligibility_1497211726.pdf new file mode 100644 index 0000000..398d463 --- /dev/null +++ b/apps/SeleniumService/seleniumDownloads/MassDHP_Member_Eligibility_1497211726.pdf @@ -0,0 +1,615 @@ +%PDF-1.3 +%쏢 +1 0 obj +<> +endobj + +2 0 obj +<> +endobj + +3 0 obj +<> +endobj + +4 0 obj +<> +endobj + +5 0 obj +<> +endobj + +6 0 obj +<> +endobj + +7 0 obj +<> +endobj + +8 0 obj +<> +stream +x `?\;3n6لl #""d%} 4g}R+T[Bj-Ѣ|-ylnv晙wfys;A!dFCܵk"^.BU V.\>iO!ɂY_lYZEnv8aϰ]huEV̝s$Ln]>gJ{z(r ~!V؏ "?G>r3.}F5zmË6 +z} +yHxGhLs;_s=8:e/C7ȃ}эVm8V24MB+Нx\j4 }ߌq*fݛ{ +=qu#\})1gθ=>w$ܥJBsiB PGG!Gb^ύ<CJEa0+7>wyh|}rON!?Acy:o!.۽! -&@+Apdz1sBP:!)\{4j,yѹ8kD"} +( +;-~{BrO/ĒG9+H߄##lc1#ywx+rt'z;<_x?c32L#KW"{SFo6ɀ PУdQ|?Dc +:ހOr ?_sW$A%eUGr?8/W%\­Zmw7W>sucs‹«)Qn2![Keoޟݙ + j?KmGoc.xluВӬ?:$܏ $'md twYNdƹjb.pps-c w9—e|OGOOY›'E\.nIJRZ[#cjtF{QmFq]ߐgyxH% adNqhc ƍcT Я&`³NT +QA;1"p_r&zKO{I,7 P20EGO6|=MF!d9g 8_0 o@`of> = ]Gg+Wբ,;w"?O׈1'-8=,~ECW{ jϟEף-]#"PH\ UfLܽpn<r.xA/))N#]h` uNA3sϠr U{Q_rϡO9|k:s Qat/  ]} 6.h*jm]!t%p wg'JxܳRlArDt=- h>^)5bhZWoo6f+ 9o]zUW-_tE ̿2=i' O6_xAӰClп_ߚDuxEy,) qfl1$Q9QͨH&ޚK.Kcs`ǜݻL&ʊEzLB*K& %iBM}k"b̑H9ywD2'=[ QE##vQǨ֑peDl|K")V 1#wTT&9*㏍5pL #P. ]ٚP͙5#i'#3kz636 r|#tcS$uQlikbtkhfhıS#p7rkˌ nOBJQtOH(cI+tM#\$>BQi3bLs02gdh uLf?>ҷffvՖ'_8(VRcZ 2Ɍ<?uӂ<m(OZ,/G=s{ +_'q$j +i)B=o."Cm FiѕDWF} }; DDK##Hqpzk ܉Θ?qZ44=cN9#25߶cҏ)S\)QBa1C'2PLJGFgKe%?ԕ;Eb MkW* u촙^j Wx4mF42"gV_Wk fd#h+٫`0OohtcsrW"ZcyڱrT;ћ[}kbHGǼ$;0#%31\Ec3ó@tюm$m4In6c'dDE-;،}l/{Nh,IL|p_vvg;.>]Dߧ7%GFi}z|i4bؘ6#i4hk'eaB܌;S.ܾcX2]iJd; Xх~Oy3gJ\D?TB%y &31v*  ZG̎ҧˤbDag,i vC-ƠUfKzׄJ-+`gSSv ):nn0nwgtXw B1v xfJMk]j fi. (/E1t`kF̓Jw tV42QpQ!H;aoۑY{sQas4RO,e%̲DC)e'_Lv.δϝU}3fn v\ +;"3[*j9͝V)sU%A&`Qp!8I֖H+<;,)6ʍIL9S\D-@-3?Fk]o}ZGjȠ`GG 0U CW23Zv a7_79uՂb(B*X[B]Is;ݘnM@K;`4*>>7 +r-EFGXW 4 +hA83;RE"62#"3("? )3^'TMliy?4:L?  +6X8N< ۗ 9$qHBu|\CI'Hq&Q8NC%3MMM㻛P3yX G dGC:"!pZd*44!ski #!4 BYMNڥǬW N"ǽdfztڙpf Nw!'׋|3nX'oklwֲ)UJ#fLdyðDqWX"42o:m6FTUF#iXtJ/9N;56Qsg *㣑 8( g??=;ٯ&Z7#Ȃz@(vI8܄, $Nx[ʏ?u;>}\;٤AѥvR>%S]k=XvRAtY] ȑ;s. ]d Y%YɑxHrIF\ppq9­Egk n{5iOjzon%ki&H36Ս1~~Kv_Yܧ]8H+YZD7(a^pUk}PElG +݃<KC#8O̞y++J'2e^R{(tI.s^Dno*%GF9ǹ/NsrO .sKkĵMگ}ww?* rF27HE*N&)js2ka<'͹{S-vEQp3eʲNT])j6pR+E{FQdEz=)%?IXR2|StJIN)FZ)?v.SU>eH4'(5Ǡ:.*NS_7Ȯce8}[\sђ{=~߰4yff^_‹/ov9[)vY +OnAX(4J2⒪a)#n͒W_1J2ͺTgqvA'O+^' [4( +B)Ii +85uvMc{Db0Q,R)j h)d I*d6YAno?)GI x$e FqVǺ˳lBZğN! k3 ~҂8 +v$eDq{]y7IRh|0jР L9S Dx`xᯞ{躛3<۶ o{ß,XG:Gbی>uۜT$&"-!}Iڿ”e +l>1jSla;}BB5*>?/2aDSZ*A9A埄9Q;?QGU~2 7ųL[ZƵQp|ZȊj%  ? v*'O!?Y4C G.EjzvdED|"Rq;ŵ8>ׅ!`JͰ ߛW$W^N :8e#(tSp*p˜)ٽf ڻBnCT]m=UmVT; PmP% .($Dx7nq.kś]/~ ݴ%ٻ?}mܴqףdso7~: P(PEEAޙRż M"[ B0th悶1ɔ/l2&SL^5 B0 c) ekEǍSsYH9IȜPUx񜊈wÑI y(ް]d^A$KJ,6#dƕ NR, GJ[l򨬺HpLzm›AmNSФИL⭱qSf1 WWG#wr}#WַKJ%ZP&Rr>QI62mْך>(ܣfSIW.H Uu=:1;g[O~kفxܞ>}$}KA P7*<zUb JT]bet]CZU͈CVK9m<V$ ̄fTQG09*LMrl:)h2;}紸NVtYm*ȹ:i +^Ֆt|5x6 vZ!lmvvkgc2^#>CD@dA!;OeYzy XAҤAdVXav '9&רdk`h!RV7x.n[gnH9@s\f YK74g@!K[8>eCnܶUE;{aӚ;Okw~=^ʮ=E8=F $@łmjvQiTS݅vWOE~*SZc0@TKmnmK Ȩ!Ӆ 1y]'jwwF/5Xz)Ew% ++vRWLaB`X$e^ΖnZ0AWÔK +LeLhRyMD_2dS]]EXՌY>J2?mtxׄUO=qݵ/SKۚ:Nހ?/t=Ks@_zg` aGL +L ͊행̪HfZm;MfX7oxv:4 hvBM[`Y+0|ED(9p7gOd6ߗuduiT?pPZt*(G7dz~hX5L> Rb Qֱ %A3fQ+WVhq7';AuBc/hTD+r=lߟ|gw'y>fp/\\?~񌉟P>/x=&RVށ:f~i|Q5CAaRN["|'^;B(*(*(նd #f#.|Og`}>#[0E*7 +ʍJjGI7qoka}S0i֔Ԋ)ev";#Z}"L*z' _ Z bbQ&"Ȣ yg0qAhKV.;ʡ/.tg{esƥn}ۆ2usnY.%[p`CwO[tͳn|nϴs(FdfOLa\ +ڽ %UL/hggxgIUaWhV1sU.N(7mÉtu4>e!PTs)Y%;r֭joxh`'sYl̳<0vm=𜈜8/<'DljWMۓtmIo[:E/5Oi܈rrL\TNC֖kw5 + *V \`Oډ}K +s@G@`[rFĈhy٪+@hQ4aqusB2j>X#"qf_ͳ~' ƒ,sK}k牗'o>f_8]{ոRb?ٿe~W9fP}|9DL&k"o!M`v#BccmTHC# o2az7}GZ9#pc~ $XM;O[GP'3w +I0'!OJыkQptLƉ4h֦'6p>W:(LE@o$V#Gt?@qo 9p3nڕ]-FHhOZBVAk:7ExgÂ` +EV&Ȥ|$X-'J͗)<|IyrHP(XۚM:*vH?~k'Os6N6oj'PM|l&aÛ} ،q^)N=qT^''v1hV͒j)LS}c0U{*I&9 J&$x/}e '=.ÉA+,|P{,(JБjl}?zn*yq -kVO#fw{0j&l˾%w2{s 0gN:L\2:- +aI.22I. M.X"*TL +:ވ03TS]|7[zߑdOLLj Ff)H-9 \[۲/emm2?&tݤ_arbW^/@a„crਛ1WVB{y hWS`mFHbQ>>k-fY]ȪJ\Ybt@%RX X,)s/%Xk3XR_@¶>xH#H|, +!NTZ;^7UXO-".gD2"C2eEr4+`P+z/,/ZYj2_ۻL4;N5+klXa%<^Fӻ\`;7,;{lu“ƷGܳW {n8u!i~ wj>|ū;voxcߴ퀑@Qu+G$x -[-,""@2􂂩 +& +S$t$̌]i  tU"8 :H>P1dRfi"yɳcDuڪTa-DdQ:`,ݩ1]˄$s@&e0&p(_6؛4_ OJξj(~<;O +0hsObCx~ ojޕOACQAѕD9?X<'U5zk,eW}__Wױ +}]׾Rj a]~}7ڊ2EI4 }N!['Co|>g_}v& 'w[ֈY3vni[]p!3 +>.$F[WELjhg={ΘdP<[" qu^t.G!Y q*L?h'8)jYlD1B`ALVD-2ܩ⠇™&&lE&3"}>Y$3d c<^x4B|v!CH$~AFf^:VdK-yDCR jx De7XX 6JVИlt^"H +9FRI!.vYD݉ӵIԤ?LeHGZFDl& FWДeW5Zuuj`jTY'H)i^d#0e2|)l(-O:dnhIaKT2$D$3yB̒@ݞ+[Hr DQ0DPPp鈌#$U^)˂l*yVpD׳*T{yUWşeX$OM /֭:Dظg`Qhbo0E`$t hJd]Tg9{@$3XduIOqY%@)wEFr%zH +gBX0 +_c9Y@F@Lvݧ-*~LۗXmrr/+a 29zYߛ,+创q$kb5&-/VO'GLH_jN5]-9UsV]G_z7m15^w6 ORPaU@]f[ل}^N1 =F@Em2m %{꘿glwK|㬛*~=CeFQlŎA LKy3K5Ė+Y +,% ѕx#S*tA˯m5㮒~k5=DХ*:5[-Pu>~j@%F6n#HEtЬYg6{ܡH!zQ٬p/px- $0xӑ\y|g/^&a}}hU=y%ݰXrdY0cfbJmPc(ezƴdGh‟5j\+_A\wԱK~m 'psxֽo3#C7>N:uo>.wW]7:[wK*'\mn8PGA} $ +7\Y+P pñx h]ٰ\IL( &I9"2' +`@ OzP_a&#xn+,.I*}einѪ\ja. s} JXO.j "G I5-pAmzÐxcOzͮǏ "Ӥ~ |tq09Ut f8.`܋oW`NX_f16`W}9LaJ`QgὌXYy|^u_IeM^6 +m۞<87ڍ~z?hWyEGZI ~r[wm|b}Ҫa^}tϩ'tt{)"W2шHk@4b3-0 ב]}pf`4%e&My!!lHtiC2t='46K9|q;I1׺|.gu۶m' mVv+@=ZyXV(=[ԓ+΃9<ܙOn=_;[C_uݦ/ݶ7e2aܧ>MZL- _cr|,qRkE"/"/'$(E<:>.p'EN4sTDz^.B,*EIp;PX/iVSv x7\AܔnBCg 4<>Wgt't֭NPyA&e&:bl dhT٤~?5.wZ;3o6Z77aj'"UeL_Ntoe3zݭ ~8:iEW{rn|vwuڦ>C + ʘmZcV~5PGnTVN%>{~x^uWl$PhTFzph;e<'#a )U-%jƚ1%5)SKbiqbI? +o]gE'Tkmm}̚ +Y[rJ~ICfey^VYy^NY!E^-!k,sB*< Ui qr9z8MϻIr + vrF?tH,47Z=3j@ +2\V&鼛H|{\h^n`lwy->XCCdk#n\wzqɈx+|eZC4iOՖ"I,eL9qf|g&βNEljVfóaq@8pDKH*4azGOQ=˴`P'_HZ.7DJ0(5۷dW_2p qn$0I3{W^1nEOKn>['lಪ +U}/hi169~N!V5'^iLHC%:,(ra0JK3,T(tK8i + Miu-"ĴL]dsUP{;o%JV/4ے8$a~ɿHP0$JYe@c,B2I,+?&cMNʭrc2Yٗ16VQem+l785gKP-h+Bfdɨ!:4oV-e+) "?],Cr,qҚ]d8o5\ӎ~~߫>}۟Koy Oݲ.|wQ\-/aa~r4 C=8\o!Z6#Uak`22255ZCJ~W޿?aSZP1:6@eԏusO>Éhx덟[n 9 0yKQ MZH +|kxr +JBl=LXZ's!g|`NzVz8OȶE۪M!(ZPu2>'1Zv])oRӪ1WF61^\YݐQ(cKR\9`{R>IB3zZ+ ^ T2ûtbaiBUm:·a ͌/́||>TT;h8Q/<c2 i54 ̋7K7d$ξ"]צۊD%E4eD5_<v؊fyʐ)lWeپoE`. +}e6?_j +Uji'JJL*B& Ddy̅]9Y{S$ߓio>{PWG]4Da $A +"(W1߼ +%Tп·]̮b&]l%z?(:-p }N& iݣhY..%^fv]16UqOehZ_lLtr);{yY!uSF==mi?nry:]}r]UW\'rIwAKѮ4C^$m0va-5[kAA}kFˣLNXۧϢ_ƾ{= +9%fhԟ9 듚 +,B㮯)~E,p)Kw̋5om5Ћdz B^-eZpe{е-Eg浐W"u6O%]cd< WlGmr6l6!VlyM/ecb!Z#}κi&?Q&JSbBdiGb8glIa0C%-wW@ngN+zQ Ar^J}&[ށvϾ[]|V6SW΃>3O[C\m׮{nF`rEݼ3wx|st݋\o/^'h֫ Z IWQ~g^dW.N$lQz3JöIV +s~PCΌ3$KhbKQ,9w-gf>-1P?si24>eL) 2SҳՓ<  |* w,Lu>x6eҌ7r!"L|Np_f +szh 3EdO7 $ +.zh .{3 $ j"/̃h?O4o1o5ġO%d.54Ȝ3[JI<"w w(wF Qx'`83Z)MP1ӨŽ`6V5)6] NOp/oD:P"Mѣ|&7^ EKa{- ~Og~ܛXw7wtU]q?b +6r/r eW&Pm/KZ8TD@]R4'3TD@%E"D+Ev)b(EDn2fxYm~~/)33!M- + _[*V +7`bv>棳槻q; +;a޺¼u66`7z|.3}'=& US-Adw +dw +];S ެD +g­ R3n3Tg,oR +| aF#MA/sKFE_ה tTfh yE^+zqocL2(̚.G'?D*DzdxƆUq9.m(T#"1i,жXݠn,%3'ܹL :c {fC*~%k(G_uuΘ7nP>~߄Wؿ}Ow%ɲC{sݺIa̫p +$i]߸O3Ntek4v/#&qEjQf-|kd >f&3;Mfv\d&2VYi|Pߒ3 +ef + >*_f򑕾q1117g:|joj"SCIǷM ^*G7N3ׁ>eNon,]ÎNi[\j8 %AN",mzZY:^Y>Q+]߽lj{>Jjd3Т"?Qq7:X/O)?;,~bSJl1-L PP@(mcgo0^d谤 YedPB)1 ,IKG"O$_~[S'6̫@H+Tz -]O lI[ƇY+bc.[!ec. u٘!łLڃ-^,Dcox;M˿3dUJ*g$̒zt$0V>U2Xw1xUT؞OU~`ٯV}/۞莾n3^dv11 aikg:;v/^ש]s+B5@\&: 5h&괛Uę̄,NRw[yqswh6>v@/ 쫊XP^/IˋX]VDGH\\eC͗G旭7e5ryy+tB:l22ϲ̒g)%%%%eהּ>gZZyyUkbkhyDꁚ?ey^y]_=U3Wf1(7*}F %bQn%t#8TYX@$~%j/װaY_K+R~`< a Y\6Y U' #s"XCN_C= %~z?Bd-?VGuI.y.8pݡcոޚ^ژQmjM@0:}W:nh;TGH,G>;dѻ2%h )V2T=-g I_zH_OMS~)AqC;#qr#5-hE.I}ocyi4 +C6n'+c&nS25D*)`3jQYLUL},A\Ui >J` V'6l؀d7ܥ{v`9ExI?d .a[*z9ǮW# N&:|d)6мvu kM>׿<ӞQV/^ ů]=|Ah#/*lp5UK[2kXi)~.{ UykR-<*ɽ^CKEXD[L8Z>,ݏVT G3'l9٦/_gfC $!$fAr! Q)2(XQdP(ʤ"0Z-J[WJ\E[ErosF>{:{kst~ ԷD4\&CJX>1}aC7X;°CBд_.b֤„Mt{}b-,ʔzlc,cm3>ΓkW߁r*C7J'4#A'{bӦ%B :ۛ+K/x= ۷]7m<锧#ǓI"* ǭ4q7WTJQR\WNB|*0:QwbW +e6.wU%\;20ۘ6p~1ߵKR?.JQQR"o@Ij/ٵȵByyCCߝzTCCS7ZutK=V^[xj.U`x tl(IRbARy4ܓ$H>$?ZV47OXVN?Kupi =>DUF,{ɡ~2@fj~.HJNMJJvb+IH2%#$QtIʗ$jpaOhG繓>DŽ<~Ͼ&M +߳ۥR.YL, +H>+&+ ŗG ij rq7F/݌ȋhIĐy Qgo( x3ۨo[Βo=kR\FȺ8CXr@4\L=w[GJ$ψN77xBjϺ9l#Л:[SߖvyڹObvH)N~Lܮ/ٱi۞ڿb A3+~{H~|o_cuo9ě9-9lD9/_F->I#1?8+NVUh'ի$(YހPB81k}oVIqٙ|LIoee&wQXN +{eos7_Dw =)3.]b='?O( + JTT Lv~SҭRoK[ti`iʽ+<^NAIg|_y1IOIQ{7+,`K +&^o#zIVjJJA +7C It΀r}rI\9Q.ESᄲ@8 O + ȁF|WjCr<|KY89qX2j Msvq`{ۚ|nM>+ϙmyƻnI}-գoAMLҕ"[^LsoGSFtm>+?r{GP'AW5 6ZX/- Fn@܍i g/0ȶ.FqwqZq=#h Mpi6O<h2OR-Hi(K>J ?Q|tC~,m +8a+KQx2b~:+ŸY1˗T-8EY:eHs,g4*}F1C4ml Aߵ>0{i6s07p7Ϣ-n̩&{>m̥V8%8֕i!oyt[Bwjk1DgR˿s 2w3b㣝{%nxqCR(Uii0怈5I4c!oz NJ=]ǭN8?_UbQC=fcml#K'fltP?c 2uYW= z'W_g K-C}aIpv-D`j,ӺFYOB)`F`0~W+c3 xO!4Ў@ +@ GYߗBgzz{{S?[k [Q6jLB頋^|ǡϦhc3)Yf]g?T߄rRʺ3믬; +V 4Q1h*UȱlZng + c,6_\rKCҙzmaNOo̩6&Bz̈(Zst<;w?*eas7#V/=GhߒCz%?܏=Gɦb-ͺSqom4 EdF+swRT +YL{=elQm~zHocjK˷ m&C\*`+0k^C2f]^/WEڝ~<~/dqӳlz G43m"a[O S5H( 0;il2Bl/1md ̃0y@cŞl_Omȩ-S<_'vO +LưEy_,f2^<ieZJ;~r Z' X쯌qUcc[fvĦi?sN 7.c{LtN:W%/ʲc`jW_iζ{ΰ"s~~"Pϱɮ=JWc┅v9s!]M'l}~۠R*E;$k017w\z ˔,ۣ؟c00Nc<>*znoPHf'1tTs o RhalTݺH [nSVa`lD{.m#;_Rk|e}u!W/-Pޥ<MQ4!UJBSg#O{oUξe+^.cC( mw+ˍ޴Cc#埢r*75 Q|1@kl TaKcLKbpócp@xyqxDž c@=.oX wԯ*P;Q@z@>a֦A۞? cm~`k>&TYn25bOh:kȝrGX,N۴*[.JyWb_D,{wo]nUG7Z(5THՌ.]/vϼj 8dd"թF?˄}z!ߣ Bޙ}}TO$2\&߯MDO+}8iꋔOBx -2ț6ʽt9 *ŞB=ۄCT1ڋ5mRNboxg4P@t}.G(c?an.EGQ!Rk +s/fVcmno1V>7>N:Cl6Zq8홷GjlACBz}j9yE=mh!@wXZwXTLSk+:z5z^eȹh9fj?l[Cs5SS4}BDz>Dٜ@ 1 3 Øs6l=D:|sOlc(UO\ud`&uy.N@`'m4N; x:;o/G>P>Xgi6R (c%*)OyHs`֦ ouhvF5>_,3Y$Xx$t[廇Zle ]_u>s6a߯ͧJSm hwBP=6Xc~.o碁mXo{z9W4eaĚ~&e)>oRW39O/a/HؗfCIAqęgX/RІ/F  +A6\=t2w#`ܙ^xoPTam!kK-}ASOE~V#"JeMUʑX))(4ۭBkٮ='9LJeh n#N ?4 莾~^?5e{.'<.3WR+"}8tC%>O,1_ul~o8T8K/aEGo?@N^X`VCC1?$CYuA|'0K+mzXA.2g9@2u g&"^HEugɆy +uztp̩K,D=;)m n :k^Fm2ܶv>ݣ!{Ns?D6>}a n~nUG#Hv^g] :36.PGF[\/Ɯo ~ g[#;18M P_2a_nḰ1n +[V>0#1(n@G}GV@G>Lm y6cT ^^=OO{7=cLg++!Cj>qZf=m4?Vb}} /u=f!IõP/k>= B;+[͵r1sKst7SУ \Kƚp`+5ш cXߥqyq^'g ߰>gX羍>†M\|t*Gm|n3~Ǖ)ie/ȉT~-p8uo*ޅ8-utط(rୠ= +qy^sS| +lU e{ƋZ+C+up`fz٦<۱ _o$ -Coscx#ڂϯ~O[֬/4'1l؅1Y瀚_ +,E4 q漦kw/as~͐+ǁO%W^!J mxl7,%jNiOXhn'j0KwKy.Zv ]Gsww#<|рۈ".K%K D#iGL@LhR!hkϵ=f lWDsBa~MGqGqGqGqGqGqGqGqGqGqGqGqGqGqGqGqGqC"\N} $´H>%䭣OP:? Rt@ҡ^olT +3_Pq@V +R)ÍJۆ@ZEJEky`/$%>\j-^0wC<`5p(P׿YxA'PP AÀIj@8dp'\ +tE3a֜RNRxU[lE؊֥ܩܢ:Z4PPZԓTLGůUC^I QҨ +{$EV$JAs"'K{dS>I +?ȟ5$KW"K["Bwǹq-V{׀.ǿ?;;ߦ 'C~W po+| Uc}ޥv lGF6=8= ڣ~UiS_YwfQ~!T\ӿ:2j:J~Bp`2p=uT <p> $~@(Q~\|)g)\|).R8&R8u\|)0 . .=͖BhJ7n&U*me}h;kwK/H#uR4.T{T[,JyRmX#BSJmgy{3ڃRRmT[(HRmHn[*AWnm o SˆjcEcڦCtq< Hݰ `d?2ZL' *zq-ʀII@9 4ϮQ1t]a*ǿ6Znn)JfLFiFo 3zFG4Z9F+].]Kv+<.&t`cHnW%גK!TTUʥ}SPW6J괶R]F*j4̑u=W*IT#N^(A sE_,ieՔ~SYfYwey.kq_YVu˫FqcR6M8~]ߙTߥ0Õ~UXBwυYQȕg{܊Wn* +nO8֚[EՈ858 @I"ZSODE\Eʦ\%WQ6G)r(IZq;q#NV^\,52q&0 \wM32j N:p5Sf0zZ]uiuSVxv[iN O3 wyVYF6< ̺qY{vO=eH[]T^}D6  :P]6PBqu]b$o]| Co%#kʼOT<ƚ)s + 4FnpZ\s?Pf>QU]QUue#&j̏Tw0gvB(֗n;M/QP+iy|VFː'Y'N5xXq]\L̿vm1ߦVJ$q$ǍUi"[ќOVz(%sgЋ@/--UJ " ]= W\$ +endstream +endobj + +9 0 obj +<> +stream +begincmap +/CIDSystemInfo +<< /Registry (Adobe) + /Ordering (UCS) + /Supplement 0 +>> def +/CMapName /Adobe-Identity-UCS def +/CMapType 2 def +1 begincodespacerange +<0003> <005c> +endcodespacerange +13 beginbfrange +<0003> <0003> <0020> +<000b> <000c> <0028> +<000f> <001d> <002c> +<0021> <0021> <003e> +<0024> <0028> <0041> +<002a> <002c> <0047> +<002f> <0031> <004c> +<0033> <0033> <0050> +<0035> <0037> <0052> +<003c> <003c> <0059> +<0044> <004c> <0061> +<004f> <005a> <006c> +<005c> <005c> <0079> +endbfrange +endcmap +CMapName currentdict /CMap defineresource pop + +endstream +endobj + +10 0 obj +<> +stream +}θ@@ +endstream +endobj + +11 0 obj +<> +/Font <> +>> +>> +endobj + +12 0 obj +<> +stream +xWY0 )tfD-O ܠP`Pt~zJ4)K ٴD@^$3lĵ~U=MTwe\׏h CY5˓̔5sype=?h%y(:8YG}vӓ]I ϐ, pwQ(fKcH$t2xA"0 >`BPY5u>oji'Rۯ32gQ+RQhiMhl砽thNb\DC{ɼ>SJyAwBYv}Qg +eKe{2> +stream +x]XTW&n1XvɮI6lI6!ņ"һCw 3"U"Hˌ~ϑg9s{߹瞹y5Xc5Xc5Xc5Xc5Xc5Xc5Xc5Xc5Xc5Xc5Xcٱђs{f-*lhdվF^&&5!+ll2CJigbyDApIXed2yD}ll72*-R8-&6^Q) -XPG7瓜,f>VܖZ^[P\TRZV{rw[wO^(k}W]60xmph`hdpxC!! G$]64|Ém4 WMM#ȋ.6!.1>-!˝Q㛒VQY][-L(D',ͮjȩn,k.o)mV5׶vԵ]W{u}C#7fmg 3cp1f3kݦa(cK$P,"'E$A'"GtG!A( %  +3毨w p@$ :6&>6)>Å隐噘㕔㛜',N/ +(.+WK KkR겫º撆 ສN*讳, o#8bQp1.C\ldJ1^˯9>'.T,B164 +6$1șKL@YC ^OCơ(+ +89M\gpez$f$垡\V[ +왐$R`a&pe]:K/_~}:UA] ދzx42Pd(B I贺qqjʼn *@PҢ+׮;g` ưSE3EK !V5(wRl2׬{.BlB|R,m>qm~1c8Ŧַ=ļ1<2Uf. Sb՟wغA!E^}H -B!`^IC?QxQ/( ( + APmlj`zaZy}ySk{w?I|3>B/wy4P8?q53[ݡyD@"&\K{Wol;s- "j⒕/qi n )xrR5fgw3/>m~M5W^& }|BUPix3C „܄CvqiԱ 7Ky#Tqi'\Bn3f≲cCl=}TP3MFc:\aZm1iƙXbֻ +θr‚¥ɷ\,,N>E)Zޢ(tGnO*\/XMg*>]#-ln~$yZ 5HߩͧVk;ř5 侸GJ5Py;TNyD'dMSNܭOnV' 6E9p45&{{_UF]bށeyF۔8K]3 naIi8pZ\xiWmP;'W_ݚ˛!'8n|Y/K l Lʃ4i~yRj[M<=b6Dtx][T^GkZg@n{~hgb7Py/Fow sM8U֡~d6q9X_Uݹ**w͜, J/g-.ݚYUj'ov%cCE 4T`5fE#;ĉ`dX[ikNIc}'-;ccN588ح G7 rE[-[I1X<s6y۩ +n" Uan&\FC0:8()s_ F0O̗vo3|B䬒3y_S7ڎsEXO{.cNcNe.٭bc.06 PDw~IX6Sq|r}bn\&7ZG 1l;iQCz }ު]B +]RjC[wKZ=N-36c24X .liIش4ߖ57c:GM96}cL>5h L .zr%VE}rNdTo$#g @!PZA9K{?x!@rLmx\;T^ܣ^-|W C齓f㕘+xBKL}$^/^?U{3)yߝv+)"iM"O  H-0 C`n)Prg!A?6U$8΋;ͽAp7 h\bb!tŗ>MͣiGާ(l6h1G{iJiI( +:=ׁ"lanUw?di + ^,*se+/k +s1B7KmDH t5vF!]ck7 ve+8Kf1F9^-8~JV(Tc>#)H҄ qXPF\m> +< 4`eWZs C~ 3%A5*#]LOr1=Xq0Pq ŜJlɢ2A`  +C;`,ۧ8orj-{&]&)=W ?U>Sqd#∱A6 'e3 +Cb8?qv3 R7ƀ٠00W? bT0?a7P72vynW^׈.ZVxbIG,h[ڞDXCеnAHnZJ8#2OoU **l\^sIOoQO5ϧWv7FqxuHRJkܢ\Vŕ2^O7 읔뛔 ;AX%t 4>V:睔V1 xEaDAvkN M' .&M?0A/GJb-zF?2&k$H'o +":@ YD+^(zD"a^ +r9|,@, ;OUm؀l8`}p_I(1:p BЖumW{q. ϕ<Ѩ٧hlc 8/Pw:;<2cK8vS/Aq!Xpu/C2S"+n#"XG&k;FaJvE5 OU"e0\# +Bփ,$i)b&sl&T} Tb-:̧gt^'y L4DA|qA@bY$նx,$%JJ +"B/ۯMP闒]j6D@j̧{Au.Hx~ 6[q} 2SN@w嫽>e +IÄYPr>& (=="yhNT]p&Y.-MMT@`&y>IyJi[$&Tr/RllD/ޥ5M Y@ߏ7:·EQZi($ +kϥBe FމF|bo3@d8SS y1}J2}Z\#ɤvk5ITHZD N8=kf #S^L͆UoqdV6@A@ȉ0QF8yPcBFI殣S\@FspD` m4rSB|e\qk=#ATݡ*pF ,#gҞHwK_hG,4[=9ܒ iu/`01lh$To8i4}Y 7tõ򪛦 +Qe;iI흯᤯ dڽ7Y Ik2OStMM`ᶂH[ 3ie4ఠJi _~= qT ڰ$d¢66jPHV)׷zΣH'&&3SpvgROA6o +trnpF7Hȇc8 ]x0f[d1fቯ!de%3hA^:4iy[6/G_6+x'w_Hf1t,)@2S:U؀ !S.{1#KfN;>EAP[!11 #m҃=; ijtyGG!`Zb[US4u/vz!I4 OC || A*C!vdm/"Me&c-s LAo ]y H:6 e99Óh?; rx>22eHQ䛜k&U {N!F!|F :< .PvuU; tMubTnxy%!e ^;u[y +/H{cJF; +iXpwVU>ʭ>53l Mi#~VQ'kA0\ Pk8虿52ҢdV}0F@A}n;iǍ"ЍD7y|-R+0SbduI-9oXf16g +M,DWP?Od8:ژfJ +A<\΋6TNǓ)_:A35 ::hn_o슘ȂD DlPeIgǻ:&mJ:f41-+pمe~d/&^FS0u-Upz]E!^+?~6%<a]DFW8.૏-A&@ +.P4qhaC/g1&NyQ GLhb?L܎ ȅaC`P 7 |0H2a-*̥t3U3|m8rS@ZZNY_k'qD*2sA`!R^S@ AhP~s)5Y%@,y"Yy yT8kns mJHW g['zz#kd .:S1tvS vi b=UKr%G3wX@sS)" +ǐ1$_?w%'9nES&k O9c I"}x +TƸ @`ctyɓN\S[N!G$O^A:j&FylĜ=V8Mg4rr.a3.20p՚PnU'4'#μt@1>c=PL/!ƹZ/E$KE?]'Q5w>k?ՇݪV?[3ZmSWdIY$ZS׏1kǛfIH*[~YS+2ndy&#w%HGpջ'M!}{ޗވtF#w90;:m7, +4X'cRc vٻr& y#A̺PYʬC`6ISk2[gl౥;:B[Eo쑪ħ8OZˇJU'A(PfcC0GnBW!3[ CqWH0q*wRa,u1?˙̂2.88]H Řv\N45.3ܐ1#ѧӆfZ?ܲkVQ lÕ%q|C?[q"+A ,cG/EۓCwNRZ2f0K5^0;Yc6~0 bNgO>N4W0ulEul:-645J$378<<04<8Lv<>^'/JokWϥ+lD{:Y̏y$Pa !óJ0$ *%I%ՀbÚe+|ujBKgeT2's`]m,,H/Izu6ʹ7N)$+9hWbP?(mݭjc\qb#:CNU;˙n=vi|쥐[} #/HOΌUR9Tkүߦ Vn!y`<948 "pY}@~*.>x7jA ݿаFK(T5N!ςmI| l5r|5z.SOUP[]$.N63L(e~ Iبܲcm=vi899=~B$Ur '3[ = dx!l Ry|VQ'o yAeK[4^m2tX}x[ޢ'7+Sf(Wԡ /@ΫtOóZ-Eە\Q@㻋鲽wLv z>a]/Ao66~$q %UڢS\"/,?G\=Zۡ`)w_ޫnt$-kPJ]F6i'~a`1vr{)7Df%t c|t%'Jwx +}:4U§b *NM>)6ЙOmV8`ȼ#(>7_J~Awi HRbͱCAG{~]dܣ?T};;Y Gbm&Ւ= C#d;aʏ?B7 +,:g*4c%9PZCӽ_j4*'{PY+;o_s͊ &ۺK'ۡ"4:Eie9aF疕7=/q1WRm~ARmg)/Mat~Wo?$tRFQ]bBԈQE=% 6{F<"OVnS>VM +`@|IU3#Bh؏rLYU ,"iuEȂZr-YUdzQs(sxʸ-&o7Yψsept2֗|Ƀ{g}1Ӌ 5e9fp&%^oΣ[({E_K]be ռcN˻Gu +oi?58]l_WlEȉ'a#ш+J|( YY=5<#s +#6l'kege|l$Ja>.Axzw{X" '['GCXAblꠂgM"VVaJ^Q 7J|u &B]}`@{D,| tJ/hzAojD z8 1!.m?e._`xlzDΤ)Ao0p pS o5D#A/nE)sGמ^u8zP)wi~ +CG_!BZqK"sJ)$>g8#76Km s G+Yȉ jg ܤZ>}Mh([=A&lgK ͠+`*DV\y8k28)dYb}_qpsӚr 3#M/,㙔Dr_]L*cKxQ~m KD HυE,PAxYh!RrxBM0  +#19fb9AD{"ƒy52\T3omW}ޕݗU ~ nP[F +f`x8 $DR:HdnyxrFeR3 :p2\R`Pj",TqXB'!O6," Gy9ӠijզIHcAAǽr6s:y4Zy슃lJm-8s3 ks I|P$|H-uepk:[bǘ  + snǥ Id kA}M] +A +x)d&-9߉ /TW_ H6&<Fꃠ~|򺬪Қ2(;:5@Z^[36kZ˨"'y<<2aXl)5F! %d AiEg/t?tݳ_'ZD$Y\!a"O+khhXfDT$ /m`r6 ЅM0݂>i"Š>:jK%x֬նuGo ̓?,,,,Nq<8LZp7ӿ{֢euQEQ !=\Z]>YVqCy<s +ɥ+lu_\4EO02R`5!+4$Vj[6[o@goϮfAqi5MN(!' >n(k[t',D//%*DX#=(ȵV4OُP[i3:H:ewddktHXc5Xc5Xc5Xc5Xc5Xc5Xc5Xc5Xc5Xc5XoW +endstream +endobj + +14 0 obj +<> +stream +x /k8$9Y +endstream +endobj + +xref +0 15 +0000000000 65535 f +0000000015 00000 n +0000000064 00000 n +0000000122 00000 n +0000000244 00000 n +0000000391 00000 n +0000018032 00000 n +0000018106 00000 n +0000018314 00000 n +0000050006 00000 n +0000050600 00000 n +0000050667 00000 n +0000050819 00000 n +0000051817 00000 n +0000063895 00000 n +trailer +< <2C3C044FB8B3147B433FB683CF1264AB>] +>> +startxref +64180 +%%EOF diff --git a/apps/SeleniumService/selenium_claimSubmitWorker.py b/apps/SeleniumService/selenium_claimSubmitWorker.py index a904ca6..de9da7d 100644 --- a/apps/SeleniumService/selenium_claimSubmitWorker.py +++ b/apps/SeleniumService/selenium_claimSubmitWorker.py @@ -332,7 +332,6 @@ class AutomationMassHealth: def main_workflow(self, url): try: self.config_driver() - print("Reaching Site :", url) self.driver.maximize_window() self.driver.get(url) time.sleep(3) diff --git a/apps/SeleniumService/selenium_eligibilityCheckWorker.py b/apps/SeleniumService/selenium_eligibilityCheckWorker.py index 511ecf6..4058db1 100644 --- a/apps/SeleniumService/selenium_eligibilityCheckWorker.py +++ b/apps/SeleniumService/selenium_eligibilityCheckWorker.py @@ -5,11 +5,7 @@ from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.chrome import ChromeDriverManager -from selenium.webdriver.support.ui import Select import time -from datetime import datetime -import tempfile -import base64 import os class AutomationMassHealthEligibilityCheck: @@ -17,25 +13,32 @@ class AutomationMassHealthEligibilityCheck: self.headless = False self.driver = None - self.data = data - self.claim = data.get("claim", {}) - self.upload_files = data.get("pdfs", []) + data.get("images", []) + self.data = data.get("data") # Flatten values for convenience - self.memberId = self.claim.get("memberId", "") - self.dateOfBirth = self.claim.get("dateOfBirth", "") - self.remarks = self.claim.get("remarks", "") - self.massdhp_username = self.claim.get("massdhpUsername", "") - self.massdhp_password = self.claim.get("massdhpPassword", "") - self.serviceLines = self.claim.get("serviceLines", []) - self.missingTeethStatus = self.claim.get("missingTeethStatus", "") - self.missingTeeth = self.claim.get("missingTeeth", {}) + self.memberId = self.data.get("memberId", "") + self.dateOfBirth = self.data.get("dateOfBirth", "") + self.massdhp_username = self.data.get("massdhpUsername", "") + self.massdhp_password = self.data.get("massdhpPassword", "") + + self.download_dir = os.path.abspath("seleniumDownloads") + os.makedirs(self.download_dir, exist_ok=True) def config_driver(self): options = webdriver.ChromeOptions() if self.headless: options.add_argument("--headless") + + # Add PDF download preferences + prefs = { + "download.default_directory": self.download_dir, + "plugins.always_open_pdf_externally": True, + "download.prompt_for_download": False, + "download.directory_upgrade": True + } + options.add_experimental_option("prefs", prefs) + s = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=s, options=options) self.driver = driver @@ -68,10 +71,10 @@ class AutomationMassHealthEligibilityCheck: wait = WebDriverWait(self.driver, 30) try: - claim_upload_link = wait.until( - EC.element_to_be_clickable((By.XPATH, "//a[text()='Claim Upload']")) + eligibility_link = wait.until( + EC.element_to_be_clickable((By.XPATH, "//a[text()='Member Eligibility']")) ) - claim_upload_link.click() + eligibility_link.click() time.sleep(3) @@ -82,38 +85,26 @@ class AutomationMassHealthEligibilityCheck: # Fill DOB parts try: - dob_parts = self.dateOfBirth.split("/") - month= dob_parts[0].zfill(2) # "12" - day= dob_parts[1].zfill(2) # "13" - year = dob_parts[2] # "1965" + dob_parts = self.dateOfBirth.split("-") + year = dob_parts[0] # "1964" + month = dob_parts[1].zfill(2) # "04" + day = dob_parts[2].zfill(2) # "17" except Exception as e: print(f"Error parsing DOB: {e}") return "ERROR: PARSING DOB" - wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="Text2"]'))).send_keys(month) wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="Text3"]'))).send_keys(day) wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="Text4"]'))).send_keys(year) - # Rendering Provider NPI dropdown - npi_dropdown = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="Select1"]'))) - select_npi = Select(npi_dropdown) - select_npi.select_by_index(1) - - # Office Location dropdown - location_dropdown = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="Select2"]'))) - select_location = Select(location_dropdown) - select_location.select_by_index(1) - # Click Continue button - continue_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//input[@type="submit" and @value="Continue"]'))) + continue_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//input[@type="submit" and @value="Add Member"]'))) continue_btn.click() - # Check for error message try: error_msg = WebDriverWait(self.driver, 5).until(EC.presence_of_element_located( - (By.XPATH, "//td[@class='text_err_msg' and contains(text(), 'Invalid Member ID or Date of Birth')]") + (By.XPATH, "//td[@class='text_err_msg' and contains(text(), 'Invalid Medicaid ID or Date of Birth')]") )) if error_msg: print("Error: Invalid Member ID or Date of Birth.") @@ -127,197 +118,34 @@ class AutomationMassHealthEligibilityCheck: print(f"Error while step1 i.e Cheking the MemberId and DOB in: {e}") return "ERROR:STEP1" - def step2(self): - - wait = WebDriverWait(self.driver, 30) - - # already waiting in step1 last part, so no time sleep. - - # 1 - Procedure Codes part - try: - for proc in self.serviceLines: - # Wait for Procedure Code dropdown and select code - select_element = wait.until(EC.presence_of_element_located((By.XPATH, "//select[@id='Select3']"))) - Select(select_element).select_by_value(proc['procedureCode']) - - # Fill Procedure Date if present - if proc.get("procedureDate"): - try: - # Try to normalize date to MM/DD/YYYY format - parsed_date = datetime.strptime(proc["procedureDate"], "%Y-%m-%d") - formatted_date = parsed_date.strftime("%m/%d/%Y") - - date_xpath = "//input[@name='ProcedureDate']" - wait.until(EC.presence_of_element_located((By.XPATH, date_xpath))).clear() - self.driver.find_element(By.XPATH, date_xpath).send_keys(formatted_date) - - except ValueError: - # Invalid date format - skip filling ProcedureDate field - pass - - # Fill Oral Cavity Area if present - if proc.get("oralCavityArea"): - oral_xpath = "//input[@name='OralCavityArea']" - wait.until(EC.presence_of_element_located((By.XPATH, oral_xpath))).clear() - self.driver.find_element(By.XPATH, oral_xpath).send_keys(proc["oralCavityArea"]) - - # Fill Tooth Number if present - if proc.get("toothNumber"): - tooth_num_dropdown = wait.until(EC.presence_of_element_located((By.XPATH, "//select[@name='ToothNumber']"))) - select_tooth = Select(tooth_num_dropdown) - select_tooth.select_by_value(proc["toothNumber"]) - - - # Fill Tooth Surface if present - if proc.get("toothSurface"): - surfaces = proc["toothSurface"].split(",") - for surface in surfaces: - surface = surface.strip() - checkbox_xpath = f"//input[@type='checkbox' and @name='TS_{surface}']" - checkbox = wait.until(EC.element_to_be_clickable((By.XPATH, checkbox_xpath))) - if not checkbox.is_selected(): - checkbox.click() - - - # Fill Fees if present - if proc.get("billedAmount"): - fees_xpath = "//input[@name='ProcedureFee']" - wait.until(EC.presence_of_element_located((By.XPATH, fees_xpath))).clear() - self.driver.find_element(By.XPATH, fees_xpath).send_keys(proc["billedAmount"]) - - # Click "Add Procedure" button - add_proc_xpath = "//input[@type='submit' and @value='Add Procedure']" - wait.until(EC.element_to_be_clickable((By.XPATH, add_proc_xpath))).click() - - time.sleep(1) - - except Exception as e: - print(f"Error while filling Procedure Codes: {e}") - return "ERROR:PROCEDURE CODES" - - # 2 - Upload PDFs: - try: - with tempfile.TemporaryDirectory() as tmp_dir: - for file_obj in self.upload_files: - base64_data = file_obj["bufferBase64"] - file_name = file_obj.get("originalname", "tempfile.bin") - - # Ensure valid extension fallback if missing - if not any(file_name.lower().endswith(ext) for ext in [".pdf", ".jpg", ".jpeg", ".png", ".webp"]): - file_name += ".bin" - - # Full path with original filename inside temp dir - tmp_file_path = os.path.join(tmp_dir, file_name) - - # Decode and save - with open(tmp_file_path, "wb") as tmp_file: - tmp_file.write(base64.b64decode(base64_data)) - - # Upload using Selenium - file_input = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@name='FileName' and @type='file']"))) - file_input.send_keys(tmp_file_path) - - upload_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@type='submit' and @value='Upload File']"))) - upload_button.click() - - time.sleep(3) - except Exception as e: - print(f"Error while uploading PDFs: {e}") - return "ERROR:PDF FAILED" - - # 3 - Indicate Missing Teeth Part - try: - # Handle the missing teeth section based on the status - missing_status = self.missingTeethStatus.strip() if self.missingTeethStatus else "No_missing" - - if missing_status == "No_missing": - missing_teeth_no = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@type='checkbox' and @name='PAU_Step3_Checkbox1']"))) - missing_teeth_no.click() - - elif missing_status == "endentulous": - missing_teeth_edentulous = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@type='checkbox' and @name='PAU_Step3_Checkbox2']"))) - missing_teeth_edentulous.click() - - elif missing_status == "Yes_missing": - missing_teeth_dict = self.missingTeeth - - # For each tooth in the missing teeth dict, select the dropdown option - for tooth_name, value in missing_teeth_dict.items(): - if value: # only if there's a value to select - select_element = wait.until(EC.presence_of_element_located((By.XPATH, f"//select[@name='{tooth_name}']"))) - select_obj = Select(select_element) - select_obj.select_by_value(value) - - - # Wait for upload button and click it - update_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@type='submit' and @value='Update Missing Teeth']"))) - update_button.click() - - time.sleep(3) - except Exception as e: - print(f"Error while filling missing teeth: {e}") - return "ERROR:MISSING TEETH FAILED" - - - # 4 - Update Remarks - try: - if self.remarks.strip(): - textarea = wait.until(EC.presence_of_element_located((By.XPATH, "//textarea[@name='Remarks']"))) - textarea.clear() - textarea.send_keys(self.remarks) - - # Wait for update button and click it - update_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@type='submit' and @value='Update Remarks']"))) - update_button.click() - - time.sleep(3) - - except Exception as e: - print(f"Error while filling remarks: {e}") - return "ERROR:REMARKS FAILED" - - # 5 - close buton - try: - close_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@type='submit' and @value='Submit Request']"))) - close_button.click() - - time.sleep(1) - - # Switch to alert and accept it - try: - wait.until(EC.alert_is_present()) - - alert = self.driver.switch_to.alert - alert.accept() - except TimeoutException: - print("No alert appeared after clicking the button.") - - time.sleep(1) - - except Exception as e: - print(f"Error while Closing: {e}") - return "ERROR:CLOSE FAILED" - - return "Success" - - def reach_to_pdf(self): + def step2(self): wait = WebDriverWait(self.driver, 90) + + def wait_for_pdf_download(timeout=60): + for _ in range(timeout): + files = [f for f in os.listdir(self.download_dir) if f.endswith(".pdf")] + if files: + return os.path.join(self.download_dir, files[0]) + time.sleep(1) + raise TimeoutError("PDF did not download in time") try: - pdf_link_element = wait.until( - EC.element_to_be_clickable((By.XPATH, "//a[contains(@href, '.pdf')]")) - ) - time.sleep(5) - pdf_relative_url = pdf_link_element.get_attribute("href") - if not pdf_relative_url.startswith("http"): - full_pdf_url = f"https://providers.massdhp.com{pdf_relative_url}" - else: - full_pdf_url = pdf_relative_url - - print("FULL PDF LINK: ",full_pdf_url) - return full_pdf_url + eligibilityElement = wait.until(EC.presence_of_element_located((By.XPATH, + f"//table[@id='Table3']//tr[td[contains(text(), '{self.memberId}')]]/td[3]"))) + eligibilityText = eligibilityElement.text + report_link = wait.until(EC.element_to_be_clickable((By.XPATH, "//a[contains(text(), 'Click here')]"))) + report_link.click() + + pdf_path = wait_for_pdf_download() + print("PDF downloaded at:", pdf_path) + + return { + "status": "success", + "eligibility": eligibilityText, + "pdf_path": pdf_path + } except Exception as e: print(f"ERROR: {str(e)}") return { @@ -332,7 +160,6 @@ class AutomationMassHealthEligibilityCheck: def main_workflow(self, url): try: self.config_driver() - print("Reaching Site :", url) self.driver.maximize_window() self.driver.get(url) time.sleep(3) @@ -346,17 +173,10 @@ class AutomationMassHealthEligibilityCheck: return {"status": "error", "message": step1_result} step2_result = self.step2() - if step2_result.startswith("ERROR"): - return {"status": "error", "message": step2_result} - - reachToPdf_result = self.reach_to_pdf() - if reachToPdf_result.startswith("ERROR"): - return {"status": "error", "message": reachToPdf_result} + if step2_result.get("status") == "error": + return {"status": "error", "message": step2_result.get("message")} - return { - "status": "success", - "pdf_url": reachToPdf_result - } + return step2_result except Exception as e: return { "status": "error",