From cf1128681faef7492c2674c818ec05f90725fbd8 Mon Sep 17 00:00:00 2001 From: mohammad hossein Date: Mon, 24 Jun 2024 17:52:46 +0330 Subject: [PATCH 01/10] +add laravel 11 support --- composer.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 8790ed1..35036a4 100644 --- a/composer.json +++ b/composer.json @@ -38,9 +38,9 @@ "ext-curl": "*", "ext-json": "*", "ext-soap": "*", - "illuminate/support": "^5.7|^6.0|^7.0|^8.0|^9.0|^10.0", - "illuminate/database": "^5.7|^6.0|^7.0|^8.0|^9.0|^10.0", - "illuminate/http": "^5.7|^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/support": "^5.7|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/database": "^5.7|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/http": "^5.7|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", "nesbot/carbon": "*" }, "require-dev": { From a475c83f6cc37acda105ffc2663891347cf59a34 Mon Sep 17 00:00:00 2001 From: mohammad hossein Date: Mon, 24 Jun 2024 17:53:50 +0330 Subject: [PATCH 02/10] digipay added --- config/iranpayment.php | 16 +- resources/assets/img/digipay.png | Bin 0 -> 10128 bytes src/Exceptions/InvalidDataException.php | 7 +- src/Gateways/Digipay/Digipay.php | 653 ++++++++++++++++++++++ src/Gateways/Digipay/DigipayException.php | 40 ++ src/Http/CurlRequest.php | 1 - src/IranPayment.php | 7 + 7 files changed, 720 insertions(+), 4 deletions(-) create mode 100644 resources/assets/img/digipay.png create mode 100644 src/Gateways/Digipay/Digipay.php create mode 100644 src/Gateways/Digipay/DigipayException.php diff --git a/config/iranpayment.php b/config/iranpayment.php index 11eeac6..1b0b332 100644 --- a/config/iranpayment.php +++ b/config/iranpayment.php @@ -6,7 +6,7 @@ |-------------------------------------------------------------------------- | Default gateway |-------------------------------------------------------------------------- - | [saman|sadad|zarinpal|payir|payping] + | [saman|sadad|zarinpal|payir|payping|digipay] */ 'default' => env('IRANPAYMENT_DEFAULT', 'saman'), @@ -104,6 +104,20 @@ // 'callback-url' => 'http://example.com/payments/navinopay/callback', ], + /* + |-------------------------------------------------------------------------- + | Digipay gateway + |-------------------------------------------------------------------------- + */ + 'digipay' => [ + 'client_id' => env('DIGIPAY_CLIENT_ID', ''), + 'client_secret' => env('DIGIPAY_CLIENT_SECRET', ''), + 'username' => env('DIGIPAY_USERNAME', ''), + 'password' => env('DIGIPAY_PASSWORD', ''), + 'grant_type' => env('DIGIPAY_GRANT_TYPE', 'password'), + 'callback-url' => env('DIGIPAY_CALLBACK_URL', ''), + ], + /* |-------------------------------------------------------------------------- | TEST gateway diff --git a/resources/assets/img/digipay.png b/resources/assets/img/digipay.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ddbb148f38b8ba8c724509268ef60aeee580de GIT binary patch literal 10128 zcmcI~c{tSX_xF2-v6F}p5hEW`DIa32MHqWSmaK(}WQmFF6OuIsMfOjF23bH=dYRfy_|FIbD#4%=f2M!ZECE`$tJ`GK@cZa zPa6k8Nbna4u`q$3U;fnJ5F}-Z)jn_TpE*BzFGa+qVPSc(t_Ld>@r995&^a;J_Pn6B zobUw$?%SKbsJNM$awStt}M&4(S`ZRc5?swB{6UVv%?^mK3jfB&nBiD6E$ftIdDVO3(RVd7@A( zOXsuXcJeZ#S<63f=Xy_)xJ;F$-i63s7nm2;i)VOPpWZP>$)+eq_h4~-j~Pt3{o^QF zzAIuzJCP!3t!sG__!^lC$oaP6$P=yyJ@36HxF?J#l(%Fw`AZ4%DARRQC(LfzXOXKO zbW@k>i09Q`mZ2d*c46#D zlpc4Kk|nS>X;d~-$bk`KjpOplvPL504q2$-j11SY6?=@bppwu{{Y*V#QGrOBPCP54 z$I7>s>`KU;?AJbT-4^&T^Mdmsu3)U&p?Ssv?wW+#Z_;gAh*Uxh1zE0qa``WeGOxdA zcD)of-h=`O{ZU z>HRgcYRI+b1J=g|wFKn?vl$1KwG|kGCb15c{d*+qH=jSfW&4!Ek~0`Kx%kSi_}G zWH-;ov9pAZX7V#VqKvFuGUffN2fAjubL2@8l=sC`mO3y4^u_ydgwX0hG#6IkeiQ!K{{mes<7*8nS284`;}azp zmYSY-UfZKUG6aoJwCqWPy9mZ1IwS{}&ze3-G;1gB@n$6Tl43!{XT-xZazul$N?1wc zgvKuO&#t6xmcNY=n^r%&Y)i#g2r$K>I?C&xALn+IO0Xg*p?oMVKHR!BUONE`uc?#q z_}3iX^h5UgqLQyGyyb2iGI5!}9l|5+kWS$#gsTa12T&98cuPBtElOwwQ-fsJO$5d5 z0C!)}Rlh;7oRdjTwbvaDt9Wusp}226CY#CV%NE}lMstD;#ElTMzYV_)V%JY%aZ^ev zy?Eq`L%_{w(Y)lG?~M*vqR{2|eWP17XS?jCZJ^rH`Or#BFx^#zz=d4QQy6(VerokA z-m*z$X=o2FzNv{D=EsE%?3@S(7CZmidYNHVfE3>||Jqfh0-9-1p2grs_eO1s=v z2l>Jt*BnSn*RJ~HE=okFUUn2Dgu8M+x?Zv6&V>*@oDps4wP`@48YJD0Hte7Wg}Jj) z^iLhX<8^%aF`6tR&Rj{1tsL;(J%EUdlj3=kw=kTFCKn+Wo!n|F8Z$}?zj%9M(y-2T zwH}s4k_@|Sz9_T2vZ_UyQQsoBW*mX5^e&)oej{nV_PYD7hp256QZA+^nxkxZ9gY3^ zQM^^~-Q3!cZSd2#z{%{daml?pHJpsb9;r-h=9sD~uPHlH)Wt?&Ym5e#Mk?W)&wdl! zw*i*qFOU=%t!!&yMI;rm`|>E=@AC?EQ0%GB3%*)%@XZL=U!1YHUFAm0K;htUb+cN$ z3AZxIWH=FxRpV8Ta1HwBbjIxNv9Jnnsi8DZ_wgqX5lyyyEEl$$c4&HI`cs1g!m9P1 z(vBon-(`EjdgMfd4MITV5h<%Kpw0|SG?y~kVNY%yRSULRw16<10cB%SSR%dniTs-x zl%u(@*0<+lKMjfKUh8jv>AX7whIO%PG9O;sR3oCLRT|Phshxl%rj{u*wb5ua_5+nR zDjyKLRsw0C`uXLDBo?P0p!BS|9*T>RAZP^&=n~Q2r@9xc8!lGWL%wHAEdj`YA#%ml zKQYj=$vxktZvG~FB08Vjbuv^=S+)MnVUIyJO{tj)fCA(%D9q-_;|4FEgjkiAF@+ER z-cWuFcv?6rFbrl5x865ua9=$E6)TOxIylpsdbV1`TT?)~t;?c#EjbiFk0h{d+f3;W`&GGzVm1lYmU^D0Ih zE_bYI7c@L-kloEUg@K!;UNqZq4~>i$K`Nb!k^}nJIMTTu&ll$8!y=9)u2eR=hq{2h zJs|e-mItiZb@95hn4{$j8VxU@SMrMenqZ3Pk58Lx2N1&PPKSWJIhLK9mi%E9l{@h; zg^IDb&^J(A^fu3+^aeaSFeyubcf)S``$tr6I1P)$5=lWN@;@9-L0S9|mZ<;2#|Z^- zVYx4YeVxgvZ2Vyl!70Z#N%2qb0YQ>G%0fP+*;W)&YXR}gcfu=wfAOhxr<_$FOKuiJ zG7}Mv-I~qbvP0#zAu@t0fV)R6q>o>Q#669LbO6z3fzxFtp+G542_W7VwblL*4zDg> zEWDZPj4W|6TC?S;9sac^jY<2)sak0 zdP--vP!jH7b_Zwnq%6nyX=}ww z#9mm}#oXHb=aOZ|M!Zo7u6S;Z+imQh_vwZpYKj+*pCMC$VdRp@#`RICP< z%>lzKouZ6sp)W`=Y{pmW0d+sNon1Gj<>z1m<{`)PgEx({w1_c|{UWpnWi2Lc&0_n$ zxFnP%geJGE2dIwhYxz$tkdyTq4hfnvz^#R2^@mlLB$V*JbTqE)@BSsTQ$*^CaOP$O zhlu5=+|VXK_$aGA{Q~j#Y}^#BdOV^zL|+qi4UtH~2y83fY+!ugk%5VRA!Io)@HR21 zcsv1gyn!))=xD5KUTmCKW2C0R1M;*s!jGI@!64jJ;ogCP>SmKJqpS-7lI&sV?-N>1 zv~goS@R^R%B;Hxst(>4Vm=z}0T0v-ODF$XrM43M>S126rd^LX5>zy*$Ob@0rN_Luf zRRN6ej}#QioQPv%N_wn7NNK{c;pS@f$C${XPN3-MpkG-_>*w-~^NLoGnE@m<6YFxx^USUVLJN4HVZ>Ampz=#72cp2cIP^1 zdV>^O>r9-lH!NSd0Y0rEQuYx)w!b$_z?5t7lvj|RTGdDH%??;DeOahTr3;Z5FjId( zGr1`>l{b`X?)TANAMh_w^Lw!I2xfH^%v0OGKxf2x-#eST0+Tsug)CM(ph-`qF;m9s zNXB_GwF}e!sQ!{4gUi zVE%O(Vb>uC;Kv7KuHk5aC(K@CVGT+-2*}_+kzl&Ro*Q7E1(@eHZM*qn3hd}R7lf$= z;5?$>M=}=U>kkPe8Rx!y3H{~MRL_7>0R|D{n$v$?Bh>5!!=9D2&no}#Bu#Sl?{m$@ z!-d9qXTiwB8arix`s9#{9*|msJ?xHmkKNcYQ~HbBRY2!1U{g2va5?gHfPV(Du-u7HTGj@Sy{lYiqX^=zsSTP*gBjqV+mRb>>f+PM4NLQ0}F!1jAj;% z5*d7A3%M7q~61@WY>y5W1 zr4zP(+-typgs$NA!Sd>$0e}M>-U^~}AHBzx#4*T3tDW8VlBize5D>3Sb6DBd&8 zPF*BpaqM@Xy4HY@Gp{lke6sbkw22?u0m=18GgmjQm)e^O;UU0qTWxAMuBfy7sU~8g z(Wy}=&B&!mna%!HTK@}JNM$R?T;TTnQgd1JxlqXD<(GeqUdj%Q%2>Q#r9d{r;u>uc zrYpdCcln*6@oZ!H_XyV=j#F~iwzBDy{R}JYkq27Im`;{<Qe_tG6+a)EsB}NyaCz4ZKQ2#m@~I6v{*U z>6E^3$BY+_8Lzu+nxP-B>CSD!{+sWq(&mbAq9M~^g3u$Hpa1tiKt~)3@W&R30W8My zIU^F$SQ&Q;>+cI&}yt&h!eD`HAs zo&$Hi=;lOo4St9`JiH$MC5rMqoF?M=;QS{tFBW$f!0RhD2lm1QLQeuA*v}wKhq&T| zF#Yac#|Jc=smPxYz#fr^NkV@IX7FL)9`oji^wP2)KC4^`dl@!@`9_J%?GU9Ye*q;i zU_x#j{7`D2y-Mq0lX*2rK{}Jf_^`O5w zf}NHdY$laNy0$XrB9oc?=z*XHI2Yj@0Ki<>YT2e`h#COzjRC@6U;*Lne&slbu;^4k zpR+7fqh>{Qb0Q6PS5@GyH^B~YIz&1hFo3=D9q`WH5mArr<8l7CU>8>pVbkO!^G^(g z`T-6AXWjJn?RJh;xgn0EcBySQh?^ zxt51BpMt=rS_~W!M)*$yTD0z690)4ye2@#k$C02fO?&zFKwNfy==)^HxzSI z-~&O50`Na*`Yjw=0u~}c4L6^ z#NW>JlK+J2YcnDfMr9yDkSV=rKe4gk$yS8HQ_gZW#q2c*TA;Oldt< z1t(=X2;x!n)w+B*IPbiZTiydcdl%^8TGObRRAS5zOS9b3NBh!Ff11?bbn1uDll@c% z_AvT_!Y}}(KYF2s`mbqxZ$;+T2974e3jIB|2#8+>Nb5K32`5~Ju}@kbd4lxtPiDmF z1`-aL0t3&8?2sUyIBk!1hUP0spqRXp3}Xp|;?hAoUL zUpzEHWCdygK3i0G9%TM%cjn@kMkayi3j9!SRun`!dCn7I>x-u!DiQ~hmQI_bzIyk$ zk;DE9FrcCihhAbz$J=dM8%RJ*FaJp`dv7nz8Gx_UKVP19>^?chK-lXbqs|=N6$_ew z3aI1Z1og{5`Ad7TxefAop37Nq`pP2_v}q&fc@=mh{JA>H>NOk;tl19ElEVX!-e+$s zG(Oe<=d6MmyXg8KvE>C4c%C^Im|C|yJ1x!U>X(;PEXfkUGEV1lJxhBw`@X+Ap2t-S z9zrQn^zTP4O-zAkd*lY3;@k8xEpD@otT}@8z4#W0T*ME~?_=#kw^Vj|X8~7psjgG^ zozxd!HpMgpu6Q}Wqj4h4CjKosY%M+@+kdpMeS|~fBdzQjKysXD&|-iRUB2AW6&yCY z{8==K0ausrDDB!TIc$J5VJ!iyDqyy0pQ+IH8!E)y9mq6v;r6Wwm8J(}dm}%77jFWV zuTbFJSJ-$UG*kx9Lso}dSV6qVsS_^EB7!{00iN{`Xt{O&{%Hr+j}|0jiQXJQxv%0H z-_B;W*D`+TR|`1S`~(LCR;xzj-YS2M^ZlGTO9jwyd1&OGSMMS%W}Gs47({yz5E9Lm zfk~Cw(CE=#UE(pI^PA1)Ia?qqE0lT&sxsqc;{30 ztTT8SvNssccjbl@NExncuvX^K19rA9)$Cs_>yx@2gVK~C120d8G`7M}So-wgVE~4WUMW$1_-#o-u^qt|YAA&!DH1p|XLaob(Cq zk;hvADM5KdEcMUH2F*tR0w+}|$nE9&31(k(1TuVkiUp#{uz}_Be6*yT z^aGAb{!13ZVMqL>O02Rlk)(gXjesO=r3nu4dXh`jptSWum>57G8A8qoQ`XqNCGG%N z@_m~|WQdm;NbzIZkYaozd`*ORrwahRn}8nSgZ-vyj_5Vs>SFAb{W8j47@3tGqzl(OTmE>2kJDW`{}9- z#|=UHfcpYdb+uu*vD*Zwro!t^^xWZr)g4JX3nWJ^M`<+omx9oOvj)NfaN!0{k-X4mWRtM=5 z=_S}N&TDhAcCGu5DnX85jxr)M=-r>OpT$h?&*;J}AS6py=;l1A$cbvtHUeU%0w~hI z*=H-T=Ni>S+5s!p4hcLh9IU9?q=e_eUZ!g2Cf_`mxbk%jaX2n2wk$ji6Gw7m^Hn_P z%D`0cS^RRd*(xp6j&Wm00Sr&&cP&16(;!Q$=>G6RWcX*_O#?TGP<33q7~DI3a9>_2 zmE0E{r4yS-Ob4w;wR1m>>*Ex`*>9>e3}pakHF(CMrxZSjJht~+DQGg#t3Mp9^sCMb z52QUfj>*Js#nNp0TMl@vC^iy>hGLDh`N6S_Z?ql-_PTX*yhY!nIF&jp9{ZF<_Lne3 z_B$F_@Z ziSBX0kSmE5Wa+&1PaCf<0QT>N4Gc#^`LAoBDsz4Y>}@A6^-F;h3mKF@xiI%s zT2~=+4dz95i7}$0Rv@#i1LC9QU5zsTtsgh|TZ9bCNHRa#yCKRKZ^3e-p})a>DD%g3 z{;C)F&}HopXz+Q?1oGtzqc}+?>k&zrzFj-7Q4@KjtKfE0z4k_kC1Un%;A3#bjvAG3 zDu(`Ee)3(L{X&DX5l+1?eeLw&un-V%i2Ap)tVQjY97FYISW4_KO4!-1FjS<}cfb4!tvIT`OaGiT@s+H-qfZ)u*L4|7g&ew)e zm@ahJW+SIhgArQV&YXltxyucovw%Fhjy(hdbum>2w<5bAz1Ivp3g4?w57ph+J^^yc z<5BsPSHkcu@lT^4+4E)P697fg6V7ls0xsO8G-d ziXph(1((GIa+0z`1J#Q5Q0y{>rXqeBDa{_zu~NOlE?()og({r$)q9X0W| zoU!IuI4pADIp408_<%KJ_uA<48aP4|@06ztHqsiPzH?_kA3s~-0h6ji`lJc14^s^k z8<5?v4_YF?Z8Py?+GxgU=+jOngL<#@+Gjk5R~+@}NeFR2`limLvWZ({+~+P}FNe}RaW z{2FfEu=NO0`eSxeccMFc8ca?P40EO3w)s7I(g6Xn1m(B?Q4y$>1Xdv-FW>sZO7-oF zpzvV*=8-GyVRn7qjS~=L6hv-c1d|8n-nlPqu|brMO=fZ3HF^W6_=F(+&ML&s&J71N zBD=rew{J87H5<#a>vtB}C{(#DN^e6z88|RMqV$3)bKq*X&hwd zvfnj)-A2kucSCt7ue()yM}?RHrIk2qBN+_AjtjQ7Nw=u-GGR0 zcnUnCx{GcGd9cTly*=!zB(X%r(zbge{QUh+X2BZFjxPilPL5o3_8+a1#u9583wk~@ zabGBDpQigw+Os5uWa>D&{^=4cPuUB4Zr>_Ow}ycEwTC_G!)FlDbI%Of9`*Z#ukFu{ zQN1L*tVgR)U~vj|eQGv8WHP!I4qOu^q^G;vfRYZk*h#K_369m%DMoDTmC5&!Svg3sfIl>sdp(#mL1Z(Rg+Emp1z<(B)w#{HNI7& z{?X1kba#)C$T1yrN)5$+SBdq%2y7Y92W0dW>6c%^pWI=jsn!wTb0lHfw z&7Rl%BPgtt4}ZFrOVC~yj<$-f$Uu-;tFK$;g4t6;#p7TJy8o^asa(tODQnt5s-TNuBX5!nk6-`9d}MRE^5>0vcAe0-ir zI)vn{yYBduHqLkKzZawBrR!79YS;3Gy*?iKM1XSB5((Z798McxX%!X9gETE!2cGb< z*k*wD57=}T+mDTz-Ea?$n^Jp?0~Doqe8bRWTewJ$z1JBU9AAMfw_r(frB&KXX%fwa z6h7a$vgt0t8G7>-Ul{)N+eh4jCjY6rTjf66W($4e@a=}d-yR4EJQnDFkN;1#o{&ma zl3e__y{_#9Y&XeUDamHpqJ>DhW@R`Lq3Zdw=SV!Bi_!*MVXkYKVEyMwfMDg#>2e*> zJ<|x_fx2lQ#S+B4F8+B(U_Qad7Ydr%P%oSsEi!i(tz z?KkyOz(4+A3nUk`oRLZ4aP|MPmE&+kbg>p%nj~Rzbb= zyGR%X)h@PE*Duv}@v``apCl1=-)7!1<^nFLa@w{}A7{&C=`NtAhNO`7yoH@X~I`DdSk%z}y33{=SDY7E}`m@^Z4DW{)% zvzoPxvNiM8q&BbX6YShm54EZRsp$x?ohhlAxPN{ zBf$DpbOo=82sv^JJIC;8Ak!bfEhY?C#%*vbM|S*`D~(5Ed7%IHAgTMvvq^68#rabV z66G9vxUnJD9RdZ<=y6ToDg|Q-UL5^)^Bqax(qU*vwDSxq03tH^lpe|=VR)|H8AMUC z1YbHTcTA_9;pPolFEqiAdl2R%L!tzUZ$N%MZ_&r2n9X!$c-b}k+TI4wIVxpwFmoL% zZxTI|LRw?A;N3bR7cSH@*Y3N(;$zkh5?0MIC(MGY3L>ztitW*MX5lZK~4dEDXp+P3O7>gp}UqN zl!Rae@6w>B%lrAH9c@Pig5sn`&M=Ft)JqmCMp;tdu5g-eywvPBZ USGz{ROFIaA(OA3mg5&-F1sNzvssI20 literal 0 HcmV?d00001 diff --git a/src/Exceptions/InvalidDataException.php b/src/Exceptions/InvalidDataException.php index 73cbfc0..220db3d 100644 --- a/src/Exceptions/InvalidDataException.php +++ b/src/Exceptions/InvalidDataException.php @@ -2,8 +2,6 @@ namespace Dena\IranPayment\Exceptions; -use Dena\IranPayment\Exceptions\IranPaymentException; - use Throwable; class InvalidDataException extends IranPaymentException @@ -32,4 +30,9 @@ public static function invalidCallbackUrl(): self { return new self('آدرس بازگشتی وارد شده معتبر نمی‌باشد.'); } + + public static function invalidCode(): self + { + return new self('کد تراکنش معتبر نمی‌باشد.'); + } } diff --git a/src/Gateways/Digipay/Digipay.php b/src/Gateways/Digipay/Digipay.php new file mode 100644 index 0000000..fe53bc9 --- /dev/null +++ b/src/Gateways/Digipay/Digipay.php @@ -0,0 +1,653 @@ +ticket = $ticket; + + return $this; + } + + /** + * Get Ticket function + * + * @return string|null + */ + public function getTicket(): ?string + { + return $this->ticket; + } + + /** + * Set Payment Url function + * + * @param string $payment_url + * @return $this + */ + public function setPaymentUrl(string $payment_url): self + { + $this->payment_url = $payment_url; + + return $this; + } + + /** + * Get Payment Url function + * + * @return string|null + */ + public function getPaymentUrl(): ?string + { + return $this->payment_url; + } + + /** + * Set Provider ID function + * + * @param string $provider_id + * @return $this + */ + public function setProviderId(string $provider_id): self + { + $this->provider_id = $provider_id; + + return $this; + } + + /** + * Get Provider ID function + * + * @return string|null + */ + public function getProviderId(): ?string + { + return $this->provider_id; + } + + /** + * Set Tracking Code function + * + * @param string $tracking_code + * @return $this + */ + public function setTrackingCode(string $tracking_code): self + { + $this->tracking_code = $tracking_code; + + return $this; + } + + /** + * Get Tracking Code function + * + * @return string|null + */ + public function getTrackingCode(): ?string + { + return $this->tracking_code; + } + + /** + * Set Ticket Type function + * + * @param int $ticket_type + * @return $this + */ + public function setTicketType(int $ticket_type): self + { + $this->ticket_type = $ticket_type; + + return $this; + } + + /** + * Get Ticket Type function + * + * @return int|null + */ + public function getTicketType(): ?int + { + return $this->ticket_type; + } + + /** + * Set Username function + * + * @param string $username + * @return $this + */ + public function setUsername(string $username): self + { + $this->username = $username; + + return $this; + } + + /** + * Get Username function + * + * @return string|null + */ + public function getUsername(): ?string + { + return $this->username; + } + + /** + * Set Grant Type function + * + * @param string $grantType + * @return $this + */ + public function setGrantType(string $grantType = 'password'): self + { + $this->grantType = $grantType; + + return $this; + } + + /** + * Get Grant Type function + * + * @return string|null + */ + public function getGrantType(): ?string + { + return $this->grantType; + } + + /** + * Set Password function + * + * @param string $password + * @return $this + */ + public function setPassword(string $password): self + { + $this->password = $password; + + return $this; + } + + /** + * Get Password function + * + * @return string|null + */ + public function getPassword(): ?string + { + return $this->password; + } + + /** + * Set Client Id function + * + * @param string $client_id + * @return $this + */ + public function setClientId(string $client_id): self + { + $this->client_id = $client_id; + + return $this; + } + + /** + * Get Client Id function + * + * @return string|null + */ + public function getClientId(): ?string + { + return $this->client_id; + } + + /** + * Set Client Secret function + * + * @param string $client_secret + * @return $this + */ + public function setClientSecret(string $client_secret): self + { + $this->client_secret = $client_secret; + + return $this; + } + + /** + * Get Client Secret function + * + * @return string|null + */ + public function getClientSecret(): ?string + { + return $this->client_secret; + } + + /** + * Set Access Token function + * + * @param string $access_token + * @return $this + */ + public function setAccessToken(string $access_token): self + { + $this->access_token = $access_token; + + return $this; + } + + /** + * Get Access Token function + * + * @return string|null + */ + public function getAccessToken(): ?string + { + return $this->access_token; + } + + /** + * Set Gateway Transaction Data function + * + * @param array $gateway_transaction_data + * @return $this + */ + public function setGatewayTransactionData(array $gateway_transaction_data): self + { + $this->gateway_transaction_data = $gateway_transaction_data; + + return $this; + } + + /** + * Get Gateway Transaction Data function + * + * @return array|null + */ + public function getGatewayTransactionData(): ?array + { + return $this->gateway_transaction_data; + } + + /** + * Initialize function + * + * @param array $parameters + * @return $this + * @throws InvalidDataException + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface + */ + public function initialize(array $parameters = []): self + { + parent::initialize($parameters); + + $this->setGatewayCurrency(self::CURRENCY); + $this->setClientId($parameters['client_id'] ?? app('config')->get('iranpayment.digipay.client_id')); + $this->setClientSecret($parameters['client_secret'] ?? app('config')->get('iranpayment.digipay.client_secret')); + $this->setUsername($parameters['username'] ?? app('config')->get('iranpayment.digipay.username')); + $this->setPassword($parameters['password'] ?? app('config')->get('iranpayment.digipay.password')); + $this->setGrantType($parameters['grant_type'] ?? app('config')->get('iranpayment.digipay.grant_type')); + $this->setCallbackUrl($parameters['callback_url'] + ?? app('config')->get('iranpayment.digipay.callback-url') + ?? app('config')->get('iranpayment.callback-url') + ); + + return $this; + } + + /** + * @throws InvalidDataException + */ + protected function prePurchase(): void + { + parent::prePurchase(); + + if ($this->preparedAmount() < 100 || $this->preparedAmount() > 500000000) { + throw InvalidDataException::invalidAmount(); + } + + if (is_null($this->getTransactionCode())) { + throw InvalidDataException::invalidCode(); + } + + $this->setProviderId($this->getTransactionCode()); + } + + public function purchase(): void + { + // login and set access_token + $this->oauth(); + + $data = [ + 'cellNumber' => $this->getMobile(), + 'amount' => $this->preparedAmount(), + 'providerId' => $this->getProviderId(), + 'callbackUrl' => $this->preparedCallbackUrl() + ]; + + try { + $ticketType = 11; + $endpoint = str_replace('{ticketType}', $ticketType, self::REQUEST_URL); + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $endpoint); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Agent: WEB', + 'Digipay-Version: 2022-02-02', + 'Authorization: Bearer ' . $this->getAccessToken(), + 'Content-Type: application/json', + ]); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, $this->getGatewayRequestOptions()['timeout'] ?? 30); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->getGatewayRequestOptions()['connection_timeout'] ?? 60); + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $ch_error = curl_error($ch); + curl_close($ch); + + if ($ch_error) { + throw GatewayException::connectionProblem(new \Exception($ch_error)); + } + + $result = json_decode($response, true); + } catch (\Exception $ex) { + throw GatewayException::connectionProblem($ex); + } + + if ($http_code != 200 && isset($result['result']['status']) && $result['result']['status'] !== 0) { + throw DigipayException::error($result['result']['status']); + } + + $this->setPaymentUrl($result['redirectUrl']); + $this->setTicket($result['ticket']); + } + + protected function postPurchase(): void + { + $this->transactionUpdate([ + 'reference_number' => $this->getTicket(), + ]); + + parent::postPurchase(); + } + + public function purchaseUri(): string + { + return $this->getPaymentUrl(); + } + + /** + * Purchase View Params function + * + * @return array + */ + protected function purchaseViewParams(): array + { + return [ + 'title' => 'دیجی پی', + 'image' => 'https://raw.githubusercontent.com/dena-a/iran-payment/master/resources/assets/img/digipay.png', + 'bank_url' => $this->purchaseUri(), + 'method' => 'GET', + ]; + } + + /** + * @throws IranPaymentException + */ + public function preVerify(): void + { + parent::preVerify(); + + if (! isset($this->request['type']) && empty($this->request['type'])) { + throw DigipayException::error(9000); + } + + if (! isset($this->request['trackingCode']) && empty($this->request['trackingCode'])) { + throw DigipayException::error(9000); + } + + $this->setTicketType($this->request['type']); + $this->setTrackingCode($this->request['trackingCode']); + } + + public function verify(): void + { + // login and get access_token + $this->oauth(); + + try { + $endpoint = str_replace( + ['{trackingCode}', '{ticketType}'], + [$this->getTrackingCode(), $this->getTicketType()], + self::VERIFY_URL + ); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $endpoint); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Authorization: Bearer ' . $this->getAccessToken(), + 'Content-Type: application/json', + ]); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, $this->getGatewayRequestOptions()['timeout'] ?? 30); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->getGatewayRequestOptions()['connection_timeout'] ?? 60); + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $ch_error = curl_error($ch); + curl_close($ch); + + if ($ch_error) { + throw GatewayException::connectionProblem(new \Exception($ch_error)); + } + $result = json_decode($response, true); + } catch (\Exception $ex) { + throw GatewayException::connectionProblem($ex); + } + + if ($http_code != 200 && $result['result']['status'] !== 0) { + throw DigipayException::error($result['result']['status']); + } + + $this->setTrackingCode($result["trackingCode"]); + + $this->setGatewayTransactionData([ + 'fpCode' => $result['fpCode'] ?? null, + 'fpName' => $result['fpName'] ?? null, + 'amount' => $result['amount'] ?? null, + 'paymentGateway' => $result['paymentGateway'] ?? null, + 'additionalInfo' => $result['additionalInfo'] ?? null, + ]); + } + + protected function postVerify(): void + { + $this->transactionUpdate( + [ + 'tracking_code' => $this->getTrackingCode(), + ], + $this->getGatewayTransactionData() ?? [] + ); + + parent::postVerify(); + } + + /** + * @return void + * @throws DigipayException + * @throws GatewayException + */ + private function oauth(): void + { + $fields = [ + 'username' => $this->getUsername(), + 'password' => $this->getPassword(), + 'grant_type' => $this->getGrantType(), + ]; + + try { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, self::LOGIN_URL); + curl_setopt($ch, CURLOPT_USERPWD, "{$this->getClientId()}:{$this->getClientSecret()}"); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Content-Type' => 'application/json', + 'Authorization' => 'Basic ' . base64_encode("{$this->getClientId()}:{$this->getClientSecret()}"), + ]); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); + curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, $this->getGatewayRequestOptions()['timeout'] ?? 30); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->getGatewayRequestOptions()['connection_timeout'] ?? 60); + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $ch_error = curl_error($ch); + curl_close($ch); + + if ($ch_error) { + throw GatewayException::connectionProblem(new \Exception($ch_error)); + } + + $result = json_decode($response); + } catch(\Exception $ex) { + throw GatewayException::connectionProblem($ex); + } + + if ($http_code !== 200) { + if ($http_code == 401) { + throw new DigipayException("نام کاربری یا رمز عبور شما اشتباه می باشد."); + } + + throw new DigipayException("خطا در هنگام احراز هویت."); + } + + if (! isset($result->access_token)) { + throw GatewayException::unknownResponse(json_encode($result)); + } + + $this->setAccessToken($result->access_token); + } +} diff --git a/src/Gateways/Digipay/DigipayException.php b/src/Gateways/Digipay/DigipayException.php new file mode 100644 index 0000000..61b56b2 --- /dev/null +++ b/src/Gateways/Digipay/DigipayException.php @@ -0,0 +1,40 @@ + 'عملیات با موفقیت انجام شد', + + 1054 => 'اطلاعات ورودی اشتباه می باشد', + + 9000 => 'اطلاعات خرید یافت نشد', + 9001 => 'توکن پرداخت معتبر نمی باشد', + + 9003 => 'خرید مورد نظر منقضی شده است', + 9004 => 'خرید مورد نظر درحال انجام است', + 9005 => 'خرید قابل پرداخت نمی باشد', + 9006 => 'خطا در برقراری ارتباط با درگاه پرداخت', + 9007 => 'خرید با موفقیت انجام نشده است', + 9008 => 'این خرید با داده های متفاوتی قبلا ثبت شده است', + 9009 => 'محدوده زمانی تایید تراکنش گذشته است', + 9010 => 'تایید خرید ناموفق بود', + 9011 => 'نتیجه تایید خرید نامشخص است', + 9012 => 'وضعیت خرید برای این درخواست صحیح نمی باشد', + + 9030 => 'ورود شماره همراه برای کاربران ثبت نام شده الزامی است', + 9031 => 'اعطای تیکت برای کاربر مورد نظر امکان پذیر نمی‌باشد', + ]; + + public static function error($error_code) + { + if (! isset(self::$errors[$error_code])) { + return self::unknownResponse((string) $error_code); + } + + return new self(self::$errors[$error_code], 422); + } +} diff --git a/src/Http/CurlRequest.php b/src/Http/CurlRequest.php index af8d577..c69368f 100644 --- a/src/Http/CurlRequest.php +++ b/src/Http/CurlRequest.php @@ -16,7 +16,6 @@ public function __construct(string $url, string $method = "GET") { curl_setopt($this->handle, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, true); curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, strtoupper($method)); - curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, true); $timeout = app('config')->get('iranpayment.timeout'); if ($timeout !== null) { diff --git a/src/IranPayment.php b/src/IranPayment.php index a9bb069..ad0da68 100644 --- a/src/IranPayment.php +++ b/src/IranPayment.php @@ -3,6 +3,7 @@ namespace Dena\IranPayment; use Dena\IranPayment\Gateways\AbstractGateway; +use Dena\IranPayment\Gateways\Digipay\Digipay; use Dena\IranPayment\Gateways\GatewayInterface; use Dena\IranPayment\Gateways\PayIr\PayIr; @@ -31,6 +32,7 @@ class IranPayment const ZARINPAL = 'zarinpal'; const PAYPING = 'payping'; const NOVINOPAY = 'novinopay'; + const DIGIPAY = 'digipay'; const TEST = 'test'; /** @@ -92,6 +94,10 @@ public function setGateway($gateway): self case Novinopay::class: $this->gateway = new Novinopay; break; + case self::DIGIPAY: + case Digipay::class: + $this->gateway = new Digipay; + break; case self::TEST: case TestGateway::class: if (app('config')->get('app.env', 'production') === 'production' || @@ -142,6 +148,7 @@ public function getSupportedGateways(): array self::PAYIR, self::PAYPING, self::NOVINOPAY, + self::DIGIPAY, ]; if (app('config')->get('app.env', 'production') !== 'production' && From 19843583629adfa20018fafc9d2d7bac933e3392 Mon Sep 17 00:00:00 2001 From: mohammad hossein Date: Mon, 24 Jun 2024 17:59:22 +0330 Subject: [PATCH 03/10] Update README.md --- README.md | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index d234998..f79e64d 100644 --- a/README.md +++ b/README.md @@ -16,19 +16,20 @@ Accepting [Sadad (Melli)](https://sadadpsp.ir/), [Pay.ir](https://pay.ir/), [Zar ## Gateways -Logo | Gateway | Description | Available | Tested | Last Update ---- | --- | --- | --- | --- | --- - | [Sadad (Melli)](https://sadadpsp.ir/) | بانک ملی (سداد) | ✓ | ✓ | 2020/09/10 - | [Pay.ir](https://pay.ir/) | پرداخت پی | ✓ | ✓ | 2020/08/03 - | [Zarinpal](https://zarinpal.com/) | زرین پال | ✓ | ✓ | 2020/08/03 - | [Payping](https://www.payping.ir/) | پی پینگ | ✓ | ✓ | 2020/08/04 - | [Novinopay](https://www.novinopay.com/) | نوینو پرداخت | ✓ | ✓ | 2022/03/23 - --- | [Qeroun](https://qeroun.com/) | قرون - خرید امن با ایجاد توافق‌نامه | - | - | - - --- | [Saman (Sep)](https://www.sep.ir/) | (سپ) بانک سامان | - | - | - - --- | [Mellat (Behpardakht)](http://www.behpardakht.com/) | (به پرداخت) بانک ملت | - | - | - - --- | [Parsian (Pec)](https://www.pec.ir/) | (پک) بانک پارسیان | - | - | - - --- | [Pasargad (Pep)](https://www.pep.co.ir/) | (پپ) بانک پاسارگاد | - | - | - - --- | [Zibal](https://zibal.ir/) | زیبال | - | - | - +Logo | Gateway | Description | Available | Tested | Last Update +--- |-----------------------------------------------------|-------------------------------------| --- | --- | --- + | [Sadad (Melli)](https://sadadpsp.ir/) | بانک ملی (سداد) | ✓ | ✓ | 2020/09/10 + | [Pay.ir](https://pay.ir/) | پرداخت پی | ✓ | ✓ | 2020/08/03 + | [Zarinpal](https://zarinpal.com/) | زرین پال | ✓ | ✓ | 2020/08/03 + | [Payping](https://www.payping.ir/) | پی پینگ | ✓ | ✓ | 2020/08/04 + | [Novinopay](https://www.novinopay.com/) | نوینو پرداخت | ✓ | ✓ | 2022/03/23 + | [Digipay](https://www.mydigipay.com/) | دیجی پی | ✓ | ✓ | 2024/06/24 + --- | [Qeroun](https://qeroun.com/) | قرون - خرید امن با ایجاد توافق‌نامه | - | - | - + --- | [Saman (Sep)](https://www.sep.ir/) | (سپ) بانک سامان | - | - | - + --- | [Mellat (Behpardakht)](http://www.behpardakht.com/) | (به پرداخت) بانک ملت | - | - | - + --- | [Parsian (Pec)](https://www.pec.ir/) | (پک) بانک پارسیان | - | - | - + --- | [Pasargad (Pep)](https://www.pep.co.ir/) | (پپ) بانک پاسارگاد | - | - | - + --- | [Zibal](https://zibal.ir/) | زیبال | - | - | - ## Requirements From b6355b9824d6f22f80ff651f82e3769183aec494 Mon Sep 17 00:00:00 2001 From: mohammad hossein Date: Wed, 26 Jun 2024 09:58:32 +0330 Subject: [PATCH 04/10] Digipay gateway updated --- src/Gateways/Digipay/Digipay.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Gateways/Digipay/Digipay.php b/src/Gateways/Digipay/Digipay.php index fe53bc9..6d4674c 100644 --- a/src/Gateways/Digipay/Digipay.php +++ b/src/Gateways/Digipay/Digipay.php @@ -13,9 +13,9 @@ class Digipay extends AbstractGateway implements GatewayInterface { - private const LOGIN_URL = "https://uatweb.mydigipay.info/digipay/api/oauth/token"; - private const REQUEST_URL = "https://uatweb.mydigipay.info/digipay/api/tickets/business?type={ticketType}"; - private const VERIFY_URL = "https://uatweb.mydigipay.info/digipay/api/purchases/verify/{trackingCode}?type={ticketType}"; + private const LOGIN_URL = "https://api.mydigipay.com/digipay/api/oauth/token"; + private const REQUEST_URL = "https://api.mydigipay.com/digipay/api/tickets/business?type={ticketType}"; + private const VERIFY_URL = "https://api.mydigipay.com/digipay/api/purchases/verify/{trackingCode}?type={ticketType}"; public const CURRENCY = Currency::IRR; /** @@ -47,7 +47,7 @@ class Digipay extends AbstractGateway implements GatewayInterface protected ?string $ticket; /** - * Tracking Code variable + * Ticket Type variable * * @var int|null */ @@ -72,7 +72,7 @@ class Digipay extends AbstractGateway implements GatewayInterface * * @var string|null */ - protected ?string $grantType; + protected ?string $grant_type; /** * Client Id variable @@ -253,12 +253,12 @@ public function getUsername(): ?string /** * Set Grant Type function * - * @param string $grantType + * @param string $grant_type * @return $this */ - public function setGrantType(string $grantType = 'password'): self + public function setGrantType(string $grant_type = 'password'): self { - $this->grantType = $grantType; + $this->grant_type = $grant_type; return $this; } @@ -270,7 +270,7 @@ public function setGrantType(string $grantType = 'password'): self */ public function getGrantType(): ?string { - return $this->grantType; + return $this->grant_type; } /** From 23e1467b013d2132cd9f040a4b795dbd27d6fbf0 Mon Sep 17 00:00:00 2001 From: mohammad hossein Date: Mon, 8 Jul 2024 15:03:33 +0330 Subject: [PATCH 05/10] Digipay verify method updated --- src/Gateways/Digipay/Digipay.php | 53 ++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/Gateways/Digipay/Digipay.php b/src/Gateways/Digipay/Digipay.php index 6d4674c..bb472e8 100644 --- a/src/Gateways/Digipay/Digipay.php +++ b/src/Gateways/Digipay/Digipay.php @@ -16,6 +16,7 @@ class Digipay extends AbstractGateway implements GatewayInterface private const LOGIN_URL = "https://api.mydigipay.com/digipay/api/oauth/token"; private const REQUEST_URL = "https://api.mydigipay.com/digipay/api/tickets/business?type={ticketType}"; private const VERIFY_URL = "https://api.mydigipay.com/digipay/api/purchases/verify/{trackingCode}?type={ticketType}"; + private const DELIVER_URL = "https://api.mydigipay.com/digipay/api/purchases/deliver?type={ticketType}"; public const CURRENCY = Currency::IRR; /** @@ -532,6 +533,10 @@ public function preVerify(): void $this->setTrackingCode($this->request['trackingCode']); } + /** + * @throws GatewayException + * @throws DigipayException + */ public function verify(): void { // login and get access_token @@ -574,12 +579,16 @@ public function verify(): void $this->setTrackingCode($result["trackingCode"]); + $this->deliver($this->getTrackingCode(), $this->getTicketType()); + $this->setGatewayTransactionData([ + 'rrn' => $result['rrn'] ?? null, 'fpCode' => $result['fpCode'] ?? null, 'fpName' => $result['fpName'] ?? null, 'amount' => $result['amount'] ?? null, 'paymentGateway' => $result['paymentGateway'] ?? null, 'additionalInfo' => $result['additionalInfo'] ?? null, + 'finalizeDate' => $result['finalizeDate'] ?? null, ]); } @@ -595,6 +604,50 @@ protected function postVerify(): void parent::postVerify(); } + public function deliver(string $trackingCode, int $type): void + { + $data = [ + 'deliveryDate' => now()->timestamp, + 'invoiceNumber' => $this->getPayableId(), + 'trackingCode' => $trackingCode, + 'products' => [$this->transaction->description] + ]; + + try { + $endpoint = str_replace('{ticketType}', $type, self::DELIVER_URL); + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $endpoint); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Agent: WEB', + 'Digipay-Version: 2022-02-02', + 'Authorization: Bearer ' . $this->getAccessToken(), + 'Content-Type: application/json', + ]); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, $this->getGatewayRequestOptions()['timeout'] ?? 30); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->getGatewayRequestOptions()['connection_timeout'] ?? 60); + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $ch_error = curl_error($ch); + curl_close($ch); + + if ($ch_error) { + throw GatewayException::connectionProblem(new \Exception($ch_error)); + } + + $result = json_decode($response, true); + } catch (\Exception $ex) { + throw GatewayException::connectionProblem($ex); + } + + if ($http_code != 200 && isset($result['result']['status']) && $result['result']['status'] !== 0) { + throw DigipayException::error($result['result']['status']); + } + } + /** * @return void * @throws DigipayException From 5a24e88838251b0b333ea304a177da07c09f398e Mon Sep 17 00:00:00 2001 From: MohammadMehrabani Date: Mon, 5 Aug 2024 15:59:45 +0330 Subject: [PATCH 06/10] Digipay gateway updated --- README.md | 28 +++++++++++------------ config/iranpayment.php | 1 + src/Gateways/Digipay/Digipay.php | 27 +++++++++++----------- src/Gateways/Digipay/DigipayException.php | 2 +- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index f79e64d..28089b2 100644 --- a/README.md +++ b/README.md @@ -16,20 +16,20 @@ Accepting [Sadad (Melli)](https://sadadpsp.ir/), [Pay.ir](https://pay.ir/), [Zar ## Gateways -Logo | Gateway | Description | Available | Tested | Last Update ---- |-----------------------------------------------------|-------------------------------------| --- | --- | --- - | [Sadad (Melli)](https://sadadpsp.ir/) | بانک ملی (سداد) | ✓ | ✓ | 2020/09/10 - | [Pay.ir](https://pay.ir/) | پرداخت پی | ✓ | ✓ | 2020/08/03 - | [Zarinpal](https://zarinpal.com/) | زرین پال | ✓ | ✓ | 2020/08/03 - | [Payping](https://www.payping.ir/) | پی پینگ | ✓ | ✓ | 2020/08/04 - | [Novinopay](https://www.novinopay.com/) | نوینو پرداخت | ✓ | ✓ | 2022/03/23 - | [Digipay](https://www.mydigipay.com/) | دیجی پی | ✓ | ✓ | 2024/06/24 - --- | [Qeroun](https://qeroun.com/) | قرون - خرید امن با ایجاد توافق‌نامه | - | - | - - --- | [Saman (Sep)](https://www.sep.ir/) | (سپ) بانک سامان | - | - | - - --- | [Mellat (Behpardakht)](http://www.behpardakht.com/) | (به پرداخت) بانک ملت | - | - | - - --- | [Parsian (Pec)](https://www.pec.ir/) | (پک) بانک پارسیان | - | - | - - --- | [Pasargad (Pep)](https://www.pep.co.ir/) | (پپ) بانک پاسارگاد | - | - | - - --- | [Zibal](https://zibal.ir/) | زیبال | - | - | - +Logo | Gateway | Description | Available | Tested | Last Update +--- |-----------------------------------------------------|-------------------------------------|------------------|-------| --- + | [Sadad (Melli)](https://sadadpsp.ir/) | بانک ملی (سداد) | ✓ | ✓ | 2020/09/10 + | [Pay.ir](https://pay.ir/) | پرداخت پی | ✓ | ✓ | 2020/08/03 + | [Zarinpal](https://zarinpal.com/) | زرین پال | ✓ | ✓ | 2020/08/03 + | [Payping](https://www.payping.ir/) | پی پینگ | ✓ | ✓ | 2020/08/04 + | [Novinopay](https://www.novinopay.com/) | نوینو پرداخت | ✓ | ✓ | 2022/03/23 + | [Digipay](https://www.mydigipay.com/) | دیجی پی | CPG ✓ BPG/BNPL ✓ | ✓ | 2024/06/24 + --- | [Qeroun](https://qeroun.com/) | قرون - خرید امن با ایجاد توافق‌نامه | - | - | - + --- | [Saman (Sep)](https://www.sep.ir/) | (سپ) بانک سامان | - | - | - + --- | [Mellat (Behpardakht)](http://www.behpardakht.com/) | (به پرداخت) بانک ملت | - | - | - + --- | [Parsian (Pec)](https://www.pec.ir/) | (پک) بانک پارسیان | - | - | - + --- | [Pasargad (Pep)](https://www.pep.co.ir/) | (پپ) بانک پاسارگاد | - | - | - + --- | [Zibal](https://zibal.ir/) | زیبال | - | - | - ## Requirements diff --git a/config/iranpayment.php b/config/iranpayment.php index 1b0b332..32d0aaa 100644 --- a/config/iranpayment.php +++ b/config/iranpayment.php @@ -115,6 +115,7 @@ 'username' => env('DIGIPAY_USERNAME', ''), 'password' => env('DIGIPAY_PASSWORD', ''), 'grant_type' => env('DIGIPAY_GRANT_TYPE', 'password'), + 'ticket_type' => env('DIGIPAY_TICKET_TYPE', 11), // 11 => supported all types (CPG, BPG/BNPL, WALLET, IPG) 'callback-url' => env('DIGIPAY_CALLBACK_URL', ''), ], diff --git a/src/Gateways/Digipay/Digipay.php b/src/Gateways/Digipay/Digipay.php index bb472e8..5e9913e 100644 --- a/src/Gateways/Digipay/Digipay.php +++ b/src/Gateways/Digipay/Digipay.php @@ -103,6 +103,15 @@ class Digipay extends AbstractGateway implements GatewayInterface */ protected ?array $gateway_transaction_data = null; + /** + * @throws DigipayException + * @throws GatewayException + */ + public function __construct() + { + $this->oauth(); + } + /** * Gateway Name function * @@ -408,6 +417,7 @@ public function initialize(array $parameters = []): self $this->setUsername($parameters['username'] ?? app('config')->get('iranpayment.digipay.username')); $this->setPassword($parameters['password'] ?? app('config')->get('iranpayment.digipay.password')); $this->setGrantType($parameters['grant_type'] ?? app('config')->get('iranpayment.digipay.grant_type')); + $this->setTicketType($parameters['ticket_type'] ?? app('config')->get('iranpayment.digipay.ticket_type')); $this->setCallbackUrl($parameters['callback_url'] ?? app('config')->get('iranpayment.digipay.callback-url') ?? app('config')->get('iranpayment.callback-url') @@ -436,19 +446,15 @@ protected function prePurchase(): void public function purchase(): void { - // login and set access_token - $this->oauth(); - $data = [ - 'cellNumber' => $this->getMobile(), + 'cellNumber' => $this->getMobile(), // e.g. 09xxxxxxxxx 'amount' => $this->preparedAmount(), 'providerId' => $this->getProviderId(), 'callbackUrl' => $this->preparedCallbackUrl() ]; try { - $ticketType = 11; - $endpoint = str_replace('{ticketType}', $ticketType, self::REQUEST_URL); + $endpoint = str_replace('{ticketType}', $this->getTicketType(), self::REQUEST_URL); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $endpoint); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); @@ -539,9 +545,6 @@ public function preVerify(): void */ public function verify(): void { - // login and get access_token - $this->oauth(); - try { $endpoint = str_replace( ['{trackingCode}', '{ticketType}'], @@ -690,11 +693,7 @@ private function oauth(): void } if ($http_code !== 200) { - if ($http_code == 401) { - throw new DigipayException("نام کاربری یا رمز عبور شما اشتباه می باشد."); - } - - throw new DigipayException("خطا در هنگام احراز هویت."); + throw GatewayException::connectionProblem(new \Exception((string) $http_code)); } if (! isset($result->access_token)) { diff --git a/src/Gateways/Digipay/DigipayException.php b/src/Gateways/Digipay/DigipayException.php index 61b56b2..2dcfa76 100644 --- a/src/Gateways/Digipay/DigipayException.php +++ b/src/Gateways/Digipay/DigipayException.php @@ -35,6 +35,6 @@ public static function error($error_code) return self::unknownResponse((string) $error_code); } - return new self(self::$errors[$error_code], 422); + return new self(self::$errors[$error_code], $error_code); } } From a1e6ed53d1868bf597ad3b90cf691afccb66ef38 Mon Sep 17 00:00:00 2001 From: MohammadMehrabani Date: Mon, 5 Aug 2024 17:24:52 +0330 Subject: [PATCH 07/10] call oauth endpoint when initialize --- src/Gateways/Digipay/Digipay.php | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/Gateways/Digipay/Digipay.php b/src/Gateways/Digipay/Digipay.php index 5e9913e..cad3e75 100644 --- a/src/Gateways/Digipay/Digipay.php +++ b/src/Gateways/Digipay/Digipay.php @@ -103,15 +103,6 @@ class Digipay extends AbstractGateway implements GatewayInterface */ protected ?array $gateway_transaction_data = null; - /** - * @throws DigipayException - * @throws GatewayException - */ - public function __construct() - { - $this->oauth(); - } - /** * Gateway Name function * @@ -406,6 +397,8 @@ public function getGatewayTransactionData(): ?array * @throws InvalidDataException * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface + * @throws DigipayException + * @throws GatewayException */ public function initialize(array $parameters = []): self { @@ -423,6 +416,8 @@ public function initialize(array $parameters = []): self ?? app('config')->get('iranpayment.callback-url') ); + $this->oauth(); + return $this; } From 26397b294c81606e9e4af009c156327f229faeca Mon Sep 17 00:00:00 2001 From: Dena Date: Sun, 11 Aug 2024 19:03:16 +0330 Subject: [PATCH 08/10] Update README.md --- README.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 3cb9d44..91be922 100644 --- a/README.md +++ b/README.md @@ -16,20 +16,20 @@ Accepting [Sadad (Melli)](https://sadadpsp.ir/), [Saman (Sep)](https://www.sep.i ## Gateways -| Logo | Gateway | Description | Available | Tested | Last Update | -|------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------|-------------------------------------|-----------|--------|-------------| -| | [Sadad (Melli)](https://sadadpsp.ir/) | بانک ملی (سداد) | ✓ | ✓ | 2020/09/10 | -| | [Saman (Sep)](https://www.sep.ir/) | (سپ) بانک سامان | ✓ | ✓ | 2020/08/08 | -| | [Pay.ir](https://pay.ir/) | پرداخت پی | ✓ | ✓ | 2020/08/03 | -| | [Zarinpal](https://zarinpal.com/) | زرین پال | ✓ | ✓ | 2020/08/03 | -| | [Payping](https://www.payping.ir/) | پی پینگ | ✓ | ✓ | 2020/08/04 | -| | [Novinopay](https://www.novinopay.com/) | نوینو پرداخت | ✓ | ✓ | 2022/03/23 | -| --- | [Qeroun](https://qeroun.com/) | قرون - خرید امن با ایجاد توافق‌نامه | - | - | - | -| --- | [Mellat (Behpardakht)](http://www.behpardakht.com/) | (به پرداخت) بانک ملت | - | - | - | -| --- | [Parsian (Pec)](https://www.pec.ir/) | (پک) بانک پارسیان | - | - | - | -| --- | [Pasargad (Pep)](https://www.pep.co.ir/) | (پپ) بانک پاسارگاد | - | - | - | -| --- | [Zibal](https://zibal.ir/) | زیبال | - | - | - | -| --- | [IDPay](https://idpay.ir/) | آیدی پی | - | - | - | +Logo | Gateway | Description | Available | Tested | Last Update +--- |-----------------------------------------------------|-------------------------------------|------------------|-------| --- + | [Sadad (Melli)](https://sadadpsp.ir/) | بانک ملی (سداد) | ✓ | ✓ | 2020/09/10 + | [Pay.ir](https://pay.ir/) | پرداخت پی | ✓ | ✓ | 2020/08/03 + | [Zarinpal](https://zarinpal.com/) | زرین پال | ✓ | ✓ | 2020/08/03 + | [Payping](https://www.payping.ir/) | پی پینگ | ✓ | ✓ | 2020/08/04 + | [Novinopay](https://www.novinopay.com/) | نوینو پرداخت | ✓ | ✓ | 2022/03/23 + | [Digipay](https://www.mydigipay.com/) | دیجی پی | CPG ✓ BPG/BNPL ✓ | ✓ | 2024/06/24 + --- | [Qeroun](https://qeroun.com/) | قرون - خرید امن با ایجاد توافق‌نامه | - | - | - + --- | [Saman (Sep)](https://www.sep.ir/) | (سپ) بانک سامان | - | - | - + --- | [Mellat (Behpardakht)](http://www.behpardakht.com/) | (به پرداخت) بانک ملت | - | - | - + --- | [Parsian (Pec)](https://www.pec.ir/) | (پک) بانک پارسیان | - | - | - + --- | [Pasargad (Pep)](https://www.pep.co.ir/) | (پپ) بانک پاسارگاد | - | - | - + --- | [Zibal](https://zibal.ir/) | زیبال | - | - | - ## Requirements From 3220ac46f96fb18ead008dc2f4366dc3876b7679 Mon Sep 17 00:00:00 2001 From: Dena Date: Sun, 11 Aug 2024 19:04:27 +0330 Subject: [PATCH 09/10] Update README.md --- README.md | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 91be922..9571d8c 100644 --- a/README.md +++ b/README.md @@ -16,20 +16,23 @@ Accepting [Sadad (Melli)](https://sadadpsp.ir/), [Saman (Sep)](https://www.sep.i ## Gateways -Logo | Gateway | Description | Available | Tested | Last Update ---- |-----------------------------------------------------|-------------------------------------|------------------|-------| --- - | [Sadad (Melli)](https://sadadpsp.ir/) | بانک ملی (سداد) | ✓ | ✓ | 2020/09/10 - | [Pay.ir](https://pay.ir/) | پرداخت پی | ✓ | ✓ | 2020/08/03 - | [Zarinpal](https://zarinpal.com/) | زرین پال | ✓ | ✓ | 2020/08/03 - | [Payping](https://www.payping.ir/) | پی پینگ | ✓ | ✓ | 2020/08/04 - | [Novinopay](https://www.novinopay.com/) | نوینو پرداخت | ✓ | ✓ | 2022/03/23 - | [Digipay](https://www.mydigipay.com/) | دیجی پی | CPG ✓ BPG/BNPL ✓ | ✓ | 2024/06/24 - --- | [Qeroun](https://qeroun.com/) | قرون - خرید امن با ایجاد توافق‌نامه | - | - | - - --- | [Saman (Sep)](https://www.sep.ir/) | (سپ) بانک سامان | - | - | - - --- | [Mellat (Behpardakht)](http://www.behpardakht.com/) | (به پرداخت) بانک ملت | - | - | - - --- | [Parsian (Pec)](https://www.pec.ir/) | (پک) بانک پارسیان | - | - | - - --- | [Pasargad (Pep)](https://www.pep.co.ir/) | (پپ) بانک پاسارگاد | - | - | - - --- | [Zibal](https://zibal.ir/) | زیبال | - | - | - +## Gateways + +| Logo | Gateway | Description | Available | Tested | Last Update | +|------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------|-------------------------------------|------------------|--------|-------------| +| | [Sadad (Melli)](https://sadadpsp.ir/) | بانک ملی (سداد) | ✓ | ✓ | 2020/09/10 | +| | [Saman (Sep)](https://www.sep.ir/) | (سپ) بانک سامان | ✓ | ✓ | 2020/08/08 | +| | [Pay.ir](https://pay.ir/) | پرداخت پی | ✓ | ✓ | 2020/08/03 | +| | [Zarinpal](https://zarinpal.com/) | زرین پال | ✓ | ✓ | 2020/08/03 | +| | [Payping](https://www.payping.ir/) | پی پینگ | ✓ | ✓ | 2020/08/04 | +| | [Novinopay](https://www.novinopay.com/) | نوینو پرداخت | ✓ | ✓ | 2022/03/23 | +| | [Digipay](https://www.mydigipay.com/) | دیجی پی | CPG ✓ BPG/BNPL ✓ | ✓ | 2024/06/24 | +| --- | [Qeroun](https://qeroun.com/) | قرون - خرید امن با ایجاد توافق‌نامه | - | - | - | +| --- | [Mellat (Behpardakht)](http://www.behpardakht.com/) | (به پرداخت) بانک ملت | - | - | - | +| --- | [Parsian (Pec)](https://www.pec.ir/) | (پک) بانک پارسیان | - | - | - | +| --- | [Pasargad (Pep)](https://www.pep.co.ir/) | (پپ) بانک پاسارگاد | - | - | - | +| --- | [Zibal](https://zibal.ir/) | زیبال | - | - | - | +| --- | [IDPay](https://idpay.ir/) | آیدی پی | - | - | - | ## Requirements From 7dbc057826a9cbf1682a5c6feff7e2baf0c90cdf Mon Sep 17 00:00:00 2001 From: Dena Date: Sun, 11 Aug 2024 20:42:39 +0330 Subject: [PATCH 10/10] Add Laravel Pint Fix codes style --- .gitignore | 4 +- README.md | 2 +- composer.json | 7 +- composer.lock | 8065 +++++++++++++++++ config/iranpayment.php | 6 +- ..._create_iranpayment_transactions_table.php | 65 +- ...0_alter_iranpayment_transactions_table.php | 5 +- docker-compose.yml | 3 +- src/Exceptions/GatewayException.php | 8 +- src/Exceptions/GatewayNotFoundException.php | 4 +- src/Exceptions/InvalidDataException.php | 30 +- src/Exceptions/InvalidRequestException.php | 4 +- src/Exceptions/IranPaymentException.php | 2 +- src/Exceptions/SucceedRetryException.php | 4 +- src/Exceptions/TransactionFailedException.php | 5 +- .../TransactionNotFoundException.php | 6 +- src/Gateways/AbstractGateway.php | 114 +- src/Gateways/Digipay/Digipay.php | 108 +- src/Gateways/Digipay/DigipayException.php | 44 +- src/Gateways/GatewayInterface.php | 4 +- src/Gateways/Novinopay/Novinopay.php | 79 +- src/Gateways/Novinopay/NovinopayException.php | 22 +- src/Gateways/PayIr/PayIr.php | 192 +- src/Gateways/PayIr/PayIrException.php | 4 +- src/Gateways/PayPing/PayPing.php | 253 +- src/Gateways/PayPing/PayPingException.php | 6 +- src/Gateways/Sadad/Sadad.php | 97 +- src/Gateways/Sadad/SadadException.php | 9 +- src/Gateways/Saman/Saman.php | 44 +- src/Gateways/Saman/SamanException.php | 44 +- src/Gateways/Test/TestException.php | 6 +- src/Gateways/Test/TestGateway.php | 13 +- src/Gateways/Test/TestGatewayController.php | 6 +- src/Gateways/Zarinpal/Zarinpal.php | 154 +- src/Gateways/Zarinpal/ZarinpalException.php | 14 +- src/Helpers/Currency.php | 26 +- src/Helpers/Helpers.php | 22 +- src/Http/CurlRequest.php | 9 +- src/Http/HttpRequestInterface.php | 5 +- src/IranPayment.php | 70 +- src/IranPaymentServiceProvider.php | 2 - src/Models/IranPaymentTransaction.php | 27 +- src/Traits/IranPaymentDatabase.php | 4 - src/Traits/Payable.php | 10 +- src/Traits/PaymentData.php | 42 +- src/Traits/TransactionData.php | 80 +- src/Traits/UserData.php | 25 - tests/IranpaymentPayIrGatewayTest.php | 11 +- tests/IranpaymentPaypingGatewayTest.php | 13 +- tests/IranpaymentSadadGatewayTest.php | 24 +- tests/IranpaymentSamanGatewayTest.php | 10 +- tests/IranpaymentTestGatewayTest.php | 10 +- tests/IranpaymentZarinpalGatewayTest.php | 15 +- tests/NovinopayTest.php | 13 +- .../2019_09_11_153311_create_test_tables.php | 4 +- 55 files changed, 8771 insertions(+), 1084 deletions(-) create mode 100644 composer.lock diff --git a/.gitignore b/.gitignore index 1984757..93ff58c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ /vendor .phpunit.result.cache -composer.lock +.php-cs-fixer.cache /.idea /.vscode -/*.code-workspace \ No newline at end of file +/*.code-workspace diff --git a/README.md b/README.md index 9571d8c..ba9b026 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Accepting [Sadad (Melli)](https://sadadpsp.ir/), [Saman (Sep)](https://www.sep.i | Logo | Gateway | Description | Available | Tested | Last Update | |------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------|-------------------------------------|------------------|--------|-------------| | | [Sadad (Melli)](https://sadadpsp.ir/) | بانک ملی (سداد) | ✓ | ✓ | 2020/09/10 | -| | [Saman (Sep)](https://www.sep.ir/) | (سپ) بانک سامان | ✓ | ✓ | 2020/08/08 | +| | [Saman (Sep)](https://www.sep.ir/) | (سپ) بانک سامان | ✓ | ✓ | 2020/08/03 | | | [Pay.ir](https://pay.ir/) | پرداخت پی | ✓ | ✓ | 2020/08/03 | | | [Zarinpal](https://zarinpal.com/) | زرین پال | ✓ | ✓ | 2020/08/03 | | | [Payping](https://www.payping.ir/) | پی پینگ | ✓ | ✓ | 2020/08/04 | diff --git a/composer.json b/composer.json index 35036a4..c8edd42 100644 --- a/composer.json +++ b/composer.json @@ -48,7 +48,8 @@ "fakerphp/faker": "^1.4", "phpstan/phpstan": "^0.12.0@dev", "orchestra/testbench": "^6.0", - "doctrine/dbal": "^3.0" + "doctrine/dbal": "^3.0", + "laravel/pint": "^1.17" }, "autoload": { "psr-4": { @@ -67,6 +68,10 @@ ] } }, + "scripts": { + "check-style": "./vendor/bin/pint --test", + "fix-style": "./vendor/bin/pint" + }, "minimum-stability": "dev", "prefer-stable": true } diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..5a07549 --- /dev/null +++ b/composer.lock @@ -0,0 +1,8065 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "192c09b3c932a764347deedc945b8fc5", + "packages": [ + { + "name": "brick/math", + "version": "0.12.1", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "5.16.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "bignumber", + "brick", + "decimal", + "integer", + "math", + "mathematics", + "rational" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.12.1" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-11-29T23:19:16+00:00" + }, + { + "name": "carbonphp/carbon-doctrine-types", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "doctrine/dbal": "<3.7.0 || >=4.0.0" + }, + "require-dev": { + "doctrine/dbal": "^3.7.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2023-12-11T17:09:12+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" + }, + "time": "2024-07-08T12:26:09+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2024-02-18T20:23:39+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2022-02-28T11:07:21+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.3.3", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-webmozart-assert": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2023-08-10T19:36:49+00:00" + }, + { + "name": "egulias/email-validator", + "version": "2.1.25", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.10" + }, + "require-dev": { + "dominicsayers/isemail": "^3.0.7", + "phpunit/phpunit": "^4.8.36|^7.5.15", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2020-12-29T14:50:06+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:45:45+00:00" + }, + { + "name": "laravel/framework", + "version": "v8.83.27", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "e1afe088b4ca613fb96dc57e6d8dbcb8cc2c6b49" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/e1afe088b4ca613fb96dc57e6d8dbcb8cc2c6b49", + "reference": "e1afe088b4ca613fb96dc57e6d8dbcb8cc2c6b49", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.4|^2.0", + "dragonmantank/cron-expression": "^3.0.2", + "egulias/email-validator": "^2.1.10", + "ext-json": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "laravel/serializable-closure": "^1.0", + "league/commonmark": "^1.3|^2.0.2", + "league/flysystem": "^1.1", + "monolog/monolog": "^2.0", + "nesbot/carbon": "^2.53.1", + "opis/closure": "^3.6", + "php": "^7.3|^8.0", + "psr/container": "^1.0", + "psr/log": "^1.0|^2.0", + "psr/simple-cache": "^1.0", + "ramsey/uuid": "^4.2.2", + "swiftmailer/swiftmailer": "^6.3", + "symfony/console": "^5.4", + "symfony/error-handler": "^5.4", + "symfony/finder": "^5.4", + "symfony/http-foundation": "^5.4", + "symfony/http-kernel": "^5.4", + "symfony/mime": "^5.4", + "symfony/process": "^5.4", + "symfony/routing": "^5.4", + "symfony/var-dumper": "^5.4", + "tijsverkoyen/css-to-inline-styles": "^2.2.2", + "vlucas/phpdotenv": "^5.4.1", + "voku/portable-ascii": "^1.6.1" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.0", + "psr/simple-cache-implementation": "1.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.198.1", + "doctrine/dbal": "^2.13.3|^3.1.4", + "filp/whoops": "^2.14.3", + "guzzlehttp/guzzle": "^6.5.5|^7.0.1", + "league/flysystem-cached-adapter": "^1.0", + "mockery/mockery": "^1.4.4", + "orchestra/testbench-core": "^6.27", + "pda/pheanstalk": "^4.0", + "phpunit/phpunit": "^8.5.19|^9.5.8", + "predis/predis": "^1.1.9", + "symfony/cache": "^5.4" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.198.1).", + "brianium/paratest": "Required to run tests in parallel (^6.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.4).", + "ext-bcmath": "Required to use the multiple_of validation rule.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "guzzlehttp/guzzle": "Required to use the HTTP Client, Mailgun mail driver and the ping methods on schedules (^6.5.5|^7.0.1).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", + "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", + "mockery/mockery": "Required to use mocking (^1.4.4).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^8.5.19|^9.5.8).", + "predis/predis": "Required to use the predis connector (^1.1.9).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0|^5.0|^6.0|^7.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^5.4).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^5.4).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0).", + "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2022-12-08T15:28:55+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.3.4", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "61b87392d986dc49ad5ef64e75b1ff5fee24ef81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/61b87392d986dc49ad5ef64e75b1ff5fee24ef81", + "reference": "61b87392d986dc49ad5ef64e75b1ff5fee24ef81", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "illuminate/support": "^8.0|^9.0|^10.0|^11.0", + "nesbot/carbon": "^2.61|^3.0", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11|^6.2.0|^7.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2024-08-02T07:48:17+00:00" + }, + { + "name": "league/commonmark", + "version": "2.5.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "ac815920de0eff6de947eac0a6a94e5ed0fb147c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/ac815920de0eff6de947eac0a6a94e5ed0fb147c", + "reference": "ac815920de0eff6de947eac0a6a94e5ed0fb147c", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.0", + "commonmark/commonmark.js": "0.31.0", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 || ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.6-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2024-07-24T12:52:09+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "1.1.10", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/3239285c825c152bcc315fe0e87d6b55f5972ed1", + "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/mime-type-detection": "^1.3", + "php": "^7.2.5 || ^8.0" + }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, + "require-dev": { + "phpspec/prophecy": "^1.11.1", + "phpunit/phpunit": "^8.5.8" + }, + "suggest": { + "ext-ftp": "Allows you to use FTP server storage", + "ext-openssl": "Allows you to use FTPS server storage", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", + "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/1.1.10" + }, + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "other" + } + ], + "time": "2022-10-04T09:16:37+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.15.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.15.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-01-28T23:22:08+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.9.3", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "a30bfe2e142720dfa990d0a7e573997f5d884215" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/a30bfe2e142720dfa990d0a7e573997f5d884215", + "reference": "a30bfe2e142720dfa990d0a7e573997f5d884215", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2@dev", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.38 || ^9.6.19", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.9.3" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2024-04-12T20:52:51+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.72.5", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/afd46589c216118ecd48ff2b95d77596af1e57ed", + "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "*", + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0", + "doctrine/orm": "^2.7 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-2.x": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2024-06-03T19:18:41+00:00" + }, + { + "name": "nette/schema", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.3" + }, + "require-dev": { + "nette/tester": "^2.4", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.0" + }, + "time": "2023-12-11T11:54:22+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.5", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "shasum": "" + }, + "require": { + "php": "8.0 - 8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.5" + }, + "time": "2024-08-07T15:39:19+00:00" + }, + { + "name": "opis/closure", + "version": "3.6.3", + "source": { + "type": "git", + "url": "https://github.com/opis/closure.git", + "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/opis/closure/zipball/3d81e4309d2a927abbe66df935f4bb60082805ad", + "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0 || ^8.0" + }, + "require-dev": { + "jeremeamia/superclosure": "^2.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.6.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php" + ], + "psr-4": { + "Opis\\Closure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marius Sarca", + "email": "marius.sarca@gmail.com" + }, + { + "name": "Sorin Sarca", + "email": "sarca_sorin@hotmail.com" + } + ], + "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", + "homepage": "https://opis.io/closure", + "keywords": [ + "anonymous functions", + "closure", + "function", + "serializable", + "serialization", + "serialize" + ], + "support": { + "issues": "https://github.com/opis/closure/issues", + "source": "https://github.com/opis/closure/tree/3.6.3" + }, + "time": "2022-01-27T09:35:39+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.3", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:41:07+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/log", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/2.0.0" + }, + "time": "2021-07-14T16:41:46+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.6", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.6" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2024-04-27T21:32:50+00:00" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8a5d5072dca8f48460fce2f4131fcc495eec654c", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.0|^3.1", + "php": ">=7.0.0", + "symfony/polyfill-iconv": "^1.0", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "symfony/phpunit-bridge": "^4.4|^5.4" + }, + "suggest": { + "ext-intl": "Needed to support internationalized email addresses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.2-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "https://swiftmailer.symfony.com", + "keywords": [ + "email", + "mail", + "mailer" + ], + "support": { + "issues": "https://github.com/swiftmailer/swiftmailer/issues", + "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.3.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer", + "type": "tidelift" + } + ], + "abandoned": "symfony/mailer", + "time": "2021-10-18T15:26:12+00:00" + }, + { + "name": "symfony/console", + "version": "v5.4.42", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "cef62396a0477e94fc52e87a17c6e5c32e226b7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/cef62396a0477e94fc52e87a17c6e5c32e226b7f", + "reference": "cef62396a0477e94fc52e87a17c6e5c32e226b7f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.4.42" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-26T12:21:55+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v5.4.42", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "db15ba0fd50890156ed40087ccedc7851a1f5b76" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/db15ba0fd50890156ed40087ccedc7851a1f5b76", + "reference": "db15ba0fd50890156ed40087ccedc7851a1f5b76", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/serializer": "^4.4|^5.0|^6.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v5.4.42" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-23T12:34:05+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8d7507f02b06e06815e56bb39aa0128e3806208b", + "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:49:08+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.4.42", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "0724c51fa067b198e36506d2864e09a52180998a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/0724c51fa067b198e36506d2864e09a52180998a", + "reference": "0724c51fa067b198e36506d2864e09a52180998a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.4.42" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-22T08:53:29+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.4.42", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "9c375b2abef0b657aa0b7612b763df5c12a465ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9c375b2abef0b657aa0b7612b763df5c12a465ab", + "reference": "9c375b2abef0b657aa0b7612b763df5c12a465ab", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "predis/predis": "^1.0|^2.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.4.42" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-26T11:59:59+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v5.4.42", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "948db7caf761dacc8abb9a59465f0639c30cc6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/948db7caf761dacc8abb9a59465f0639c30cc6dd", + "reference": "948db7caf761dacc8abb9a59465f0639c30cc6dd", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^5.0|^6.0", + "symfony/http-foundation": "^5.4.21|^6.2.7", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<5.3", + "symfony/doctrine-bridge": "<5.0", + "symfony/form": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/config": "^5.0|^6.0", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.3|^6.0", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/translation": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2|^3", + "symfony/var-dumper": "^4.4.31|^5.4", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v5.4.42" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-26T14:46:22+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.4.41", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "c71c7a1aeed60b22d05e738197e31daf2120bd42" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/c71c7a1aeed60b22d05e738197e31daf2120bd42", + "reference": "c71c7a1aeed60b22d05e738197e31daf2120bd42", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4", + "symfony/serializer": "<5.4.35|>=6,<6.3.12|>=6.4,<6.4.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/process": "^5.4|^6.4", + "symfony/property-access": "^4.4|^5.1|^6.0", + "symfony/property-info": "^4.4|^5.1|^6.0", + "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.4.41" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-28T09:36:24+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "0424dff1c58f028c451efff2045f5d92410bd540" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", + "reference": "0424dff1c58f028c451efff2045f5d92410bd540", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T15:07:36+00:00" + }, + { + "name": "symfony/polyfill-iconv", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "c027e6a3c6aee334663ec21f5852e89738abc805" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/c027e6a3c6aee334663ec21f5852e89738abc805", + "reference": "c027e6a3c6aee334663ec21f5852e89738abc805", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-iconv": "*" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Iconv extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "iconv", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.30.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T15:07:36+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T15:07:36+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", + "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T15:07:36+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T15:07:36+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-19T12:30:46+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "10112722600777e02d2745716b70c5db4ca70442" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442", + "reference": "10112722600777e02d2745716b70c5db4ca70442", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-19T12:30:46+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/ec444d3f3f6505bb28d11afa41e75faadebc10a1", + "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.30.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T15:07:36+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T15:07:36+00:00" + }, + { + "name": "symfony/process", + "version": "v5.4.40", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "deedcb3bb4669cae2148bc920eafd2b16dc7c046" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/deedcb3bb4669cae2148bc920eafd2b16dc7c046", + "reference": "deedcb3bb4669cae2148bc920eafd2b16dc7c046", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.4.40" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:33:22+00:00" + }, + { + "name": "symfony/routing", + "version": "v5.4.42", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "f8dd6f80c96aeec9b13fc13757842342e05c4878" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/f8dd6f80c96aeec9b13fc13757842342e05c4878", + "reference": "f8dd6f80c96aeec9b13fc13757842342e05c4878", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<5.3", + "symfony/dependency-injection": "<4.4", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.3|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v5.4.42" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-09T20:57:15+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/string", + "version": "v6.4.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "ccf9b30251719567bfd46494138327522b9a9446" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/ccf9b30251719567bfd46494138327522b9a9446", + "reference": "ccf9b30251719567bfd46494138327522b9a9446", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/intl": "^6.2|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.4.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-22T10:21:14+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.4.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "94041203f8ac200ae9e7c6a18fa6137814ccecc9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/94041203f8ac200ae9e7c6a18fa6137814ccecc9", + "reference": "94041203f8ac200ae9e7c6a18fa6137814ccecc9", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.18|^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.4.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-26T12:30:32+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v5.4.42", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "0c17c56d8ea052fc33942251c75d0e28936e043d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0c17c56d8ea052fc33942251c75d0e28936e043d", + "reference": "0c17c56d8ea052fc33942251c75d0e28936e043d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/uid": "^5.1|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.4.42" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-26T12:23:09+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.2.7", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/83ee6f38df0a63106a9e4536e3060458b74ccedb", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.2.7" + }, + "time": "2023-12-08T13:03:43+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.1", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:52:34+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/87337c91b9dfacee02452244ee14ab3c43bc485a", + "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/1.6.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2022-01-24T18:55:24+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "doctrine/cache", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2022-05-20T20:07:39+00:00" + }, + { + "name": "doctrine/dbal", + "version": "3.8.7", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "2093d670ca17f634f3c095ec10a20687eccebd99" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/2093d670ca17f634f3c095ec10a20687eccebd99", + "reference": "2093d670ca17f634f3c095ec10a20687eccebd99", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/cache": "^1.11|^2.0", + "doctrine/deprecations": "^0.5.3|^1", + "doctrine/event-manager": "^1|^2", + "php": "^7.4 || ^8.0", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "doctrine/coding-standard": "12.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "1.11.7", + "phpstan/phpstan-strict-rules": "^1.6", + "phpunit/phpunit": "9.6.20", + "psalm/plugin-phpunit": "0.18.4", + "slevomat/coding-standard": "8.13.1", + "squizlabs/php_codesniffer": "3.10.2", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/console": "^4.4|^5.4|^6.0|^7.0", + "vimeo/psalm": "4.30.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/3.8.7" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2024-08-07T11:57:25+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + }, + "time": "2024-01-30T19:34:25+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.24" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2024-05-22T20:47:39+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:23:10+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b", + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.23.1" + }, + "time": "2024-01-02T13:46:09+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2024-07-18T11:15:46+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.17.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "e8a88130a25e3f9d4d5785e6a1afca98268ab110" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/e8a88130a25e3f9d4d5785e6a1afca98268ab110", + "reference": "e8a88130a25e3f9d4d5785e6a1afca98268ab110", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.61.1", + "illuminate/view": "^10.48.18", + "larastan/larastan": "^2.9.8", + "laravel-zero/framework": "^10.4.0", + "mockery/mockery": "^1.6.12", + "nunomaduro/termwind": "^1.15.1", + "pestphp/pest": "^2.35.0" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2024-08-06T15:11:54+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.12", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2024-05-16T03:13:13+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2024-06-12T14:39:25+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/683130c2ff8c2739f4822ff7ac5c873ec529abd1", + "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.1.0" + }, + "time": "2024-07-01T20:03:41+00:00" + }, + { + "name": "orchestra/testbench", + "version": "v6.45.0", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench.git", + "reference": "97d1d94f84bcf913747645211fa26a05c54c15a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench/zipball/97d1d94f84bcf913747645211fa26a05c54c15a8", + "reference": "97d1d94f84bcf913747645211fa26a05c54c15a8", + "shasum": "" + }, + "require": { + "laravel/framework": "^8.83.27", + "mockery/mockery": "^1.4.4", + "orchestra/testbench-core": "^6.51", + "php": "^7.3 || ^8.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10", + "spatie/laravel-ray": "^1.29.7" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" + } + ], + "description": "Laravel Testing Helper for Packages Development", + "homepage": "https://packages.tools/testbench/", + "keywords": [ + "BDD", + "TDD", + "dev", + "laravel", + "laravel-packages", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/testbench/issues", + "source": "https://github.com/orchestral/testbench/tree/v6.45.0" + }, + "time": "2024-07-13T06:26:39+00:00" + }, + { + "name": "orchestra/testbench-core", + "version": "v6.51.1", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench-core.git", + "reference": "87d99f0dacf8b8377469f1e4f83692d5dab8e5dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/87d99f0dacf8b8377469f1e4f83692d5dab8e5dd", + "reference": "87d99f0dacf8b8377469f1e4f83692d5dab8e5dd", + "shasum": "" + }, + "require": { + "fakerphp/faker": "^1.9.1", + "php": "^7.3 || ^8.0", + "symfony/yaml": "^5.0", + "vlucas/phpdotenv": "^5.1" + }, + "conflict": { + "brianium/paratest": "<6.4.0 || >=7.0.0", + "laravel/framework": "<8.83.27 || >=9.0.0", + "nunomaduro/collision": "<5.0.0 || >=6.0.0", + "orchestra/testbench-dusk": "<6.43.0 || >=7.0.0", + "phpunit/phpunit": "<8.5.21 || >=9.0.0 <9.5.10 || >=10.0.0" + }, + "require-dev": { + "laravel/framework": "^8.83.27", + "laravel/tinker": "^2.9", + "mockery/mockery": "^1.4.4", + "phpstan/phpstan": "^1.11", + "phpunit/phpunit": "^8.5.21 || ^9.5.10", + "spatie/laravel-ray": "^1.31", + "symfony/process": "^5.0" + }, + "suggest": { + "brianium/paratest": "Allow using parallel testing (^6.4).", + "laravel/framework": "Required for testing (^8.83.27).", + "mockery/mockery": "Allow using Mockery for testing (^1.4.4).", + "nunomaduro/collision": "Allow using Laravel style tests output and parallel testing (^5.0).", + "orchestra/testbench-browser-kit": "Allow using legacy Laravel BrowserKit for testing (^6.0).", + "orchestra/testbench-dusk": "Allow using Laravel Dusk for testing (^6.0).", + "phpunit/phpunit": "Allow using PHPUnit for testing (^8.5.21|^9.5.10|^10.0).", + "symfony/process": "Required to use Orchestra\\Testbench\\remote function (^5.0)." + }, + "bin": [ + "testbench" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.0-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Orchestra\\Testbench\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" + } + ], + "description": "Testing Helper for Laravel Development", + "homepage": "https://packages.tools/testbench", + "keywords": [ + "BDD", + "TDD", + "dev", + "laravel", + "laravel-packages", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/testbench/issues", + "source": "https://github.com/orchestral/testbench-core" + }, + "time": "2024-07-19T10:14:07+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "0.12.100", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "48236ddf823547081b2b153d1cd2994b784328c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/48236ddf823547081b2b153d1cd2994b784328c3", + "reference": "48236ddf823547081b2b153d1cd2994b784328c3", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.12-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "support": { + "issues": "https://github.com/phpstan/phpstan/issues", + "source": "https://github.com/phpstan/phpstan/tree/0.12.100" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2022-11-01T09:52:08+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.31", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965", + "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.31" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:37:42+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.6.20", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "49d7820565836236411f5dc002d16dd689cde42f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/49d7820565836236411f5dc002d16dd689cde42f", + "reference": "49d7820565836236411f5dc002d16dd689cde42f", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.5.0 || ^2", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.31", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.6", + "sebastian/global-state": "^5.0.7", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", + "sebastian/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.6-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.20" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-07-10T11:45:39+00:00" + }, + { + "name": "pimple/pimple", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1 || ^2.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^5.4@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Pimple": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple, a simple Dependency Injection Container", + "homepage": "https://pimple.symfony.com", + "keywords": [ + "container", + "dependency injection" + ], + "support": { + "source": "https://github.com/silexphp/Pimple/tree/v3.5.0" + }, + "time": "2021-10-28T11:13:42+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:27:43+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:41:17+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:19:30+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:30:58+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:03:51+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:33:00+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:35:11+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:20:34+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:07:39+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-14T16:00:52+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:13:03+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "spatie/backtrace", + "version": "1.6.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/1a9a145b044677ae3424693f7b06479fc8c137a9", + "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "ext-json": "*", + "laravel/serializable-closure": "^1.3", + "phpunit/phpunit": "^9.3", + "spatie/phpunit-snapshot-assertions": "^4.2", + "symfony/var-dumper": "^5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/backtrace/tree/1.6.2" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2024-07-22T08:21:24+00:00" + }, + { + "name": "spatie/laravel-ray", + "version": "1.33.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ray.git", + "reference": "b9574cec543b932d99e68247eaeb37876c71c8eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ray/zipball/b9574cec543b932d99e68247eaeb37876c71c8eb", + "reference": "b9574cec543b932d99e68247eaeb37876c71c8eb", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/contracts": "^7.20|^8.19|^9.0|^10.0", + "illuminate/database": "^7.20|^8.19|^9.0|^10.0", + "illuminate/queue": "^7.20|^8.19|^9.0|^10.0", + "illuminate/support": "^7.20|^8.19|^9.0|^10.0", + "php": "^7.4|^8.0", + "spatie/backtrace": "^1.0", + "spatie/ray": "^1.37", + "symfony/stopwatch": "4.2|^5.1|^6.0|^7.0", + "zbateson/mail-mime-parser": "^1.3.1|^2.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.3", + "laravel/framework": "^7.20|^8.19|^9.0|^10.0", + "orchestra/testbench-core": "^5.0|^6.0|^7.0|^8.0", + "pestphp/pest": "^1.22", + "phpstan/phpstan": "^0.12.93", + "phpunit/phpunit": "^9.3", + "spatie/pest-plugin-snapshots": "^1.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.29.x-dev" + }, + "laravel": { + "providers": [ + "Spatie\\LaravelRay\\RayServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\LaravelRay\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily debug Laravel apps", + "homepage": "https://github.com/spatie/laravel-ray", + "keywords": [ + "laravel-ray", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-ray/issues", + "source": "https://github.com/spatie/laravel-ray/tree/1.33.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2024-01-04T21:36:17+00:00" + }, + { + "name": "spatie/macroable", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/macroable.git", + "reference": "ec2c320f932e730607aff8052c44183cf3ecb072" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/macroable/zipball/ec2c320f932e730607aff8052c44183cf3ecb072", + "reference": "ec2c320f932e730607aff8052c44183cf3ecb072", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.0|^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Macroable\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A trait to dynamically add methods to a class", + "homepage": "https://github.com/spatie/macroable", + "keywords": [ + "macroable", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/macroable/issues", + "source": "https://github.com/spatie/macroable/tree/2.0.0" + }, + "time": "2021-03-26T22:39:02+00:00" + }, + { + "name": "spatie/ray", + "version": "1.41.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/ray.git", + "reference": "c44f8cfbf82c69909b505de61d8d3f2d324e93fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ray/zipball/c44f8cfbf82c69909b505de61d8d3f2d324e93fc", + "reference": "c44f8cfbf82c69909b505de61d8d3f2d324e93fc", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": "^7.3|^8.0", + "ramsey/uuid": "^3.0|^4.1", + "spatie/backtrace": "^1.1", + "spatie/macroable": "^1.0|^2.0", + "symfony/stopwatch": "^4.0|^5.1|^6.0|^7.0", + "symfony/var-dumper": "^4.2|^5.1|^6.0|^7.0.3" + }, + "require-dev": { + "illuminate/support": "6.x|^8.18|^9.0", + "nesbot/carbon": "^2.63", + "pestphp/pest": "^1.22", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.19.2", + "spatie/phpunit-snapshot-assertions": "^4.2", + "spatie/test-time": "^1.2" + }, + "bin": [ + "bin/remove-ray.sh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\Ray\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Debug with Ray to fix problems faster", + "homepage": "https://github.com/spatie/ray", + "keywords": [ + "ray", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/ray/issues", + "source": "https://github.com/spatie/ray/tree/1.41.2" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2024-04-24T14:21:46+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", + "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/yaml", + "version": "v5.4.40", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "81cad0ceab3d61fe14fe941ff18a230ac9c80f83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/81cad0ceab3d61fe14fe941ff18a230ac9c80f83", + "reference": "81cad0ceab3d61fe14fe941ff18a230ac9c80f83", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.3" + }, + "require-dev": { + "symfony/console": "^5.3|^6.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.4.40" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:33:22+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + }, + { + "name": "zbateson/mail-mime-parser", + "version": "2.4.1", + "source": { + "type": "git", + "url": "https://github.com/zbateson/mail-mime-parser.git", + "reference": "ff49e02f6489b38f7cc3d1bd3971adc0f872569c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/ff49e02f6489b38f7cc3d1bd3971adc0f872569c", + "reference": "ff49e02f6489b38f7cc3d1bd3971adc0f872569c", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.7.0|^2.0", + "php": ">=7.1", + "pimple/pimple": "^3.0", + "zbateson/mb-wrapper": "^1.0.1", + "zbateson/stream-decorators": "^1.0.6" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "mikey179/vfsstream": "^1.6.0", + "phpstan/phpstan": "*", + "phpunit/phpunit": "<10" + }, + "suggest": { + "ext-iconv": "For best support/performance", + "ext-mbstring": "For best support/performance" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\MailMimeParser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + }, + { + "name": "Contributors", + "homepage": "https://github.com/zbateson/mail-mime-parser/graphs/contributors" + } + ], + "description": "MIME email message parser", + "homepage": "https://mail-mime-parser.org", + "keywords": [ + "MimeMailParser", + "email", + "mail", + "mailparse", + "mime", + "mimeparse", + "parser", + "php-imap" + ], + "support": { + "docs": "https://mail-mime-parser.org/#usage-guide", + "issues": "https://github.com/zbateson/mail-mime-parser/issues", + "source": "https://github.com/zbateson/mail-mime-parser" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2024-04-28T00:58:54+00:00" + }, + { + "name": "zbateson/mb-wrapper", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/zbateson/mb-wrapper.git", + "reference": "09a8b77eb94af3823a9a6623dcc94f8d988da67f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/09a8b77eb94af3823a9a6623dcc94f8d988da67f", + "reference": "09a8b77eb94af3823a9a6623dcc94f8d988da67f", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-iconv": "^1.9", + "symfony/polyfill-mbstring": "^1.9" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "<10.0" + }, + "suggest": { + "ext-iconv": "For best support/performance", + "ext-mbstring": "For best support/performance" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\MbWrapper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + } + ], + "description": "Wrapper for mbstring with fallback to iconv for encoding conversion and string manipulation", + "keywords": [ + "charset", + "encoding", + "http", + "iconv", + "mail", + "mb", + "mb_convert_encoding", + "mbstring", + "mime", + "multibyte", + "string" + ], + "support": { + "issues": "https://github.com/zbateson/mb-wrapper/issues", + "source": "https://github.com/zbateson/mb-wrapper/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2024-03-18T04:31:04+00:00" + }, + { + "name": "zbateson/stream-decorators", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/zbateson/stream-decorators.git", + "reference": "783b034024fda8eafa19675fb2552f8654d3a3e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/stream-decorators/zipball/783b034024fda8eafa19675fb2552f8654d3a3e9", + "reference": "783b034024fda8eafa19675fb2552f8654d3a3e9", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.9 | ^2.0", + "php": ">=7.2", + "zbateson/mb-wrapper": "^1.0.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "<10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\StreamDecorators\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + } + ], + "description": "PHP psr7 stream decorators for mime message part streams", + "keywords": [ + "base64", + "charset", + "decorators", + "mail", + "mime", + "psr7", + "quoted-printable", + "stream", + "uuencode" + ], + "support": { + "issues": "https://github.com/zbateson/stream-decorators/issues", + "source": "https://github.com/zbateson/stream-decorators/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2023-05-30T22:51:52+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "phpstan/phpstan": 20 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^7.4|^8.0", + "ext-curl": "*", + "ext-json": "*", + "ext-soap": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/config/iranpayment.php b/config/iranpayment.php index 32d0aaa..6cb5227 100644 --- a/config/iranpayment.php +++ b/config/iranpayment.php @@ -52,10 +52,10 @@ |-------------------------------------------------------------------------- */ 'sadad' => [ - 'merchant_id' => env('SADAD_MERCHANT_ID', 'xxxxxxxx'), - 'terminal_id' => env('SADAD_TERMINAL_ID', 'xxxxxxxx'), + 'merchant_id' => env('SADAD_MERCHANT_ID', 'xxxxxxxx'), + 'terminal_id' => env('SADAD_TERMINAL_ID', 'xxxxxxxx'), 'terminal_key' => env('SADAD_TERMINAL_KEY', 'xxxxxxxx'), - 'app_name' => env('APP_NAME', ''), + 'app_name' => env('APP_NAME', ''), // 'callback-url' => 'http://example.com/payments/sadad/callback', ], diff --git a/database/migrations/2017_03_01_000000_create_iranpayment_transactions_table.php b/database/migrations/2017_03_01_000000_create_iranpayment_transactions_table.php index 1e38f5a..3d5eea4 100644 --- a/database/migrations/2017_03_01_000000_create_iranpayment_transactions_table.php +++ b/database/migrations/2017_03_01_000000_create_iranpayment_transactions_table.php @@ -1,41 +1,40 @@ getTable(), function (Blueprint $table) { - $table->bigIncrements('id'); - $table->string('code')->nullable()->index(); - $table->unsignedBigInteger('payable_id')->nullable(); - $table->string('payable_type')->nullable(); - $table->string('gateway')->index(); - $table->unsignedDecimal('amount', 16, 4); - $table->string('currency')->default(Currency::IRR); - $table->unsignedTinyInteger('status')->default(IranPaymentTransaction::T_INIT); - $table->string('tracking_code')->nullable()->index(); - $table->string('reference_number')->nullable()->index(); - $table->string('card_number')->nullable(); - $table->string('mobile')->nullable(); - $table->string('description')->nullable(); - $table->text('errors')->nullable(); - $table->text('extra')->nullable(); - $table->timestamp('paid_at')->nullable(); - $table->timestamps(); - }); - } + use IranPaymentDatabase; + + public function up() + { + Schema::create($this->getTable(), function (Blueprint $table) { + $table->bigIncrements('id'); + $table->string('code')->nullable()->index(); + $table->unsignedBigInteger('payable_id')->nullable(); + $table->string('payable_type')->nullable(); + $table->string('gateway')->index(); + $table->unsignedDecimal('amount', 16, 4); + $table->string('currency')->default(Currency::IRR); + $table->unsignedTinyInteger('status')->default(IranPaymentTransaction::T_INIT); + $table->string('tracking_code')->nullable()->index(); + $table->string('reference_number')->nullable()->index(); + $table->string('card_number')->nullable(); + $table->string('mobile')->nullable(); + $table->string('description')->nullable(); + $table->text('errors')->nullable(); + $table->text('extra')->nullable(); + $table->timestamp('paid_at')->nullable(); + $table->timestamps(); + }); + } - public function down() - { - Schema::dropIfExists($this->getTable()); - } + public function down() + { + Schema::dropIfExists($this->getTable()); + } } diff --git a/database/migrations/2017_03_02_000000_alter_iranpayment_transactions_table.php b/database/migrations/2017_03_02_000000_alter_iranpayment_transactions_table.php index a4be6a6..4e48396 100644 --- a/database/migrations/2017_03_02_000000_alter_iranpayment_transactions_table.php +++ b/database/migrations/2017_03_02_000000_alter_iranpayment_transactions_table.php @@ -1,9 +1,8 @@ request = $request; + /** + * Set Request function + * + * @return $this + */ + public function setRequest(array $request): self + { + $this->request = $request; - return $this; - } + return $this; + } /** * Get Request function - * - * @return array */ public function getRequest(): array { @@ -93,7 +84,6 @@ public function getRequest(): array /** * Set Gateway Request Options function * - * @param array $options * @return $this */ public function setGatewayRequestOptions(array $options): self @@ -105,8 +95,6 @@ public function setGatewayRequestOptions(array $options): self /** * Get Gateway Request Options function - * - * @return array */ public function getGatewayRequestOptions(): array { @@ -122,7 +110,7 @@ protected function prePurchase(): void throw InvalidDataException::invalidAmount(); } - if (!in_array($this->getCurrency(), [Currency::IRR, Currency::IRT])) { + if (! in_array($this->getCurrency(), [Currency::IRR, Currency::IRT])) { throw InvalidDataException::invalidCurrency(); } @@ -147,35 +135,35 @@ protected function postPurchase(): void * Pay function * * @return $this + * * @throws IranPaymentException */ public function ready(): self - { - try { + { + try { $this->prePurchase(); $this->purchase(); $this->postPurchase(); - } catch (Exception $ex) { + } catch (Exception $ex) { if ($this->getTransaction() !== null) { $this->transactionFailed($ex->getMessage()); } - if (!$ex instanceof IranPaymentException) { + if (! $ex instanceof IranPaymentException) { $ex = IranPaymentException::unknown($ex); } - throw $ex; - } + throw $ex; + } - return $this; - } + return $this; + } /** * Alias for Purchase Uri function * - * @return string * @throws IranPaymentException */ public function uri(): string @@ -207,8 +195,6 @@ public function redirect() /** * Purchase View Params function - * - * @return array */ protected function purchaseViewParams(): array { @@ -216,11 +202,10 @@ protected function purchaseViewParams(): array } /** - * @param array $data * @return mixed */ - public function purchaseView(array $data = []) - { + public function purchaseView(array $data = []) + { $parameters = array_merge( [ 'view' => 'iranpayment::pages.redirect', @@ -233,19 +218,18 @@ public function purchaseView(array $data = []) $data ); - return response()->view($parameters['view'], array_merge( + return response()->view($parameters['view'], array_merge( [ 'transaction_code' => $parameters['transaction_code'] ?? $this->getTransactionCode(), 'bank_url' => $parameters['bank_url'] ?? $this->purchaseUri(), - ], + ], $parameters )); - } + } /** * Alias for Purchase View function * - * @param array $data * @return mixed */ public function view(array $data = []) @@ -258,18 +242,18 @@ public function view(array $data = []) */ protected function preVerify(): void { - if(!isset($this->transaction)) { + if (! isset($this->transaction)) { $transaction_code_field = app('config')->get('iranpayment.transaction_query_param', 'tc'); if (isset($this->request[$transaction_code_field])) { $this->findTransaction($this->request[$transaction_code_field]); } else { - throw new TransactionNotFoundException(); + throw new TransactionNotFoundException; } } if ($this->transaction->status == IranPaymentTransaction::T_SUCCEED) { throw new SucceedRetryException; - } elseif (!in_array($this->transaction->status, [ + } elseif (! in_array($this->transaction->status, [ IranPaymentTransaction::T_PENDING, IranPaymentTransaction::T_VERIFY_PENDING, ])) { @@ -290,17 +274,17 @@ protected function postVerify(): void /** * Confirm function * - * @param IranPaymentTransaction|null $transaction * @return self + * * @throws IranPaymentException */ - public function confirm(IranPaymentTransaction $transaction = null) - { - if (isset($transaction)) { - $this->setTransaction($transaction); - } + public function confirm(?IranPaymentTransaction $transaction = null) + { + if (isset($transaction)) { + $this->setTransaction($transaction); + } - try { + try { $this->preVerify(); $this->verify(); @@ -316,8 +300,8 @@ public function confirm(IranPaymentTransaction $transaction = null) throw IranPaymentException::unknown($ex); } - return $this; - } + return $this; + } public function statusView(array $parameters = []) { diff --git a/src/Gateways/Digipay/Digipay.php b/src/Gateways/Digipay/Digipay.php index cad3e75..260abde 100644 --- a/src/Gateways/Digipay/Digipay.php +++ b/src/Gateways/Digipay/Digipay.php @@ -1,4 +1,9 @@ preparedAmount() < 100 || $this->preparedAmount() > 500000000) { + if ($this->preparedAmount() < 100 || $this->preparedAmount() > 1000000000) { throw InvalidDataException::invalidAmount(); } @@ -445,7 +392,7 @@ public function purchase(): void 'cellNumber' => $this->getMobile(), // e.g. 09xxxxxxxxx 'amount' => $this->preparedAmount(), 'providerId' => $this->getProviderId(), - 'callbackUrl' => $this->preparedCallbackUrl() + 'callbackUrl' => $this->preparedCallbackUrl(), ]; try { @@ -457,7 +404,7 @@ public function purchase(): void curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Agent: WEB', 'Digipay-Version: 2022-02-02', - 'Authorization: Bearer ' . $this->getAccessToken(), + 'Authorization: Bearer '.$this->getAccessToken(), 'Content-Type: application/json', ]); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); @@ -502,8 +449,6 @@ public function purchaseUri(): string /** * Purchase View Params function - * - * @return array */ protected function purchaseViewParams(): array { @@ -551,7 +496,7 @@ public function verify(): void curl_setopt($ch, CURLOPT_URL, $endpoint); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_HTTPHEADER, [ - 'Authorization: Bearer ' . $this->getAccessToken(), + 'Authorization: Bearer '.$this->getAccessToken(), 'Content-Type: application/json', ]); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); @@ -575,7 +520,7 @@ public function verify(): void throw DigipayException::error($result['result']['status']); } - $this->setTrackingCode($result["trackingCode"]); + $this->setTrackingCode($result['trackingCode']); $this->deliver($this->getTrackingCode(), $this->getTicketType()); @@ -608,7 +553,7 @@ public function deliver(string $trackingCode, int $type): void 'deliveryDate' => now()->timestamp, 'invoiceNumber' => $this->getPayableId(), 'trackingCode' => $trackingCode, - 'products' => [$this->transaction->description] + 'products' => [$this->transaction->description], ]; try { @@ -620,7 +565,7 @@ public function deliver(string $trackingCode, int $type): void curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Agent: WEB', 'Digipay-Version: 2022-02-02', - 'Authorization: Bearer ' . $this->getAccessToken(), + 'Authorization: Bearer '.$this->getAccessToken(), 'Content-Type: application/json', ]); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); @@ -647,15 +592,14 @@ public function deliver(string $trackingCode, int $type): void } /** - * @return void * @throws DigipayException * @throws GatewayException */ private function oauth(): void { $fields = [ - 'username' => $this->getUsername(), - 'password' => $this->getPassword(), + 'username' => $this->getUsername(), + 'password' => $this->getPassword(), 'grant_type' => $this->getGrantType(), ]; @@ -664,8 +608,8 @@ private function oauth(): void curl_setopt($ch, CURLOPT_URL, self::LOGIN_URL); curl_setopt($ch, CURLOPT_USERPWD, "{$this->getClientId()}:{$this->getClientSecret()}"); curl_setopt($ch, CURLOPT_HTTPHEADER, [ - 'Content-Type' => 'application/json', - 'Authorization' => 'Basic ' . base64_encode("{$this->getClientId()}:{$this->getClientSecret()}"), + 'Content-Type' => 'application/json', + 'Authorization' => 'Basic '.base64_encode("{$this->getClientId()}:{$this->getClientSecret()}"), ]); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); @@ -683,7 +627,7 @@ private function oauth(): void } $result = json_decode($response); - } catch(\Exception $ex) { + } catch (\Exception $ex) { throw GatewayException::connectionProblem($ex); } diff --git a/src/Gateways/Digipay/DigipayException.php b/src/Gateways/Digipay/DigipayException.php index 2dcfa76..b574300 100644 --- a/src/Gateways/Digipay/DigipayException.php +++ b/src/Gateways/Digipay/DigipayException.php @@ -6,28 +6,28 @@ class DigipayException extends GatewayException { - public static array $errors = [ - 0 => 'عملیات با موفقیت انجام شد', - - 1054 => 'اطلاعات ورودی اشتباه می باشد', - - 9000 => 'اطلاعات خرید یافت نشد', - 9001 => 'توکن پرداخت معتبر نمی باشد', - - 9003 => 'خرید مورد نظر منقضی شده است', - 9004 => 'خرید مورد نظر درحال انجام است', - 9005 => 'خرید قابل پرداخت نمی باشد', - 9006 => 'خطا در برقراری ارتباط با درگاه پرداخت', - 9007 => 'خرید با موفقیت انجام نشده است', - 9008 => 'این خرید با داده های متفاوتی قبلا ثبت شده است', - 9009 => 'محدوده زمانی تایید تراکنش گذشته است', - 9010 => 'تایید خرید ناموفق بود', - 9011 => 'نتیجه تایید خرید نامشخص است', - 9012 => 'وضعیت خرید برای این درخواست صحیح نمی باشد', - - 9030 => 'ورود شماره همراه برای کاربران ثبت نام شده الزامی است', - 9031 => 'اعطای تیکت برای کاربر مورد نظر امکان پذیر نمی‌باشد', - ]; + public static array $errors = [ + // 0 => 'عملیات با موفقیت انجام شد', + + 1054 => 'اطلاعات ورودی اشتباه می باشد', + + 9000 => 'اطلاعات خرید یافت نشد', + 9001 => 'توکن پرداخت معتبر نمی باشد', + + 9003 => 'خرید مورد نظر منقضی شده است', + 9004 => 'خرید مورد نظر درحال انجام است', + 9005 => 'خرید قابل پرداخت نمی باشد', + 9006 => 'خطا در برقراری ارتباط با درگاه پرداخت', + 9007 => 'خرید با موفقیت انجام نشده است', + 9008 => 'این خرید با داده های متفاوتی قبلا ثبت شده است', + 9009 => 'محدوده زمانی تایید تراکنش گذشته است', + 9010 => 'تایید خرید ناموفق بود', + 9011 => 'نتیجه تایید خرید نامشخص است', + 9012 => 'وضعیت خرید برای این درخواست صحیح نمی باشد', + + 9030 => 'ورود شماره همراه برای کاربران ثبت نام شده الزامی است', + 9031 => 'اعطای تیکت برای کاربر مورد نظر امکان پذیر نمی‌باشد', + ]; public static function error($error_code) { diff --git a/src/Gateways/GatewayInterface.php b/src/Gateways/GatewayInterface.php index 561be48..95d9204 100644 --- a/src/Gateways/GatewayInterface.php +++ b/src/Gateways/GatewayInterface.php @@ -8,9 +8,9 @@ public function getName(): string; public function initialize(array $parameters = []): self; - public function purchase(): void; + public function purchase(): void; public function purchaseUri(): string; - public function verify(): void; + public function verify(): void; } diff --git a/src/Gateways/Novinopay/Novinopay.php b/src/Gateways/Novinopay/Novinopay.php index b6eaca0..e474662 100755 --- a/src/Gateways/Novinopay/Novinopay.php +++ b/src/Gateways/Novinopay/Novinopay.php @@ -7,76 +7,60 @@ namespace Dena\IranPayment\Gateways\Novinopay; -use Dena\IranPayment\Gateways\AbstractGateway; -use Dena\IranPayment\Gateways\GatewayInterface; - -use Exception; use Dena\IranPayment\Exceptions\GatewayException; use Dena\IranPayment\Exceptions\InvalidDataException; use Dena\IranPayment\Exceptions\IranPaymentException; use Dena\IranPayment\Exceptions\TransactionFailedException; - +use Dena\IranPayment\Gateways\AbstractGateway; +use Dena\IranPayment\Gateways\GatewayInterface; use Dena\IranPayment\Helpers\Currency; +use Exception; class Novinopay extends AbstractGateway implements GatewayInterface { - private const REQUEST_URL = "https://api.novinopay.com/Payment/rest/v1/Request"; - private const VERIFY_URL = "https://api.novinopay.com/Payment/rest/v1/Verification"; + private const REQUEST_URL = 'https://api.novinopay.com/Payment/rest/v1/Request'; + + private const VERIFY_URL = 'https://api.novinopay.com/Payment/rest/v1/Verification'; + public const CURRENCY = Currency::IRT; /** * Merchant ID variable - * - * @var string|null */ protected ?string $merchant_id; /** * Invoice ID variable - * - * @var string|null */ protected ?string $invoice_id; /** * Authority variable - * - * @var string|null */ protected ?string $authority; /** * Ref Id variable - * - * @var string|null */ protected ?string $ref_id; /** * Payment Url variable - * - * @var string|null */ protected ?string $payment_url; /** * Mask Card Number variable - * - * @var string|null */ protected ?string $mask_card_number = null; /** * Gateway Transaction Data variable - * - * @var array|null */ protected ?array $gateway_transaction_data = null; /** * Gateway Name function - * - * @return string */ public function getName(): string { @@ -86,7 +70,6 @@ public function getName(): string /** * Set Merchant ID function * - * @param string $merchant_id * @return $this */ public function setMerchantId(string $merchant_id): self @@ -98,8 +81,6 @@ public function setMerchantId(string $merchant_id): self /** * Get Merchant ID function - * - * @return string|null */ public function getMerchantId(): ?string { @@ -109,7 +90,6 @@ public function getMerchantId(): ?string /** * Set Invoice ID function * - * @param string $invoice_id * @return $this */ public function setInvoiceId(string $invoice_id): self @@ -121,8 +101,6 @@ public function setInvoiceId(string $invoice_id): self /** * Get Invoice ID function - * - * @return string|null */ public function getInvoiceId(): ?string { @@ -132,7 +110,6 @@ public function getInvoiceId(): ?string /** * Set Authority function * - * @param string $authority * @return $this */ public function setAuthority(string $authority): self @@ -144,8 +121,6 @@ public function setAuthority(string $authority): self /** * Get Authority function - * - * @return string|null */ public function getAuthority(): ?string { @@ -155,7 +130,6 @@ public function getAuthority(): ?string /** * Set Ref ID function * - * @param string $ref_id * @return $this */ public function setRefId(string $ref_id): self @@ -167,8 +141,6 @@ public function setRefId(string $ref_id): self /** * Get Ref ID function - * - * @return string|null */ public function getRefId(): ?string { @@ -178,7 +150,6 @@ public function getRefId(): ?string /** * Set Payment Url function * - * @param string $payment_url * @return $this */ public function setPaymentUrl(string $payment_url): self @@ -190,8 +161,6 @@ public function setPaymentUrl(string $payment_url): self /** * Get Payment Url function - * - * @return string|null */ public function getPaymentUrl(): ?string { @@ -201,7 +170,6 @@ public function getPaymentUrl(): ?string /** * Set Mask Card Number function * - * @param string $mask_card_number * @return $this */ public function setMaskCardNumber(string $mask_card_number): self @@ -213,8 +181,6 @@ public function setMaskCardNumber(string $mask_card_number): self /** * Get Mask Card Number function - * - * @return string|null */ public function getMaskCardNumber(): ?string { @@ -224,7 +190,6 @@ public function getMaskCardNumber(): ?string /** * Set Payment Url function * - * @param array $gateway_transaction_data * @return $this */ public function setGatewayTransactionData(array $gateway_transaction_data): self @@ -236,8 +201,6 @@ public function setGatewayTransactionData(array $gateway_transaction_data): self /** * Get Payment Url function - * - * @return array|null */ public function getGatewayTransactionData(): ?array { @@ -247,8 +210,8 @@ public function getGatewayTransactionData(): ?array /** * Initialize function * - * @param array $parameters * @return $this + * * @throws InvalidDataException */ public function initialize(array $parameters = []): self @@ -274,7 +237,7 @@ protected function prePurchase(): void { parent::prePurchase(); - if ($this->preparedAmount() < 100 || $this->preparedAmount() > 500000000) { + if ($this->preparedAmount() < 100 || $this->preparedAmount() > 1000000000) { throw InvalidDataException::invalidAmount(); } @@ -299,7 +262,7 @@ public function purchase(): void try { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, self::REQUEST_URL); - curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type" => "application/json"]); + curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type' => 'application/json']); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields, JSON_UNESCAPED_UNICODE)); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); @@ -314,11 +277,11 @@ public function purchase(): void } $result = json_decode($response); - } catch(Exception $ex) { + } catch (Exception $ex) { throw GatewayException::connectionProblem($ex); } - if (!isset($result->Status)) { + if (! isset($result->Status)) { throw GatewayException::unknownResponse(json_encode($result)); } @@ -326,13 +289,13 @@ public function purchase(): void throw NovinopayException::error($result->Status); } - if (!isset($result->Authority)) { + if (! isset($result->Authority)) { throw GatewayException::unknownResponse(json_encode($result)); } $this->setAuthority($result->Authority); - if (!isset($result->PaymentUrl)) { + if (! isset($result->PaymentUrl)) { throw GatewayException::unknownResponse(json_encode($result)); } @@ -350,8 +313,6 @@ protected function postPurchase(): void /** * Pay Link function - * - * @return string */ public function purchaseUri(): string { @@ -360,8 +321,6 @@ public function purchaseUri(): string /** * Purchase View Params function - * - * @return array */ protected function purchaseViewParams(): array { @@ -403,7 +362,7 @@ public function verify(): void try { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, self::VERIFY_URL); - curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type" => "application/json"]); + curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type' => 'application/json']); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields, JSON_UNESCAPED_UNICODE)); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); @@ -418,11 +377,11 @@ public function verify(): void } $result = json_decode($response); - } catch(Exception $ex) { + } catch (Exception $ex) { throw GatewayException::connectionProblem($ex); } - if (!isset($result->Status)) { + if (! isset($result->Status)) { throw GatewayException::unknownResponse(json_encode($result)); } @@ -430,7 +389,7 @@ public function verify(): void throw NovinopayException::error($result->Status); } - if (!isset($result->RefID)) { + if (! isset($result->RefID)) { throw GatewayException::unknownResponse(json_encode($result)); } @@ -440,7 +399,7 @@ public function verify(): void throw NovinopayException::error(-5); } - if (!isset($result->MaskCardNumber)) { + if (! isset($result->MaskCardNumber)) { $this->setMaskCardNumber($result->MaskCardNumber); } diff --git a/src/Gateways/Novinopay/NovinopayException.php b/src/Gateways/Novinopay/NovinopayException.php index a17de53..8eda597 100644 --- a/src/Gateways/Novinopay/NovinopayException.php +++ b/src/Gateways/Novinopay/NovinopayException.php @@ -8,15 +8,15 @@ class NovinopayException extends GatewayException { public static array $errors = [ - -1 => 'صرفا درخواست با متد POST قابل پذیرش است', - -2 => 'مقداری برای MerchantID ارسال نشده است', - -3 => 'مقداری برای Amount ارسال نشده است', - -4 => 'مقداری برای CallbackURL ارسال نشده است', - -5 => 'مبلغ صحیح نمیباشد', - -6 => 'MerchantID وارد شده در سیستم یافت نشد', - -7 => 'MerchantID وارد شده فعال نیست', - -8 => 'اکانت شما تجاری نیست, لذا امکان استفاده از وبسرویس را ندارید', - -9 => 'IP معتبر نیست', + -1 => 'صرفا درخواست با متد POST قابل پذیرش است', + -2 => 'مقداری برای MerchantID ارسال نشده است', + -3 => 'مقداری برای Amount ارسال نشده است', + -4 => 'مقداری برای CallbackURL ارسال نشده است', + -5 => 'مبلغ صحیح نمیباشد', + -6 => 'MerchantID وارد شده در سیستم یافت نشد', + -7 => 'MerchantID وارد شده فعال نیست', + -8 => 'اکانت شما تجاری نیست, لذا امکان استفاده از وبسرویس را ندارید', + -9 => 'IP معتبر نیست', -10 => 'آدرس بازگشتی با آدرس درگاه پرداخت ثبت شده همخوانی ندارد', -11 => 'خطای در وب سرویس - ایجاد تراکنش با خطا مواجه شد', -12 => 'مقدار Authority ارسالی معتبر نیست - تراکنش یافت نشد', @@ -38,13 +38,13 @@ class NovinopayException extends GatewayException ]; /** - * @param $error_code * @return $this + * * @throws TransactionFailedException */ public static function error($error_code): self { - if (!isset(self::$errors[$error_code])) { + if (! isset(self::$errors[$error_code])) { return self::unknownResponse((string) $error_code); } diff --git a/src/Gateways/PayIr/PayIr.php b/src/Gateways/PayIr/PayIr.php index dcbbad1..ace2722 100755 --- a/src/Gateways/PayIr/PayIr.php +++ b/src/Gateways/PayIr/PayIr.php @@ -7,63 +7,52 @@ namespace Dena\IranPayment\Gateways\PayIr; -use Dena\IranPayment\Gateways\AbstractGateway; -use Dena\IranPayment\Gateways\GatewayInterface; - -use Exception; use Dena\IranPayment\Exceptions\GatewayException; use Dena\IranPayment\Exceptions\InvalidDataException; use Dena\IranPayment\Exceptions\IranPaymentException; use Dena\IranPayment\Exceptions\TransactionFailedException; - +use Dena\IranPayment\Gateways\AbstractGateway; +use Dena\IranPayment\Gateways\GatewayInterface; use Dena\IranPayment\Helpers\Currency; +use Exception; class PayIr extends AbstractGateway implements GatewayInterface { - private const SEND_URL = "https://pay.ir/pg/send"; - private const VERIFY_URL = "https://pay.ir/pg/verify"; - private const TOKEN_URL = "https://pay.ir/pg/{token}"; - public const CURRENCY = Currency::IRR; + private const SEND_URL = 'https://pay.ir/pg/send'; + + private const VERIFY_URL = 'https://pay.ir/pg/verify'; + + private const TOKEN_URL = 'https://pay.ir/pg/{token}'; + + public const CURRENCY = Currency::IRR; /** * API variable - * - * @var string|null */ protected ?string $api; /** * Factor Number variable - * - * @var string|null */ protected ?string $factor_number; /** * Token variable - * - * @var string|null */ protected ?string $token; /** * Trans Id variable - * - * @var string|null */ protected ?string $trans_id; /** * Payer Card Number variable - * - * @var string|null */ protected ?string $payer_card_number; /** * Gateway Name function - * - * @return string */ public function getName(): string { @@ -73,7 +62,6 @@ public function getName(): string /** * Set API function * - * @param string $api * @return $this */ public function setApi(string $api): self @@ -85,8 +73,6 @@ public function setApi(string $api): self /** * Get API function - * - * @return string|null */ public function getApi(): ?string { @@ -96,7 +82,6 @@ public function getApi(): ?string /** * Set Factor Number function * - * @param string $factor_number * @return $this */ public function setFactorNumber(string $factor_number): self @@ -108,8 +93,6 @@ public function setFactorNumber(string $factor_number): self /** * Get Factor Number function - * - * @return string|null */ public function getFactorNumber(): ?string { @@ -119,7 +102,6 @@ public function getFactorNumber(): ?string /** * Set Token function * - * @param $token * @return $this */ public function setToken($token): self @@ -131,8 +113,6 @@ public function setToken($token): self /** * Get Token function - * - * @return string|null */ public function getToken(): ?string { @@ -142,7 +122,6 @@ public function getToken(): ?string /** * Set Trans ID function * - * @param string $trans_id * @return $this */ public function setTransId(string $trans_id): self @@ -154,8 +133,6 @@ public function setTransId(string $trans_id): self /** * Get Trans ID function - * - * @return string|null */ public function getTransId(): ?string { @@ -165,7 +142,6 @@ public function getTransId(): ?string /** * Set Payer Card Number function * - * @param string $payer_card_number * @return $this */ public function setPayerCardNumber(string $payer_card_number): self @@ -177,8 +153,6 @@ public function setPayerCardNumber(string $payer_card_number): self /** * Get Payer Card Number function - * - * @return string|null */ public function getPayerCardNumber(): ?string { @@ -188,8 +162,8 @@ public function getPayerCardNumber(): ?string /** * Initialize function * - * @param array $parameters * @return $this + * * @throws InvalidDataException */ public function initialize(array $parameters = []): self @@ -211,69 +185,69 @@ public function initialize(array $parameters = []): self /** * @throws InvalidDataException */ - protected function prePurchase(): void - { + protected function prePurchase(): void + { parent::prePurchase(); - if ($this->preparedAmount() < 10000 || $this->preparedAmount() > 500000000) { + if ($this->preparedAmount() < 10000 || $this->preparedAmount() > 1000000000) { throw InvalidDataException::invalidAmount(); } - if ($this->getValidCardNumber() !== null && !preg_match('/^([0-9]{16}|[0-9]{20})$/', $this->getValidCardNumber())) { + if ($this->getValidCardNumber() !== null && ! preg_match('/^([0-9]{16}|[0-9]{20})$/', $this->getValidCardNumber())) { throw InvalidDataException::invalidCardNumber(); } $this->setFactorNumber($this->getTransactionCode()); - } + } /** * @throws GatewayException|PayIrException|TransactionFailedException */ - public function purchase(): void - { - $fields = http_build_query([ - 'api' => $this->getApi(), - 'amount' => $this->preparedAmount(), - 'redirect' => urlencode($this->preparedCallbackUrl()), - 'factorNumber' => $this->getFactorNumber(), - 'mobile' => $this->getMobile(), - 'description' => $this->getDescription(), + public function purchase(): void + { + $fields = http_build_query([ + 'api' => $this->getApi(), + 'amount' => $this->preparedAmount(), + 'redirect' => urlencode($this->preparedCallbackUrl()), + 'factorNumber' => $this->getFactorNumber(), + 'mobile' => $this->getMobile(), + 'description' => $this->getDescription(), 'validCardNumber' => $this->getValidCardNumber(), - ]); - - try { - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, self::SEND_URL); - curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + ]); + + try { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, self::SEND_URL); + curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, $this->getGatewayRequestOptions()['timeout'] ?? 30); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->getGatewayRequestOptions()['connection_timeout'] ?? 60); - $response = curl_exec($ch); - $ch_error = curl_error($ch); - curl_close($ch); + $response = curl_exec($ch); + $ch_error = curl_error($ch); + curl_close($ch); - if ($ch_error) { - throw GatewayException::connectionProblem(new Exception($ch_error)); + if ($ch_error) { + throw GatewayException::connectionProblem(new Exception($ch_error)); } - - $result = json_decode($response); - } catch(Exception $ex) { + + $result = json_decode($response); + } catch (Exception $ex) { throw GatewayException::connectionProblem($ex); - } + } - if(!isset($result->token)) { - if (isset($result->errorCode)) { - throw PayIrException::error($result->errorCode); - } + if (! isset($result->token)) { + if (isset($result->errorCode)) { + throw PayIrException::error($result->errorCode); + } - throw GatewayException::unknownResponse($response); - } + throw GatewayException::unknownResponse($response); + } - $this->setToken($result->token); - } + $this->setToken($result->token); + } - protected function postPurchase(): void + protected function postPurchase(): void { $this->transactionUpdate([ 'reference_number' => $this->getToken(), @@ -283,19 +257,15 @@ protected function postPurchase(): void } /** - * Pay Link function - * - * @return string - */ - public function purchaseUri(): string - { + * Pay Link function + */ + public function purchaseUri(): string + { return str_replace('{token}', $this->getReferenceNumber(), self::TOKEN_URL); - } + } /** * Purchase View Params function - * - * @return array */ protected function purchaseViewParams(): array { @@ -312,7 +282,7 @@ public function preVerify(): void { parent::preVerify(); - if (isset($this->request['status']) && $this->request['status'] !== "1") { + if (isset($this->request['status']) && $this->request['status'] !== '1') { throw PayIrException::error('-5'); } @@ -326,35 +296,35 @@ public function preVerify(): void /** * @throws GatewayException|PayIrException|TransactionFailedException */ - public function verify(): void - { - $fields = http_build_query([ - 'api' => $this->getApi(), - 'token' => $this->getToken(), - ]); - - try { - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, self::VERIFY_URL); - curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + public function verify(): void + { + $fields = http_build_query([ + 'api' => $this->getApi(), + 'token' => $this->getToken(), + ]); + + try { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, self::VERIFY_URL); + curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, $this->getGatewayRequestOptions()['timeout'] ?? 30); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->getGatewayRequestOptions()['connection_timeout'] ?? 60); - $response = curl_exec($ch); - $ch_error = curl_error($ch); - curl_close($ch); + $response = curl_exec($ch); + $ch_error = curl_error($ch); + curl_close($ch); - if ($ch_error) { + if ($ch_error) { throw GatewayException::connectionProblem(new Exception($ch_error)); - } + } - $result = json_decode($response); - } catch(Exception $ex) { + $result = json_decode($response); + } catch (Exception $ex) { throw GatewayException::connectionProblem($ex); } - if(!isset($result->amount, $result->transId, $result->cardNumber)) { + if (! isset($result->amount, $result->transId, $result->cardNumber)) { if (isset($result->errorCode)) { throw PayIrException::error($result->errorCode); } @@ -362,13 +332,13 @@ public function verify(): void throw GatewayException::unknownResponse($response); } - if (intval($result->amount) !== $this->preparedAmount()) { + if (intval($result->amount) !== $this->preparedAmount()) { throw PayIrException::error('-5'); - } + } $this->setTransId($result->transId); $this->setPayerCardNumber($result->cardNumber); - } + } protected function postVerify(): void { diff --git a/src/Gateways/PayIr/PayIrException.php b/src/Gateways/PayIr/PayIrException.php index 3bd588a..356c538 100644 --- a/src/Gateways/PayIr/PayIrException.php +++ b/src/Gateways/PayIr/PayIrException.php @@ -38,13 +38,13 @@ class PayIrException extends GatewayException ]; /** - * @param $error_code * @return $this + * * @throws TransactionFailedException */ public static function error($error_code) { - if (!isset(self::$errors[$error_code])) { + if (! isset(self::$errors[$error_code])) { return self::unknownResponse((string) $error_code); } diff --git a/src/Gateways/PayPing/PayPing.php b/src/Gateways/PayPing/PayPing.php index 65197b9..388530d 100755 --- a/src/Gateways/PayPing/PayPing.php +++ b/src/Gateways/PayPing/PayPing.php @@ -7,87 +7,71 @@ namespace Dena\IranPayment\Gateways\PayPing; -use Dena\IranPayment\Gateways\AbstractGateway; -use Dena\IranPayment\Gateways\GatewayInterface; - -use Exception; use Dena\IranPayment\Exceptions\GatewayException; use Dena\IranPayment\Exceptions\InvalidDataException; use Dena\IranPayment\Exceptions\IranPaymentException; use Dena\IranPayment\Exceptions\TransactionFailedException; - +use Dena\IranPayment\Gateways\AbstractGateway; +use Dena\IranPayment\Gateways\GatewayInterface; use Dena\IranPayment\Helpers\Currency; +use Exception; class PayPing extends AbstractGateway implements GatewayInterface { - private const PAY_URL = "https://api.payping.ir/v2/pay"; - private const VERIFY_URL = "https://api.payping.ir/v2/pay/verify"; - private const REDIRECT_URL = "https://api.payping.ir/v2/pay/gotoipg/{code}"; - public const CURRENCY = Currency::IRT; - - /** - * Token variable - * - * @var string|null - */ - protected ?string $token; + private const PAY_URL = 'https://api.payping.ir/v2/pay'; + + private const VERIFY_URL = 'https://api.payping.ir/v2/pay/verify'; + + private const REDIRECT_URL = 'https://api.payping.ir/v2/pay/gotoipg/{code}'; + + public const CURRENCY = Currency::IRT; + + /** + * Token variable + */ + protected ?string $token; /** * Ref ID variable - * - * @var string|null */ protected ?string $ref_id = null; /** * Client Ref ID variable - * - * @var string|null */ protected ?string $client_ref_id; /** * Code variable - * - * @var string|null */ protected ?string $code; - /** - * Add Fees variable - * - * @var bool - */ - private bool $add_fees = false; + /** + * Add Fees variable + */ + private bool $add_fees = false; /** * Payer Identity variable - * - * @var string|null */ protected ?string $payer_identity; /** * Payer Card Number variable - * - * @var string|null */ protected ?string $payer_card_number; - /** - * Gateway Name function - * - * @return string - */ - public function getName(): string - { - return 'payping'; - } + /** + * Gateway Name function + */ + public function getName(): string + { + return 'payping'; + } /** * Set Token function * - * @param string $token * @return $this */ public function setToken(string $token): self @@ -99,8 +83,6 @@ public function setToken(string $token): self /** * Get Token function - * - * @return string|null */ public function getToken(): ?string { @@ -110,7 +92,6 @@ public function getToken(): ?string /** * Set Ref ID function * - * @param string $ref_id * @return $this */ public function setRefId(string $ref_id): self @@ -122,8 +103,6 @@ public function setRefId(string $ref_id): self /** * Get Ref ID function - * - * @return string */ public function getRefId(): string { @@ -133,7 +112,6 @@ public function getRefId(): string /** * Set Client Ref ID function * - * @param string $client_ref_id * @return $this */ public function setClientRefId(string $client_ref_id): self @@ -145,8 +123,6 @@ public function setClientRefId(string $client_ref_id): self /** * Get Client Ref ID function - * - * @return string */ public function getClientRefId(): string { @@ -156,7 +132,6 @@ public function getClientRefId(): string /** * Set Code function * - * @param string $code * @return $this */ public function setCode(string $code): self @@ -168,8 +143,6 @@ public function setCode(string $code): self /** * Get Code function - * - * @return string */ public function getCode(): string { @@ -179,7 +152,6 @@ public function getCode(): string /** * Set Add Fees function * - * @param bool $add_fees * @return $this */ public function setAddFees(bool $add_fees): self @@ -191,8 +163,6 @@ public function setAddFees(bool $add_fees): self /** * Get Token function - * - * @return bool */ public function getAddFees(): bool { @@ -202,7 +172,6 @@ public function getAddFees(): bool /** * Set Payer Identity function * - * @param string $payer_identity * @return $this */ public function setPayerIdentity(string $payer_identity): self @@ -214,8 +183,6 @@ public function setPayerIdentity(string $payer_identity): self /** * Get Payer Identity function - * - * @return string */ public function getPayerIdentity(): string { @@ -225,7 +192,6 @@ public function getPayerIdentity(): string /** * Set Payer Card Number function * - * @param string $payer_card_number * @return $this */ public function setPayerCardNumber(string $payer_card_number): self @@ -237,8 +203,6 @@ public function setPayerCardNumber(string $payer_card_number): self /** * Get Payer Card Number function - * - * @return string|null */ public function getPayerCardNumber(): ?string { @@ -248,13 +212,13 @@ public function getPayerCardNumber(): ?string /** * Initialize function * - * @param array $parameters * @return $this + * * @throws InvalidDataException */ public function initialize(array $parameters = []): self - { - parent::initialize($parameters); + { + parent::initialize($parameters); $this->setGatewayCurrency(self::CURRENCY); @@ -263,7 +227,7 @@ public function initialize(array $parameters = []): self $this->setAddFees($parameters['add_fees'] ?? app('config')->get('iranpayment.payping.add_fees', false)); $payer_identity = $parameters['payer_identity'] ?? $this->getMobile() ?? $this->getEmail() ?? null; - if (!is_null($payer_identity)) { + if (! is_null($payer_identity)) { $this->setPayerIdentity($payer_identity); } @@ -273,7 +237,7 @@ public function initialize(array $parameters = []): self ); return $this; - } + } public function preparedAmount(): int { @@ -286,60 +250,60 @@ public function preparedAmount(): int return $amount; } - protected function prePurchase(): void - { - parent::prePurchase(); + protected function prePurchase(): void + { + parent::prePurchase(); if ($this->preparedAmount() < 100 || $this->preparedAmount() > 50000000) { throw InvalidDataException::invalidAmount(); } $this->setClientRefId($this->getTransactionCode()); - } + } /** * @throws GatewayException * @throws PayPingException */ public function purchase(): void - { - $fields = json_encode([ - 'amount' => $this->preparedAmount(), - 'returnUrl' => $this->preparedCallbackUrl(), - 'clientRefId' => $this->getClientRefId(), - 'payerName' => $this->getFullname(), - 'payerIdentity' => $this->getMobile() ?? $this->getEmail(), - 'description' => $this->getDescription(), - ]); - - try { - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, self::PAY_URL); - curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); - curl_setopt($ch, CURLOPT_HTTPHEADER, [ - 'Accept: application/json', - "Authorization: bearer {$this->getToken()}", - 'Content-Type: application/json', - ]); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + { + $fields = json_encode([ + 'amount' => $this->preparedAmount(), + 'returnUrl' => $this->preparedCallbackUrl(), + 'clientRefId' => $this->getClientRefId(), + 'payerName' => $this->getFullname(), + 'payerIdentity' => $this->getMobile() ?? $this->getEmail(), + 'description' => $this->getDescription(), + ]); + + try { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, self::PAY_URL); + curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Accept: application/json', + "Authorization: bearer {$this->getToken()}", + 'Content-Type: application/json', + ]); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, $this->getGatewayRequestOptions()['timeout'] ?? 30); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->getGatewayRequestOptions()['connection_timeout'] ?? 60); - $response = curl_exec($ch); - $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); - $ch_error = curl_error($ch); - curl_close($ch); + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $ch_error = curl_error($ch); + curl_close($ch); if ($ch_error) { throw GatewayException::connectionProblem(new Exception($ch_error)); } - $result = json_decode($response); - } catch(Exception $ex) { + $result = json_decode($response); + } catch (Exception $ex) { throw GatewayException::connectionProblem($ex); - } + } - if ($http_code !== 200) { + if ($http_code !== 200) { if (isset($result->Error)) { throw new PayPingException($result->Error, $http_code); } @@ -347,12 +311,12 @@ public function purchase(): void throw PayPingException::httpError($http_code); } - if(!isset($result->code)) { - throw GatewayException::unknownResponse($response); - } + if (! isset($result->code)) { + throw GatewayException::unknownResponse($response); + } - $this->setCode($result->code); - } + $this->setCode($result->code); + } protected function postPurchase(): void { @@ -363,20 +327,16 @@ protected function postPurchase(): void parent::postPurchase(); } - /** - * Pay Link function - * - * @return string - */ - public function purchaseUri(): string - { + /** + * Pay Link function + */ + public function purchaseUri(): string + { return str_replace('{code}', $this->getReferenceNumber(), self::REDIRECT_URL); - } + } /** * Purchase View Params function - * - * @return array */ protected function purchaseViewParams(): array { @@ -401,7 +361,7 @@ public function preVerify(): void throw PayPingException::httpError(404); } - if (!isset($this->request['refid']) && $this->getTrackingCode() === null) { + if (! isset($this->request['refid']) && $this->getTrackingCode() === null) { throw PayPingException::httpError(404); } @@ -421,53 +381,53 @@ public function preVerify(): void /** * @throws GatewayException|PayPingException|TransactionFailedException */ - public function verify(): void - { - $fields = json_encode([ - 'refId' => $this->getRefId(), - 'amount'=> $this->preparedAmount(), - ]); - - try { - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, self::VERIFY_URL); - curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); - curl_setopt($ch, CURLOPT_HTTPHEADER, [ - 'Accept: application/json', + public function verify(): void + { + $fields = json_encode([ + 'refId' => $this->getRefId(), + 'amount' => $this->preparedAmount(), + ]); + + try { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, self::VERIFY_URL); + curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Accept: application/json', "Authorization: bearer {$this->getToken()}", - 'Content-Type: application/json', - ]); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + 'Content-Type: application/json', + ]); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, $this->getGatewayRequestOptions()['timeout'] ?? 30); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->getGatewayRequestOptions()['connection_timeout'] ?? 60); - $result = curl_exec($ch); - $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - $ch_error = curl_error($ch); - curl_close($ch); + $result = curl_exec($ch); + $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $ch_error = curl_error($ch); + curl_close($ch); if ($ch_error) { throw GatewayException::connectionProblem(new Exception($ch_error)); } - $raw_result = $result; - $result = json_decode($result, true); - } catch(Exception $ex) { + $raw_result = $result; + $result = json_decode($result, true); + } catch (Exception $ex) { throw GatewayException::connectionProblem($ex); } - if($httpcode !== 200) { - throw PayPingException::httpError($httpcode); - } + if ($httpcode !== 200) { + throw PayPingException::httpError($httpcode); + } if (intval($result->amount) !== $this->preparedAmount()) { throw PayPingException::error(9); } - if (isset($result->cardNumber) || isset($result->cardHashPan)) { - $this->setPayerCardNumber($result->cardNumber ?? $result->cardHashPan); + if (isset($result->cardNumber) || isset($result->cardHashPan)) { + $this->setPayerCardNumber($result->cardNumber ?? $result->cardHashPan); } - } + } protected function postVerify(): void { @@ -482,6 +442,7 @@ private function feeCalculator(int $amount): int { $fees = $amount * 1 / 100; $amount += $fees > 5000 ? 5000 : $fees; + return intval($amount); } } diff --git a/src/Gateways/PayPing/PayPingException.php b/src/Gateways/PayPing/PayPingException.php index eabdea1..b495f93 100644 --- a/src/Gateways/PayPing/PayPingException.php +++ b/src/Gateways/PayPing/PayPingException.php @@ -49,7 +49,7 @@ class PayPingException extends GatewayException public static function httpError($http_code) { - if (!isset(self::$http_code_errors[$http_code])) { + if (! isset(self::$http_code_errors[$http_code])) { return self::unknownResponse((string) $http_code); } @@ -57,13 +57,13 @@ public static function httpError($http_code) } /** - * @param $error_code * @return $this + * * @throws TransactionFailedException */ public static function error($error_code) { - if (!isset(self::$errors[$error_code])) { + if (! isset(self::$errors[$error_code])) { return self::unknownResponse((string) $error_code); } diff --git a/src/Gateways/Sadad/Sadad.php b/src/Gateways/Sadad/Sadad.php index 6a92b75..9a15bbf 100644 --- a/src/Gateways/Sadad/Sadad.php +++ b/src/Gateways/Sadad/Sadad.php @@ -7,101 +7,79 @@ namespace Dena\IranPayment\Gateways\Sadad; -use Dena\IranPayment\Gateways\AbstractGateway; -use Dena\IranPayment\Gateways\GatewayInterface; - +use Carbon\Carbon; +use DateTime; use Dena\IranPayment\Exceptions\GatewayException; use Dena\IranPayment\Exceptions\InvalidDataException; use Dena\IranPayment\Exceptions\IranPaymentException; use Dena\IranPayment\Exceptions\TransactionFailedException; - +use Dena\IranPayment\Gateways\AbstractGateway; +use Dena\IranPayment\Gateways\GatewayInterface; use Dena\IranPayment\Helpers\Currency; use Dena\IranPayment\Http\CurlRequest; -use DateTime; -use Carbon\Carbon; - class Sadad extends AbstractGateway implements GatewayInterface { - private const SEND_URL = 'https://sadad.shaparak.ir/vpg/api/v0/Request/PaymentRequest'; + private const SEND_URL = 'https://sadad.shaparak.ir/vpg/api/v0/Request/PaymentRequest'; + private const VERIFY_URL = 'https://sadad.shaparak.ir/vpg/api/v0/Advice/Verify'; - private const TOKEN_URL = "https://sadad.shaparak.ir/VPG/Purchase?Token={token}"; - public const CURRENCY = Currency::IRR; + + private const TOKEN_URL = 'https://sadad.shaparak.ir/VPG/Purchase?Token={token}'; + + public const CURRENCY = Currency::IRR; /** * Merchant ID variable - * - * @var string|null */ protected ?string $merchant_id; /** * Terminal ID variable - * - * @var string|null */ protected ?string $terminal_id; /** * Terminal Key variable - * - * @var string|null */ protected ?string $terminal_key; /** * Token variable - * - * @var string|null */ protected ?string $token; /** * Order Id variable - * - * @var string|null */ protected ?string $order_id; /** * Application Name variable - * - * @var string|null */ protected ?string $app_name; /** * Local Date Time variable - * - * @var DateTime|null */ protected ?DateTime $local_date_time; /** * System Trace Number variable - * - * @var string|null */ protected ?string $system_trace_number; /** * Retrival Reference Number variable - * - * @var string|null */ protected ?string $retrival_reference_number; /** * Response Description variable - * - * @var string|null */ protected ?string $response_description; /** * Gateway Name function - * - * @return string */ public function getName(): string { @@ -111,7 +89,6 @@ public function getName(): string /** * Set Merchant Id function * - * @param string $merchant_id * @return $this */ public function setMerchantId(string $merchant_id): self @@ -123,8 +100,6 @@ public function setMerchantId(string $merchant_id): self /** * Get Merchant Id function - * - * @return string|null */ public function getMerchantId(): ?string { @@ -134,7 +109,6 @@ public function getMerchantId(): ?string /** * Set Terminal Id function * - * @param string $terminal_id * @return $this */ public function setTerminalId(string $terminal_id): self @@ -146,8 +120,6 @@ public function setTerminalId(string $terminal_id): self /** * Get Terminal Id function - * - * @return string|null */ public function getTerminalId(): ?string { @@ -157,7 +129,6 @@ public function getTerminalId(): ?string /** * Set Terminal Key function * - * @param string $terminal_key * @return $this */ public function setTerminalKey(string $terminal_key): self @@ -169,8 +140,6 @@ public function setTerminalKey(string $terminal_key): self /** * Get Terminal Key function - * - * @return string|null */ public function getTerminalKey(): ?string { @@ -180,7 +149,6 @@ public function getTerminalKey(): ?string /** * Set Order Number function * - * @param string $order_id * @return $this */ public function setOrderId(string $order_id): self @@ -192,8 +160,6 @@ public function setOrderId(string $order_id): self /** * Get Order Id function - * - * @return string|null */ public function getOrderId(): ?string { @@ -203,7 +169,6 @@ public function getOrderId(): ?string /** * Set Token function * - * @param $token * @return $this */ public function setToken($token): self @@ -215,8 +180,6 @@ public function setToken($token): self /** * Get Token function - * - * @return string|null */ public function getToken(): ?string { @@ -226,9 +189,7 @@ public function getToken(): ?string /** * Set Application Name function * - * @param string $name * @return $this - * */ public function setAppName(string $name): self { @@ -239,8 +200,6 @@ public function setAppName(string $name): self /** * Get Application Name function - * - * @return string|null */ public function getAppName(): ?string { @@ -250,9 +209,7 @@ public function getAppName(): ?string /** * Set Local DateTime function * - * @param DateTime $date_time * @return $this - * */ public function setLocalDateTime(DateTime $date_time): self { @@ -274,7 +231,6 @@ public function getLocalDateTime(): ?DateTime /** * Set Retrival Reference Number function * - * @param $retrival_reference_number * @return $this */ public function setRetrivalReferenceNumber($retrival_reference_number): self @@ -286,8 +242,6 @@ public function setRetrivalReferenceNumber($retrival_reference_number): self /** * Get Retrival Reference Number function - * - * @return string|null */ public function getRetrivalReferenceNumber(): ?string { @@ -297,7 +251,6 @@ public function getRetrivalReferenceNumber(): ?string /** * Set System Trace Number function * - * @param $system_trace_number * @return $this */ public function setSystemTraceNumber($system_trace_number): self @@ -309,8 +262,6 @@ public function setSystemTraceNumber($system_trace_number): self /** * Get System Trace Number function - * - * @return string|null */ public function getSystemTraceNumber(): ?string { @@ -320,7 +271,6 @@ public function getSystemTraceNumber(): ?string /** * Set Response Description function * - * @param $description * @return $this */ public function setResponseDescription(string $description): self @@ -332,8 +282,6 @@ public function setResponseDescription(string $description): self /** * Get Response Description function - * - * @return string|null */ public function getResponseDescription(): ?string { @@ -342,14 +290,11 @@ public function getResponseDescription(): ?string /** * Sign Data function - * - * @param string $str - * @return string */ private function signData(string $str): string { $key = base64_decode($this->terminal_key); - $ciphertext = OpenSSL_encrypt($str,"DES-EDE3", $key, OPENSSL_RAW_DATA); + $ciphertext = openssl_encrypt($str, 'DES-EDE3', $key, OPENSSL_RAW_DATA); return base64_encode($ciphertext); } @@ -357,8 +302,8 @@ private function signData(string $str): string /** * Initialize function * - * @param array $parameters * @return $this + * * @throws InvalidDataException */ public function initialize(array $parameters = []): self @@ -388,7 +333,7 @@ public function initialize(array $parameters = []): self return $this; } - protected function httpRequest(string $url, array $data = [], string $method = "POST") : object + protected function httpRequest(string $url, array $data = [], string $method = 'POST'): object { $curl = new CurlRequest($url, $method); $result = $curl->execute(json_encode($data)); @@ -403,7 +348,7 @@ protected function prePurchase(): void { parent::prePurchase(); - if ($this->preparedAmount() < 10000 || $this->preparedAmount() > 500000000) { + if ($this->preparedAmount() < 10000 || $this->preparedAmount() > 1000000000) { throw InvalidDataException::invalidAmount(); } @@ -444,7 +389,7 @@ public function purchase(): void throw SadadException::error($result->ResCode, $result->Description ?? null); } - if (!isset($result->Token)) { + if (! isset($result->Token)) { throw GatewayException::unknownResponse(json_encode($result)); } @@ -462,7 +407,7 @@ protected function postPurchase(): void 'app_name' => $this->getAppName(), 'local_date_time' => $this->getLocalDateTime(), 'purchase_description' => $this->getResponseDescription(), - ] + ], ]); parent::postPurchase(); @@ -470,8 +415,6 @@ protected function postPurchase(): void /** * Pay Link function - * - * @return string */ public function purchaseUri(): string { @@ -480,8 +423,6 @@ public function purchaseUri(): string /** * Purchase View Params function - * - * @return array */ protected function purchaseViewParams(): array { @@ -505,7 +446,7 @@ public function preVerify(): void } $token = $this->getTransaction()->gateway_data['token'] ?? null; - if (!isset($token)) { + if (! isset($token)) { throw SadadException::error(-1); } @@ -530,7 +471,7 @@ public function verify(): void $result = $this->httpRequest(self::VERIFY_URL, $data); if ( - !isset( + ! isset( $result->Amount, $result->SystemTraceNo, $result->RetrivalRefNo, @@ -562,7 +503,7 @@ protected function postVerify(): void 'system_trace_number' => $this->getSystemTraceNumber(), 'retrival_reference_number' => $this->getRetrivalReferenceNumber(), 'verify_description' => $this->getResponseDescription(), - ] + ], ]); parent::postVerify(); diff --git a/src/Gateways/Sadad/SadadException.php b/src/Gateways/Sadad/SadadException.php index 939b6c9..65e7405 100644 --- a/src/Gateways/Sadad/SadadException.php +++ b/src/Gateways/Sadad/SadadException.php @@ -60,14 +60,13 @@ class SadadException extends GatewayException ]; /** - * @param int $error_code - * @param string|null $description * @return SadadException + * * @throws TransactionFailedException */ - public static function error(int $error_code, string $description = null) + public static function error(int $error_code, ?string $description = null) { - if (!isset(self::$errors[$error_code])) { + if (! isset(self::$errors[$error_code])) { return self::unknownResponse($error_code.'-'.$description); } @@ -75,7 +74,7 @@ public static function error(int $error_code, string $description = null) throw new TransactionFailedException(self::$errors[$error_code], $error_code); } - if ($error_code == -1 && !empty($description)) { + if ($error_code == -1 && ! empty($description)) { return new self($description, $error_code); } diff --git a/src/Gateways/Saman/Saman.php b/src/Gateways/Saman/Saman.php index 23caecc..6857b59 100644 --- a/src/Gateways/Saman/Saman.php +++ b/src/Gateways/Saman/Saman.php @@ -7,51 +7,43 @@ namespace Dena\IranPayment\Gateways\Saman; -use Dena\IranPayment\Gateways\AbstractGateway; -use Dena\IranPayment\Gateways\GatewayInterface; - use Dena\IranPayment\Exceptions\GatewayException; use Dena\IranPayment\Exceptions\InvalidDataException; use Dena\IranPayment\Exceptions\IranPaymentException; - +use Dena\IranPayment\Gateways\AbstractGateway; +use Dena\IranPayment\Gateways\GatewayInterface; use Dena\IranPayment\Helpers\Currency; - use Exception; -use SoapFault; use SoapClient; +use SoapFault; class Saman extends AbstractGateway implements GatewayInterface { private const TOKEN_URL = 'https://sep.shaparak.ir/Payments/InitPayment.asmx?wsdl'; + private const PAYMENT_URL = 'https://sep.shaparak.ir/Payment.aspx'; + private const VERIFY_URL = 'https://verify.sep.ir/Payments/ReferencePayment.asmx?wsdl'; + private const CURRENCY = Currency::IRR; /** * Merchant ID variable - * - * @var string|null */ protected ?string $merchant_id; /** * ResNum variable - * - * @var string|null */ protected ?string $res_num; /** * Token variable - * - * @var string|null */ protected ?string $token; /** * Gateway Name function - * - * @return string */ public function getName(): string { @@ -61,7 +53,6 @@ public function getName(): string /** * Set Merchant Id function * - * @param string $merchant_id * @return $this */ public function setMerchantId(string $merchant_id): self @@ -73,8 +64,6 @@ public function setMerchantId(string $merchant_id): self /** * Get Merchant Id function - * - * @return string|null */ public function getMerchantId(): ?string { @@ -84,7 +73,7 @@ public function getMerchantId(): ?string /** * Set ResNum function * - * @param string|null $res_num + * @param string|null $res_num * @return $this */ public function setResNum(string $res_num): self @@ -96,8 +85,6 @@ public function setResNum(string $res_num): self /** * Get ResNum function - * - * @return string|null */ public function getResNum(): ?string { @@ -107,7 +94,7 @@ public function getResNum(): ?string /** * Set Token function * - * @param string|null $token + * @param string|null $token * @return $this */ public function setToken(string $token): self @@ -119,8 +106,6 @@ public function setToken(string $token): self /** * Get Token function - * - * @return string|null */ public function getToken(): ?string { @@ -130,8 +115,8 @@ public function getToken(): ?string /** * Initialize function * - * @param array $parameters * @return $this + * * @throws InvalidDataException */ public function initialize(array $parameters = []): self @@ -170,7 +155,7 @@ protected function prePurchase(): void */ public function purchase(): void { - try{ + try { $soap = new SoapClient(self::TOKEN_URL, [ 'encoding' => 'UTF-8', 'trace' => 1, @@ -184,7 +169,7 @@ public function purchase(): void $this->preparedAmount(), $this->getMobile(), ); - } catch(SoapFault|Exception $ex) { + } catch (SoapFault|Exception $ex) { throw GatewayException::connectionProblem($ex); } @@ -205,7 +190,6 @@ protected function postPurchase(): void } /** - * @return string * @throws GatewayException */ public function purchaseUri(): string @@ -215,8 +199,6 @@ public function purchaseUri(): string /** * Purchase View Params function - * - * @return array */ protected function purchaseViewParams(): array { @@ -269,7 +251,7 @@ public function preVerify(): void */ public function verify(): void { - try{ + try { $soap = new SoapClient(self::VERIFY_URL, [ 'encoding' => 'UTF-8', 'trace' => 1, @@ -281,7 +263,7 @@ public function verify(): void $this->getReferenceNumber(), $this->getMerchantId() ); - } catch(SoapFault|Exception $ex) { + } catch (SoapFault|Exception $ex) { throw GatewayException::connectionProblem($ex); } diff --git a/src/Gateways/Saman/SamanException.php b/src/Gateways/Saman/SamanException.php index f477874..e731c2e 100644 --- a/src/Gateways/Saman/SamanException.php +++ b/src/Gateways/Saman/SamanException.php @@ -6,30 +6,30 @@ class SamanException extends GatewayException { - public static array $errors = [ - -1 => 'خطا در پردازش اطلاعات ارسالی (مشکل در یکی از ورودی‌ها و ناموفق بودن فراخوانی متد برگشت تراکنش)', - -3 => 'ورودی‌ها حاوی کارکترهای غیرمجاز می‌باشند.', - -4 => 'کلمه عبور یا کد فروشنده اشتباه است.', - -6 => 'سند قبلا برگشت کامل یافته است.', - -7 => 'رسید دیجیتالی تهی است.', - -8 => 'طول ورودی‌ها بیشتر از حد مجاز است.', - -9 => 'وجود کارکترهای غیرمجاز در مبلغ برگشتی', - -10 => 'رسید دیجیتالی به صورت Base64 نیست.', - -11 => 'طول ورودی‌ها کمتر از حد مجاز است.', - -12 => 'مبلغ برگشتی منفی است.', - -13 => 'مبلغ برگشتی برای برگشت جزئی بیش از مبلغ برگشت نخورده‌ی رسید دیجیتالی است.', - -14 => 'چنین تراکنشی تعریف نشده است.', - -15 => 'مبلغ برگشتی به صورت اعشاری داده شده است.', - -16 => 'خطای داخلی سیستم', - -17 => 'برگشت زدن جزئی تراکنش مجاز نمی‌باشد.', - -18 => 'آدرس IP فروشنده نامعتبر است.', + public static array $errors = [ + -1 => 'خطا در پردازش اطلاعات ارسالی (مشکل در یکی از ورودی‌ها و ناموفق بودن فراخوانی متد برگشت تراکنش)', + -3 => 'ورودی‌ها حاوی کارکترهای غیرمجاز می‌باشند.', + -4 => 'کلمه عبور یا کد فروشنده اشتباه است.', + -6 => 'سند قبلا برگشت کامل یافته است.', + -7 => 'رسید دیجیتالی تهی است.', + -8 => 'طول ورودی‌ها بیشتر از حد مجاز است.', + -9 => 'وجود کارکترهای غیرمجاز در مبلغ برگشتی', + -10 => 'رسید دیجیتالی به صورت Base64 نیست.', + -11 => 'طول ورودی‌ها کمتر از حد مجاز است.', + -12 => 'مبلغ برگشتی منفی است.', + -13 => 'مبلغ برگشتی برای برگشت جزئی بیش از مبلغ برگشت نخورده‌ی رسید دیجیتالی است.', + -14 => 'چنین تراکنشی تعریف نشده است.', + -15 => 'مبلغ برگشتی به صورت اعشاری داده شده است.', + -16 => 'خطای داخلی سیستم', + -17 => 'برگشت زدن جزئی تراکنش مجاز نمی‌باشد.', + -18 => 'آدرس IP فروشنده نامعتبر است.', - 51 => 'موجودی حساب خریدار کافی نیست.', + 51 => 'موجودی حساب خریدار کافی نیست.', - -100 => 'تراکنش ناموفق میباشد', - -101 => 'تراکنش توسط خریدار کنسل شده است.', - -102 => 'مبلغ واریزی اشتباه است. این مبلغ به حساب شما برگشت خواهد خورد.', - ]; + -100 => 'تراکنش ناموفق میباشد', + -101 => 'تراکنش توسط خریدار کنسل شده است.', + -102 => 'مبلغ واریزی اشتباه است. این مبلغ به حساب شما برگشت خواهد خورد.', + ]; public static function error($error_code) { diff --git a/src/Gateways/Test/TestException.php b/src/Gateways/Test/TestException.php index f7c5a4c..14760ec 100644 --- a/src/Gateways/Test/TestException.php +++ b/src/Gateways/Test/TestException.php @@ -6,9 +6,9 @@ class TestException extends GatewayException { - public static array $errors = [ - -100 => 'تراکنش ناموفق میباشد', - ]; + public static array $errors = [ + -100 => 'تراکنش ناموفق میباشد', + ]; public static function error($error_code) { diff --git a/src/Gateways/Test/TestGateway.php b/src/Gateways/Test/TestGateway.php index 0c5a406..2c5ce6c 100644 --- a/src/Gateways/Test/TestGateway.php +++ b/src/Gateways/Test/TestGateway.php @@ -6,7 +6,6 @@ use Dena\IranPayment\Gateways\AbstractGateway; use Dena\IranPayment\Gateways\GatewayInterface; use Dena\IranPayment\Helpers\Currency; -use Exception; class TestGateway extends AbstractGateway implements GatewayInterface { @@ -33,11 +32,11 @@ public function initialize(array $parameters = []): self return $this; } - protected function prePurchase(): void - { + protected function prePurchase(): void + { parent::prePurchase(); - if ($this->preparedAmount() < 0 || $this->preparedAmount() > 500000000) { + if ($this->preparedAmount() < 0 || $this->preparedAmount() > 1000000000) { throw InvalidDataException::invalidAmount(); } } @@ -51,8 +50,6 @@ public function purchase(): void /** * Purchase View Params function - * - * @return array */ protected function purchaseViewParams(): array { @@ -64,8 +61,6 @@ protected function purchaseViewParams(): array /** * Pay Link function - * - * @return string */ public function purchaseUri(): string { @@ -97,7 +92,7 @@ public function verify(): void } $trackingCode = rand(111111, 999999); - $this->transactionSucceed([ + $this->transactionSucceed([ 'card_number' => rand(1111, 9999).'********'.rand(1111, 9999), 'tracking_code' => $trackingCode, 'reference_number' => 'RefNum-'.$trackingCode, diff --git a/src/Gateways/Test/TestGatewayController.php b/src/Gateways/Test/TestGatewayController.php index ddb53a3..bfae678 100644 --- a/src/Gateways/Test/TestGatewayController.php +++ b/src/Gateways/Test/TestGatewayController.php @@ -5,10 +5,8 @@ use Dena\IranPayment\IranPayment; use Dena\IranPayment\Models\IranPaymentTransaction; -use Illuminate\Http\Request; - -class TestGatewayController { - +class TestGatewayController +{ public function paymentView() { $payment = IranPayment::create('test'); diff --git a/src/Gateways/Zarinpal/Zarinpal.php b/src/Gateways/Zarinpal/Zarinpal.php index 2243c33..3ca4bcc 100644 --- a/src/Gateways/Zarinpal/Zarinpal.php +++ b/src/Gateways/Zarinpal/Zarinpal.php @@ -7,77 +7,65 @@ namespace Dena\IranPayment\Gateways\Zarinpal; -use Dena\IranPayment\Gateways\AbstractGateway; -use Dena\IranPayment\Gateways\GatewayInterface; - use Dena\IranPayment\Exceptions\GatewayException; use Dena\IranPayment\Exceptions\InvalidDataException; use Dena\IranPayment\Exceptions\IranPaymentException; use Dena\IranPayment\Exceptions\TransactionFailedException; - +use Dena\IranPayment\Gateways\AbstractGateway; +use Dena\IranPayment\Gateways\GatewayInterface; use Dena\IranPayment\Helpers\Currency; - use Exception; -use SoapFault; use SoapClient; +use SoapFault; class Zarinpal extends AbstractGateway implements GatewayInterface { - private const WSDL_URL = "https://www.zarinpal.com/pg/services/WebGate/wsdl"; - private const WEB_GATE_URL = "https://www.zarinpal.com/pg/StartPay/{Authority}"; - private const ZARIN_GATE_URL = "https://www.zarinpal.com/pg/StartPay/{Authority}/ZarinGate"; - private const SANDBOX_URL = "https://sandbox.zarinpal.com/pg/StartPay/{Authority}"; - public const CURRENCY = Currency::IRT; - - /** - * Merchant ID variable - * - * @var string|null - */ - protected ?string $merchant_id; + private const WSDL_URL = 'https://www.zarinpal.com/pg/services/WebGate/wsdl'; + + private const WEB_GATE_URL = 'https://www.zarinpal.com/pg/StartPay/{Authority}'; + + private const ZARIN_GATE_URL = 'https://www.zarinpal.com/pg/StartPay/{Authority}/ZarinGate'; + + private const SANDBOX_URL = 'https://sandbox.zarinpal.com/pg/StartPay/{Authority}'; + + public const CURRENCY = Currency::IRT; + + /** + * Merchant ID variable + */ + protected ?string $merchant_id; /** * Authority variable - * - * @var string|null */ protected ?string $authority; /** * Ref Id variable - * - * @var string|null */ protected ?string $ref_id; /** * Sandbox mod variable - * - * @var string */ protected string $type = 'normal'; /** * Add Fees variable - * - * @var bool */ private bool $add_fees = false; - /** - * Gateway Name function - * - * @return string - */ - public function getName(): string - { - return 'zarinpal'; - } + /** + * Gateway Name function + */ + public function getName(): string + { + return 'zarinpal'; + } /** * Set Merchant ID function * - * @param string $merchant_id * @return $this */ public function setMerchantId(string $merchant_id): self @@ -89,8 +77,6 @@ public function setMerchantId(string $merchant_id): self /** * Get Merchant ID function - * - * @return string|null */ public function getMerchantId(): ?string { @@ -100,7 +86,6 @@ public function getMerchantId(): ?string /** * Set Type function * - * @param string $type * @return $this */ public function setType(string $type): self @@ -112,8 +97,6 @@ public function setType(string $type): self /** * Get Type function - * - * @return string */ public function getType(): string { @@ -123,7 +106,6 @@ public function getType(): string /** * Set Authority function * - * @param string $authority * @return $this */ public function setAuthority(string $authority): self @@ -135,8 +117,6 @@ public function setAuthority(string $authority): self /** * Get Authority function - * - * @return string|null */ public function getAuthority(): ?string { @@ -146,7 +126,6 @@ public function getAuthority(): ?string /** * Set Ref ID function * - * @param string $ref_id * @return $this */ public function setRefId(string $ref_id): self @@ -158,8 +137,6 @@ public function setRefId(string $ref_id): self /** * Get Ref ID function - * - * @return string|null */ public function getRefId(): ?string { @@ -169,7 +146,6 @@ public function getRefId(): ?string /** * Set Add Fees function * - * @param bool $add_fees * @return $this */ public function setAddFees(bool $add_fees): self @@ -181,8 +157,6 @@ public function setAddFees(bool $add_fees): self /** * Get Token function - * - * @return bool */ public function getAddFees(): bool { @@ -192,8 +166,8 @@ public function getAddFees(): bool /** * Initialize function * - * @param array $parameters * @return $this + * * @throws InvalidDataException */ public function initialize(array $parameters = []): self @@ -233,31 +207,31 @@ public function preparedAmount(): int * @throws GatewayException * @throws TransactionFailedException */ - public function purchase(): void - { - $fields = [ - 'MerchantID' => $this->getMerchantId(), + public function purchase(): void + { + $fields = [ + 'MerchantID' => $this->getMerchantId(), 'Amount' => $this->preparedAmount(), 'Description' => $this->getDescription(), 'Email' => $this->getEmail(), 'Mobile' => $this->getMobile(), 'CallbackURL' => $this->preparedCallbackUrl(), - ]; + ]; - try { - $soap = new SoapClient(self::WSDL_URL, [ - 'encoding' => 'UTF-8', - 'trace' => 1, - 'exceptions' => 1, - 'connection_timeout' => $this->getGatewayRequestOptions()['connection_timeout'] ?? 60, - ]); + try { + $soap = new SoapClient(self::WSDL_URL, [ + 'encoding' => 'UTF-8', + 'trace' => 1, + 'exceptions' => 1, + 'connection_timeout' => $this->getGatewayRequestOptions()['connection_timeout'] ?? 60, + ]); $result = $soap->PaymentRequest($fields); - } catch(SoapFault|Exception $ex) { - throw GatewayException::connectionProblem($ex); - } + } catch (SoapFault|Exception $ex) { + throw GatewayException::connectionProblem($ex); + } - if (!isset($result->Status)) { + if (! isset($result->Status)) { throw GatewayException::unknownResponse(json_encode($result)); } @@ -265,12 +239,12 @@ public function purchase(): void throw ZarinpalException::error($result->Status); } - if (!isset($result->Authority)) { + if (! isset($result->Authority)) { throw GatewayException::unknownResponse(json_encode($result)); } $this->setAuthority($result->Authority); - } + } protected function postPurchase(): void { @@ -284,12 +258,11 @@ protected function postPurchase(): void /** * Purchase Uri function * - * @return string * @throws InvalidDataException */ - public function purchaseUri(): string - { - switch ($this->getType()) { + public function purchaseUri(): string + { + switch ($this->getType()) { case 'normal': $url = self::WEB_GATE_URL; break; @@ -306,12 +279,10 @@ public function purchaseUri(): string } return str_replace('{Authority}', $this->getReferenceNumber(), $url); - } + } /** * Purchase View Params function - * - * @return array */ protected function purchaseViewParams(): array { @@ -337,23 +308,23 @@ public function preVerify(): void } $this->setAuthority($this->getReferenceNumber()); - } + } /** * @throws GatewayException * @throws ZarinpalException * @throws TransactionFailedException */ - public function verify(): void - { - $fields = [ - 'MerchantID' => $this->getMerchantId(), - 'Authority' => $this->getAuthority(), - 'Amount' => $this->preparedAmount(), - ]; - - try { - $soap = new SoapClient(self::WSDL_URL, [ + public function verify(): void + { + $fields = [ + 'MerchantID' => $this->getMerchantId(), + 'Authority' => $this->getAuthority(), + 'Amount' => $this->preparedAmount(), + ]; + + try { + $soap = new SoapClient(self::WSDL_URL, [ 'encoding' => 'UTF-8', 'trace' => 1, 'exceptions' => 1, @@ -361,11 +332,11 @@ public function verify(): void ]); $result = $soap->PaymentVerification($fields); - } catch(SoapFault|Exception $ex) { + } catch (SoapFault|Exception $ex) { throw GatewayException::connectionProblem($ex); } - if (!isset($result->Status)) { + if (! isset($result->Status)) { throw GatewayException::unknownResponse(json_encode($result)); } @@ -373,12 +344,12 @@ public function verify(): void throw ZarinpalException::error($result->Status); } - if (!isset($result->RefID)) { + if (! isset($result->RefID)) { throw GatewayException::unknownResponse(json_encode($result)); } $this->setRefId($result->RefID); - } + } protected function postVerify(): void { @@ -393,6 +364,7 @@ private function feeCalculator(int $amount): int { $fees = $amount * 1 / 100; $amount += $fees; + return intval($amount); } } diff --git a/src/Gateways/Zarinpal/ZarinpalException.php b/src/Gateways/Zarinpal/ZarinpalException.php index cbae1bd..6d2d7c0 100644 --- a/src/Gateways/Zarinpal/ZarinpalException.php +++ b/src/Gateways/Zarinpal/ZarinpalException.php @@ -8,10 +8,10 @@ class ZarinpalException extends GatewayException { public static array $errors = [ - -1 => 'اطلاعات ارسال شده ناقص است.', - -2 => 'IP و یا مرچنت کد پذیرنده صحیح نیست.', - -3 => 'با توجه به محدودیت های شاپرک امکان پرداخت با رقم درخواست شده میسر نمی باشد.', - -4 => 'سطح تایید پذیرنده پایین تر از سطح نقره ای است.', + -1 => 'اطلاعات ارسال شده ناقص است.', + -2 => 'IP و یا مرچنت کد پذیرنده صحیح نیست.', + -3 => 'با توجه به محدودیت های شاپرک امکان پرداخت با رقم درخواست شده میسر نمی باشد.', + -4 => 'سطح تایید پذیرنده پایین تر از سطح نقره ای است.', -11 => 'درخواست مورد نظر یافت نشد.', -12 => 'امکان ویرایش درخواست میسر نمی باشد.', -21 => 'هیچ نوع عملیات مالی برای این تراکنش یافت نشد.', @@ -24,16 +24,16 @@ class ZarinpalException extends GatewayException -54 => 'درخواست مورد نظر آرشیو شده است.', 100 => 'عملیات با موفقیت انجام گردیده است.', 101 => 'عملیات پرداخت موفق بوده و قبلا PaymentVerification تراکنش انجام شده است.', - ]; + ]; /** - * @param $error_code * @return $this + * * @throws TransactionFailedException */ public static function error($error_code): self { - if (!isset(self::$errors[$error_code])) { + if (! isset(self::$errors[$error_code])) { return self::unknownResponse((string) $error_code); } diff --git a/src/Helpers/Currency.php b/src/Helpers/Currency.php index a4864b0..6f3cda0 100644 --- a/src/Helpers/Currency.php +++ b/src/Helpers/Currency.php @@ -4,17 +4,19 @@ class Currency { - const IRR = 'IRR'; - const IRT = 'IRT'; + const IRR = 'IRR'; - public static function TomanToRial($rial): int - { - return abs(intval($rial) * 10); - } + const IRT = 'IRT'; - public static function RialToToman($toman): int - { - $toman = abs(intval($toman)); - return ($toman == 0) ? 0 : intval($toman / 10); - } -} \ No newline at end of file + public static function TomanToRial($rial): int + { + return abs(intval($rial) * 10); + } + + public static function RialToToman($toman): int + { + $toman = abs(intval($toman)); + + return ($toman == 0) ? 0 : intval($toman / 10); + } +} diff --git a/src/Helpers/Helpers.php b/src/Helpers/Helpers.php index eeaf079..645f20b 100644 --- a/src/Helpers/Helpers.php +++ b/src/Helpers/Helpers.php @@ -4,15 +4,15 @@ class Helpers { - public static function urlQueryBuilder(string $url, array $params = []) - { - $query = count($params) ? http_build_query($params) : ''; + public static function urlQueryBuilder(string $url, array $params = []) + { + $query = count($params) ? http_build_query($params) : ''; - $question_mark = strpos($url, '?'); - if ($question_mark) { - return $url.'&'.$query; - } else { - return $url.'?'.$query; - } - } -} \ No newline at end of file + $question_mark = strpos($url, '?'); + if ($question_mark) { + return $url.'&'.$query; + } else { + return $url.'?'.$query; + } + } +} diff --git a/src/Http/CurlRequest.php b/src/Http/CurlRequest.php index c69368f..c4f38d2 100644 --- a/src/Http/CurlRequest.php +++ b/src/Http/CurlRequest.php @@ -8,10 +8,13 @@ class CurlRequest implements HttpRequestInterface { private $handle = null; + private int $timeout = 30; + private int $connectionTimeout = 60; - public function __construct(string $url, string $method = "GET") { + public function __construct(string $url, string $method = 'GET') + { $this->handle = curl_init($url); curl_setopt($this->handle, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, true); @@ -52,12 +55,12 @@ public function addOption(string $name, $value): self public function execute($data = null) { try { - if (!empty($data)) { + if (! empty($data)) { curl_setopt($this->handle, CURLOPT_POSTFIELDS, $data); curl_setopt( $this->handle, CURLOPT_HTTPHEADER, - ['Content-Type: application/json', 'Content-Length: ' . strlen($data)] + ['Content-Type: application/json', 'Content-Length: '.strlen($data)] ); } diff --git a/src/Http/HttpRequestInterface.php b/src/Http/HttpRequestInterface.php index 323a31c..2010406 100644 --- a/src/Http/HttpRequestInterface.php +++ b/src/Http/HttpRequestInterface.php @@ -4,8 +4,11 @@ interface HttpRequestInterface { - public function addOption(string $name, $value) : HttpRequestInterface; + public function addOption(string $name, $value): HttpRequestInterface; + public function execute($data = null); + public function getInfo(string $name); + public function close(); } diff --git a/src/IranPayment.php b/src/IranPayment.php index ad0da68..19a02a9 100644 --- a/src/IranPayment.php +++ b/src/IranPayment.php @@ -2,22 +2,18 @@ namespace Dena\IranPayment; +use Dena\IranPayment\Exceptions\GatewayNotFoundException; use Dena\IranPayment\Gateways\AbstractGateway; use Dena\IranPayment\Gateways\Digipay\Digipay; use Dena\IranPayment\Gateways\GatewayInterface; - +use Dena\IranPayment\Gateways\Novinopay\Novinopay; use Dena\IranPayment\Gateways\PayIr\PayIr; -use Dena\IranPayment\Gateways\Saman\Saman; -use Dena\IranPayment\Gateways\Sadad\Sadad; use Dena\IranPayment\Gateways\PayPing\PayPing; +use Dena\IranPayment\Gateways\Sadad\Sadad; +use Dena\IranPayment\Gateways\Saman\Saman; use Dena\IranPayment\Gateways\Test\TestGateway; use Dena\IranPayment\Gateways\Zarinpal\Zarinpal; -use Dena\IranPayment\Gateways\Novinopay\Novinopay; - -use Dena\IranPayment\Exceptions\GatewayNotFoundException; - use Dena\IranPayment\Models\IranPaymentTransaction; - use Illuminate\Http\Request; class IranPayment @@ -25,27 +21,34 @@ class IranPayment /** * Gateways classes constant names */ - const SAMAN = 'saman'; - const SADAD = 'sadad'; - const PAYIR = 'payir'; - const PAYDOTIR = 'pay.ir'; - const ZARINPAL = 'zarinpal'; - const PAYPING = 'payping'; + const SAMAN = 'saman'; + + const SADAD = 'sadad'; + + const PAYIR = 'payir'; + + const PAYDOTIR = 'pay.ir'; + + const ZARINPAL = 'zarinpal'; + + const PAYPING = 'payping'; + const NOVINOPAY = 'novinopay'; - const DIGIPAY = 'digipay'; - const TEST = 'test'; + + const DIGIPAY = 'digipay'; + + const TEST = 'test'; /** * Gateway variable - * - * @var GatewayInterface */ protected GatewayInterface $gateway; /** * Constructor function * - * @param GatewayInterface|string $gateway + * @param GatewayInterface|string $gateway + * * @throws GatewayNotFoundException */ public function __construct($gateway) @@ -56,8 +59,9 @@ public function __construct($gateway) /** * Set Gateway function * - * @param GatewayInterface|string $gateway + * @param GatewayInterface|string $gateway * @return $this + * * @throws GatewayNotFoundException */ public function setGateway($gateway): self @@ -101,7 +105,7 @@ public function setGateway($gateway): self case self::TEST: case TestGateway::class: if (app('config')->get('app.env', 'production') === 'production' || - !app('config')->get('iranpayment.test.active', false)) { + ! app('config')->get('iranpayment.test.active', false)) { throw GatewayNotFoundException::productionUnavailableGateway(); } @@ -116,8 +120,6 @@ public function setGateway($gateway): self /** * Get Gateway function - * - * @return GatewayInterface */ public function getGateway(): GatewayInterface { @@ -126,8 +128,6 @@ public function getGateway(): GatewayInterface /** * Build Gateway function - * - * @return GatewayInterface */ public function build(): GatewayInterface { @@ -136,8 +136,6 @@ public function build(): GatewayInterface /** * Get Supported Gateways function - * - * @return array */ public function getSupportedGateways(): array { @@ -162,8 +160,8 @@ public function getSupportedGateways(): array /** * Create new Instance of IranPayment * - * @param GatewayInterface|string|null $gateway - * @return GatewayInterface + * @param GatewayInterface|string|null $gateway + * * @throws GatewayNotFoundException */ public static function create($gateway = null): GatewayInterface @@ -171,7 +169,7 @@ public static function create($gateway = null): GatewayInterface if (is_null($gateway)) { $gateway = app('config')->get('iranpayment.default'); - if (!isset($gateway)) { + if (! isset($gateway)) { throw GatewayNotFoundException::defaultGatewayDoesNotSet(); } } @@ -182,8 +180,8 @@ public static function create($gateway = null): GatewayInterface /** * Detect Gateway and Create new Instance of IranPayment * - * @param IranPaymentTransaction|Request|null $data - * @return GatewayInterface + * @param IranPaymentTransaction|Request|null $data + * * @throws GatewayNotFoundException */ public static function detect($data = null): GatewayInterface @@ -201,10 +199,14 @@ public static function detect($data = null): GatewayInterface if (isset($transaction_code)) { $transaction = IranPaymentTransaction::where('code', $transaction_code)->first(); - if (isset($transaction)) $gateway = $transaction->gateway; + if (isset($transaction)) { + $gateway = $transaction->gateway; + } } - if (!isset($gateway)) throw new GatewayNotFoundException; + if (! isset($gateway)) { + throw new GatewayNotFoundException; + } $gateway = self::create($gateway); diff --git a/src/IranPaymentServiceProvider.php b/src/IranPaymentServiceProvider.php index 089219b..84ba7a9 100644 --- a/src/IranPaymentServiceProvider.php +++ b/src/IranPaymentServiceProvider.php @@ -53,8 +53,6 @@ public function register() /** * Check if app uses Lumen. - * - * @return bool */ private function isLumen(): bool { diff --git a/src/Models/IranPaymentTransaction.php b/src/Models/IranPaymentTransaction.php index 2404f95..8594d17 100644 --- a/src/Models/IranPaymentTransaction.php +++ b/src/Models/IranPaymentTransaction.php @@ -3,15 +3,14 @@ namespace Dena\IranPayment\Models; use DateTimeInterface; -use Illuminate\Database\Eloquent\Model; - use Dena\IranPayment\Traits\IranPaymentDatabase as DatabaseTrait; +use Illuminate\Database\Eloquent\Model; /** * An Eloquent Model: 'IranPaymentTransaction' * - * @property integer $id - * @property integer $amount + * @property int $id + * @property int $amount * @property string $gateway * @property string $status * @property string $full_name @@ -20,6 +19,7 @@ * @property string $currency * @property \Illuminate\Support\Carbon $created_at * @property \Illuminate\Support\Carbon $updated_at + * * @method static Model find(integer $id) * @method static Model where($key, $val) */ @@ -28,17 +28,22 @@ class IranPaymentTransaction extends Model use DatabaseTrait; const T_INIT = 0; + const T_SUCCEED = 1; + const T_FAILED = 2; + const T_PENDING = 3; + const T_VERIFY_PENDING = 4; + const T_PAID_BACK = 5; + const T_CANCELED = 6; /** * Prepare a date for array / JSON serialization. * - * @param \DateTimeInterface $date * @return string */ protected function serializeDate(DateTimeInterface $date) @@ -51,7 +56,7 @@ protected function serializeDate(DateTimeInterface $date) * * @var array */ - protected $fillable = [ + protected $fillable = [ 'gateway', 'amount', 'currency', @@ -72,7 +77,7 @@ protected function serializeDate(DateTimeInterface $date) * @var array */ protected $hidden = [ - 'gateway_data' + 'gateway_data', ]; /** @@ -91,21 +96,21 @@ protected function serializeDate(DateTimeInterface $date) */ protected $casts = [ 'extra' => 'array', - 'gateway_data' => 'array' + 'gateway_data' => 'array', ]; /** - * Get all of the owning payable models. + * Get all the owning payable models. */ public function payable() { return $this->morphTo(); } - public function getStatusTextAttribute() + public function getStatusTextAttribute(): string { //@TODO::add translation - switch($this->status) { + switch ($this->status) { case self::T_INIT: return 'ایجاد شده'; case self::T_SUCCEED: diff --git a/src/Traits/IranPaymentDatabase.php b/src/Traits/IranPaymentDatabase.php index 20d8cc7..85038a5 100644 --- a/src/Traits/IranPaymentDatabase.php +++ b/src/Traits/IranPaymentDatabase.php @@ -13,15 +13,11 @@ trait IranPaymentDatabase /** * IranPayment Table Name variable - * - * @var string */ private string $iranpayment_table = 'iranpayment_transactions'; /** * Get IranPayment Table Name function - * - * @return string */ public function getTable(): string { diff --git a/src/Traits/Payable.php b/src/Traits/Payable.php index 0a3d50b..b452bb2 100644 --- a/src/Traits/Payable.php +++ b/src/Traits/Payable.php @@ -6,8 +6,6 @@ trait Payable { /** * IranPayment Amount variable - * - * @var int|null */ private ?int $iranpayment_amount; @@ -19,7 +17,7 @@ trait Payable * * @var string|null */ - // protected ?string $iranpayment_amount_field; + // protected ?string $iranpayment_amount_field; /** * Get all of the payment's transactions. @@ -32,7 +30,6 @@ public function transactions() /** * Set IranPayment Amount function * - * @param int $amount * @return $this */ protected function setIranPaymentAmount(int $amount): self @@ -45,13 +42,14 @@ protected function setIranPaymentAmount(int $amount): self /** * Call IranPayment Purchase Method * - * @param null $gateway + * @param null $gateway * @return mixed + * * @throws \Dena\IranPayment\Exceptions\IranPaymentException */ public function pay($gateway = null) { - if (!isset($this->iranpayment_amount) && isset($this->iranpayment_amount_field)) { + if (! isset($this->iranpayment_amount) && isset($this->iranpayment_amount_field)) { $this->iranpayment_amount = intval($this->{$this->iranpayment_amount_field}); } diff --git a/src/Traits/PaymentData.php b/src/Traits/PaymentData.php index 75b77e3..fcf9b71 100644 --- a/src/Traits/PaymentData.php +++ b/src/Traits/PaymentData.php @@ -2,44 +2,35 @@ namespace Dena\IranPayment\Traits; -use Dena\IranPayment\Helpers\Helpers; -use Dena\IranPayment\Helpers\Currency; use Dena\IranPayment\Exceptions\InvalidDataException; +use Dena\IranPayment\Helpers\Currency; +use Dena\IranPayment\Helpers\Helpers; trait PaymentData { /** * Payment Amount variable - * - * @var int */ - protected int $amount; + protected int $amount; /** * Payment Currency variable - * - * @var string */ protected string $currency = Currency::IRR; /** * Gateway Currency variable - * - * @var string */ protected string $gateway_currency; /** * Payment Callback URL variable - * - * @var string|null */ protected ?string $callback_url; /** * Set Amount function * - * @param int $amount * @return $this */ public function setAmount(int $amount): self @@ -51,8 +42,6 @@ public function setAmount(int $amount): self /** * Get Amount function - * - * @return int */ public function getAmount(): int { @@ -62,16 +51,16 @@ public function getAmount(): int /** * Set Payment Currency function * - * @param string $currency * @return $this + * * @throws InvalidDataException */ public function setCurrency(string $currency): self { $currency = strtoupper($currency); - if (!in_array($currency, [Currency::IRR, Currency::IRT])) { - throw InvalidDataException::invalidCurrency(); + if (! in_array($currency, [Currency::IRR, Currency::IRT])) { + throw InvalidDataException::invalidCurrency(); } $this->currency = $currency; @@ -81,8 +70,6 @@ public function setCurrency(string $currency): self /** * Get Payment Currency function - * - * @return string */ public function getCurrency(): string { @@ -92,16 +79,16 @@ public function getCurrency(): string /** * Set Gateway Currency function * - * @param string $gateway_currency * @return $this + * * @throws InvalidDataException */ public function setGatewayCurrency(string $gateway_currency): self { $gateway_currency = strtoupper($gateway_currency); - if (!in_array($gateway_currency, [Currency::IRR, Currency::IRT])) { - throw InvalidDataException::invalidCurrency(); + if (! in_array($gateway_currency, [Currency::IRR, Currency::IRT])) { + throw InvalidDataException::invalidCurrency(); } $this->gateway_currency = $gateway_currency; @@ -111,8 +98,6 @@ public function setGatewayCurrency(string $gateway_currency): self /** * Get Payment Currency function - * - * @return string */ public function getGatewayCurrency(): string { @@ -122,7 +107,6 @@ public function getGatewayCurrency(): string /** * Set Callback Url function * - * @param string $callback_url * @return self */ public function setCallbackUrl(string $callback_url) @@ -134,8 +118,6 @@ public function setCallbackUrl(string $callback_url) /** * Get Callback Url function - * - * @return string|null */ public function getCallbackUrl(): ?string { @@ -144,8 +126,6 @@ public function getCallbackUrl(): ?string /** * Get Prepared Amount function - * - * @return int */ public function preparedAmount(): int { @@ -162,8 +142,6 @@ public function preparedAmount(): int /** * Get Prepared Callback URL function - * - * @return string|null */ public function preparedCallbackUrl(): ?string { @@ -172,7 +150,7 @@ public function preparedCallbackUrl(): ?string : $this->callback_url; return Helpers::urlQueryBuilder($callback_url, [ - app('config')->get('iranpayment.transaction_query_param', 'tc') => $this->getTransactionCode() + app('config')->get('iranpayment.transaction_query_param', 'tc') => $this->getTransactionCode(), ]); } } diff --git a/src/Traits/TransactionData.php b/src/Traits/TransactionData.php index 2b75d75..d8256b6 100644 --- a/src/Traits/TransactionData.php +++ b/src/Traits/TransactionData.php @@ -2,48 +2,40 @@ namespace Dena\IranPayment\Traits; +use Carbon\Carbon; use Dena\IranPayment\Exceptions\TransactionNotFoundException; - use Dena\IranPayment\Models\IranPaymentTransaction; - -use Carbon\Carbon; use Illuminate\Database\Eloquent\Collection; -use Illuminate\Support\Str; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Str; trait TransactionData { /** * Transaction variable - * - * @var IranPaymentTransaction|null */ protected ?IranPaymentTransaction $transaction = null; /** * Extra variable - * - * @var array|null */ protected ?array $extra = null; /** * Fillable data variable - * - * @var array */ protected array $fillableData = []; /** * Set Transaction function * - * @param IranPaymentTransaction|Model $transaction + * @param IranPaymentTransaction|Model $transaction * @return $this */ public function setTransaction(IranPaymentTransaction $transaction): self { $this->transaction = $transaction; - + if (isset($transaction->payable)) { $this->setPayable($transaction->payable); } @@ -61,8 +53,6 @@ public function setTransaction(IranPaymentTransaction $transaction): self /** * Get Transaction function - * - * @return IranPaymentTransaction|null */ public function getTransaction(): ?IranPaymentTransaction { @@ -72,7 +62,7 @@ public function getTransaction(): ?IranPaymentTransaction /** * Set FillableData function * - * @param FillableData $fillableData + * @param FillableData $fillableData * @return $this */ public function setFillableData(array $fillableData): self @@ -95,8 +85,9 @@ public function getFillableData(): array /** * Find Transaction function * - * @param string|int $uid + * @param string|int $uid * @return $this + * * @throws TransactionNotFoundException */ public function findTransaction($uid): self @@ -107,7 +98,7 @@ public function findTransaction($uid): self $transaction = IranPaymentTransaction::where('code', $uid)->first(); } - if (!isset($transaction)) { + if (! isset($transaction)) { throw new TransactionNotFoundException; } @@ -118,11 +109,6 @@ public function findTransaction($uid): self /** * Find Item Transactions - * - * @param $payable_id - * @param $payable_type - * @param $status - * @return Collection */ public function payableTransactions($payable_id, $payable_type = null, $status = null): Collection { @@ -199,24 +185,23 @@ public function getExtra() return isset($this->transaction) ? $this->transaction->extra : $this->extra; } - /** * Add Extra function * * @param [type] $val * @param [type] $key - * @return self + * * @throws \Exception */ public function addExtra($val, $key = null): self { - if (!empty($this->transaction) && !empty($this->transaction['id'])) { + if (! empty($this->transaction) && ! empty($this->transaction['id'])) { $extra = $this->getExtra(); - if(is_null($extra)) { + if (is_null($extra)) { $extra = []; } - if(is_array($extra)) { - if(!is_null($key)) { + if (is_array($extra)) { + if (! is_null($key)) { $extra[$key] = $val; } else { $extra[] = $val; @@ -228,7 +213,7 @@ public function addExtra($val, $key = null): self if (empty($this->extra)) { $this->extra = []; } - if(!is_null($key)) { + if (! is_null($key)) { $this->extra[$key] = $val; } else { $this->extra[] = $val; @@ -240,29 +225,22 @@ public function addExtra($val, $key = null): self /** * Payable variable - * - * @var Model|null */ protected ?Model $payable; /** * Payable id - * - * @var int|null */ protected ?int $payable_id; /** * Payable type - * - * @var string|null */ protected ?string $payable_type; /** * Set Payable function * - * @param Model $payable * @return $this */ public function setPayable(Model $payable): self @@ -279,30 +257,27 @@ public function setPayable(Model $payable): self */ public function getPayable() { - if ($this->payable) + if ($this->payable) { return $this->payable; - elseif($this->payable_id) + } elseif ($this->payable_id) { return $this->payable_id; + } return null; } /** * Set Payable function - * - * @param int $payableId - * @return self */ - public function setPayableId(int $payableId) : self + public function setPayableId(int $payableId): self { $this->payable_id = $payableId; + return $this; } /** * Get Payable id function - * - * @return int */ public function getPayableId(): int { @@ -311,9 +286,6 @@ public function getPayableId(): int /** * Set Payable function - * - * @param string $payableType - * @return self */ public function setPayableType(string $payableType): self { @@ -324,8 +296,6 @@ public function setPayableType(string $payableType): self /** * Get Payable id function - * - * @return string */ public function getPayableType(): string { @@ -345,7 +315,7 @@ protected function newTransaction(array $params = []): void )); $transaction->status = IranPaymentTransaction::T_INIT; - $transaction->code = Str::random(app('config')->get('iranpayment.code_length' ,16)); + $transaction->code = Str::random(app('config')->get('iranpayment.code_length', 16)); if (isset($this->payable)) { $transaction->payable()->associate($this->payable); @@ -361,33 +331,33 @@ protected function newTransaction(array $params = []): void protected function fillTransaction(array $params = []): void { - if (!empty($params['gateway_data']) && is_array($params['gateway_data'])) { + if (! empty($params['gateway_data']) && is_array($params['gateway_data'])) { $this->transaction->gateway_data = array_merge( $this->transaction->gateway_data ?? [], $params['gateway_data'] ); unset($params['gateway_data']); } - if (!empty($params['extra']) && is_array($params['extra'])) { + if (! empty($params['extra']) && is_array($params['extra'])) { $this->transaction->extra = array_merge( $this->transaction->extra ?? [], $params['extra'] ); unset($params['extra']); } - + $this->transaction->fill($params); } protected function transactionSucceed(array $params = []): void { $this->transaction->fill($params); - $this->transaction->paid_at = Carbon::now(); + $this->transaction->paid_at = Carbon::now(); $this->transaction->status = IranPaymentTransaction::T_SUCCEED; $this->transaction->save(); } - protected function transactionFailed(string $errors = null): void + protected function transactionFailed(?string $errors = null): void { $this->transaction->status = IranPaymentTransaction::T_FAILED; $this->transaction->errors = $errors; diff --git a/src/Traits/UserData.php b/src/Traits/UserData.php index 893e1ed..f992f94 100644 --- a/src/Traits/UserData.php +++ b/src/Traits/UserData.php @@ -6,43 +6,32 @@ trait UserData { /** * User Full Name variable - * - * @var string|null */ protected ?string $full_name = null; /** * User Mobile variable - * - * @var string|null */ protected ?string $mobile = null; /** * User Email variable - * - * @var string|null */ protected ?string $email = null; /** * Transaction Description variable - * - * @var string|null */ protected ?string $description = null; /** * Valid Card Number variable for transaction - * - * @var string|null */ protected ?string $valid_card_number = null; /** * Set User Full Name function * - * @param string $full_name * @return $this */ public function setFullname(string $full_name): self @@ -54,8 +43,6 @@ public function setFullname(string $full_name): self /** * Get User Full Name function - * - * @return string|null */ public function getFullname(): ?string { @@ -65,7 +52,6 @@ public function getFullname(): ?string /** * Set User Mobile function * - * @param string $mobile * @return $this */ public function setMobile(string $mobile): self @@ -77,8 +63,6 @@ public function setMobile(string $mobile): self /** * Get User Mobile function - * - * @return string|null */ public function getMobile(): ?string { @@ -88,7 +72,6 @@ public function getMobile(): ?string /** * Set User Email function * - * @param string $email * @return $this */ public function setEmail(string $email): self @@ -100,8 +83,6 @@ public function setEmail(string $email): self /** * Get User Email function - * - * @return string|null */ public function getEmail(): ?string { @@ -111,7 +92,6 @@ public function getEmail(): ?string /** * Set Transaction Description function * - * @param string $description * @return $this */ public function setDescription(string $description): self @@ -123,8 +103,6 @@ public function setDescription(string $description): self /** * Get Transaction Description function - * - * @return string|null */ public function getDescription(): ?string { @@ -134,7 +112,6 @@ public function getDescription(): ?string /** * Set Valid Card Number function * - * @param string $valid_card_number * @return $this */ public function setValidCardNumber(string $valid_card_number): self @@ -146,8 +123,6 @@ public function setValidCardNumber(string $valid_card_number): self /** * Get Valid Card Number function - * - * @return string|null */ public function getValidCardNumber(): ?string { diff --git a/tests/IranpaymentPayIrGatewayTest.php b/tests/IranpaymentPayIrGatewayTest.php index e4d5c16..280471e 100644 --- a/tests/IranpaymentPayIrGatewayTest.php +++ b/tests/IranpaymentPayIrGatewayTest.php @@ -11,13 +11,14 @@ class IranpaymentPayIrGatewayTest extends TestCase /** * Setup the test environment. */ - protected function setUp() : void + protected function setUp(): void { parent::setUp(); - $this->loadMigrationsFrom(__DIR__ . '/../database/migrations'); - $this->loadMigrationsFrom(__DIR__ . '/migrations'); + $this->loadMigrationsFrom(__DIR__.'/../database/migrations'); + $this->loadMigrationsFrom(__DIR__.'/migrations'); } + /** * Define environment setup. * @@ -67,7 +68,7 @@ public function testSuccess() $payment = $payment->ready(); $this->assertEquals(IranPaymentTransaction::T_PENDING, $payment->getTransaction()->status); $this->assertEquals(1, $payment->getToken()); - $this->assertEquals("https://pay.ir/pg/1", $payment->purchaseUri()); + $this->assertEquals('https://pay.ir/pg/1', $payment->purchaseUri()); $tr = $payment->getTransaction(); $payment = IranPayment::create($gateway); @@ -76,4 +77,4 @@ public function testSuccess() $transaction = $payment->getTransaction(); $this->assertEquals(IranPaymentTransaction::T_SUCCEED, $transaction->status); } -} \ No newline at end of file +} diff --git a/tests/IranpaymentPaypingGatewayTest.php b/tests/IranpaymentPaypingGatewayTest.php index c4294f2..7e0b672 100644 --- a/tests/IranpaymentPaypingGatewayTest.php +++ b/tests/IranpaymentPaypingGatewayTest.php @@ -1,8 +1,6 @@ loadMigrationsFrom(__DIR__ . '/../database/migrations'); - $this->loadMigrationsFrom(__DIR__ . '/migrations'); + $this->loadMigrationsFrom(__DIR__.'/../database/migrations'); + $this->loadMigrationsFrom(__DIR__.'/migrations'); } + /** * Define environment setup. * @@ -70,7 +69,7 @@ public function testSuccess() $payment = $payment->ready(); $this->assertEquals(IranPaymentTransaction::T_PENDING, $payment->getTransaction()->status); $this->assertEquals(1, $payment->getCode()); - $this->assertEquals("https://api.payping.ir/v2/pay/gotoipg/1", $payment->purchaseUri()); + $this->assertEquals('https://api.payping.ir/v2/pay/gotoipg/1', $payment->purchaseUri()); $tr = $payment->getTransaction(); $payment = IranPayment::create($gateway); @@ -79,4 +78,4 @@ public function testSuccess() $transaction = $payment->getTransaction(); $this->assertEquals(IranPaymentTransaction::T_SUCCEED, $transaction->status); } -} \ No newline at end of file +} diff --git a/tests/IranpaymentSadadGatewayTest.php b/tests/IranpaymentSadadGatewayTest.php index 26f103e..a1b2e24 100644 --- a/tests/IranpaymentSadadGatewayTest.php +++ b/tests/IranpaymentSadadGatewayTest.php @@ -2,7 +2,6 @@ use Dena\IranPayment\Gateways\Sadad\Sadad; use Dena\IranPayment\Gateways\Sadad\SadadException; -use Dena\IranPayment\Gateways\Test\TestGateway; use Dena\IranPayment\IranPayment; use Dena\IranPayment\Models\IranPaymentTransaction; use Orchestra\Testbench\TestCase; @@ -13,13 +12,14 @@ class IranpaymentSadadGatewayTest extends TestCase /** * Setup the test environment. */ - protected function setUp() : void + protected function setUp(): void { parent::setUp(); - $this->loadMigrationsFrom(__DIR__ . '/../database/migrations'); - $this->loadMigrationsFrom(__DIR__ . '/migrations'); + $this->loadMigrationsFrom(__DIR__.'/../database/migrations'); + $this->loadMigrationsFrom(__DIR__.'/migrations'); } + /** * Define environment setup. * @@ -32,9 +32,9 @@ protected function getEnvironmentSetUp($app) 'database.default' => 'testing', 'app.env' => 'testing', 'iranpayment.sadad.merchant_id' => app('config')->get('iranpayment.sadad.merchant_id', 1), - 'iranpayment.sadad.terminal_id' => app('config')->get('iranpayment.sadad.terminal_id', "1"), - 'iranpayment.sadad.terminal_key' => app('config')->get('iranpayment.sadad.terminal_key', "1"), - 'iranpayment.sadad.app_name' => app('config')->get('iranpayment.sadad.app_name', "TestApp"), + 'iranpayment.sadad.terminal_id' => app('config')->get('iranpayment.sadad.terminal_id', '1'), + 'iranpayment.sadad.terminal_key' => app('config')->get('iranpayment.sadad.terminal_key', '1'), + 'iranpayment.sadad.app_name' => app('config')->get('iranpayment.sadad.app_name', 'TestApp'), ]); } @@ -53,14 +53,14 @@ public function testSuccess() $purchaseResponse = (object) [ 'Token' => 1, 'ResCode' => 0, - 'Description' => '' + 'Description' => '', ]; $verifyResponse = (object) [ 'ResCode' => 0, 'Amount' => 10000, 'SystemTraceNo' => 1, 'RetrivalRefNo' => 1, - 'Description' => '' + 'Description' => '', ]; $sadad->shouldReceive('httpRequest')->andReturn($purchaseResponse, $verifyResponse); // $sadad->shouldReceive('purchase')->andReturn(null); @@ -82,7 +82,7 @@ public function testSuccess() $payment = $payment->ready(); $this->assertEquals(IranPaymentTransaction::T_PENDING, $payment->getTransaction()->status); $this->assertEquals(1, $payment->getToken()); - $this->assertEquals("https://sadad.shaparak.ir/VPG/Purchase?Token=1", $payment->purchaseUri()); + $this->assertEquals('https://sadad.shaparak.ir/VPG/Purchase?Token=1', $payment->purchaseUri()); $tr = $payment->getTransaction(); $payment = (new IranPayment($sadad))->build(); @@ -99,14 +99,14 @@ public function testError() $purchaseResponse = (object) [ 'Token' => 1, 'ResCode' => 1006, - 'Description' => '' + 'Description' => '', ]; $verifyResponse = (object) [ 'ResCode' => -1, 'Amount' => 10000, 'SystemTraceNo' => 1, 'RetrivalRefNo' => 1, - 'Description' => '' + 'Description' => '', ]; $sadad->shouldReceive('httpRequest')->andReturn($purchaseResponse, $verifyResponse); diff --git a/tests/IranpaymentSamanGatewayTest.php b/tests/IranpaymentSamanGatewayTest.php index 2899dc5..a66cbd7 100644 --- a/tests/IranpaymentSamanGatewayTest.php +++ b/tests/IranpaymentSamanGatewayTest.php @@ -1,6 +1,5 @@ loadMigrationsFrom(__DIR__ . '/../database/migrations'); - $this->loadMigrationsFrom(__DIR__ . '/migrations'); + $this->loadMigrationsFrom(__DIR__.'/../database/migrations'); + $this->loadMigrationsFrom(__DIR__.'/migrations'); } + /** * Define environment setup. * @@ -75,4 +75,4 @@ public function testSuccess() $transaction = $payment->getTransaction(); $this->assertEquals(IranPaymentTransaction::T_SUCCEED, $transaction->status); } -} \ No newline at end of file +} diff --git a/tests/IranpaymentTestGatewayTest.php b/tests/IranpaymentTestGatewayTest.php index 0eb1592..a3b3f03 100644 --- a/tests/IranpaymentTestGatewayTest.php +++ b/tests/IranpaymentTestGatewayTest.php @@ -1,6 +1,5 @@ loadMigrationsFrom(__DIR__ . '/../database/migrations'); - $this->loadMigrationsFrom(__DIR__ . '/migrations'); + $this->loadMigrationsFrom(__DIR__.'/../database/migrations'); + $this->loadMigrationsFrom(__DIR__.'/migrations'); } + /** * Define environment setup. * @@ -63,4 +63,4 @@ public function testGateway() $transaction = $payment->getTransaction(); $this->assertEquals(IranPaymentTransaction::T_SUCCEED, $transaction->status); } -} \ No newline at end of file +} diff --git a/tests/IranpaymentZarinpalGatewayTest.php b/tests/IranpaymentZarinpalGatewayTest.php index cbccac7..4ae0515 100644 --- a/tests/IranpaymentZarinpalGatewayTest.php +++ b/tests/IranpaymentZarinpalGatewayTest.php @@ -1,11 +1,9 @@ loadMigrationsFrom(__DIR__ . '/../database/migrations'); - $this->loadMigrationsFrom(__DIR__ . '/migrations'); + $this->loadMigrationsFrom(__DIR__.'/../database/migrations'); + $this->loadMigrationsFrom(__DIR__.'/migrations'); } + /** * Define environment setup. * @@ -69,7 +68,7 @@ public function testSuccess() $payment = $payment->ready(); $this->assertEquals(IranPaymentTransaction::T_PENDING, $payment->getTransaction()->status); $this->assertEquals(1, $payment->getAuthority()); - $this->assertEquals("https://www.zarinpal.com/pg/StartPay/1", $payment->purchaseUri()); + $this->assertEquals('https://www.zarinpal.com/pg/StartPay/1', $payment->purchaseUri()); $tr = $payment->getTransaction(); $payment = IranPayment::create($gateway); diff --git a/tests/NovinopayTest.php b/tests/NovinopayTest.php index a92e12b..db027fe 100644 --- a/tests/NovinopayTest.php +++ b/tests/NovinopayTest.php @@ -1,11 +1,9 @@ loadMigrationsFrom(__DIR__ . '/../database/migrations'); - $this->loadMigrationsFrom(__DIR__ . '/migrations'); + $this->loadMigrationsFrom(__DIR__.'/../database/migrations'); + $this->loadMigrationsFrom(__DIR__.'/migrations'); } + /** * Define environment setup. * diff --git a/tests/migrations/2019_09_11_153311_create_test_tables.php b/tests/migrations/2019_09_11_153311_create_test_tables.php index c6e3df5..3ed38dc 100644 --- a/tests/migrations/2019_09_11_153311_create_test_tables.php +++ b/tests/migrations/2019_09_11_153311_create_test_tables.php @@ -1,8 +1,8 @@