From 43b305f47aaf72ffb09efc3629c7099b2108d437 Mon Sep 17 00:00:00 2001 From: "xiao.tang" Date: Thu, 18 Mar 2021 16:00:01 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E2=9C=A8feat(royalpay):=20=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E9=85=8D=E7=BD=AE=E6=B7=BB=E5=8A=A0Alipay+=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/ui/static/images/TNGeWalletLogo.png | Bin 0 -> 30935 bytes src/main/ui/static/images/alipay-hk.png | Bin 0 -> 12490 bytes src/main/ui/static/images/bkash-logo.png | Bin 0 -> 56833 bytes .../ui/static/images/dana-wallet-logo.png | Bin 0 -> 1080 bytes src/main/ui/static/images/easypasia-logo.png | Bin 0 -> 2968 bytes src/main/ui/static/images/ezlink-logo.png | Bin 0 -> 27426 bytes src/main/ui/static/images/gcash-logo.png | Bin 0 -> 20247 bytes src/main/ui/static/images/kakaopay.png | Bin 0 -> 3960 bytes src/main/ui/static/images/lazada-logo.png | Bin 0 -> 9528 bytes src/main/ui/static/images/paytm-logo.png | Bin 0 -> 3817 bytes src/main/ui/static/images/truemoney-logo.png | Bin 0 -> 3117 bytes .../static/payment/partner/partner-manage.js | 14863 +++++++++------- .../partner/templates/partner_pay_logs.html | 443 +- .../templates/partner_payment_info.html | 26 +- .../templates/partner_trade_logs.html | 631 +- .../tradelog/templates/trade_logs.html | 424 +- 16 files changed, 8834 insertions(+), 7553 deletions(-) create mode 100644 src/main/ui/static/images/TNGeWalletLogo.png create mode 100644 src/main/ui/static/images/alipay-hk.png create mode 100644 src/main/ui/static/images/bkash-logo.png create mode 100644 src/main/ui/static/images/dana-wallet-logo.png create mode 100644 src/main/ui/static/images/easypasia-logo.png create mode 100644 src/main/ui/static/images/ezlink-logo.png create mode 100644 src/main/ui/static/images/gcash-logo.png create mode 100644 src/main/ui/static/images/kakaopay.png create mode 100644 src/main/ui/static/images/lazada-logo.png create mode 100644 src/main/ui/static/images/paytm-logo.png create mode 100644 src/main/ui/static/images/truemoney-logo.png diff --git a/src/main/ui/static/images/TNGeWalletLogo.png b/src/main/ui/static/images/TNGeWalletLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..996246f48f2b5d943f1d3846f3b774bd7abfd1e4 GIT binary patch literal 30935 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 MrIbFDzc&f~AKNayBLDyZ literal 0 HcmV?d00001 diff --git a/src/main/ui/static/images/alipay-hk.png b/src/main/ui/static/images/alipay-hk.png new file mode 100644 index 0000000000000000000000000000000000000000..bda5662017e6360cc7fdde02217f1c0c4c5b0339 GIT binary patch literal 12490 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 literal 0 HcmV?d00001 diff --git a/src/main/ui/static/images/bkash-logo.png b/src/main/ui/static/images/bkash-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3ce3528439ffc78aec9b47bd88949d838fa4197b GIT binary patch literal 56833 zcmV)mK%T#eP)_L-e??!E3F9uc{3 zRYg{@xUF#&&^Bpt$Y@?l> z9lRGA7v3qnq7Zn6S1=R+n1w8n2mx%yWM*a-T4jR+1rCnbj6@`Xz|^WTv-chXX=34h z)$8jlnJAJVDz(OqA}U&-5lkD5W|%aX)-svZlW8-r<<9N8uIsuM5oRVL5s5Jp(L=Al zvhdKqi^xO&?wot9UjKf{N#_OWL;q}M_%LKn%F9bzT!Imtb4KKX4^`P8uB~mXuMLOj zRXBGJRe`F+pg%Fe4CIcYS7q zqSC0Ega8KuIEpA}ZEdY>Vv5n5^9mP1YNWtSAc`nx+IoL_aBp|#_Wjw`-gs+|>PWS4 zE1Z<0NE0Q-O=yg1+ofl9%PLjv~@B(w&=|~i_V;L>|K85 zstOY`^WLj!v?OHkPCW}Fs%QvgV1Nv6@u-xRU}MT4G_ZmJ`5-`OU;^@)sQU|qVWjzd zWMF9C4A@Y|6ha8>Bx;P2nR~rKS@mc82i{x|Pz0i(F^p%J%y468>)yQ^*ROBgzTZw} zEaVaeg-jbx$`M{sfE|d{RCPe6s;UZrnU^d0BoNvO3TFA<<4aQYv3mXcB`2NtBu)51 zU(bmP)bMZ+nkhkH1_(@H0yDGSexZO7#G5(hBKTh6N*C7pRJn3mE_of%#>LKL8LG zvT{~H2+9zGaJRcUg)?o;BwO zD<1Sv5DJWlKx9nW8Wb}C`%rQW$HE#_T1l-YF^x#YpbUea1W4tF7tdaM`Xd*wUKxDm z3a#}psL(I4R-y9qW_~cKR)=Uvz@42NKYsbG7k@T+>t2|}P@6UJ z!b~kmiV8E&p>iRxcg*#)$zCSIeXoP@~CdC4wKI3ha9oRbe}G5y-e3Crrk@(KOI z&ZFZNSvH+b3ARuP00`a)3KNJB$gy*dJu9J>rjBjPVkJ`_GBASbYTCq2dJL4Ds?z!2W-JR=i$9o68h;=G`BWYG&;fk4^a}G{L zR1B(Q96}%>f+NRRedw`SYQhZ5M{nDSPjU9k$cF|(ocL8{?U#4rydH>X2rp);DyCu` zSHh0=_xA^DYt^uq$VT;KF40v*)$6_1?k5M@?4AGEQ%`>J(^o(9@$%Yv3`z_NutkfJ z)q=C&B2pV;@P4^ju_4njt43+3pYX0InO_ow!kWpLr9qsxqSl0+b1py)0#Ym31$N#_ zG?Ata*M@0q-?;sgzkBW%&%b!FT#x%Roy_~6Dp? zeLh`2FA;@>S+xp3Gdl@~atgvx?2c;=iV@0i)>h;gJU0)t}&GRLh+ z5}5_2GNh7rrQXq5xVZW3S3m!WuY6&6?IO;tVOXlO+6k4RC2Ldkj*rn-3vxscw}xyU zlLGL{?>`9Zpk#2SnRm%oVBjW2$AP_r5(F$3*avplsY9qRnr;8+l{cPyasQQ@wmU0p zp-CGO_gv_Ok|WyLoYbnKbRx{`GL}S5)RqQ`V}i>}?9u`WbVLCzLHJ&G^v8__{h)oY z_o~@GG@npURD<2uO_W(pRZXS?;(VzJ%YH8rF(^l{z$9i0%@l?)CDm5Ng0p^@Anl{J zjlRFU@v;Blb5}n5@xdoPf`OY`)Sg4HP$s3cR6KcMW@VW9$c#m02x-=eW%?jMSVB`` z(~>=_S(}Kc3{?nWGMU9X4$8rx=xN<*Bc2_$W$$Od_{DQS+i@S}z8D zE(l1C00^OELyVD0mVPZ6*f`%|hc1E=XP3Z!sZ~Lb83q6N*`1GI zi~2B{B!pmQ*?bjKg(X!ZloT==#Zl|Db~f`m4YH#%I=}w(S3dW<4=LojAB^p z>(DhRwkq&!uA=}Q!;-K8=%RE&Dhwl3@dE(ioD&%w$T52(0wAiYh&JpET|%1FK|RD_ zXEfg4{l)+NZ${hu)4Mxv(yXi7v~nOEgqz8{@&Vu&qX8k50Ah^fX{q9A5r^alc47tp zaz38dQxHB{9xo7{ckVsX3m?qnJEP5*wm6r0BUBW!bq&iQR8jyW#V+-wRV2^ zkuQJd(_jDU`ZG@<@LsPe20bc6!_q?4k(p|e(y=p;X=jnL$_J+jxpbB!#wam4=RydM z8PV1U8+Ts0e!jOJ$}_le599XWja&cv&;I54n^Q^}qLv9&LLnRkPC-WAdw^3)0KE5X zoKi|9Eki>DkZIlv9rEA#7!4KQxJis*R~E3vHuUU0S3W z()I!Qgr)N-r5Ix-KbV<8-dxWDm zQ}%(gC%Nk7Dmyb%GlO&{9?TIr=SKCk4U~q}4(9h|UR^qS^_h>H`%i!8=`VZ^m(R~9 zdn0Z)u3SXPJ3HG|Q94r(0#pgYnv+=Ey8xkouMefIqpAk-Wfh)(3e2mk7Cd!zJ3|4iLf)SWvt?g%j@5{X_o7JG-j^+&uHR65Nwgwn8nL+3w zIR@{KCahdfC6by42L(l;q!5RLdAh#!?LYgg>)-jwlWu)&M!GXS*WaMjcqV5+5*Ev0 z^r+&>0y)>gj0_B70BVin?wKCuPua02zVZd(J!9$=gzsR^JzmKS?&MJTG5B>EDo5Tx z%YB8&b?;TndwMn<6EP7Pcf2~O!GzUP8~gn}dpBz9hQ)eC3f!t}_v(qYSHJM7-~X@v z5x)2d$mGD<{<-x=BSVQuNsUbyiD69qE~54C8HB<2077Z~pmTPOfjAld4y(^^E(@hOW<$)(LyB1~av!NRHS<)dg=b$x&3wI}?b=rxm-O z09&TW>Er3NoXQ7l9Mf@g$mkGwLZHQh&EfAN>k{lDM17zUvcj>2kY zCXC2Pj-o%pM4ig1{JIM{7LmHHo2DszsMz0m$hP)T$1}Y_Nls#fv8|ZO zlnq@qGs}oOG)J@JC@?VCIz7IK!du~4lf)+W230kv+L5+(JKj0C)H{Pa+yC}|`{y^l z_2Q=n7uLtgPo+}M9H$WA$cO=WAsi)?l@3pIY)?AXf~WHM!Y{93@2K!-q6fS$TCzKL zcYgMF&kN-D|M7nY?|6*{8@>H@Y9ZJEE9X>e>lCaRn<*KQAw$Dw^G~UB$QeXrWMpkB zi^3~KQDPP&D2lRoaO?i%i&x{%uYc?R`16~8|D#KDex^4ZG#p!D5SWxnoPpTbjNljb zhqMwUReF?da4M(r;X{sS>21>D03dAMxvHuRqJlo$Sq)7~umA1yKFU}A>wiQ|DXNR3^JQ_l zcMh-L{oDWZ&)@j#?|i1Za6Yiy+ADj*!kjTjVkH8T0*3r8t z#DoroMqt1U-Y3hfZl+1dU;wLDMM-9DOp=l#7mS&FB>`_A{MrBV&$eEA?b*SFaxaFO z&a9tlNAsdA6A_q*jf|KS%78Jt`dVIco_2)hI+auTHIm?cib*(knnF(iP?)5v7*ytd z_HX{a?3Z8oFaD$~&tR6QQLqOHM4Iymn9M-dfr1PU@VOaGF3bfK=)!bmS0cP<5(M;F|rSs zV4lbbWSS8u0JAY0FY6TuN(Ln~5)bNWD2n0wx@!$H#r?^f|L*%Yzw!N#%HU(Y^J!-k z$XCO`-h6ft>p5Es6&R^Gl|oP^lyd0oof4#{@@r>{cCT3tU9`y?73|1>sNT4MbFKKs zHmMpk^wHsk7yjy7fB%2|#gz+BVQWgsOw2@8pk`{6u+j=3_hn;dN9^G|s4!wNwUkr_ zXV=ZKz~%?zH7l?;YhHNuTmSpNc&0pi1p_~ho5dOtZ5}|v|TIvCPqFep-nL-2Jo^{FToT>2Cs{Li3TMdPbce}8})S7Q%{MfFTDJN z|L3o+HDxiCFjwCgD-j&Lqu{wHmU#@k(*5Q^uTM|jdyXY=pUSCxC}N8~F~?SK{<~W= z_GP10Hu2ikYqxLRUh};$M}KC6sXhNM{%Z2=AMqq^gh3kDJzu#Dd1f)~lp!e_I8oQI z(J6w!8!?E8=JR>Uo*IELZfw2w&F{bZx8J{_JwzojQjn1YJ93_V!7g8!>kL{oQXv)6 zlb~gEO3a+fSGc3%72=kEOY)k{1$BcA=?$rXTD zu0_fXPnQbtp^-p+;0}-RF{knRQ+eF9;^C48@IZZIR)$8{-QPQR=E8hZ_t&c;RHM2s zduO+Q{JMVk#V=4%Ts@1K7!n4~IcLskQd=ahaAN2(NSNzrq0Z1J-;cmd-u&kGU;gIz zy77L#PvIv$$&xu=MC&ynX+t-+F%c^_%PF&-B(Nqwyk@hn;dB%v1=1b{$#|6T=BP z9_j2Iuy-n_^5M!!T%bO%Rx_t4+*zbXc`8i@#SqH6ZoPA)#>#zHaFaH};G*kozk2iK zZ+#C3Q?z1Dbj(DwRI^4I#!SZ`K?ZH(?bqIX<;9mu!7xBt=H?NsAk4$+Dgg3narLzce&Xgzx4eV z+WnDC>v}eKAkQvW_#2r4w70V_Z7hnSEX&>9-L-Pyn$)Wacc*{zKmRlP`JHnUtV_^V zoG&Q&-dwS$mRu4rt9J7-X`Ckmt9jMX%`?oo;)hcNbg{K4fle?Dx-cUhw{KU+Q({)sN+0TX&+}^3Y9GPIs2yXnAP64PCBJUN+R|G}HZF|8l5OqmGkKt#j3eTg z7K{obZrGCZ+Z#ZZVU!@M|PTZQ59)8P7W=xx-2FZ zI(&^$M^G&(>E*Q@vr<+$-iMyzRDL^^56QW zs%lD!+Z01t0Nl2z^nvQ+6JvMu(zl*#_Q$~pYRt^!X<^CQd-3jkOq>!)Qq^eMQff%& zq>V%4sC7u36=0V@upD$sD>08_I9xr14i5tTF2jf`z@DHZX=ij2VJpJHZ>#6 zv@#mBJiWCwee>4fY){&@Duc2S5fi-gzG)+g4y#^!e^hY~ckaLX?H?AS_6!eu;ze5k zsumojlmI&BdcBi9O31YofRZyuMgUV3$-{)bA{a;Ryt@@;l1HHFJF#2*(AEDyWxC~qd3p1R;k<6uYhoyy z?{BP6$CDuJf-8iPu=Ddb@4fii+KhXF3ZdizlT(F*i*0McJxGK+Lgq-wX|CB-lRRxa zcS`L>yGYKIVVFTro;`3JW_i({@KpF=sGvn#jShR(q0tELWGp?{>+-mtc>;5DD!)Y< z(hPtj%E}One+vp^gr->!)nxDBjpu*-)R#Ve?uoAyF-5Y>%6Mj$WNTF^vsj74^*h&} z|4G4IX_M`)oVy=wAKbHcLM zg)+32x_%?DbxrALh0W5F)mPpp^pU#p6nMX#=ID`~+RUxYXo4Li*N3Uo= z2ea3|_tKeXulZ*#hTwAB3t!J$sIFJNW_N@}@BQNXy`Q~t4!twrB7%~U?hOTDZo zyTPaO+XKjBI9w%2O%#ClemWLywJJ&~QQ*Isz($*+AL-kHPMjWfPqlmHZ`R)3?QK5c!Dz)7OaRMx<|fUp zpS(Q1y|tl*OXSJtIm9Arq>dQON8t7D#Fs_2HrO8Rr=Gv|si!x~koNAQ3J3FP)YP_Z zoYmGeoYaevVSPEdN{I|i6xcc9aXt3Lo|ql6ftegR$J{nC>!PKa%CQ=a>gaG{3|U7U za~Ytfs+yz`p+&zP?|t4BRwr*0QRHqW^0G6}F>QvUd3mRy!rvZwG!wokbJwCM>ZXBr zj<}u2zPYqBdi$l9pZ@5zP*6LXdy3*(;i+J2|IHVF8lncHynHoJqtE_N?$k|3&iiiY z_*vVKRc)Y}wH;Pxzx3J94+^p_=m*JTVbStqa`{CiOfIF?URk953>Q9I>sm z;h=?+JxlEpbwtFAzuV!sn!|7+8-CeAHK+1x4?KMsHy((6>1S=j!Moro*2AJ2jhi=L z{Q1+r_azi(rD;7U392MEe(U!3>o=~I18&5KqH1O%n809#3i5cCL-q2A7HLbB>3wLL z*7?vP{p_vRKmO#IOCS3pUp$2VFI<>J(-|&I9nE z0f*VV8Qt1yZts-m&p0;k49*xy?!5MfO=fFrn`E__MW}(8$>p_YB&KRc&f#dq@uT(O zM$sEL^WLD0g};9D?cMLBubf-Ea`8(bhti=}8WRNv2R7}s5qnJ`awf?+Vh}?NZA8 zl0+gKf}j))b=rRO?Q5TSx~QDDHbE5Q>5W%jUkhb3ovryoleiVjlMDtk($yvQE<1(l z-V72=tjFa!-`m|jxcT!}&OCLc>OXK!KzXg(%p0!FrPQ zq)qhuZ47ueM;3@f z83HkZEDvd2?VB5v_5-UB_|;5e%Ke6a~R7=j>*Kv(up`v7--mUOi<;eGKJK>A~I!H4nANqwsu{Zlz=uP)^`x`G#hZooX!!P3Oh7}>Kdm@NPkGLrz z3QERofysejVg~Y^As`T5j*l}-k_|-$*u-G0%B05VK{w5=xP+crNU0yA#ensk=h z(s3{fhLCJI%qNm1PpyLx7+|H4>%x>8g~BsPM22 zS2hRftruVY=*4Rub&ICmxxba#7VyCpjvdSUkciwB3Nq)g0Ri5esX0Oce(j~7%{If+ z=XzXSNX&lV%EG1ATuA_o!Ae9c1Eo{}7!#1^ueto09O&@bC}403m_Zb3Fhcis)+ zW7Cp(0H#n?W`{*KnH`S)emD>NNY9jwi2-M91}GN}Jz(q2o6|yj7dNh+85UH+F?@&B zrGI6apj?!Q=cYfh*E);8bD3F9jdr^C$XWNK6 zN{nv5Zks0ilNwW+&Zh_CG@b9=xle6MvpUV{`E(vOh)je94*_#<`|})oXc|yL@Bt+6-gpYVbCrn+Ch=bf-a&; z%bPm|;bRce=#C{Ia{aoZ656|U2m2F`M$%+9-rntr`7UDCWpA-T2;ElOrGg!5op%XE zb3Q9*GIa_gc%uq#pnP!s_KolU=-kC~<>#IOvytPHOkirz4nTr#z9KvB94{hSP8


-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 W8d^mWCCsM)0000 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 literal 0 HcmV?d00001 diff --git a/src/main/ui/static/images/gcash-logo.png b/src/main/ui/static/images/gcash-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..56fa64cbd9717096494724473053f6c4de23c41d GIT binary patch literal 20247 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 NwAA(0s#RWu{}2092JZj> literal 0 HcmV?d00001 diff --git a/src/main/ui/static/images/kakaopay.png b/src/main/ui/static/images/kakaopay.png new file mode 100644 index 0000000000000000000000000000000000000000..4142019ca6c881cacbbac5fa91de21df49d78cf5 GIT binary patch literal 3960 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 Vlpv$HrFZ^?jWK5p3iOfArRa>5G1&J&^Pzq zSKp6wPFL++ySi$3^;xUeiqKG#$HE}PKte*oQdEFyA-+TZd4R7G?`ngZTqGngk|GqM z<6(AeiteE^x8!$fx1^6Zgc3v)PXte73PPpLI=aHCb4c@m4El zSy&>22xlYNhYO$c(T6vcPy<7xZp1T2N1yUe!+wo+x+aaTT7Ehi{g=x)0dSeW&2}HZ zVW&vv0+68mrtRUjBSFCoJi#>wyl)7mnS6y34Yu<_tU(qj%z;cY0oCAPrw^@#0A#s% zCQ|EpRZAdO5L185-$*>fp2Cm$hJqJ#JT@FC@>y(doZY%`&TO5q^v(2>EQ>9gGVi(27ABj{mNb<0hB#YT{k5f8^xe1fV=m8%aiZOE4 zU$&jN`ZT}qf(D(FIpDvp7jIoC+&OTbeULnR4@fE*gK+<74!f?(Q%v}0Yn$8`*%X~rUjmk5WJG#`craR8XRzidl6mAdzwm+j9v>2b*Pya~*4I@fm9 zJ9;$yti#7Rl+gNb;auz`aURR^FE_wTCSa>&e<_sV<%r!B?7xrK}7k?po!E3(D+GtC{8cvf>f=r&4ajB!2viWF6%1@_Y2w7{V z;F67!`_4mxVhj2c;NB3W#HpzrCR+Ozz|1++j?+_Q#0N|11x*5wW7|2)>OLkc*X!UH z`#7x8pWR8>%NY2D1?&LRxtOh5+uZTkf%O2fozH8+dSDqT1{8`Gh9y}B_i|=AaR|o6 zEz+YCe~h^&DT)`k2idzmN=aQ)yNM+z`FCdCV8$IDKh}TOXnXpT(~PhFs+D{xrybf5 zrlaO^UZqoFjhpw$=6_upLf~}H%*8<856v6&XH+p6yLM{ibMw7mzwSHrkyjuv!V*{E zIK#Q(TyE8{VbsAbt^%LBVv|(EFBHb*0bEv?0SvB4qZy3Ayqs@UMn66*jkCM2OtVdz?EYBzsz5H+cec|X@>F7We*sM;{g zTH`y#oJe#nvv~Q}>c+`BwzFbxUty#YMBn=d(ep}w@Ts=-HS_n*=`d#VDp-4eQc^)B z&MH^@S5s;PKm8rq)VUI(-X$}Y_U)}bx*`pQAP3?evl80~@r$d>xB0MFKP$2D8|9{N zY=K05s-!Snjr4lP-1R8KwiYLxD8whP_iaz;0lt0v@tiYufy^|GmyFz~sa?V5`=X#! zznr`s%z8C!mFz}BvyYm5Rw$KRm|B+{enuyeIh84VvfPl^(XsBN-G7XT#6!eNTj+n} z2$MP&mG&&ZeC*CTVp>NNwRe1O#-|MLA_PvcBR_I9W`%r;k|O*3Qc#B_LO74F9@zN8 z)vbIi^eArRUL`+rbN$CS>v7x)9zxL~im2FJt!ak=K!na`h^v>t=6H6{9dB6x_FAXn zgZm33s9@_)bKMIZzvgG=TK(R=`|^z;T5N#*A14E}7^%@Z?#}t$Dh~OP*lX+GT~yA-Ce83=hOG zN@oEJbz!u5h`1!n3?x@UT9VRI5;{DIA~wHGkY-j>EMp72;O=?SQ!Lp?9!y?Ei`c4# z^xb{-vLmujSuM^#PQnd!Sb?!|mu1sszxPVqQLW9lnPGL}*CGF2St#JzGq@yMvX$aS zUxAJ%dEydCA>L`Y=>LevE-C<2f4hUEEU4$Q>@_6|J*u5JZrV7O^g%Y#T<-oiYmg(l zW+Vra43ELCQzRw^`?=lz{KTI3qTI5?eIPKb&g7Fgb)#&c>-A%YlCOpnZ_O^6J{s&7 zP4vy5UcHlY9{FM+|7vsfYC~xw2AmnX=7YyL9#Eb2O8oaCf0Z%HLzh;6&kx}Ah{ix% zrwSOYGvom_5>blt4!ZS|_}aUcYg9*MO``!-5&shq8u;sI#%r3z!Jr+$p4Vjw%jFJo z6I6N2o9OS4hBw|NEg<`_W^cWGM|Es7~3HF=x(xKY4`WlMV7g#-f!>e;w5$s ze_&qgu6*;}H=9h;DQB=n$Mc^*O>p`9#1nq5Yi%IkTb&Mg69_+i30q7cuvBN`A80_8 z$16xKr&lm}Mx?ZR$k~1#ygPN(>smk&S6(f;-)E?h?UtneQknJ}EEEq+fl@*&!eZo> zRh1zNv1`*!mvpnwTN4FjXnLIB@+*bfKu>ShinIv=HclBDO<9l^je56D#snc9`xZQ# z7hN2Md4>q=hbeo10~D?*_dVwjV)4W9dQ}t-e#<*;MNGHz@%uf@_hq5n%u8l6(2DSD zoYcXUENmnTtR!X2%s(-T-gcrl3!?v5-yZLDlR`TwitQVoN!XBaIL7sXl^8$nDl7Hg zfDHp9))8%iR80pIqBF0}(XG#iHAD~JY4vo{VRFeN{-n)vkty@_6uznaZgqd7>F-Q) z@cagh5oYg{iv*v|r87BM3Kp1tT?L!f(khGMrx?l&X)@~NX^XTDiqBw6kg-Kqs5m&P z?k9;(XkRKMXQx%<8g-}31T)W2K_5xJV+nt&m}w1mcO&@_2K8j!7m@HC=as0qV9)Cg zzF&B$5Ea2y23<%b`dzx<20$@r(HeFqea&o)ke8B**YBg_rgX;|T)*6=;(Z6~^X?ih z(u+vIt1VIkGRJ@C6UwDV{L&uqa^2P{FTML@x&lf7(3Cka`*+Cu#C5r6Iei}Z(E==< zFgp3LW!Amp47c;uZdQ|}fT;W;9ZK)U+mUFcnlw?<;p|QjHkh<0LoGAciaF&yMNMcX zXsf9;^6GSOP@{_l|4Lii*uOS|C@%K%8_Ow2J4hr~(zs;g3LR4LDXK0~A!kNcTtbz&_5xQH)EhVFSc?}!mLob8PM9yDG`|Z z4-ox%kfB22k!omgD`d-=#Hu2!wB$;FmSVB97*Vs6SG|{+0!*|(Y0Vt#>oaU`IU3+l zSb*X-ZM?viqUIi|i?n{LM`kHEK3x#l?Iiy)ym|Kd=>`@zf!nIR-kq!IlL*gHhDMOD z`QeRa4G{A`r@YN$K^!Nj?-u-*=)y|Zbo+2v9!rDG(Svrf?2mB5Z=mdYwGmrax#o;Z zKYmC@_{^Ki=Gg@D5#Sr|(ogYp!knllicd5Bg&ek?t~MS)@iYXa(ALlnupY-_XN52X z*|lS!s}`#3**mVXQC{-CJV!Ttqe_&;7K4-_VFyw!%ifjoWojU(Xll;)a%;)=sN7Kqh}8L75DvPbR@OkI82fgTCpg3Gz6A0msS9tPT`}|# zH|gDGJo?1eP{&Dd;QdU^wz7jvpJ%Q@|M)V74o5admrQ4ovkX4{4g50xYrh3L5w(RnU;>zxkRDa{G5r`d_lJ zR6)z$(^RwU2u!5e`LWGbBf2AqKG(nVkGQFtwPgvR9?RO3E|yt7szMvMMOXG)zI6C%Dc~9U26Z!t7asc6ejAz6v$*d>xkB&c@ql^Yo3iiymjpo_M zjMt?4jW>BKx{tq<@v=d9PCQ8G1N+(k4etO9EIJNw#s5-Btq8uGi9OK5MLU=>^AM@0~+|rVtxyU3?BX8 z$Oq6%mZZmVWw*?n#robiB~5NJNHHtG-n96A3iGzi5v)P{;Zog<*dqCm8IF3wdwWV- zn~Fefz-Q#Urcb67;~lrEQ)4;Hhh{Q(#izk9LBd7;#69fB3;BLA0u`t_hmH3fNF;rw! zNA@*L4gt-*@XGJ6T2VSwa;k= z6{B?b;4|H{M7g&ovQhV=)YSGqM^g47gI8R>J9=j*uW>@-Y{TE;`vbEs>gspT#+q|s zbTGae;cw2=-q53bBV0VQjA&`lX*k4ILL77Y&`mwjZHiqXTd0T?-M3*{uu4xlvls5= zq5L4YqH$?=)?swxyJwoP)q?;qGBe#NOBLj?;9@1ndbWej%Z_$D{s;B}AfTXy(M@JM zb)NFHz+o=9vrp>g;fd-6nyjYGIJqxKOuM7seV%;k2HZjEjn-kc4<_^F?8glmr*^}3 zR=ymp4Z_Ycio^xd`jS+6U68p^JpSY)DK?r!^d_`M)`70*Cl-Z7rj2YHiD8&3bre6lW_CSIiM$cmj>!9mZ%|BGP(66m>ws5N zGW73*yuGSLe-3y$ym#4uHMl9~1>O3wBsFA=g&JGCri1$2Dk25<*D+q}JB%g-Ex>l! z`NK}=9pMO`JFvy4xH@IY}fqHJfJW@zPe4I*ub9s4t_N|8&CbD})cd z=UTk0{cD~09q$S)e)M5IsAN6DR54}sMq}tx{m!MpsLOnEQJWLd9xs7(EYm&vqlQl7 zG^dsfZb(PWRR(KU&CER({i^k9#oete(QonZOkREAj zmhQzWP#d>{%ugS0R(ouy$R;>r$%4L_BCpSfM7B>%`GEVrphk#p(H5IsD(L&$;7xzj zp)*vsLnfZFDO8?5o5#0aqctmOXMLwuNt0f2C4OyuC5w`O6Dm5@bhs5zz(WAp95jhc zwxN2k6sJP(_e7;3#8`gUE?ZswDuvEh2!8rPHaB8*U*acC17soyH1i8N3_RBhCYtF=W4ITXA-J@P@yEIL zftept^}Cy@M^edqi((T7J-ONb_BO3e1$MRe%e`sif6-tbU??4=7$?}s%(2YuiTFoM z<`K>MT6MYSNt44aHZxsfzl2DB`@r*ze$I1zPVCx_iN-Tk3Lt`-mkM zuCf*{Rz@@?8nPul*pH84{8m7=RvGg#Qp`5IGXJc^Y0KTr%2ulX4N?enCb#5rIknUs zpEkv3J2xv=WX)uTykX6Jj=uO1PL^g|ehc@=wWR)y`fV@|pD7Cnc34*Yfy#6KX|Z|JU4X{(!t-?-2*b*G_F zvF|psP2}P@tNBc4%^yQ4(KKS9bX}Fm98h&Ow9o%7DqgZWK@=Q z-BD8QMrZr3ZDE}@D3!xjSG7>pklXKy0n7+^1||expKg0KBD${|#XS)vS~sB>+gHZY zVu`vP?0vD?ZESHrKhjP0FF`TxW06aHLRUHO_JcDN%nZ-j&M1$O1^YD?I%Y*(7Nugz zSMh!woJ@y9_V=bC?N2KcQjWC8>prjbm3@2gr7{D7`0n?iFww0(s^CNGzf2}yf-Ny% zMqk|fXpJySE&M!F{~Q^r?TMr`2|}@HBdDYw?phudVdP&Dn4an8EMGR>=nzL;*Iro% zPxBNlo3j|HIF#T7^BKZO*z>AoA9AaecGY_RZLf*h<}!nZNNe!s-ZoGDfd@7Tliqp| zyf#(+f}oQL`QeSF0er>7C+uG7LZ4OPBa6maI+jclr{KksLIg!!Ydgf<}^(t8Jc+xv)xKr>;nOC8^F$%lnfoU9`Ipm8O zW&U8i6q-(^*%jBGOW}p1KE^3|Z!!XfgS;aLL1S|oF$ZOi$oAj+ObgdM`LQ&L!zAO^ z)|(yP#kJ{EV;^Kki(i`*|7OCDnyhnR&XhDGoc+pF9UUr(1SXdn#A(iY4x*~yg zUNoBO&&Lf3HNPY)QFybN;it@vAinzt?|&=b7BuP{waHB=vJjV6?-!*_wwOI=*mzwB zqn=+$&og3PHRl!WkbVdYY{I@P`O`GRUYujny64illVI0MdfUOF#Y|&4m`T`dTewbG z6x_g{@|q znPvQzh)BM76w$^SX4%-`>mGugHfKYo{RoPWd~lxL6Q0Lz%!(nPBxVVKAEH2I2uXt z$zXI+9Vv4R#_S1V{!TX`zkIzMI(gH4Oz0kSIJG>r?!shx!EhPxl*<^M-OwbxXqM3W z-H4kHQhuqGCbVrSqj925vrTWT?tI$*OZiR5&DHn;&*Y!i##bk`CjM{{Z;hoZ2Ah4+ zy2{K{`_CFLr2@r*Vu|xv_urf~)MY4w z4~npL_BX%WS(cHjyv2<}l1-###B!jyh3ZDtPFJntLO`wFj~b+;HUd0V`DVD_m=Dup zH>qLGdC<$91@Ey##~>IO`1`Nb>LnRsh;91x*2;>2F7AJH7QHtx*O-aI^zWt(VzA10 z=mrIaOe%Dk6D4w-k&sQj=yG=B-n<;oVzTLJ+=0RFjg|6up)eX?H5EK^(sq-`3-|3p zx(Y2$V6qJkt=}kvDWz+pK;gl;jnh2E6ubdf1|%(efD`eoK0=PAnqU>mEEiB{r0K@$ zX!E?y&sXKEVoLu*|eM^n^Yjsl#jaCnsw3+lIQ6kZa?|0Fn8u) zO7kXo#~Mli3DMo2UWw;=Cd1W;p%#mKD;z2_w($}5AVz8$wLz+D3R*c>sy}%a>mfT; zL5V95a>>Zx_GcLK_DmC^>|>FxM91HvH5WafRm)*bTH=MzS(Y1li4T1bp~7=L; zWm@fG6i{C!!x(^pZ#!AbUg%sviZC{nK5FD~3z_?DD|69(KFtro*FOoT05p=#`wda= zDY;Yt9Kw*IW1^%pd8vc!U?Vo6WRFkSLx-Jfc!*tRcEOi`#CYeFW|A@Hz%_gtijlaH zEZFS6#Va0+BDw9lQ&udcB)VL1h{faL2%w+Ek!Fj&ZO%pK2nS=bDzOIye#LZe!Fzko zl&^*U{{a^YtBUMFIT*M>N6Z|7qA~3mA{N1gP7P>D_b6V6>wMgWRDWKpC&O|S$DIw6 z!-DKNE1sDN=}-(WcD;Po;k@=BL}$6L;xPnhm2pa&tO2Ihhvc2dW?Yfdc+1OWaUe(< zPK5WLE}F<`;HYO&R%nDCdKqH>o9{(4wh@)MP>2RB6Q92J%*Jej5<-Bh>FgbE8wDxCrWXbgI@J7GzawD9qx9NTo)(D!fc2lgV(SiXJA*&AT*1-$+{7 zdJ(1oXnKl!ZCAkpjz*zj?u+CRnTmwgW)~x}&#lGM#7xKQXo3=va4bz_5K7SOrlPnR z3*z@E^K=jz7|W|%i-hdOkY<*x!M$;zMmPt+P5nyxfO7vbpNNC%YPz;oVZLaXx(4DJ zV5GC3=UG&HY*e5AA6dyet%l`4iXWiUW-DGW(q4RD+mFq=@Lie>zo}m=y34va(!gn5c*6?x~^puw^cRj0tGzGFrr&hU<8QQ(o6TqgFHI z3Na7cPDv2c!2sHa=-tqR#<<9An)aml3ZJbo!qHs%9#4fE3IeoHi4y7YwS#pJ0s=T6 zMJO)xlMYihv8+!@yJ-Poh#p?i4=kMP;v&LeJ?wAa@f)LRoXF=TNE3-&{GHze_OY3h zT4yHam-L59!Q{84F`PW|px=Mwv5D{)N0B_&)9@pE7wa4pC%;raGK7gz(kXDl5-P;L zNhusFhS;g0kqLIeN@G|v*4YJP5wcKpaRe`PO@7t?t#@o#qw?g1&6&>pD~3>aFN9_> zS%kz3#rtMyv9R>eMaHpB%%l6#ypoUYWnx(gYFsr&TiJBaPOAl`O5%Ft` zIf4Ft$LUs@yONf!&3Y%Py>}DI*9X~^@SF{R?A(U}4 zmY^!+mJt*O`}9xX+Ka1dCCRmO#qG?`l6CD-Yz1}kZvc<}H>*fUfXn}Q0i?ZfXtgHw zhDG+0sT#C=V)cyJn`;*aM!dks^L*^#{0N~sjg>h`J2B!SnRq*)H?%glbsD9go;u?K zVvV^&BG`U!9@IrQY^(P9<8smWX!{Uz3AC zT>+N|ud(2TD#VJ>1(!>B^|?O@u!9 zFyS3yPl78yN&8jgag549q~X8vd}&IF7K_iiRKt)sK=`RcAl-2v@KRU&Ml0p}~J-QDl6`gFe`7);Gh+X?!| zrk>>Z<$p=(wDEyHs)qMp{4#m((biIzF*d5p>`&**Juf$e{frzo#^;cOQKh&c!*4Er zA}|t~QB2h4hHV8xv#PdUX;;15 z7Cp*L{+uk$Mj=?^`2Lpw!?CVPe9`5E(64=`*X!X?iDn1!;Z^%~{c>-xGxonS#oMQ2 zkDW8u2RC_2`eHo&vT*hnan0=Aph$cWkf%lbR* z6(lTP@4m^?>NfS-l3HoGIcSONHhD%vnjdLW3I)|K~CY^cHI`ho&@qLagOw38ITh zOcn)Kse}cv06bKNnK_;`R7oq)U3{_#6TA#<11vpdVteYd3$>g_ZBSLGL%=ACJ3FU< ziKzZ`7HiN*A4nqxX~H)}+obSUs{wBiMe8vf(lJxK*Qmu0u0je65Jchd(-@D;$-K*) ziw4hj^`m;usP;%MT5|)WLy-oZXByrpKY!DG%ESvH)8*!LtRD%zHsX&@=?9$=BPXG2 z*QcgAoC$VH?(;FioTysqB!e3+Sv}1oC1cEO{_D>Oyv~kkr`i3M$in}3=#)?P&v@P66igDfjgc#%AhO0$5}tWtsv{$3fw<8L0f_- zi|N`16_ui%ztK0vV^f;{?g~@XMD;imU-ayiQ+=5K7XbPb__F2s>>DfCnbuwyGMg1d z3t@n{#|`DuFD0fPx(T^@o;|5%GpFtTGYMc6osQ1G%GJel0O}yGzK`7+HtDF0e&xPs z$DPJ6WIGZ@aQr5M#dQdX=RnuL+z$fY)8s(LL0lpzcBtIv_w$VQyVS90mRx-K-B>@dX$@e31>nh3b14Zpg|1c|oSN0}mNJ7nUF#QAmoiYS0>K H^Pv9+ib6Z+ literal 0 HcmV?d00001 diff --git a/src/main/ui/static/images/paytm-logo.png b/src/main/ui/static/images/paytm-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8488f6bf538d55e5e1836a1e7b94c57e33efd77f GIT binary patch literal 3817 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 literal 0 HcmV?d00001 diff --git a/src/main/ui/static/images/truemoney-logo.png b/src/main/ui/static/images/truemoney-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f2f7010f677352ab5b05562809e1659b11d15695 GIT binary patch literal 3117 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 0) { - items.splice(items.indexOf(item), 1); - i = i - 1; - } - } - }; - var app = angular.module('partnerManageApp', ['ui.bootstrap', 'ui.router', 'frapontillo.bootstrap-switch', 'ui.select', 'ngFileUpload']); - app.config(['$stateProvider', function ($stateProvider) { - $stateProvider.state('partners', { - url: '/partners', - templateUrl: '/static/payment/partner/templates/partners.html', - controller: 'partnerListCtrl', - data: { label: '商户列表' } - }).state('businessCompliance', { - url: '/partners/compliance', - templateUrl: '/static/payment/partner/templates/partner_compliance.html', - controller: 'compliancePartnerCtrl' - }).state('complianceDocumentAudit', { - url: '/partners/compliance', - templateUrl: '/static/payment/partner/templates/partner_compliance.html', - controller: 'compliancePartnerCtrl' - }).state('partners.detail', { - url: '/{clientMoniker}/detail', - templateUrl: '/static/payment/partner/templates/partner_detail.html', - controller: 'partnerDetailCtrl', - resolve: { - partner: ['$http', '$stateParams', function ($http, $stateParams) { - return $http.get('/sys/partners/' + $stateParams.clientMoniker); - }] - } - }).state('partners.detail.payment_info', { - url: '/payment', - templateUrl: '/static/payment/partner/templates/partner_payment_info.html', - controller: 'partnerPaymentInfoCtrl' - }).state('partners.detail.payment_info_invalid', { - url: '/payment_invalid', - templateUrl: '/static/payment/partner/templates/partner_payment_info_invalid.html', - controller: 'partnerPaymentInfoCtrl' - }).state('partners.detail.subpartners', { - url: '/sub_partners', - templateUrl: '/static/payment/partner/templates/sub_partners.html', - controller: 'partnerSubCtrl' - }).state('partners.detail.accounts', { - url: '/accounts', - templateUrl: '/static/payment/partner/templates/partner_accounts.html', - controller: 'partnerAccountsCtrl' - }).state('partners.detail.paylogs', { - url: '/pay_logs', - templateUrl: '/static/payment/partner/templates/partner_pay_logs.html', - controller: 'partnerPayLogCtrl' - }).state('partners.detail.rates', { - url: '/rates', - templateUrl: '/static/payment/partner/templates/partner_bankaccounts.html', - controller: 'partnerRatesCtrl' - }).state('partners.detail.plugins', { - url: '/plugins', - templateUrl: '/static/payment/partner/templates/partner_plugins.html', - controller: 'partnerPluginsCtrl' - }).state('partners.detail.devices', { - url: '/devices', - templateUrl: '/static/payment/partner/templates/partner_devices.html', - controller: 'partnerDeviceCtrl' - }).state('partners.detail.files', { - url: '/files', - params: { commitType: "cross-border" }, - templateUrl: '/static/payment/partner/templates/partner_auth_files.html', - controller: 'partnerAuthFileCtrl' - }).state('partners.detail.files.CP_files', { - url: '/cp_files', - templateUrl: '/static/payment/partner/templates/partner_cp_auth_files.html', - controller: 'partnerCPAuthFileCtrl', - resolve: { - file: ['$http', '$stateParams', function ($http, $stateParams) { - return $http.get('/sys/partners/' + $stateParams.clientMoniker + '/file'); - }] - } - }).state('partners.detail.files.MW_files', { - url: '/mw_files', - templateUrl: '/static/payment/partner/templates/partner_mw_auth_files.html', - controller: 'partnerMWAuthFileCtrl', - resolve: { - file: ['$http', '$stateParams', function ($http, $stateParams) { - return $http.get('/sys/partners/' + $stateParams.clientMoniker + '/mw_file'); - }] - } - }).state('partners.detail.kyc_files', { - url: '/kyc_files', - templateUrl: '/static/payment/kyc/templates/partner_kyc_files.html', - controller: 'partnerKycFileCtrl', - resolve: { - file: ['$http', '$stateParams', function ($http, $stateParams) { - return $http.get('/sys/partners/' + $stateParams.clientMoniker + '/kycFile'); - }] - } - }).state('partners.detail.settlement', { - url: '/settlement', - templateUrl: '/static/payment/partner/templates/partner_settlement.html', - controller: 'partnerSettlementCtrl', - resolve: { - clientMoniker: ['$stateParams', function ($stateParams) { - return $stateParams.clientMoniker; - }] - } - }).state('partners.detail.surcharge_account', { - url: '/surcharge_account', - templateUrl: '/static/payment/partner/templates/partner_surcharge_account.html', - controller: 'partnerSurchargeAccountCtrl', - resolve: { - clientMoniker: ['$stateParams', function ($stateParams) { - return $stateParams.clientMoniker; - }] - } - }).state('partners.detail.product', { - url: '/partner_product', - templateUrl: 'static/payment/product/templates/partner_product.html', - controller: 'productCtrl' - }).state('partners.detail.sub_merchant_applicaitons', { - url: '/sub_merchant_applicaitons', - templateUrl: 'static/payment/partner/templates/sub_merchant_id_apply.html', - controller: 'subMerchantIdApplicaitonsCtrl' - }).state('partners.detail.permission_client', { - url: '/permission_client', - templateUrl: 'static/payment/partner/templates/partner_permission.html', - controller: 'permissionClientCtrl' - }).state('partners.detail.incremental_service', { - url: '/incremental_service', - templateUrl: 'static/payment/partner/templates/incremental_service.html', - controller: 'incrementalServiceCtrl' - })/*.state('partners.edit', { + 'use strict' + var clean_days_map = [ + { + label: 'T+1', + value: '1', + }, + { + label: 'T+2', + value: '2', + }, + { + label: 'T+3', + value: '3', + }, + ] + var bd_city_map = [ + { + label: 'Sydney', + value: 'Sydney', + }, + { + label: 'Melbourne', + value: 'Melbourne', + }, + ] + var partnerRoles = [ + { code: 1, label: 'Admin' }, + { code: 2, label: 'Manager' }, + { code: 3, label: 'Cashier' }, + ] + // var wxMerchantIndustries = [ + // { + // "label": "鞋包服饰|Shoes&Garments", + // "value": "343" + // }, + // { + // "label": "机票行业|Air Ticket", + // "value": "493" + // }, + // { + // "label": "文具/办公用品|Stationery/office supplies", + // "value": "492" + // }, + // { + // "label": "酒店行业|Hotel Industry", + // "value": "491" + // }, + // { + // "label": "教育行业|Education Industry", + // "value": "490" + // }, + // { + // "label": "国际物流|Logistics", + // "value": "489" + // }, + // { + // "label": "数码电器|Digital appliance", + // "value": "488" + // }, + // { + // "label": "母婴|Maternal and infant", + // "value": "487" + // }, + // { + // "label": "化妆品|Cosmetics", + // "value": "486" + // }, + // { + // "label": "食品|Food", + // "value": "485" + // }, + // { + // "label": "综合商城|Comprehensive mall", + // "value": "484" + // }, + // { + // "label": "其它货物贸易行业|Other trade industry", + // "value": "494" + // } + // ]; + + var wxMerchantIndustries = [ + { + label: 'Shoes&Garments', + value: '343', + }, + { + label: 'Comprehensive mall', + value: '484', + }, + { + label: 'Food', + value: '485', + }, + { + label: 'Cosmetics', + value: '486', + }, + { + label: 'Maternal and infant', + value: '487', + }, + { + label: 'Digital appliance', + value: '488', + }, + { + label: 'Logistics', + value: '489', + }, + { + label: 'Education Industry', + value: '490', + }, + { + label: 'Hotel Industry', + value: '491', + }, + { + label: 'Stationery/office supplies', + value: '492', + }, + { + label: 'Air Ticket', + value: '493', + }, + { + label: 'Other trade industry', + value: '494', + }, + { + label: 'Overseas Education', + value: '528', + }, + { + label: 'Travel ticket', + value: '529', + }, + { + label: 'Car rental', + value: '530', + }, + { + label: 'International Conference', + value: '531', + }, + { + label: 'Software', + value: '532', + }, + { + label: 'Medical Service', + value: '533', + }, + { + label: 'Online games (Top-up)', + value: '644', + }, + { + label: 'Online Shopping Mall', + value: '648', + }, + { + label: 'Supermarket', + value: '649', + }, + { + label: 'Convenience Store', + value: '651', + }, + { + label: 'Duty-free Shop', + value: '652', + }, + { + label: 'Pharmacy', + value: '653', + }, + { + label: 'Vending Machine', + value: '654', + }, + { + label: 'Department Store /Shopping Centre', + value: '655', + }, + { + label: 'Food/Beverages', + value: '656', + }, + { + label: 'Catering Services', + value: '657', + }, + { + label: 'Furniture/Household Products', + value: '658', + }, + { + label: 'Home Appliances/Camera Equipment/Office Equipment', + value: '659', + }, + { + label: 'Beauty/Personal Care Products', + value: '660', + }, + { + label: 'Flowers/Plants/Interior Decorations/Decorations', + value: '661', + }, + { + label: 'Nursery Products/Toys', + value: '662', + }, + { + label: 'Clothing/Shoes/Other Accessories', + value: '663', + }, + { + label: 'Sports/Fitness Equipment/Security', + value: '664', + }, + { + label: 'Watches/Eyewear/Jewellery', + value: '665', + }, + { + label: 'Outdoor Products /Travel Products', + value: '666', + }, + { + label: 'Books / Records / Stationery / Musical Instruments', + value: '667', + }, + { + label: 'Flight ticket/ticketing agent', + value: '668', + }, + { + label: 'Sightseeing Passes', + value: '669', + }, + { + label: 'Hotel/Resort', + value: '670', + }, + { + label: 'Online Books/Video/Music', + value: '671', + }, + { + label: 'Online games (Download)', + value: '672', + }, + { + label: 'University Education', + value: '677', + }, + { + label: 'Public hospitals/Medical Institutions', + value: '679', + }, + { + label: 'Private hospitals/Clinics/Medical institutions', + value: '678', + }, + { + label: 'Public transit', + value: '680', + }, + { + label: 'Logistics/ Courier Service', + value: '684', + }, + ] + var removeClientPayDesc = function (items, key) { + for (var i = 0; i < items.length; i++) { + var item = items[i] + if (item.indexOf(key) >= 0) { + items.splice(items.indexOf(item), 1) + i = i - 1 + } + } + } + var app = angular.module('partnerManageApp', ['ui.bootstrap', 'ui.router', 'frapontillo.bootstrap-switch', 'ui.select', 'ngFileUpload']) + app.config([ + '$stateProvider', + function ($stateProvider) { + $stateProvider + .state('partners', { + url: '/partners', + templateUrl: '/static/payment/partner/templates/partners.html', + controller: 'partnerListCtrl', + data: { label: '商户列表' }, + }) + .state('businessCompliance', { + url: '/partners/compliance', + templateUrl: '/static/payment/partner/templates/partner_compliance.html', + controller: 'compliancePartnerCtrl', + }) + .state('complianceDocumentAudit', { + url: '/partners/compliance', + templateUrl: '/static/payment/partner/templates/partner_compliance.html', + controller: 'compliancePartnerCtrl', + }) + .state('partners.detail', { + url: '/{clientMoniker}/detail', + templateUrl: '/static/payment/partner/templates/partner_detail.html', + controller: 'partnerDetailCtrl', + resolve: { + partner: [ + '$http', + '$stateParams', + function ($http, $stateParams) { + return $http.get('/sys/partners/' + $stateParams.clientMoniker) + }, + ], + }, + }) + .state('partners.detail.payment_info', { + url: '/payment', + templateUrl: '/static/payment/partner/templates/partner_payment_info.html', + controller: 'partnerPaymentInfoCtrl', + }) + .state('partners.detail.payment_info_invalid', { + url: '/payment_invalid', + templateUrl: '/static/payment/partner/templates/partner_payment_info_invalid.html', + controller: 'partnerPaymentInfoCtrl', + }) + .state('partners.detail.subpartners', { + url: '/sub_partners', + templateUrl: '/static/payment/partner/templates/sub_partners.html', + controller: 'partnerSubCtrl', + }) + .state('partners.detail.accounts', { + url: '/accounts', + templateUrl: '/static/payment/partner/templates/partner_accounts.html', + controller: 'partnerAccountsCtrl', + }) + .state('partners.detail.paylogs', { + url: '/pay_logs', + templateUrl: '/static/payment/partner/templates/partner_pay_logs.html', + controller: 'partnerPayLogCtrl', + }) + .state('partners.detail.rates', { + url: '/rates', + templateUrl: '/static/payment/partner/templates/partner_bankaccounts.html', + controller: 'partnerRatesCtrl', + }) + .state('partners.detail.plugins', { + url: '/plugins', + templateUrl: '/static/payment/partner/templates/partner_plugins.html', + controller: 'partnerPluginsCtrl', + }) + .state('partners.detail.devices', { + url: '/devices', + templateUrl: '/static/payment/partner/templates/partner_devices.html', + controller: 'partnerDeviceCtrl', + }) + .state('partners.detail.files', { + url: '/files', + params: { commitType: 'cross-border' }, + templateUrl: '/static/payment/partner/templates/partner_auth_files.html', + controller: 'partnerAuthFileCtrl', + }) + .state('partners.detail.files.CP_files', { + url: '/cp_files', + templateUrl: '/static/payment/partner/templates/partner_cp_auth_files.html', + controller: 'partnerCPAuthFileCtrl', + resolve: { + file: [ + '$http', + '$stateParams', + function ($http, $stateParams) { + return $http.get('/sys/partners/' + $stateParams.clientMoniker + '/file') + }, + ], + }, + }) + .state('partners.detail.files.MW_files', { + url: '/mw_files', + templateUrl: '/static/payment/partner/templates/partner_mw_auth_files.html', + controller: 'partnerMWAuthFileCtrl', + resolve: { + file: [ + '$http', + '$stateParams', + function ($http, $stateParams) { + return $http.get('/sys/partners/' + $stateParams.clientMoniker + '/mw_file') + }, + ], + }, + }) + .state('partners.detail.kyc_files', { + url: '/kyc_files', + templateUrl: '/static/payment/kyc/templates/partner_kyc_files.html', + controller: 'partnerKycFileCtrl', + resolve: { + file: [ + '$http', + '$stateParams', + function ($http, $stateParams) { + return $http.get('/sys/partners/' + $stateParams.clientMoniker + '/kycFile') + }, + ], + }, + }) + .state('partners.detail.settlement', { + url: '/settlement', + templateUrl: '/static/payment/partner/templates/partner_settlement.html', + controller: 'partnerSettlementCtrl', + resolve: { + clientMoniker: [ + '$stateParams', + function ($stateParams) { + return $stateParams.clientMoniker + }, + ], + }, + }) + .state('partners.detail.surcharge_account', { + url: '/surcharge_account', + templateUrl: '/static/payment/partner/templates/partner_surcharge_account.html', + controller: 'partnerSurchargeAccountCtrl', + resolve: { + clientMoniker: [ + '$stateParams', + function ($stateParams) { + return $stateParams.clientMoniker + }, + ], + }, + }) + .state('partners.detail.product', { + url: '/partner_product', + templateUrl: 'static/payment/product/templates/partner_product.html', + controller: 'productCtrl', + }) + .state('partners.detail.sub_merchant_applicaitons', { + url: '/sub_merchant_applicaitons', + templateUrl: 'static/payment/partner/templates/sub_merchant_id_apply.html', + controller: 'subMerchantIdApplicaitonsCtrl', + }) + .state('partners.detail.permission_client', { + url: '/permission_client', + templateUrl: 'static/payment/partner/templates/partner_permission.html', + controller: 'permissionClientCtrl', + }) + .state('partners.detail.incremental_service', { + url: '/incremental_service', + templateUrl: 'static/payment/partner/templates/incremental_service.html', + controller: 'incrementalServiceCtrl', + }) /*.state('partners.edit', { url: '/{clientMoniker}/edit', params: {"commitCardPayment": false, "commitCrossBorderPayment": false}, templateUrl: 'static/payment/partner/templates/partner_edit.html', @@ -415,541 +464,574 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter return $http.get('/sys/partners/' + $stateParams.clientMoniker); }] } - })*/; - }]); - app.controller('partnerEditCtrl', ['$scope', '$http', '$state', 'Upload', 'commonDialog', 'timezone', 'partner', 'upayIndustryMap', - function ($scope, $http, $state, Upload, commonDialog, timezone, partner, upayIndustryMap) { - $scope.upayIndustrys = upayIndustryMap.configs(); - $scope.timezones = timezone.configs(); - $scope.partner = partner.data; - if (!$scope.partner.client_type) { - $scope.partner.client_type = 'cross-border'; - } - if ($scope.partner.representativeInfo != null) { - $scope.partner.registered_address = $scope.partner.representativeInfo.address; - $scope.partner.registered_suburb = $scope.partner.representativeInfo.suburb; - $scope.partner.registered_postcode = $scope.partner.representativeInfo.postcode; - $scope.partner.registered_state = $scope.partner.representativeInfo.state; - $scope.partner.legal_representative_person = $scope.partner.representativeInfo.representative_person; - $scope.partner.legal_representative_phone = $scope.partner.representativeInfo.phone; - $scope.partner.legal_representative_email = $scope.partner.representativeInfo.email; - $scope.partner.legal_representative_job = $scope.partner.representativeInfo.job_title; - - $scope.partner.marketing_person = $scope.partner.representativeInfo.marketing_person; - $scope.partner.marketing_phone = $scope.partner.representativeInfo.marketing_phone; - $scope.partner.marketing_email = $scope.partner.representativeInfo.marketing_email; - $scope.partner.marketing_job = $scope.partner.representativeInfo.marketing_job_title; - - $scope.partner.legal_representative_wechatid = $scope.partner.representativeInfo.legal_representative_wechatid; - $scope.partner.marketing_wechatid = $scope.partner.representativeInfo.marketing_wechatid; - } - - $scope.enablePaymentType = function (type) { - $scope.partner[type] = !$scope.partner[type]; - }; - - if ($state.params.commitCardPayment) { - $scope.enablePaymentType('enable_card_payment'); - } - - if ($state.params.commitCrossBorderPayment) { - $scope.enablePaymentType('enable_cross_payment'); - } - - function hasRole() { - var rolenum; - switch (sessionStorage.getItem('role')) { - case "administrator": - rolenum = 1; - break; - case "bduser": - rolenum = 4; - break; - case "salesmanager": - rolenum = 8192; - break; - case "accountant": - rolenum = 8; - break; - case "sitemanager": - rolenum = 128; - break; - case "director": - rolenum = 64; - break; - case "developer": - rolenum = 256; - break; - case "compliance": - rolenum = 2; - break; - case "guest": - rolenum = 2048; - break; - case "orgmanager": - rolenum = 4096; - break; - case "riskmanager": - rolenum = 1024; - break; - default: - break; - } - if ((window.currentUser.role & rolenum) > 0) { - return true; - } else { - sessionStorage.removeItem('role'); - return false; - } - } - - if (hasRole()) { - $scope.role = sessionStorage.getItem('role'); - } - - var origin_referrer_id = angular.copy($scope.partner.referrer_id); - var resetClientPayDescByTpey = function (type) { - type = parseInt(type); - if (type == 1) { - removeClientPayDesc($scope.partner.client_pay_desc, '10'); - } - if (type == 2) { - removeClientPayDesc($scope.partner.client_pay_desc, '20'); - } - }; - var compare = function (x, y) { - x = parseInt(x); - y = parseInt(y); - if (x < y) { - return -1; - } else if (x > y) { - return 1; - } else { - return 0; - } - } - $scope.toggleClientPayType = function (type) { - if (!$scope.partner.client_pay_type) { - $scope.partner.client_pay_type = []; - } - var $idx = $scope.partner.client_pay_type.indexOf(type); - if ($idx >= 0) { - $scope.partner.client_pay_type.splice($idx, 1); - resetClientPayDescByTpey(type); - } else { - $scope.partner.client_pay_type.push(type); - $scope.partner.client_pay_type.sort(compare); - } - }; - $scope.toggleClientPayDesc = function (type) { - if (!$scope.partner.client_pay_desc) { - $scope.partner.client_pay_desc = []; - } - var $idx = $scope.partner.client_pay_desc.indexOf(type); - if ($idx >= 0) { - if (type == '203') { - removeClientPayDesc($scope.partner.client_pay_desc, '2030') - } - $scope.partner.client_pay_desc.splice($idx, 1); - } else { - $scope.partner.client_pay_desc.push(type); - $scope.partner.client_pay_desc.sort(compare); - } - }; - - $scope.partner.sameAsContactPerson = false; - $scope.checkboxOnclick = function () { - $scope.partner.sameAsContactPerson = !($scope.partner.sameAsContactPerson); - if ($scope.partner.sameAsContactPerson) { - $scope.partner.legal_representative_person = $scope.partner.contact_person; - $scope.partner.legal_representative_phone = $scope.partner.contact_phone; - $scope.partner.legal_representative_email = $scope.partner.contact_email; - $scope.partner.legal_representative_job = $scope.partner.contact_job; - $scope.partner.legal_representative_wechatid = $scope.partner.contact_wechatid; - } - } - - $scope.partner.marketingSameAsContact = false; - $scope.checkMarketingSameAsContact = function () { - $scope.partner.marketingSameAsContact = !($scope.partner.marketingSameAsContact); - if ($scope.partner.marketingSameAsContact) { - $scope.partner.marketing_person = $scope.partner.contact_person; - $scope.partner.marketing_phone = $scope.partner.contact_phone; - $scope.partner.marketing_email = $scope.partner.contact_email; - $scope.partner.marketing_job = $scope.partner.contact_job; - $scope.partner.marketing_wechatid = $scope.partner.contact_wechatid; - } - } - - $scope.partner.sameAsAddress = false; - $scope.sameAddress = function () { - $scope.partner.sameAsAddress = !($scope.partner.sameAsAddress); - if ($scope.partner.sameAsAddress) { - // $scope.partner.registered_address = $scope.partner.address; - // $scope.partner.registered_suburb = $scope.partner.suburb; - // $scope.partner.registered_postcode = $scope.partner.postcode; - // $scope.partner.registered_state = $scope.partner.state; - $scope.partner.address = $scope.partner.registered_address; - $scope.partner.suburb = $scope.partner.registered_suburb; - $scope.partner.postcode = $scope.partner.registered_postcode; - $scope.partner.state = $scope.partner.registered_state; - } - } - - $scope.listReferrers = function () { - $http.get('/sys/orgs/referrer').then(function (resp) { - $scope.referrers = resp.data; - }) - }; - $scope.listReferrers(); - - $scope.loadAlipayCategory = function () { - $http.get('/static/data/alipayMcc.json').then(function (resp) { - $scope.alipayMccCategory = resp.data; - }) - }; - $scope.loadAlipayCategory(); - $scope.loadJDindustry = function () { - $http.get('/static/data/jdindustry.json').then(function (resp) { - $scope.jdindustry = resp.data; - }) - }; - $scope.loadJDindustry(); - - $scope.loadLakalaPayindustry = function () { - $http.get('/static/data/lakalapayindustry.json').then(function (resp) { - $scope.lakalapayindustry = resp.data; - }) - }; - $scope.loadLakalaPayindustry(); - - $scope.loadLakalaPaySettle = function () { - $http.get('/static/data/lakalapaysettle.json').then(function (resp) { - $scope.lakalapaysettle = resp.data; - }) - }; - $scope.loadLakalaPaySettle(); - - $scope.loadLakalaPayGoods = function () { - $http.get('/static/data/lakalapaygoods.json').then(function (resp) { - $scope.lakalapaygoods = resp.data; - }) - }; - $scope.loadLakalaPayGoods(); - - $scope.loadRoyalpayindustry = function () { - $http.get('/static/data/royalpayindustry.json').then(function (resp) { - $scope.royalpayindustry = resp.data; - }) - }; - $scope.loadRoyalpayindustry(); - - $scope.loadHfindustry = function () { - $http.get('/static/data/hfindustry.json').then(function (resp) { - $scope.hfindustry = resp.data; - }) - }; - $scope.loadHfindustry(); - - $scope.onAlipayMccSelect = function (selectedItem) { - $scope.partner.alipay_category = selectedItem.label; - $scope.partner.alipayindustry = selectedItem.mccCode; - }; - $scope.onRoyalPayIndustrySelect = function (selectedItem) { - $scope.partner.royalpay_label = selectedItem.label; - $scope.partner.royalpayindustry = selectedItem.mccCode; - }; - $scope.onHfIndustrySelect = function (selectedItem) { - $scope.partner.hf_label = selectedItem.label; - $scope.partner.hfindustry = selectedItem.mccCode; - }; - - - $scope.updatePartner = function (form) { - if (form.$invalid) { - angular.forEach(form, function (item, key) { - if (key.indexOf('$') < 0) { - item.$dirty = true; - } - }); - return; - } + })*/ + }, + ]) + app.controller('partnerEditCtrl', [ + '$scope', + '$http', + '$state', + 'Upload', + 'commonDialog', + 'timezone', + 'partner', + 'upayIndustryMap', + function ($scope, $http, $state, Upload, commonDialog, timezone, partner, upayIndustryMap) { + $scope.upayIndustrys = upayIndustryMap.configs() + $scope.timezones = timezone.configs() + $scope.partner = partner.data + if (!$scope.partner.client_type) { + $scope.partner.client_type = 'cross-border' + } + if ($scope.partner.representativeInfo != null) { + $scope.partner.registered_address = $scope.partner.representativeInfo.address + $scope.partner.registered_suburb = $scope.partner.representativeInfo.suburb + $scope.partner.registered_postcode = $scope.partner.representativeInfo.postcode + $scope.partner.registered_state = $scope.partner.representativeInfo.state + $scope.partner.legal_representative_person = $scope.partner.representativeInfo.representative_person + $scope.partner.legal_representative_phone = $scope.partner.representativeInfo.phone + $scope.partner.legal_representative_email = $scope.partner.representativeInfo.email + $scope.partner.legal_representative_job = $scope.partner.representativeInfo.job_title + + $scope.partner.marketing_person = $scope.partner.representativeInfo.marketing_person + $scope.partner.marketing_phone = $scope.partner.representativeInfo.marketing_phone + $scope.partner.marketing_email = $scope.partner.representativeInfo.marketing_email + $scope.partner.marketing_job = $scope.partner.representativeInfo.marketing_job_title + + $scope.partner.legal_representative_wechatid = $scope.partner.representativeInfo.legal_representative_wechatid + $scope.partner.marketing_wechatid = $scope.partner.representativeInfo.marketing_wechatid + } + + $scope.enablePaymentType = function (type) { + $scope.partner[type] = !$scope.partner[type] + } + + if ($state.params.commitCardPayment) { + $scope.enablePaymentType('enable_card_payment') + } + + if ($state.params.commitCrossBorderPayment) { + $scope.enablePaymentType('enable_cross_payment') + } + + function hasRole() { + var rolenum + switch (sessionStorage.getItem('role')) { + case 'administrator': + rolenum = 1 + break + case 'bduser': + rolenum = 4 + break + case 'salesmanager': + rolenum = 8192 + break + case 'accountant': + rolenum = 8 + break + case 'sitemanager': + rolenum = 128 + break + case 'director': + rolenum = 64 + break + case 'developer': + rolenum = 256 + break + case 'compliance': + rolenum = 2 + break + case 'guest': + rolenum = 2048 + break + case 'orgmanager': + rolenum = 4096 + break + case 'riskmanager': + rolenum = 1024 + break + default: + break + } + if ((window.currentUser.role & rolenum) > 0) { + return true + } else { + sessionStorage.removeItem('role') + return false + } + } - if ($scope.partner.company_name.indexOf("Migration") != -1) { - alert("Company Name包含敏感词汇,请检查后重新提交!"); - return; - } - if ($scope.partner.company_phone.indexOf(' ') != -1) { - alert('Company Phone can not contain space character'); - return; - } - if ($scope.partner.contact_email.indexOf(' ') != -1) { - alert('Contact email Phone can not contain space character'); - return; - } - if ($scope.partner.suburb.indexOf(' ') != -1) { - alert('suburb can not contain two and more continuous space characters'); - return; - } - if ($scope.partner.client_pay_type.indexOf('2') >= 0) { - if (!$scope.partner.company_photo) { - alert('Shop Photo1 is necessary'); - return; - } - if (!$scope.partner.store_photo) { - alert('Shop Photo2 is necessary'); - return; - } - } + if (hasRole()) { + $scope.role = sessionStorage.getItem('role') + } - if ($scope.partner.acn && $scope.partner.business_structure == 'Company') { - if ($scope.partner.acn.length != 9) { - alert('Acn is not valid'); - } - } - if ($scope.partner.referrer_id) { - $scope.referrers.forEach(function (e) { - if ($scope.partner.referrer_id == e.org_id) { - $scope.partner.referrer_name = e.name; - return; - } - }) - } - var content = ''; - if (!origin_referrer_id && $scope.partner.referrer_id) { - content = 'Update partner info successfully,But You Had add new Referrer,Please Change the BD Commission Proportion!'; - } - if ($scope.partner.client_pay_type.length == 0) { - alert('请选择商户支付场景') - return; - } - if ($scope.partner.client_pay_desc.length == 0) { - alert('请选择商户支付方式') - return; - } - if ($scope.partner.client_pay_type.indexOf('1') >= 0) { - if ($scope.partner.client_pay_desc.join(',').indexOf('10') < 0) { - alert("请检查线上支付场景是否已选择支付方式"); - return; - } - } - if ($scope.partner.client_pay_type.indexOf('2') >= 0) { - if ($scope.partner.client_pay_desc.join(',').indexOf('20') < 0) { - alert("请检查线下支付场景是否已选择支付方式"); - return; - } - } - if ($scope.partner.client_pay_desc.join(',').indexOf('203') >= 0) { - if ($scope.partner.client_pay_desc.join(',').indexOf('2030') < 0 && $scope.partner.client_pay_desc.join(',').indexOf('20399') < 0) { - alert("请检查线下支付是否已选择收银系统类型"); - return; - } - } - $scope.partner.client_pay_type = $scope.partner.client_pay_type.join(','); - $scope.partner.client_pay_desc = $scope.partner.client_pay_desc.join(','); - $http.put('/sys/partners/' + $scope.partner.client_moniker, $scope.partner).then(function () { - if (content != '') { - commonDialog.alert({ - title: 'Warning', - content: content, - type: 'error' - }); - } else { - commonDialog.alert({ - title: 'Success', - content: 'Update partner information successfully', - type: 'success' - }); - } - $scope.updateMerchantLocation(); - $scope.loadPartners(); - $state.go('^.detail', { clientMoniker: $scope.partner.client_moniker }, { reload: true }); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }); - }; - $scope.uploadLogo = function (file) { - if (file != null) { - if (file.size > 1 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过1MB,请压缩后重试', type: 'error' }) - } else { - $scope.logoProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - delete $scope.logoProgress; - $scope.partner.logo_id = resp.data.fileid; - $scope.partner.logo_url = resp.data.url; - }, function (resp) { - delete $scope.logoProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.logoProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - - $scope.uploadShopPhoto = function (file) { - if (file != null) { - if (file.size > 2 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error' }) - } else { - $scope.shopPhotoProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - delete $scope.shopPhotoProgress; - $scope.partner.company_photo = resp.data.url; - }, function (resp) { - delete $scope.shopPhotoProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.shopPhotoProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - - $scope.uploadStorePhoto = function (file) { - if (file != null) { - if (file.size > 2 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error' }) - } else { - $scope.storePhotoProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - delete $scope.storePhotoProgress; - $scope.partner.store_photo = resp.data.url; - }, function (resp) { - delete $scope.storePhotoProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.storePhotoProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; + var origin_referrer_id = angular.copy($scope.partner.referrer_id) + var resetClientPayDescByTpey = function (type) { + type = parseInt(type) + if (type == 1) { + removeClientPayDesc($scope.partner.client_pay_desc, '10') + } + if (type == 2) { + removeClientPayDesc($scope.partner.client_pay_desc, '20') + } + } + var compare = function (x, y) { + x = parseInt(x) + y = parseInt(y) + if (x < y) { + return -1 + } else if (x > y) { + return 1 + } else { + return 0 + } + } + $scope.toggleClientPayType = function (type) { + if (!$scope.partner.client_pay_type) { + $scope.partner.client_pay_type = [] + } + var $idx = $scope.partner.client_pay_type.indexOf(type) + if ($idx >= 0) { + $scope.partner.client_pay_type.splice($idx, 1) + resetClientPayDescByTpey(type) + } else { + $scope.partner.client_pay_type.push(type) + $scope.partner.client_pay_type.sort(compare) + } + } + $scope.toggleClientPayDesc = function (type) { + if (!$scope.partner.client_pay_desc) { + $scope.partner.client_pay_desc = [] + } + var $idx = $scope.partner.client_pay_desc.indexOf(type) + if ($idx >= 0) { + if (type == '203') { + removeClientPayDesc($scope.partner.client_pay_desc, '2030') + } + $scope.partner.client_pay_desc.splice($idx, 1) + } else { + $scope.partner.client_pay_desc.push(type) + $scope.partner.client_pay_desc.sort(compare) + } + } + + $scope.partner.sameAsContactPerson = false + $scope.checkboxOnclick = function () { + $scope.partner.sameAsContactPerson = !$scope.partner.sameAsContactPerson + if ($scope.partner.sameAsContactPerson) { + $scope.partner.legal_representative_person = $scope.partner.contact_person + $scope.partner.legal_representative_phone = $scope.partner.contact_phone + $scope.partner.legal_representative_email = $scope.partner.contact_email + $scope.partner.legal_representative_job = $scope.partner.contact_job + $scope.partner.legal_representative_wechatid = $scope.partner.contact_wechatid + } + } + + $scope.partner.marketingSameAsContact = false + $scope.checkMarketingSameAsContact = function () { + $scope.partner.marketingSameAsContact = !$scope.partner.marketingSameAsContact + if ($scope.partner.marketingSameAsContact) { + $scope.partner.marketing_person = $scope.partner.contact_person + $scope.partner.marketing_phone = $scope.partner.contact_phone + $scope.partner.marketing_email = $scope.partner.contact_email + $scope.partner.marketing_job = $scope.partner.contact_job + $scope.partner.marketing_wechatid = $scope.partner.contact_wechatid + } + } + + $scope.partner.sameAsAddress = false + $scope.sameAddress = function () { + $scope.partner.sameAsAddress = !$scope.partner.sameAsAddress + if ($scope.partner.sameAsAddress) { + // $scope.partner.registered_address = $scope.partner.address; + // $scope.partner.registered_suburb = $scope.partner.suburb; + // $scope.partner.registered_postcode = $scope.partner.postcode; + // $scope.partner.registered_state = $scope.partner.state; + $scope.partner.address = $scope.partner.registered_address + $scope.partner.suburb = $scope.partner.registered_suburb + $scope.partner.postcode = $scope.partner.registered_postcode + $scope.partner.state = $scope.partner.registered_state + } + } + + $scope.listReferrers = function () { + $http.get('/sys/orgs/referrer').then(function (resp) { + $scope.referrers = resp.data + }) + } + $scope.listReferrers() + + $scope.loadAlipayCategory = function () { + $http.get('/static/data/alipayMcc.json').then(function (resp) { + $scope.alipayMccCategory = resp.data + }) + } + $scope.loadAlipayCategory() + $scope.loadJDindustry = function () { + $http.get('/static/data/jdindustry.json').then(function (resp) { + $scope.jdindustry = resp.data + }) + } + $scope.loadJDindustry() + + $scope.loadLakalaPayindustry = function () { + $http.get('/static/data/lakalapayindustry.json').then(function (resp) { + $scope.lakalapayindustry = resp.data + }) + } + $scope.loadLakalaPayindustry() + + $scope.loadLakalaPaySettle = function () { + $http.get('/static/data/lakalapaysettle.json').then(function (resp) { + $scope.lakalapaysettle = resp.data + }) + } + $scope.loadLakalaPaySettle() + + $scope.loadLakalaPayGoods = function () { + $http.get('/static/data/lakalapaygoods.json').then(function (resp) { + $scope.lakalapaygoods = resp.data + }) + } + $scope.loadLakalaPayGoods() + + $scope.loadRoyalpayindustry = function () { + $http.get('/static/data/royalpayindustry.json').then(function (resp) { + $scope.royalpayindustry = resp.data + }) + } + $scope.loadRoyalpayindustry() + + $scope.loadHfindustry = function () { + $http.get('/static/data/hfindustry.json').then(function (resp) { + $scope.hfindustry = resp.data + }) + } + $scope.loadHfindustry() + + $scope.onAlipayMccSelect = function (selectedItem) { + $scope.partner.alipay_category = selectedItem.label + $scope.partner.alipayindustry = selectedItem.mccCode + } + $scope.onRoyalPayIndustrySelect = function (selectedItem) { + $scope.partner.royalpay_label = selectedItem.label + $scope.partner.royalpayindustry = selectedItem.mccCode + } + $scope.onHfIndustrySelect = function (selectedItem) { + $scope.partner.hf_label = selectedItem.label + $scope.partner.hfindustry = selectedItem.mccCode + } + + $scope.updatePartner = function (form) { + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true + } + }) + return + } - $scope.getMerchantLocation = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/location').then(function (resp) { - $scope.merchant_location = resp.data; - }); - }; - $scope.getMerchantLocation(); - - $scope.updateMerchantLocation = function () { - var params = window.frames['merchant_detail'].merchant_location; - if (params) { - $http.put('/sys/partners/modify/' + $scope.partner.client_moniker + '/location', params).then(function () { - }); - } - } - }]); - app.controller('partnerListCtrl', ['$scope', '$sce', '$http', '$filter', '$uibModal', 'businessStructuresMap', 'industryMap', 'stateMap', 'sectorMap', 'countryMap', - function ($scope, $sce, $http, $filter, $uibModal, businessStructuresMap, industryMap, stateMap, sectorMap, countryMap) { + if ($scope.partner.company_name.indexOf('Migration') != -1) { + alert('Company Name包含敏感词汇,请检查后重新提交!') + return + } + if ($scope.partner.company_phone.indexOf(' ') != -1) { + alert('Company Phone can not contain space character') + return + } + if ($scope.partner.contact_email.indexOf(' ') != -1) { + alert('Contact email Phone can not contain space character') + return + } + if ($scope.partner.suburb.indexOf(' ') != -1) { + alert('suburb can not contain two and more continuous space characters') + return + } + if ($scope.partner.client_pay_type.indexOf('2') >= 0) { + if (!$scope.partner.company_photo) { + alert('Shop Photo1 is necessary') + return + } + if (!$scope.partner.store_photo) { + alert('Shop Photo2 is necessary') + return + } + } - $scope.analysisClients = function () { - $http.get('/sys/partners/analysis').then(function (resp) { - $scope.analysis = resp.data; - }) - }; - if ($scope.currentUser.org_id == 1 || $scope.currentUser.org_id == null) { - $scope.analysisClients(); + if ($scope.partner.acn && $scope.partner.business_structure == 'Company') { + if ($scope.partner.acn.length != 9) { + alert('Acn is not valid') + } + } + if ($scope.partner.referrer_id) { + $scope.referrers.forEach(function (e) { + if ($scope.partner.referrer_id == e.org_id) { + $scope.partner.referrer_name = e.name + return } - $scope.pagination = {}; - $scope.industries = industryMap.configs(); - $scope.states = stateMap.configs(); - $scope.countries = countryMap.configs(); - $scope.sectors = sectorMap.configs(); - $scope.business_structures = businessStructuresMap.configs(); - $scope.clean_days = angular.copy(clean_days_map); - $scope.bd_citys = angular.copy(bd_city_map); - $scope.params = { textType: 'all', org_name: 'ALL', industry: "0" }; - $scope.loadRoyalpayindustry = function () { - $http.get('/static/data/royalpayindustry.json').then(function (resp) { - $scope.royalpayindustry = resp.data; - var selectAll = { - "label": "All", - "mccCode": "0", - "children": {} - }; - $scope.royalpayindustry.unshift(selectAll); - }) - }; - - $scope.loadRoyalpayindustry(); - - $scope.onRoyalPayIndustrySelect = function (selectedItem) { - $scope.params.royalpay_label = selectedItem.label; - $scope.params.industry = selectedItem.mccCode; - $scope.loadPartners(1); - }; - - $scope.loadPartners = function (page) { - var params = angular.copy($scope.params); - params.page = page || $scope.pagination.page || 1; - $http.get('/sys/partners', { params: params }).then(function (resp) { - $scope.partners = resp.data.data; - $scope.pagination = resp.data.pagination; - }); - }; - - $scope.exportPartnersExcel = function () { - var params = angular.copy($scope.params); - var param_str = Object.keys(params).map(function (key) { - var value = params[key]; - if (angular.isDate(value)) { - value = $filter('date')(value, 'yyyy-MM-ddTHH:mm:ssZ') - } - return key + '=' + encodeURIComponent(value) - }).join('&'); - window.open('/sys/partners/exporting_excel?' + param_str) - }; - - /*$scope.loadLocations = function () { + }) + } + var content = '' + if (!origin_referrer_id && $scope.partner.referrer_id) { + content = 'Update partner info successfully,But You Had add new Referrer,Please Change the BD Commission Proportion!' + } + if ($scope.partner.client_pay_type.length == 0) { + alert('请选择商户支付场景') + return + } + if ($scope.partner.client_pay_desc.length == 0) { + alert('请选择商户支付方式') + return + } + if ($scope.partner.client_pay_type.indexOf('1') >= 0) { + if ($scope.partner.client_pay_desc.join(',').indexOf('10') < 0) { + alert('请检查线上支付场景是否已选择支付方式') + return + } + } + if ($scope.partner.client_pay_type.indexOf('2') >= 0) { + if ($scope.partner.client_pay_desc.join(',').indexOf('20') < 0) { + alert('请检查线下支付场景是否已选择支付方式') + return + } + } + if ($scope.partner.client_pay_desc.join(',').indexOf('203') >= 0) { + if ($scope.partner.client_pay_desc.join(',').indexOf('2030') < 0 && $scope.partner.client_pay_desc.join(',').indexOf('20399') < 0) { + alert('请检查线下支付是否已选择收银系统类型') + return + } + } + $scope.partner.client_pay_type = $scope.partner.client_pay_type.join(',') + $scope.partner.client_pay_desc = $scope.partner.client_pay_desc.join(',') + $http.put('/sys/partners/' + $scope.partner.client_moniker, $scope.partner).then( + function () { + if (content != '') { + commonDialog.alert({ + title: 'Warning', + content: content, + type: 'error', + }) + } else { + commonDialog.alert({ + title: 'Success', + content: 'Update partner information successfully', + type: 'success', + }) + } + $scope.updateMerchantLocation() + $scope.loadPartners() + $state.go('^.detail', { clientMoniker: $scope.partner.client_moniker }, { reload: true }) + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + $scope.uploadLogo = function (file) { + if (file != null) { + if (file.size > 1 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过1MB,请压缩后重试', type: 'error' }) + } else { + $scope.logoProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + delete $scope.logoProgress + $scope.partner.logo_id = resp.data.fileid + $scope.partner.logo_url = resp.data.url + }, + function (resp) { + delete $scope.logoProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.logoProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + + $scope.uploadShopPhoto = function (file) { + if (file != null) { + if (file.size > 2 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error' }) + } else { + $scope.shopPhotoProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + delete $scope.shopPhotoProgress + $scope.partner.company_photo = resp.data.url + }, + function (resp) { + delete $scope.shopPhotoProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.shopPhotoProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + + $scope.uploadStorePhoto = function (file) { + if (file != null) { + if (file.size > 2 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error' }) + } else { + $scope.storePhotoProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + delete $scope.storePhotoProgress + $scope.partner.store_photo = resp.data.url + }, + function (resp) { + delete $scope.storePhotoProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.storePhotoProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + + $scope.getMerchantLocation = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/location').then(function (resp) { + $scope.merchant_location = resp.data + }) + } + $scope.getMerchantLocation() + + $scope.updateMerchantLocation = function () { + var params = window.frames['merchant_detail'].merchant_location + if (params) { + $http.put('/sys/partners/modify/' + $scope.partner.client_moniker + '/location', params).then(function () {}) + } + } + }, + ]) + app.controller('partnerListCtrl', [ + '$scope', + '$sce', + '$http', + '$filter', + '$uibModal', + 'businessStructuresMap', + 'industryMap', + 'stateMap', + 'sectorMap', + 'countryMap', + function ($scope, $sce, $http, $filter, $uibModal, businessStructuresMap, industryMap, stateMap, sectorMap, countryMap) { + $scope.analysisClients = function () { + $http.get('/sys/partners/analysis').then(function (resp) { + $scope.analysis = resp.data + }) + } + if ($scope.currentUser.org_id == 1 || $scope.currentUser.org_id == null) { + $scope.analysisClients() + } + $scope.pagination = {} + $scope.industries = industryMap.configs() + $scope.states = stateMap.configs() + $scope.countries = countryMap.configs() + $scope.sectors = sectorMap.configs() + $scope.business_structures = businessStructuresMap.configs() + $scope.clean_days = angular.copy(clean_days_map) + $scope.bd_citys = angular.copy(bd_city_map) + $scope.params = { textType: 'all', org_name: 'ALL', industry: '0' } + $scope.loadRoyalpayindustry = function () { + $http.get('/static/data/royalpayindustry.json').then(function (resp) { + $scope.royalpayindustry = resp.data + var selectAll = { + label: 'All', + mccCode: '0', + children: {}, + } + $scope.royalpayindustry.unshift(selectAll) + }) + } + + $scope.loadRoyalpayindustry() + + $scope.onRoyalPayIndustrySelect = function (selectedItem) { + $scope.params.royalpay_label = selectedItem.label + $scope.params.industry = selectedItem.mccCode + $scope.loadPartners(1) + } + + $scope.loadPartners = function (page) { + var params = angular.copy($scope.params) + params.page = page || $scope.pagination.page || 1 + $http.get('/sys/partners', { params: params }).then(function (resp) { + $scope.partners = resp.data.data + $scope.pagination = resp.data.pagination + }) + } + + $scope.exportPartnersExcel = function () { + var params = angular.copy($scope.params) + var param_str = Object.keys(params) + .map(function (key) { + var value = params[key] + if (angular.isDate(value)) { + value = $filter('date')(value, 'yyyy-MM-ddTHH:mm:ssZ') + } + return key + '=' + encodeURIComponent(value) + }) + .join('&') + window.open('/sys/partners/exporting_excel?' + param_str) + } + + /*$scope.loadLocations = function () { var params = angular.copy($scope.params); $http.get('/sys/partners/merchant/list_locations', {params: params}).then(function (resp) { $scope.locations = resp.data; window.merchant_maps.initMap($scope.locations); }); };*/ - $scope.today = new Date(); - - $scope.listBDUsers = function () { - $http.get('/sys/manager_accounts/roles/bd_user').then(function (resp) { - $scope.bdUserSource = resp.data; - }) - }; - $scope.listBDUsers(); - - if (($scope.currentUser.role & parseInt('1000011', 2)) > 0 && !$scope.currentUser.org_id) { - $scope.showOrg = 'Organization'; - $http.get('/sys/orgs/list_all_Org', { params: {} }).then(function (resp) { - $scope.orgs = resp.data; - }); - } - - $scope.loadOrgs = function () { - var params = angular.copy($scope.params); - $http.get('/sys/orgs/orgChild', { params: params }).then(function (resp) { - $scope.orgs_child = resp.data; - }) - }; - $scope.loadOrgs(); - - - /* $scope.onOrgsSelect = function (selectedItem) { + $scope.today = new Date() + + $scope.listBDUsers = function () { + $http.get('/sys/manager_accounts/roles/bd_user').then(function (resp) { + $scope.bdUserSource = resp.data + }) + } + $scope.listBDUsers() + + if (($scope.currentUser.role & parseInt('1000011', 2)) > 0 && !$scope.currentUser.org_id) { + $scope.showOrg = 'Organization' + $http.get('/sys/orgs/list_all_Org', { params: {} }).then(function (resp) { + $scope.orgs = resp.data + }) + } + + $scope.loadOrgs = function () { + var params = angular.copy($scope.params) + $http.get('/sys/orgs/orgChild', { params: params }).then(function (resp) { + $scope.orgs_child = resp.data + }) + } + $scope.loadOrgs() + + /* $scope.onOrgsSelect = function (selectedItem) { $scope.params.org_id = selectedItem.org_id; $scope.params.org_name = selectedItem.label; $scope.loadPartners(); }; */ - /* $scope.chooseOrg = function (org) { + /* $scope.chooseOrg = function (org) { if (org == 'all') { delete $scope.params.org_id; $scope.showOrg = 'All' @@ -960,23 +1042,21 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.loadPartners(1); };*/ - $scope.loadPartners(1); - - - $scope.openClientBoard = function (client) { - $uibModal.open({ - templateUrl: '/static/analysis/templates/partner_card.html', - controller: 'partnerCardCtrl', - resolve: { - clientMoniker: function () { - return client.client_moniker - } - }, - size: 'lg' - }) - - }; - /*$scope.toogleMapSelect = function () { + $scope.loadPartners(1) + + $scope.openClientBoard = function (client) { + $uibModal.open({ + templateUrl: '/static/analysis/templates/partner_card.html', + controller: 'partnerCardCtrl', + resolve: { + clientMoniker: function () { + return client.client_moniker + }, + }, + size: 'lg', + }) + } + /*$scope.toogleMapSelect = function () { $scope.mapFrame = 'all_locations.html'; $scope.loadLocations(); } @@ -984,3776 +1064,4384 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.mapFrame = null; } $scope.toogleMerchantSelect();*/ - }]); - app.controller('compliancePartnerCtrl', ['$scope', '$sce', '$http', '$filter', '$uibModal', 'businessStructuresMap', 'industryMap', 'stateMap', 'sectorMap', 'countryMap', - function ($scope, $sce, $http, $filter, $uibModal, businessStructuresMap, industryMap, stateMap, sectorMap, countryMap) { - - $scope.analysisClients = function () { - $http.get('/sys/partners/analysis').then(function (resp) { - $scope.analysis = resp.data; - }) - }; - if ($scope.currentUser.org_id == 1 || $scope.currentUser.org_id == null) { - $scope.analysisClients(); - } - $scope.pagination = {}; - $scope.industries = industryMap.configs(); - $scope.states = stateMap.configs(); - $scope.countries = countryMap.configs(); - $scope.sectors = sectorMap.configs(); - $scope.business_structures = businessStructuresMap.configs(); - $scope.clean_days = angular.copy(clean_days_map); - $scope.bd_citys = angular.copy(bd_city_map); - $scope.params = { textType: 'all', org_name: 'ALL', approving_flag: false, card_approving_flag: false }; - - $scope.loadPartners = function (page) { - $scope.validAndCleanApproveStatus(); - var params = angular.copy($scope.params); - params.page = page || $scope.pagination.page || 1; - $http.get('/sys/partners/compliance', { params: params }).then(function (resp) { - $scope.partners = resp.data.data; - $scope.pagination = resp.data.pagination; - }); - }; - - $scope.validAndCleanApproveStatus = function () { - if (!$scope.params.cross_approving_flag && !$scope.params.card_approving_flag) { - $scope.params.approving = false - $scope.params.card_approving = false - $scope.params.waitingCompliance = false - $scope.params.tempMchId = false - $scope.params.bd_upload_material = false - $scope.params.quickPass = false - $scope.params.greenChannel = false - $scope.params.pass = false - $scope.params.completed_contract = false - $scope.params.apply_to_back = false - $scope.params.is_valid = false - } - if (!$scope.params.cross_approving_flag && $scope.params.card_approving_flag) { - $scope.params.tempMchId = false - $scope.params.quickPass = false - $scope.params.greenChannel = false - } - }; - - $scope.today = new Date(); - - $scope.listBDUsers = function () { - $http.get('/sys/manager_accounts/roles/bd_user').then(function (resp) { - $scope.bdUserSource = resp.data; - }) - }; - $scope.listBDUsers(); - - if (($scope.currentUser.role & parseInt('1000011', 2)) > 0 && !$scope.currentUser.org_id) { - $scope.showOrg = 'Organization'; - $http.get('/sys/orgs/list_all_Org', { params: {} }).then(function (resp) { - $scope.orgs = resp.data; - }); - } - - $scope.loadOrgs = function () { - var params = angular.copy($scope.params); - $http.get('/sys/orgs/orgChild', { params: params }).then(function (resp) { - $scope.orgs_child = resp.data; - }) - }; - $scope.loadOrgs(); - - $scope.loadPartners(1); - - - $scope.openClientBoard = function (client) { - $uibModal.open({ - templateUrl: '/static/analysis/templates/partner_card.html', - controller: 'partnerCardCtrl', - resolve: { - clientMoniker: function () { - return client.client_moniker - } - }, - size: 'lg' - }) - - }; - }]); - app.controller('partnerDetailCtrl', ['$scope', '$http', '$state', '$uibModal', '$rootScope', 'Upload', 'commonDialog', 'partner', '$sce', - function ($scope, $http, $state, $uibModal, $rootScope, Upload, commonDialog, partner, $sce) { - $scope.init = { wechat_compliance: false, local_merchant: false }; - $scope.partner = partner.data; - $scope.isComplianceOfCompanyName = false; - $scope.isComplianceOfShortName = false; - $scope.isComplianceOfBusinessStructure = false; - $scope.cardPromotionaparams = {}; - if ($scope.partner.mc_code) { - $scope.partner.mc_code = parseInt($scope.partner.mc_code); - } - var website = partner.data.company_website; - if (website != null) { - if (website.indexOf('http') !== 0) { - $scope.partner.company_website = 'http://' + angular.copy(website); - } - } - $scope.decideCompliance = function (name) { - var keywords = ['education', 'financial', 'train', 'immigrant', 'invest', - '律师咨询', '会计事务所', '移民', '留学', '娱乐', '金融', '地产', '投资']; - for (var i = 0; i < keywords.length; i++) { - if (name.indexOf(keywords[i]) !== -1) { - return true; - } - } - return false; - }; - if (partner.data.company_name != null) { - $scope.isComplianceOfCompanyName = $scope.decideCompliance(partner.data.company_name); - } - if (partner.data.short_name != null) { - $scope.isComplianceOfShortName = $scope.decideCompliance(partner.data.short_name); - } - if (partner.data.business_structure != null) { - $scope.isComplianceOfBusinessStructure = $scope.decideCompliance(partner.data.business_structure); - } - $scope.showDBUsers = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/bd_user').then(function (resp) { - $scope.partner.client_bds = resp.data; - }) - }; - $scope.showDBUsers(); - $scope.showFile = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/file/source_agree_file').then(function (resp) { - $scope.fileManager = resp.data; - }); - }; - - $scope.showCardFile = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/file/source_card_agree_file?fileName=letter_of_offer_file').then(function (resp) { - $scope.letterOfOfferFileManager = resp.data; - }); - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/file/source_card_agree_file?fileName=promotional_offer_file').then(function (resp) { - $scope.promotionalOfferFileManager = resp.data; - }); - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/file/source_card_agree_file?fileName=terms_and_conditions_file').then(function (resp) { - $scope.termsAndConditionsFile = resp.data; - }); - }; - - $scope.showFile(); - $scope.showCardFile(); - $scope.passClient = function () { - if (!$rootScope.complianceCheck) { - alert("please check first"); - return; - } - if (!$rootScope.complianceCheck.authFile) { - alert("Compliance Files not checked"); - return; - } - if (!$rootScope.complianceCheck.clientInfo) { - alert("Partner Detail not checked"); - return; - } - if (!$rootScope.complianceCheck.bankAccount) { - alert("Bank Account not checked"); - return; - } - var title = 'Audit Partner'; - var content = 'Are you sure to mark partner ' + $scope.partner.company_name + ' audited?'; - var choises = ''; - var contentHtml = ''; - if ($scope.isComplianceOfCompanyName || $scope.isComplianceOfShortName - || $scope.isComplianceOfBusinessStructure) { - var info = []; - if ($scope.isComplianceOfCompanyName) { - info.push('Company Name'); - } - if ($scope.isComplianceOfShortName) { - info.push('Short Name'); - } - if ($scope.isComplianceOfBusinessStructure) { - info.push('Business Structure'); - } - title = 'Warning'; - contentHtml = $sce.trustAsHtml('本次提交的商户[' + $scope.partner.company_name + '],' + info.toString() + '存在微信渠道不合规信息'); - choises = [{ label: '取消', className: 'btn-danger', key: '2', dismiss: true }, - { label: '确认提交', className: 'btn-success', key: '1' }]; - content = ''; - } - commonDialog.confirm({ - title: title, - content: content, - choises: choises, - contentHtml: contentHtml - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit', { pass: 1 }).then(function () { - if ($scope.partner.approve_result == 2 && ($scope.partner.source == 1 || $scope.partner.source == 2)) { - commonDialog.alert({ - title: 'Success', - content: 'Comply Passed!', - type: 'success' - }); - } else { - commonDialog.alert({ - title: 'Success', - content: 'Comply Passed! Email will send to contact email address soon.', - type: 'success' - }); - } - delete $rootScope.complianceCheck; - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - }); - }; - $scope.passCardClient = function () { - if (!$rootScope.complianceCheck) { - alert("please check first"); - return; - } - if (!$rootScope.complianceCheck.authFile) { - alert("Compliance Files not checked"); - return; - } - if (!$rootScope.complianceCheck.clientInfo) { - alert("Partner Detail not checked"); - return; - } - if (!$rootScope.complianceCheck.bankAccount) { - alert("Bank Account not checked"); - return; - } - var title = 'Audit Partner Card'; - var content = 'Are you sure to mark partner ' + $scope.partner.company_name + ' audited?'; - var choises = ''; - var contentHtml = ''; - if ($scope.isComplianceOfCompanyName || $scope.isComplianceOfShortName - || $scope.isComplianceOfBusinessStructure) { - var info = []; - if ($scope.isComplianceOfCompanyName) { - info.push('Company Name'); - } - if ($scope.isComplianceOfShortName) { - info.push('Short Name'); - } - if ($scope.isComplianceOfBusinessStructure) { - info.push('Business Structure'); - } - title = 'Warning'; - contentHtml = $sce.trustAsHtml('本次提交的商户[' + $scope.partner.company_name + '],' + info.toString() + '存在微信渠道不合规信息'); - choises = [{ label: '取消', className: 'btn-danger', key: '2', dismiss: true }, - { label: '确认提交', className: 'btn-success', key: '1' }]; - content = ''; - } - commonDialog.confirm({ - title: title, - content: content, - choises: choises, - contentHtml: contentHtml - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/card_audit', { pass: 1 }).then(function () { - if ($scope.partner.approve_result == 2 && ($scope.partner.source == 1 || $scope.partner.source == 2)) { - commonDialog.alert({ - title: 'Success', - content: 'Comply Passed!', - type: 'success' - }); - } else { - commonDialog.alert({ - title: 'Success', - content: 'Comply Passed! Email will send to contact email address soon.', - type: 'success' - }); - } - delete $rootScope.complianceCheck; - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - }); - }; - $scope.pass2GreenChannel = function () { - commonDialog.confirm({ - title: 'Green Channel Audit Partner', - content: 'Are you sure to mark partner ' + $scope.partner.company_name + ' green channel audited ?' - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/aduit/green_channel').then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Comply Passed! Email will send to contact email address soon.', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - }) - }; - $scope.showBg = false; - $scope.exportPDF = function () { - $scope.showBg = true; - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/export/agreepdf').then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Agreement File Generate Succeed! Please notify BD!', - type: 'success' - }); - $scope.showBg = false; - $state.reload(); - }, function (resp) { - $scope.showBg = false; - $state.reload(); - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }); - - }; - $scope.exportAgreegatePDF = function () { - $scope.showBg = true; - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/export/aggregate/agreepdf').then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Agreement File Generate Succeed! Please notify BD!', - type: 'success' - }); - $scope.showBg = false; - $state.reload(); - }, function (resp) { - $scope.showBg = false; - $state.reload(); - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }); - }; - - //制作卡支付合同 - $scope.exportCardAgreegatePDF = function () { - $scope.showBg = true; - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/export/aggregate/card_agree_pdf').then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Agreement File Generate Succeed! Please notify BD!', - type: 'success' - }); - $scope.showBg = false; - $state.reload(); - }, function (resp) { - $scope.showBg = false; - $state.reload(); - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }); - } - $scope.Export = function () { - var url = '/dev/' + $scope.partner.client_moniker + '/export/aggregate/agreepdf'; - return url; - } - $scope.uploadAgreeFile = function (file) { - if (file != null) { - if (file.size > 2 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error' }) - } else { - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - $scope.agree_file_import = resp.data.url; - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/import/agreepdf', { source_agree_file: $scope.agree_file_import }).then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Succeed Imported! Please notify BD', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - }, function (resp) { - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }) - } - } - }; - - $scope.uploadCardAgreeFile = function (file) { - if (file != null) { - if (file.size > 2 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error' }) - } else { - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - $scope.agree_file_import = resp.data.url; - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/import/agreepdf', { source_agree_file: $scope.agree_file_import }).then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Succeed Imported! Please notify BD', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - }, function (resp) { - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }) - } - } - }; - $scope.notifyBD = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/notify/completeAgree').then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Notify BD Successed!.', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }); - }); - }; - - $scope.cardNotifyBD = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/notify/cardCompleteAgree').then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Notify BD Successed!.', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }); - }); - }; - - $scope.downTempPdf = function () { - return '/sys/partners/' + $scope.partner.client_moniker + '/temp/export/pdf'; - } - - $scope.refuse = function () { - commonDialog.inputText({ title: 'refuse cause' }).then(function (text) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit/refuse', { refuse_remark: text }).then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Audit application has been refused.', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - }) - }; - - $scope.cardRefuse = function () { - commonDialog.inputText({ title: 'refuse cause' }).then(function (text) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/card_audit/refuse', { refuse_remark: text }).then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Card Audit application has been refused.', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - }) - } - - $scope.deleteClient = function () { - commonDialog.confirm({ - title: 'Delete Partner', - content: 'Are you sure to delete ' + $scope.partner.company_name + '?' - }).then(function () { - $http.delete('/sys/partners/' + $scope.partner.client_moniker).then(function () { - $state.go('^'); - commonDialog.alert({ title: 'Delete', content: 'Partner Already Disabled', type: 'error' }); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - }) - }; - $scope.revertClient = function () { - commonDialog.confirm({ - title: 'Revert Partner', - content: 'Are you sure to Revert ' + $scope.partner.company_name + '?' - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/revert').then(function () { - $state.go('^'); - commonDialog.alert({ title: 'Revert', content: 'Partner Already Revert', type: 'success' }); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - }) - }; - - $scope.commitToCompliance = function () { - commonDialog.confirm({ - title: 'Commit to Compliance', - content: 'Are you sure to commit ' + $scope.partner.company_name + ' to compliance?', - choises: [ - { label: 'Submit', className: 'btn-success', key: 1 }, - { label: 'Cancel', className: 'btn-warning', key: 0, dismiss: true } - ] - }).then(function (choice) { - if (choice == 1) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/to_compliance', {}).then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Commit to Compliance successfully', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - } - }) - }; - - $scope.commitToCardCompliance = function () { - commonDialog.confirm({ - title: 'Commit to Compliance', - content: 'Are you sure to commit ' + $scope.partner.company_name + ' to compliance?', - choises: [ - { label: 'Submit', className: 'btn-success', key: 1 }, - { label: 'Cancel', className: 'btn-warning', key: 0, dismiss: true } - ] - }).then(function (choice) { - if (choice == 1) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/to_card_compliance', {}).then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Commit to Compliance successfully', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - } - }) - } - $scope.apply2makeAgreeFile = function () { - if (!$scope.partner.enable_cross_payment) { - commonDialog.alert({ - title: 'Error!', - content: '请完善商户跨境支付基本信息、签约费率、合规文件!', - type: 'error' - }); - $state.go('partners.edit', { - clientMoniker: $scope.partner.client_moniker, - commitCardPayment: false, - commitCrossBorderPayment: true - }); - return; - } - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/make_agree_file').then(function () { - commonDialog.alert({ - title: 'Success!', - content: '已提交制作合同!', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - } - ); - }; - - $scope.apply2makeCardAgreeFile = function () { - if (!$scope.partner.enable_card_payment) { - commonDialog.alert({ - title: 'Error!', - content: '请完善商户卡支付基本信息、签约费率、合规文件!', - type: 'error' - }); - $state.go('partners.edit', { - clientMoniker: $scope.partner.client_moniker, - commitCardPayment: true, - commitCrossBorderPayment: false - }); - return; - } - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/make_card_agree_file').then(function () { - commonDialog.alert({ - title: 'Success!', - content: '已提交制作合同!', - type: 'success' - }); - $state.reload(); - }, function (resp) { - if (String(resp.data.message).match("No Rate Config")) { - commonDialog.alert({ - title: 'Error!', - content: '商户卡支付签约费率未配置,请添加商户卡支付签约费率!', - type: 'error' - }); - $state.go('partners.detail.rates', { - clientMoniker: $scope.partner.client_moniker - }); - } else { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - } - } - ); - }; - - $scope.commit2GreenChannel = function () { - commonDialog.confirm({ - title: 'Audit Partner', - content: 'Are you sure to mark partner ' + $scope.partner.company_name + ' Green Channel?' - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/compliance/green_channel').then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Commit to Green Channel successfully', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - - }) - }; - - $scope.markAuditEmail = function () { - commonDialog.confirm({ - title: 'Warning', - content: 'Make sure you have send the email to client.' - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit/email_sending_status').then(function () { - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - }) - }; - $scope.resendApproveEmail = function (type) { - commonDialog.confirm({ - title: 'Warning', - content: 'This operation will reset the password of admin user. Are you sure this email is correct ? Or you may update this information first.' - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit/send_email?type=' + type).then(function () { - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - }) - }; - $scope.editBDUser = function () { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/bd_user_choose_dialog.html', - controller: 'partnerChooseBDUserDialogCtrl', - resolve: { - bdUsers: ['$http', function ($http) { - return $http.get('/sys/manager_accounts/roles/bd_user'); - }], - partner: function () { - return $scope.partner; - }, - type: function () { - return 'edit'; - } - } - }).result.then(function () { - $state.reload(); - }) - }; - $scope.bindBDUser = function () { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/bd_user_choose_dialog.html', - controller: 'partnerChooseBDUserDialogCtrl', - resolve: { - bdUsers: ['$http', function ($http) { - return $http.get('/sys/manager_accounts/roles/bd_user'); - }], - partner: function () { - return $scope.partner; - }, - type: function () { - return 'add'; - } - } - }).result.then(function () { - $state.reload(); - }) - }; - - $scope.configMasterMerchant = function () { - commonDialog.inputText({ title: 'Input Master Merchant Code' }).then(function (text) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/master_configuration', { master_merchant: text }).then(function () { - commonDialog.alert({ - title: 'Success', - content: "Master Merchant Code:" + text, - type: 'success' - }); - }, function (resp) { - commonDialog.alert({ - title: 'Config Master Merchant Failed', - content: resp.data.message, - type: 'error' - }); - }) + }, + ]) + app.controller('compliancePartnerCtrl', [ + '$scope', + '$sce', + '$http', + '$filter', + '$uibModal', + 'businessStructuresMap', + 'industryMap', + 'stateMap', + 'sectorMap', + 'countryMap', + function ($scope, $sce, $http, $filter, $uibModal, businessStructuresMap, industryMap, stateMap, sectorMap, countryMap) { + $scope.analysisClients = function () { + $http.get('/sys/partners/analysis').then(function (resp) { + $scope.analysis = resp.data + }) + } + if ($scope.currentUser.org_id == 1 || $scope.currentUser.org_id == null) { + $scope.analysisClients() + } + $scope.pagination = {} + $scope.industries = industryMap.configs() + $scope.states = stateMap.configs() + $scope.countries = countryMap.configs() + $scope.sectors = sectorMap.configs() + $scope.business_structures = businessStructuresMap.configs() + $scope.clean_days = angular.copy(clean_days_map) + $scope.bd_citys = angular.copy(bd_city_map) + $scope.params = { textType: 'all', org_name: 'ALL', approving_flag: false, card_approving_flag: false } + + $scope.loadPartners = function (page) { + $scope.validAndCleanApproveStatus() + var params = angular.copy($scope.params) + params.page = page || $scope.pagination.page || 1 + $http.get('/sys/partners/compliance', { params: params }).then(function (resp) { + $scope.partners = resp.data.data + $scope.pagination = resp.data.pagination + }) + } + + $scope.validAndCleanApproveStatus = function () { + if (!$scope.params.cross_approving_flag && !$scope.params.card_approving_flag) { + $scope.params.approving = false + $scope.params.card_approving = false + $scope.params.waitingCompliance = false + $scope.params.tempMchId = false + $scope.params.bd_upload_material = false + $scope.params.quickPass = false + $scope.params.greenChannel = false + $scope.params.pass = false + $scope.params.completed_contract = false + $scope.params.apply_to_back = false + $scope.params.is_valid = false + } + if (!$scope.params.cross_approving_flag && $scope.params.card_approving_flag) { + $scope.params.tempMchId = false + $scope.params.quickPass = false + $scope.params.greenChannel = false + } + } + + $scope.today = new Date() + + $scope.listBDUsers = function () { + $http.get('/sys/manager_accounts/roles/bd_user').then(function (resp) { + $scope.bdUserSource = resp.data + }) + } + $scope.listBDUsers() + + if (($scope.currentUser.role & parseInt('1000011', 2)) > 0 && !$scope.currentUser.org_id) { + $scope.showOrg = 'Organization' + $http.get('/sys/orgs/list_all_Org', { params: {} }).then(function (resp) { + $scope.orgs = resp.data + }) + } + + $scope.loadOrgs = function () { + var params = angular.copy($scope.params) + $http.get('/sys/orgs/orgChild', { params: params }).then(function (resp) { + $scope.orgs_child = resp.data + }) + } + $scope.loadOrgs() + + $scope.loadPartners(1) + + $scope.openClientBoard = function (client) { + $uibModal.open({ + templateUrl: '/static/analysis/templates/partner_card.html', + controller: 'partnerCardCtrl', + resolve: { + clientMoniker: function () { + return client.client_moniker + }, + }, + size: 'lg', + }) + } + }, + ]) + app.controller('partnerDetailCtrl', [ + '$scope', + '$http', + '$state', + '$uibModal', + '$rootScope', + 'Upload', + 'commonDialog', + 'partner', + '$sce', + function ($scope, $http, $state, $uibModal, $rootScope, Upload, commonDialog, partner, $sce) { + $scope.init = { wechat_compliance: false, local_merchant: false } + $scope.partner = partner.data + $scope.isComplianceOfCompanyName = false + $scope.isComplianceOfShortName = false + $scope.isComplianceOfBusinessStructure = false + $scope.cardPromotionaparams = {} + if ($scope.partner.mc_code) { + $scope.partner.mc_code = parseInt($scope.partner.mc_code) + } + var website = partner.data.company_website + if (website != null) { + if (website.indexOf('http') !== 0) { + $scope.partner.company_website = 'http://' + angular.copy(website) + } + } + $scope.decideCompliance = function (name) { + var keywords = ['education', 'financial', 'train', 'immigrant', 'invest', '律师咨询', '会计事务所', '移民', '留学', '娱乐', '金融', '地产', '投资'] + for (var i = 0; i < keywords.length; i++) { + if (name.indexOf(keywords[i]) !== -1) { + return true + } + } + return false + } + if (partner.data.company_name != null) { + $scope.isComplianceOfCompanyName = $scope.decideCompliance(partner.data.company_name) + } + if (partner.data.short_name != null) { + $scope.isComplianceOfShortName = $scope.decideCompliance(partner.data.short_name) + } + if (partner.data.business_structure != null) { + $scope.isComplianceOfBusinessStructure = $scope.decideCompliance(partner.data.business_structure) + } + $scope.showDBUsers = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/bd_user').then(function (resp) { + $scope.partner.client_bds = resp.data + }) + } + $scope.showDBUsers() + $scope.showFile = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/file/source_agree_file').then(function (resp) { + $scope.fileManager = resp.data + }) + } + + $scope.showCardFile = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/file/source_card_agree_file?fileName=letter_of_offer_file').then(function (resp) { + $scope.letterOfOfferFileManager = resp.data + }) + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/file/source_card_agree_file?fileName=promotional_offer_file').then(function (resp) { + $scope.promotionalOfferFileManager = resp.data + }) + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/file/source_card_agree_file?fileName=terms_and_conditions_file').then(function (resp) { + $scope.termsAndConditionsFile = resp.data + }) + } + + $scope.showFile() + $scope.showCardFile() + $scope.passClient = function () { + if (!$rootScope.complianceCheck) { + alert('please check first') + return + } + if (!$rootScope.complianceCheck.authFile) { + alert('Compliance Files not checked') + return + } + if (!$rootScope.complianceCheck.clientInfo) { + alert('Partner Detail not checked') + return + } + if (!$rootScope.complianceCheck.bankAccount) { + alert('Bank Account not checked') + return + } + var title = 'Audit Partner' + var content = 'Are you sure to mark partner ' + $scope.partner.company_name + ' audited?' + var choises = '' + var contentHtml = '' + if ($scope.isComplianceOfCompanyName || $scope.isComplianceOfShortName || $scope.isComplianceOfBusinessStructure) { + var info = [] + if ($scope.isComplianceOfCompanyName) { + info.push('Company Name') + } + if ($scope.isComplianceOfShortName) { + info.push('Short Name') + } + if ($scope.isComplianceOfBusinessStructure) { + info.push('Business Structure') + } + title = 'Warning' + contentHtml = $sce.trustAsHtml('本次提交的商户[' + $scope.partner.company_name + '],' + info.toString() + '存在微信渠道不合规信息') + choises = [ + { label: '取消', className: 'btn-danger', key: '2', dismiss: true }, + { label: '确认提交', className: 'btn-success', key: '1' }, + ] + content = '' + } + commonDialog + .confirm({ + title: title, + content: content, + choises: choises, + contentHtml: contentHtml, + }) + .then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit', { pass: 1 }).then( + function () { + if ($scope.partner.approve_result == 2 && ($scope.partner.source == 1 || $scope.partner.source == 2)) { + commonDialog.alert({ + title: 'Success', + content: 'Comply Passed!', + type: 'success', + }) + } else { + commonDialog.alert({ + title: 'Success', + content: 'Comply Passed! Email will send to contact email address soon.', + type: 'success', + }) + } + delete $rootScope.complianceCheck + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + }) + } + $scope.passCardClient = function () { + if (!$rootScope.complianceCheck) { + alert('please check first') + return + } + if (!$rootScope.complianceCheck.authFile) { + alert('Compliance Files not checked') + return + } + if (!$rootScope.complianceCheck.clientInfo) { + alert('Partner Detail not checked') + return + } + if (!$rootScope.complianceCheck.bankAccount) { + alert('Bank Account not checked') + return + } + var title = 'Audit Partner Card' + var content = 'Are you sure to mark partner ' + $scope.partner.company_name + ' audited?' + var choises = '' + var contentHtml = '' + if ($scope.isComplianceOfCompanyName || $scope.isComplianceOfShortName || $scope.isComplianceOfBusinessStructure) { + var info = [] + if ($scope.isComplianceOfCompanyName) { + info.push('Company Name') + } + if ($scope.isComplianceOfShortName) { + info.push('Short Name') + } + if ($scope.isComplianceOfBusinessStructure) { + info.push('Business Structure') + } + title = 'Warning' + contentHtml = $sce.trustAsHtml('本次提交的商户[' + $scope.partner.company_name + '],' + info.toString() + '存在微信渠道不合规信息') + choises = [ + { label: '取消', className: 'btn-danger', key: '2', dismiss: true }, + { label: '确认提交', className: 'btn-success', key: '1' }, + ] + content = '' + } + commonDialog + .confirm({ + title: title, + content: content, + choises: choises, + contentHtml: contentHtml, + }) + .then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/card_audit', { pass: 1 }).then( + function () { + if ($scope.partner.approve_result == 2 && ($scope.partner.source == 1 || $scope.partner.source == 2)) { + commonDialog.alert({ + title: 'Success', + content: 'Comply Passed!', + type: 'success', + }) + } else { + commonDialog.alert({ + title: 'Success', + content: 'Comply Passed! Email will send to contact email address soon.', + type: 'success', + }) + } + delete $rootScope.complianceCheck + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + }) + } + $scope.pass2GreenChannel = function () { + commonDialog + .confirm({ + title: 'Green Channel Audit Partner', + content: 'Are you sure to mark partner ' + $scope.partner.company_name + ' green channel audited ?', + }) + .then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/aduit/green_channel').then( + function () { + commonDialog.alert({ + title: 'Success', + content: 'Comply Passed! Email will send to contact email address soon.', + type: 'success', }) - }; - $scope.getMerchantLocation = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/location').then(function (resp) { - $scope.merchant_location = resp.data; - }); - }; - $scope.getMerchantLocation(); - - - $scope.complianceCheck = function () { - if (!$rootScope.complianceCheck) { - $rootScope.complianceCheck = {}; - } - $rootScope.complianceCheck.client_id = $scope.partner.client_id; - $rootScope.complianceCheck.clientInfo = true; - }; - $scope.complianceChangeCheck = function () { - if ($rootScope.complianceCheck) { - if ($scope.partner.client_id != $rootScope.complianceCheck.client_id) { - delete $rootScope.complianceCheck; - } - } - }; - $scope.complianceChangeCheck(); - - $scope.changeWechatCompliance = function () { - if (!$scope.partner) { - return; - } - if (!$state.is('partners.detail')) { - $scope.init.wechat_compliance = false; - return; - } - if (!$scope.init.wechat_compliance) { - $scope.init.wechat_compliance = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/wechat_compliance_permission', { allow: $scope.partner.wechat_compliance }).then(function () { - - }, function (resp) { + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + }) + } + $scope.showBg = false + $scope.exportPDF = function () { + $scope.showBg = true + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/export/agreepdf').then( + function () { + commonDialog.alert({ + title: 'Success', + content: 'Agreement File Generate Succeed! Please notify BD!', + type: 'success', + }) + $scope.showBg = false + $state.reload() + }, + function (resp) { + $scope.showBg = false + $state.reload() + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + $scope.exportAgreegatePDF = function () { + $scope.showBg = true + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/export/aggregate/agreepdf').then( + function () { + commonDialog.alert({ + title: 'Success', + content: 'Agreement File Generate Succeed! Please notify BD!', + type: 'success', + }) + $scope.showBg = false + $state.reload() + }, + function (resp) { + $scope.showBg = false + $state.reload() + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + + //制作卡支付合同 + $scope.exportCardAgreegatePDF = function () { + $scope.showBg = true + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/export/aggregate/card_agree_pdf').then( + function () { + commonDialog.alert({ + title: 'Success', + content: 'Agreement File Generate Succeed! Please notify BD!', + type: 'success', + }) + $scope.showBg = false + $state.reload() + }, + function (resp) { + $scope.showBg = false + $state.reload() + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + $scope.Export = function () { + var url = '/dev/' + $scope.partner.client_moniker + '/export/aggregate/agreepdf' + return url + } + $scope.uploadAgreeFile = function (file) { + if (file != null) { + if (file.size > 2 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error' }) + } else { + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + $scope.agree_file_import = resp.data.url + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/import/agreepdf', { source_agree_file: $scope.agree_file_import }).then( + function () { commonDialog.alert({ - title: 'failed to change wechat_compliance permission status', - content: resp.data.message, - type: 'error' + title: 'Success', + content: 'Succeed Imported! Please notify BD', + type: 'success', }) - }) - }; - $scope.changeLocalMerchant = function () { - if (!$scope.partner) { - return; - } - if (!$state.is('partners.detail')) { - $scope.init.local_merchant = false; - return; - } - if (!$scope.init.local_merchant) { - $scope.init.local_merchant = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/local_merchant_permission', { allow: $scope.partner.local_merchant }).then(function () { - - }, function (resp) { + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + }, + function (resp) { + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + } + ) + } + } + } + + $scope.uploadCardAgreeFile = function (file) { + if (file != null) { + if (file.size > 2 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error' }) + } else { + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + $scope.agree_file_import = resp.data.url + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/import/agreepdf', { source_agree_file: $scope.agree_file_import }).then( + function () { commonDialog.alert({ - title: 'failed to change local_merchant permission status', - content: resp.data.message, - type: 'error' + title: 'Success', + content: 'Succeed Imported! Please notify BD', + type: 'success', }) - }) - }; - - $scope.removeSub = function () { - $http.delete('/sys/partners/unsub/' + $scope.partner.client_moniker).then(function (resp) { - $state.reload(); - }); - }; - $scope.addSub = function () { - $http.put('/sys/partners/unsub/' + $scope.partner.client_moniker).then(function (resp) { - $state.reload(); - }); - }; - }]); - app.controller('partnerPaymentInfoCtrl', ['$scope', '$http', '$state', 'commonDialog', '$uibModal', '$sce', function ($scope, $http, $state, commonDialog, $uibModal, $sce) { - $scope.convertExtParams = []; - $scope.copyHfLink = function () { - var e = document.getElementById("cpbt"); - e.select(); - var successful = document.execCommand("Copy"); - if (successful) { - commonDialog.alert({ title: 'Success', content: '已复制到剪切板!', type: 'success' }); - } else { - commonDialog.alert({ title: 'Error', content: '您的浏览器不支持!', type: 'error' }); - } - }; - $scope.copyYeepayLink = function () { - var e = document.getElementById("cpyeepay"); - e.select(); - var successful = document.execCommand("Copy"); - if (successful) { - commonDialog.alert({ title: 'Success', content: '已复制到剪切板!', type: 'success' }); - } else { - commonDialog.alert({ title: 'Error', content: '您的浏览器不支持!', type: 'error' }); - } - }; - $scope.copyCBBankPayLink = function () { - var e = document.getElementById("cpcbbankpay"); - e.select(); - var successful = document.execCommand("Copy"); - if (successful) { - commonDialog.alert({ title: 'Success', content: '已复制到剪切板!', type: 'success' }); - } else { - commonDialog.alert({ title: 'Error', content: '您的浏览器不支持!', type: 'error' }); - } - }; - $scope.loadPartnerPaymentInfo = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker).then(function (resp) { - $scope.extParams = {}; - $scope.paymentInfo = resp.data; - $scope.extParams = $scope.paymentInfo.ext_params ? JSON.parse($scope.paymentInfo.ext_params) : null; - $scope.convertExtParams = $scope.extParamsEditFlags() - $scope.ctrl.editSubMerchant = false; - $scope.ctrl.editAliSubMerchant = false; - $scope.ctrl.editMaxOrderAmount = false; - $scope.ctrl.editOrderExpiryConfig = false; - $scope.ctrl.editRefundPwd = false; - $scope.ctrl.editRefundCreditLine = false; - }) - }; - $scope.extParamsEditFlags = function () { - var paramList = [] - if ($scope.extParams != null) { - for (var key in $scope.extParams) { - var obj = {} - if (typeof $scope.extParams[key] != 'boolean') { - obj.name = key; - obj.value = $scope.extParams[key]; - obj.type = 'string'; - obj.flag = false; - } else { - obj.name = key; - obj.value = $scope.extParams[key]; - obj.type = 'boolean' - } - paramList.push(obj) - } - } - return paramList; - }; - $scope.qrConfig = { currency: 'AUD' }; - $scope.reloadQRCode = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/qrcode', { params: $scope.qrConfig }).then(function (resp) { - $scope.qrcode = resp.data; - }); - }; - $scope.reloadQRCode(); - $scope.loadPartnerPaymentInfo(); - - $scope.showSubMerchantLogs = function () { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/client_sub_merchant_id_log.html', - controller: 'clientSubMerchantIdLogCtrl', - size: 'lg', - resolve: { - logs: ['$http', function ($http) { - return $http.get('/sys/partners/' + $scope.partner.client_moniker + '/get_sub_merchant_id_logs'); - }] - } - }).result.then(function () { - $scope.loadSubClients(); - }); - }; - - $scope.saveMaxOrderAmount = function (limit) { - if (limit != null && isNaN(limit)) { - commonDialog.alert({ title: 'Error', content: 'Your input is not a number!', type: 'error' }); - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/max_order_amount', { limit: limit }).then(function (resp) { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - }; - - $scope.saveCustomerSurchargeRate = function (cofig) { - if (cofig != null && isNaN(cofig)) { - commonDialog.alert({ title: 'Error', content: 'Your input is not a number!', type: 'error' }); - return; - } - if (!$scope.paymentInfo.rate_value) { - commonDialog.alert({ - title: 'Error', - content: 'The merchant has not pass approval process', - type: 'error' - }); - return; - } - if (cofig > 3 || cofig < parseFloat(Decimal.add($scope.paymentInfo.rate_value, 0.1).toFixed(2))) { - commonDialog.alert({ title: 'Error', content: 'Not in the valid range', type: 'error' }); - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/customer_surcharge_rate', { customer_surcharge_rate: cofig }).then(function (resp) { - $scope.loadPartnerPaymentInfo(); - $scope.ctrl.editCustomerSurchargeRate = false; - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - }; - - $scope.saveOrderExpiryConfig = function (config) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/order_expiry_config', { order_expiry_config: config }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + }, + function (resp) { + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + } + ) + } + } + } + $scope.notifyBD = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/notify/completeAgree').then( + function () { + commonDialog.alert({ + title: 'Success', + content: 'Notify BD Successed!.', + type: 'success', }) - }; - - $scope.resetRefundPwd = function (config) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/reset/refund_pwd', { new_refund_password: config }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + } + ) + } + + $scope.cardNotifyBD = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/notify/cardCompleteAgree').then( + function () { + commonDialog.alert({ + title: 'Success', + content: 'Notify BD Successed!.', + type: 'success', }) - }; - - $scope.setRefundCreditLine = function () { - if (!$scope.paymentInfo) { - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/refund_credit_line', { refund_credit_line: $scope.paymentInfo.refund_credit_line }).then(function (resp) { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + } + ) + } + + $scope.downTempPdf = function () { + return '/sys/partners/' + $scope.partner.client_moniker + '/temp/export/pdf' + } + + $scope.refuse = function () { + commonDialog.inputText({ title: 'refuse cause' }).then(function (text) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit/refuse', { refuse_remark: text }).then( + function () { + commonDialog.alert({ + title: 'Success', + content: 'Audit application has been refused.', + type: 'success', + }) + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + }) + } + + $scope.cardRefuse = function () { + commonDialog.inputText({ title: 'refuse cause' }).then(function (text) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/card_audit/refuse', { refuse_remark: text }).then( + function () { + commonDialog.alert({ + title: 'Success', + content: 'Card Audit application has been refused.', + type: 'success', + }) + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + }) + } + + $scope.deleteClient = function () { + commonDialog + .confirm({ + title: 'Delete Partner', + content: 'Are you sure to delete ' + $scope.partner.company_name + '?', + }) + .then(function () { + $http.delete('/sys/partners/' + $scope.partner.client_moniker).then( + function () { + $state.go('^') + commonDialog.alert({ title: 'Delete', content: 'Partner Already Disabled', type: 'error' }) + }, + function (resp) { commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }); - }; - - $scope.updateClientQRCodePaySurCharge = function () { - if (!$scope.paymentInfo) { - return; - } - if (!$scope.init.qrcode_surcharge) { - $scope.init.qrcode_surcharge = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/qrcode_surcharge', { qrcode_surcharge: $scope.paymentInfo.qrcode_surcharge }).then(function (resp) { - $scope.loadPartnerPaymentInfo(); - }, function () { + } + ) + }) + } + $scope.revertClient = function () { + commonDialog + .confirm({ + title: 'Revert Partner', + content: 'Are you sure to Revert ' + $scope.partner.company_name + '?', + }) + .then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/revert').then( + function () { + $state.go('^') + commonDialog.alert({ title: 'Revert', content: 'Partner Already Revert', type: 'success' }) + }, + function (resp) { commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }); - }; - $scope.updateClientCBBankPaySurCharge = function () { - if (!$scope.paymentInfo) { - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/cbbank_surcharge', { cbbank_surcharge: $scope.paymentInfo.cbbank_surcharge }).then(function () { - // $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'failed to change Customer Pay for Surcharge for Retail', - content: resp.data.message, - type: 'error' - }) + } + ) + }) + } + + $scope.commitToCompliance = function () { + commonDialog + .confirm({ + title: 'Commit to Compliance', + content: 'Are you sure to commit ' + $scope.partner.company_name + ' to compliance?', + choises: [ + { label: 'Submit', className: 'btn-success', key: 1 }, + { label: 'Cancel', className: 'btn-warning', key: 0, dismiss: true }, + ], + }) + .then(function (choice) { + if (choice == 1) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/to_compliance', {}).then( + function () { + commonDialog.alert({ + title: 'Success', + content: 'Commit to Compliance successfully', + type: 'success', + }) + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + }) + } + + $scope.commitToCardCompliance = function () { + commonDialog + .confirm({ + title: 'Commit to Compliance', + content: 'Are you sure to commit ' + $scope.partner.company_name + ' to compliance?', + choises: [ + { label: 'Submit', className: 'btn-success', key: 1 }, + { label: 'Cancel', className: 'btn-warning', key: 0, dismiss: true }, + ], + }) + .then(function (choice) { + if (choice == 1) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/to_card_compliance', {}).then( + function () { + commonDialog.alert({ + title: 'Success', + content: 'Commit to Compliance successfully', + type: 'success', + }) + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + }) + } + $scope.apply2makeAgreeFile = function () { + if (!$scope.partner.enable_cross_payment) { + commonDialog.alert({ + title: 'Error!', + content: '请完善商户跨境支付基本信息、签约费率、合规文件!', + type: 'error', + }) + $state.go('partners.edit', { + clientMoniker: $scope.partner.client_moniker, + commitCardPayment: false, + commitCrossBorderPayment: true, + }) + return + } + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/make_agree_file').then( + function () { + commonDialog.alert({ + title: 'Success!', + content: '已提交制作合同!', + type: 'success', }) + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + + $scope.apply2makeCardAgreeFile = function () { + if (!$scope.partner.enable_card_payment) { + commonDialog.alert({ + title: 'Error!', + content: '请完善商户卡支付基本信息、签约费率、合规文件!', + type: 'error', + }) + $state.go('partners.edit', { + clientMoniker: $scope.partner.client_moniker, + commitCardPayment: true, + commitCrossBorderPayment: false, + }) + return } - - $scope.updateClientApiSurCharge = function () { - if (!$scope.paymentInfo) { - return; - } - if (!$scope.init.api_surcharge) { - $scope.init.api_surcharge = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/api_surcharge', { api_surcharge: $scope.paymentInfo.api_surcharge }).then(function (resp) { - $scope.loadPartnerPaymentInfo(); - }, function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/make_card_agree_file').then( + function () { + commonDialog.alert({ + title: 'Success!', + content: '已提交制作合同!', + type: 'success', + }) + $state.reload() + }, + function (resp) { + if (String(resp.data.message).match('No Rate Config')) { + commonDialog.alert({ + title: 'Error!', + content: '商户卡支付签约费率未配置,请添加商户卡支付签约费率!', + type: 'error', + }) + $state.go('partners.detail.rates', { + clientMoniker: $scope.partner.client_moniker, + }) + } else { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + } + ) + } + + $scope.commit2GreenChannel = function () { + commonDialog + .confirm({ + title: 'Audit Partner', + content: 'Are you sure to mark partner ' + $scope.partner.company_name + ' Green Channel?', + }) + .then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/compliance/green_channel').then( + function () { + commonDialog.alert({ + title: 'Success', + content: 'Commit to Green Channel successfully', + type: 'success', + }) + $state.reload() + }, + function (resp) { commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }); - }; - $scope.updateClientRetailPaySurCharge = function () { - if (!$scope.paymentInfo) { - return; - } - if (!$scope.init.retail_surcharge) { - $scope.init.retail_surcharge = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/retail_surcharge', { retail_surcharge: $scope.paymentInfo.retail_surcharge }).then(function (resp) { - $scope.loadPartnerPaymentInfo(); - }, function () { + } + ) + }) + } + + $scope.markAuditEmail = function () { + commonDialog + .confirm({ + title: 'Warning', + content: 'Make sure you have send the email to client.', + }) + .then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit/email_sending_status').then( + function () { + $state.reload() + }, + function (resp) { commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }); - }; - $scope.ctrl = {}; - $scope.saveSubMerchantId = function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/payment_config', { sub_merchant_id: $scope.paymentInfo.sub_merchant_id }).then(function (resp) { - $scope.refreshWechatInstitutionMerchantId(); - $scope.ctrl.editSubMerchant = false; - }, function (resp) { + } + ) + }) + } + $scope.resendApproveEmail = function (type) { + commonDialog + .confirm({ + title: 'Warning', + content: 'This operation will reset the password of admin user. Are you sure this email is correct ? Or you may update this information first.', + }) + .then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit/send_email?type=' + type).then( + function () { + $state.reload() + }, + function (resp) { commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }); - }; + } + ) + }) + } + $scope.editBDUser = function () { + $uibModal + .open({ + templateUrl: '/static/payment/partner/templates/bd_user_choose_dialog.html', + controller: 'partnerChooseBDUserDialogCtrl', + resolve: { + bdUsers: [ + '$http', + function ($http) { + return $http.get('/sys/manager_accounts/roles/bd_user') + }, + ], + partner: function () { + return $scope.partner + }, + type: function () { + return 'edit' + }, + }, + }) + .result.then(function () { + $state.reload() + }) + } + $scope.bindBDUser = function () { + $uibModal + .open({ + templateUrl: '/static/payment/partner/templates/bd_user_choose_dialog.html', + controller: 'partnerChooseBDUserDialogCtrl', + resolve: { + bdUsers: [ + '$http', + function ($http) { + return $http.get('/sys/manager_accounts/roles/bd_user') + }, + ], + partner: function () { + return $scope.partner + }, + type: function () { + return 'add' + }, + }, + }) + .result.then(function () { + $state.reload() + }) + } + + $scope.configMasterMerchant = function () { + commonDialog.inputText({ title: 'Input Master Merchant Code' }).then(function (text) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/master_configuration', { master_merchant: text }).then( + function () { + commonDialog.alert({ + title: 'Success', + content: 'Master Merchant Code:' + text, + type: 'success', + }) + }, + function (resp) { + commonDialog.alert({ + title: 'Config Master Merchant Failed', + content: resp.data.message, + type: 'error', + }) + } + ) + }) + } + $scope.getMerchantLocation = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/location').then(function (resp) { + $scope.merchant_location = resp.data + }) + } + $scope.getMerchantLocation() + + $scope.complianceCheck = function () { + if (!$rootScope.complianceCheck) { + $rootScope.complianceCheck = {} + } + $rootScope.complianceCheck.client_id = $scope.partner.client_id + $rootScope.complianceCheck.clientInfo = true + } + $scope.complianceChangeCheck = function () { + if ($rootScope.complianceCheck) { + if ($scope.partner.client_id != $rootScope.complianceCheck.client_id) { + delete $rootScope.complianceCheck + } + } + } + $scope.complianceChangeCheck() - $scope.refreshWechatInstitutionMerchantId = function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/wechat_institution_merchant_id', { wechat_institution_merchant_id: $scope.paymentInfo.wechat_institution_merchant_id }).then(function (resp) { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }); - }; - $scope.saveAliSubMerchantId = function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/ali_sub_merchant_id', { ali_sub_merchant_id: $scope.paymentInfo.ali_sub_merchant_id }).then(function (resp) { - commonDialog.alert({ - title: 'Success', - content: 'Modify Ali Sub Merchant ID successfully', - type: 'success' - }); - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }); - }; - $scope.submitAlipaySubId = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/alipay_gms_json').then(function (resp) { - $scope.alipay_gms_json = resp.data; - commonDialog.confirm({ - title: 'Warning', - content: '是否使用该商户的现有信息进件?', - json: $scope.alipay_gms_json - }).then(function () { - $http.post('/sys/partners/' + $scope.partner.client_moniker + '/register/alipay_gms').then(function () { - commonDialog.alert({ title: 'Success', content: 'Alipay进件成功', type: 'success' }); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: "进件失败:" + resp.data.message, type: 'error' }); - }) - }); - }) - }; - $scope.queryAlipayGms = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/alipay_gms').then(function (resp) { - commonDialog.alert({ title: 'Success', content: resp.data.result_status, type: 'success' }); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: "查询失败:" + resp.data.message, type: 'error' }); - }) - }; - $scope.submitAlipayOnlineSubId = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/alipayOnline_gms_json').then(function (resp) { - $scope.alipayOnline_gms_json = resp.data; - commonDialog.confirm({ - title: 'Warning', - content: '是否使用该商户的现有信息进件?', - json: $scope.alipayOnline_gms_json - }).then(function () { - $http.post('/sys/partners/' + $scope.partner.client_moniker + '/register/alipayOnline_gms').then(function () { - commonDialog.alert({ title: 'Success', content: '提示:AlipayOnline进件成功', type: 'success' }); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: "进件失败:" + resp.data.message, type: 'error' }); - }); - }) - }); - }; - $scope.queryAlipayOnlineGms = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/alipayOnline_gms').then(function (resp) { - commonDialog.alert({ title: 'Success', content: resp.data.result_status, type: 'success' }); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: "查询失败:" + resp.data.message, type: 'error' }); - }) + $scope.changeWechatCompliance = function () { + if (!$scope.partner) { + return } - $scope.refreshCredential = function () { - commonDialog.confirm({ - title: 'Warning', - content: 'Refresh Credential will expire the current one, which will cause the current payment service disabled. Are you sure going on?' - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/credential_code').then(function () { - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }) + if (!$state.is('partners.detail')) { + $scope.init.wechat_compliance = false + return + } + if (!$scope.init.wechat_compliance) { + $scope.init.wechat_compliance = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/wechat_compliance_permission', { allow: $scope.partner.wechat_compliance }).then( + function () {}, + function (resp) { + commonDialog.alert({ + title: 'failed to change wechat_compliance permission status', + content: resp.data.message, + type: 'error', }) - }; - $scope.init = { - jsapi: false, - gateway: false, - offline: false, - refund: false, - common_sub_merchant_id: false, - channel: {}, - gateway_alipay_online: false, - hf_Link: false, - enable_hf_email_notice: false, - enable_yeepay_link: false, - enable_yeepay_email_notice: false - }; - $scope.switchCommonSubMerchantId = function () { - if (!$scope.paymentInfo) { - return; - } - if (!$scope.init.common_sub_merchant_id) { - $scope.init.common_sub_merchant_id = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/common_sub_merchant_id', { allow: $scope.paymentInfo.common_sub_merchant_id }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'Failed to change common_sub_merchant_id permission status', - content: resp.data.message, - type: 'error' - }) + } + ) + } + $scope.changeLocalMerchant = function () { + if (!$scope.partner) { + return + } + if (!$state.is('partners.detail')) { + $scope.init.local_merchant = false + return + } + if (!$scope.init.local_merchant) { + $scope.init.local_merchant = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/local_merchant_permission', { allow: $scope.partner.local_merchant }).then( + function () {}, + function (resp) { + commonDialog.alert({ + title: 'failed to change local_merchant permission status', + content: resp.data.message, + type: 'error', }) - }; - - $scope.switchSubManage = function () { - if (!$scope.paymentInfo) { - return; - } - if (!$scope.init.sub_manage) { - $scope.init.sub_manage = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/sub_manage', { allow: $scope.paymentInfo.sub_manage }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'Failed to change Sub Partners Manage status', - content: resp.data.message, - type: 'error' - }) - }) - }; - - var info = []; - $scope.decideCompliance = function (name) { - var keywords = ['education', 'financial', 'train', 'immigrant', 'invest', - '律师咨询', '会计事务所', '移民', '留学', '娱乐', '金融', '地产', '投资']; - for (var i = 0; i < keywords.length; i++) { - if (name.indexOf(keywords[i]) != -1) { - return true; - } - } - return false; - }; - $scope.getComplianceInfo = function () { - if ($scope.paymentInfo.company_name != null) { - if ($scope.decideCompliance($scope.paymentInfo.company_name)) { - info.push('Company Name'); - } - } - if ($scope.paymentInfo.short_name != null) { - if ($scope.decideCompliance($scope.paymentInfo.short_name)) { - info.push('Short Name'); - } - } - if ($scope.paymentInfo.business_structure != null) { - if ($scope.decideCompliance($scope.paymentInfo.business_structure)) { - info.push('Business Structure'); - } - } - }; - $scope.toggleChannel = function (channel) { - if (!channel) { - return; - } - if (!$scope.paymentInfo) { - return; - } - if (!$scope.init.channel[channel]) { - $scope.init.channel[channel] = true; - return; - } - $scope.getComplianceInfo(); - if ($scope.paymentInfo['enable_wechat'] && channel == 'wechat' - && $scope.paymentInfo.open_status == 5 && info.length > 0) { - commonDialog.confirm({ - title: "Warning", - contentHtml: $sce.trustAsHtml('本次提交的商户[' + $scope.partner.company_name + '],' + info.toString() + '存在微信渠道不合规信息') - }).then(function () { - $scope.saveChannel(channel); - }) + } + ) + } + + $scope.removeSub = function () { + $http.delete('/sys/partners/unsub/' + $scope.partner.client_moniker).then(function (resp) { + $state.reload() + }) + } + $scope.addSub = function () { + $http.put('/sys/partners/unsub/' + $scope.partner.client_moniker).then(function (resp) { + $state.reload() + }) + } + }, + ]) + app.controller('partnerPaymentInfoCtrl', [ + '$scope', + '$http', + '$state', + 'commonDialog', + '$uibModal', + '$sce', + function ($scope, $http, $state, commonDialog, $uibModal, $sce) { + $scope.convertExtParams = [] + $scope.copyHfLink = function () { + var e = document.getElementById('cpbt') + e.select() + var successful = document.execCommand('Copy') + if (successful) { + commonDialog.alert({ title: 'Success', content: '已复制到剪切板!', type: 'success' }) + } else { + commonDialog.alert({ title: 'Error', content: '您的浏览器不支持!', type: 'error' }) + } + } + $scope.copyYeepayLink = function () { + var e = document.getElementById('cpyeepay') + e.select() + var successful = document.execCommand('Copy') + if (successful) { + commonDialog.alert({ title: 'Success', content: '已复制到剪切板!', type: 'success' }) + } else { + commonDialog.alert({ title: 'Error', content: '您的浏览器不支持!', type: 'error' }) + } + } + $scope.copyCBBankPayLink = function () { + var e = document.getElementById('cpcbbankpay') + e.select() + var successful = document.execCommand('Copy') + if (successful) { + commonDialog.alert({ title: 'Success', content: '已复制到剪切板!', type: 'success' }) + } else { + commonDialog.alert({ title: 'Error', content: '您的浏览器不支持!', type: 'error' }) + } + } + $scope.loadPartnerPaymentInfo = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker).then(function (resp) { + $scope.extParams = {} + $scope.paymentInfo = resp.data + $scope.extParams = $scope.paymentInfo.ext_params ? JSON.parse($scope.paymentInfo.ext_params) : null + $scope.convertExtParams = $scope.extParamsEditFlags() + $scope.ctrl.editSubMerchant = false + $scope.ctrl.editAliSubMerchant = false + $scope.ctrl.editMaxOrderAmount = false + $scope.ctrl.editOrderExpiryConfig = false + $scope.ctrl.editRefundPwd = false + $scope.ctrl.editRefundCreditLine = false + }) + } + $scope.extParamsEditFlags = function () { + var paramList = [] + if ($scope.extParams != null) { + for (var key in $scope.extParams) { + var obj = {} + if (typeof $scope.extParams[key] != 'boolean') { + obj.name = key + obj.value = $scope.extParams[key] + obj.type = 'string' + obj.flag = false } else { - $scope.saveChannel(channel); + obj.name = key + obj.value = $scope.extParams[key] + obj.type = 'boolean' } - info = []; - }; - $scope.saveChannel = function (channel) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/channels/' + channel + '/permission', { allow: $scope.paymentInfo['enable_' + channel] }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'Failed to change ' + channel + ' channel permission status', - content: resp.data.message, - type: 'error' - }) - }) + paramList.push(obj) + } } - $scope.toggleHfLink = function (channel) { - if (!channel) { - return; - } - if (!$scope.paymentInfo) { - return; - } - if (!$scope.init.hf_Link) { - $scope.init.hf_Link = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/hf', { allow: $scope.paymentInfo.enable_link }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'Failed to change enable_link permission status', - content: resp.data.message, - type: 'error' - }); + return paramList + } + $scope.qrConfig = { currency: 'AUD' } + $scope.reloadQRCode = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/qrcode', { params: $scope.qrConfig }).then(function (resp) { + $scope.qrcode = resp.data + }) + } + $scope.reloadQRCode() + $scope.loadPartnerPaymentInfo() + + $scope.showSubMerchantLogs = function () { + $uibModal + .open({ + templateUrl: '/static/payment/partner/templates/client_sub_merchant_id_log.html', + controller: 'clientSubMerchantIdLogCtrl', + size: 'lg', + resolve: { + logs: [ + '$http', + function ($http) { + return $http.get('/sys/partners/' + $scope.partner.client_moniker + '/get_sub_merchant_id_logs') + }, + ], + }, + }) + .result.then(function () { + $scope.loadSubClients() + }) + } + + $scope.saveMaxOrderAmount = function (limit) { + if (limit != null && isNaN(limit)) { + commonDialog.alert({ title: 'Error', content: 'Your input is not a number!', type: 'error' }) + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/max_order_amount', { limit: limit }).then( + function (resp) { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + + $scope.saveCustomerSurchargeRate = function (cofig) { + if (cofig != null && isNaN(cofig)) { + commonDialog.alert({ title: 'Error', content: 'Your input is not a number!', type: 'error' }) + return + } + if (!$scope.paymentInfo.rate_value) { + commonDialog.alert({ + title: 'Error', + content: 'The merchant has not pass approval process', + type: 'error', + }) + return + } + if (cofig > 3 || cofig < parseFloat(Decimal.add($scope.paymentInfo.rate_value, 0.1).toFixed(2))) { + commonDialog.alert({ title: 'Error', content: 'Not in the valid range', type: 'error' }) + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/customer_surcharge_rate', { customer_surcharge_rate: cofig }).then( + function (resp) { + $scope.loadPartnerPaymentInfo() + $scope.ctrl.editCustomerSurchargeRate = false + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + + $scope.saveOrderExpiryConfig = function (config) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/order_expiry_config', { order_expiry_config: config }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + + $scope.resetRefundPwd = function (config) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/reset/refund_pwd', { new_refund_password: config }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + + $scope.setRefundCreditLine = function () { + if (!$scope.paymentInfo) { + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/refund_credit_line', { refund_credit_line: $scope.paymentInfo.refund_credit_line }).then( + function (resp) { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + + $scope.updateClientQRCodePaySurCharge = function () { + if (!$scope.paymentInfo) { + return + } + if (!$scope.init.qrcode_surcharge) { + $scope.init.qrcode_surcharge = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/qrcode_surcharge', { qrcode_surcharge: $scope.paymentInfo.qrcode_surcharge }).then( + function (resp) { + $scope.loadPartnerPaymentInfo() + }, + function () { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + $scope.updateClientCBBankPaySurCharge = function () { + if (!$scope.paymentInfo) { + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/cbbank_surcharge', { cbbank_surcharge: $scope.paymentInfo.cbbank_surcharge }).then( + function () { + // $scope.loadPartnerPaymentInfo(); + }, + function (resp) { + commonDialog.alert({ + title: 'failed to change Customer Pay for Surcharge for Retail', + content: resp.data.message, + type: 'error', }) - }; + } + ) + } - $scope.toggleGatewayLink = function (channel) { - if (!channel) { - return; - } - if (!$scope.paymentInfo) { - return; - } - var channelLink = 'enable_' + channel + '_link'; - if (!$scope.init[channelLink]) { - $scope.init[channelLink] = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/' + channel, { allow: $scope.paymentInfo[channelLink] }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'Failed to change ' + channelLink + ' permission status', - content: resp.data.message, - type: 'error' - }); + $scope.updateClientApiSurCharge = function () { + if (!$scope.paymentInfo) { + return + } + if (!$scope.init.api_surcharge) { + $scope.init.api_surcharge = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/api_surcharge', { api_surcharge: $scope.paymentInfo.api_surcharge }).then( + function (resp) { + $scope.loadPartnerPaymentInfo() + }, + function () { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + $scope.updateClientRetailPaySurCharge = function () { + if (!$scope.paymentInfo) { + return + } + if (!$scope.init.retail_surcharge) { + $scope.init.retail_surcharge = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/retail_surcharge', { retail_surcharge: $scope.paymentInfo.retail_surcharge }).then( + function (resp) { + $scope.loadPartnerPaymentInfo() + }, + function () { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + $scope.ctrl = {} + $scope.saveSubMerchantId = function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/payment_config', { sub_merchant_id: $scope.paymentInfo.sub_merchant_id }).then( + function (resp) { + $scope.refreshWechatInstitutionMerchantId() + $scope.ctrl.editSubMerchant = false + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + + $scope.refreshWechatInstitutionMerchantId = function () { + $http + .put('/sys/partners/' + $scope.partner.client_moniker + '/wechat_institution_merchant_id', { + wechat_institution_merchant_id: $scope.paymentInfo.wechat_institution_merchant_id, + }) + .then( + function (resp) { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + $scope.saveAliSubMerchantId = function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/ali_sub_merchant_id', { ali_sub_merchant_id: $scope.paymentInfo.ali_sub_merchant_id }).then( + function (resp) { + commonDialog.alert({ + title: 'Success', + content: 'Modify Ali Sub Merchant ID successfully', + type: 'success', }) - }; - - $scope.toggleCBBankPayLink = function () { - if (!$scope.paymentInfo) { - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/cb_bankpay', { allow: $scope.paymentInfo.enable_cb_bankpay_link }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'Failed to change cb_bankpay permission status', - content: resp.data.message, - type: 'error' - }); + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + $scope.submitAlipaySubId = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/alipay_gms_json').then(function (resp) { + $scope.alipay_gms_json = resp.data + commonDialog + .confirm({ + title: 'Warning', + content: '是否使用该商户的现有信息进件?', + json: $scope.alipay_gms_json, }) - }; - $scope.cb_bankpay = []; - $scope.cbChannelConfig = function () { - $http.get('/sysconfig/payment/config').then(function (resp) { - resp.data.forEach(function (channel) { - if (channel.type === 1) { - $scope.cb_bankpay.push(channel); - } - }) + .then(function () { + $http.post('/sys/partners/' + $scope.partner.client_moniker + '/register/alipay_gms').then( + function () { + commonDialog.alert({ title: 'Success', content: 'Alipay进件成功', type: 'success' }) + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: '进件失败:' + resp.data.message, type: 'error' }) + } + ) }) - }; - $scope.cbChannelConfig(); - $scope.updateCBBankPayConfig = function (key, channel) { - var content = ""; - if (channel == null) { - content = "你确定要将支付通道跟随系统" - } else { - content = '你确定要将支付通道更改为:' + channel - } - commonDialog.confirm({ - title: 'Confirm', - content: content - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/cb_bankpay/' + key + '/channel_id', { channel_id: channel }).then(function (resp) { - commonDialog.alert({ type: 'success', title: 'Success', content: '修改成功' }); - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ type: 'error', title: 'Error', content: resp.data.message }); - $scope.loadPartnerPaymentInfo(); - }); + }) + } + $scope.queryAlipayGms = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/alipay_gms').then( + function (resp) { + commonDialog.alert({ title: 'Success', content: resp.data.result_status, type: 'success' }) + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: '查询失败:' + resp.data.message, type: 'error' }) + } + ) + } + $scope.submitAlipayOnlineSubId = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/alipayOnline_gms_json').then(function (resp) { + $scope.alipayOnline_gms_json = resp.data + commonDialog + .confirm({ + title: 'Warning', + content: '是否使用该商户的现有信息进件?', + json: $scope.alipayOnline_gms_json, }) - }; - $scope.toggleGatewayEmailNotice = function (channel) { - if (!$scope.paymentInfo) { - return; - } - var channelNotice = 'enable_' + channel + '_email_notice'; - if (!$scope.init[channelNotice]) { - $scope.init[channelNotice] = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/' + channel + '/email_notice', { allow: $scope.paymentInfo[channelNotice] }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'Failed to change ' + channelNotice + ' permission status', - content: resp.data.message, - type: 'error' - }); + .then(function () { + $http.post('/sys/partners/' + $scope.partner.client_moniker + '/register/alipayOnline_gms').then( + function () { + commonDialog.alert({ title: 'Success', content: '提示:AlipayOnline进件成功', type: 'success' }) + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: '进件失败:' + resp.data.message, type: 'error' }) + } + ) }) - }; - - $scope.toggleHfEmailNotice = function () { - if (!$scope.paymentInfo) { - return; - } - if (!$scope.init.enable_hf_email_notice) { - $scope.init.enable_hf_email_notice = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/hf/email_notice', { allow: $scope.paymentInfo.enable_hf_email_notice }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'Failed to change enable_hf_email_notice permission status', - content: resp.data.message, - type: 'error' - }); + }) + } + $scope.queryAlipayOnlineGms = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/alipayOnline_gms').then( + function (resp) { + commonDialog.alert({ title: 'Success', content: resp.data.result_status, type: 'success' }) + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: '查询失败:' + resp.data.message, type: 'error' }) + } + ) + } + $scope.refreshCredential = function () { + commonDialog + .confirm({ + title: 'Warning', + content: 'Refresh Credential will expire the current one, which will cause the current payment service disabled. Are you sure going on?', + }) + .then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/credential_code').then( + function () { + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + }) + } + $scope.init = { + jsapi: false, + gateway: false, + offline: false, + refund: false, + common_sub_merchant_id: false, + channel: {}, + gateway_alipay_online: false, + hf_Link: false, + enable_hf_email_notice: false, + enable_yeepay_link: false, + enable_yeepay_email_notice: false, + } + $scope.switchCommonSubMerchantId = function () { + if (!$scope.paymentInfo) { + return + } + if (!$scope.init.common_sub_merchant_id) { + $scope.init.common_sub_merchant_id = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/common_sub_merchant_id', { allow: $scope.paymentInfo.common_sub_merchant_id }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'Failed to change common_sub_merchant_id permission status', + content: resp.data.message, + type: 'error', }) - }; + } + ) + } - $scope.toggleJsApi = function () { - if (!$scope.paymentInfo) { - return; - } - if (!$scope.init.jsapi) { - $scope.init.jsapi = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/jsapi_permission', { allow: $scope.paymentInfo.enable_jsapi }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'Failed to change JSApi permission status', - content: resp.data.message, - type: 'error' - }) - }) - }; - $scope.toggleGateway = function () { - if (!$scope.paymentInfo) { - return; - } - if (!$scope.init.gateway) { - $scope.init.gateway = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/gateway_permission', { allow: $scope.paymentInfo.enable_gateway }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'failed to change Gateway permission status', - content: resp.data.message, - type: 'error' - }) - }) - }; - $scope.toggleGatewayUpgrade = function () { - if (!$scope.paymentInfo) { - return; - } - if (!$scope.init.gateway_upgrade) { - $scope.init.gateway_upgrade = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/gateway_upgrade', { gateway_upgrade: $scope.paymentInfo.gateway_upgrade }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'failed to change Gateway Upgrade status', - content: resp.data.message, - type: 'error' - }) + $scope.switchSubManage = function () { + if (!$scope.paymentInfo) { + return + } + if (!$scope.init.sub_manage) { + $scope.init.sub_manage = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/sub_manage', { allow: $scope.paymentInfo.sub_manage }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'Failed to change Sub Partners Manage status', + content: resp.data.message, + type: 'error', }) - }; - $scope.toggleGatewayAlipayOnline = function () { - if (!$scope.paymentInfo) { - return; - } - if (!$scope.init.gateway_alipay_online) { - $scope.init.gateway_alipay_online = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/gateway_alipay_online', { gateway_alipay_online: $scope.paymentInfo.gateway_alipay_online }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'failed to change Gateway Alipay Online status', - content: resp.data.message, - type: 'error' - }) + } + ) + } + + var info = [] + $scope.decideCompliance = function (name) { + var keywords = ['education', 'financial', 'train', 'immigrant', 'invest', '律师咨询', '会计事务所', '移民', '留学', '娱乐', '金融', '地产', '投资'] + for (var i = 0; i < keywords.length; i++) { + if (name.indexOf(keywords[i]) != -1) { + return true + } + } + return false + } + $scope.getComplianceInfo = function () { + if ($scope.paymentInfo.company_name != null) { + if ($scope.decideCompliance($scope.paymentInfo.company_name)) { + info.push('Company Name') + } + } + if ($scope.paymentInfo.short_name != null) { + if ($scope.decideCompliance($scope.paymentInfo.short_name)) { + info.push('Short Name') + } + } + if ($scope.paymentInfo.business_structure != null) { + if ($scope.decideCompliance($scope.paymentInfo.business_structure)) { + info.push('Business Structure') + } + } + } + $scope.toggleChannel = function (channel) { + if (!channel) { + return + } + if (!$scope.paymentInfo) { + return + } + if (!$scope.init.channel[channel]) { + $scope.init.channel[channel] = true + return + } + $scope.getComplianceInfo() + if ($scope.paymentInfo['enable_wechat'] && channel == 'wechat' && $scope.paymentInfo.open_status == 5 && info.length > 0) { + commonDialog + .confirm({ + title: 'Warning', + contentHtml: $sce.trustAsHtml('本次提交的商户[' + $scope.partner.company_name + '],' + info.toString() + '存在微信渠道不合规信息'), }) - }; - $scope.toggleRefund = function () { - if (!$scope.paymentInfo) { - return; - } - if (!$scope.init.enable_refund) { - $scope.init.enable_refund = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/refund_permission', { allow: $scope.paymentInfo.enable_refund }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'failed to change Refund permission status', - content: resp.data.message, - type: 'error' - }) + .then(function () { + $scope.saveChannel(channel) }) - }; - $scope.togglePreRefund = function () { - if (!$scope.paymentInfo) { - return; - } - if (!$scope.init.enable_pre_refund) { - $scope.init.enable_pre_refund = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/pre_refund_permission', { allow: $scope.paymentInfo.enable_pre_refund }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'failed to change Refund permission status', - content: resp.data.message, - type: 'error' - }) + } else { + $scope.saveChannel(channel) + } + info = [] + } + $scope.saveChannel = function (channel) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/channels/' + channel + '/permission', { allow: $scope.paymentInfo['enable_' + channel] }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'Failed to change ' + channel + ' channel permission status', + content: resp.data.message, + type: 'error', }) - }; - $scope.toggleOffline = function () { - if (!$scope.paymentInfo) { - return; - } - if (!$scope.init.offline) { - $scope.init.offline = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/offline_permission', { allow: $scope.paymentInfo.enable_retail }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'failed to change Offline permission status', - content: resp.data.message, - type: 'error' - }) + } + ) + } + $scope.toggleHfLink = function (channel) { + if (!channel) { + return + } + if (!$scope.paymentInfo) { + return + } + if (!$scope.init.hf_Link) { + $scope.init.hf_Link = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/hf', { allow: $scope.paymentInfo.enable_link }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'Failed to change enable_link permission status', + content: resp.data.message, + type: 'error', }) - }; + } + ) + } - $scope.switchInternationalCard = function () { - if (!$scope.paymentInfo) { - return; - } - if (!$scope.init.enable_International_card) { - $scope.init.enable_International_card = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/payment_card_permission', { - key: 'enable_international_card', - allow: $scope.paymentInfo.enable_international_card - }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'failed to change international card permission status', - content: resp.data.message, - type: 'error' - }) + $scope.toggleGatewayLink = function (channel) { + if (!channel) { + return + } + if (!$scope.paymentInfo) { + return + } + var channelLink = 'enable_' + channel + '_link' + if (!$scope.init[channelLink]) { + $scope.init[channelLink] = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/' + channel, { allow: $scope.paymentInfo[channelLink] }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'Failed to change ' + channelLink + ' permission status', + content: resp.data.message, + type: 'error', }) - }; + } + ) + } - $scope.switchThreeDS = function () { - if (!$scope.paymentInfo) { - return; - } - if (!$scope.init.enable_threeds) { - $scope.init.enable_threeds = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/payment_card_permission', { - allow: $scope.paymentInfo.enable_threeds, - 'key': 'enable_threeds' - }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'failed to change international card permission status', - content: resp.data.message, - type: 'error' - }) + $scope.toggleCBBankPayLink = function () { + if (!$scope.paymentInfo) { + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/cb_bankpay', { allow: $scope.paymentInfo.enable_cb_bankpay_link }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'Failed to change cb_bankpay permission status', + content: resp.data.message, + type: 'error', }) - }; - - $scope.changePaymentPage = function () { - if (!$scope.paymentInfo) { - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/payment_page_version', { paypad_version: $scope.paymentInfo.paypad_version }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'failed to change Payment Page Version', - content: resp.data.message, - type: 'error' - }) + } + ) + } + $scope.cb_bankpay = [] + $scope.cbChannelConfig = function () { + $http.get('/sysconfig/payment/config').then(function (resp) { + resp.data.forEach(function (channel) { + if (channel.type === 1) { + $scope.cb_bankpay.push(channel) + } + }) + }) + } + $scope.cbChannelConfig() + $scope.updateCBBankPayConfig = function (key, channel) { + var content = '' + if (channel == null) { + content = '你确定要将支付通道跟随系统' + } else { + content = '你确定要将支付通道更改为:' + channel + } + commonDialog + .confirm({ + title: 'Confirm', + content: content, + }) + .then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/cb_bankpay/' + key + '/channel_id', { channel_id: channel }).then( + function (resp) { + commonDialog.alert({ type: 'success', title: 'Success', content: '修改成功' }) + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ type: 'error', title: 'Error', content: resp.data.message }) + $scope.loadPartnerPaymentInfo() + } + ) + }) + } + $scope.toggleGatewayEmailNotice = function (channel) { + if (!$scope.paymentInfo) { + return + } + var channelNotice = 'enable_' + channel + '_email_notice' + if (!$scope.init[channelNotice]) { + $scope.init[channelNotice] = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/' + channel + '/email_notice', { allow: $scope.paymentInfo[channelNotice] }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'Failed to change ' + channelNotice + ' permission status', + content: resp.data.message, + type: 'error', }) - }; + } + ) + } - $scope.changeCBBankPaymentPage = function () { - if (!$scope.paymentInfo) { - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/cbbank_payment_page_version', { cbbank_paypad_version: $scope.paymentInfo.cbbank_paypad_version }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'failed to change CBBank Payment Page Version', - content: resp.data.message, - type: 'error' - }) + $scope.toggleHfEmailNotice = function () { + if (!$scope.paymentInfo) { + return + } + if (!$scope.init.enable_hf_email_notice) { + $scope.init.enable_hf_email_notice = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/hf/email_notice', { allow: $scope.paymentInfo.enable_hf_email_notice }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'Failed to change enable_hf_email_notice permission status', + content: resp.data.message, + type: 'error', }) - }; + } + ) + } - - // 更改支付成功页 - $scope.changePaySuccessPage = function () { - if (!$scope.paymentInfo) { - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/paysuccess_version', { paysuccess_version: $scope.paymentInfo.paysuccess_version }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'failed to change Payment Success Page Version', - content: resp.data.message, - type: 'error' - }) + $scope.toggleJsApi = function () { + if (!$scope.paymentInfo) { + return + } + if (!$scope.init.jsapi) { + $scope.init.jsapi = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/jsapi_permission', { allow: $scope.paymentInfo.enable_jsapi }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'Failed to change JSApi permission status', + content: resp.data.message, + type: 'error', }) - }; - - $scope.toggleRequireCustInfo = function () { - if (!$scope.paymentInfo) { - return; - } - if (!$scope.init.require_custinfo) { - $scope.init.require_custinfo = true; - return; - } - $http.post('/sys/partners/' + $scope.partner.client_moniker + '/requireCustinfo', { allow: $scope.paymentInfo.require_custinfo }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'failed to change require customer Info permission status', - content: resp.data.message, - type: 'error' - }) + } + ) + } + $scope.toggleGateway = function () { + if (!$scope.paymentInfo) { + return + } + if (!$scope.init.gateway) { + $scope.init.gateway = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/gateway_permission', { allow: $scope.paymentInfo.enable_gateway }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'failed to change Gateway permission status', + content: resp.data.message, + type: 'error', }) - }; - - $scope.toggleRequireRemark = function () { - if (!$scope.paymentInfo) { - return; - } - if (!$scope.init.require_remark) { - $scope.init.require_remark = true; - return; - } - $http.post('/sys/partners/' + $scope.partner.client_moniker + '/requireRemark', { allow: $scope.paymentInfo.require_remark }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'failed to change require remark permission status', - content: resp.data.message, - type: 'error' - }) + } + ) + } + $scope.toggleGatewayUpgrade = function () { + if (!$scope.paymentInfo) { + return + } + if (!$scope.init.gateway_upgrade) { + $scope.init.gateway_upgrade = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/gateway_upgrade', { gateway_upgrade: $scope.paymentInfo.gateway_upgrade }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'failed to change Gateway Upgrade status', + content: resp.data.message, + type: 'error', }) - }; - - $scope.changeBillCodeVersion = function () { - if (!$scope.paymentInfo) { - return; - } - $http.post('/sys/partners/' + $scope.partner.client_moniker + '/selectBillVersion', { version: $scope.paymentInfo.billcode_version }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'failed to change require bill version permission status', - content: resp.data.message, - type: 'error' - }) + } + ) + } + $scope.toggleGatewayAlipayOnline = function () { + if (!$scope.paymentInfo) { + return + } + if (!$scope.init.gateway_alipay_online) { + $scope.init.gateway_alipay_online = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/gateway_alipay_online', { gateway_alipay_online: $scope.paymentInfo.gateway_alipay_online }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'failed to change Gateway Alipay Online status', + content: resp.data.message, + type: 'error', }) - }; - - $scope.extChangeParam = function (name, value) { - var flag = true; - $scope.convertExtParams.forEach(function (params) { - if (params.name == name && value == '' && params.type == 'string') { - flag = false; - } + } + ) + } + $scope.toggleRefund = function () { + if (!$scope.paymentInfo) { + return + } + if (!$scope.init.enable_refund) { + $scope.init.enable_refund = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/refund_permission', { allow: $scope.paymentInfo.enable_refund }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'failed to change Refund permission status', + content: resp.data.message, + type: 'error', }) - if (flag) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/ext_config', { - key: name, - value: value - }).then(function () { - $scope.loadPartnerPaymentInfo(); - }) - } - + } + ) + } + $scope.togglePreRefund = function () { + if (!$scope.paymentInfo) { + return } - - $scope.queryWechatSubMerchantIdStatus = function () { - $scope.paymentInfo.sub_merchant_id - $http.get('/sys/partners/' + $scope.paymentInfo.client_moniker + '/get_merchant_ids/' + $scope.paymentInfo.sub_merchant_id + '/status').then(function (resp) { - commonDialog.alert({ - title: 'Wechat Apply Status(' + resp.data.apply_status + ")", - content: resp.data.response_str, - type: 'info' - }) + if (!$scope.init.enable_pre_refund) { + $scope.init.enable_pre_refund = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/pre_refund_permission', { allow: $scope.paymentInfo.enable_pre_refund }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'failed to change Refund permission status', + content: resp.data.message, + type: 'error', }) + } + ) + } + $scope.toggleOffline = function () { + if (!$scope.paymentInfo) { + return } - - }]); - app.controller('clientSubMerchantIdLogCtrl', ['$scope', '$http', 'logs', function ($scope, $http, logs) { - $scope.logs = logs.data; - }]); - app.controller('partnerSubCtrl', ['$scope', '$http', '$uibModal', function ($scope, $http, $uibModal) { - $scope.toShow = false; - $scope.init = { - child_each_refund: false, - sub_manage: false - }; - - $scope.newSubClient = function () { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/add_sub_partner_dialog.html', - controller: 'partnerNewSubPartnerDialogCtrl', - size: 'lg', - resolve: { - clientMoniker: function () { - return $scope.partner.client_moniker; - } - } - }).result.then(function () { - $scope.loadSubClients(1); - }); - }; - - $scope.loadSubClients = function (page) { - var params = {}; - params.page = page || $scope.pagination.page || 1; - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/sub_clients/page', { params: params }).then(function (resp) { - $scope.subPartners = resp.data.data; - $scope.pagination = resp.data.pagination; - }); - }; - - $scope.loadSubClients(1); - - $scope.loadPartnerPaymentInfo = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker).then(function (resp) { - $scope.paymentInfo = resp.data; - + if (!$scope.init.offline) { + $scope.init.offline = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/offline_permission', { allow: $scope.paymentInfo.enable_retail }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'failed to change Offline permission status', + content: resp.data.message, + type: 'error', }) - }; - $scope.loadPartnerPaymentInfo(); + } + ) + } - $scope.switchSubManage = function () { - if (!$scope.paymentInfo) { - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/sub_manage', { allow: $scope.partner.sub_manage }).then(function () { - //$scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'Failed to change Sub Partners Manage status', - content: resp.data.message, - type: 'error' - }) + $scope.switchInternationalCard = function () { + if (!$scope.paymentInfo) { + return + } + if (!$scope.init.enable_International_card) { + $scope.init.enable_International_card = true + return + } + $http + .put('/sys/partners/' + $scope.partner.client_moniker + '/payment_card_permission', { + key: 'enable_international_card', + allow: $scope.paymentInfo.enable_international_card, + }) + .then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'failed to change international card permission status', + content: resp.data.message, + type: 'error', + }) + } + ) + } + + $scope.switchThreeDS = function () { + if (!$scope.paymentInfo) { + return + } + if (!$scope.init.enable_threeds) { + $scope.init.enable_threeds = true + return + } + $http + .put('/sys/partners/' + $scope.partner.client_moniker + '/payment_card_permission', { + allow: $scope.paymentInfo.enable_threeds, + key: 'enable_threeds', + }) + .then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'failed to change international card permission status', + content: resp.data.message, + type: 'error', + }) + } + ) + } + + $scope.changePaymentPage = function () { + if (!$scope.paymentInfo) { + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/payment_page_version', { paypad_version: $scope.paymentInfo.paypad_version }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'failed to change Payment Page Version', + content: resp.data.message, + type: 'error', }) - }; + } + ) + } - $scope.switchChildEachRefund = function () { - if (!$scope.partner) { - return; - } - if (!$scope.init.child_each_refund) { - $scope.init.child_each_refund = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/child_each_refund', { allow: $scope.partner.child_each_refund }).then(function () { - $scope.loadPartnerPaymentInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'Failed to change Sub Partners Manage status', - content: resp.data.message, - type: 'error' - }) + $scope.changeCBBankPaymentPage = function () { + if (!$scope.paymentInfo) { + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/cbbank_payment_page_version', { cbbank_paypad_version: $scope.paymentInfo.cbbank_paypad_version }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'failed to change CBBank Payment Page Version', + content: resp.data.message, + type: 'error', + }) + } + ) + } + + // 更改支付成功页 + $scope.changePaySuccessPage = function () { + if (!$scope.paymentInfo) { + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/paysuccess_version', { paysuccess_version: $scope.paymentInfo.paysuccess_version }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'failed to change Payment Success Page Version', + content: resp.data.message, + type: 'error', }) - }; + } + ) + } - $scope.showClient = function (sub_client) { - if ($scope.sub_client_id == sub_client.client_id) { - return; - } - $scope.client_monikers = sub_client.level3Clients; - $scope.sub_client_id = sub_client.client_id; - }; - - - }]); - app.controller('partnerRatesCtrl', ['$scope', '$rootScope', '$http', '$uibModal', 'commonDialog', '$sce', '$state', function ($scope, $rootScope, $http, $uibModal, commonDialog, $sce, $state) { - $scope.bankCtrl = { edit: true, rate_name: 'Wechat', modify_min_settle: false }; - $scope.init = { - skip_clearing: false, - tax_in_surcharge: false, - customer_tax_free: false, - allow_surcharge_credit: false - }; - $scope.getBankAccount = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/bank_account').then(function (resp) { - $scope.bankaccount = resp.data; - $scope.bankCtrl.edit = false; - }); - }; - $scope.switchSurchargeMode = function () { - if ($scope.partner.surcharge_mode === "balance") { - commonDialog.confirm({ - title: 'Warning', - content: '启用收支分离模式清算将使消费者支付手续费模式失效,请确认是否切换?' - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/surcharge_mode', { surcharge_mode: 'distributed' }).then(function () { - commonDialog.alert({ title: 'Success', content: '已切换为收支分离模式', type: 'success' }); - $scope.partner.surcharge_mode = 'distributed'; - $scope.getBalance(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - }) - } else { - commonDialog.confirm({ - title: 'Warning', - content: '请确认是否切换成净值清算模式?' - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/surcharge_mode', { surcharge_mode: 'balance' }).then(function () { - commonDialog.alert({ title: 'Success', content: '已切换为净值清算模式', type: 'success' }); - $scope.partner.surcharge_mode = 'balance'; - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - }) - } - }; - $scope.modifyMinSettle = function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/min_settle', { min_settle: $scope.partner.min_settle }).then(function () { - commonDialog.alert({ title: 'Success', content: '修改起结金额成功', type: 'success' }); - $scope.bankCtrl.modify_min_settle = false; - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); + $scope.toggleRequireCustInfo = function () { + if (!$scope.paymentInfo) { + return + } + if (!$scope.init.require_custinfo) { + $scope.init.require_custinfo = true + return + } + $http.post('/sys/partners/' + $scope.partner.client_moniker + '/requireCustinfo', { allow: $scope.paymentInfo.require_custinfo }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'failed to change require customer Info permission status', + content: resp.data.message, + type: 'error', }) - }; - $scope.getBalance = function () { - $scope.surcharge = {}; + } + ) + } - if ($scope.partner.surcharge_mode != undefined && $scope.partner.surcharge_mode === "distributed") { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/surcharge_account').then(function (resp) { - $scope.surcharge = resp.data; - }) + $scope.toggleRequireRemark = function () { + if (!$scope.paymentInfo) { + return + } + if (!$scope.init.require_remark) { + $scope.init.require_remark = true + return + } + $http.post('/sys/partners/' + $scope.partner.client_moniker + '/requireRemark', { allow: $scope.paymentInfo.require_remark }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'failed to change require remark permission status', + content: resp.data.message, + type: 'error', + }) + } + ) + } - } - }; - $scope.getBalance(); - $scope.getBankAccount(); - $scope.getRates = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/rates').then(function (resp) { - $scope.rates = resp.data; - angular.forEach($scope.rates, function (rate) { - rate.active_time = new Date(rate.active_time.substr(0, 10).replace(/-/g, '/')); - rate.expiry_time = new Date(rate.expiry_time.substr(0, 10).replace(/-/g, '/')); - }) - }); - }; - $scope.skipClearing = function (skipClearing) { - if (!$scope.init.skip_clearing) { - $scope.init.skip_clearing = true; - return; - } - if (skipClearing) { - commonDialog.confirm({ - title: 'Warning', - content: 'This operation will switch skip clearing status. Are you sure?' - }).then(function () { - commonDialog.inputText({ title: '请输入跳过清算的原因' }).then(function (text) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/skip_clearing', { - skip_clearing: skipClearing, - remark: text - }).then(function (resp) { - $scope.getBankAccount(); - }); - }); - }) - } else { - commonDialog.confirm({ - title: 'Warning', - content: 'This operation will switch skip clearing status. Are you sure?', - // contentHtml: $sce.trustAsHtml('This operation will switch skip clearing status. Are you sure?') - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/skip_clearing', { skip_clearing: skipClearing }).then(function (resp) { - $scope.getBankAccount(); - }); - }) - } - }; - $scope.surchargeAccountDetail = function () { - $uibModal.open({ - templateUrl: '/static/payment/surchargeaccount/templates/partner_surcharge_account_dialog.html', - controller: 'surchargeAccountDetailCtrl', - size: 'lg', - resolve: { - balance: function () { - return $scope.surcharge; - }, - partner: function () { - return $scope.partner; - }, - transactions: ['$http', function ($http) { - return $http.get('/sys/partners/' + $scope.partner.client_moniker + '/account/transactions'); - }] - } - }).result.then(function () { - $scope.getBalance(); - }, function () { - $scope.getBalance(); - }); - }; - $scope.allowSurchargeCredit = function (allowSurchargeCredit) { - if (!$scope.init.allow_surcharge_credit) { - $scope.init.allow_surcharge_credit = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/allow_surcharge_credit', { allow_surcharge_credit: allowSurchargeCredit }).then(function (resp) { + $scope.changeBillCodeVersion = function () { + if (!$scope.paymentInfo) { + return + } + $http.post('/sys/partners/' + $scope.partner.client_moniker + '/selectBillVersion', { version: $scope.paymentInfo.billcode_version }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'failed to change require bill version permission status', + content: resp.data.message, + type: 'error', }) - }; - $scope.taxInSurcharge = function (taxInSurcharge) { - if (!$scope.init.tax_in_surcharge) { - $scope.init.tax_in_surcharge = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/tax_in_surcharge', { tax_in_surcharge: taxInSurcharge }).then(function (resp) { - $scope.getBankAccount(); + } + ) + } + + $scope.extChangeParam = function (name, value) { + var flag = true + $scope.convertExtParams.forEach(function (params) { + if (params.name == name && value == '' && params.type == 'string') { + flag = false + } + }) + if (flag) { + $http + .put('/sys/partners/' + $scope.partner.client_moniker + '/ext_config', { + key: name, + value: value, }) - }; - $scope.switchPreSettle = function (presettle) { - if (!$scope.init.enable_presettle) { - $scope.init.enable_presettle = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/presettle', { enable_presettle: presettle }).then(function (resp) { - $scope.getBankAccount(); + .then(function () { + $scope.loadPartnerPaymentInfo() }) - }; - $scope.customerTaxFree = function (customerTaxFree) { - if (!$scope.init.customer_tax_free) { - $scope.init.customer_tax_free = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/customer_tax_free', { customer_tax_free: customerTaxFree }).then(function (resp) { - $scope.getBankAccount(); + } + } + + $scope.queryWechatSubMerchantIdStatus = function () { + $scope.paymentInfo.sub_merchant_id + $http.get('/sys/partners/' + $scope.paymentInfo.client_moniker + '/get_merchant_ids/' + $scope.paymentInfo.sub_merchant_id + '/status').then(function (resp) { + commonDialog.alert({ + title: 'Wechat Apply Status(' + resp.data.apply_status + ')', + content: resp.data.response_str, + type: 'info', + }) + }) + } + // GatewayAlipay渠道 + $scope.setAlipayChannel = function () { + if (!$scope.paymentInfo) { + return + } + $http.put('/sys/partners/modifyAlipayPaymentChannels/' + $scope.partner.client_id + '/' + $scope.paymentInfo.alipay_payment_channels).then( + function (resp) { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'Error', + content: resp.data.message, + type: 'error', }) - }; - $scope.settleHours = [{ value: undefined, label: 'Default(24:00, GMT+10)' }]; - for (var h = 24; h > 0; h--) { - $scope.settleHours.push({ value: h, label: ('00' + h).substr(-2) + ':00, ' + $scope.partner.timezone }); - } - $scope.settleHourConfig = function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/settle_hour', { hour: $scope.partner.settle_hour || null }).then(function () { - commonDialog.alert({ type: 'success', title: 'OK', content: 'Settle Hour configured' }) - }, function (resp) { - commonDialog.alert({ type: 'error', title: 'Error', content: resp.data.message }) - }); - }; - $scope.getBankInfo = function (bsb_no) { - if (bsb_no != null && bsb_no !== "") { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/bank_account/bank_info/' + bsb_no).then(function (resp) { - $scope.bankInfo = resp.data; - $scope.bankaccount.bank = $scope.bankInfo.bank; - $scope.bankaccount.city = $scope.bankInfo.city; - $scope.bankaccount.address = $scope.bankInfo.address; - $scope.bankaccount.system = $scope.bankInfo.system; - $scope.bankaccount.postcode = $scope.bankInfo.postcode; - $scope.bankaccount.state = $scope.bankInfo.state; - $scope.bankaccount.branch = $scope.bankInfo.branch; - - }); - } else { - commonDialog.alert({ title: 'Error', content: "请先填写BSB No", type: 'error' }) - } - - }; - $scope.getRates(); - $scope.saveBankAccount = function () { - if (isNaN($scope.bankaccount.account_no)) { - alert("Account No应输入数字!"); - return; - } - ; - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/bank_account', $scope.bankaccount).then(function () { - $scope.getBankAccount(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + }, + ]) + app.controller('clientSubMerchantIdLogCtrl', [ + '$scope', + '$http', + 'logs', + function ($scope, $http, logs) { + $scope.logs = logs.data + }, + ]) + app.controller('partnerSubCtrl', [ + '$scope', + '$http', + '$uibModal', + function ($scope, $http, $uibModal) { + $scope.toShow = false + $scope.init = { + child_each_refund: false, + sub_manage: false, + } + + $scope.newSubClient = function () { + $uibModal + .open({ + templateUrl: '/static/payment/partner/templates/add_sub_partner_dialog.html', + controller: 'partnerNewSubPartnerDialogCtrl', + size: 'lg', + resolve: { + clientMoniker: function () { + return $scope.partner.client_moniker + }, + }, + }) + .result.then(function () { + $scope.loadSubClients(1) + }) + } + + $scope.loadSubClients = function (page) { + var params = {} + params.page = page || $scope.pagination.page || 1 + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/sub_clients/page', { params: params }).then(function (resp) { + $scope.subPartners = resp.data.data + $scope.pagination = resp.data.pagination + }) + } + + $scope.loadSubClients(1) + + $scope.loadPartnerPaymentInfo = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker).then(function (resp) { + $scope.paymentInfo = resp.data + }) + } + $scope.loadPartnerPaymentInfo() + + $scope.switchSubManage = function () { + if (!$scope.paymentInfo) { + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/sub_manage', { allow: $scope.partner.sub_manage }).then( + function () { + //$scope.loadPartnerPaymentInfo(); + }, + function (resp) { + commonDialog.alert({ + title: 'Failed to change Sub Partners Manage status', + content: resp.data.message, + type: 'error', }) - }; - $scope.newCardPaymentRates = function () { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/partner_new_card_payment_rate.html', - controller: 'newCardPaymentRateDialogCtrl', - resolve: { - sys_common_rate: function () { - return $http.get('/sys/partners/sys_card_rates'); - }, - clientMoniker: function () { - return $scope.partner.client_moniker; - }, - cost_rate_channel: function () { - return $scope.cost_rate_channel; - } - } - }).result.then(function () { - $scope.getRates(); - }); - }; - $scope.newRate = function () { - var name = $scope.bankCtrl.rate_name; - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/partner_new_rate.html', - controller: 'newRateDialogCtrl', - resolve: { - rate: function () { - return { rate_name: name, clean_days: 3 }; - }, - sys_common_rate: function () { - return $http.get('/sys/partners/sys_rates'); - }, - clientMoniker: function () { - return $scope.partner.client_moniker; - } - } - }).result.then(function () { - $scope.getRates(); - }); - }; - $scope.editRate = function (rate) { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/rate_config_dialog.html', - controller: 'rateConfigDialogCtrl', - resolve: { - rate: function () { - return rate - }, - clientMoniker: function () { - return $scope.partner.client_moniker; - } - } - }).result.then(function () { - $scope.getRates(); - }); - }; - - $scope.complianceCheck = function () { - if (!$rootScope.complianceCheck) { - $rootScope.complianceCheck = {}; - } - $rootScope.complianceCheck.client_id = $scope.partner.client_id; - $rootScope.complianceCheck.bankAccount = true; - - }; - $scope.complianceChangeCheck = function () { - if ($rootScope.complianceCheck) { - if ($scope.partner.client_id != $rootScope.complianceCheck.client_id) { - delete $rootScope.complianceCheck; - } - } - }; - $scope.complianceChangeCheck(); - }]); - app.controller('surchargeAccountDetailCtrl', ['$scope', '$http', 'balance', 'partner', 'transactions', 'commonDialog', function ($scope, $http, balance, partner, transactions, commonDialog) { - $scope.surcharge = angular.copy(balance); - $scope.surchargeDetailData = angular.copy(transactions.data); - $scope.partner = angular.copy(partner); - $scope.canAddDetail = false; - $scope.params = {}; - - $scope.getBalance = function () { - if ($scope.partner.surcharge_mode != undefined && $scope.partner.surcharge_mode == "distributed") { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/surcharge_account').then(function (resp) { - $scope.surcharge = resp.data; - }) + } + ) + } - } - }; - - $scope.getTransactions = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/account/transactions').then(function (resp) { - $scope.surchargeDetailData = resp.data; - }); - } - - $scope.addDetail = function () { - $scope.canAddDetail = true; - }; - - $scope.cancel = function () { - $scope.canAddDetail = false; - $scope.params = {}; - } - $scope.save = function () { - $http.post('/sys/partners/' + $scope.partner.client_moniker + '/account/save', { - amount: $scope.params.amount, - remark: $scope.params.remark - }).then(function (resp) { - $scope.getTransactions(); - $scope.getBalance(); - $scope.canAddDetail = false; - $scope.params = {}; - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }); - } - - - }]); - app.controller('newCardPaymentRateDialogCtrl', ['$scope', '$http', 'sys_common_rate', 'clientMoniker', function ($scope, $http, sys_common_rate, clientMoniker) { - $scope.rate = {}; - $scope.card_payment_normal = true; - $scope.card_payment_switch_title = "Direct Debit"; - $scope.card_payment = [ - { - type: "rpaypmt_card", - title: "Card Payment" - }, { - type: "rpaypmt_dd", - title: "Direct Debit" - }]; - $scope.cardRateConfig = $scope.card_payment[0]; - $scope.switchCardRateConfig = function () { - $scope.card_payment_normal = !$scope.card_payment_normal; - $scope.rate = {}; - if ($scope.card_payment_normal) { - $scope.cardRateConfig = $scope.card_payment[0]; - $scope.card_payment_switch_title = "Direct Debit"; - } else { - $scope.cardRateConfig = $scope.card_payment[1]; - $scope.card_payment_switch_title = "Card Payment"; - } - }; - $scope.sysRateConfig = angular.copy(sys_common_rate.data); - $scope.ctrl = { sending: false }; - $scope.saveRate = function (form) { - if (form.$invalid) { - angular.forEach(form, function (item, key) { - if (key.indexOf('$') < 0) { - item.$dirty = true; - } - }); - return; - } - $scope.errmsg = null; - $scope.ctrl.sending = true; - $scope.rate.type = $scope.cardRateConfig.type; - $http.post('/sys/partners/' + clientMoniker + '/rates', $scope.rate).then(function () { - $scope.ctrl.sending = false; - $scope.$close(); - }, function (resp) { - $scope.ctrl.sending = false; - $scope.errmsg = resp.data.message; - }) + $scope.switchChildEachRefund = function () { + if (!$scope.partner) { + return } - $scope.changeDays = function () { - if ($scope.rate.clean_days && $scope.card_payment_normal) { - switch ($scope.rate.clean_days) { - case '1': { - $scope.rate.rate_value = parseFloat($scope.sysRateConfig.t1.domestic_rate); - $scope.rate.transaction_fee = parseFloat($scope.sysRateConfig.t1.transaction_fee); - break; - } - case '2': { - $scope.rate.rate_value = parseFloat($scope.sysRateConfig.t2.domestic_rate); - $scope.rate.transaction_fee = parseFloat($scope.sysRateConfig.t2.transaction_fee); - break; - } - case '3': { - $scope.rate.rate_value = parseFloat($scope.sysRateConfig.t3.domestic_rate); - $scope.rate.transaction_fee = parseFloat($scope.sysRateConfig.t3.transaction_fee); - break; - } - } - } - }; - }]); - app.controller('newRateDialogCtrl', ['$scope', '$http', 'rate', 'sys_common_rate', 'clientMoniker', function ($scope, $http, rate, sys_common_rate, clientMoniker) { - $scope.rate = angular.copy(rate); - $scope.sysRateConfig = angular.copy(sys_common_rate.data); - $scope.ctrl = { sending: false }; - $scope.saveRate = function (form) { - if (form.$invalid) { - angular.forEach(form, function (item, key) { - if (key.indexOf('$') < 0) { - item.$dirty = true; - } - }); - return; - } - $scope.errmsg = null; - $scope.ctrl.sending = true; - $http.post('/sys/partners/' + clientMoniker + '/rates', $scope.rate).then(function () { - $scope.ctrl.sending = false; - $scope.$close(); - }, function (resp) { - $scope.ctrl.sending = false; - $scope.errmsg = resp.data.message; + if (!$scope.init.child_each_refund) { + $scope.init.child_each_refund = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/child_each_refund', { allow: $scope.partner.child_each_refund }).then( + function () { + $scope.loadPartnerPaymentInfo() + }, + function (resp) { + commonDialog.alert({ + title: 'Failed to change Sub Partners Manage status', + content: resp.data.message, + type: 'error', }) + } + ) + } + + $scope.showClient = function (sub_client) { + if ($scope.sub_client_id == sub_client.client_id) { + return } - $scope.changeDays = function () { - if ($scope.rate.clean_days) { - switch ($scope.rate.clean_days) { - case '1': { - $scope.rate.wechat_rate_value = parseFloat($scope.sysRateConfig.t1.Wechat); - $scope.rate.alipay_rate_value = parseFloat($scope.sysRateConfig.t1.Alipay); - $scope.rate.alipayonline_rate_value = parseFloat($scope.sysRateConfig.t1.AlipayOnline); - $scope.rate.Rpay_rate_value = parseFloat($scope.sysRateConfig.t1.Rpay); - $scope.rate.transaction_fee = 0; - break; - } - case '2': { - $scope.rate.wechat_rate_value = parseFloat($scope.sysRateConfig.t2.Wechat); - $scope.rate.alipay_rate_value = parseFloat($scope.sysRateConfig.t2.Alipay); - $scope.rate.alipayonline_rate_value = parseFloat($scope.sysRateConfig.t2.AlipayOnline); - $scope.rate.Rpay_rate_value = parseFloat($scope.sysRateConfig.t2.Rpay); - $scope.rate.transaction_fee = 0; - break; - } - case '3': { - $scope.rate.wechat_rate_value = parseFloat($scope.sysRateConfig.t3.Wechat); - $scope.rate.alipay_rate_value = parseFloat($scope.sysRateConfig.t3.Alipay); - $scope.rate.alipayonline_rate_value = parseFloat($scope.sysRateConfig.t3.AlipayOnline); - $scope.rate.Rpay_rate_value = parseFloat($scope.sysRateConfig.t3.Rpay); - $scope.rate.transaction_fee = 0; - break; - } - } - } - }; - }]); - app.controller('partnerAccountsCtrl', ['$scope', '$http', '$uibModal', 'commonDialog', function ($scope, $http, $uibModal, commonDialog) { - $scope.partnerRoles = partnerRoles; - $scope.loadPartnerAccounts = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/accounts').then(function (resp) { - $scope.accounts = resp.data; + $scope.client_monikers = sub_client.level3Clients + $scope.sub_client_id = sub_client.client_id + } + }, + ]) + app.controller('partnerRatesCtrl', [ + '$scope', + '$rootScope', + '$http', + '$uibModal', + 'commonDialog', + '$sce', + '$state', + function ($scope, $rootScope, $http, $uibModal, commonDialog, $sce, $state) { + $scope.bankCtrl = { edit: true, rate_name: 'Wechat', modify_min_settle: false } + $scope.init = { + skip_clearing: false, + tax_in_surcharge: false, + customer_tax_free: false, + allow_surcharge_credit: false, + } + $scope.getBankAccount = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/bank_account').then(function (resp) { + $scope.bankaccount = resp.data + $scope.bankCtrl.edit = false + }) + } + $scope.switchSurchargeMode = function () { + if ($scope.partner.surcharge_mode === 'balance') { + commonDialog + .confirm({ + title: 'Warning', + content: '启用收支分离模式清算将使消费者支付手续费模式失效,请确认是否切换?', }) - }; - $scope.loadPartnerAccounts(); - $scope.addAccount = function () { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/add_partner_account_dialog.html', - controller: 'partnerAddAccountDialogCtrl', - backdrop: false, - resolve: { - partner: function () { - return $scope.partner; - } + .then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/surcharge_mode', { surcharge_mode: 'distributed' }).then( + function () { + commonDialog.alert({ title: 'Success', content: '已切换为收支分离模式', type: 'success' }) + $scope.partner.surcharge_mode = 'distributed' + $scope.getBalance() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) } - }).result.then(function () { - $scope.loadPartnerAccounts(); + ) }) - }; - $scope.updateAccountRole = function (account) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/accounts/' + account.account_id + '/role', { role: account.role }).then(function () { - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } else { + commonDialog + .confirm({ + title: 'Warning', + content: '请确认是否切换成净值清算模式?', }) - }; - $scope.resetPwd = function (account) { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/partner_account_reset_pwd_dialog.html', - controller: 'partnerResetPwdDialogCtrl', - backdrop: false, - size: 'sm', - resolve: { - partner: function () { - return $scope.partner; - }, - account: function () { - return account; - } + .then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/surcharge_mode', { surcharge_mode: 'balance' }).then( + function () { + commonDialog.alert({ title: 'Success', content: '已切换为净值清算模式', type: 'success' }) + $scope.partner.surcharge_mode = 'balance' + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) } - }).result.then(function () { - commonDialog.alert({ title: 'Success!', content: 'Password Changed Successfully', type: 'success' }) + ) }) - }; - $scope.disableAccount = function (account) { - commonDialog.confirm({ - title: 'Confirm Operation', - content: 'Are you sure to disable account ' + account.display_name + ' ?' - }).then(function () { - $http.delete('/sys/partners/' + $scope.partner.client_moniker + '/accounts/' + account.account_id).then(function () { - $scope.loadPartnerAccounts(); - }, function (resp) { - commonDialog.alert({ title: 'Fail!', content: resp.data.message, type: 'error' }) - }) + } + } + $scope.modifyMinSettle = function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/min_settle', { min_settle: $scope.partner.min_settle }).then( + function () { + commonDialog.alert({ title: 'Success', content: '修改起结金额成功', type: 'success' }) + $scope.bankCtrl.modify_min_settle = false + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + $scope.getBalance = function () { + $scope.surcharge = {} + + if ($scope.partner.surcharge_mode != undefined && $scope.partner.surcharge_mode === 'distributed') { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/surcharge_account').then(function (resp) { + $scope.surcharge = resp.data + }) + } + } + $scope.getBalance() + $scope.getBankAccount() + $scope.getRates = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/rates').then(function (resp) { + $scope.rates = resp.data + angular.forEach($scope.rates, function (rate) { + rate.active_time = new Date(rate.active_time.substr(0, 10).replace(/-/g, '/')) + rate.expiry_time = new Date(rate.expiry_time.substr(0, 10).replace(/-/g, '/')) + }) + }) + } + $scope.skipClearing = function (skipClearing) { + if (!$scope.init.skip_clearing) { + $scope.init.skip_clearing = true + return + } + if (skipClearing) { + commonDialog + .confirm({ + title: 'Warning', + content: 'This operation will switch skip clearing status. Are you sure?', }) - }; - }]); - app.controller('partnerAddAccountDialogCtrl', ['$scope', '$http', 'partner', function ($scope, $http, partner) { - $scope.account = { role: 1 }; - $scope.partnerRoles = partnerRoles; - $scope.account.nation_code = 61; - $scope.saveAccount = function (form) { - if (form.$invalid) { - angular.forEach(form, function (item, key) { - if (key.indexOf('$') < 0) { - item.$dirty = true; - } - }); - return; - } - if ($scope.account.pwd && $scope.account.pwd.length < 8) { - $scope.errmsg = 'Password length must more than 8 !'; - return; - } - var regex = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/; - if ($scope.account.pwd && !regex.test($scope.account.pwd)) { - $scope.errmsg = 'The password needs to consist of 8-16 digits and letters !'; - return; - } - $scope.errmsg = null; - $http.post('/sys/partners/' + partner.client_moniker + '/accounts', $scope.account).then(function () { - $scope.$close(); - }, function (resp) { - $scope.errmsg = resp.data.message; + .then(function () { + commonDialog.inputText({ title: '请输入跳过清算的原因' }).then(function (text) { + $http + .put('/sys/partners/' + $scope.partner.client_moniker + '/skip_clearing', { + skip_clearing: skipClearing, + remark: text, + }) + .then(function (resp) { + $scope.getBankAccount() + }) + }) }) - } - }]); - app.controller('partnerResetPwdDialogCtrl', ['$scope', '$http', 'partner', 'account', function ($scope, $http, partner, account) { - $scope.updatePwd = function () { - $scope.errmsg = null; - if ($scope.reset.pwd && $scope.reset.pwd.length < 8) { - $scope.errmsg = 'Password length must more than 8 !'; - return; - } - var regex = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/; - if ($scope.reset.pwd && !regex.test($scope.reset.pwd)) { - $scope.errmsg = 'The password needs to consist of 8-16 digits and letters !'; - return; - } - $http.put('/sys/partners/' + partner.client_moniker + '/accounts/' + account.account_id + '/pwd', { pwd: $scope.reset.pwd }).then(function () { - $scope.$close(); - }, function (resp) { - $scope.errmsg = resp.data.message; + } else { + commonDialog + .confirm({ + title: 'Warning', + content: 'This operation will switch skip clearing status. Are you sure?', + // contentHtml: $sce.trustAsHtml('This operation will switch skip clearing status. Are you sure?') + }) + .then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/skip_clearing', { skip_clearing: skipClearing }).then(function (resp) { + $scope.getBankAccount() + }) }) } - }]); - app.controller('partnerNewSubPartnerDialogCtrl', ['$rootScope', '$scope', '$http', '$state', 'Upload', 'commonDialog', 'timezone', - 'clientMoniker', 'industryMap', 'businessStructuresMap', 'stateMap', 'countryMap', 'wechatGoodMcc', '$filter', - function ($rootScope, $scope, $http, $state, Upload, commonDialog, timezone, clientMoniker, industryMap, businessStructuresMap, stateMap, countryMap, wechatGoodMcc, $filter) { - if ($scope.partner_application) { - $scope.partner = angular.copy($scope.partner_application); - delete $rootScope.partner_application; - } else { - $scope.partner = { timezone: 'Australia/Melbourne' }; - } - $scope.initMerchantCode = function () { - $http.get('/sys/partners/init/merchant_code').then(function (response) { - $scope.partner.client_moniker = response.data.partner_code; - $scope.merchantCodeChecked = true; - $scope.merchantIsValid = true; - }); - }; - $scope.initMerchantCode(); - $scope.partner.company_phone_c = 61; - $scope.partner.contact_phone_c = 61; - $scope.partner.client_pay_type = []; - $scope.partner.client_pay_desc = []; - $scope.merchantIsValid = false; - $scope.merchantCodeChecked = false; - $scope.wechatMccIndustries = wechatGoodMcc.configs(); - $scope.checkExpriedate = function (value) { - if (value) { - $scope.partner.certificat_expire_date_premanent = false; - $scope.partner.certificat_expire_date_NA = false; - } - } - $scope.checkExpriedateOther = function (value) { - if (value == 'PERMANENT') { - if ($scope.partner.certificat_expire_date_premanent) { - $scope.partner.certificat_expire_date_NA = false; - $scope.partner.certificat_expire_date_d = null; - } - } else if (value == 'N/A') { - if ($scope.partner.certificat_expire_date_NA) { - $scope.partner.certificat_expire_date_premanent = false; - $scope.partner.certificat_expire_date_d = null; - } - } - } - var resetClientPayDescByTpey = function (type) { - type = parseInt(type); - if (type == 1) { - removeClientPayDesc($scope.partner.client_pay_desc, '10'); - } - if (type == 2) { - removeClientPayDesc($scope.partner.client_pay_desc, '20'); - } - }; - - var compare = function (x, y) { - x = parseInt(x); - y = parseInt(y); - if (x < y) { - return -1; - } else if (x > y) { - return 1; - } else { - return 0; - } - } - $scope.toggleClientPayType = function (type) { - var $idx = $scope.partner.client_pay_type.indexOf(type); - if ($idx >= 0) { - $scope.partner.client_pay_type.splice($idx, 1); - resetClientPayDescByTpey(type); - } else { - $scope.partner.client_pay_type.push(type); - $scope.partner.client_pay_type.sort(compare); - } - }; - $scope.toggleClientPayDesc = function (type) { - var $idx = $scope.partner.client_pay_desc.indexOf(type); - if ($idx >= 0) { - if (type == '203') { - removeClientPayDesc($scope.partner.client_pay_desc, '2030') - } - $scope.partner.client_pay_desc.splice($idx, 1); - } else { - $scope.partner.client_pay_desc.push(type); - $scope.partner.client_pay_desc.sort(compare); - } - }; - $scope.business_structures = businessStructuresMap.configs(); - $scope.industries = industryMap.configs(); - - $scope.listReferrers = function () { - $http.get('/sys/orgs/referrer').then(function (resp) { - $scope.referrers = resp.data; - }) - }; - $scope.listReferrers(); - - $scope.alipayMccCategory = {}; - $scope.loadAlipayCategory = function () { - $http.get('/static/data/alipayMcc.json').then(function (resp) { - $scope.alipayMccCategory = resp.data; - }) - }; - $scope.loadAlipayCategory(); - - - $scope.loadJDindustry = function () { - $http.get('/static/data/jdindustry.json').then(function (resp) { - $scope.jdindustry = resp.data; - }) - }; - $scope.loadJDindustry(); - - $scope.loadLakalaPayindustry = function () { - $http.get('/static/data/lakalapayindustry.json').then(function (resp) { - $scope.lakalapayindustry = resp.data; - }) - }; - $scope.loadLakalaPayindustry(); - - $scope.loadLakalaPaySettle = function () { - $http.get('/static/data/lakalapaysettle.json').then(function (resp) { - $scope.lakalapaysettle = resp.data; - }) - }; - $scope.loadLakalaPaySettle(); - - $scope.loadLakalaPayGoods = function () { - $http.get('/static/data/lakalapaygoods.json').then(function (resp) { - $scope.lakalapaygoods = resp.data; - }) - }; - $scope.loadLakalaPayGoods(); - - - $scope.loadRoyalpayindustry = function () { - $http.get('/static/data/royalpayindustry.json').then(function (resp) { - $scope.royalpayindustry = resp.data; - }) - }; - $scope.loadRoyalpayindustry(); - - $scope.loadHfindustry = function () { - $http.get('/static/data/hfindustry.json').then(function (resp) { - $scope.hfindustry = resp.data; - }) - }; - $scope.loadHfindustry(); - - - $scope.onAlipayMccSelect = function (selectedItem) { - $scope.partner.alipay_category = selectedItem.label; - $scope.partner.alipayindustry = selectedItem.mccCode; - }; - $scope.onRoyalPayIndustrySelect = function (selectedItem) { - $scope.partner.royalpay_label = selectedItem.label; - $scope.partner.royalpayindustry = selectedItem.mccCode; - }; - - $scope.onHfIndustrySelect = function (selectedItem) { - $scope.partner.hf_label = selectedItem.label; - $scope.partner.hfindustry = selectedItem.mccCode; - }; - - // $scope.t2city_map = angular.copy(t2city_map); - - $scope.partner.sameAsContactPerson = false; - $scope.checkboxOnclick = function () { - $scope.partner.sameAsContactPerson = !($scope.partner.sameAsContactPerson); - if ($scope.partner.sameAsContactPerson) { - $scope.partner.legal_representative_person = $scope.partner.contact_person; - $scope.partner.legal_representative_phone_a = $scope.partner.contact_phone_a; - $scope.partner.legal_representative_phone_c = $scope.partner.contact_phone_c; - $scope.partner.legal_representative_phone_p = $scope.partner.contact_phone_p; - $scope.partner.legal_representative_email = $scope.partner.contact_email; - $scope.partner.legal_representative_job = $scope.partner.contact_job; - $scope.partner.legal_representative_wechatid = $scope.partner.contact_wechatid; - } - } - - - $scope.partner.marketingSameAsContact = false; - $scope.checkMarketingSameAsContact = function () { - $scope.partner.marketingSameAsContact = !($scope.partner.marketingSameAsContact); - if ($scope.partner.marketingSameAsContact) { - $scope.partner.marketing_person = $scope.partner.contact_person; - $scope.partner.marketing_phone_a = $scope.partner.contact_phone_a; - $scope.partner.marketing_phone_c = $scope.partner.contact_phone_c; - $scope.partner.marketing_phone_p = $scope.partner.contact_phone_p; - $scope.partner.marketing_email = $scope.partner.contact_email; - $scope.partner.marketing_job = $scope.partner.contact_job; - $scope.partner.marketing_wechatid = $scope.partner.contact_wechatid; - } - } - - $scope.partner.sameAsAddress = false; - $scope.sameAddress = function () { - $scope.partner.sameAsAddress = !($scope.partner.sameAsAddress); - if ($scope.partner.sameAsAddress) { - $scope.partner.registered_address = $scope.partner.address; - $scope.partner.registered_suburb = $scope.partner.suburb; - $scope.partner.registered_postcode = $scope.partner.postcode; - $scope.partner.registered_state = $scope.partner.state; - } - } - - $scope.timezones = timezone.configs(); - $scope.states = stateMap.configs(); - $scope.countries = countryMap.configs(); - $scope.checkMerchantCodeIsValid = function (code) { - if (code.length != 4) { - $scope.merchantCodeChecked = false; - $scope.merchantIsValid = false; - return; - } - $http.get('/sys/partners/init/check_code_isvalid', { params: { clientMoniker: code } }).then(function (response) { - $scope.merchantIsValid = response.data; - $scope.merchantCodeChecked = true; - }); - }; - $scope.saveSubPartner = function (form) { - if (form.$invalid) { - angular.forEach(form, function (item, key) { - if (key.indexOf('$') < 0) { - item.$dirty = true; - } - }); - return; - } - $scope.errmsg = null; - if (!$scope.partner.business_structure || $scope.partner.business_structure == '') { - alert('Please select the business structure'); - return; - } - if ($scope.partner.business_structure != 'Registered body(Sole Trader)') { - if ($scope.partner.certificat_expire_date_d) { - $scope.partner.certificat_expire_date = $filter('dateConversionStr')($scope.partner.certificat_expire_date_d) - } else if ($scope.partner.certificat_expire_date_premanent) { - $scope.partner.certificat_expire_date = "PERMANENT"; - } - else if ($scope.partner.certificat_expire_date_NA) { - $scope.partner.certificat_expire_date = "N/A"; - } else { - alert("Certificate expiration time is required"); - return; - } - } - if ($scope.partner.company_name.indexOf("Migration") != -1) { - alert("Company Name包含敏感词汇,请检查后重新提交!"); - return; - } - - if ($scope.partner.company_phone_a && ('' + $scope.partner.company_phone_a != '')) { - if ($scope.partner.company_phone_a.indexOf('0') == 0) { - alert("Please remove the first character '0' of area code"); - return; - } - } - if ($scope.partner.contact_phone && ('' + $scope.partner.contact_phone != '')) { - if ($scope.partner.contact_phone.indexOf('0') == 0) { - alert("Please remove the first character '0' of area code"); - return; - } - } - $scope.partner.company_phone = '+' + $scope.partner.company_phone_c + ($scope.partner.company_phone_a || '') + $scope.partner.company_phone_p; - $scope.partner.contact_phone = '+' + $scope.partner.contact_phone_c + ($scope.partner.contact_phone_a || '') + $scope.partner.contact_phone_p; - $scope.partner.legal_representative_phone = '+' + $scope.partner.legal_representative_phone_c + ($scope.partner.legal_representative_phone_a || '') + $scope.partner.legal_representative_phone_p; - $scope.partner.marketing_phone = '+' + $scope.partner.marketing_phone_c + ($scope.partner.marketing_phone_a || '') + $scope.partner.marketing_phone_p; - - if ($scope.partner.company_phone.indexOf(' ') != -1) { - alert('Company Phone can not contain space character'); - return; - } - if ($scope.partner.contact_phone.indexOf(' ') != -1) { - alert('Contact Phone can not contain space character'); - return; - } - if ($scope.partner.contact_email.indexOf(' ') != -1) { - alert('Contact email Phone can not contain space character'); - return; - } - if ($scope.partner.suburb.indexOf(' ') != -1) { - alert('suburb can not contain two and more continuous space characters'); - return; - } - if ($scope.partner.acn && $scope.partner.business_structure == 'Company') { - if ($scope.partner.acn.length != 9) { - alert('Acn is not valid'); - return; - } - } - // if (!$scope.partner.logo_url) { - // alert("Logo is necessary!"); - // return; - // } - if ($scope.partner.client_pay_type.indexOf('2') >= 0) { - if (!$scope.partner.company_photo) { - alert('Shop Photo1 is necessary'); - return; - } - if (!$scope.partner.store_photo) { - alert('Shop Photo2 is necessary'); - return; - } - } - // if(!window.frames['merchant_detail'].merchant_location){ - // alert("Please Locate Merchant Location!"); - // return; - // } - if ($scope.partner.client_pay_type.length == 0) { - alert('请选择商户支付场景') - return; - } - if ($scope.partner.client_pay_desc.length == 0) { - alert('请选择商户支付方式') - return; - } - if ($scope.partner.client_pay_type.indexOf('1') >= 0) { - if ($scope.partner.client_pay_desc.join(',').indexOf('10') < 0) { - alert("请检查线上支付场景是否已选择支付方式"); - return; - } - } - if ($scope.partner.client_pay_type.indexOf('2') >= 0) { - if ($scope.partner.client_pay_desc.join(',').indexOf('20') < 0) { - alert("请检查线下支付场景是否已选择支付方式"); - return; - } - } - if ($scope.partner.client_pay_desc.join(',').indexOf('203') >= 0) { - if ($scope.partner.client_pay_desc.join(',').indexOf('2030') < 0 && $scope.partner.client_pay_desc.join(',').indexOf('20399') < 0) { - alert("请检查线下支付是否已选择收银系统类型"); - return; - } - } - $scope.partner.client_pay_type = $scope.partner.client_pay_type.join(','); - $scope.partner.client_pay_desc = $scope.partner.client_pay_desc.join(','); - $http.post('/sys/partners/' + clientMoniker + '/sub_clients', $scope.partner).then(function () { - $scope.updateMerchantLocation(); - $scope.$close(); - }, function (resp) { - $scope.errmsg = resp.data.message; - $scope.partner.client_pay_type = $scope.partner.client_pay_type.split(","); - $scope.partner.client_pay_desc = $scope.partner.client_pay_desc.split(","); - }) - } - $scope.uploadLogo = function (file) { - if (file != null) { - if (file.size > 1 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过1MB,请压缩后重试', type: 'error' }) - } else { - $scope.logoProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - delete $scope.logoProgress; - $scope.partner.logo_id = resp.data.fileid; - $scope.partner.logo_url = resp.data.url; - }, function (resp) { - delete $scope.logoProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.logoProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - - $scope.uploadShopPhoto = function (file) { - if (file != null) { - if (file.size > 2 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error' }) - } else { - $scope.shopPhotoProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - delete $scope.shopPhotoProgress; - $scope.partner.company_photo = resp.data.url; - }, function (resp) { - delete $scope.shopPhotoProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.shopPhotoProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - - $scope.uploadStorePhoto = function (file) { - if (file != null) { - if (file.size > 2 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error' }) - } else { - $scope.storePhotoProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - delete $scope.storePhotoProgress; - $scope.partner.store_photo = resp.data.url; - }, function (resp) { - delete $scope.storePhotoProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.storePhotoProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - $scope.updateMerchantLocation = function () { - var params = window.frames['merchant_detail'].merchant_location; - if (params) { - $http.put('/sys/partners/modify/' + $scope.partner.client_moniker + '/location', params).then(function () { - }); - } - } - }]); - app.controller('partnerPayLogCtrl', ['$scope', '$http', '$filter', 'refunder', 'orderService', function ($scope, $http, $filter, refunder, orderService) { - $scope.params = { status: 'PAID', channel: 'ALL', textType: 'all', datefrom: new Date(), dateto: new Date() }; - $scope.pagination = {}; - $scope.isAll = true; - $scope.isLevel3All = true; - $scope.clients = [$scope.partner]; - $scope.showLevel3Clients = false; - $scope.subClientTable1 = [$scope.partner]; - $scope.subClientTable2 = []; - $scope.choseSubClientNow = 'More'; - $scope.more20ChoseSubClient = false; - $scope.subSearchText = ''; - - $scope.today = new Date(); - $scope.chooseToday = function () { - $scope.params.datefrom = $scope.params.dateto = new Date(); - $scope.loadTradeLogs(1); - }; - $scope.chooseYesterday = function () { - var yesterday = new Date(); - yesterday.setDate(yesterday.getDate() - 1); - $scope.params.datefrom = $scope.params.dateto = yesterday; - $scope.loadTradeLogs(1); - }; - $scope.chooseLast7Days = function () { - $scope.params.dateto = new Date(); - var day = new Date(); - day.setDate(day.getDate() - 7); - $scope.params.datefrom = day; - $scope.loadTradeLogs(1); - }; - $scope.thisMonth = function () { - $scope.params.dateto = new Date(); - var monthBegin = new Date(); - monthBegin.setDate(1); - $scope.params.datefrom = monthBegin; - $scope.loadTradeLogs(1); - }; - $scope.lastMonth = function () { - var monthFinish = new Date(); - monthFinish.setDate(0); - $scope.params.dateto = monthFinish; - var monthBegin = new Date(); - monthBegin.setDate(0); - monthBegin.setDate(1); - $scope.params.datefrom = monthBegin; - $scope.loadTradeLogs(1); - }; - $scope.loadTradeLogs = function (page) { - var params = angular.copy($scope.params); - if (params.datefrom) { - params.datefrom = $filter('date')(params.datefrom, 'yyyyMMdd'); - } - if (params.dateto) { - params.dateto = $filter('date')(params.dateto, 'yyyyMMdd'); - } - params.page = page || $scope.pagination.page || 1; - if (params.gateway) { - if ((params.gateway.sort().toString() != [0, 1].toString()) && (params.gateway.sort().toString() != [5, 6].toString())) { - delete params.gatewayChilds; - delete params.gatewayChild; - } - if (params.gatewayChilds) { - var exist = false - params.gatewayChilds.forEach(function (child) { - if (child == params.gatewayChild) { - exist = true - } - }) - if (!exist) { - params.gatewayChild = null - } - } else { - delete params.gatewayChild; - } - } else { - delete params.gatewayChilds; - delete params.gatewayChild; - } - if ($scope.isAll) { - delete params.client_ids; - } - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/trade_logs', { params: params }).then(function (resp) { - $scope.tradeLogs = resp.data.data; - $scope.pagination = resp.data.pagination; - $scope.analysis = resp.data.analysis; - }); - }; - - $scope.initGatewayChild = function () { - $scope.params.gatewayChilds = $scope.params.gateway; - $scope.params.gatewayChild = null; - $scope.loadTradeLogs(1); - } - $scope.gatewaySelected = function (arr) { - return $scope.params.gateway != null && $scope.params.gateway.filter(function (gateway) { - return arr.indexOf(gateway) >= 0 - }).length > 0 - }; - - $scope.showRefundLog = function (orderId) { - refunder.refunded(orderId); - }; - $scope.newRefund = function (orderId) { - refunder.refund(orderId).then(function () { - $scope.loadTradeLogs(); - }); - }; - $scope.showTradeDetail = function (order) { - orderService.managerOrderDetail(order) - }; - $scope.$on('order_refunded', function () { - $scope.loadTradeLogs(); - }); - $scope.chooseClient = function (client) { - if (client == 'all') { - $scope.choseSubClientNow = 'More'; - $scope.params.client_ids = angular.copy($scope.clientIds); - $scope.isAll = true; - $scope.chooseClientId = ''; - $scope.showLevel3Clients = false; - } else if (client.level3Clients) { - $scope.chooseClientId = client.client_id; - $scope.showLevel3Clients = true; - $scope.level3Clients = client.level3Clients; - $scope.isAll = false; - $scope.level3ClientIds = []; - $scope.level3ClientIds.push(client.client_id); - client.level3Clients.forEach(function (client) { - $scope.level3ClientIds.push(client.client_id); - }); - $scope.chooseLevel3Client("all"); - return; - } else { - $scope.chooseClientId = client.client_id; - $scope.params.client_ids = [client.client_id]; - $scope.isAll = false; - $scope.showLevel3Clients = false; - } - $scope.loadTradeLogs(); - }; - $scope.chooseLevel3Client = function (client) { - if (client == 'all') { - $scope.params.client_ids = angular.copy($scope.level3ClientIds); - $scope.isLevel3All = true; - $scope.chooseLevel3ClientId = ''; - } else { - $scope.chooseLevel3ClientId = client.client_id; - $scope.params.client_ids = [client.client_id]; - $scope.isLevel3All = false; - } - $scope.loadTradeLogs(); - }; - $scope.searchSubClients = function (subSearchText, page) { - $scope.subClientTable1 = [$scope.partner]; - $scope.subClientTable2 = []; - var params = {}; - params.page = page || $scope.subClientPagination.page || 1; - if (subSearchText != '') { - $scope.subSearchText = subSearchText; - params.searchText = subSearchText; - } - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/sub_clients/page', { params: params }).then(function (resp) { - var clientList = resp.data.data; - $scope.subClientPagination = resp.data.pagination; - clientList.forEach(function (client) { - if ($scope.subClientTable1.length < 11) { - $scope.subClientTable1.push(client); - } else { - $scope.subClientTable2.push(client); - } - $scope.clients.push(client); - }); - }); - }; - - if ($scope.partner.has_children && !$scope.partner.hide_sub_mch) { - $scope.searchSubClients('', 1); - $scope.loadTradeLogs(1); + } + $scope.surchargeAccountDetail = function () { + $uibModal + .open({ + templateUrl: '/static/payment/surchargeaccount/templates/partner_surcharge_account_dialog.html', + controller: 'surchargeAccountDetailCtrl', + size: 'lg', + resolve: { + balance: function () { + return $scope.surcharge + }, + partner: function () { + return $scope.partner + }, + transactions: [ + '$http', + function ($http) { + return $http.get('/sys/partners/' + $scope.partner.client_moniker + '/account/transactions') + }, + ], + }, + }) + .result.then( + function () { + $scope.getBalance() + }, + function () { + $scope.getBalance() + } + ) + } + $scope.allowSurchargeCredit = function (allowSurchargeCredit) { + if (!$scope.init.allow_surcharge_credit) { + $scope.init.allow_surcharge_credit = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/allow_surcharge_credit', { allow_surcharge_credit: allowSurchargeCredit }).then(function (resp) {}) + } + $scope.taxInSurcharge = function (taxInSurcharge) { + if (!$scope.init.tax_in_surcharge) { + $scope.init.tax_in_surcharge = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/tax_in_surcharge', { tax_in_surcharge: taxInSurcharge }).then(function (resp) { + $scope.getBankAccount() + }) + } + $scope.switchPreSettle = function (presettle) { + if (!$scope.init.enable_presettle) { + $scope.init.enable_presettle = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/presettle', { enable_presettle: presettle }).then(function (resp) { + $scope.getBankAccount() + }) + } + $scope.customerTaxFree = function (customerTaxFree) { + if (!$scope.init.customer_tax_free) { + $scope.init.customer_tax_free = true + return + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/customer_tax_free', { customer_tax_free: customerTaxFree }).then(function (resp) { + $scope.getBankAccount() + }) + } + $scope.settleHours = [{ value: undefined, label: 'Default(24:00, GMT+10)' }] + for (var h = 24; h > 0; h--) { + $scope.settleHours.push({ value: h, label: ('00' + h).substr(-2) + ':00, ' + $scope.partner.timezone }) + } + $scope.settleHourConfig = function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/settle_hour', { hour: $scope.partner.settle_hour || null }).then( + function () { + commonDialog.alert({ type: 'success', title: 'OK', content: 'Settle Hour configured' }) + }, + function (resp) { + commonDialog.alert({ type: 'error', title: 'Error', content: resp.data.message }) + } + ) + } + $scope.getBankInfo = function (bsb_no) { + if (bsb_no != null && bsb_no !== '') { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/bank_account/bank_info/' + bsb_no).then(function (resp) { + $scope.bankInfo = resp.data + $scope.bankaccount.bank = $scope.bankInfo.bank + $scope.bankaccount.city = $scope.bankInfo.city + $scope.bankaccount.address = $scope.bankInfo.address + $scope.bankaccount.system = $scope.bankInfo.system + $scope.bankaccount.postcode = $scope.bankInfo.postcode + $scope.bankaccount.state = $scope.bankInfo.state + $scope.bankaccount.branch = $scope.bankInfo.branch + }) } else { - $scope.loadTradeLogs(1); + commonDialog.alert({ title: 'Error', content: '请先填写BSB No', type: 'error' }) } - $scope.checkSubClientChoseShow = function (client) { - $scope.more20ChoseSubClient = !$scope.more20ChoseSubClient; - if (client != '') { - $scope.choseSubClientNow = client.short_name; - } + } + $scope.getRates() + $scope.saveBankAccount = function () { + if (isNaN($scope.bankaccount.account_no)) { + alert('Account No应输入数字!') + return } - $scope.clickDisplayChoseDiv = function (event) { - $scope.more20ChoseSubClient = false; - } - $scope.choseDivStopPropagation = function (event) { - event.stopPropagation() - }; - }]); - app.controller('partnerPluginsCtrl', ['$scope', '$uibModal', function ($scope, $uibModal) { - $scope.configRedpack = function () { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/redpack_config.html', - controller: 'partnerRedpackConfigDialogCtrl', - size: 'lg', - resolve: { - partner: function () { - return $scope.partner; - }, - config: ['$http', function ($http) { - return $http.get('/sys/redpack/partners/' + $scope.partner.client_moniker); - }] - } - }) - }; - $scope.redpackLogs = function () { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/redpack_logs.html', - controller: 'partnerRedpackLogDialogCtrl', - size: 'lg', - resolve: { - partner: function () { - return $scope.partner; - } - } - }) + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/bank_account', $scope.bankaccount).then( + function () { + $scope.getBankAccount() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + $scope.newCardPaymentRates = function () { + $uibModal + .open({ + templateUrl: '/static/payment/partner/templates/partner_new_card_payment_rate.html', + controller: 'newCardPaymentRateDialogCtrl', + resolve: { + sys_common_rate: function () { + return $http.get('/sys/partners/sys_card_rates') + }, + clientMoniker: function () { + return $scope.partner.client_moniker + }, + cost_rate_channel: function () { + return $scope.cost_rate_channel + }, + }, + }) + .result.then(function () { + $scope.getRates() + }) + } + $scope.newRate = function () { + var name = $scope.bankCtrl.rate_name + $uibModal + .open({ + templateUrl: '/static/payment/partner/templates/partner_new_rate.html', + controller: 'newRateDialogCtrl', + resolve: { + rate: function () { + return { rate_name: name, clean_days: 3 } + }, + sys_common_rate: function () { + return $http.get('/sys/partners/sys_rates') + }, + clientMoniker: function () { + return $scope.partner.client_moniker + }, + }, + }) + .result.then(function () { + $scope.getRates() + }) + } + $scope.editRate = function (rate) { + $uibModal + .open({ + templateUrl: '/static/payment/partner/templates/rate_config_dialog.html', + controller: 'rateConfigDialogCtrl', + resolve: { + rate: function () { + return rate + }, + clientMoniker: function () { + return $scope.partner.client_moniker + }, + }, + }) + .result.then(function () { + $scope.getRates() + }) + } + + $scope.complianceCheck = function () { + if (!$rootScope.complianceCheck) { + $rootScope.complianceCheck = {} } - }]); - app.controller('partnerDeviceCtrl', ['$scope', '$http', 'orderService', 'commonDialog', 'refunder', '$uibModal', function ($scope, $http, orderService, commonDialog, refunder, $uibModal) { - - $scope.pagination = {}; - /** - * 查看设备 - * @param page - */ - $scope.listDevices = function (page) { - var params = angular.copy($scope.devsearch) || {}; - params.page = page || $scope.pagination.page || 1; - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/devices', { params: params }).then(function (resp) { - $scope.pagination = resp.data.pagination; - $scope.devices = resp.data.data; - }) - }; - $scope.listDevices(1); - - /** - * 添加设备 - */ - $scope.addDevice = function () { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/add_device.html', - controller: 'newDeviceDialogCtrl', - resolve: { - clientMoniker: function () { - return $scope.partner.client_moniker; - } - } - }).result.then(function () { - $scope.listDevices(1); - }) - }; - - $scope.showDeviceOrders = function (dev) { - $scope.params.dev_id = dev.dev_id; - $scope.listOrders(1); - }; - $scope.modifyRemark = function (dev) { - commonDialog.inputText({ title: 'Input New Remark of device' }).then(function (text) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/devices/' + dev.dev_id, { remark: text }).then(function () { - $scope.listDevices(); - }, function (resp) { - commonDialog.alert({ title: 'Update remark failed', content: resp.data.message, type: 'error' }); - }) - }) - }; - $scope.disableDevice = function (dev) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/devices/' + dev.dev_id + '/enable', { enable: false }).then(function () { - $scope.listDevices() - }, function (resp) { - commonDialog.alert({ title: 'Failed to disable device', content: resp.data.message, type: 'error' }); - }); - }; - $scope.enableDevice = function (dev) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/devices/' + dev.dev_id + '/enable', { enable: true }).then(function () { - $scope.listDevices() - }, function (resp) { - commonDialog.alert({ title: 'Failed to enable device', content: resp.data.message, type: 'error' }); - }); - }; - $scope.orderPagination = {}; - $scope.today = new Date(); - $scope.chooseToday = function () { - $scope.params.datefrom = $scope.params.dateto = new Date(); - $scope.loadTradeLogs(1); - }; - $scope.chooseYesterday = function () { - var yesterday = new Date(); - yesterday.setDate(yesterday.getDate() - 1); - $scope.params.datefrom = $scope.params.dateto = yesterday; - $scope.loadTradeLogs(1); - }; - $scope.chooseLast7Days = function () { - $scope.params.dateto = new Date(); - var day = new Date(); - day.setDate(day.getDate() - 7); - $scope.params.datefrom = day; - $scope.loadTradeLogs(1); - }; - $scope.thisMonth = function () { - $scope.params.dateto = new Date(); - var monthBegin = new Date(); - monthBegin.setDate(1); - $scope.params.datefrom = monthBegin; - $scope.loadTradeLogs(1); - }; - $scope.lastMonth = function () { - var monthFinish = new Date(); - monthFinish.setDate(0); - $scope.params.dateto = monthFinish; - var monthBegin = new Date(); - monthBegin.setDate(0); - monthBegin.setDate(1); - $scope.params.datefrom = monthBegin; - $scope.loadTradeLogs(1); - }; - $scope.listOrders = function (page) { - var params = angular.copy($scope.params) || {}; - if (params.datefrom) { - params.datefrom = $filter('date')(params.datefrom, 'yyyyMMdd'); - } - if (params.dateto) { - params.dateto = $filter('date')(params.dateto, 'yyyyMMdd'); - } - params.gateway = [0, 1]; - params.page = page || $scope.orderPagination.page || 1; - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/trade_logs', { params: params }).then(function (resp) { - $scope.orders = resp.data.data; - $scope.orderPagination = resp.data.pagination; - $scope.analysis = resp.data.analysis; - }); - }; - $scope.listOrders(1); - $scope.orderDetail = function (order) { - orderService.managerOrderDetail(order) - }; - $scope.refundOrder = function (order) { - refunder.refunded(order.order_id) - }; - }]); - app.controller('partnerRedpackConfigDialogCtrl', ['$scope', '$http', 'partner', 'config', function ($scope, $http, partner, config) { - $scope.config = config.data; - if (!Object.keys($scope.config).length) { - $scope.config = { min_payment: 0, min_amount: 1, max_amount: 1, daily_limit: 1, enabled: false }; - } - $scope.saveRedpackConfig = function (form) { - $scope.errmsg = null; - if (form.$invalid) { - angular.forEach(form, function (item, key) { - if (key.indexOf('$') < 0) { - item.$dirty = true; - } - }); - return; - } - var config = angular.copy($scope.config); - $http.put('/sys/redpack/partners/' + partner.client_moniker, config).then(function () { - $scope.$close(); - }, function (resp) { - $scope.errmsg = resp.data.message; - }) - }; - }]); - app.controller('rateConfigDialogCtrl', ['$scope', '$http', 'rate', 'clientMoniker', function ($scope, $http, rate, clientMoniker) { - $scope.rate = angular.copy(rate); - $scope.ctrl = { sending: false }; - $scope.saveRate = function () { - $scope.errmsg = null; - $scope.ctrl.sending = true; - if ($scope.rate.client_rate_id) { - $http.put('/sys/partners/' + clientMoniker + '/rates/' + $scope.rate.client_rate_id, $scope.rate).then(function () { - $scope.ctrl.sending = false; - $scope.$close(); - }, function (resp) { - $scope.ctrl.sending = false; - $scope.errmsg = resp.data.message; - }); - } else { - $http.post('/sys/partners/' + clientMoniker + '/rates', $scope.rate).then(function () { - $scope.ctrl.sending = false; - $scope.$close(); - }, function (resp) { - $scope.ctrl.sending = false; - $scope.errmsg = resp.data.message; - }); - } + $rootScope.complianceCheck.client_id = $scope.partner.client_id + $rootScope.complianceCheck.bankAccount = true + } + $scope.complianceChangeCheck = function () { + if ($rootScope.complianceCheck) { + if ($scope.partner.client_id != $rootScope.complianceCheck.client_id) { + delete $rootScope.complianceCheck + } } - }]); - app.controller('newDeviceDialogCtrl', ['$scope', '$http', 'clientMoniker', function ($scope, $http, clientMoniker) { - $scope.save = function (form) { - $scope.errmsg = null; - if (form.$invalid) { - angular.forEach(form, function (item, key) { - if (key.indexOf('$') < 0) { - item.$dirty = true; - } - }); - return; - } - $http.post('/sys/partners/' + clientMoniker + '/add_device', $scope.device).then(function () { - $scope.$close(); - }, function (resp) { - $scope.errmsg = resp.data.message; - }) - }; - - }]); - app.controller('partnerChooseBDUserDialogCtrl', ['$scope', '$http', '$filter', 'partner', 'bdUsers', 'type', function ($scope, $http, $filter, partner, bdUsers, type) { - $scope.bdUsers = bdUsers.data; - $scope.data = {}; - $scope.params = {}; - - $scope.chooseOrg = {}; - $scope.chooseOrg.org_name = null; - if (($scope.currentUser.role & parseInt('1000011', 2)) > 0 && !$scope.currentUser.org_id) { - /* $scope.showOrg = 'Organization';*/ - $http.get('/sys/orgs', { params: {} }).then(function (resp) { - $scope.orgs = resp.data; - }); - } - - $scope.loadOrgs = function () { - var params = angular.copy($scope.params); - $http.get('/sys/orgs/orgChild', { params: params }).then(function (resp) { - $scope.orgs_child = resp.data; - }) - }; - - /* $scope.chooseOrgFun = function (org) { - if (org == 'all') { - $scope.chooseOrg.org_name = null; - $scope.showOrg = 'All' - } else { - $scope.chooseOrg.org_name = org.name; - $scope.showOrg = org.name; - $scope.params.org_id = org.org_id; - $scope.loadOrgs(); + } + $scope.complianceChangeCheck() + }, + ]) + app.controller('surchargeAccountDetailCtrl', [ + '$scope', + '$http', + 'balance', + 'partner', + 'transactions', + 'commonDialog', + function ($scope, $http, balance, partner, transactions, commonDialog) { + $scope.surcharge = angular.copy(balance) + $scope.surchargeDetailData = angular.copy(transactions.data) + $scope.partner = angular.copy(partner) + $scope.canAddDetail = false + $scope.params = {} + + $scope.getBalance = function () { + if ($scope.partner.surcharge_mode != undefined && $scope.partner.surcharge_mode == 'distributed') { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/surcharge_account').then(function (resp) { + $scope.surcharge = resp.data + }) + } + } + + $scope.getTransactions = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/account/transactions').then(function (resp) { + $scope.surchargeDetailData = resp.data + }) + } + + $scope.addDetail = function () { + $scope.canAddDetail = true + } + + $scope.cancel = function () { + $scope.canAddDetail = false + $scope.params = {} + } + $scope.save = function () { + $http + .post('/sys/partners/' + $scope.partner.client_moniker + '/account/save', { + amount: $scope.params.amount, + remark: $scope.params.remark, + }) + .then( + function (resp) { + $scope.getTransactions() + $scope.getBalance() + $scope.canAddDetail = false + $scope.params = {} + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + }, + ]) + app.controller('newCardPaymentRateDialogCtrl', [ + '$scope', + '$http', + 'sys_common_rate', + 'clientMoniker', + function ($scope, $http, sys_common_rate, clientMoniker) { + $scope.rate = {} + $scope.card_payment_normal = true + $scope.card_payment_switch_title = 'Direct Debit' + $scope.card_payment = [ + { + type: 'rpaypmt_card', + title: 'Card Payment', + }, + { + type: 'rpaypmt_dd', + title: 'Direct Debit', + }, + ] + $scope.cardRateConfig = $scope.card_payment[0] + $scope.switchCardRateConfig = function () { + $scope.card_payment_normal = !$scope.card_payment_normal + $scope.rate = {} + if ($scope.card_payment_normal) { + $scope.cardRateConfig = $scope.card_payment[0] + $scope.card_payment_switch_title = 'Direct Debit' + } else { + $scope.cardRateConfig = $scope.card_payment[1] + $scope.card_payment_switch_title = 'Card Payment' + } + } + $scope.sysRateConfig = angular.copy(sys_common_rate.data) + $scope.ctrl = { sending: false } + $scope.saveRate = function (form) { + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true + } + }) + return + } + $scope.errmsg = null + $scope.ctrl.sending = true + $scope.rate.type = $scope.cardRateConfig.type + $http.post('/sys/partners/' + clientMoniker + '/rates', $scope.rate).then( + function () { + $scope.ctrl.sending = false + $scope.$close() + }, + function (resp) { + $scope.ctrl.sending = false + $scope.errmsg = resp.data.message + } + ) + } + $scope.changeDays = function () { + if ($scope.rate.clean_days && $scope.card_payment_normal) { + switch ($scope.rate.clean_days) { + case '1': { + $scope.rate.rate_value = parseFloat($scope.sysRateConfig.t1.domestic_rate) + $scope.rate.transaction_fee = parseFloat($scope.sysRateConfig.t1.transaction_fee) + break + } + case '2': { + $scope.rate.rate_value = parseFloat($scope.sysRateConfig.t2.domestic_rate) + $scope.rate.transaction_fee = parseFloat($scope.sysRateConfig.t2.transaction_fee) + break + } + case '3': { + $scope.rate.rate_value = parseFloat($scope.sysRateConfig.t3.domestic_rate) + $scope.rate.transaction_fee = parseFloat($scope.sysRateConfig.t3.transaction_fee) + break + } + } + } + } + }, + ]) + app.controller('newRateDialogCtrl', [ + '$scope', + '$http', + 'rate', + 'sys_common_rate', + 'clientMoniker', + function ($scope, $http, rate, sys_common_rate, clientMoniker) { + $scope.rate = angular.copy(rate) + $scope.sysRateConfig = angular.copy(sys_common_rate.data) + $scope.ctrl = { sending: false } + $scope.saveRate = function (form) { + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true + } + }) + return + } + $scope.errmsg = null + $scope.ctrl.sending = true + $http.post('/sys/partners/' + clientMoniker + '/rates', $scope.rate).then( + function () { + $scope.ctrl.sending = false + $scope.$close() + }, + function (resp) { + $scope.ctrl.sending = false + $scope.errmsg = resp.data.message + } + ) + } + $scope.changeDays = function () { + if ($scope.rate.clean_days) { + switch ($scope.rate.clean_days) { + case '1': { + $scope.rate.wechat_rate_value = parseFloat($scope.sysRateConfig.t1.Wechat) + $scope.rate.alipay_rate_value = parseFloat($scope.sysRateConfig.t1.Alipay) + $scope.rate.alipayonline_rate_value = parseFloat($scope.sysRateConfig.t1.AlipayOnline) + $scope.rate.Rpay_rate_value = parseFloat($scope.sysRateConfig.t1.Rpay) + $scope.rate.transaction_fee = 0 + break + } + case '2': { + $scope.rate.wechat_rate_value = parseFloat($scope.sysRateConfig.t2.Wechat) + $scope.rate.alipay_rate_value = parseFloat($scope.sysRateConfig.t2.Alipay) + $scope.rate.alipayonline_rate_value = parseFloat($scope.sysRateConfig.t2.AlipayOnline) + $scope.rate.Rpay_rate_value = parseFloat($scope.sysRateConfig.t2.Rpay) + $scope.rate.transaction_fee = 0 + break + } + case '3': { + $scope.rate.wechat_rate_value = parseFloat($scope.sysRateConfig.t3.Wechat) + $scope.rate.alipay_rate_value = parseFloat($scope.sysRateConfig.t3.Alipay) + $scope.rate.alipayonline_rate_value = parseFloat($scope.sysRateConfig.t3.AlipayOnline) + $scope.rate.Rpay_rate_value = parseFloat($scope.sysRateConfig.t3.Rpay) + $scope.rate.transaction_fee = 0 + break + } + } + } + } + }, + ]) + app.controller('partnerAccountsCtrl', [ + '$scope', + '$http', + '$uibModal', + 'commonDialog', + function ($scope, $http, $uibModal, commonDialog) { + $scope.partnerRoles = partnerRoles + $scope.loadPartnerAccounts = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/accounts').then(function (resp) { + $scope.accounts = resp.data + }) + } + $scope.loadPartnerAccounts() + $scope.addAccount = function () { + $uibModal + .open({ + templateUrl: '/static/payment/partner/templates/add_partner_account_dialog.html', + controller: 'partnerAddAccountDialogCtrl', + backdrop: false, + resolve: { + partner: function () { + return $scope.partner + }, + }, + }) + .result.then(function () { + $scope.loadPartnerAccounts() + }) + } + $scope.updateAccountRole = function (account) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/accounts/' + account.account_id + '/role', { role: account.role }).then( + function () {}, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + $scope.resetPwd = function (account) { + $uibModal + .open({ + templateUrl: '/static/payment/partner/templates/partner_account_reset_pwd_dialog.html', + controller: 'partnerResetPwdDialogCtrl', + backdrop: false, + size: 'sm', + resolve: { + partner: function () { + return $scope.partner + }, + account: function () { + return account + }, + }, + }) + .result.then(function () { + commonDialog.alert({ title: 'Success!', content: 'Password Changed Successfully', type: 'success' }) + }) + } + $scope.disableAccount = function (account) { + commonDialog + .confirm({ + title: 'Confirm Operation', + content: 'Are you sure to disable account ' + account.display_name + ' ?', + }) + .then(function () { + $http.delete('/sys/partners/' + $scope.partner.client_moniker + '/accounts/' + account.account_id).then( + function () { + $scope.loadPartnerAccounts() + }, + function (resp) { + commonDialog.alert({ title: 'Fail!', content: resp.data.message, type: 'error' }) } - };*/ - - function initBD() { - $http.get('/sys/partners/' + partner.client_moniker + '/bd_user/current').then(function (resp) { - var choooseBD = resp.data; - choooseBD.forEach(function (e) { - $scope.bdUsers.forEach(function (m) { - if (m.manager_id == e.bd_id) { - m.choose = true; - m.proportion = e.proportion; - /* $scope.chooseOrgFun({org_id: m.org_id, name: m.org_name});*/ - if (($scope.currentUser.role & parseInt('1000000000000', 2)) > 0) { - $scope.params.org_ids = m.org_id; - $scope.params.org_id = m.org_id; - $scope.loadOrgs(); - } else { - $scope.params.org_id = m.org_id; - $scope.loadOrgs(); - } - } - }); - }); - $scope.data.start_date = new Date(choooseBD[0].start_date); - }) + ) + }) + } + }, + ]) + app.controller('partnerAddAccountDialogCtrl', [ + '$scope', + '$http', + 'partner', + function ($scope, $http, partner) { + $scope.account = { role: 1 } + $scope.partnerRoles = partnerRoles + $scope.account.nation_code = 61 + $scope.saveAccount = function (form) { + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true + } + }) + return } - - if (type == 'edit') { - initBD(); + if ($scope.account.pwd && $scope.account.pwd.length < 8) { + $scope.errmsg = 'Password length must more than 8 !' + return } - - $scope.saveBD = function () { - $scope.data.users = []; - $scope.bdUsers.forEach(function (e) { - if (e.choose) { - $scope.data.users.push(e); - } - }); - - if ($scope.data.users.length == 0) { - $scope.errmsg = "请选择至少一位BD"; - } else if ($scope.data.start_date == undefined) { - $scope.errmsg = "执行开始日期不能为空"; - } else { - var isValid = true; - var total = 0; - $scope.data.users.forEach(function (e) { - if (e.proportion == undefined) { - $scope.errmsg = "绩效比例不能为空"; - isValid = false; - return; - } else if (e.proportion < 0.01 || e.proportion > 1) { - $scope.errmsg = "绩效比例无效"; - isValid = false; - return; - } - total += e.proportion; - if (total > 1) { - $scope.errmsg = "总比例不能超过1"; - isValid = false; - return; - } - }); - // if (total != 1) { - // $scope.errmsg = "Total proportion must be 1"; - // isValid = false; - // return; - // } - if (isValid) { - $scope.errmsg = null; - $scope.data.type = type; - var chooseUsers = angular.copy($scope.data); - chooseUsers.start_date = $scope.data.start_date; - if (chooseUsers.start_date) { - chooseUsers.start_date = $filter('date')(chooseUsers.start_date, 'yyyyMMdd'); - } - $http.put('/sys/partners/' + partner.client_moniker + '/bd_user', $scope.data).then(function () { - $scope.$close(); - }, function (resp) { - $scope.errmsg = resp.data.message; - }) - } - - } + var regex = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/ + if ($scope.account.pwd && !regex.test($scope.account.pwd)) { + $scope.errmsg = 'The password needs to consist of 8-16 digits and letters !' + return } - }]); - app.controller('partnerRedpackLogDialogCtrl', ['$scope', '$http', 'partner', function ($scope, $http, partner) { - $scope.pagination = {}; - $scope.queryParams = {}; - $scope.listRedpackLogs = function (page) { - var params = angular.copy($scope.queryParams); - params.page = page || $scope.pagination.page || 1; - $http.get('/sys/redpack/partners/' + partner.client_moniker + '/logs', { params: params }).then(function (resp) { - $scope.logs = resp.data.data; - $scope.pagination = resp.data.pagination; - }) - }; - $scope.listRedpackLogs(1); - }]); - app.controller('partnerAuthFileCtrl', ['$scope', '$http', '$rootScope', 'commonDialog', '$state', function ($scope, $http, $rootScope, commonDialog, $state) { - if ($state.params.commitType == 'card-payment') { - $state.go('partners.detail.files.MW_files'); + $scope.errmsg = null + $http.post('/sys/partners/' + partner.client_moniker + '/accounts', $scope.account).then( + function () { + $scope.$close() + }, + function (resp) { + $scope.errmsg = resp.data.message + } + ) + } + }, + ]) + app.controller('partnerResetPwdDialogCtrl', [ + '$scope', + '$http', + 'partner', + 'account', + function ($scope, $http, partner, account) { + $scope.updatePwd = function () { + $scope.errmsg = null + if ($scope.reset.pwd && $scope.reset.pwd.length < 8) { + $scope.errmsg = 'Password length must more than 8 !' + return + } + var regex = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/ + if ($scope.reset.pwd && !regex.test($scope.reset.pwd)) { + $scope.errmsg = 'The password needs to consist of 8-16 digits and letters !' + return + } + $http.put('/sys/partners/' + partner.client_moniker + '/accounts/' + account.account_id + '/pwd', { pwd: $scope.reset.pwd }).then( + function () { + $scope.$close() + }, + function (resp) { + $scope.errmsg = resp.data.message + } + ) + } + }, + ]) + app.controller('partnerNewSubPartnerDialogCtrl', [ + '$rootScope', + '$scope', + '$http', + '$state', + 'Upload', + 'commonDialog', + 'timezone', + 'clientMoniker', + 'industryMap', + 'businessStructuresMap', + 'stateMap', + 'countryMap', + 'wechatGoodMcc', + '$filter', + function ($rootScope, $scope, $http, $state, Upload, commonDialog, timezone, clientMoniker, industryMap, businessStructuresMap, stateMap, countryMap, wechatGoodMcc, $filter) { + if ($scope.partner_application) { + $scope.partner = angular.copy($scope.partner_application) + delete $rootScope.partner_application + } else { + $scope.partner = { timezone: 'Australia/Melbourne' } + } + $scope.initMerchantCode = function () { + $http.get('/sys/partners/init/merchant_code').then(function (response) { + $scope.partner.client_moniker = response.data.partner_code + $scope.merchantCodeChecked = true + $scope.merchantIsValid = true + }) + } + $scope.initMerchantCode() + $scope.partner.company_phone_c = 61 + $scope.partner.contact_phone_c = 61 + $scope.partner.client_pay_type = [] + $scope.partner.client_pay_desc = [] + $scope.merchantIsValid = false + $scope.merchantCodeChecked = false + $scope.wechatMccIndustries = wechatGoodMcc.configs() + $scope.checkExpriedate = function (value) { + if (value) { + $scope.partner.certificat_expire_date_premanent = false + $scope.partner.certificat_expire_date_NA = false + } + } + $scope.checkExpriedateOther = function (value) { + if (value == 'PERMANENT') { + if ($scope.partner.certificat_expire_date_premanent) { + $scope.partner.certificat_expire_date_NA = false + $scope.partner.certificat_expire_date_d = null + } + } else if (value == 'N/A') { + if ($scope.partner.certificat_expire_date_NA) { + $scope.partner.certificat_expire_date_premanent = false + $scope.partner.certificat_expire_date_d = null + } + } + } + var resetClientPayDescByTpey = function (type) { + type = parseInt(type) + if (type == 1) { + removeClientPayDesc($scope.partner.client_pay_desc, '10') + } + if (type == 2) { + removeClientPayDesc($scope.partner.client_pay_desc, '20') + } + } + + var compare = function (x, y) { + x = parseInt(x) + y = parseInt(y) + if (x < y) { + return -1 + } else if (x > y) { + return 1 } else { - $state.go('partners.detail.files.CP_files'); - } - }]); - app.controller('partnerCPAuthFileCtrl', ['$scope', '$http', '$rootScope', 'commonDialog', '$state', 'Upload', 'file', function ($scope, $http, $rootScope, commonDialog, $state, Upload, file) { - $scope.id_info_form = { edit: false }; - $scope.file = file.data || {}; - //audit files - $scope.uploadBankFile = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.bankFileProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - delete $scope.bankFileProgress; - $scope.file.file_bank_info = resp.data.url; - $scope.updateFile(); - if ($scope.file.file_bank_info.endsWith('pdf')) { - $scope.bankIsImage = false; - } else { - $scope.bankIsImage = true; - } - }, function (resp) { - delete $scope.bankFileProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.bankFileProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - $scope.agreeIsImage = true; - if ($scope.file.file_agreement_info && $scope.file.file_agreement_info.endsWith('pdf')) { - $scope.agreeIsImage = false; + return 0 } - $scope.bankIsImage = true; - if ($scope.file.file_bank_info && $scope.file.file_bank_info.endsWith('pdf')) { - $scope.bankIsImage = false; + } + $scope.toggleClientPayType = function (type) { + var $idx = $scope.partner.client_pay_type.indexOf(type) + if ($idx >= 0) { + $scope.partner.client_pay_type.splice($idx, 1) + resetClientPayDescByTpey(type) + } else { + $scope.partner.client_pay_type.push(type) + $scope.partner.client_pay_type.sort(compare) } - $scope.companyIsImage = true; - if ($scope.file.file_company_info && $scope.file.file_company_info.endsWith('pdf')) { - $scope.companyIsImage = false; + } + $scope.toggleClientPayDesc = function (type) { + var $idx = $scope.partner.client_pay_desc.indexOf(type) + if ($idx >= 0) { + if (type == '203') { + removeClientPayDesc($scope.partner.client_pay_desc, '2030') + } + $scope.partner.client_pay_desc.splice($idx, 1) + } else { + $scope.partner.client_pay_desc.push(type) + $scope.partner.client_pay_desc.sort(compare) } - $scope.applyIsImage = true; - if ($scope.file.file_apply_info && $scope.file.file_apply_info.endsWith('pdf')) { - $scope.applyIsImage = false; + } + $scope.business_structures = businessStructuresMap.configs() + $scope.industries = industryMap.configs() + + $scope.listReferrers = function () { + $http.get('/sys/orgs/referrer').then(function (resp) { + $scope.referrers = resp.data + }) + } + $scope.listReferrers() + + $scope.alipayMccCategory = {} + $scope.loadAlipayCategory = function () { + $http.get('/static/data/alipayMcc.json').then(function (resp) { + $scope.alipayMccCategory = resp.data + }) + } + $scope.loadAlipayCategory() + + $scope.loadJDindustry = function () { + $http.get('/static/data/jdindustry.json').then(function (resp) { + $scope.jdindustry = resp.data + }) + } + $scope.loadJDindustry() + + $scope.loadLakalaPayindustry = function () { + $http.get('/static/data/lakalapayindustry.json').then(function (resp) { + $scope.lakalapayindustry = resp.data + }) + } + $scope.loadLakalaPayindustry() + + $scope.loadLakalaPaySettle = function () { + $http.get('/static/data/lakalapaysettle.json').then(function (resp) { + $scope.lakalapaysettle = resp.data + }) + } + $scope.loadLakalaPaySettle() + + $scope.loadLakalaPayGoods = function () { + $http.get('/static/data/lakalapaygoods.json').then(function (resp) { + $scope.lakalapaygoods = resp.data + }) + } + $scope.loadLakalaPayGoods() + + $scope.loadRoyalpayindustry = function () { + $http.get('/static/data/royalpayindustry.json').then(function (resp) { + $scope.royalpayindustry = resp.data + }) + } + $scope.loadRoyalpayindustry() + + $scope.loadHfindustry = function () { + $http.get('/static/data/hfindustry.json').then(function (resp) { + $scope.hfindustry = resp.data + }) + } + $scope.loadHfindustry() + + $scope.onAlipayMccSelect = function (selectedItem) { + $scope.partner.alipay_category = selectedItem.label + $scope.partner.alipayindustry = selectedItem.mccCode + } + $scope.onRoyalPayIndustrySelect = function (selectedItem) { + $scope.partner.royalpay_label = selectedItem.label + $scope.partner.royalpayindustry = selectedItem.mccCode + } + + $scope.onHfIndustrySelect = function (selectedItem) { + $scope.partner.hf_label = selectedItem.label + $scope.partner.hfindustry = selectedItem.mccCode + } + + // $scope.t2city_map = angular.copy(t2city_map); + + $scope.partner.sameAsContactPerson = false + $scope.checkboxOnclick = function () { + $scope.partner.sameAsContactPerson = !$scope.partner.sameAsContactPerson + if ($scope.partner.sameAsContactPerson) { + $scope.partner.legal_representative_person = $scope.partner.contact_person + $scope.partner.legal_representative_phone_a = $scope.partner.contact_phone_a + $scope.partner.legal_representative_phone_c = $scope.partner.contact_phone_c + $scope.partner.legal_representative_phone_p = $scope.partner.contact_phone_p + $scope.partner.legal_representative_email = $scope.partner.contact_email + $scope.partner.legal_representative_job = $scope.partner.contact_job + $scope.partner.legal_representative_wechatid = $scope.partner.contact_wechatid } - $scope.idIsImage = true; - if ($scope.file.file_id_info && $scope.file.file_id_info.endsWith('pdf')) { - $scope.idIsImage = false; + } + + $scope.partner.marketingSameAsContact = false + $scope.checkMarketingSameAsContact = function () { + $scope.partner.marketingSameAsContact = !$scope.partner.marketingSameAsContact + if ($scope.partner.marketingSameAsContact) { + $scope.partner.marketing_person = $scope.partner.contact_person + $scope.partner.marketing_phone_a = $scope.partner.contact_phone_a + $scope.partner.marketing_phone_c = $scope.partner.contact_phone_c + $scope.partner.marketing_phone_p = $scope.partner.contact_phone_p + $scope.partner.marketing_email = $scope.partner.contact_email + $scope.partner.marketing_job = $scope.partner.contact_job + $scope.partner.marketing_wechatid = $scope.partner.contact_wechatid } - $scope.billIsImage = true; - if ($scope.file.file_company_info && $scope.file.file_company_info.endsWith('pdf')) { - $scope.billIsImage = false; + } + + $scope.partner.sameAsAddress = false + $scope.sameAddress = function () { + $scope.partner.sameAsAddress = !$scope.partner.sameAsAddress + if ($scope.partner.sameAsAddress) { + $scope.partner.registered_address = $scope.partner.address + $scope.partner.registered_suburb = $scope.partner.suburb + $scope.partner.registered_postcode = $scope.partner.postcode + $scope.partner.registered_state = $scope.partner.state + } + } + + $scope.timezones = timezone.configs() + $scope.states = stateMap.configs() + $scope.countries = countryMap.configs() + $scope.checkMerchantCodeIsValid = function (code) { + if (code.length != 4) { + $scope.merchantCodeChecked = false + $scope.merchantIsValid = false + return + } + $http.get('/sys/partners/init/check_code_isvalid', { params: { clientMoniker: code } }).then(function (response) { + $scope.merchantIsValid = response.data + $scope.merchantCodeChecked = true + }) + } + $scope.saveSubPartner = function (form) { + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true + } + }) + return + } + $scope.errmsg = null + if (!$scope.partner.business_structure || $scope.partner.business_structure == '') { + alert('Please select the business structure') + return + } + if ($scope.partner.business_structure != 'Registered body(Sole Trader)') { + if ($scope.partner.certificat_expire_date_d) { + $scope.partner.certificat_expire_date = $filter('dateConversionStr')($scope.partner.certificat_expire_date_d) + } else if ($scope.partner.certificat_expire_date_premanent) { + $scope.partner.certificat_expire_date = 'PERMANENT' + } else if ($scope.partner.certificat_expire_date_NA) { + $scope.partner.certificat_expire_date = 'N/A' + } else { + alert('Certificate expiration time is required') + return + } + } + if ($scope.partner.company_name.indexOf('Migration') != -1) { + alert('Company Name包含敏感词汇,请检查后重新提交!') + return } - //上传账单流水 - $scope.uploadBillFile = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.billFileProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - delete $scope.billFileProgress; - $scope.file.utility_bill_info = resp.data.url; - $scope.updateFile(); - if ($scope.file.utility_bill_info.endsWith('pdf')) { - $scope.billIsImage = false; - } else { - $scope.billIsImage = true; - } - }, function (resp) { - delete $scope.billFileProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.billFileProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - - $scope.uploadCompanyFile = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.companyFileProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - delete $scope.companyFileProgress; - $scope.file.file_company_info = resp.data.url; - $scope.updateFile(); - if ($scope.file.file_company_info.endsWith('pdf')) { - $scope.companyIsImage = false; - } else { - $scope.companyIsImage = true; - } - }, function (resp) { - delete $scope.companyFileProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.companyFileProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - //上传ID信息 - $scope.uploadIDFile = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.idFileProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - delete $scope.idFileProgress; - $scope.file.file_id_info = resp.data.url; - $scope.updateFile(); - if ($scope.file.file_id_info.endsWith('pdf')) { - $scope.idIsImage = false; - } else { - $scope.idIsImage = true; - } - }, function (resp) { - delete $scope.idFileProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.idFileProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - - //上传协议文件 - $scope.uploadAgreementFile = function (file) { - if (file != null) { - if (file.size > 10 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过10MB,请压缩后重试', type: 'error' }) - } else { - $scope.agreementFileProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - delete $scope.agreementFileProgress; - $scope.file.file_agreement_info = resp.data.url; - $scope.updateFile(); - if ($scope.file.file_agreement_info.endsWith('pdf')) { - $scope.agreeIsImage = false; - } else { - $scope.agreeIsImage = true; - } - }, function (resp) { - delete $scope.agreementFileProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.agreementFileProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - - //上传申请表 - $scope.uploadApplyFile = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.applyFileProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - delete $scope.applyFileProgress; - $scope.file.file_apply_info = resp.data.url; - $scope.updateFile(); - if ($scope.file.file_apply_info.endsWith('pdf')) { - $scope.applyIsImage = false; - } else { - $scope.applyIsImage = true; - } - }, function (resp) { - delete $scope.applyFileProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.applyFileProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - - } - } - }; - $scope.toggleIdTitle = function (beneficiary_id_title) { - $scope.file.beneficiary_id_title = beneficiary_id_title; - }; - $scope.saveIdInfo = function () { - if (!$scope.file.id_type) { - commonDialog.alert({ title: 'Error', content: '请选择ID Type', type: 'error' }); - return; - } - if ($scope.file.beneficiary_id_title != "Ultimate beneficiary owner") { - if (!$scope.file.other_id_title_desc) { - commonDialog.alert({ title: 'Error', content: '请简要告知为何无法提供受益股东的资料', type: 'error' }); - return; - } - } - var config = {}; - config.id_type = $scope.file.id_type; - config.beneficiary_id_title = $scope.file.beneficiary_id_title; - config.other_id_title_desc = $scope.file.other_id_title_desc; - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/id_info', config).then(function (resp) { - commonDialog.alert({ title: 'Success', content: 'Id Info Updated', type: 'success' }) - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - $state.reload(); - }); - }; - - $scope.cancelIdInfo = function () { - $state.reload(); - $scope.id_info_form.edit = false - }; - - $scope.downloadAsZip = function () { - var url = '/sys/partners/' + $scope.partner.client_moniker + '/download/complianceAsZIP'; - return url; - }; - - $scope.deleteComplianceFiles = function (file_id) { - commonDialog.confirm({ - title: 'Warning', - content: 'This operation will delete the file, Are you sure?' - }).then(function () { - $http.put('/sys/partners/auth_file/' + file_id + '/delete').then(function (resp) { - commonDialog.alert({ - title: 'Success', - content: 'Delete Successful', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - }) - }; - - - $scope.updateFile = function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/file', $scope.file).then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Upload Successful', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); + if ($scope.partner.company_phone_a && '' + $scope.partner.company_phone_a != '') { + if ($scope.partner.company_phone_a.indexOf('0') == 0) { + alert("Please remove the first character '0' of area code") + return + } + } + if ($scope.partner.contact_phone && '' + $scope.partner.contact_phone != '') { + if ($scope.partner.contact_phone.indexOf('0') == 0) { + alert("Please remove the first character '0' of area code") + return + } + } + $scope.partner.company_phone = '+' + $scope.partner.company_phone_c + ($scope.partner.company_phone_a || '') + $scope.partner.company_phone_p + $scope.partner.contact_phone = '+' + $scope.partner.contact_phone_c + ($scope.partner.contact_phone_a || '') + $scope.partner.contact_phone_p + $scope.partner.legal_representative_phone = + '+' + $scope.partner.legal_representative_phone_c + ($scope.partner.legal_representative_phone_a || '') + $scope.partner.legal_representative_phone_p + $scope.partner.marketing_phone = '+' + $scope.partner.marketing_phone_c + ($scope.partner.marketing_phone_a || '') + $scope.partner.marketing_phone_p + + if ($scope.partner.company_phone.indexOf(' ') != -1) { + alert('Company Phone can not contain space character') + return + } + if ($scope.partner.contact_phone.indexOf(' ') != -1) { + alert('Contact Phone can not contain space character') + return + } + if ($scope.partner.contact_email.indexOf(' ') != -1) { + alert('Contact email Phone can not contain space character') + return + } + if ($scope.partner.suburb.indexOf(' ') != -1) { + alert('suburb can not contain two and more continuous space characters') + return + } + if ($scope.partner.acn && $scope.partner.business_structure == 'Company') { + if ($scope.partner.acn.length != 9) { + alert('Acn is not valid') + return + } + } + // if (!$scope.partner.logo_url) { + // alert("Logo is necessary!"); + // return; + // } + if ($scope.partner.client_pay_type.indexOf('2') >= 0) { + if (!$scope.partner.company_photo) { + alert('Shop Photo1 is necessary') + return + } + if (!$scope.partner.store_photo) { + alert('Shop Photo2 is necessary') + return + } + } + // if(!window.frames['merchant_detail'].merchant_location){ + // alert("Please Locate Merchant Location!"); + // return; + // } + if ($scope.partner.client_pay_type.length == 0) { + alert('请选择商户支付场景') + return + } + if ($scope.partner.client_pay_desc.length == 0) { + alert('请选择商户支付方式') + return + } + if ($scope.partner.client_pay_type.indexOf('1') >= 0) { + if ($scope.partner.client_pay_desc.join(',').indexOf('10') < 0) { + alert('请检查线上支付场景是否已选择支付方式') + return + } + } + if ($scope.partner.client_pay_type.indexOf('2') >= 0) { + if ($scope.partner.client_pay_desc.join(',').indexOf('20') < 0) { + alert('请检查线下支付场景是否已选择支付方式') + return + } + } + if ($scope.partner.client_pay_desc.join(',').indexOf('203') >= 0) { + if ($scope.partner.client_pay_desc.join(',').indexOf('2030') < 0 && $scope.partner.client_pay_desc.join(',').indexOf('20399') < 0) { + alert('请检查线下支付是否已选择收银系统类型') + return + } + } + $scope.partner.client_pay_type = $scope.partner.client_pay_type.join(',') + $scope.partner.client_pay_desc = $scope.partner.client_pay_desc.join(',') + $http.post('/sys/partners/' + clientMoniker + '/sub_clients', $scope.partner).then( + function () { + $scope.updateMerchantLocation() + $scope.$close() + }, + function (resp) { + $scope.errmsg = resp.data.message + $scope.partner.client_pay_type = $scope.partner.client_pay_type.split(',') + $scope.partner.client_pay_desc = $scope.partner.client_pay_desc.split(',') + } + ) + } + $scope.uploadLogo = function (file) { + if (file != null) { + if (file.size > 1 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过1MB,请压缩后重试', type: 'error' }) + } else { + $scope.logoProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + delete $scope.logoProgress + $scope.partner.logo_id = resp.data.fileid + $scope.partner.logo_url = resp.data.url + }, + function (resp) { + delete $scope.logoProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.logoProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + + $scope.uploadShopPhoto = function (file) { + if (file != null) { + if (file.size > 2 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error' }) + } else { + $scope.shopPhotoProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + delete $scope.shopPhotoProgress + $scope.partner.company_photo = resp.data.url + }, + function (resp) { + delete $scope.shopPhotoProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.shopPhotoProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + + $scope.uploadStorePhoto = function (file) { + if (file != null) { + if (file.size > 2 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error' }) + } else { + $scope.storePhotoProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + delete $scope.storePhotoProgress + $scope.partner.store_photo = resp.data.url + }, + function (resp) { + delete $scope.storePhotoProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.storePhotoProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + $scope.updateMerchantLocation = function () { + var params = window.frames['merchant_detail'].merchant_location + if (params) { + $http.put('/sys/partners/modify/' + $scope.partner.client_moniker + '/location', params).then(function () {}) + } + } + }, + ]) + app.controller('partnerPayLogCtrl', [ + '$scope', + '$http', + '$filter', + 'refunder', + 'orderService', + function ($scope, $http, $filter, refunder, orderService) { + $scope.params = { status: 'PAID', channel: 'ALL', textType: 'all', datefrom: new Date(), dateto: new Date() } + $scope.pagination = {} + $scope.isAll = true + $scope.isLevel3All = true + $scope.clients = [$scope.partner] + $scope.showLevel3Clients = false + $scope.subClientTable1 = [$scope.partner] + $scope.subClientTable2 = [] + $scope.choseSubClientNow = 'More' + $scope.more20ChoseSubClient = false + $scope.subSearchText = '' + + $scope.today = new Date() + $scope.chooseToday = function () { + $scope.params.datefrom = $scope.params.dateto = new Date() + $scope.loadTradeLogs(1) + } + $scope.chooseYesterday = function () { + var yesterday = new Date() + yesterday.setDate(yesterday.getDate() - 1) + $scope.params.datefrom = $scope.params.dateto = yesterday + $scope.loadTradeLogs(1) + } + $scope.chooseLast7Days = function () { + $scope.params.dateto = new Date() + var day = new Date() + day.setDate(day.getDate() - 7) + $scope.params.datefrom = day + $scope.loadTradeLogs(1) + } + $scope.thisMonth = function () { + $scope.params.dateto = new Date() + var monthBegin = new Date() + monthBegin.setDate(1) + $scope.params.datefrom = monthBegin + $scope.loadTradeLogs(1) + } + $scope.lastMonth = function () { + var monthFinish = new Date() + monthFinish.setDate(0) + $scope.params.dateto = monthFinish + var monthBegin = new Date() + monthBegin.setDate(0) + monthBegin.setDate(1) + $scope.params.datefrom = monthBegin + $scope.loadTradeLogs(1) + } + $scope.loadTradeLogs = function (page) { + var params = angular.copy($scope.params) + if (params.datefrom) { + params.datefrom = $filter('date')(params.datefrom, 'yyyyMMdd') + } + if (params.dateto) { + params.dateto = $filter('date')(params.dateto, 'yyyyMMdd') + } + params.page = page || $scope.pagination.page || 1 + if (params.gateway) { + if (params.gateway.sort().toString() != [0, 1].toString() && params.gateway.sort().toString() != [5, 6].toString()) { + delete params.gatewayChilds + delete params.gatewayChild + } + if (params.gatewayChilds) { + var exist = false + params.gatewayChilds.forEach(function (child) { + if (child == params.gatewayChild) { + exist = true + } }) + if (!exist) { + params.gatewayChild = null + } + } else { + delete params.gatewayChild + } + } else { + delete params.gatewayChilds + delete params.gatewayChild + } + if ($scope.isAll) { + delete params.client_ids + } + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/trade_logs', { params: params }).then(function (resp) { + $scope.tradeLogs = resp.data.data + $scope.pagination = resp.data.pagination + $scope.analysis = resp.data.analysis + }) + } + + $scope.initGatewayChild = function () { + $scope.params.gatewayChilds = $scope.params.gateway + $scope.params.gatewayChild = null + $scope.loadTradeLogs(1) + } + $scope.gatewaySelected = function (arr) { + return ( + $scope.params.gateway != null && + $scope.params.gateway.filter(function (gateway) { + return arr.indexOf(gateway) >= 0 + }).length > 0 + ) + } + + $scope.showRefundLog = function (orderId) { + refunder.refunded(orderId) + } + $scope.newRefund = function (orderId) { + refunder.refund(orderId).then(function () { + $scope.loadTradeLogs() + }) + } + $scope.showTradeDetail = function (order) { + orderService.managerOrderDetail(order) + } + $scope.$on('order_refunded', function () { + $scope.loadTradeLogs() + }) + $scope.chooseClient = function (client) { + if (client == 'all') { + $scope.choseSubClientNow = 'More' + $scope.params.client_ids = angular.copy($scope.clientIds) + $scope.isAll = true + $scope.chooseClientId = '' + $scope.showLevel3Clients = false + } else if (client.level3Clients) { + $scope.chooseClientId = client.client_id + $scope.showLevel3Clients = true + $scope.level3Clients = client.level3Clients + $scope.isAll = false + $scope.level3ClientIds = [] + $scope.level3ClientIds.push(client.client_id) + client.level3Clients.forEach(function (client) { + $scope.level3ClientIds.push(client.client_id) + }) + $scope.chooseLevel3Client('all') + return + } else { + $scope.chooseClientId = client.client_id + $scope.params.client_ids = [client.client_id] + $scope.isAll = false + $scope.showLevel3Clients = false } + $scope.loadTradeLogs() + } + $scope.chooseLevel3Client = function (client) { + if (client == 'all') { + $scope.params.client_ids = angular.copy($scope.level3ClientIds) + $scope.isLevel3All = true + $scope.chooseLevel3ClientId = '' + } else { + $scope.chooseLevel3ClientId = client.client_id + $scope.params.client_ids = [client.client_id] + $scope.isLevel3All = false + } + $scope.loadTradeLogs() + } + $scope.searchSubClients = function (subSearchText, page) { + $scope.subClientTable1 = [$scope.partner] + $scope.subClientTable2 = [] + var params = {} + params.page = page || $scope.subClientPagination.page || 1 + if (subSearchText != '') { + $scope.subSearchText = subSearchText + params.searchText = subSearchText + } + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/sub_clients/page', { params: params }).then(function (resp) { + var clientList = resp.data.data + $scope.subClientPagination = resp.data.pagination + clientList.forEach(function (client) { + if ($scope.subClientTable1.length < 11) { + $scope.subClientTable1.push(client) + } else { + $scope.subClientTable2.push(client) + } + $scope.clients.push(client) + }) + }) + } + + if ($scope.partner.has_children && !$scope.partner.hide_sub_mch) { + $scope.searchSubClients('', 1) + $scope.loadTradeLogs(1) + } else { + $scope.loadTradeLogs(1) + } + $scope.checkSubClientChoseShow = function (client) { + $scope.more20ChoseSubClient = !$scope.more20ChoseSubClient + if (client != '') { + $scope.choseSubClientNow = client.short_name + } + } + $scope.clickDisplayChoseDiv = function (event) { + $scope.more20ChoseSubClient = false + } + $scope.choseDivStopPropagation = function (event) { + event.stopPropagation() + } + }, + ]) + app.controller('partnerPluginsCtrl', [ + '$scope', + '$uibModal', + function ($scope, $uibModal) { + $scope.configRedpack = function () { + $uibModal.open({ + templateUrl: '/static/payment/partner/templates/redpack_config.html', + controller: 'partnerRedpackConfigDialogCtrl', + size: 'lg', + resolve: { + partner: function () { + return $scope.partner + }, + config: [ + '$http', + function ($http) { + return $http.get('/sys/redpack/partners/' + $scope.partner.client_moniker) + }, + ], + }, + }) + } + $scope.redpackLogs = function () { + $uibModal.open({ + templateUrl: '/static/payment/partner/templates/redpack_logs.html', + controller: 'partnerRedpackLogDialogCtrl', + size: 'lg', + resolve: { + partner: function () { + return $scope.partner + }, + }, + }) + } + }, + ]) + app.controller('partnerDeviceCtrl', [ + '$scope', + '$http', + 'orderService', + 'commonDialog', + 'refunder', + '$uibModal', + function ($scope, $http, orderService, commonDialog, refunder, $uibModal) { + $scope.pagination = {} + /** + * 查看设备 + * @param page + */ + $scope.listDevices = function (page) { + var params = angular.copy($scope.devsearch) || {} + params.page = page || $scope.pagination.page || 1 + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/devices', { params: params }).then(function (resp) { + $scope.pagination = resp.data.pagination + $scope.devices = resp.data.data + }) + } + $scope.listDevices(1) + + /** + * 添加设备 + */ + $scope.addDevice = function () { + $uibModal + .open({ + templateUrl: '/static/payment/partner/templates/add_device.html', + controller: 'newDeviceDialogCtrl', + resolve: { + clientMoniker: function () { + return $scope.partner.client_moniker + }, + }, + }) + .result.then(function () { + $scope.listDevices(1) + }) + } + + $scope.showDeviceOrders = function (dev) { + $scope.params.dev_id = dev.dev_id + $scope.listOrders(1) + } + $scope.modifyRemark = function (dev) { + commonDialog.inputText({ title: 'Input New Remark of device' }).then(function (text) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/devices/' + dev.dev_id, { remark: text }).then( + function () { + $scope.listDevices() + }, + function (resp) { + commonDialog.alert({ title: 'Update remark failed', content: resp.data.message, type: 'error' }) + } + ) + }) + } + $scope.disableDevice = function (dev) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/devices/' + dev.dev_id + '/enable', { enable: false }).then( + function () { + $scope.listDevices() + }, + function (resp) { + commonDialog.alert({ title: 'Failed to disable device', content: resp.data.message, type: 'error' }) + } + ) + } + $scope.enableDevice = function (dev) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/devices/' + dev.dev_id + '/enable', { enable: true }).then( + function () { + $scope.listDevices() + }, + function (resp) { + commonDialog.alert({ title: 'Failed to enable device', content: resp.data.message, type: 'error' }) + } + ) + } + $scope.orderPagination = {} + $scope.today = new Date() + $scope.chooseToday = function () { + $scope.params.datefrom = $scope.params.dateto = new Date() + $scope.loadTradeLogs(1) + } + $scope.chooseYesterday = function () { + var yesterday = new Date() + yesterday.setDate(yesterday.getDate() - 1) + $scope.params.datefrom = $scope.params.dateto = yesterday + $scope.loadTradeLogs(1) + } + $scope.chooseLast7Days = function () { + $scope.params.dateto = new Date() + var day = new Date() + day.setDate(day.getDate() - 7) + $scope.params.datefrom = day + $scope.loadTradeLogs(1) + } + $scope.thisMonth = function () { + $scope.params.dateto = new Date() + var monthBegin = new Date() + monthBegin.setDate(1) + $scope.params.datefrom = monthBegin + $scope.loadTradeLogs(1) + } + $scope.lastMonth = function () { + var monthFinish = new Date() + monthFinish.setDate(0) + $scope.params.dateto = monthFinish + var monthBegin = new Date() + monthBegin.setDate(0) + monthBegin.setDate(1) + $scope.params.datefrom = monthBegin + $scope.loadTradeLogs(1) + } + $scope.listOrders = function (page) { + var params = angular.copy($scope.params) || {} + if (params.datefrom) { + params.datefrom = $filter('date')(params.datefrom, 'yyyyMMdd') + } + if (params.dateto) { + params.dateto = $filter('date')(params.dateto, 'yyyyMMdd') + } + params.gateway = [0, 1] + params.page = page || $scope.orderPagination.page || 1 + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/trade_logs', { params: params }).then(function (resp) { + $scope.orders = resp.data.data + $scope.orderPagination = resp.data.pagination + $scope.analysis = resp.data.analysis + }) + } + $scope.listOrders(1) + $scope.orderDetail = function (order) { + orderService.managerOrderDetail(order) + } + $scope.refundOrder = function (order) { + refunder.refunded(order.order_id) + } + }, + ]) + app.controller('partnerRedpackConfigDialogCtrl', [ + '$scope', + '$http', + 'partner', + 'config', + function ($scope, $http, partner, config) { + $scope.config = config.data + if (!Object.keys($scope.config).length) { + $scope.config = { min_payment: 0, min_amount: 1, max_amount: 1, daily_limit: 1, enabled: false } + } + $scope.saveRedpackConfig = function (form) { + $scope.errmsg = null + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true + } + }) + return + } + var config = angular.copy($scope.config) + $http.put('/sys/redpack/partners/' + partner.client_moniker, config).then( + function () { + $scope.$close() + }, + function (resp) { + $scope.errmsg = resp.data.message + } + ) + } + }, + ]) + app.controller('rateConfigDialogCtrl', [ + '$scope', + '$http', + 'rate', + 'clientMoniker', + function ($scope, $http, rate, clientMoniker) { + $scope.rate = angular.copy(rate) + $scope.ctrl = { sending: false } + $scope.saveRate = function () { + $scope.errmsg = null + $scope.ctrl.sending = true + if ($scope.rate.client_rate_id) { + $http.put('/sys/partners/' + clientMoniker + '/rates/' + $scope.rate.client_rate_id, $scope.rate).then( + function () { + $scope.ctrl.sending = false + $scope.$close() + }, + function (resp) { + $scope.ctrl.sending = false + $scope.errmsg = resp.data.message + } + ) + } else { + $http.post('/sys/partners/' + clientMoniker + '/rates', $scope.rate).then( + function () { + $scope.ctrl.sending = false + $scope.$close() + }, + function (resp) { + $scope.ctrl.sending = false + $scope.errmsg = resp.data.message + } + ) + } + } + }, + ]) + app.controller('newDeviceDialogCtrl', [ + '$scope', + '$http', + 'clientMoniker', + function ($scope, $http, clientMoniker) { + $scope.save = function (form) { + $scope.errmsg = null + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true + } + }) + return + } + $http.post('/sys/partners/' + clientMoniker + '/add_device', $scope.device).then( + function () { + $scope.$close() + }, + function (resp) { + $scope.errmsg = resp.data.message + } + ) + } + }, + ]) + app.controller('partnerChooseBDUserDialogCtrl', [ + '$scope', + '$http', + '$filter', + 'partner', + 'bdUsers', + 'type', + function ($scope, $http, $filter, partner, bdUsers, type) { + $scope.bdUsers = bdUsers.data + $scope.data = {} + $scope.params = {} + + $scope.chooseOrg = {} + $scope.chooseOrg.org_name = null + if (($scope.currentUser.role & parseInt('1000011', 2)) > 0 && !$scope.currentUser.org_id) { + /* $scope.showOrg = 'Organization';*/ + $http.get('/sys/orgs', { params: {} }).then(function (resp) { + $scope.orgs = resp.data + }) + } + + $scope.loadOrgs = function () { + var params = angular.copy($scope.params) + $http.get('/sys/orgs/orgChild', { params: params }).then(function (resp) { + $scope.orgs_child = resp.data + }) + } + + /* $scope.chooseOrgFun = function (org) { + if (org == 'all') { + $scope.chooseOrg.org_name = null; + $scope.showOrg = 'All' + } else { + $scope.chooseOrg.org_name = org.name; + $scope.showOrg = org.name; + $scope.params.org_id = org.org_id; + $scope.loadOrgs(); + } + };*/ - function commitError() { - commonDialog.alert({ - title: 'Error', - content: 'Missing file', - type: 'error' - }); - }; - $scope.complianceCheck = function () { - if (!$rootScope.complianceCheck) { - $rootScope.complianceCheck = {}; - } - $rootScope.complianceCheck.client_id = $scope.partner.client_id; - $rootScope.complianceCheck.authFile = true; - }; - $scope.complianceChangeCheck = function () { - if ($rootScope.complianceCheck) { - if ($scope.partner.client_id != $rootScope.complianceCheck.client_id) { - delete $rootScope.complianceCheck; - } - } - }; - $scope.complianceChangeCheck(); - - }]); - app.controller('partnerMWAuthFileCtrl', ['$scope', '$http', '$rootScope', 'commonDialog', '$state', 'Upload', 'file', function ($scope, $http, $rootScope, commonDialog, $state, Upload, file) { - $scope.id_info_form = { edit: false }; - $scope.file = file.data || {}; - $scope.uploadFile = {}; - $scope.file.upay_risk_level = $scope.partner.upay_risk_level; - $scope.file.upay_risk_remark = $scope.partner.upay_risk_remark; - - $scope.uploadApplicationFile = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.applicationFileProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - $scope.uploadFile = {}; - delete $scope.applicationFileProgress; - $scope.uploadFile.upay_application_form = resp.data.url; - $scope.updateFile(); - }, function (resp) { - delete $scope.applicationFileProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.applicationFileProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - $scope.uploadBankFile = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.bankFileProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - $scope.uploadFile = {}; - delete $scope.bankFileProgress; - $scope.uploadFile.client_bank_file = resp.data.url; - $scope.updateFile(); - }, function (resp) { - delete $scope.bankFileProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.bankFileProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - $scope.uploadASICFile = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.ASICProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - $scope.uploadFile = {}; - delete $scope.ASICProgress; - $scope.uploadFile.client_company_file = resp.data.url; - $scope.updateFile(); - }, function (resp) { - delete $scope.ASICProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.ASICProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - $scope.uploadIdFile = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + function initBD() { + $http.get('/sys/partners/' + partner.client_moniker + '/bd_user/current').then(function (resp) { + var choooseBD = resp.data + choooseBD.forEach(function (e) { + $scope.bdUsers.forEach(function (m) { + if (m.manager_id == e.bd_id) { + m.choose = true + m.proportion = e.proportion + /* $scope.chooseOrgFun({org_id: m.org_id, name: m.org_name});*/ + if (($scope.currentUser.role & parseInt('1000000000000', 2)) > 0) { + $scope.params.org_ids = m.org_id + $scope.params.org_id = m.org_id + $scope.loadOrgs() } else { - $scope.idProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - $scope.uploadFile = {}; - delete $scope.idProgress; - $scope.uploadFile.upay_driver_license = resp.data.url; - $scope.updateFile(); - }, function (resp) { - delete $scope.idProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.idProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - $scope.uploadResidenceFile = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.residenceFileProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - $scope.uploadFile = {}; - delete $scope.residenceFileProgress; - $scope.uploadFile.kyc_utility_bill_file = resp.data.url; - $scope.updateFile(); - }, function (resp) { - delete $scope.residenceFileProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.residenceFileProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - $scope.uploadRefundPolicyFile = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.refundPolicyFileProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - $scope.uploadFile = {}; - delete $scope.refundPolicyFileProgress; - $scope.uploadFile.refund_exchange_policy = resp.data.url; - $scope.updateFile(); - }, function (resp) { - delete $scope.refundPolicyFileProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.refundPolicyFileProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - $scope.uploadPrivacyPolicyFile = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.privacyFileProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - $scope.uploadFile = {}; - delete $scope.privacyFileProgress; - $scope.uploadFile.upay_privacy_policy = resp.data.url; - $scope.updateFile(); - }, function (resp) { - delete $scope.privacyFileProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.privacyFileProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - $scope.uploadCardPolicyFile = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.cardFileProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - $scope.uploadFile = {}; - delete $scope.cardFileProgress; - $scope.uploadFile.card_security_policy = resp.data.url; - $scope.updateFile(); - }, function (resp) { - delete $scope.cardFileProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.cardFileProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - $scope.uploadLetterOfOfferFile = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.letterFileProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - $scope.uploadFile = {}; - delete $scope.letterFileProgress; - $scope.uploadFile.upay_offer_letter = resp.data.url; - $scope.updateFile(); - }, function (resp) { - delete $scope.letterFileProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.letterFileProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - $scope.uploadPromotionalFile = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.promotionalFileProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - $scope.uploadFile = {}; - delete $scope.promotionalFileProgress; - $scope.uploadFile.upay_promotional_offer = resp.data.url; - $scope.updateFile(); - }, function (resp) { - delete $scope.promotionalFileProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.promotionalFileProgress.value = parseInt(100 * evt.loaded / evt.total); - }) + $scope.params.org_id = m.org_id + $scope.loadOrgs() } - } - }; - /*$scope.uploadTermsFile = function (file) { + } + }) + }) + $scope.data.start_date = new Date(choooseBD[0].start_date) + }) + } + + if (type == 'edit') { + initBD() + } + + $scope.saveBD = function () { + $scope.data.users = [] + $scope.bdUsers.forEach(function (e) { + if (e.choose) { + $scope.data.users.push(e) + } + }) + + if ($scope.data.users.length == 0) { + $scope.errmsg = '请选择至少一位BD' + } else if ($scope.data.start_date == undefined) { + $scope.errmsg = '执行开始日期不能为空' + } else { + var isValid = true + var total = 0 + $scope.data.users.forEach(function (e) { + if (e.proportion == undefined) { + $scope.errmsg = '绩效比例不能为空' + isValid = false + return + } else if (e.proportion < 0.01 || e.proportion > 1) { + $scope.errmsg = '绩效比例无效' + isValid = false + return + } + total += e.proportion + if (total > 1) { + $scope.errmsg = '总比例不能超过1' + isValid = false + return + } + }) + // if (total != 1) { + // $scope.errmsg = "Total proportion must be 1"; + // isValid = false; + // return; + // } + if (isValid) { + $scope.errmsg = null + $scope.data.type = type + var chooseUsers = angular.copy($scope.data) + chooseUsers.start_date = $scope.data.start_date + if (chooseUsers.start_date) { + chooseUsers.start_date = $filter('date')(chooseUsers.start_date, 'yyyyMMdd') + } + $http.put('/sys/partners/' + partner.client_moniker + '/bd_user', $scope.data).then( + function () { + $scope.$close() + }, + function (resp) { + $scope.errmsg = resp.data.message + } + ) + } + } + } + }, + ]) + app.controller('partnerRedpackLogDialogCtrl', [ + '$scope', + '$http', + 'partner', + function ($scope, $http, partner) { + $scope.pagination = {} + $scope.queryParams = {} + $scope.listRedpackLogs = function (page) { + var params = angular.copy($scope.queryParams) + params.page = page || $scope.pagination.page || 1 + $http.get('/sys/redpack/partners/' + partner.client_moniker + '/logs', { params: params }).then(function (resp) { + $scope.logs = resp.data.data + $scope.pagination = resp.data.pagination + }) + } + $scope.listRedpackLogs(1) + }, + ]) + app.controller('partnerAuthFileCtrl', [ + '$scope', + '$http', + '$rootScope', + 'commonDialog', + '$state', + function ($scope, $http, $rootScope, commonDialog, $state) { + if ($state.params.commitType == 'card-payment') { + $state.go('partners.detail.files.MW_files') + } else { + $state.go('partners.detail.files.CP_files') + } + }, + ]) + app.controller('partnerCPAuthFileCtrl', [ + '$scope', + '$http', + '$rootScope', + 'commonDialog', + '$state', + 'Upload', + 'file', + function ($scope, $http, $rootScope, commonDialog, $state, Upload, file) { + $scope.id_info_form = { edit: false } + $scope.file = file.data || {} + //audit files + $scope.uploadBankFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.bankFileProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + delete $scope.bankFileProgress + $scope.file.file_bank_info = resp.data.url + $scope.updateFile() + if ($scope.file.file_bank_info.endsWith('pdf')) { + $scope.bankIsImage = false + } else { + $scope.bankIsImage = true + } + }, + function (resp) { + delete $scope.bankFileProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.bankFileProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + $scope.agreeIsImage = true + if ($scope.file.file_agreement_info && $scope.file.file_agreement_info.endsWith('pdf')) { + $scope.agreeIsImage = false + } + $scope.bankIsImage = true + if ($scope.file.file_bank_info && $scope.file.file_bank_info.endsWith('pdf')) { + $scope.bankIsImage = false + } + $scope.companyIsImage = true + if ($scope.file.file_company_info && $scope.file.file_company_info.endsWith('pdf')) { + $scope.companyIsImage = false + } + $scope.applyIsImage = true + if ($scope.file.file_apply_info && $scope.file.file_apply_info.endsWith('pdf')) { + $scope.applyIsImage = false + } + $scope.idIsImage = true + if ($scope.file.file_id_info && $scope.file.file_id_info.endsWith('pdf')) { + $scope.idIsImage = false + } + $scope.billIsImage = true + if ($scope.file.file_company_info && $scope.file.file_company_info.endsWith('pdf')) { + $scope.billIsImage = false + } + + //上传账单流水 + $scope.uploadBillFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.billFileProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + delete $scope.billFileProgress + $scope.file.utility_bill_info = resp.data.url + $scope.updateFile() + if ($scope.file.utility_bill_info.endsWith('pdf')) { + $scope.billIsImage = false + } else { + $scope.billIsImage = true + } + }, + function (resp) { + delete $scope.billFileProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.billFileProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + + $scope.uploadCompanyFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.companyFileProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + delete $scope.companyFileProgress + $scope.file.file_company_info = resp.data.url + $scope.updateFile() + if ($scope.file.file_company_info.endsWith('pdf')) { + $scope.companyIsImage = false + } else { + $scope.companyIsImage = true + } + }, + function (resp) { + delete $scope.companyFileProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.companyFileProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + //上传ID信息 + $scope.uploadIDFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.idFileProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + delete $scope.idFileProgress + $scope.file.file_id_info = resp.data.url + $scope.updateFile() + if ($scope.file.file_id_info.endsWith('pdf')) { + $scope.idIsImage = false + } else { + $scope.idIsImage = true + } + }, + function (resp) { + delete $scope.idFileProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.idFileProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + + //上传协议文件 + $scope.uploadAgreementFile = function (file) { + if (file != null) { + if (file.size > 10 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过10MB,请压缩后重试', type: 'error' }) + } else { + $scope.agreementFileProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + delete $scope.agreementFileProgress + $scope.file.file_agreement_info = resp.data.url + $scope.updateFile() + if ($scope.file.file_agreement_info.endsWith('pdf')) { + $scope.agreeIsImage = false + } else { + $scope.agreeIsImage = true + } + }, + function (resp) { + delete $scope.agreementFileProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.agreementFileProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + + //上传申请表 + $scope.uploadApplyFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.applyFileProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + delete $scope.applyFileProgress + $scope.file.file_apply_info = resp.data.url + $scope.updateFile() + if ($scope.file.file_apply_info.endsWith('pdf')) { + $scope.applyIsImage = false + } else { + $scope.applyIsImage = true + } + }, + function (resp) { + delete $scope.applyFileProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.applyFileProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + $scope.toggleIdTitle = function (beneficiary_id_title) { + $scope.file.beneficiary_id_title = beneficiary_id_title + } + $scope.saveIdInfo = function () { + if (!$scope.file.id_type) { + commonDialog.alert({ title: 'Error', content: '请选择ID Type', type: 'error' }) + return + } + if ($scope.file.beneficiary_id_title != 'Ultimate beneficiary owner') { + if (!$scope.file.other_id_title_desc) { + commonDialog.alert({ title: 'Error', content: '请简要告知为何无法提供受益股东的资料', type: 'error' }) + return + } + } + var config = {} + config.id_type = $scope.file.id_type + config.beneficiary_id_title = $scope.file.beneficiary_id_title + config.other_id_title_desc = $scope.file.other_id_title_desc + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/id_info', config).then( + function (resp) { + commonDialog.alert({ title: 'Success', content: 'Id Info Updated', type: 'success' }) + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + $state.reload() + } + ) + } + + $scope.cancelIdInfo = function () { + $state.reload() + $scope.id_info_form.edit = false + } + + $scope.downloadAsZip = function () { + var url = '/sys/partners/' + $scope.partner.client_moniker + '/download/complianceAsZIP' + return url + } + + $scope.deleteComplianceFiles = function (file_id) { + commonDialog + .confirm({ + title: 'Warning', + content: 'This operation will delete the file, Are you sure?', + }) + .then(function () { + $http.put('/sys/partners/auth_file/' + file_id + '/delete').then( + function (resp) { + commonDialog.alert({ + title: 'Success', + content: 'Delete Successful', + type: 'success', + }) + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + }) + } + + $scope.updateFile = function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/file', $scope.file).then( + function () { + commonDialog.alert({ + title: 'Success', + content: 'Upload Successful', + type: 'success', + }) + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + + function commitError() { + commonDialog.alert({ + title: 'Error', + content: 'Missing file', + type: 'error', + }) + } + $scope.complianceCheck = function () { + if (!$rootScope.complianceCheck) { + $rootScope.complianceCheck = {} + } + $rootScope.complianceCheck.client_id = $scope.partner.client_id + $rootScope.complianceCheck.authFile = true + } + $scope.complianceChangeCheck = function () { + if ($rootScope.complianceCheck) { + if ($scope.partner.client_id != $rootScope.complianceCheck.client_id) { + delete $rootScope.complianceCheck + } + } + } + $scope.complianceChangeCheck() + }, + ]) + app.controller('partnerMWAuthFileCtrl', [ + '$scope', + '$http', + '$rootScope', + 'commonDialog', + '$state', + 'Upload', + 'file', + function ($scope, $http, $rootScope, commonDialog, $state, Upload, file) { + $scope.id_info_form = { edit: false } + $scope.file = file.data || {} + $scope.uploadFile = {} + $scope.file.upay_risk_level = $scope.partner.upay_risk_level + $scope.file.upay_risk_remark = $scope.partner.upay_risk_remark + + $scope.uploadApplicationFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.applicationFileProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + $scope.uploadFile = {} + delete $scope.applicationFileProgress + $scope.uploadFile.upay_application_form = resp.data.url + $scope.updateFile() + }, + function (resp) { + delete $scope.applicationFileProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.applicationFileProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + $scope.uploadBankFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.bankFileProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + $scope.uploadFile = {} + delete $scope.bankFileProgress + $scope.uploadFile.client_bank_file = resp.data.url + $scope.updateFile() + }, + function (resp) { + delete $scope.bankFileProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.bankFileProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + $scope.uploadASICFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.ASICProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + $scope.uploadFile = {} + delete $scope.ASICProgress + $scope.uploadFile.client_company_file = resp.data.url + $scope.updateFile() + }, + function (resp) { + delete $scope.ASICProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.ASICProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + $scope.uploadIdFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.idProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + $scope.uploadFile = {} + delete $scope.idProgress + $scope.uploadFile.upay_driver_license = resp.data.url + $scope.updateFile() + }, + function (resp) { + delete $scope.idProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.idProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + $scope.uploadResidenceFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.residenceFileProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + $scope.uploadFile = {} + delete $scope.residenceFileProgress + $scope.uploadFile.kyc_utility_bill_file = resp.data.url + $scope.updateFile() + }, + function (resp) { + delete $scope.residenceFileProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.residenceFileProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + $scope.uploadRefundPolicyFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.refundPolicyFileProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + $scope.uploadFile = {} + delete $scope.refundPolicyFileProgress + $scope.uploadFile.refund_exchange_policy = resp.data.url + $scope.updateFile() + }, + function (resp) { + delete $scope.refundPolicyFileProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.refundPolicyFileProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + $scope.uploadPrivacyPolicyFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.privacyFileProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + $scope.uploadFile = {} + delete $scope.privacyFileProgress + $scope.uploadFile.upay_privacy_policy = resp.data.url + $scope.updateFile() + }, + function (resp) { + delete $scope.privacyFileProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.privacyFileProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + $scope.uploadCardPolicyFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.cardFileProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + $scope.uploadFile = {} + delete $scope.cardFileProgress + $scope.uploadFile.card_security_policy = resp.data.url + $scope.updateFile() + }, + function (resp) { + delete $scope.cardFileProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.cardFileProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + $scope.uploadLetterOfOfferFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.letterFileProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + $scope.uploadFile = {} + delete $scope.letterFileProgress + $scope.uploadFile.upay_offer_letter = resp.data.url + $scope.updateFile() + }, + function (resp) { + delete $scope.letterFileProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.letterFileProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + $scope.uploadPromotionalFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.promotionalFileProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + $scope.uploadFile = {} + delete $scope.promotionalFileProgress + $scope.uploadFile.upay_promotional_offer = resp.data.url + $scope.updateFile() + }, + function (resp) { + delete $scope.promotionalFileProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.promotionalFileProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + /*$scope.uploadTermsFile = function (file) { if (file != null) { if (file.size > 3 * 1024 * 1024) { commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) @@ -4776,611 +5464,701 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter } } };*/ - $scope.uploadDescFile = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.descFileProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - $scope.uploadFile = {}; - delete $scope.descFileProgress; - $scope.uploadFile.upay_desc_file = resp.data.url; - $scope.updateFile(); - }, function (resp) { - delete $scope.descFileProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.descFileProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - - $scope.saveIdInfo = function () { - if (!$scope.file.upay_risk_level) { - commonDialog.alert({ title: 'Error', content: '请选择商户风险等级', type: 'error' }); - return; - } - var config = {}; - config.upay_risk_level = $scope.file.upay_risk_level; - config.upay_risk_remark = $scope.file.upay_risk_remark; - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/mw_risk_info', config).then(function (resp) { - commonDialog.alert({ title: 'Success', content: 'Risk Info Updated', type: 'success' }) - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - $state.reload(); - }); - }; - - $scope.cancelIdInfo = function () { - $state.reload(); - $scope.id_info_form.edit = false - }; - - $scope.downloadAsZip = function () { - var url = '/sys/partners/' + $scope.partner.client_moniker + '/download/MWcomplianceAsZIP'; - return url; - }; - - $scope.updateFile = function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/mw_file', $scope.uploadFile).then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Upload Successful', - type: 'success' - }); - $state.go('partners.detail.files', { - clientMoniker: $scope.partner.client_moniker, - commitType: "card-payment" - }, { reload: true }); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) + $scope.uploadDescFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.descFileProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + $scope.uploadFile = {} + delete $scope.descFileProgress + $scope.uploadFile.upay_desc_file = resp.data.url + $scope.updateFile() + }, + function (resp) { + delete $scope.descFileProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.descFileProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } } + } - function commitError() { + $scope.saveIdInfo = function () { + if (!$scope.file.upay_risk_level) { + commonDialog.alert({ title: 'Error', content: '请选择商户风险等级', type: 'error' }) + return + } + var config = {} + config.upay_risk_level = $scope.file.upay_risk_level + config.upay_risk_remark = $scope.file.upay_risk_remark + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/mw_risk_info', config).then( + function (resp) { + commonDialog.alert({ title: 'Success', content: 'Risk Info Updated', type: 'success' }) + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + $state.reload() + } + ) + } + + $scope.cancelIdInfo = function () { + $state.reload() + $scope.id_info_form.edit = false + } + + $scope.downloadAsZip = function () { + var url = '/sys/partners/' + $scope.partner.client_moniker + '/download/MWcomplianceAsZIP' + return url + } + + $scope.updateFile = function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/mw_file', $scope.uploadFile).then( + function () { commonDialog.alert({ - title: 'Error', - content: 'Missing file', - type: 'error' - }); - }; - $scope.complianceCheck = function () { - if (!$rootScope.complianceCheck) { - $rootScope.complianceCheck = {}; - } - $rootScope.complianceCheck.authFile = true; - $rootScope.complianceCheck.client_id = $scope.partner.client_id; - - if ($scope.file.upay_application_form == null || $scope.file.upay_application_form == '') { - commonDialog.alert({ type: 'error', title: 'Error', content: '请补充商户申请表合规文件' }) - $rootScope.complianceCheck.authFile = false; - } else if ($scope.file.client_bank_file == null || $scope.file.client_bank_file == '') { - commonDialog.alert({ type: 'error', title: 'Error', content: '请补六个月银行对账单合规文件' }) - $rootScope.complianceCheck.authFile = false; - } else if ($scope.file.client_company_file == null || $scope.file.client_company_file == '') { - commonDialog.alert({ type: 'error', title: 'Error', content: '请补充当前公司信息摘录合规文件' }) - $rootScope.complianceCheck.authFile = false; - } else if ($scope.file.upay_driver_license == null || $scope.file.upay_driver_license == '') { - commonDialog.alert({ type: 'error', title: 'Error', content: '请补充法人身份证明合规文件' }) - $rootScope.complianceCheck.authFile = false; - } else if ($scope.file.kyc_utility_bill_file == null || $scope.file.kyc_utility_bill_file == '') { - commonDialog.alert({ type: 'error', title: 'Error', content: '请补充家庭住址证明 (一个水电煤网账单)合规文件' }) - $rootScope.complianceCheck.authFile = false; - } - - }; - $scope.complianceChangeCheck = function () { - if ($rootScope.complianceCheck) { - if ($scope.partner.client_id != $rootScope.complianceCheck.client_id) { - delete $rootScope.complianceCheck; - } - } - }; - $scope.complianceChangeCheck(); - - $scope.deleteMWComplianceFiles = function (file_id) { - commonDialog.confirm({ - title: 'Warning', - content: 'This operation will delete the file, Are you sure?' - }).then(function () { - $http.put('/sys/partners/auth_file/' + file_id + '/mw_delete').then(function (resp) { - commonDialog.alert({ - title: 'Success', - content: 'Delete Successful', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) + title: 'Success', + content: 'Upload Successful', + type: 'success', }) - }; - - }]); - - app.controller('partnerKycFileCtrl', ['$scope', '$http', '$rootScope', 'commonDialog', '$state', 'Upload', 'file', function ($scope, $http, $rootScope, commonDialog, $state, Upload, file) { - - $scope.file = file.data || {}; - //kyc files - $scope.uploadCompanyFile = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.bankFileProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - delete $scope.bankFileProgress; - $scope.file.file_company_info = resp.data.url; - $scope.updateFile(); - if ($scope.file.file_company_info.endsWith('pdf')) { - $scope.companyIsImage = false; - } else { - $scope.companyIsImage = true; - } - }, function (resp) { - delete $scope.bankFileProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.bankFileProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - - $scope.companyIsImage = true; - if ($scope.file.file_company_info && $scope.file.file_company_info.endsWith('pdf')) { - $scope.companyIsImage = false; + $state.go( + 'partners.detail.files', + { + clientMoniker: $scope.partner.client_moniker, + commitType: 'card-payment', + }, + { reload: true } + ) + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + + function commitError() { + commonDialog.alert({ + title: 'Error', + content: 'Missing file', + type: 'error', + }) + } + $scope.complianceCheck = function () { + if (!$rootScope.complianceCheck) { + $rootScope.complianceCheck = {} } - - $scope.idIsImage = true; - if ($scope.file.file_id_info && $scope.file.file_id_info.endsWith('pdf')) { - $scope.idIsImage = false; + $rootScope.complianceCheck.authFile = true + $rootScope.complianceCheck.client_id = $scope.partner.client_id + + if ($scope.file.upay_application_form == null || $scope.file.upay_application_form == '') { + commonDialog.alert({ type: 'error', title: 'Error', content: '请补充商户申请表合规文件' }) + $rootScope.complianceCheck.authFile = false + } else if ($scope.file.client_bank_file == null || $scope.file.client_bank_file == '') { + commonDialog.alert({ type: 'error', title: 'Error', content: '请补六个月银行对账单合规文件' }) + $rootScope.complianceCheck.authFile = false + } else if ($scope.file.client_company_file == null || $scope.file.client_company_file == '') { + commonDialog.alert({ type: 'error', title: 'Error', content: '请补充当前公司信息摘录合规文件' }) + $rootScope.complianceCheck.authFile = false + } else if ($scope.file.upay_driver_license == null || $scope.file.upay_driver_license == '') { + commonDialog.alert({ type: 'error', title: 'Error', content: '请补充法人身份证明合规文件' }) + $rootScope.complianceCheck.authFile = false + } else if ($scope.file.kyc_utility_bill_file == null || $scope.file.kyc_utility_bill_file == '') { + commonDialog.alert({ type: 'error', title: 'Error', content: '请补充家庭住址证明 (一个水电煤网账单)合规文件' }) + $rootScope.complianceCheck.authFile = false } - $scope.billIsImage = true; - if ($scope.file.file_company_info && $scope.file.file_company_info.endsWith('pdf')) { - $scope.billIsImage = false; + } + $scope.complianceChangeCheck = function () { + if ($rootScope.complianceCheck) { + if ($scope.partner.client_id != $rootScope.complianceCheck.client_id) { + delete $rootScope.complianceCheck + } } - - //上传ID信息 - $scope.uploadIDFile = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } + $scope.complianceChangeCheck() + + $scope.deleteMWComplianceFiles = function (file_id) { + commonDialog + .confirm({ + title: 'Warning', + content: 'This operation will delete the file, Are you sure?', + }) + .then(function () { + $http.put('/sys/partners/auth_file/' + file_id + '/mw_delete').then( + function (resp) { + commonDialog.alert({ + title: 'Success', + content: 'Delete Successful', + type: 'success', + }) + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + }) + } + }, + ]) + + app.controller('partnerKycFileCtrl', [ + '$scope', + '$http', + '$rootScope', + 'commonDialog', + '$state', + 'Upload', + 'file', + function ($scope, $http, $rootScope, commonDialog, $state, Upload, file) { + $scope.file = file.data || {} + //kyc files + $scope.uploadCompanyFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.bankFileProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + delete $scope.bankFileProgress + $scope.file.file_company_info = resp.data.url + $scope.updateFile() + if ($scope.file.file_company_info.endsWith('pdf')) { + $scope.companyIsImage = false } else { - $scope.idFileProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - delete $scope.idFileProgress; - $scope.file.file_id_info = resp.data.url; - $scope.updateFile(); - if ($scope.file.file_id_info.endsWith('pdf')) { - $scope.idIsImage = false; - } else { - $scope.idIsImage = true; - } - }, function (resp) { - delete $scope.idFileProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.idFileProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - - //上传账单流水 - $scope.uploadBillFile = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + $scope.companyIsImage = true + } + }, + function (resp) { + delete $scope.bankFileProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.bankFileProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + + $scope.companyIsImage = true + if ($scope.file.file_company_info && $scope.file.file_company_info.endsWith('pdf')) { + $scope.companyIsImage = false + } + + $scope.idIsImage = true + if ($scope.file.file_id_info && $scope.file.file_id_info.endsWith('pdf')) { + $scope.idIsImage = false + } + $scope.billIsImage = true + if ($scope.file.file_company_info && $scope.file.file_company_info.endsWith('pdf')) { + $scope.billIsImage = false + } + + //上传ID信息 + $scope.uploadIDFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.idFileProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + delete $scope.idFileProgress + $scope.file.file_id_info = resp.data.url + $scope.updateFile() + if ($scope.file.file_id_info.endsWith('pdf')) { + $scope.idIsImage = false } else { - $scope.billFileProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/files', - data: { file: file } - }).then(function (resp) { - delete $scope.billFileProgress; - $scope.file.utility_bill_info = resp.data.url; - $scope.updateFile(); - if ($scope.file.utility_bill_info.endsWith('pdf')) { - $scope.billIsImage = false; - } else { - $scope.billIsImage = true; - } - }, function (resp) { - delete $scope.billFileProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.billFileProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; + $scope.idIsImage = true + } + }, + function (resp) { + delete $scope.idFileProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.idFileProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + + //上传账单流水 + $scope.uploadBillFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.billFileProgress = { value: 0 } + Upload.upload({ + url: '/attachment/files', + data: { file: file }, + }).then( + function (resp) { + delete $scope.billFileProgress + $scope.file.utility_bill_info = resp.data.url + $scope.updateFile() + if ($scope.file.utility_bill_info.endsWith('pdf')) { + $scope.billIsImage = false + } else { + $scope.billIsImage = true + } + }, + function (resp) { + delete $scope.billFileProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.billFileProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } - /* $scope.downloadAsZip = function () { + /* $scope.downloadAsZip = function () { var url = '/sys/partners/' + $scope.partner.client_moniker + '/download/complianceAsZIP'; return url; };*/ - $scope.deleteComplianceFiles = function (file_id) { - commonDialog.confirm({ - title: 'Warning', - content: 'This operation will delete the file, Are you sure?' - }).then(function () { - $http.put('/sys/partners/auth_file/' + file_id + '/delete').then(function (resp) { - commonDialog.alert({ - title: 'Success', - content: 'Delete Successful', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); + $scope.deleteComplianceFiles = function (file_id) { + commonDialog + .confirm({ + title: 'Warning', + content: 'This operation will delete the file, Are you sure?', + }) + .then(function () { + $http.put('/sys/partners/auth_file/' + file_id + '/delete').then( + function (resp) { + commonDialog.alert({ + title: 'Success', + content: 'Delete Successful', + type: 'success', }) - }) - }; + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + }) + } - $scope.updateFile = function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/kycFile', $scope.file).then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Upload Successful', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); + $scope.updateFile = function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/kycFile', $scope.file).then( + function () { + commonDialog.alert({ + title: 'Success', + content: 'Upload Successful', + type: 'success', }) + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + + function commitError() { + commonDialog.alert({ + title: 'Error', + content: 'Missing file', + type: 'error', + }) + } + $scope.complianceCheck = function () { + if (!$rootScope.complianceCheck) { + $rootScope.complianceCheck = {} } - - function commitError() { - commonDialog.alert({ - title: 'Error', - content: 'Missing file', - type: 'error' - }); - }; - $scope.complianceCheck = function () { - if (!$rootScope.complianceCheck) { - $rootScope.complianceCheck = {}; - } - $rootScope.complianceCheck.client_id = $scope.partner.client_id; - $rootScope.complianceCheck.authFile = true; - }; - $scope.complianceChangeCheck = function () { - if ($rootScope.complianceCheck) { - if ($scope.partner.client_id != $rootScope.complianceCheck.client_id) { - delete $rootScope.complianceCheck; - } - } - }; - $scope.complianceChangeCheck(); - - }]); - - app.controller('partnerSettlementCtrl', ['$scope', '$uibModal', '$http', 'clientMoniker', '$filter', function ($scope, $uibModal, $http, clientMoniker, $filter) { - $scope.params = {}; - $scope.pagination = {}; - $scope.clients = []; - $scope.showLevel3Clients = false; - $scope.isLevel3All = true; - $scope.clinet = {}; - $scope.isAll = true; - $scope.more20ChoseSubClient = false; - $scope.choseSubClientNow = 'More'; - $scope.searchSubClients = function (subSearchText, page) { - - $scope.subClientTable1 = [$scope.partner]; - $scope.subClientTable2 = []; - var params = {}; - params.page = page || $scope.subClientPagination.page || 1; - if (subSearchText != '') { - $scope.subSearchText = subSearchText; - params.searchText = subSearchText; - } - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/sub_clients/page', { params: params }).then(function (resp) { - var clientList = resp.data.data; - $scope.subClientPagination = resp.data.pagination; - clientList.forEach(function (client) { - if ($scope.subClientTable1.length < 11) { - $scope.subClientTable1.push(client); - } else { - $scope.subClientTable2.push(client); - } - $scope.clients.push(client); - }); - }); - }; - $scope.initClientInfo = function () { - $http.get('/sys/partners/' + clientMoniker).then(function (resp) { - $scope.client = resp.data; - $scope.clients = [$scope.client]; - if ($scope.client.has_children && !$scope.client.hide_sub_mch) { - $scope.searchSubClients('', 1); - $scope.params.dateto = new Date(); - var day = new Date(); - day.setDate(day.getDate() - 7); - $scope.params.datefrom = day; - $scope.chooseClient('all'); - } else { - $scope.params.dateto = new Date(); - var day = new Date(); - day.setDate(day.getDate() - 7); - $scope.params.datefrom = day; - $scope.chooseClient('all'); - } - }); - } - $scope.initClientInfo(); - - $scope.exportSettlementLogs = function () { - var params = angular.copy($scope.params); - var url = '/sys/partners/' + clientMoniker + '/lists_settlements/excel'; - var connectSymbol = '?'; - if (params.datefrom) { - params.datefrom = $filter('date')(params.datefrom, 'yyyyMMdd'); - url += connectSymbol + 'datefrom=' + params.datefrom; - connectSymbol = '&'; - } - if (params.dateto) { - params.dateto = $filter('date')(params.dateto, 'yyyyMMdd'); - url += connectSymbol + 'dateto=' + params.dateto; - } - if (params.client_ids && !$scope.isAll) { - params.client_ids.forEach(function (i) { - url += connectSymbol + 'client_ids=' + i; - connectSymbol = '&'; - }); - } - return url; - }; - - $scope.chooseClient = function (client) { - if (client == 'all') { - $scope.choseSubClientNow = 'More'; - $scope.params.client_ids = angular.copy($scope.clientIds); - $scope.isAll = true; - $scope.chooseClientId = ''; - $scope.showLevel3Clients = false; - } else if (client.level3Clients) { - $scope.chooseClientId = client.client_id; - $scope.showLevel3Clients = true; - $scope.level3Clients = client.level3Clients; - $scope.isAll = false; - $scope.level3ClientIds = []; - $scope.level3ClientIds.push(client.client_id); - client.level3Clients.forEach(function (client) { - $scope.level3ClientIds.push(client.client_id); - }); - $scope.chooseLevel3Client("all"); - return; + $rootScope.complianceCheck.client_id = $scope.partner.client_id + $rootScope.complianceCheck.authFile = true + } + $scope.complianceChangeCheck = function () { + if ($rootScope.complianceCheck) { + if ($scope.partner.client_id != $rootScope.complianceCheck.client_id) { + delete $rootScope.complianceCheck + } + } + } + $scope.complianceChangeCheck() + }, + ]) + + app.controller('partnerSettlementCtrl', [ + '$scope', + '$uibModal', + '$http', + 'clientMoniker', + '$filter', + function ($scope, $uibModal, $http, clientMoniker, $filter) { + $scope.params = {} + $scope.pagination = {} + $scope.clients = [] + $scope.showLevel3Clients = false + $scope.isLevel3All = true + $scope.clinet = {} + $scope.isAll = true + $scope.more20ChoseSubClient = false + $scope.choseSubClientNow = 'More' + $scope.searchSubClients = function (subSearchText, page) { + $scope.subClientTable1 = [$scope.partner] + $scope.subClientTable2 = [] + var params = {} + params.page = page || $scope.subClientPagination.page || 1 + if (subSearchText != '') { + $scope.subSearchText = subSearchText + params.searchText = subSearchText + } + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/sub_clients/page', { params: params }).then(function (resp) { + var clientList = resp.data.data + $scope.subClientPagination = resp.data.pagination + clientList.forEach(function (client) { + if ($scope.subClientTable1.length < 11) { + $scope.subClientTable1.push(client) } else { - $scope.chooseClientId = client.client_id; - $scope.params.client_ids = [client.client_id]; - $scope.isAll = false; - $scope.showLevel3Clients = false; - } - $scope.loadSettlementLogs(); - }; - - $scope.today = new Date(); - $scope.chooseToday = function () { - $scope.params.datefrom = $scope.params.dateto = new Date(); - $scope.loadSettlementLogs(1); - }; - $scope.chooseYesterday = function () { - var yesterday = new Date(); - yesterday.setDate(yesterday.getDate() - 1); - $scope.params.datefrom = $scope.params.dateto = yesterday; - $scope.loadSettlementLogs(1); - }; - $scope.chooseLast7Days = function () { - $scope.params.dateto = new Date(); - var day = new Date(); - day.setDate(day.getDate() - 7); - $scope.params.datefrom = day; - $scope.loadSettlementLogs(1); - }; - $scope.thisMonth = function () { - $scope.params.dateto = new Date(); - var monthBegin = new Date(); - monthBegin.setDate(1); - $scope.params.datefrom = monthBegin; - $scope.loadSettlementLogs(1); - }; - $scope.lastMonth = function () { - var monthFinish = new Date(); - monthFinish.setDate(0); - $scope.params.dateto = monthFinish; - var monthBegin = new Date(); - monthBegin.setDate(0); - monthBegin.setDate(1); - $scope.params.datefrom = monthBegin; - $scope.loadSettlementLogs(1); - }; - $scope.loadSettlementLogs = function (page) { - var params = angular.copy($scope.params); - if (params.datefrom) { - params.datefrom = $filter('date')(params.datefrom, 'yyyyMMdd'); - } - if (params.dateto) { - params.dateto = $filter('date')(params.dateto, 'yyyyMMdd'); - } - params.page = page || $scope.pagination.page || 1; - params.limit = 10; - if ($scope.isAll) { - delete params.client_ids; - } - $http.get('/sys/partners/' + clientMoniker + '/lists_settlements', { params: params }).then(function (resp) { - $scope.settlementLogs = resp.data.data; - $scope.padding = resp.data.padding; - $scope.pagination = resp.data.pagination; - }); - }; - $scope.getClearingTransactions = function (client_id, detail_id) { - $uibModal.open({ - templateUrl: '/static/analysis/templates/settlement_transactions.html', - controller: 'managerSettlementDetailCtrl', - resolve: { - detail: ['$http', '$stateParams', function ($http) { - return $http.get('/analysis/partner_card/' + client_id + '/settlement_logs/' + detail_id); - }], - detail_id: detail_id - }, - size: 'lg' - }); - }; - - $scope.getClearingTransactionsOfMergeSettle = function (reportDate) { - $uibModal.open({ - templateUrl: '/static/analysis/templates/settlement_transactions.html', - controller: 'managerSettlementDetailOfMergeSettleCtrl', - resolve: { - detail: ['$http', '$stateParams', function ($http) { - return $http.get('/analysis/partner_card/' + $scope.client.client_id + '/settlement_logs/report_date/' + reportDate); - }], - client_id: $scope.client.client_id - }, - size: 'lg' - }); - }; - - $scope.checkSubClientChoseShow = function (client) { - $scope.more20ChoseSubClient = !$scope.more20ChoseSubClient; - if (client != '') { - $scope.choseSubClientNow = client.short_name; - } + $scope.subClientTable2.push(client) + } + $scope.clients.push(client) + }) + }) + } + $scope.initClientInfo = function () { + $http.get('/sys/partners/' + clientMoniker).then(function (resp) { + $scope.client = resp.data + $scope.clients = [$scope.client] + if ($scope.client.has_children && !$scope.client.hide_sub_mch) { + $scope.searchSubClients('', 1) + $scope.params.dateto = new Date() + var day = new Date() + day.setDate(day.getDate() - 7) + $scope.params.datefrom = day + $scope.chooseClient('all') + } else { + $scope.params.dateto = new Date() + var day = new Date() + day.setDate(day.getDate() - 7) + $scope.params.datefrom = day + $scope.chooseClient('all') + } + }) + } + $scope.initClientInfo() + + $scope.exportSettlementLogs = function () { + var params = angular.copy($scope.params) + var url = '/sys/partners/' + clientMoniker + '/lists_settlements/excel' + var connectSymbol = '?' + if (params.datefrom) { + params.datefrom = $filter('date')(params.datefrom, 'yyyyMMdd') + url += connectSymbol + 'datefrom=' + params.datefrom + connectSymbol = '&' } - $scope.clickDisplayChoseDiv = function (event) { - $scope.more20ChoseSubClient = false; - } - $scope.choseDivStopPropagation = function (event) { - event.stopPropagation() - }; - }]); - app.controller('partnerSurchargeAccountCtrl', ['$scope', '$uibModal', '$http', 'clientMoniker', '$filter', function ($scope, $uibModal, $http, clientMoniker, $filter) { - $scope.params = {}; - $scope.pagination = {}; - $scope.today = new Date(); - - $scope.chooseToday = function () { - $scope.params.datefrom = $scope.params.dateto = new Date(); - $scope.loadSettlementLogs(1); - }; - $scope.chooseYesterday = function () { - var yesterday = new Date(); - yesterday.setDate(yesterday.getDate() - 1); - $scope.params.datefrom = $scope.params.dateto = yesterday; - $scope.loadSettlementLogs(1); - }; - $scope.chooseLast7Days = function () { - $scope.params.dateto = new Date(); - var day = new Date(); - day.setDate(day.getDate() - 7); - $scope.params.datefrom = day; - $scope.loadSettlementLogs(1); - }; - $scope.thisMonth = function () { - $scope.params.dateto = new Date(); - var monthBegin = new Date(); - monthBegin.setDate(1); - $scope.params.datefrom = monthBegin; - $scope.loadSettlementLogs(1); - }; - $scope.lastMonth = function () { - var monthFinish = new Date(); - monthFinish.setDate(0); - $scope.params.dateto = monthFinish; - var monthBegin = new Date(); - monthBegin.setDate(0); - monthBegin.setDate(1); - $scope.params.datefrom = monthBegin; - $scope.loadSettlementLogs(1); - }; - $scope.loadSettlementLogs = function (page) { - var params = angular.copy($scope.params); - if (params.datefrom) { - params.datefrom = $filter('date')(params.datefrom, 'yyyyMMdd'); - } - if (params.dateto) { - params.dateto = $filter('date')(params.dateto, 'yyyyMMdd'); - } - params.page = page || $scope.pagination.page || 1; - params.limit = 10; - $http.get('/sys/partners/' + clientMoniker + '/surcharge_account/month_detail').then(function (resp) { - $scope.details = resp.data; - }); - }; - $scope.getClearingTransactions = function (client_id, detail_id) { - $uibModal.open({ - templateUrl: '/static/analysis/templates/settlement_transactions.html', - controller: 'managerSettlementDetailCtrl', - resolve: { - detail: ['$http', '$stateParams', function ($http) { - return $http.get('/analysis/partner_card/' + client_id + '/settlement_logs/' + detail_id); - }], - detail_id: detail_id - }, - size: 'lg' - }); - }; - $scope.chooseLast7Days(); - }]); - app.controller('managerSettlementDetailCtrl', ['$scope', 'detail', 'detail_id', '$http', function ($scope, detail, detail_id, $http) { - $scope.ctrl = { channel: null }; - $scope.show = true; - $scope.report = detail.data; - $scope.report.total_charge = Decimal.add($scope.report.total_charge, $scope.report.tax_amount).toFixed(2); - angular.forEach($scope.report.channels, function (e) { - e.total_charge = Decimal.add(e.tax_amount, e.total_charge).toFixed(2); - }); - - $scope.channelAndDayOfAnalysis = function () { - $http.get('/analysis/partner_card/settlement_logs/' + detail_id + '/analysis/' + $scope.ctrl.channel).then(function (resp) { - $scope.channelAndDayMap = resp.data; - $scope.index = 0; - }) - }; - $scope.channelAndDayOfAnalysis(1); - }]); - app.controller('managerSettlementDetailOfMergeSettleCtrl', ['$scope', 'detail', 'client_id', '$http', function ($scope, detail, client_id, $http) { - $scope.ctrl = { channel: null }; - $scope.show = true; - $scope.report = detail.data; - $scope.report.total_charge = Decimal.add($scope.report.total_charge, $scope.report.tax_amount).toFixed(2); - angular.forEach($scope.report.channels, function (e) { - e.total_charge = Decimal.add(e.tax_amount, e.total_charge).toFixed(2); - }); - }]); - app.controller('productCtrl', ['$scope', '$http', '$uibModal', 'commonDialog', '$state', 'Upload', 'wechatGoodMcc', function ($scope, $http, $uibModal, commonDialog, $state, Upload, wechatGoodMcc) { - $scope.importShow = 0; - $scope.pagination = {}; - $scope.params = { text_type: 'all', search_text: null }; - $scope.wechatMccIndustries = wechatGoodMcc.configs(); - $scope.loadProducts = function () { - $http.get('/sys/product/' + $scope.partner.client_moniker + '/list').then(function (resp) { - $scope.mcc_goods = resp.data; - }); - }; - $scope.updateMccInfo = function (mccInfo) { - mccInfo.client_moniker = $scope.partner.client_moniker; - $http.put('/sys/product/update', mccInfo).then(function (resp) { - $state.reload(); - }); - }; - $scope.loadProducts(); - /*$scope.importExcel = function (file) { + if (params.dateto) { + params.dateto = $filter('date')(params.dateto, 'yyyyMMdd') + url += connectSymbol + 'dateto=' + params.dateto + } + if (params.client_ids && !$scope.isAll) { + params.client_ids.forEach(function (i) { + url += connectSymbol + 'client_ids=' + i + connectSymbol = '&' + }) + } + return url + } + + $scope.chooseClient = function (client) { + if (client == 'all') { + $scope.choseSubClientNow = 'More' + $scope.params.client_ids = angular.copy($scope.clientIds) + $scope.isAll = true + $scope.chooseClientId = '' + $scope.showLevel3Clients = false + } else if (client.level3Clients) { + $scope.chooseClientId = client.client_id + $scope.showLevel3Clients = true + $scope.level3Clients = client.level3Clients + $scope.isAll = false + $scope.level3ClientIds = [] + $scope.level3ClientIds.push(client.client_id) + client.level3Clients.forEach(function (client) { + $scope.level3ClientIds.push(client.client_id) + }) + $scope.chooseLevel3Client('all') + return + } else { + $scope.chooseClientId = client.client_id + $scope.params.client_ids = [client.client_id] + $scope.isAll = false + $scope.showLevel3Clients = false + } + $scope.loadSettlementLogs() + } + + $scope.today = new Date() + $scope.chooseToday = function () { + $scope.params.datefrom = $scope.params.dateto = new Date() + $scope.loadSettlementLogs(1) + } + $scope.chooseYesterday = function () { + var yesterday = new Date() + yesterday.setDate(yesterday.getDate() - 1) + $scope.params.datefrom = $scope.params.dateto = yesterday + $scope.loadSettlementLogs(1) + } + $scope.chooseLast7Days = function () { + $scope.params.dateto = new Date() + var day = new Date() + day.setDate(day.getDate() - 7) + $scope.params.datefrom = day + $scope.loadSettlementLogs(1) + } + $scope.thisMonth = function () { + $scope.params.dateto = new Date() + var monthBegin = new Date() + monthBegin.setDate(1) + $scope.params.datefrom = monthBegin + $scope.loadSettlementLogs(1) + } + $scope.lastMonth = function () { + var monthFinish = new Date() + monthFinish.setDate(0) + $scope.params.dateto = monthFinish + var monthBegin = new Date() + monthBegin.setDate(0) + monthBegin.setDate(1) + $scope.params.datefrom = monthBegin + $scope.loadSettlementLogs(1) + } + $scope.loadSettlementLogs = function (page) { + var params = angular.copy($scope.params) + if (params.datefrom) { + params.datefrom = $filter('date')(params.datefrom, 'yyyyMMdd') + } + if (params.dateto) { + params.dateto = $filter('date')(params.dateto, 'yyyyMMdd') + } + params.page = page || $scope.pagination.page || 1 + params.limit = 10 + if ($scope.isAll) { + delete params.client_ids + } + $http.get('/sys/partners/' + clientMoniker + '/lists_settlements', { params: params }).then(function (resp) { + $scope.settlementLogs = resp.data.data + $scope.padding = resp.data.padding + $scope.pagination = resp.data.pagination + }) + } + $scope.getClearingTransactions = function (client_id, detail_id) { + $uibModal.open({ + templateUrl: '/static/analysis/templates/settlement_transactions.html', + controller: 'managerSettlementDetailCtrl', + resolve: { + detail: [ + '$http', + '$stateParams', + function ($http) { + return $http.get('/analysis/partner_card/' + client_id + '/settlement_logs/' + detail_id) + }, + ], + detail_id: detail_id, + }, + size: 'lg', + }) + } + + $scope.getClearingTransactionsOfMergeSettle = function (reportDate) { + $uibModal.open({ + templateUrl: '/static/analysis/templates/settlement_transactions.html', + controller: 'managerSettlementDetailOfMergeSettleCtrl', + resolve: { + detail: [ + '$http', + '$stateParams', + function ($http) { + return $http.get('/analysis/partner_card/' + $scope.client.client_id + '/settlement_logs/report_date/' + reportDate) + }, + ], + client_id: $scope.client.client_id, + }, + size: 'lg', + }) + } + + $scope.checkSubClientChoseShow = function (client) { + $scope.more20ChoseSubClient = !$scope.more20ChoseSubClient + if (client != '') { + $scope.choseSubClientNow = client.short_name + } + } + $scope.clickDisplayChoseDiv = function (event) { + $scope.more20ChoseSubClient = false + } + $scope.choseDivStopPropagation = function (event) { + event.stopPropagation() + } + }, + ]) + app.controller('partnerSurchargeAccountCtrl', [ + '$scope', + '$uibModal', + '$http', + 'clientMoniker', + '$filter', + function ($scope, $uibModal, $http, clientMoniker, $filter) { + $scope.params = {} + $scope.pagination = {} + $scope.today = new Date() + + $scope.chooseToday = function () { + $scope.params.datefrom = $scope.params.dateto = new Date() + $scope.loadSettlementLogs(1) + } + $scope.chooseYesterday = function () { + var yesterday = new Date() + yesterday.setDate(yesterday.getDate() - 1) + $scope.params.datefrom = $scope.params.dateto = yesterday + $scope.loadSettlementLogs(1) + } + $scope.chooseLast7Days = function () { + $scope.params.dateto = new Date() + var day = new Date() + day.setDate(day.getDate() - 7) + $scope.params.datefrom = day + $scope.loadSettlementLogs(1) + } + $scope.thisMonth = function () { + $scope.params.dateto = new Date() + var monthBegin = new Date() + monthBegin.setDate(1) + $scope.params.datefrom = monthBegin + $scope.loadSettlementLogs(1) + } + $scope.lastMonth = function () { + var monthFinish = new Date() + monthFinish.setDate(0) + $scope.params.dateto = monthFinish + var monthBegin = new Date() + monthBegin.setDate(0) + monthBegin.setDate(1) + $scope.params.datefrom = monthBegin + $scope.loadSettlementLogs(1) + } + $scope.loadSettlementLogs = function (page) { + var params = angular.copy($scope.params) + if (params.datefrom) { + params.datefrom = $filter('date')(params.datefrom, 'yyyyMMdd') + } + if (params.dateto) { + params.dateto = $filter('date')(params.dateto, 'yyyyMMdd') + } + params.page = page || $scope.pagination.page || 1 + params.limit = 10 + $http.get('/sys/partners/' + clientMoniker + '/surcharge_account/month_detail').then(function (resp) { + $scope.details = resp.data + }) + } + $scope.getClearingTransactions = function (client_id, detail_id) { + $uibModal.open({ + templateUrl: '/static/analysis/templates/settlement_transactions.html', + controller: 'managerSettlementDetailCtrl', + resolve: { + detail: [ + '$http', + '$stateParams', + function ($http) { + return $http.get('/analysis/partner_card/' + client_id + '/settlement_logs/' + detail_id) + }, + ], + detail_id: detail_id, + }, + size: 'lg', + }) + } + $scope.chooseLast7Days() + }, + ]) + app.controller('managerSettlementDetailCtrl', [ + '$scope', + 'detail', + 'detail_id', + '$http', + function ($scope, detail, detail_id, $http) { + $scope.ctrl = { channel: null } + $scope.show = true + $scope.report = detail.data + $scope.report.total_charge = Decimal.add($scope.report.total_charge, $scope.report.tax_amount).toFixed(2) + angular.forEach($scope.report.channels, function (e) { + e.total_charge = Decimal.add(e.tax_amount, e.total_charge).toFixed(2) + }) + + $scope.channelAndDayOfAnalysis = function () { + $http.get('/analysis/partner_card/settlement_logs/' + detail_id + '/analysis/' + $scope.ctrl.channel).then(function (resp) { + $scope.channelAndDayMap = resp.data + $scope.index = 0 + }) + } + $scope.channelAndDayOfAnalysis(1) + }, + ]) + app.controller('managerSettlementDetailOfMergeSettleCtrl', [ + '$scope', + 'detail', + 'client_id', + '$http', + function ($scope, detail, client_id, $http) { + $scope.ctrl = { channel: null } + $scope.show = true + $scope.report = detail.data + $scope.report.total_charge = Decimal.add($scope.report.total_charge, $scope.report.tax_amount).toFixed(2) + angular.forEach($scope.report.channels, function (e) { + e.total_charge = Decimal.add(e.tax_amount, e.total_charge).toFixed(2) + }) + }, + ]) + app.controller('productCtrl', [ + '$scope', + '$http', + '$uibModal', + 'commonDialog', + '$state', + 'Upload', + 'wechatGoodMcc', + function ($scope, $http, $uibModal, commonDialog, $state, Upload, wechatGoodMcc) { + $scope.importShow = 0 + $scope.pagination = {} + $scope.params = { text_type: 'all', search_text: null } + $scope.wechatMccIndustries = wechatGoodMcc.configs() + $scope.loadProducts = function () { + $http.get('/sys/product/' + $scope.partner.client_moniker + '/list').then(function (resp) { + $scope.mcc_goods = resp.data + }) + } + $scope.updateMccInfo = function (mccInfo) { + mccInfo.client_moniker = $scope.partner.client_moniker + $http.put('/sys/product/update', mccInfo).then(function (resp) { + $state.reload() + }) + } + $scope.loadProducts() + /*$scope.importExcel = function (file) { if (file != null) { Upload.upload({ url: '/attachment/files', @@ -5402,1781 +6180,2056 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }) } }*/ - }]); - app.controller('AddProductDialogCtrl', ['$scope', '$http', '$uibModal', 'product', 'partner', '$state', 'industryMap', function ($scope, $http, $uibModal, product, partner, $state, industryMap) { - $scope.product = angular.copy(product); - $scope.product.partner = true; - $scope.partner = angular.copy(partner); - $scope.industries = industryMap.configs(); - - if (($scope.product.commodity_id)) { - $scope.edit_or_add = "Edit"; + }, + ]) + app.controller('AddProductDialogCtrl', [ + '$scope', + '$http', + '$uibModal', + 'product', + 'partner', + '$state', + 'industryMap', + function ($scope, $http, $uibModal, product, partner, $state, industryMap) { + $scope.product = angular.copy(product) + $scope.product.partner = true + $scope.partner = angular.copy(partner) + $scope.industries = industryMap.configs() + + if ($scope.product.commodity_id) { + $scope.edit_or_add = 'Edit' + } else { + $scope.edit_or_add = 'Add' + $scope.product.industry = $scope.partner.industry + } + $scope.save = function () { + if ($scope.product.commodity_id) { + $http.put('/client/product/', $scope.product).then(function (resp) { + alert('Success') + $scope.$close() + $state.reload() + }) } else { - $scope.edit_or_add = "Add"; - $scope.product.industry = $scope.partner.industry; - } - $scope.save = function () { - if ($scope.product.commodity_id) { - $http.put('/client/product/', $scope.product).then(function (resp) { - alert("Success"); - $scope.$close(); - $state.reload(); - }); - } else { - $http.post('/client/product/' + $scope.partner.client_moniker, $scope.product).then(function (resp) { - alert("Success"); - $scope.$close(); - $state.reload(); - }); - } + $http.post('/client/product/' + $scope.partner.client_moniker, $scope.product).then(function (resp) { + alert('Success') + $scope.$close() + $state.reload() + }) } - }]); - // MID Management - app.controller('subMerchantIdApplicaitonsCtrl', ['$scope', '$http', '$uibModal', '$state', 'commonDialog', '$sce', function ($scope, $http, $uibModal, $state, commonDialog, $sce) { - // 初始化子商户 - $scope.loadSubMerchantInfos = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/list_sub_applices', { params: {} }).then(function (resp) { - $scope.subMerchantInfos = resp.data; - }); - // $http.get('/sys/partners/' + $scope.partner.client_moniker + '/list_rpay_sub_applices', {params: {}}).then(function (resp) { - // $scope.subRpayMerchantInfos = resp.data; - // }); - // - // $http.get('/sys/partners/' + $scope.partner.client_moniker + '/list_yeepay_sub_applices', {params: {}}).then(function (resp) { - // $scope.subYeepayMerchantInfos = resp.data; - // }); - // $http.get('/sys/partners/' + $scope.partner.client_moniker + '/queryMWMerchantIdStatus').then(function (resp) { - // $scope.partner.cardInfo = resp.data; - // }); - }; - $scope.loadSubMerchantInfos(); - // 加载卡支付信息 - $scope.loadCardInfos = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/queryMWMerchantIdStatus').then(function (resp) { - $scope.cardInfo = resp.data; - }); - } - $scope.loadCardInfos(); - // 初始化信息 - $scope.loadPartnerInfo = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker).then(function (resp) { - $scope.partnerInfo = resp.data; - $scope.doSwitchCommonSubMerchantId(); - }) - }; - $scope.loadPartnerInfo(); - // 编辑Wechat Sub Merchant Id - $scope.saveSubMerchantId = function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/payment_config', { sub_merchant_id: $scope.partnerInfo.sub_merchant_id }).then(function (resp) { - $scope.loadPartnerInfo(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }); - }; - // Wechat-applay - $scope.applyWxSubMerchantId = function () { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/new_apply_wx_sub_merchant_id.html', - controller: 'newApplyWxSubMerchantIdCtrl', - resolve: { - subMerchantInfo: function () { - return $scope.partner; - }, - merchantIds: ['$http', '$stateParams', function ($http) { - return $http.get('/sys/partners/' + $scope.partner.client_moniker + '/get_merchant_ids'); - }] - } - }).result.then(function () { - $scope.loadSubMerchantInfos(); + } + }, + ]) + // MID Management + app.controller('subMerchantIdApplicaitonsCtrl', [ + '$scope', + '$http', + '$uibModal', + '$state', + 'commonDialog', + '$sce', + function ($scope, $http, $uibModal, $state, commonDialog, $sce) { + // 初始化子商户 + $scope.loadSubMerchantInfos = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/list_sub_applices', { params: {} }).then(function (resp) { + $scope.subMerchantInfos = resp.data + }) + // $http.get('/sys/partners/' + $scope.partner.client_moniker + '/list_rpay_sub_applices', {params: {}}).then(function (resp) { + // $scope.subRpayMerchantInfos = resp.data; + // }); + // + // $http.get('/sys/partners/' + $scope.partner.client_moniker + '/list_yeepay_sub_applices', {params: {}}).then(function (resp) { + // $scope.subYeepayMerchantInfos = resp.data; + // }); + // $http.get('/sys/partners/' + $scope.partner.client_moniker + '/queryMWMerchantIdStatus').then(function (resp) { + // $scope.partner.cardInfo = resp.data; + // }); + } + $scope.loadSubMerchantInfos() + // 加载卡支付信息 + $scope.loadCardInfos = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/queryMWMerchantIdStatus').then(function (resp) { + $scope.cardInfo = resp.data + }) + } + $scope.loadCardInfos() + // 初始化信息 + $scope.loadPartnerInfo = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker).then(function (resp) { + $scope.partnerInfo = resp.data + $scope.doSwitchCommonSubMerchantId() + }) + } + $scope.loadPartnerInfo() + // 编辑Wechat Sub Merchant Id + $scope.saveSubMerchantId = function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/payment_config', { sub_merchant_id: $scope.partnerInfo.sub_merchant_id }).then( + function (resp) { + $scope.loadPartnerInfo() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + // Wechat-applay + $scope.applyWxSubMerchantId = function () { + $uibModal + .open({ + templateUrl: '/static/payment/partner/templates/new_apply_wx_sub_merchant_id.html', + controller: 'newApplyWxSubMerchantIdCtrl', + resolve: { + subMerchantInfo: function () { + return $scope.partner + }, + merchantIds: [ + '$http', + '$stateParams', + function ($http) { + return $http.get('/sys/partners/' + $scope.partner.client_moniker + '/get_merchant_ids') + }, + ], + }, + }) + .result.then(function () { + $scope.loadSubMerchantInfos() + }) + } + // 刷新Wechat Sub Merchant Id + $scope.queryWechatSubMerchantIdStatus = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/get_merchant_ids/' + $scope.partnerInfo.sub_merchant_id + '/status').then( + function (resp) { + commonDialog.alert({ + title: 'Wechat Apply Status(' + resp.data.apply_status + ')', + content: resp.data.response_str, + type: 'info', }) - }; - // 刷新Wechat Sub Merchant Id - $scope.queryWechatSubMerchantIdStatus = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/get_merchant_ids/' + $scope.partnerInfo.sub_merchant_id + '/status').then(function (resp) { + $scope.loadPartnerInfo() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + // history + $scope.showSubMerchantLogs = function () { + $uibModal.open({ + templateUrl: '/static/payment/partner/templates/client_sub_merchant_id_log.html', + controller: 'clientSubMerchantIdLogCtrl', + size: 'lg', + resolve: { + logs: [ + '$http', + function ($http) { + return $http.get('/sys/partners/' + $scope.partner.client_moniker + '/get_sub_merchant_id_logs') + }, + ], + }, + }) + } + // 刷新Wechat Institution Merchant Id + $scope.refreshWechatInstitutionMerchantId = function () { + $http + .put('/sys/partners/' + $scope.partner.client_moniker + '/wechat_institution_merchant_id', { + wechat_institution_merchant_id: $scope.partnerInfo.wechat_institution_merchant_id, + }) + .then( + function (resp) { + $scope.loadPartnerInfo() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + // switch开关 + $scope.doSwitchCommonSubMerchantId = function () { + $("input[name='switch']").bootstrapSwitch({ + onText: 'ON', + offText: 'OFF', + size: 'mini', + state: $scope.partnerInfo.common_sub_merchant_id, + onSwitchChange: function (event, state) { + //监听switch change事件,可以根据状态把相应的业务逻辑代码写在这里 + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/common_sub_merchant_id', { allow: state }).then( + function () { + $scope.loadPartnerInfo() + }, + function (resp) { commonDialog.alert({ - title: 'Wechat Apply Status(' + resp.data.apply_status + ")", - content: resp.data.response_str, - type: 'info' + title: 'Failed to change common_sub_merchant_id permission status', + content: resp.data.message, + type: 'error', }) - $scope.loadPartnerInfo(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + }, + }) + } + // Alipay保存名称修改 + $scope.saveAliSubMerchantId = function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/ali_sub_merchant_id', { ali_sub_merchant_id: $scope.partnerInfo.ali_sub_merchant_id }).then( + function (resp) { + commonDialog.alert({ + title: 'Success', + content: 'Modify Ali Sub Merchant ID successfully', + type: 'success', }) - } - // history - $scope.showSubMerchantLogs = function () { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/client_sub_merchant_id_log.html', - controller: 'clientSubMerchantIdLogCtrl', - size: 'lg', - resolve: { - logs: ['$http', function ($http) { - return $http.get('/sys/partners/' + $scope.partner.client_moniker + '/get_sub_merchant_id_logs'); - }] + $scope.loadPartnerInfo() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + // 刷新Alipay + $scope.queryAlipayGms = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/alipay_gms').then( + function (resp) { + commonDialog.alert({ title: 'Success', content: resp.data.result_status, type: 'success' }) + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: '查询失败:' + resp.data.message, type: 'error' }) + } + ) + } + // 刷新AlipayOnline + $scope.queryAlipayOnlineGms = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/alipayOnline_gms').then( + function (resp) { + commonDialog.alert({ title: 'Success', content: resp.data.result_status, type: 'success' }) + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: '查询失败:' + resp.data.message, type: 'error' }) + } + ) + } + // Alipay进件 + $scope.submitAlipaySubId = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/alipay_gms_json').then(function (resp) { + $scope.alipay_gms_json = resp.data + commonDialog + .confirm({ + title: 'Warning', + content: '是否使用该商户的现有信息进件?', + json: $scope.alipay_gms_json, + }) + .then(function () { + $http.post('/sys/partners/' + $scope.partner.client_moniker + '/register/alipay_gms').then( + function () { + commonDialog.alert({ title: 'Success', content: 'Alipay进件成功', type: 'success' }) + $scope.loadPartnerInfo() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: '进件失败:' + resp.data.message, type: 'error' }) } + ) }) - }; - // 刷新Wechat Institution Merchant Id - $scope.refreshWechatInstitutionMerchantId = function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/wechat_institution_merchant_id', { wechat_institution_merchant_id: $scope.partnerInfo.wechat_institution_merchant_id }).then(function (resp) { - $scope.loadPartnerInfo(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }); - }; - // switch开关 - $scope.doSwitchCommonSubMerchantId = function () { - $("input[name='switch']").bootstrapSwitch({ - onText: "ON", - offText: "OFF", - size: 'mini', - state: $scope.partnerInfo.common_sub_merchant_id, - onSwitchChange: function (event, state) { - //监听switch change事件,可以根据状态把相应的业务逻辑代码写在这里 - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/common_sub_merchant_id', { allow: state }).then(function () { - $scope.loadPartnerInfo(); - }, function (resp) { - commonDialog.alert({ - title: 'Failed to change common_sub_merchant_id permission status', - content: resp.data.message, - type: 'error' - }) - }) + }) + } + // AlipayOnline进件 + $scope.submitAlipayOnlineSubId = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/alipayOnline_gms_json').then(function (resp) { + $scope.alipayOnline_gms_json = resp.data + commonDialog + .confirm({ + title: 'Warning', + content: '是否使用该商户的现有信息进件?', + json: $scope.alipayOnline_gms_json, + }) + .then(function () { + $http.post('/sys/partners/' + $scope.partner.client_moniker + '/register/alipayOnline_gms').then( + function () { + commonDialog.alert({ title: 'Success', content: '提示:AlipayOnline进件成功', type: 'success' }) + $scope.loadPartnerInfo() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: '进件失败:' + resp.data.message, type: 'error' }) } + ) }) - }; - // Alipay保存名称修改 - $scope.saveAliSubMerchantId = function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/ali_sub_merchant_id', { ali_sub_merchant_id: $scope.partnerInfo.ali_sub_merchant_id }).then(function (resp) { - commonDialog.alert({ - title: 'Success', - content: 'Modify Ali Sub Merchant ID successfully', - type: 'success' - }); - $scope.loadPartnerInfo(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }); - }; - // 刷新Alipay - $scope.queryAlipayGms = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/alipay_gms').then(function (resp) { - commonDialog.alert({ title: 'Success', content: resp.data.result_status, type: 'success' }); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: "查询失败:" + resp.data.message, type: 'error' }); + }) + } + // use sub_merchant_id + $scope.useSubMerchantId = function (sub_merchant_id) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/payment_config', { sub_merchant_id: sub_merchant_id }).then( + function (resp) { + commonDialog.alert({ + title: 'Success', + content: 'Modify Wechat Sub Merchant ID successfully', + type: 'success', }) - }; - // 刷新AlipayOnline - $scope.queryAlipayOnlineGms = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/alipayOnline_gms').then(function (resp) { - commonDialog.alert({ title: 'Success', content: resp.data.result_status, type: 'success' }); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: "查询失败:" + resp.data.message, type: 'error' }); + $scope.loadPartnerInfo() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + // 查看sub_merchant_id详情 + $scope.checkDetail = function (merchantInfo, channel) { + $uibModal.open({ + templateUrl: '/static/payment/partner/templates/sub_merchant_detail.html', + controller: 'subMerchantDetailCtrl', + resolve: { + subMerchantInfo: function () { + return merchantInfo + }, + channel: function () { + return channel + }, + }, + }) + } + // 修改sub_merchant_id + $scope.modifySubMerchantId = function (subMerchantId, channel) { + $uibModal + .open({ + templateUrl: '/static/payment/partner/templates/md_sub_merchant_id.html', + controller: 'ModifysubMerchantIdCtrl', + resolve: { + clientMoniker: function () { + return $scope.partner.client_moniker + }, + merchantId: function () { + return subMerchantId + }, + channel: function () { + return channel + }, + }, + }) + .result.then(function () { + commonDialog.alert({ + title: 'Success', + content: 'Modify successfully', + type: 'success', }) - } - // Alipay进件 - $scope.submitAlipaySubId = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/alipay_gms_json').then(function (resp) { - $scope.alipay_gms_json = resp.data; - commonDialog.confirm({ - title: 'Warning', - content: '是否使用该商户的现有信息进件?', - json: $scope.alipay_gms_json - }).then(function () { - $http.post('/sys/partners/' + $scope.partner.client_moniker + '/register/alipay_gms').then(function () { - commonDialog.alert({ title: 'Success', content: 'Alipay进件成功', type: 'success' }); - $scope.loadPartnerInfo(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: "进件失败:" + resp.data.message, type: 'error' }); - }) - }); + $scope.loadPartnerInfo() + }) + } + // 卡支付apply + $scope.applyMWSubMerchantId = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/mw_info').then(function (resp) { + commonDialog + .confirm({ + title: 'Apply Merchant Warrior Sub Merchant Id', + contentHtml: $sce.trustAsHtml('Are you sure to apply merchant Warrior sub merchant id for [' + $scope.partner.company_name + ']?'), + json: resp.data, }) - }; - // AlipayOnline进件 - $scope.submitAlipayOnlineSubId = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/alipayOnline_gms_json').then(function (resp) { - $scope.alipayOnline_gms_json = resp.data; - commonDialog.confirm({ - title: 'Warning', - content: '是否使用该商户的现有信息进件?', - json: $scope.alipayOnline_gms_json - }).then(function () { - $http.post('/sys/partners/' + $scope.partner.client_moniker + '/register/alipayOnline_gms').then(function () { - commonDialog.alert({ title: 'Success', content: '提示:AlipayOnline进件成功', type: 'success' }); - $scope.loadPartnerInfo(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: "进件失败:" + resp.data.message, type: 'error' }); - }); - }) - }); - }; - // use sub_merchant_id - $scope.useSubMerchantId = function (sub_merchant_id) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/payment_config', { sub_merchant_id: sub_merchant_id }).then(function (resp) { - commonDialog.alert({ + .then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/applyMWMerchantId').then( + function (res) { + commonDialog.alert({ title: 'Success', - content: 'Modify Wechat Sub Merchant ID successfully', - type: 'success' - }); - $scope.loadPartnerInfo(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }); - } - // 查看sub_merchant_id详情 - $scope.checkDetail = function (merchantInfo, channel) { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/sub_merchant_detail.html', - controller: 'subMerchantDetailCtrl', - resolve: { - subMerchantInfo: function () { - return merchantInfo - }, - channel: function () { - return channel - } - } - }) - } - // 修改sub_merchant_id - $scope.modifySubMerchantId = function (subMerchantId, channel) { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/md_sub_merchant_id.html', - controller: 'ModifysubMerchantIdCtrl', - resolve: { - clientMoniker: function () { - return $scope.partner.client_moniker - }, - merchantId: function () { - return subMerchantId - }, - channel: function () { - return channel - } + content: 'Apply Merchant Warrior Sub Merchant ID successfully', + type: 'success', + }) + $scope.cardInfo = res.data + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) } - }).result.then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Modify successfully', - type: 'success' - }); - $scope.loadPartnerInfo(); + ) }) + }) + } + + $scope.copyMWProfile = function () { + commonDialog.inputText({ title: '请输入复制来源商户编码' }).then(function (text) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/copy_mw_config', { client_moniker: text }).then( + function (resp) { + commonDialog.alert({ + title: 'Success', + content: 'Modify successfully', + type: 'success', + }) + $scope.loadPartnerInfo() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + }) + } + + // $scope.showMoreMerchantInfo = false; + // $scope.hideMerchantInfo = function () { + // $scope.showMoreMerchantInfo = !$scope.showMoreMerchantInfo; + // }; + $scope.updateSubMerchantId = function (sub_merchant_id) { + angular.forEach($scope.subMerchantInfos, function (each) { + if (sub_merchant_id == each.sub_merchant_id) { + $scope.merchant_app_id = each.merchant_app_id + } + }) + $uibModal + .open({ + templateUrl: '/static/payment/partner/templates/update_apply_wx_sub_merchant_id.html', + controller: 'updateApplyWxSubMerchantIdCtrl', + resolve: { + merchantInfo: $scope.partner, + merchantIds: [ + '$http', + '$stateParams', + function ($http) { + return $http.get('/sys/partners/' + $scope.partner.client_moniker + '/get_merchant_ids') + }, + ], + subMerchantInfo: [ + '$http', + '$stateParams', + function ($http) { + return $http.get('/sys/partners/' + $scope.partner.client_moniker + '/get_merchant_ids/' + $scope.merchant_app_id) + }, + ], + }, + }) + .result.then(function () { + $scope.loadSubMerchantInfos() + }) + } + }, + ]) + app.controller('applyWxSubMerchantIdCtrl', [ + '$scope', + '$http', + '$uibModal', + '$state', + 'subMerchantInfo', + '$filter', + 'merchantIds', + 'commonDialog', + function ($scope, $http, $uibModal, $state, subMerchantInfo, $filter, merchantIds, commonDialog) { + $scope.wxIndustries = angular.copy(wxMerchantIndustries) + $scope.subMerchantInfo = angular.copy(subMerchantInfo) + $scope.merchantIds = merchantIds.data + $scope.subMerchantInfo.industry = $filter('wxindustries')($scope.subMerchantInfo.industry) + $scope.saveAppliy = function (form) { + $scope.errmsg = null + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true + } + }) + return } - // 卡支付apply - $scope.applyMWSubMerchantId = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/mw_info').then(function (resp) { - commonDialog.confirm({ - title: 'Apply Merchant Warrior Sub Merchant Id', - contentHtml: $sce.trustAsHtml('Are you sure to apply merchant Warrior sub merchant id for [' + $scope.partner.company_name + ']?'), - json: resp.data - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/applyMWMerchantId').then(function (res) { - commonDialog.alert({ - title: 'Success', - content: 'Apply Merchant Warrior Sub Merchant ID successfully', - type: 'success' - }); - $scope.cardInfo = res.data; - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - }) - }); - }; - - $scope.copyMWProfile = function () { - commonDialog.inputText({title:'请输入复制来源商户编码'}).then(function (text) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/copy_mw_config',{client_moniker: text}).then(function (resp) { + $http.post('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/sub_apply', $scope.subMerchantInfo).then( + function (resp) { + $scope.apply_sub_merchant_id = resp.data + $scope.$close() + if (subMerchantInfo.sub_merchant_id != null) { + commonDialog.confirm({ title: 'Confirm', content: '已申请成功,是否确认使用' }).then(function () { + $http.put('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/payment_config', { sub_merchant_id: $scope.apply_sub_merchant_id }).then( + function (resp) { commonDialog.alert({ - title: 'Success', - content: 'Modify successfully', - type: 'success' - }); - $scope.loadPartnerInfo(); - },function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - }); - }; - - // $scope.showMoreMerchantInfo = false; - // $scope.hideMerchantInfo = function () { - // $scope.showMoreMerchantInfo = !$scope.showMoreMerchantInfo; - // }; - $scope.updateSubMerchantId = function (sub_merchant_id) { - angular.forEach($scope.subMerchantInfos, function (each) { - if(sub_merchant_id==each.sub_merchant_id){ - $scope.merchant_app_id=each.merchant_app_id; - } - }); - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/update_apply_wx_sub_merchant_id.html', - controller: 'updateApplyWxSubMerchantIdCtrl', - resolve: { - merchantInfo: $scope.partner, - merchantIds: ['$http', '$stateParams', function ($http) { - return $http.get('/sys/partners/' + $scope.partner.client_moniker + '/get_merchant_ids'); - }], - subMerchantInfo: ['$http', '$stateParams', function ($http) { - return $http.get('/sys/partners/' + $scope.partner.client_moniker + '/get_merchant_ids/' + $scope.merchant_app_id); - }] - } - }).result.then(function () { - $scope.loadSubMerchantInfos(); - }) - } - }]); - app.controller('applyWxSubMerchantIdCtrl', ['$scope', '$http', '$uibModal', '$state', 'subMerchantInfo', '$filter', 'merchantIds', 'commonDialog', function ($scope, $http, $uibModal, $state, subMerchantInfo, $filter, merchantIds, commonDialog) { - $scope.wxIndustries = angular.copy(wxMerchantIndustries); - $scope.subMerchantInfo = angular.copy(subMerchantInfo); - $scope.merchantIds = merchantIds.data; - $scope.subMerchantInfo.industry = $filter('wxindustries')($scope.subMerchantInfo.industry); - $scope.saveAppliy = function (form) { - $scope.errmsg = null; - if (form.$invalid) { - angular.forEach(form, function (item, key) { - if (key.indexOf('$') < 0) { - item.$dirty = true; - } - }); - return; - } - $http.post('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/sub_apply', $scope.subMerchantInfo).then(function (resp) { - $scope.apply_sub_merchant_id = resp.data; - $scope.$close(); - if (subMerchantInfo.sub_merchant_id != null) { - commonDialog.confirm({ title: 'Confirm', content: '已申请成功,是否确认使用' }).then(function () { - $http.put('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/payment_config', { sub_merchant_id: $scope.apply_sub_merchant_id }).then(function (resp) { - commonDialog.alert({ - title: 'Success', - content: 'Modify Wechat Sub Merchant ID successfully', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }); + title: 'Success', + content: 'Modify Wechat Sub Merchant ID successfully', + type: 'success', }) - } else { - $http.put('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/payment_config', { sub_merchant_id: $scope.apply_sub_merchant_id }).then(function (resp) { - commonDialog.alert({ - title: 'Success', - content: 'Apply Success And Modify Wechat Sub Merchant ID successfully', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }); - } - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }) - } - }]); - // 展示信息 - app.controller('subMerchantDetailCtrl', ['$scope', '$http', '$uibModal', '$state', 'commonDialog', 'subMerchantInfo', 'channel', function ($scope, $http, $uibModal, $state, commonDialog, subMerchantInfo, channel) { - $scope.channel = channel - $scope.subMerchantInfo = subMerchantInfo - }]); - // 修改sub_merchant_id - app.controller('ModifysubMerchantIdCtrl', ['$scope', '$http', '$uibModal', '$state', 'commonDialog', 'clientMoniker', 'merchantId', 'channel', function ($scope, $http, $uibModal, $state, commonDialog, clientMoniker, merchantId, channel) { - $scope.merchantId = merchantId - $scope.flag = false - $scope.confirm = function () { - $scope.flag = true - if (channel === 'Wechat') { - $http.put('/sys/partners/' + clientMoniker + '/payment_config', { sub_merchant_id: $scope.merchantId }).then(function (resp) { - $scope.$close(); - }, function (resp) { - $scope.flag = false - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }); - } else if (channel === 'Alipay' || channel === 'AlipayOnline') { - $http.put('/sys/partners/' + clientMoniker + '/ali_sub_merchant_id', { ali_sub_merchant_id: $scope.merchantId }).then(function (resp) { - $scope.$close(); - }, function (resp) { - $scope.flag = false + $state.reload() + }, + function (resp) { commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }); - } + } + ) + }) + } else { + $http.put('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/payment_config', { sub_merchant_id: $scope.apply_sub_merchant_id }).then( + function (resp) { + commonDialog.alert({ + title: 'Success', + content: 'Apply Success And Modify Wechat Sub Merchant ID successfully', + type: 'success', + }) + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + }, + ]) + // 展示信息 + app.controller('subMerchantDetailCtrl', [ + '$scope', + '$http', + '$uibModal', + '$state', + 'commonDialog', + 'subMerchantInfo', + 'channel', + function ($scope, $http, $uibModal, $state, commonDialog, subMerchantInfo, channel) { + $scope.channel = channel + $scope.subMerchantInfo = subMerchantInfo + }, + ]) + // 修改sub_merchant_id + app.controller('ModifysubMerchantIdCtrl', [ + '$scope', + '$http', + '$uibModal', + '$state', + 'commonDialog', + 'clientMoniker', + 'merchantId', + 'channel', + function ($scope, $http, $uibModal, $state, commonDialog, clientMoniker, merchantId, channel) { + $scope.merchantId = merchantId + $scope.flag = false + $scope.confirm = function () { + $scope.flag = true + if (channel === 'Wechat') { + $http.put('/sys/partners/' + clientMoniker + '/payment_config', { sub_merchant_id: $scope.merchantId }).then( + function (resp) { + $scope.$close() + }, + function (resp) { + $scope.flag = false + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } else if (channel === 'Alipay' || channel === 'AlipayOnline') { + $http.put('/sys/partners/' + clientMoniker + '/ali_sub_merchant_id', { ali_sub_merchant_id: $scope.merchantId }).then( + function (resp) { + $scope.$close() + }, + function (resp) { + $scope.flag = false + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) } - }]); - app.controller('newApplyWxSubMerchantIdCtrl', ['$scope', '$http', '$uibModal', '$state', 'subMerchantInfo', '$filter', 'merchantIds', 'commonDialog', 'wechatGoodMcc', 'businessTypesMap', function ($scope, $http, $uibModal, $state, subMerchantInfo, $filter, merchantIds, commonDialog, wechatGoodMcc, businessTypesMap) { - $scope.wxIndustries = angular.copy(wxMerchantIndustries); - $scope.subMerchantInfo = angular.copy(subMerchantInfo); - $scope.subMerchantInfo.company_register_no = subMerchantInfo.abn ? subMerchantInfo.abn : subMerchantInfo.acn; - $scope.wechatMccIndustries = wechatGoodMcc.configs(); - $scope.merchantIds = merchantIds.data; - $scope.businessTypesMap = businessTypesMap.configs(); - if ($scope.subMerchantInfo.client_pay_type) { - if ($scope.subMerchantInfo.client_pay_type.indexOf('1') >= 0 && $scope.subMerchantInfo.client_pay_type.indexOf('2') >= 0) { - $scope.subMerchantInfo.business_type = 'BOTH'; - } - else if ($scope.subMerchantInfo.client_pay_type.indexOf('1') >= 0) { - $scope.subMerchantInfo.business_type = 'ONLINE'; - } - else if ($scope.subMerchantInfo.client_pay_type.indexOf('2') >= 0) { - $scope.subMerchantInfo.business_type = 'OFFLINE'; - } + } + }, + ]) + app.controller('newApplyWxSubMerchantIdCtrl', [ + '$scope', + '$http', + '$uibModal', + '$state', + 'subMerchantInfo', + '$filter', + 'merchantIds', + 'commonDialog', + 'wechatGoodMcc', + 'businessTypesMap', + function ($scope, $http, $uibModal, $state, subMerchantInfo, $filter, merchantIds, commonDialog, wechatGoodMcc, businessTypesMap) { + $scope.wxIndustries = angular.copy(wxMerchantIndustries) + $scope.subMerchantInfo = angular.copy(subMerchantInfo) + $scope.subMerchantInfo.company_register_no = subMerchantInfo.abn ? subMerchantInfo.abn : subMerchantInfo.acn + $scope.wechatMccIndustries = wechatGoodMcc.configs() + $scope.merchantIds = merchantIds.data + $scope.businessTypesMap = businessTypesMap.configs() + if ($scope.subMerchantInfo.client_pay_type) { + if ($scope.subMerchantInfo.client_pay_type.indexOf('1') >= 0 && $scope.subMerchantInfo.client_pay_type.indexOf('2') >= 0) { + $scope.subMerchantInfo.business_type = 'BOTH' + } else if ($scope.subMerchantInfo.client_pay_type.indexOf('1') >= 0) { + $scope.subMerchantInfo.business_type = 'ONLINE' + } else if ($scope.subMerchantInfo.client_pay_type.indexOf('2') >= 0) { + $scope.subMerchantInfo.business_type = 'OFFLINE' + } + } else { + $scope.subMerchantInfo.business_type = 'BOTH' + } + + if ($scope.subMerchantInfo.industry) { + $scope.subMerchantInfo.industry = $filter('newWxMerchantsFilter')($scope.subMerchantInfo.industry) + } + if ($scope.subMerchantInfo.mc_code) { + $scope.subMerchantInfo.mcc_code = $scope.subMerchantInfo.mc_code + } + if (subMerchantInfo.certificat_expire_date) { + var datestr = subMerchantInfo.certificat_expire_date.replace(/-/g, '/') + $scope.subMerchantInfo.certificat_expire_date = new Date(datestr) + } + if ($scope.subMerchantInfo.business_structure) { + $scope.subMerchantInfo.merchant_type = $scope.subMerchantInfo.business_structure != 'Registered body(Sole Trader)' ? 'ENTERPRISE' : 'INDIVIDUAL' + } + if (subMerchantInfo.certificat_expire_date) { + if (subMerchantInfo.certificat_expire_date == 'PERMANENT') { + $scope.subMerchantInfo.certificat_expire_date_premanent = true + } else if (subMerchantInfo.certificat_expire_date == 'N/A') { + $scope.subMerchantInfo.certificat_expire_date_NA = true } else { - $scope.subMerchantInfo.business_type = 'BOTH'; + var datestr = subMerchantInfo.certificat_expire_date.replace(/-/g, '/') + $scope.subMerchantInfo.certificat_expire_date_d = new Date(datestr) } + } - if ($scope.subMerchantInfo.industry) { - $scope.subMerchantInfo.industry = $filter('newWxMerchantsFilter')($scope.subMerchantInfo.industry); + $scope.checkExpriedate = function (value) { + if (value) { + $scope.subMerchantInfo.certificat_expire_date_premanent = false + $scope.subMerchantInfo.certificat_expire_date_NA = false } - if ($scope.subMerchantInfo.mc_code) { - $scope.subMerchantInfo.mcc_code = $scope.subMerchantInfo.mc_code; + } + $scope.checkExpriedateOther = function (value) { + if (value == 'PERMANENT') { + if ($scope.subMerchantInfo.certificat_expire_date_premanent) { + $scope.subMerchantInfo.certificat_expire_date_NA = false + $scope.subMerchantInfo.certificat_expire_date_d = null + } + } else if (value == 'N/A') { + if ($scope.subMerchantInfo.certificat_expire_date_NA) { + $scope.subMerchantInfo.certificat_expire_date_premanent = false + $scope.subMerchantInfo.certificat_expire_date_d = null + } } - if (subMerchantInfo.certificat_expire_date) { - var datestr = subMerchantInfo.certificat_expire_date.replace(/-/g, '/'); - $scope.subMerchantInfo.certificat_expire_date = new Date(datestr); + } + $scope.saveAppliy = function (form) { + $scope.errmsg = null + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true + } + }) + return } - if ($scope.subMerchantInfo.business_structure) { - $scope.subMerchantInfo.merchant_type = $scope.subMerchantInfo.business_structure != 'Registered body(Sole Trader)' ? "ENTERPRISE" : "INDIVIDUAL"; + // var merchant_type = $scope.subMerchantInfo.business_structure == 'Company'? 1:2; + var params = { + company_name: $scope.subMerchantInfo.company_name, + merchant_id: $scope.subMerchantInfo.merchant_id, + short_name: $scope.subMerchantInfo.short_name, + office_phone: $scope.subMerchantInfo.office_phone, + contact_person: $scope.subMerchantInfo.contact_person, + contact_phone: $scope.subMerchantInfo.contact_phone, + company_phone: $scope.subMerchantInfo.company_phone, + contact_email: $scope.subMerchantInfo.contact_email, + industry: $scope.subMerchantInfo.industry, + company_website: $scope.subMerchantInfo.company_website, + merchant_type: $scope.subMerchantInfo.merchant_type, + mcc_code: $scope.subMerchantInfo.mcc_code, + address: $scope.subMerchantInfo.address, + business_type: $scope.subMerchantInfo.business_type, } - if (subMerchantInfo.certificat_expire_date) { - if (subMerchantInfo.certificat_expire_date == "PERMANENT") { - $scope.subMerchantInfo.certificat_expire_date_premanent = true; - } else if (subMerchantInfo.certificat_expire_date == "N/A") { - $scope.subMerchantInfo.certificat_expire_date_NA = true; - } else { - var datestr = subMerchantInfo.certificat_expire_date.replace(/-/g, '/'); - $scope.subMerchantInfo.certificat_expire_date_d = new Date(datestr); - } + if (params.business_type == 'ONLINE') { + params.address = null + } else if (params.business_type == 'OFFLINE') { + params.company_website = null } - $scope.checkExpriedate = function (value) { - if (value) { - $scope.subMerchantInfo.certificat_expire_date_premanent = false; - $scope.subMerchantInfo.certificat_expire_date_NA = false; - } - } - $scope.checkExpriedateOther = function (value) { - if (value == 'PERMANENT') { - if ($scope.subMerchantInfo.certificat_expire_date_premanent) { - $scope.subMerchantInfo.certificat_expire_date_NA = false; - $scope.subMerchantInfo.certificat_expire_date_d = null; - } - } else if (value == 'N/A') { - if ($scope.subMerchantInfo.certificat_expire_date_NA) { - $scope.subMerchantInfo.certificat_expire_date_premanent = false; - $scope.subMerchantInfo.certificat_expire_date_d = null; - } - } + if (params.merchant_type == 'ENTERPRISE') { + params.director_name = $scope.subMerchantInfo.director_name + params.director_id_number = $scope.subMerchantInfo.director_id_number + params.company_register_no = $scope.subMerchantInfo.company_register_no + params.certificat_expire_date = $scope.subMerchantInfo.certificat_expire_date + + if ($scope.subMerchantInfo.certificat_expire_date_d) { + params.certificat_expire_date = $filter('dateConversionStr')($scope.subMerchantInfo.certificat_expire_date_d) + } else if ($scope.subMerchantInfo.certificat_expire_date_premanent) { + params.certificat_expire_date = 'PERMANENT' + } else if ($scope.subMerchantInfo.certificat_expire_date_NA) { + params.certificat_expire_date = 'N/A' + } else { + alert('Certificate expiration time is required') + return + } + } else { + params.principal_name = $scope.subMerchantInfo.principal_name + params.principal_id_number = $scope.subMerchantInfo.principal_id_number } - $scope.saveAppliy = function (form) { - $scope.errmsg = null; - if (form.$invalid) { - angular.forEach(form, function (item, key) { - if (key.indexOf('$') < 0) { - item.$dirty = true; - } - }); - return; - } - // var merchant_type = $scope.subMerchantInfo.business_structure == 'Company'? 1:2; - var params = { - company_name: $scope.subMerchantInfo.company_name, - merchant_id: $scope.subMerchantInfo.merchant_id, - short_name: $scope.subMerchantInfo.short_name, - office_phone: $scope.subMerchantInfo.office_phone, - contact_person: $scope.subMerchantInfo.contact_person, - contact_phone: $scope.subMerchantInfo.contact_phone, - company_phone: $scope.subMerchantInfo.company_phone, - contact_email: $scope.subMerchantInfo.contact_email, - industry: $scope.subMerchantInfo.industry, - company_website: $scope.subMerchantInfo.company_website, - merchant_type: $scope.subMerchantInfo.merchant_type, - mcc_code: $scope.subMerchantInfo.mcc_code, - address: $scope.subMerchantInfo.address, - business_type: $scope.subMerchantInfo.business_type - }; - if (params.business_type == 'ONLINE') { - params.address = null; - } - else if (params.business_type == 'OFFLINE') { - params.company_website = null; - } - - if (params.merchant_type == 'ENTERPRISE') { - params.director_name = $scope.subMerchantInfo.director_name; - params.director_id_number = $scope.subMerchantInfo.director_id_number; - params.company_register_no = $scope.subMerchantInfo.company_register_no; - params.certificat_expire_date = $scope.subMerchantInfo.certificat_expire_date; - - if ($scope.subMerchantInfo.certificat_expire_date_d) { - params.certificat_expire_date = $filter('dateConversionStr')($scope.subMerchantInfo.certificat_expire_date_d) - } else if ($scope.subMerchantInfo.certificat_expire_date_premanent) { - params.certificat_expire_date = "PERMANENT"; - } - else if ($scope.subMerchantInfo.certificat_expire_date_NA) { - params.certificat_expire_date = "N/A"; - } else { - alert("Certificate expiration time is required"); - return; - } - } else { - params.principal_name = $scope.subMerchantInfo.principal_name; - params.principal_id_number = $scope.subMerchantInfo.principal_id_number; - } - $http.post('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/new_sub_apply', params).then(function (resp) { - $scope.apply_sub_merchant_id = resp.data; - $scope.$close(); - if (subMerchantInfo.sub_merchant_id != null) { - commonDialog.confirm({ title: 'Confirm', content: '已申请成功,是否确认使用' }).then(function () { - $http.put('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/payment_config', { sub_merchant_id: $scope.apply_sub_merchant_id }).then(function (resp) { - commonDialog.alert({ - title: 'Success', - content: 'Modify Wechat Sub Merchant ID successfully', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }); + $http.post('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/new_sub_apply', params).then( + function (resp) { + $scope.apply_sub_merchant_id = resp.data + $scope.$close() + if (subMerchantInfo.sub_merchant_id != null) { + commonDialog.confirm({ title: 'Confirm', content: '已申请成功,是否确认使用' }).then(function () { + $http.put('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/payment_config', { sub_merchant_id: $scope.apply_sub_merchant_id }).then( + function (resp) { + commonDialog.alert({ + title: 'Success', + content: 'Modify Wechat Sub Merchant ID successfully', + type: 'success', }) - } else { - $http.put('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/payment_config', { sub_merchant_id: $scope.apply_sub_merchant_id }).then(function (resp) { - commonDialog.alert({ - title: 'Success', - content: 'Apply Success And Modify Wechat Sub Merchant ID successfully', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }); - } - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }) + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + }) + } else { + $http.put('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/payment_config', { sub_merchant_id: $scope.apply_sub_merchant_id }).then( + function (resp) { + commonDialog.alert({ + title: 'Success', + content: 'Apply Success And Modify Wechat Sub Merchant ID successfully', + type: 'success', + }) + $state.reload() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + }, + ]) + app.controller('updateApplyWxSubMerchantIdCtrl', [ + '$scope', + '$http', + '$uibModal', + '$state', + 'subMerchantInfo', + '$filter', + 'merchantIds', + 'commonDialog', + 'wechatGoodMcc', + 'merchantInfo', + 'businessTypesMap', + function ($scope, $http, $uibModal, $state, subMerchantInfo, $filter, merchantIds, commonDialog, wechatGoodMcc, merchantInfo, businessTypesMap) { + $scope.wxIndustries = angular.copy(wxMerchantIndustries) + $scope.subMerchantInfo = angular.copy(subMerchantInfo.data) + $scope.merchantInfo = angular.copy(merchantInfo) + $scope.wechatMccIndustries = wechatGoodMcc.configs() + $scope.merchantIds = merchantIds.data + $scope.businessTypesMap = businessTypesMap.configs() + + if ($scope.subMerchantInfo.extra_merchant_type) { + $scope.subMerchantInfo.merchant_type = $scope.subMerchantInfo.extra_merchant_type + } + if ($scope.subMerchantInfo.industry) { + $scope.subMerchantInfo.industry = $filter('newWxMerchantsFilter')($scope.subMerchantInfo.industry) + } + if ($scope.subMerchantInfo.mcc_code) { + $scope.subMerchantInfo.mcc_code = parseInt($scope.subMerchantInfo.mcc_code) + } + + // if($scope.subMerchantInfo.certificat_expire_date) { + // // var datestr = subMerchantInfo.certificat_expire_date.replace(/-/g, '/'); + // $scope.subMerchantInfo.certificat_expire_date=new Date($scope.subMerchantInfo.certificat_expire_date); + // } + if ($scope.subMerchantInfo.certificat_expire_date) { + if ($scope.subMerchantInfo.certificat_expire_date == 'PERMANENT') { + $scope.subMerchantInfo.certificat_expire_date_premanent = true + } else if ($scope.subMerchantInfo.certificat_expire_date == 'N/A') { + $scope.subMerchantInfo.certificat_expire_date_NA = true + } else { + var datestr = $scope.subMerchantInfo.certificat_expire_date.replace(/-/g, '/') + $scope.subMerchantInfo.certificat_expire_date_d = new Date(datestr) } - }]); - app.controller('updateApplyWxSubMerchantIdCtrl', ['$scope', '$http', '$uibModal', '$state', 'subMerchantInfo', '$filter', 'merchantIds', 'commonDialog', 'wechatGoodMcc', 'merchantInfo', 'businessTypesMap', function ($scope, $http, $uibModal, $state, subMerchantInfo, $filter, merchantIds, commonDialog, wechatGoodMcc, merchantInfo, businessTypesMap) { - $scope.wxIndustries = angular.copy(wxMerchantIndustries); - $scope.subMerchantInfo = angular.copy(subMerchantInfo.data); - $scope.merchantInfo = angular.copy(merchantInfo); - $scope.wechatMccIndustries = wechatGoodMcc.configs(); - $scope.merchantIds = merchantIds.data; - $scope.businessTypesMap=businessTypesMap.configs(); - - if($scope.subMerchantInfo.extra_merchant_type ){ - $scope.subMerchantInfo.merchant_type=$scope.subMerchantInfo.extra_merchant_type; + } + $scope.checkExpriedate = function (value) { + if (value) { + $scope.subMerchantInfo.certificat_expire_date_premanent = false + $scope.subMerchantInfo.certificat_expire_date_NA = false } - if($scope.subMerchantInfo.industry) { - $scope.subMerchantInfo.industry = $filter('newWxMerchantsFilter')($scope.subMerchantInfo.industry); + } + $scope.checkExpriedateOther = function (value) { + if (value == 'PERMANENT') { + if ($scope.subMerchantInfo.certificat_expire_date_premanent) { + $scope.subMerchantInfo.certificat_expire_date_NA = false + $scope.subMerchantInfo.certificat_expire_date_d = null + } + } else if (value == 'N/A') { + if ($scope.subMerchantInfo.certificat_expire_date_NA) { + $scope.subMerchantInfo.certificat_expire_date_premanent = false + $scope.subMerchantInfo.certificat_expire_date_d = null + } } - if($scope.subMerchantInfo.mcc_code ){ - $scope.subMerchantInfo.mcc_code=parseInt($scope.subMerchantInfo.mcc_code); + } + $scope.updateApply = function (form) { + $scope.errmsg = null + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true + } + }) + return } - - // if($scope.subMerchantInfo.certificat_expire_date) { - // // var datestr = subMerchantInfo.certificat_expire_date.replace(/-/g, '/'); - // $scope.subMerchantInfo.certificat_expire_date=new Date($scope.subMerchantInfo.certificat_expire_date); - // } - if($scope.subMerchantInfo.certificat_expire_date) { - if( $scope.subMerchantInfo.certificat_expire_date=="PERMANENT"){ - $scope.subMerchantInfo.certificat_expire_date_premanent=true; - }else if( $scope.subMerchantInfo.certificat_expire_date=="N/A"){ - $scope.subMerchantInfo.certificat_expire_date_NA=true; - }else { - var datestr = $scope.subMerchantInfo.certificat_expire_date.replace(/-/g, '/'); - $scope.subMerchantInfo.certificat_expire_date_d = new Date(datestr); - } + var params = { + company_name: $scope.subMerchantInfo.company_name, + merchant_id: $scope.subMerchantInfo.merchant_id, + short_name: $scope.subMerchantInfo.short_name, + office_phone: $scope.subMerchantInfo.office_phone, + contact_person: $scope.subMerchantInfo.contact_person, + contact_phone: $scope.subMerchantInfo.contact_phone, + company_phone: $scope.subMerchantInfo.company_phone, + contact_email: $scope.subMerchantInfo.contact_email, + industry: $scope.subMerchantInfo.industry, + company_website: $scope.subMerchantInfo.company_website, + merchant_type: $scope.subMerchantInfo.merchant_type, + mcc_code: $scope.subMerchantInfo.mcc_code, + address: $scope.subMerchantInfo.address, + business_type: $scope.subMerchantInfo.business_type, + sub_mch_id: $scope.subMerchantInfo.sub_merchant_id, } - $scope.checkExpriedate=function (value) { - if(value){ - $scope.subMerchantInfo.certificat_expire_date_premanent=false; - $scope.subMerchantInfo.certificat_expire_date_NA=false; - } + if (params.business_type == 'ONLINE') { + params.address = null + } else if (params.business_type == 'OFFLINE') { + params.company_website = null } - $scope.checkExpriedateOther=function (value) { - if(value=='PERMANENT'){ - if($scope.subMerchantInfo.certificat_expire_date_premanent){ - $scope.subMerchantInfo.certificat_expire_date_NA=false; - $scope.subMerchantInfo.certificat_expire_date_d=null; - } - }else if(value=='N/A'){ - if($scope.subMerchantInfo.certificat_expire_date_NA){ - $scope.subMerchantInfo.certificat_expire_date_premanent=false; - $scope.subMerchantInfo.certificat_expire_date_d=null; - } - } + // if($scope.subMerchantInfo.merchant_type == 'ENTERPRISE'){ + // params.director_name = $scope.subMerchantInfo.director_name; + // params.director_id_number = $scope.subMerchantInfo.director_id_number; + // params.company_register_no = $scope.subMerchantInfo.company_register_no; + // params.certificat_expire_date = $scope.subMerchantInfo.certificat_expire_date; + // if($scope.subMerchantInfo.certificat_expire_date) { + // params.certificat_expire_date = $filter('dateConversionStr')($scope.subMerchantInfo.certificat_expire_date) + // } + // }else{ + // params.principal_name = $scope.subMerchantInfo.principal_name; + // params.principal_id_number = $scope.subMerchantInfo.principal_id_number; + // } + if (params.merchant_type == 'ENTERPRISE') { + params.company_register_no = $scope.subMerchantInfo.company_register_no + params.certificat_expire_date = $scope.subMerchantInfo.certificat_expire_date + if ($scope.subMerchantInfo.certificat_expire_date_d) { + params.certificat_expire_date = $filter('dateConversionStr')($scope.subMerchantInfo.certificat_expire_date_d) + } else if ($scope.subMerchantInfo.certificat_expire_date_premanent) { + params.certificat_expire_date = 'PERMANENT' + } else if ($scope.subMerchantInfo.certificat_expire_date_NA) { + params.certificat_expire_date = 'N/A' + } else { + alert('Certificate expiration time is required') + return + } } - $scope.updateApply = function (form) { - $scope.errmsg = null; - if (form.$invalid) { - angular.forEach(form, function (item, key) { - if (key.indexOf('$') < 0) { - item.$dirty = true; - } - }); - return; - } - var params = { - company_name : $scope.subMerchantInfo.company_name, - merchant_id : $scope.subMerchantInfo.merchant_id, - short_name : $scope.subMerchantInfo.short_name, - office_phone : $scope.subMerchantInfo.office_phone, - contact_person : $scope.subMerchantInfo.contact_person, - contact_phone : $scope.subMerchantInfo.contact_phone, - company_phone : $scope.subMerchantInfo.company_phone, - contact_email : $scope.subMerchantInfo.contact_email, - industry : $scope.subMerchantInfo.industry, - company_website : $scope.subMerchantInfo.company_website, - merchant_type: $scope.subMerchantInfo.merchant_type, - mcc_code : $scope.subMerchantInfo.mcc_code, - address: $scope.subMerchantInfo.address, - business_type:$scope.subMerchantInfo.business_type, - sub_mch_id:$scope.subMerchantInfo.sub_merchant_id, - }; - if(params.business_type=='ONLINE'){ - params.address=null; - } - else if(params.business_type=='OFFLINE'){ - params.company_website=null; - } - // if($scope.subMerchantInfo.merchant_type == 'ENTERPRISE'){ - // params.director_name = $scope.subMerchantInfo.director_name; - // params.director_id_number = $scope.subMerchantInfo.director_id_number; - // params.company_register_no = $scope.subMerchantInfo.company_register_no; - // params.certificat_expire_date = $scope.subMerchantInfo.certificat_expire_date; - // if($scope.subMerchantInfo.certificat_expire_date) { - // params.certificat_expire_date = $filter('dateConversionStr')($scope.subMerchantInfo.certificat_expire_date) - // } - // }else{ - // params.principal_name = $scope.subMerchantInfo.principal_name; - // params.principal_id_number = $scope.subMerchantInfo.principal_id_number; - // } - if(params.merchant_type == 'ENTERPRISE'){ - params.company_register_no = $scope.subMerchantInfo.company_register_no; - params.certificat_expire_date = $scope.subMerchantInfo.certificat_expire_date; - if($scope.subMerchantInfo.certificat_expire_date_d) { - params.certificat_expire_date = $filter('dateConversionStr')($scope.subMerchantInfo.certificat_expire_date_d) - }else if($scope.subMerchantInfo.certificat_expire_date_premanent){ - params.certificat_expire_date="PERMANENT"; - } - else if($scope.subMerchantInfo.certificat_expire_date_NA){ - params.certificat_expire_date="N/A"; - }else{ - alert("Certificate expiration time is required"); - return; - } - } - $http.put('/sys/partners/' + $scope.merchantInfo.client_moniker + '/get_merchant_ids/'+$scope.subMerchantInfo.merchant_app_id, params).then(function (resp) { - $scope.apply_sub_merchant_id = resp.data; - $scope.$close(); - commonDialog.confirm({title: 'Confirm', content: 'Successfully modified!'}) - }, function (resp) { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}) - }); - } - }]); - - app.controller('applyRpaySubMerchantIdCtrl', ['$scope', '$http', '$uibModal', '$state', 'subMerchantInfo', 'businessStructuresMap', '$filter', 'commonDialog', 'timezone', function ($scope, $http, $uibModal, $state, subMerchantInfo, businessStructuresMap, $filter, commonDialog, timezone) { - $scope.subMerchantInfo = angular.copy(subMerchantInfo); - $scope.business_structures = businessStructuresMap.configs(); - $scope.timezone = timezone.configs(); - - - $scope.saveRpayAppliy = function (form) { - var merchantInfo = {}; - $scope.errmsg = null; - if (form.$invalid) { - angular.forEach(form, function (item, key) { - if (key.indexOf('$') < 0) { - item.$dirty = true; - } - }); - return; - } - angular.forEach(form, function (item, key) { - if (item != null) { - if (item.$name != null) { - merchantInfo[key] = item.$modelValue; - } - } - }); - - $http.post('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/registRpaySubMerchantId', merchantInfo).then(function (resp) { - $scope.apply_sub_merchant_id = resp.data; - $scope.$close(); - if (subMerchantInfo.sub_merchant_id != null) { - commonDialog.alert({ - title: 'Success', - content: 'Modify Rpay+ Sub Merchant ID successfully', - type: 'success' - }); - $state.reload(); - } - }, function (resp) { - commonDialog.alert({ - title: 'Error', - content: resp.data.message, - type: 'error' - }); + $http.put('/sys/partners/' + $scope.merchantInfo.client_moniker + '/get_merchant_ids/' + $scope.subMerchantInfo.merchant_app_id, params).then( + function (resp) { + $scope.apply_sub_merchant_id = resp.data + $scope.$close() + commonDialog.confirm({ title: 'Confirm', content: 'Successfully modified!' }) + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + }, + ]) + + app.controller('applyRpaySubMerchantIdCtrl', [ + '$scope', + '$http', + '$uibModal', + '$state', + 'subMerchantInfo', + 'businessStructuresMap', + '$filter', + 'commonDialog', + 'timezone', + function ($scope, $http, $uibModal, $state, subMerchantInfo, businessStructuresMap, $filter, commonDialog, timezone) { + $scope.subMerchantInfo = angular.copy(subMerchantInfo) + $scope.business_structures = businessStructuresMap.configs() + $scope.timezone = timezone.configs() + + $scope.saveRpayAppliy = function (form) { + var merchantInfo = {} + $scope.errmsg = null + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true + } + }) + return + } + angular.forEach(form, function (item, key) { + if (item != null) { + if (item.$name != null) { + merchantInfo[key] = item.$modelValue + } + } + }) + + $http.post('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/registRpaySubMerchantId', merchantInfo).then( + function (resp) { + $scope.apply_sub_merchant_id = resp.data + $scope.$close() + if (subMerchantInfo.sub_merchant_id != null) { + commonDialog.alert({ + title: 'Success', + content: 'Modify Rpay+ Sub Merchant ID successfully', + type: 'success', + }) + $state.reload() + } + }, + function (resp) { + commonDialog.alert({ + title: 'Error', + content: resp.data.message, + type: 'error', }) + } + ) + } + }, + ]) + app.controller('applyYeepaySubMerchantIdCtrl', [ + '$scope', + '$http', + '$uibModal', + '$state', + 'subMerchantInfo', + 'yeepayIndustryMap', + 'yeepayBusinessContentMap', + '$filter', + 'commonDialog', + 'Upload', + function ($scope, $http, $uibModal, $state, subMerchantInfo, yeepayIndustryMap, yeepayBusinessContentMap, $filter, commonDialog, Upload) { + $scope.yeepay_industries = yeepayIndustryMap.configs() + $scope.yeepay_business_contents = yeepayBusinessContentMap.configs() + $scope.subMerchantInfo = angular.copy(subMerchantInfo) + if (!$scope.subMerchantInfo.abn) { + $scope.subMerchantInfo.abn = $scope.subMerchantInfo.acn + } + var vouchers = {} + + $scope.directors = {} + $scope.executives = {} + $scope.industry = '' + $scope.business_content = '' + var merchantInfo = {} + + var merchantId = '' + + // $scope.uploadLegalIDcardFront = function (file) { + // if (file != null) { + // if (file.size > 3 * 1024 * 1024) { + // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + // } else { + // $scope.legalIDcardFrontProgress = {value: 0}; + // Upload.upload({ + // url: '/attachment/yeepayFiles', + // data: {file: file} + // }).then(function (resp) { + // delete $scope.legalIDcardFrontProgress; + // $scope.legalIDcardFront = resp.data.path; + // vouchers['legalIDcardFront'] = resp.data.path; + // merchantId = resp.data.merchantId; + // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) + // }, function (resp) { + // delete $scope.legalIDcardFrontProgress; + // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + // }, function (evt) { + // $scope.legalIDcardFrontProgress.value = parseInt(100 * evt.loaded / evt.total); + // }) + // } + // } + // }; + // + // $scope.uploadLegalIDcardBack = function (file) { + // if (file != null) { + // if (file.size > 3 * 1024 * 1024) { + // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + // } else { + // $scope.legalIDcardBackProgress = {value: 0}; + // Upload.upload({ + // url: '/attachment/yeepayFiles', + // data: {file: file} + // }).then(function (resp) { + // delete $scope.legalIDcardBackProgress; + // $scope.legalIDcardBack = resp.data.path; + // vouchers['legalIDcardBack'] = resp.data.path; + // merchantId = resp.data.merchantId; + // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) + // }, function (resp) { + // delete $scope.legalIDcardBackProgress; + // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + // }, function (evt) { + // $scope.legalIDcardBackProgress.value = parseInt(100 * evt.loaded / evt.total); + // }) + // } + // } + // }; + + $scope.uploadBusinessLicence = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.businessLicenceProgress = { value: 0 } + Upload.upload({ + url: '/attachment/yeepayFiles', + data: { file: file }, + }).then( + function (resp) { + delete $scope.businessLicenceProgress + $scope.businessLicence = resp.data.path + merchantInfo['business_licence'] = resp.data.path + merchantId = resp.data.merchantId + commonDialog.alert({ title: 'Upload Success', content: 'Upload Success', type: 'success' }) + }, + function (resp) { + delete $scope.businessLicenceProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.businessLicenceProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } } - }]); - app.controller('applyYeepaySubMerchantIdCtrl', ['$scope', '$http', '$uibModal', '$state', 'subMerchantInfo', 'yeepayIndustryMap', 'yeepayBusinessContentMap', '$filter', 'commonDialog', 'Upload', function ($scope, $http, $uibModal, $state, subMerchantInfo, yeepayIndustryMap, yeepayBusinessContentMap, $filter, commonDialog, Upload) { - $scope.yeepay_industries = yeepayIndustryMap.configs(); - $scope.yeepay_business_contents = yeepayBusinessContentMap.configs(); - $scope.subMerchantInfo = angular.copy(subMerchantInfo); - if (!$scope.subMerchantInfo.abn) { - $scope.subMerchantInfo.abn = $scope.subMerchantInfo.acn; - } - var vouchers = {}; - - $scope.directors = {}; - $scope.executives = {}; - $scope.industry = ''; - $scope.business_content = ''; - var merchantInfo = {}; - - var merchantId = ''; - - - // $scope.uploadLegalIDcardFront = function (file) { - // if (file != null) { - // if (file.size > 3 * 1024 * 1024) { - // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) - // } else { - // $scope.legalIDcardFrontProgress = {value: 0}; - // Upload.upload({ - // url: '/attachment/yeepayFiles', - // data: {file: file} - // }).then(function (resp) { - // delete $scope.legalIDcardFrontProgress; - // $scope.legalIDcardFront = resp.data.path; - // vouchers['legalIDcardFront'] = resp.data.path; - // merchantId = resp.data.merchantId; - // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) - // }, function (resp) { - // delete $scope.legalIDcardFrontProgress; - // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - // }, function (evt) { - // $scope.legalIDcardFrontProgress.value = parseInt(100 * evt.loaded / evt.total); - // }) - // } - // } - // }; - // - // $scope.uploadLegalIDcardBack = function (file) { - // if (file != null) { - // if (file.size > 3 * 1024 * 1024) { - // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) - // } else { - // $scope.legalIDcardBackProgress = {value: 0}; - // Upload.upload({ - // url: '/attachment/yeepayFiles', - // data: {file: file} - // }).then(function (resp) { - // delete $scope.legalIDcardBackProgress; - // $scope.legalIDcardBack = resp.data.path; - // vouchers['legalIDcardBack'] = resp.data.path; - // merchantId = resp.data.merchantId; - // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) - // }, function (resp) { - // delete $scope.legalIDcardBackProgress; - // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - // }, function (evt) { - // $scope.legalIDcardBackProgress.value = parseInt(100 * evt.loaded / evt.total); - // }) - // } - // } - // }; + } + + // $scope.uploadTaxLevel = function (file) { + // if (file != null) { + // if (file.size > 3 * 1024 * 1024) { + // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + // } else { + // $scope.taxLevelProgress = {value: 0}; + // Upload.upload({ + // url: '/attachment/yeepayFiles', + // data: {file: file} + // }).then(function (resp) { + // delete $scope.taxLevelProgress; + // $scope.taxLevel = resp.data.path; + // vouchers['taxLevel'] = resp.data.path; + // merchantId = resp.data.merchantId; + // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) + // }, function (resp) { + // delete $scope.taxLevelProgress; + // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + // }, function (evt) { + // $scope.taxLevelProgress.value = parseInt(100 * evt.loaded / evt.total); + // }) + // } + // } + // }; + + // $scope.uploadBankAccountOpen = function (file) { + // if (file != null) { + // if (file.size > 3 * 1024 * 1024) { + // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + // } else { + // $scope.bankAccountOpenProgress = {value: 0}; + // Upload.upload({ + // url: '/attachment/yeepayFiles', + // data: {file: file} + // }).then(function (resp) { + // delete $scope.bankAccountOpenProgress; + // $scope.bankAccountOpen = resp.data.path; + // vouchers['bankAccountOpen'] = resp.data.path; + // merchantId = resp.data.merchantId; + // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) + // }, function (resp) { + // delete $scope.bankAccountOpenProgress; + // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + // }, function (evt) { + // $scope.bankAccountOpenProgress.value = parseInt(100 * evt.loaded / evt.total); + // }) + // } + // } + // }; + + // $scope.uploadOrgCode = function (file) { + // if (file != null) { + // if (file.size > 3 * 1024 * 1024) { + // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + // } else { + // $scope.orgCodeProgress = {value: 0}; + // Upload.upload({ + // url: '/attachment/yeepayFiles', + // data: {file: file} + // }).then(function (resp) { + // delete $scope.orgCodeProgress; + // $scope.orgCode = resp.data.path; + // vouchers['orgCode'] = resp.data.path; + // merchantId = resp.data.merchantId; + // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) + // }, function (resp) { + // delete $scope.orgCodeProgress; + // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + // }, function (evt) { + // $scope.orgCodeProgress.value = parseInt(100 * evt.loaded / evt.total); + // }) + // } + // } + // }; + // + // $scope.uploadNonStanProtocol = function (file) { + // if (file != null) { + // if (file.size > 3 * 1024 * 1024) { + // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + // } else { + // $scope.nonStanProtocolProgress = {value: 0}; + // Upload.upload({ + // url: '/attachment/yeepayFiles', + // data: {file: file} + // }).then(function (resp) { + // delete $scope.nonStanProtocolProgress; + // $scope.nonStanProtocol = resp.data.path; + // vouchers['nonStanProtocol'] = resp.data.path; + // merchantId = resp.data.merchantId; + // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) + // }, function (resp) { + // delete $scope.nonStanProtocolProgress; + // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + // }, function (evt) { + // $scope.nonStanProtocolProgress.value = parseInt(100 * evt.loaded / evt.total); + // }) + // } + // } + // }; + // + // $scope.uploadZipPath = function (file) { + // if (file != null) { + // if (file.size > 3 * 1024 * 1024) { + // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + // } else { + // $scope.zipPathProgress = {value: 0}; + // Upload.upload({ + // url: '/attachment/yeepayFiles', + // data: {file: file} + // }).then(function (resp) { + // delete $scope.zipPathProgress; + // $scope.zipPath = resp.data.path; + // vouchers['zipPath'] = resp.data.path; + // merchantId = resp.data.merchantId; + // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) + // }, function (resp) { + // delete $scope.zipPathProgress; + // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + // }, function (evt) { + // $scope.zipPathProgress.value = parseInt(100 * evt.loaded / evt.total); + // }) + // } + // } + // }; + + $scope.uploadDirectorPassport = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.directorPassportProgress = { value: 0 } + Upload.upload({ + url: '/attachment/yeepayFiles', + data: { file: file }, + }).then( + function (resp) { + delete $scope.directorPassportProgress + $scope.directorPassport = resp.data.path + $scope.directors.filePath = resp.data.path + merchantId = resp.data.merchantId + commonDialog.alert({ title: 'Upload Success', content: 'Upload Success', type: 'success' }) + }, + function (resp) { + delete $scope.directorPassportProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.directorPassportProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + + $scope.uploadExecutivePassport = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.executivePassportProgress = { value: 0 } + Upload.upload({ + url: '/attachment/yeepayFiles', + data: { file: file }, + }).then( + function (resp) { + delete $scope.executivePassportProgress + $scope.executivePassport = resp.data.path + $scope.executives.filePath = resp.data.path + merchantId = resp.data.merchantId + commonDialog.alert({ title: 'Upload Success', content: 'Upload Success', type: 'success' }) + }, + function (resp) { + delete $scope.executivePassportProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.executivePassportProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } - $scope.uploadBusinessLicence = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.businessLicenceProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/yeepayFiles', - data: { file: file } - }).then(function (resp) { - delete $scope.businessLicenceProgress; - $scope.businessLicence = resp.data.path; - merchantInfo['business_licence'] = resp.data.path; - merchantId = resp.data.merchantId; - commonDialog.alert({ title: 'Upload Success', content: 'Upload Success', type: 'success' }) - }, function (resp) { - delete $scope.businessLicenceProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.businessLicenceProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } + $scope.saveYeepayApply = function (form) { + $scope.errmsg = null + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true } - }; - - // $scope.uploadTaxLevel = function (file) { - // if (file != null) { - // if (file.size > 3 * 1024 * 1024) { - // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) - // } else { - // $scope.taxLevelProgress = {value: 0}; - // Upload.upload({ - // url: '/attachment/yeepayFiles', - // data: {file: file} - // }).then(function (resp) { - // delete $scope.taxLevelProgress; - // $scope.taxLevel = resp.data.path; - // vouchers['taxLevel'] = resp.data.path; - // merchantId = resp.data.merchantId; - // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) - // }, function (resp) { - // delete $scope.taxLevelProgress; - // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - // }, function (evt) { - // $scope.taxLevelProgress.value = parseInt(100 * evt.loaded / evt.total); - // }) - // } - // } - // }; - - // $scope.uploadBankAccountOpen = function (file) { - // if (file != null) { - // if (file.size > 3 * 1024 * 1024) { - // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) - // } else { - // $scope.bankAccountOpenProgress = {value: 0}; - // Upload.upload({ - // url: '/attachment/yeepayFiles', - // data: {file: file} - // }).then(function (resp) { - // delete $scope.bankAccountOpenProgress; - // $scope.bankAccountOpen = resp.data.path; - // vouchers['bankAccountOpen'] = resp.data.path; - // merchantId = resp.data.merchantId; - // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) - // }, function (resp) { - // delete $scope.bankAccountOpenProgress; - // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - // }, function (evt) { - // $scope.bankAccountOpenProgress.value = parseInt(100 * evt.loaded / evt.total); - // }) - // } - // } - // }; - - // $scope.uploadOrgCode = function (file) { - // if (file != null) { - // if (file.size > 3 * 1024 * 1024) { - // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) - // } else { - // $scope.orgCodeProgress = {value: 0}; - // Upload.upload({ - // url: '/attachment/yeepayFiles', - // data: {file: file} - // }).then(function (resp) { - // delete $scope.orgCodeProgress; - // $scope.orgCode = resp.data.path; - // vouchers['orgCode'] = resp.data.path; - // merchantId = resp.data.merchantId; - // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) - // }, function (resp) { - // delete $scope.orgCodeProgress; - // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - // }, function (evt) { - // $scope.orgCodeProgress.value = parseInt(100 * evt.loaded / evt.total); - // }) - // } - // } - // }; - // - // $scope.uploadNonStanProtocol = function (file) { - // if (file != null) { - // if (file.size > 3 * 1024 * 1024) { - // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) - // } else { - // $scope.nonStanProtocolProgress = {value: 0}; - // Upload.upload({ - // url: '/attachment/yeepayFiles', - // data: {file: file} - // }).then(function (resp) { - // delete $scope.nonStanProtocolProgress; - // $scope.nonStanProtocol = resp.data.path; - // vouchers['nonStanProtocol'] = resp.data.path; - // merchantId = resp.data.merchantId; - // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) - // }, function (resp) { - // delete $scope.nonStanProtocolProgress; - // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - // }, function (evt) { - // $scope.nonStanProtocolProgress.value = parseInt(100 * evt.loaded / evt.total); - // }) + }) + return + } + // angular.forEach(form, function (item, key) { + // if(item !=null) { + // if(item.$name !=null) { + // merchantInfo[key] = item.$modelValue; // } // } - // }; - // - // $scope.uploadZipPath = function (file) { - // if (file != null) { - // if (file.size > 3 * 1024 * 1024) { - // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) - // } else { - // $scope.zipPathProgress = {value: 0}; - // Upload.upload({ - // url: '/attachment/yeepayFiles', - // data: {file: file} - // }).then(function (resp) { - // delete $scope.zipPathProgress; - // $scope.zipPath = resp.data.path; - // vouchers['zipPath'] = resp.data.path; - // merchantId = resp.data.merchantId; - // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) - // }, function (resp) { - // delete $scope.zipPathProgress; - // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - // }, function (evt) { - // $scope.zipPathProgress.value = parseInt(100 * evt.loaded / evt.total); - // }) + // }); + merchantInfo['company_name'] = $scope.subMerchantInfo.company_name + merchantInfo['contact_person'] = $scope.subMerchantInfo.contact_person + merchantInfo['contact_phone'] = $scope.subMerchantInfo.contact_phone + merchantInfo['contact_email'] = $scope.subMerchantInfo.contact_email + merchantInfo['company_website'] = $scope.subMerchantInfo.company_website + merchantInfo['abn'] = $scope.subMerchantInfo.abn + merchantInfo['executives'] = $scope.executives + merchantInfo['directors'] = $scope.directors + merchantInfo['business_content'] = $scope.business_content + merchantInfo['industry'] = $scope.industry + merchantInfo['merchantId'] = merchantId + $http.post('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/registYeepaySubMerchantId', merchantInfo).then( + function (resp) { + $scope.apply_sub_merchant_id = resp.data + $scope.$close() + if (subMerchantInfo.yeepay_sub_merchant_id != null) { + commonDialog.alert({ + title: 'Success', + content: 'Modify Yeepay Sub Merchant ID successfully', + type: 'success', + }) + $state.reload() + } + }, + function (resp) { + commonDialog.alert({ + title: 'Error', + content: resp.data.message, + type: 'error', + }) + } + ) + } + }, + ]) + app.controller('addYeepaySubMerchantIdCtrl', [ + '$scope', + '$http', + '$uibModal', + '$state', + 'subMerchantInfo', + 'yeepayIndustryMap', + 'yeepayBusinessContentMap', + '$filter', + 'commonDialog', + 'Upload', + function ($scope, $http, $uibModal, $state, subMerchantInfo, yeepayIndustryMap, yeepayBusinessContentMap, $filter, commonDialog, Upload) { + $scope.yeepay_industries = yeepayIndustryMap.configs() + $scope.yeepay_business_contents = yeepayBusinessContentMap.configs() + $scope.subMerchantInfo = angular.copy(subMerchantInfo) + + var merchantInfo = {} + + $scope.saveYeepayAdd = function (form) { + $scope.errmsg = null + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true + } + }) + return + } + // angular.forEach(form, function (item, key) { + // if(item !=null) { + // if(item.$name !=null) { + // merchantInfo[key] = item.$modelValue; // } // } - // }; - - $scope.uploadDirectorPassport = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.directorPassportProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/yeepayFiles', - data: { file: file } - }).then(function (resp) { - delete $scope.directorPassportProgress; - $scope.directorPassport = resp.data.path; - $scope.directors.filePath = resp.data.path; - merchantId = resp.data.merchantId; - commonDialog.alert({ title: 'Upload Success', content: 'Upload Success', type: 'success' }) - }, function (resp) { - delete $scope.directorPassportProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.directorPassportProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - - $scope.uploadExecutivePassport = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.executivePassportProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/yeepayFiles', - data: { file: file } - }).then(function (resp) { - delete $scope.executivePassportProgress; - $scope.executivePassport = resp.data.path; - $scope.executives.filePath = resp.data.path; - merchantId = resp.data.merchantId; - commonDialog.alert({ title: 'Upload Success', content: 'Upload Success', type: 'success' }) - }, function (resp) { - delete $scope.executivePassportProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.executivePassportProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - - $scope.saveYeepayApply = function (form) { - $scope.errmsg = null; - if (form.$invalid) { - angular.forEach(form, function (item, key) { - if (key.indexOf('$') < 0) { - item.$dirty = true; - } - }); - return; - } - // angular.forEach(form, function (item, key) { - // if(item !=null) { - // if(item.$name !=null) { - // merchantInfo[key] = item.$modelValue; - // } - // } - // }); - merchantInfo['company_name'] = $scope.subMerchantInfo.company_name; - merchantInfo['contact_person'] = $scope.subMerchantInfo.contact_person; - merchantInfo['contact_phone'] = $scope.subMerchantInfo.contact_phone; - merchantInfo['contact_email'] = $scope.subMerchantInfo.contact_email; - merchantInfo['company_website'] = $scope.subMerchantInfo.company_website; - merchantInfo['abn'] = $scope.subMerchantInfo.abn; - merchantInfo['executives'] = $scope.executives; - merchantInfo['directors'] = $scope.directors; - merchantInfo['business_content'] = $scope.business_content; - merchantInfo['industry'] = $scope.industry; - merchantInfo['merchantId'] = merchantId; - $http.post('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/registYeepaySubMerchantId', merchantInfo).then(function (resp) { - $scope.apply_sub_merchant_id = resp.data; - $scope.$close(); - if (subMerchantInfo.yeepay_sub_merchant_id != null) { - commonDialog.alert({ - title: 'Success', - content: 'Modify Yeepay Sub Merchant ID successfully', - type: 'success' - }); - $state.reload(); - } - }, function (resp) { - commonDialog.alert({ - title: 'Error', - content: resp.data.message, - type: 'error' - }); + // }); + + merchantInfo['sub_merchant_id'] = $scope.sub_merchant_id + merchantInfo['business_content'] = $scope.business_content + merchantInfo['industry'] = $scope.industry + $http.post('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/addYeepaySubMerchantId', merchantInfo).then( + function (resp) { + $scope.$close() + commonDialog.alert({ + title: 'Success', + content: 'Add Yeepay Sub Merchant ID successfully', + type: 'success', }) - } - }]); - app.controller('addYeepaySubMerchantIdCtrl', ['$scope', '$http', '$uibModal', '$state', 'subMerchantInfo', 'yeepayIndustryMap', 'yeepayBusinessContentMap', '$filter', 'commonDialog', 'Upload', function ($scope, $http, $uibModal, $state, subMerchantInfo, yeepayIndustryMap, yeepayBusinessContentMap, $filter, commonDialog, Upload) { - $scope.yeepay_industries = yeepayIndustryMap.configs(); - $scope.yeepay_business_contents = yeepayBusinessContentMap.configs(); - $scope.subMerchantInfo = angular.copy(subMerchantInfo); - - var merchantInfo = {}; - - - $scope.saveYeepayAdd = function (form) { - $scope.errmsg = null; - if (form.$invalid) { - angular.forEach(form, function (item, key) { - if (key.indexOf('$') < 0) { - item.$dirty = true; - } - }); - return; - } - // angular.forEach(form, function (item, key) { - // if(item !=null) { - // if(item.$name !=null) { - // merchantInfo[key] = item.$modelValue; - // } - // } - // }); - - merchantInfo['sub_merchant_id'] = $scope.sub_merchant_id; - merchantInfo['business_content'] = $scope.business_content; - merchantInfo['industry'] = $scope.industry; - $http.post('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/addYeepaySubMerchantId', merchantInfo).then(function (resp) { - $scope.$close(); - commonDialog.alert({ - title: 'Success', - content: 'Add Yeepay Sub Merchant ID successfully', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({ - title: 'Error', - content: resp.data.message, - type: 'error' - }); + $state.reload() + }, + function (resp) { + commonDialog.alert({ + title: 'Error', + content: resp.data.message, + type: 'error', }) + } + ) + } + }, + ]) + app.controller('updateYeepaySubMerchantIdCtrl', [ + '$scope', + '$http', + '$uibModal', + '$state', + 'subMerchantInfo', + 'yeepayIndustryMap', + 'yeepayBusinessContentMap', + '$filter', + 'commonDialog', + 'Upload', + 'subMerchantId', + function ($scope, $http, $uibModal, $state, subMerchantInfo, yeepayIndustryMap, yeepayBusinessContentMap, $filter, commonDialog, Upload, subMerchantId) { + $scope.yeepay_industries = yeepayIndustryMap.configs() + $scope.yeepay_business_contents = yeepayBusinessContentMap.configs() + $scope.subMerchantInfo = angular.copy(subMerchantInfo) + if (!$scope.subMerchantInfo.abn) { + $scope.subMerchantInfo.abn = $scope.subMerchantInfo.acn + } + var vouchers = {} + + $scope.directors = {} + $scope.executives = {} + $scope.industry = '' + $scope.business_content = '' + var merchantInfo = {} + + var merchantId = '' + + // $scope.uploadLegalIDcardFront = function (file) { + // if (file != null) { + // if (file.size > 3 * 1024 * 1024) { + // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + // } else { + // $scope.legalIDcardFrontProgress = {value: 0}; + // Upload.upload({ + // url: '/attachment/yeepayFiles', + // data: {file: file} + // }).then(function (resp) { + // delete $scope.legalIDcardFrontProgress; + // $scope.legalIDcardFront = resp.data.path; + // vouchers['legalIDcardFront'] = resp.data.path; + // merchantId = resp.data.merchantId; + // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) + // }, function (resp) { + // delete $scope.legalIDcardFrontProgress; + // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + // }, function (evt) { + // $scope.legalIDcardFrontProgress.value = parseInt(100 * evt.loaded / evt.total); + // }) + // } + // } + // }; + // + // $scope.uploadLegalIDcardBack = function (file) { + // if (file != null) { + // if (file.size > 3 * 1024 * 1024) { + // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + // } else { + // $scope.legalIDcardBackProgress = {value: 0}; + // Upload.upload({ + // url: '/attachment/yeepayFiles', + // data: {file: file} + // }).then(function (resp) { + // delete $scope.legalIDcardBackProgress; + // $scope.legalIDcardBack = resp.data.path; + // vouchers['legalIDcardBack'] = resp.data.path; + // merchantId = resp.data.merchantId; + // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) + // }, function (resp) { + // delete $scope.legalIDcardBackProgress; + // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + // }, function (evt) { + // $scope.legalIDcardBackProgress.value = parseInt(100 * evt.loaded / evt.total); + // }) + // } + // } + // }; + + $scope.uploadBusinessLicence = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.businessLicenceProgress = { value: 0 } + Upload.upload({ + url: '/attachment/yeepayFiles', + data: { file: file }, + }).then( + function (resp) { + delete $scope.businessLicenceProgress + $scope.businessLicence = resp.data.path + merchantInfo['business_licence'] = resp.data.path + merchantId = resp.data.merchantId + commonDialog.alert({ title: 'Upload Success', content: 'Upload Success', type: 'success' }) + }, + function (resp) { + delete $scope.businessLicenceProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.businessLicenceProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } } - }]); - app.controller('updateYeepaySubMerchantIdCtrl', ['$scope', '$http', '$uibModal', '$state', 'subMerchantInfo', 'yeepayIndustryMap', 'yeepayBusinessContentMap', '$filter', 'commonDialog', 'Upload', 'subMerchantId', function ($scope, $http, $uibModal, $state, subMerchantInfo, yeepayIndustryMap, yeepayBusinessContentMap, $filter, commonDialog, Upload, subMerchantId) { - $scope.yeepay_industries = yeepayIndustryMap.configs(); - $scope.yeepay_business_contents = yeepayBusinessContentMap.configs(); - $scope.subMerchantInfo = angular.copy(subMerchantInfo); - if (!$scope.subMerchantInfo.abn) { - $scope.subMerchantInfo.abn = $scope.subMerchantInfo.acn; - } - var vouchers = {}; - - $scope.directors = {}; - $scope.executives = {}; - $scope.industry = ''; - $scope.business_content = ''; - var merchantInfo = {}; - - var merchantId = ''; - - - // $scope.uploadLegalIDcardFront = function (file) { - // if (file != null) { - // if (file.size > 3 * 1024 * 1024) { - // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) - // } else { - // $scope.legalIDcardFrontProgress = {value: 0}; - // Upload.upload({ - // url: '/attachment/yeepayFiles', - // data: {file: file} - // }).then(function (resp) { - // delete $scope.legalIDcardFrontProgress; - // $scope.legalIDcardFront = resp.data.path; - // vouchers['legalIDcardFront'] = resp.data.path; - // merchantId = resp.data.merchantId; - // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) - // }, function (resp) { - // delete $scope.legalIDcardFrontProgress; - // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - // }, function (evt) { - // $scope.legalIDcardFrontProgress.value = parseInt(100 * evt.loaded / evt.total); - // }) - // } - // } - // }; - // - // $scope.uploadLegalIDcardBack = function (file) { - // if (file != null) { - // if (file.size > 3 * 1024 * 1024) { - // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) - // } else { - // $scope.legalIDcardBackProgress = {value: 0}; - // Upload.upload({ - // url: '/attachment/yeepayFiles', - // data: {file: file} - // }).then(function (resp) { - // delete $scope.legalIDcardBackProgress; - // $scope.legalIDcardBack = resp.data.path; - // vouchers['legalIDcardBack'] = resp.data.path; - // merchantId = resp.data.merchantId; - // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) - // }, function (resp) { - // delete $scope.legalIDcardBackProgress; - // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - // }, function (evt) { - // $scope.legalIDcardBackProgress.value = parseInt(100 * evt.loaded / evt.total); - // }) - // } - // } - // }; + } + + // $scope.uploadTaxLevel = function (file) { + // if (file != null) { + // if (file.size > 3 * 1024 * 1024) { + // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + // } else { + // $scope.taxLevelProgress = {value: 0}; + // Upload.upload({ + // url: '/attachment/yeepayFiles', + // data: {file: file} + // }).then(function (resp) { + // delete $scope.taxLevelProgress; + // $scope.taxLevel = resp.data.path; + // vouchers['taxLevel'] = resp.data.path; + // merchantId = resp.data.merchantId; + // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) + // }, function (resp) { + // delete $scope.taxLevelProgress; + // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + // }, function (evt) { + // $scope.taxLevelProgress.value = parseInt(100 * evt.loaded / evt.total); + // }) + // } + // } + // }; + + // $scope.uploadBankAccountOpen = function (file) { + // if (file != null) { + // if (file.size > 3 * 1024 * 1024) { + // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + // } else { + // $scope.bankAccountOpenProgress = {value: 0}; + // Upload.upload({ + // url: '/attachment/yeepayFiles', + // data: {file: file} + // }).then(function (resp) { + // delete $scope.bankAccountOpenProgress; + // $scope.bankAccountOpen = resp.data.path; + // vouchers['bankAccountOpen'] = resp.data.path; + // merchantId = resp.data.merchantId; + // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) + // }, function (resp) { + // delete $scope.bankAccountOpenProgress; + // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + // }, function (evt) { + // $scope.bankAccountOpenProgress.value = parseInt(100 * evt.loaded / evt.total); + // }) + // } + // } + // }; + + // $scope.uploadOrgCode = function (file) { + // if (file != null) { + // if (file.size > 3 * 1024 * 1024) { + // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + // } else { + // $scope.orgCodeProgress = {value: 0}; + // Upload.upload({ + // url: '/attachment/yeepayFiles', + // data: {file: file} + // }).then(function (resp) { + // delete $scope.orgCodeProgress; + // $scope.orgCode = resp.data.path; + // vouchers['orgCode'] = resp.data.path; + // merchantId = resp.data.merchantId; + // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) + // }, function (resp) { + // delete $scope.orgCodeProgress; + // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + // }, function (evt) { + // $scope.orgCodeProgress.value = parseInt(100 * evt.loaded / evt.total); + // }) + // } + // } + // }; + // + // $scope.uploadNonStanProtocol = function (file) { + // if (file != null) { + // if (file.size > 3 * 1024 * 1024) { + // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + // } else { + // $scope.nonStanProtocolProgress = {value: 0}; + // Upload.upload({ + // url: '/attachment/yeepayFiles', + // data: {file: file} + // }).then(function (resp) { + // delete $scope.nonStanProtocolProgress; + // $scope.nonStanProtocol = resp.data.path; + // vouchers['nonStanProtocol'] = resp.data.path; + // merchantId = resp.data.merchantId; + // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) + // }, function (resp) { + // delete $scope.nonStanProtocolProgress; + // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + // }, function (evt) { + // $scope.nonStanProtocolProgress.value = parseInt(100 * evt.loaded / evt.total); + // }) + // } + // } + // }; + // + // $scope.uploadZipPath = function (file) { + // if (file != null) { + // if (file.size > 3 * 1024 * 1024) { + // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + // } else { + // $scope.zipPathProgress = {value: 0}; + // Upload.upload({ + // url: '/attachment/yeepayFiles', + // data: {file: file} + // }).then(function (resp) { + // delete $scope.zipPathProgress; + // $scope.zipPath = resp.data.path; + // vouchers['zipPath'] = resp.data.path; + // merchantId = resp.data.merchantId; + // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) + // }, function (resp) { + // delete $scope.zipPathProgress; + // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + // }, function (evt) { + // $scope.zipPathProgress.value = parseInt(100 * evt.loaded / evt.total); + // }) + // } + // } + // }; + + $scope.uploadDirectorPassport = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.directorPassportProgress = { value: 0 } + Upload.upload({ + url: '/attachment/yeepayFiles', + data: { file: file }, + }).then( + function (resp) { + delete $scope.directorPassportProgress + $scope.directorPassport = resp.data.path + $scope.directors.filePath = resp.data.path + merchantId = resp.data.merchantId + commonDialog.alert({ title: 'Upload Success', content: 'Upload Success', type: 'success' }) + }, + function (resp) { + delete $scope.directorPassportProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.directorPassportProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } + + $scope.uploadExecutivePassport = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) + } else { + $scope.executivePassportProgress = { value: 0 } + Upload.upload({ + url: '/attachment/yeepayFiles', + data: { file: file }, + }).then( + function (resp) { + delete $scope.executivePassportProgress + $scope.executivePassport = resp.data.path + $scope.executives.filePath = resp.data.path + merchantId = resp.data.merchantId + commonDialog.alert({ title: 'Upload Success', content: 'Upload Success', type: 'success' }) + }, + function (resp) { + delete $scope.executivePassportProgress + commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) + }, + function (evt) { + $scope.executivePassportProgress.value = parseInt((100 * evt.loaded) / evt.total) + } + ) + } + } + } - $scope.uploadBusinessLicence = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.businessLicenceProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/yeepayFiles', - data: { file: file } - }).then(function (resp) { - delete $scope.businessLicenceProgress; - $scope.businessLicence = resp.data.path; - merchantInfo['business_licence'] = resp.data.path; - merchantId = resp.data.merchantId; - commonDialog.alert({ title: 'Upload Success', content: 'Upload Success', type: 'success' }) - }, function (resp) { - delete $scope.businessLicenceProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.businessLicenceProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } + $scope.updateYeepayApply = function (form) { + $scope.errmsg = null + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true } - }; - - // $scope.uploadTaxLevel = function (file) { - // if (file != null) { - // if (file.size > 3 * 1024 * 1024) { - // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) - // } else { - // $scope.taxLevelProgress = {value: 0}; - // Upload.upload({ - // url: '/attachment/yeepayFiles', - // data: {file: file} - // }).then(function (resp) { - // delete $scope.taxLevelProgress; - // $scope.taxLevel = resp.data.path; - // vouchers['taxLevel'] = resp.data.path; - // merchantId = resp.data.merchantId; - // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) - // }, function (resp) { - // delete $scope.taxLevelProgress; - // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - // }, function (evt) { - // $scope.taxLevelProgress.value = parseInt(100 * evt.loaded / evt.total); - // }) - // } - // } - // }; - - // $scope.uploadBankAccountOpen = function (file) { - // if (file != null) { - // if (file.size > 3 * 1024 * 1024) { - // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) - // } else { - // $scope.bankAccountOpenProgress = {value: 0}; - // Upload.upload({ - // url: '/attachment/yeepayFiles', - // data: {file: file} - // }).then(function (resp) { - // delete $scope.bankAccountOpenProgress; - // $scope.bankAccountOpen = resp.data.path; - // vouchers['bankAccountOpen'] = resp.data.path; - // merchantId = resp.data.merchantId; - // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) - // }, function (resp) { - // delete $scope.bankAccountOpenProgress; - // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - // }, function (evt) { - // $scope.bankAccountOpenProgress.value = parseInt(100 * evt.loaded / evt.total); - // }) - // } - // } - // }; - - // $scope.uploadOrgCode = function (file) { - // if (file != null) { - // if (file.size > 3 * 1024 * 1024) { - // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) - // } else { - // $scope.orgCodeProgress = {value: 0}; - // Upload.upload({ - // url: '/attachment/yeepayFiles', - // data: {file: file} - // }).then(function (resp) { - // delete $scope.orgCodeProgress; - // $scope.orgCode = resp.data.path; - // vouchers['orgCode'] = resp.data.path; - // merchantId = resp.data.merchantId; - // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) - // }, function (resp) { - // delete $scope.orgCodeProgress; - // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - // }, function (evt) { - // $scope.orgCodeProgress.value = parseInt(100 * evt.loaded / evt.total); - // }) - // } - // } - // }; - // - // $scope.uploadNonStanProtocol = function (file) { - // if (file != null) { - // if (file.size > 3 * 1024 * 1024) { - // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) - // } else { - // $scope.nonStanProtocolProgress = {value: 0}; - // Upload.upload({ - // url: '/attachment/yeepayFiles', - // data: {file: file} - // }).then(function (resp) { - // delete $scope.nonStanProtocolProgress; - // $scope.nonStanProtocol = resp.data.path; - // vouchers['nonStanProtocol'] = resp.data.path; - // merchantId = resp.data.merchantId; - // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) - // }, function (resp) { - // delete $scope.nonStanProtocolProgress; - // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - // }, function (evt) { - // $scope.nonStanProtocolProgress.value = parseInt(100 * evt.loaded / evt.total); - // }) - // } - // } - // }; - // - // $scope.uploadZipPath = function (file) { - // if (file != null) { - // if (file.size > 3 * 1024 * 1024) { - // commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) - // } else { - // $scope.zipPathProgress = {value: 0}; - // Upload.upload({ - // url: '/attachment/yeepayFiles', - // data: {file: file} - // }).then(function (resp) { - // delete $scope.zipPathProgress; - // $scope.zipPath = resp.data.path; - // vouchers['zipPath'] = resp.data.path; - // merchantId = resp.data.merchantId; - // commonDialog.alert({title: 'Upload Success', content: 'Upload Success', type: 'success'}) - // }, function (resp) { - // delete $scope.zipPathProgress; - // commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - // }, function (evt) { - // $scope.zipPathProgress.value = parseInt(100 * evt.loaded / evt.total); - // }) + }) + return + } + // angular.forEach(form, function (item, key) { + // if(item !=null) { + // if(item.$name !=null) { + // merchantInfo[key] = item.$modelValue; // } // } - // }; - - $scope.uploadDirectorPassport = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.directorPassportProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/yeepayFiles', - data: { file: file } - }).then(function (resp) { - delete $scope.directorPassportProgress; - $scope.directorPassport = resp.data.path; - $scope.directors.filePath = resp.data.path; - merchantId = resp.data.merchantId; - commonDialog.alert({ title: 'Upload Success', content: 'Upload Success', type: 'success' }) - }, function (resp) { - delete $scope.directorPassportProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.directorPassportProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - - $scope.uploadExecutivePassport = function (file) { - if (file != null) { - if (file.size > 3 * 1024 * 1024) { - commonDialog.alert({ title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error' }) - } else { - $scope.executivePassportProgress = { value: 0 }; - Upload.upload({ - url: '/attachment/yeepayFiles', - data: { file: file } - }).then(function (resp) { - delete $scope.executivePassportProgress; - $scope.executivePassport = resp.data.path; - $scope.executives.filePath = resp.data.path; - merchantId = resp.data.merchantId; - commonDialog.alert({ title: 'Upload Success', content: 'Upload Success', type: 'success' }) - }, function (resp) { - delete $scope.executivePassportProgress; - commonDialog.alert({ title: 'Upload Failed', content: resp.data.message, type: 'error' }) - }, function (evt) { - $scope.executivePassportProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - - $scope.updateYeepayApply = function (form) { - $scope.errmsg = null; - if (form.$invalid) { - angular.forEach(form, function (item, key) { - if (key.indexOf('$') < 0) { - item.$dirty = true; - } - }); - return; - } - // angular.forEach(form, function (item, key) { - // if(item !=null) { - // if(item.$name !=null) { - // merchantInfo[key] = item.$modelValue; - // } - // } - // }); - merchantInfo['company_name'] = $scope.subMerchantInfo.company_name; - merchantInfo['contact_person'] = $scope.subMerchantInfo.contact_person; - merchantInfo['contact_phone'] = $scope.subMerchantInfo.contact_phone; - merchantInfo['contact_email'] = $scope.subMerchantInfo.contact_email; - merchantInfo['company_website'] = $scope.subMerchantInfo.company_website; - merchantInfo['abn'] = $scope.subMerchantInfo.abn; - merchantInfo['executives'] = $scope.executives; - merchantInfo['subMerchantId'] = angular.copy(subMerchantId); - merchantInfo['directors'] = $scope.directors; - merchantInfo['business_content'] = $scope.business_content; - merchantInfo['industry'] = $scope.industry; - merchantInfo['merchantId'] = merchantId; - $http.post('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/updateYeepaySubMerchantId', merchantInfo).then(function (resp) { - $scope.apply_sub_merchant_id = resp.data; - $scope.$close(); - if (subMerchantInfo.yeepay_sub_merchant_id != null) { - commonDialog.alert({ - title: 'Success', - content: 'Update Successfully,Please Wait For Review!', - type: 'success' - }); - $state.reload(); - } - }, function (resp) { - commonDialog.alert({ - title: 'Error', - content: resp.data.message, - type: 'error' - }); - }) - } - }]); - app.controller('permissionClientCtrl', ['$scope', '$http', '$uibModal', '$state', '$filter', 'commonDialog', function ($scope, $http, $uibModal, $state, $filter, commonDialog) { - $scope.clientPermission = { client_moniker: $scope.partner.client_moniker }; - $scope.loadPermissionList = function () { - var params = angular.copy($scope.clientPermission); - $http.get('/sys/permission/list', { params: params }).then(function (resp) { - $scope.permissionList = resp.data; - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }); - }; - $scope.loadPermissionList(1); - $scope.switchValid = function (permission) { - $scope.clientPermission.isValid = permission.is_valid; - var params = angular.copy($scope.clientPermission); - $http.post('/sys/permission/' + permission.id, params).then(function (resp) { - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }) - }; - - $scope.init = function () { - var params = { client_moniker: $scope.partner.client_moniker }; - $http.post('/sys/permission/init', params).then(function (resp) { - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) - }) - }; - - }]); - app.controller('incrementalServiceCtrl', ['$scope', '$http', '$uibModal', '$state', '$filter', 'commonDialog', function ($scope, $http, $uibModal, $state, $filter, commonDialog) { - $scope.serviceAll = {}; - $scope.channelOptions = []; - $scope.initData = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/incremental_service').then(function (res) { - $scope.serviceAll = res.data.all_service; - $scope.serviceAll.forEach(function (service) { - service.logo_url = '/static/images/' + service.channel + '.jpg' - service.logo_url = $scope.CheckImgExists(service.logo_url) ? service.logo_url : '/static/images/royalpay_sign.png' - }) - $scope.channelOptions = res.data.incremental_channel; - }) - } - $scope.CheckImgExists = function (url) { - var xmlHttp; - if (window.ActiveXObject) { - xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); - } else if (window.XMLHttpRequest) { - xmlHttp = new XMLHttpRequest(); - } - xmlHttp.open("Get", url, false); - xmlHttp.send(); - if (xmlHttp.status == 404) - return false; - else - return true; - } - $scope.initData(); - $scope.newServiceChannelDialog = function () { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/incremental_service_dialog.html', - controller: 'incrementalServiceDialogCtrl', - resolve: { - params: function () { - return { - isCreate: true, - clientMoniker: $scope.partner.client_moniker, - channelOptions: $scope.channelOptions, - serviceChannel: null - } - } - } - }).result.then(function () { - $scope.initData(); - }); - } - $scope.editServiceChannelDialog = function (serviceChannel) { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/incremental_service_dialog.html', - controller: 'incrementalServiceDialogCtrl', - resolve: { - params: function () { - return { - isCreate: false, - clientMoniker: $scope.partner.client_moniker, - channelOptions: $scope.channelOptions, - serviceChannel: serviceChannel - } - } - } - }).result.then(function () { - $scope.initData(); - }); - } - $scope.updateStatus = function (service) { - commonDialog.confirm({ - title: 'Update ' + service.channel + ' Incremental Service Status', - content: 'Are you sure update ' + service.channel + ' status?', - choises: [ - { label: 'Submit', className: 'btn-success', key: 1 }, - { label: 'Cancel', className: 'btn-warning', key: 0, dismiss: true } - ] - }).then(function (choice) { - if (choice == 1) { - service.is_valid = !service.is_valid; - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/incremental_service/status', service).then(function (res) { - commonDialog.alert({ - title: 'Success', - content: 'Update Service Successful!', - type: 'success' - }); - $scope.initData(); - }, function (resp) { - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - $scope.initData(); - }) - } + // }); + merchantInfo['company_name'] = $scope.subMerchantInfo.company_name + merchantInfo['contact_person'] = $scope.subMerchantInfo.contact_person + merchantInfo['contact_phone'] = $scope.subMerchantInfo.contact_phone + merchantInfo['contact_email'] = $scope.subMerchantInfo.contact_email + merchantInfo['company_website'] = $scope.subMerchantInfo.company_website + merchantInfo['abn'] = $scope.subMerchantInfo.abn + merchantInfo['executives'] = $scope.executives + merchantInfo['subMerchantId'] = angular.copy(subMerchantId) + merchantInfo['directors'] = $scope.directors + merchantInfo['business_content'] = $scope.business_content + merchantInfo['industry'] = $scope.industry + merchantInfo['merchantId'] = merchantId + $http.post('/sys/partners/' + $scope.subMerchantInfo.client_moniker + '/updateYeepaySubMerchantId', merchantInfo).then( + function (resp) { + $scope.apply_sub_merchant_id = resp.data + $scope.$close() + if (subMerchantInfo.yeepay_sub_merchant_id != null) { + commonDialog.alert({ + title: 'Success', + content: 'Update Successfully,Please Wait For Review!', + type: 'success', + }) + $state.reload() + } + }, + function (resp) { + commonDialog.alert({ + title: 'Error', + content: resp.data.message, + type: 'error', }) - - } - }]); - app.controller('incrementalServiceDialogCtrl', ['$scope', '$http', 'params', 'commonDialog', function ($scope, $http, params, commonDialog) { - $scope.model = {}; - $scope.ctrl = { sending: false }; - $scope.isCreate = true; - $scope.initData = function () { - $scope.isCreate = angular.copy(params.isCreate); - if ($scope.isCreate) { - $scope.model.channel = angular.copy(params.channelOptions[0]) - $scope.model.channelOptions = angular.copy(params.channelOptions) - } else { - $scope.model = angular.copy(params.serviceChannel); - } + } + ) + } + }, + ]) + app.controller('permissionClientCtrl', [ + '$scope', + '$http', + '$uibModal', + '$state', + '$filter', + 'commonDialog', + function ($scope, $http, $uibModal, $state, $filter, commonDialog) { + $scope.clientPermission = { client_moniker: $scope.partner.client_moniker } + $scope.loadPermissionList = function () { + var params = angular.copy($scope.clientPermission) + $http.get('/sys/permission/list', { params: params }).then( + function (resp) { + $scope.permissionList = resp.data + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + $scope.loadPermissionList(1) + $scope.switchValid = function (permission) { + $scope.clientPermission.isValid = permission.is_valid + var params = angular.copy($scope.clientPermission) + $http.post('/sys/permission/' + permission.id, params).then( + function (resp) {}, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + + $scope.init = function () { + var params = { client_moniker: $scope.partner.client_moniker } + $http.post('/sys/permission/init', params).then( + function (resp) {}, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + }, + ]) + app.controller('incrementalServiceCtrl', [ + '$scope', + '$http', + '$uibModal', + '$state', + '$filter', + 'commonDialog', + function ($scope, $http, $uibModal, $state, $filter, commonDialog) { + $scope.serviceAll = {} + $scope.channelOptions = [] + $scope.initData = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/incremental_service').then(function (res) { + $scope.serviceAll = res.data.all_service + $scope.serviceAll.forEach(function (service) { + service.logo_url = '/static/images/' + service.channel + '.jpg' + service.logo_url = $scope.CheckImgExists(service.logo_url) ? service.logo_url : '/static/images/royalpay_sign.png' + }) + $scope.channelOptions = res.data.incremental_channel + }) + } + $scope.CheckImgExists = function (url) { + var xmlHttp + if (window.ActiveXObject) { + xmlHttp = new ActiveXObject('Microsoft.XMLHTTP') + } else if (window.XMLHttpRequest) { + xmlHttp = new XMLHttpRequest() } - $scope.initData(); - $scope.save = function (form) { - if (form.$invalid) { - angular.forEach(form, function (item, key) { - if (key.indexOf('$') < 0) { - item.$dirty = true; - } - }); - return; - } - $scope.ctrl.sending = true; - $http.post('/sys/partners/' + params.clientMoniker + '/incremental_service', $scope.model).then(function (res) { - commonDialog.alert({ + xmlHttp.open('Get', url, false) + xmlHttp.send() + if (xmlHttp.status == 404) return false + else return true + } + $scope.initData() + $scope.newServiceChannelDialog = function () { + $uibModal + .open({ + templateUrl: '/static/payment/partner/templates/incremental_service_dialog.html', + controller: 'incrementalServiceDialogCtrl', + resolve: { + params: function () { + return { + isCreate: true, + clientMoniker: $scope.partner.client_moniker, + channelOptions: $scope.channelOptions, + serviceChannel: null, + } + }, + }, + }) + .result.then(function () { + $scope.initData() + }) + } + $scope.editServiceChannelDialog = function (serviceChannel) { + $uibModal + .open({ + templateUrl: '/static/payment/partner/templates/incremental_service_dialog.html', + controller: 'incrementalServiceDialogCtrl', + resolve: { + params: function () { + return { + isCreate: false, + clientMoniker: $scope.partner.client_moniker, + channelOptions: $scope.channelOptions, + serviceChannel: serviceChannel, + } + }, + }, + }) + .result.then(function () { + $scope.initData() + }) + } + $scope.updateStatus = function (service) { + commonDialog + .confirm({ + title: 'Update ' + service.channel + ' Incremental Service Status', + content: 'Are you sure update ' + service.channel + ' status?', + choises: [ + { label: 'Submit', className: 'btn-success', key: 1 }, + { label: 'Cancel', className: 'btn-warning', key: 0, dismiss: true }, + ], + }) + .then(function (choice) { + if (choice == 1) { + service.is_valid = !service.is_valid + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/incremental_service/status', service).then( + function (res) { + commonDialog.alert({ title: 'Success', - content: $scope.isCreate ? 'Create Service Successful!' : 'Update Service Successful!', - type: 'success' - }); - $scope.ctrl.sending = false; - $scope.$close(); - }, function (resp) { - $scope.ctrl.sending = false; - commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }); - }) - + content: 'Update Service Successful!', + type: 'success', + }) + $scope.initData() + }, + function (resp) { + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + $scope.initData() + } + ) + } + }) + } + }, + ]) + app.controller('incrementalServiceDialogCtrl', [ + '$scope', + '$http', + 'params', + 'commonDialog', + function ($scope, $http, params, commonDialog) { + $scope.model = {} + $scope.ctrl = { sending: false } + $scope.isCreate = true + $scope.initData = function () { + $scope.isCreate = angular.copy(params.isCreate) + if ($scope.isCreate) { + $scope.model.channel = angular.copy(params.channelOptions[0]) + $scope.model.channelOptions = angular.copy(params.channelOptions) + } else { + $scope.model = angular.copy(params.serviceChannel) } - }]) - - - app.filter('bdOrg', function () { - return function (bdUsers, org_id) { - if (org_id) { - var bdUserByOrg = {}; - var count = 0; - angular.forEach(bdUsers, function (bdUser) { - if (bdUser.org_id == org_id) { - bdUserByOrg[count] = bdUser; - count++; - } - }); - return bdUserByOrg; - } - return bdUsers; - } - }); - app.filter('wxMerchants', function () { - return function (values) { - var industry = ''; - angular.forEach(wxMerchantIndustries, function (wxMerchant) { - if (wxMerchant.value == values) { - industry = wxMerchant.label; - } - }); - return industry; - } - }); - //将保存的industry 和最新的分类比较,若查不到,返回空 - app.filter('newWxMerchantsFilter', function () { - return function (values) { - var industry = null; - angular.forEach(wxMerchantIndustries, function (wxMerchant) { - if (wxMerchant.value == values) { - industry = wxMerchant.value; - } - }); - return industry; - } - }); - app.filter('newWxMerchants', function () { - return function (values) { - var industry = ''; - angular.forEach(wxMerchantIndustries, function (wxMerchant) { - if (wxMerchant.value == values) { - industry = wxMerchant.label; - } - }); - return industry; - } - }); - app.filter('yeepayIndustry', function () { - return function (value) { - switch (value + '') { - case 'ehk100000': - return '货物贸易'; - case 'ehk200000': - return '旅游'; - case 'ehk300000': - return '文化教育'; - case 'ehk400000': - return '服务贸易'; - case 'ehk500000': - return '物流'; - case 'ehk600000': - return '数字娱乐'; - case 'ehk700000': - return '金融保险'; - case 'ehk999999': - return '其他'; - } + } + $scope.initData() + $scope.save = function (form) { + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true + } + }) + return } - }); - - app.filter('yeepayBusinessContent', function () { - return function (value) { - switch (value + '') { - case 'SERVICETRADE': - return '服务贸易'; - case 'GOODSTRADE': - return '货物贸易'; - case 'OVERSEASTUDY': - return '留学'; - case 'HOTELTICKET': - return '酒店机票'; - case 'INTTRANSPORT': - return '国际运输'; - case 'TOURSERVICE': - return '旅游服务'; - case 'INSURANCE': - return '保险'; - } + $scope.ctrl.sending = true + $http.post('/sys/partners/' + params.clientMoniker + '/incremental_service', $scope.model).then( + function (res) { + commonDialog.alert({ + title: 'Success', + content: $scope.isCreate ? 'Create Service Successful!' : 'Update Service Successful!', + type: 'success', + }) + $scope.ctrl.sending = false + $scope.$close() + }, + function (resp) { + $scope.ctrl.sending = false + commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' }) + } + ) + } + }, + ]) + + app.filter('bdOrg', function () { + return function (bdUsers, org_id) { + if (org_id) { + var bdUserByOrg = {} + var count = 0 + angular.forEach(bdUsers, function (bdUser) { + if (bdUser.org_id == org_id) { + bdUserByOrg[count] = bdUser + count++ + } + }) + return bdUserByOrg + } + return bdUsers + } + }) + app.filter('wxMerchants', function () { + return function (values) { + var industry = '' + angular.forEach(wxMerchantIndustries, function (wxMerchant) { + if (wxMerchant.value == values) { + industry = wxMerchant.label } - }); - - app.filter('bdOrgSelect', function () { - return function (bdUsers, params) { - var org_id; - org_id = params.org_ids || params.org_id || currentUser.org_id; - if (org_id) { - var bdUserByOrg = {}; - var count = 0; - angular.forEach(bdUsers, function (bdUser) { - if (params.org_ids) { - if (bdUser.org_id == org_id) { - bdUserByOrg[count] = bdUser; - count++; - } - } else { - if (bdUser.org_id == org_id || bdUser.parent_org_id == org_id) { - bdUserByOrg[count] = bdUser; - count++; - } - - } - }); - return bdUserByOrg; - } - return bdUsers; - } - }); - - app.filter('wxindustries', function () { - return function (value) { - switch (value + '') { - case '327': - return '343'; - case '339': - return '493'; - case '337': - return '492'; - case '328': - return '491'; - case '362': - case '361': - case '363': - case '329': - return '490'; - case '330': - return '489'; - case '332': - return '487'; - case '334': - return '486'; - case '335': - return '485'; - case '336': - return '484'; - case '338': - case '358': - return '494' - } + }) + return industry + } + }) + //将保存的industry 和最新的分类比较,若查不到,返回空 + app.filter('newWxMerchantsFilter', function () { + return function (values) { + var industry = null + angular.forEach(wxMerchantIndustries, function (wxMerchant) { + if (wxMerchant.value == values) { + industry = wxMerchant.value } - }); - - app.filter('wechatMcc', ['wechatGoodMcc', function (wechatGoodMcc) { - return function (values) { - var industry = ''; - angular.forEach(wechatGoodMcc.configs(), function (wxMerchant) { - if (wxMerchant.value == values) { - industry = wxMerchant.label; - } - }); - return industry; - } - }]); - - app.filter('choose_merchant_id', function () { - return function (value) { - switch (value + '') { - case '1307485301': - return '1307485301(Tunnel Show1)'; - case '1431999902': - return '1431999902(Tunnel Show2)'; - case '1487387142': - return '1487387142(NAP)'; - case '': - return '' - } + }) + return industry + } + }) + app.filter('newWxMerchants', function () { + return function (values) { + var industry = '' + angular.forEach(wxMerchantIndustries, function (wxMerchant) { + if (wxMerchant.value == values) { + industry = wxMerchant.label } - }); + }) + return industry + } + }) + app.filter('yeepayIndustry', function () { + return function (value) { + switch (value + '') { + case 'ehk100000': + return '货物贸易' + case 'ehk200000': + return '旅游' + case 'ehk300000': + return '文化教育' + case 'ehk400000': + return '服务贸易' + case 'ehk500000': + return '物流' + case 'ehk600000': + return '数字娱乐' + case 'ehk700000': + return '金融保险' + case 'ehk999999': + return '其他' + } + } + }) + + app.filter('yeepayBusinessContent', function () { + return function (value) { + switch (value + '') { + case 'SERVICETRADE': + return '服务贸易' + case 'GOODSTRADE': + return '货物贸易' + case 'OVERSEASTUDY': + return '留学' + case 'HOTELTICKET': + return '酒店机票' + case 'INTTRANSPORT': + return '国际运输' + case 'TOURSERVICE': + return '旅游服务' + case 'INSURANCE': + return '保险' + } + } + }) + + app.filter('bdOrgSelect', function () { + return function (bdUsers, params) { + var org_id + org_id = params.org_ids || params.org_id || currentUser.org_id + if (org_id) { + var bdUserByOrg = {} + var count = 0 + angular.forEach(bdUsers, function (bdUser) { + if (params.org_ids) { + if (bdUser.org_id == org_id) { + bdUserByOrg[count] = bdUser + count++ + } + } else { + if (bdUser.org_id == org_id || bdUser.parent_org_id == org_id) { + bdUserByOrg[count] = bdUser + count++ + } + } + }) + return bdUserByOrg + } + return bdUsers + } + }) + + app.filter('wxindustries', function () { + return function (value) { + switch (value + '') { + case '327': + return '343' + case '339': + return '493' + case '337': + return '492' + case '328': + return '491' + case '362': + case '361': + case '363': + case '329': + return '490' + case '330': + return '489' + case '332': + return '487' + case '334': + return '486' + case '335': + return '485' + case '336': + return '484' + case '338': + case '358': + return '494' + } + } + }) + + app.filter('wechatMcc', [ + 'wechatGoodMcc', + function (wechatGoodMcc) { + return function (values) { + var industry = '' + angular.forEach(wechatGoodMcc.configs(), function (wxMerchant) { + if (wxMerchant.value == values) { + industry = wxMerchant.label + } + }) + return industry + } + }, + ]) + + app.filter('choose_merchant_id', function () { + return function (value) { + switch (value + '') { + case '1307485301': + return '1307485301(Tunnel Show1)' + case '1431999902': + return '1431999902(Tunnel Show2)' + case '1487387142': + return '1487387142(NAP)' + case '': + return '' + } + } + }) - app.filter('cut', function () { - return function (value, wordwise, max, tail) { - if (!value) return ''; + app.filter('cut', function () { + return function (value, wordwise, max, tail) { + if (!value) return '' - max = parseInt(max, 10); - if (!max) return value; - if (value.length <= max) return value; + max = parseInt(max, 10) + if (!max) return value + if (value.length <= max) return value - value = value.substr(0, max); - if (wordwise) { - var lastspace = value.lastIndexOf(' '); - if (lastspace != -1) { - value = value.substr(0, lastspace); - } - } - return value + (tail || ' …'); - }; - }); - app.filter('dateConversionStr', function () { - - return function (date) { - var year = date.getFullYear(); //获取完整的年份(4位,1970-????) - var month = date.getMonth() + 1; //获取当前月份(0-11,0代表1月) - var day = date.getDate(); //获取当前日(1-31) - if (month < 10) { - month = "0" + month; - } - if (day < 10) { - day = "0" + day; - } - var dateString = year + "-" + month + "-" + day; - return dateString; - }; + value = value.substr(0, max) + if (wordwise) { + var lastspace = value.lastIndexOf(' ') + if (lastspace != -1) { + value = value.substr(0, lastspace) + } + } + return value + (tail || ' …') + } + }) + app.filter('dateConversionStr', function () { + return function (date) { + var year = date.getFullYear() //获取完整的年份(4位,1970-????) + var month = date.getMonth() + 1 //获取当前月份(0-11,0代表1月) + var day = date.getDate() //获取当前日(1-31) + if (month < 10) { + month = '0' + month + } + if (day < 10) { + day = '0' + day + } + var dateString = year + '-' + month + '-' + day + return dateString } - ); - return app; -}); + }) + return app +}) diff --git a/src/main/ui/static/payment/partner/templates/partner_pay_logs.html b/src/main/ui/static/payment/partner/templates/partner_pay_logs.html index 70dd618a8..8928a2b20 100644 --- a/src/main/ui/static/payment/partner/templates/partner_pay_logs.html +++ b/src/main/ui/static/payment/partner/templates/partner_pay_logs.html @@ -7,36 +7,37 @@ padding: 20px; border: 1px solid orange; background-color: white; - z-index:1002; + z-index: 1002; overflow: auto; } + .white_content::-webkit-scrollbar:vertical { width: 11px; } + /*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ - .white_content::-webkit-scrollbar - { + .white_content::-webkit-scrollbar { -webkit-appearance: none; - width:16px; - height:16px; - background-color:#F5F5F5; + width: 16px; + height: 16px; + background-color: #F5F5F5; } + /*定义滚动条轨道 内阴影+圆角*/ - .white_content::-webkit-scrollbar-track - { - -webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.3); - border-radius:10px; - background-color:#F5F5F5; + .white_content::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); + border-radius: 10px; + background-color: #F5F5F5; } + /*定义滑块 内阴影+圆角*/ - .white_content::-webkit-scrollbar-thumb - { - border-radius:10px; - -webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.3); - background-color:#555; + .white_content::-webkit-scrollbar-thumb { + border-radius: 10px; + -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .3); + background-color: #555; }

@@ -56,7 +57,7 @@
+ ng-model="params.searchText">
@@ -64,15 +65,15 @@

All | + ng-click="params.status='ALL';loadTradeLogs(1)">All | Payment Success | + ng-click="params.status='PAID';loadTradeLogs(1)">Payment Success | All Refund | + ng-click="params.status='ALL_REFUNDED';loadTradeLogs(1)">All Refund | Partial Refund | + ng-click="params.status='PARTIAL_REFUNDED';loadTradeLogs(1)">Partial Refund | Full Refund | + ng-click="params.status='FULL_REFUNDED';loadTradeLogs(1)">Full Refund |

@@ -81,53 +82,53 @@

All | + ng-click="params.gateway=null;loadTradeLogs(1)">All | Retail In-Store | + ng-click="params.gateway=[0,1];initGatewayChild()">Retail In-Store | Retail API | + ng-click="params.gateway=[5,6];initGatewayChild()">Retail API | QR Code | + ng-click="params.gateway=[2,7];loadTradeLogs(1)">QR Code | Online API | + ng-click="params.gateway=[3];loadTradeLogs(1)">Online API | WeChat HTML5 | + ng-click="params.gateway=[4];loadTradeLogs(1)">WeChat HTML5 | Mobile H5 | + ng-click="params.gateway=[8];loadTradeLogs(1)">Mobile H5 | Third Party Gateway | + ng-click="params.gateway=[9];loadTradeLogs(1)">Third Party Gateway | APP | + ng-click="params.gateway=[10];loadTradeLogs(1)">APP | Share Code | + ng-click="params.gateway=[11];loadTradeLogs(1)">Share Code | MiniProgram | + ng-click="params.gateway=[12];loadTradeLogs(1)">MiniProgram | Native QR Code | + ng-click="params.gateway=[13];loadTradeLogs(1)">Native QR Code | Share Link + ng-click="params.gateway=[14];loadTradeLogs(1)">Share Link

+ ng-if="params.gateway.sort().toString()==[0,1] || params.gateway.sort().toString()==[5,6]">

All | + ng-click="params.gatewayChild=null;loadTradeLogs(1)">All | 线下B端二维码 | + ng-class="{'bg-primary':params.gatewayChild==1}" + ng-click="params.gatewayChild=1;loadTradeLogs(1)">线下B端二维码 | 线下C端支付码 + ng-class="{'bg-primary':params.gatewayChild==0}" + ng-click="params.gatewayChild=0;loadTradeLogs(1)">线下C端支付码 线下网关(B端二维码) | + ng-class="{'bg-primary':params.gatewayChild==6}" + ng-click="params.gatewayChild=6;loadTradeLogs(1)">线下网关(B端二维码) | 线下网关(C端支付码) + ng-class="{'bg-primary':params.gatewayChild==5}" + ng-click="params.gatewayChild=5;loadTradeLogs(1)">线下网关(C端支付码)

@@ -136,29 +137,31 @@

All | + ng-click="params.channel='ALL';loadTradeLogs(1)">All | Wechat Pay | + ng-click="params.channel='WECHAT';loadTradeLogs(1)">Wechat Pay | Alipay | + ng-click="params.channel='ALIPAY';loadTradeLogs(1)">Alipay | AlipayOnline | + ng-click="params.channel='ALIPAYONLINE';loadTradeLogs(1)">AlipayOnline | + Alipay+ | BestPay | + ng-click="params.channel='BESTPAY';loadTradeLogs(1)">BestPay | JDpay | + ng-click="params.channel='JD';loadTradeLogs(1)">JDpay | HFpay | + ng-click="params.channel='HF';loadTradeLogs(1)">HFpay | RPay + | + ng-click="params.channel='RPAY';loadTradeLogs(1)">RPay + | Yeepay | + ng-click="params.channel='YEEPAY';loadTradeLogs(1)">Yeepay | LakalaPay | + ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay | Card Payment | + ng-click="params.channel='RPAYPMT_CARD';loadTradeLogs(1)">Card Payment | Direct Debit + ng-click="params.channel='RPAYPMT_DD';loadTradeLogs(1)">Direct Debit

@@ -168,29 +171,24 @@
+ uib-datepicker-popup size="10" placeholder="From" is-open="dateBegin.open" + ng-click="dateBegin.open=true" datepicker-options="{maxDate:params.dateto||today}">
~
- +
- Today + Today
@@ -213,25 +211,26 @@ All

- All -

-
+
- +
-
@@ -240,77 +239,75 @@
- - - - - + + + + + - - - - + + - + + + +
Partner CodePartner NameOperation
Partner CodePartner NameOperation
- {{subPartner.client_moniker}} - - + {{subPartner.client_moniker}} + + -
- - - - - + + + + + - - - - + + - + + + +
Partner CodePartner NameOperation
Partner CodePartner NameOperation
- {{subPartner.client_moniker}} - - + {{subPartner.client_moniker}} + + -
@@ -319,10 +316,12 @@

- All + All

@@ -337,84 +336,140 @@

Orders - (Found {{pagination.totalCount}} orders and {{analysis.order_count}} transactions worth of {{analysis.paid_fee|currency:'AUD'}}) - Pre Authorization: + (Found {{pagination.totalCount}} orders and + {{analysis.order_count}} transactions worth of {{analysis.paid_fee|currency:'AUD'}}) + Pre Authorization:

- + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + +
Client Order IDOrder IDAmountInput AmountAUD AmountExchange RateStatusCreate TimeGatewayOperation
Client Order IDOrder IDAmountInput AmountAUD AmountExchange RateStatusCreate TimeGatewayOperation
- - - - - - - - - - - - - {{trade.order_id}} - - {{trade.total_amount|currency:trade.currency+' '}} - (-{{trade.refund_fee}}) - - - - - - - - - - - -
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{trade.order_id}} + + {{trade.total_amount|currency:trade.currency+' '}} + (-{{trade.refund_fee}}) + + + - + + + + + + + +
- +
Total Records:{{pagination.totalCount}};Total Pages:{{pagination.totalPages}}
-
+
\ No newline at end of file diff --git a/src/main/ui/static/payment/partner/templates/partner_payment_info.html b/src/main/ui/static/payment/partner/templates/partner_payment_info.html index ee507d95d..68c9c0692 100644 --- a/src/main/ui/static/payment/partner/templates/partner_payment_info.html +++ b/src/main/ui/static/payment/partner/templates/partner_payment_info.html @@ -218,21 +218,21 @@
+ ng-change="toggleChannel('alipay')">
+ ng-change="toggleChannel('wechat')">
+ ng-change="toggleChannel('cb_bankpay')">
@@ -240,17 +240,23 @@
+ ng-change="toggleChannel('rpaypmt_card')">
+ ng-change="toggleChannel('rpaypmt_dd')"> +
+
+
+ +
+
- @@ -370,6 +376,14 @@

+
+ +
+ +
+
diff --git a/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html b/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html index 49fa74723..1e3747d0f 100644 --- a/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html +++ b/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html @@ -9,23 +9,28 @@ .i-rotate_90 { animation: rotate_90 1s forwards; - -webkit-animation: rotate_90 1s forwards; /* Safari and Chrome */ + -webkit-animation: rotate_90 1s forwards; + /* Safari and Chrome */ } @keyframes rotate_90 { from { transform: rotate(0deg); } + to { transform: rotate(90deg); } } - @-webkit-keyframes rotate_90 /* Safari and Chrome */ - { + @-webkit-keyframes rotate_90 + + /* Safari and Chrome */ + { from { -webkit-transform: rotate(0deg); } + to { -webkit-transform: rotate(90deg); } @@ -78,6 +83,7 @@ .line_height_ { line-height: 22px; } + .white_content { display: none; position: absolute; @@ -86,36 +92,37 @@ padding: 20px; border: 1px solid orange; background-color: white; - z-index:1002; + z-index: 1002; overflow: auto; } + .white_content::-webkit-scrollbar:vertical { width: 11px; } + /*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ - .white_content::-webkit-scrollbar - { + .white_content::-webkit-scrollbar { -webkit-appearance: none; - width:16px; - height:16px; - background-color:#F5F5F5; + width: 16px; + height: 16px; + background-color: #F5F5F5; } + /*定义滚动条轨道 内阴影+圆角*/ - .white_content::-webkit-scrollbar-track - { - -webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.3); - border-radius:10px; - background-color:#F5F5F5; + .white_content::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); + border-radius: 10px; + background-color: #F5F5F5; } + /*定义滑块 内阴影+圆角*/ - .white_content::-webkit-scrollbar-thumb - { - border-radius:10px; - -webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.3); - background-color:#555; + .white_content::-webkit-scrollbar-thumb { + border-radius: 10px; + -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .3); + background-color: #555; }
@@ -154,8 +161,7 @@
+ ng-enter="loadTradeLogs(1)" ng-model="params.searchText">
@@ -163,11 +169,11 @@

All | + ng-click="params.source='ALL';loadTradeLogs(1)">All | System | + ng-click="params.source='system';loadTradeLogs(1)">System | RP跨境商城 + ng-click="params.source='RP跨境商城';loadTradeLogs(1)">RP跨境商城

@@ -176,20 +182,20 @@ @@ -199,21 +205,27 @@

All | + ng-click="params.channel='ALL';loadTradeLogs(1)">All | Wechat Pay | + ng-click="params.channel='WECHAT';loadTradeLogs(1)">Wechat Pay | Alipay | + ng-click="params.channel='ALIPAY';loadTradeLogs(1)">Alipay | AlipayOnline + ng-class="{'bg-primary':params.channel=='ALIPAYONLINE'}" + ng-click="params.channel='ALIPAYONLINE';loadTradeLogs(1)">AlipayOnline + | + Alipay+ | RPay+ | - Card Payment | + ng-click="params.channel='RPAY';loadTradeLogs(1)">RPay+ | + Card + Payment | Direct Debit + ng-click="params.channel='RPAYPMT_DD';loadTradeLogs(1)">Direct + Debit

@@ -222,55 +234,55 @@

All | + ng-click="params.gateway=null;loadTradeLogs(1)">All | Retail + ng-click="params.gateway=[0,1];initGatewayChild()">Retail In-Store | Retail API | + ng-click="params.gateway=[5,6];initGatewayChild()">Retail API | QR Code | + ng-click="params.gateway=[2,7];loadTradeLogs(1)">QR Code | Online API | + ng-click="params.gateway=[3];loadTradeLogs(1)">Online API | WeChat HTML5 | + ng-click="params.gateway=[4];loadTradeLogs(1)">WeChat HTML5 | Mobile H5 | + ng-click="params.gateway=[8];loadTradeLogs(1)">Mobile H5 | Third Party + ng-click="params.gateway=[9];loadTradeLogs(1)">Third Party Gateway | APP | + ng-click="params.gateway=[10];loadTradeLogs(1)">APP | Share Code | + ng-click="params.gateway=[11];loadTradeLogs(1)">Share Code | MiniProgram | + ng-click="params.gateway=[12];loadTradeLogs(1)">MiniProgram | Native QR Code | + ng-click="params.gateway=[13];loadTradeLogs(1)">Native QR Code | Share Link + ng-click="params.gateway=[14];loadTradeLogs(1)">Share Link

+ ng-if="params.gateway.sort().toString()==[0,1] || params.gateway.sort().toString()==[5,6]">

All | + ng-click="params.gatewayChild=null;loadTradeLogs(1)">All | 线下B端二维码 | + ng-class="{'bg-primary':params.gatewayChild==1}" + ng-click="params.gatewayChild=1;loadTradeLogs(1)">线下B端二维码 | 线下C端支付码 + ng-class="{'bg-primary':params.gatewayChild==0}" + ng-click="params.gatewayChild=0;loadTradeLogs(1)">线下C端支付码 线下网关(B端二维码) | + ng-class="{'bg-primary':params.gatewayChild==6}" + ng-click="params.gatewayChild=6;loadTradeLogs(1)">线下网关(B端二维码) | 线下网关(C端支付码) + ng-class="{'bg-primary':params.gatewayChild==5}" + ng-click="params.gatewayChild=5;loadTradeLogs(1)">线下网关(C端支付码)

@@ -280,39 +292,39 @@
+ ng-model="params.datefrom" uib-datepicker-popup size="10" + placeholder="From" is-open="dateBegin.open" + ng-click="dateBegin.open=true" + datepicker-options="{maxDate:params.dateto||today}">
~
+ ng-model="params.dateto" uib-datepicker-popup size="10" + placeholder="To" is-open="dateTo.open" + ng-click="dateTo.open=true" + datepicker-options="{minDate:params.datefrom,maxDate:today}">
Today + ng-click="chooseToday()">Today
Yesterday + ng-click="chooseYesterday()">Yesterday
Last 7 Days + ng-click="chooseLast7Days()">Last 7 Days
This Month + ng-click="thisMonth()">This Month
Last Month + ng-click="lastMonth()">Last Month
@@ -320,148 +332,160 @@
+ ng-if="currentUser.client.has_children && !currentUser.client.hide_sub_mch">

All + ng-click="chooseClient('all')">All

All -

-
+
+ ng-model="subSearchText">
-
- +
- - - - - + + + + + - - - - + + - + + + +
Partner CodePartner NameOperation
Partner CodePartner NameOperation
- {{subPartner.client_moniker}} - - + {{subPartner.client_moniker}} + + -
- +
- - - - - + + + + + - - - - + + - + + + +
Partner CodePartner NameOperation
Partner CodePartner NameOperation
- {{subPartner.client_moniker}} - - + {{subPartner.client_moniker}} + + -
-
+ ng-if="level3Clients && showLevel3Clients && !currentUser.client.hide_sub_mch">

All + ng-click="chooseLevel3Client('all')">All

+ ng-if="deviceIds.length && !currentUser.client.hide_sub_mch">

All + ng-click="chooseDeviceIds('all')">All

@@ -471,11 +495,11 @@

All + ng-click="chooseDevices('all')">All

@@ -498,7 +522,7 @@
Transaction Amount + ng-bind="analysis.paid_fee|currency:'AUD '"> ( {{analysis.order_count}} Orders )
@@ -511,30 +535,31 @@
Input Amount - ( {{analysis.pre_display_amount | currency:'pre authorization '}} ) + ng-bind="analysis.display_amount|currency:'AUD '"> + ( {{analysis.pre_display_amount | currency:'pre + authorization '}} )
+ ng-class="{'line_height':analysis.pre_display_amount||analysis.pre_cny_display_amount}">
Input Amount + ng-class="{line_height_:!analysis.pre_display_amount}" + ng-bind="analysis.display_amount|currency:'AUD '"> + ng-if="analysis.pre_display_amount"> ( {{analysis.pre_display_amount | currency:'pre authorization '}} ) + ng-if="analysis.cny_display_amount" + ng-bind="analysis.cny_display_amount|currency:'CNY '"> + ng-if="analysis.pre_cny_display_amount"> ( {{analysis.pre_cny_display_amount | currency:'pre authorization '}} )
@@ -547,9 +572,9 @@
Refund Amount + ng-bind="analysis.refund_fee|currency:'AUD '"> - ({{analysis.pre_refund_fee|currency:'pre authorization '}}) + ({{analysis.pre_refund_fee|currency:'pre authorization '}})
@@ -561,7 +586,7 @@
CUSTOMERS + ng-bind="analysis.customers">
@@ -572,132 +597,194 @@

Orders - Pre Authorization: - - - - + Pre Authorization: + + + +

- - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
Client MonikerShort NameClient Order IDOrder IDAmountInput AmountAUD AmountSettle AmountExchange RateStatusCreate TimeGatewayOrder DetailOperation
Client MonikerShort NameClient Order IDOrder IDAmountInput AmountAUD AmountSettle AmountExchange RateStatusCreate TimeGatewayOrder DetailOperation
- - - - - - - BestPay - Alipay - AlipayOnline - - - - - - - - {{trade.order_id}} - - {{trade.total_amount|currency:trade.currency+' '}} - (-{{trade.refund_fee}}) - - - - - - - - - - - - - - - - -
+ + + + + + + BestPay + Alipay + AlipayOnline + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{trade.order_id}} + + {{trade.total_amount|currency:trade.currency+' '}} + (-{{trade.refund_fee}}) + + + - + + + + + + + + + + + + +
- + \ No newline at end of file diff --git a/src/main/ui/static/payment/tradelog/templates/trade_logs.html b/src/main/ui/static/payment/tradelog/templates/trade_logs.html index 714798fa0..0f628ab0c 100644 --- a/src/main/ui/static/payment/tradelog/templates/trade_logs.html +++ b/src/main/ui/static/payment/tradelog/templates/trade_logs.html @@ -95,24 +95,23 @@
+ ng-enter="loadTradeLogs(1)" ng-model="params.searchText">
+ class="col-sm-6">
@@ -147,11 +146,11 @@

All | + ng-click="params.source='ALL';loadTradeLogs(1)">All | System | + ng-click="params.source='system';loadTradeLogs(1)">System | RP跨境商城 + ng-click="params.source='RP跨境商城';loadTradeLogs(1)">RP跨境商城

@@ -160,20 +159,20 @@ @@ -183,31 +182,38 @@

All | + ng-click="params.channel='ALL';loadTradeLogs(1)">All | Wechat Pay | + ng-click="params.channel='WECHAT';loadTradeLogs(1)">Wechat Pay | Alipay | + ng-click="params.channel='ALIPAY';loadTradeLogs(1)">Alipay | AlipayOnline + ng-class="{'bg-primary':params.channel=='ALIPAYONLINE'}" + ng-click="params.channel='ALIPAYONLINE';loadTradeLogs(1)">AlipayOnline + | + Alipay+ | BestPay | + ng-click="params.channel='BESTPAY';loadTradeLogs(1)">BestPay | JD Pay | + ng-click="params.channel='JD';loadTradeLogs(1)">JD Pay | HF Pay | + ng-click="params.channel='HF';loadTradeLogs(1)">HF Pay | RPay + | + ng-click="params.channel='RPAY';loadTradeLogs(1)">RPay + | Yeepay | + ng-click="params.channel='YEEPAY';loadTradeLogs(1)">Yeepay | LakalaPay | - Card Payment | + ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay + | + Card + Payment | Direct Debit + ng-click="params.channel='RPAYPMT_DD';loadTradeLogs(1)">Direct + Debit

@@ -216,55 +222,57 @@

All | + ng-click="params.gateway=null;loadTradeLogs(1)">All | Retail In-Store + ng-click="params.gateway=[0,1];initGatewayChild()">Retail + In-Store | Retail API | + ng-click="params.gateway=[5,6];loadTradeLogs(1);initGatewayChild()">Retail + API | QR Code | + ng-click="params.gateway=[2,7];loadTradeLogs(1)">QR Code | Online API | + ng-click="params.gateway=[3];loadTradeLogs(1)">Online API | WeChat HTML5 | + ng-click="params.gateway=[4];loadTradeLogs(1)">WeChat HTML5 | Mobile H5 | + ng-click="params.gateway=[8];loadTradeLogs(1)">Mobile H5 | Third Party + ng-click="params.gateway=[9];loadTradeLogs(1)">Third Party Gateway | APP | + ng-click="params.gateway=[10];loadTradeLogs(1)">APP | Share Code | + ng-click="params.gateway=[11];loadTradeLogs(1)">Share Code | MiniProgram | + ng-click="params.gateway=[12];loadTradeLogs(1)">MiniProgram | Native QR Code | + ng-click="params.gateway=[13];loadTradeLogs(1)">Native QR Code | Share Link + ng-click="params.gateway=[14];loadTradeLogs(1)">Share Link

+ ng-if="params.gateway.sort().toString()==[0,1] || params.gateway.sort().toString()==[5,6]">

All | + ng-click="params.gatewayChild=null;loadTradeLogs(1)">All | 线下B端二维码 | + ng-class="{'bg-primary':params.gatewayChild==1}" + ng-click="params.gatewayChild=1;loadTradeLogs(1)">线下B端二维码 | 线下C端支付码 + ng-class="{'bg-primary':params.gatewayChild==0}" + ng-click="params.gatewayChild=0;loadTradeLogs(1)">线下C端支付码 线下网关(B端二维码) | + ng-class="{'bg-primary':params.gatewayChild==6}" + ng-click="params.gatewayChild=6;loadTradeLogs(1)">线下网关(B端二维码) | 线下网关(C端支付码) + ng-class="{'bg-primary':params.gatewayChild==5}" + ng-click="params.gatewayChild=5;loadTradeLogs(1)">线下网关(C端支付码)

@@ -274,39 +282,39 @@
+ ng-model="params.datefrom" uib-datepicker-popup size="10" + placeholder="From" is-open="dateBegin.open" + ng-click="dateBegin.open=true" + datepicker-options="{maxDate:params.dateto||today}">
~
+ ng-model="params.dateto" uib-datepicker-popup size="10" + placeholder="To" is-open="dateTo.open" + ng-click="dateTo.open=true" + datepicker-options="{minDate:params.datefrom,maxDate:today}">
Today + ng-click="chooseToday()">Today
Yesterday + ng-click="chooseYesterday()">Yesterday
Last 7 Days + ng-click="chooseLast7Days()">Last 7 Days
This Month + ng-click="thisMonth()">This Month
Last Month + ng-click="lastMonth()">Last Month
@@ -316,11 +324,11 @@

All + ng-click="chooseBD('all')">All

@@ -351,7 +359,7 @@
Transaction Amount + ng-bind="analysis.paid_fee|currency:'AUD'"> ( {{analysis.order_count}} Orders )
@@ -363,30 +371,31 @@
Input Amount - ( {{analysis.pre_display_amount | currency:'pre authorization '}} ) + ng-bind="analysis.display_amount|currency:'AUD '"> + ( {{analysis.pre_display_amount | currency:'pre + authorization '}} )
+ ng-class="{'line_height':analysis.pre_display_amount||analysis.pre_cny_display_amount}">
Input Amount + ng-class="{line_height_:!analysis.pre_display_amount}" + ng-bind="analysis.display_amount|currency:'AUD '"> + ng-if="analysis.pre_display_amount"> ( {{analysis.pre_display_amount | currency:'pre authorization '}} ) + ng-if="analysis.cny_display_amount" + ng-bind="analysis.cny_display_amount|currency:'CNY '"> + ng-if="analysis.pre_cny_display_amount"> ( {{analysis.pre_cny_display_amount | currency:'pre authorization '}} )
@@ -399,9 +408,9 @@
Refund Amount + ng-bind="analysis.refund_fee|currency:'AUD '"> - ({{analysis.pre_refund_fee|currency:'pre authorization '}}) + ({{analysis.pre_refund_fee|currency:'pre authorization '}})
@@ -412,8 +421,7 @@ class="ion ion-ios-people">
Merchants - +
@@ -425,7 +433,7 @@
CUSTOMERS + ng-bind="analysis.customers">
@@ -436,109 +444,173 @@

Trade Orders Pre Authorization: + aria-hidden="true" style="color: #fff2a5">

+ ng-click="confirmOrders()">Manual Confirm Orders
- - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + +
PartnerOrder IDAmountInput AmountAUD AmountExchange RateStatusCreate TimeGatewayOperation
PartnerOrder IDAmountInput AmountAUD AmountExchange RateStatusCreate TimeGatewayOperation
- - {{trade.short_name}}({{trade.client_moniker}}) - - - - - - - - - - - - - - - - - {{trade.order_id}} - - {{trade.total_amount|currency:trade.currency}} - (-{{trade.refund_fee}}) - - - - - - - - - - - -
+ + {{trade.short_name}}({{trade.client_moniker}}) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{trade.order_id}} + + {{trade.total_amount|currency:trade.currency}} + (-{{trade.refund_fee}}) + + + - + + + + + + + +
- +
Total Records:{{pagination.totalCount}};Total Pages:{{pagination.totalPages}} @@ -549,4 +621,4 @@
- + \ No newline at end of file From d329806652239b5afb8f5f28c6002703cbec8754 Mon Sep 17 00:00:00 2001 From: zhangtao <1316069495@qq.com> Date: Thu, 18 Mar 2021 16:02:38 +0800 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20alipay+=20=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/impls/AlipayChannelsConfig.java | 68 +++++++++++++++++++ .../core/impls/ClientManagerImpl.java | 29 +++++--- .../merchants/web/AlipayConfigController.java | 31 +++++++++ 3 files changed, 119 insertions(+), 9 deletions(-) create mode 100644 src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/AlipayChannelsConfig.java create mode 100644 src/main/java/au/com/royalpay/payment/manage/merchants/web/AlipayConfigController.java diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/AlipayChannelsConfig.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/AlipayChannelsConfig.java new file mode 100644 index 000000000..5081dd21e --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/AlipayChannelsConfig.java @@ -0,0 +1,68 @@ +package au.com.royalpay.payment.manage.merchants.core.impls; + +import au.com.royalpay.payment.manage.mappers.system.ClientConfigMapper; +import com.alibaba.fastjson.JSONObject; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Optional; + +/** + * @Description + * @title: + * @Date 2021/1/28 11:15 + * @author: zhangTao + */ +@Component +public class AlipayChannelsConfig { + + @Resource + private ClientConfigMapper clientConfigMapper; + + + public boolean isMandatoryAlipayOnline(int clientId) { + Optional optionalClientConfigInfo = getClientConfig(clientId); + if (optionalClientConfigInfo.isPresent()){ + JSONObject clientConfigInfo = optionalClientConfigInfo.get(); + if (clientConfigInfo.getBooleanValue("mandatory_alipay_online")){ + return true; + } + } + return false; + } + + + + public void modifyMandatoryAlipayOnline(int clientId ,boolean mandatoryAlipayOnlineStatus){ + JSONObject mandatoryAlipayOnlineConfig = new JSONObject(); + mandatoryAlipayOnlineConfig.put("client_id",clientId); + mandatoryAlipayOnlineConfig.put("mandatory_alipay_online",mandatoryAlipayOnlineStatus); + clientConfigMapper.update(mandatoryAlipayOnlineConfig); + } + + + public boolean isAlipayPlus(int clientId) { + Optional optionalClientConfigInfo = getClientConfig(clientId); + if (optionalClientConfigInfo.isPresent()){ + JSONObject clientConfigInfo = optionalClientConfigInfo.get(); + if (clientConfigInfo.getBooleanValue("alipay_payment_channels")){ + return true; + } + } + return false; + } + + public void modifyAlipayPaymentChannels(int clientId ,boolean alipayPaymentChannelsStatus){ + JSONObject mandatoryAlipayOnlineConfig = new JSONObject(); + mandatoryAlipayOnlineConfig.put("client_id",clientId); + mandatoryAlipayOnlineConfig.put("alipay_payment_channels",alipayPaymentChannelsStatus); + clientConfigMapper.update(mandatoryAlipayOnlineConfig); + } + + + private Optional getClientConfig(int clientId) { + Optional optionalClientConfigInfo = Optional.of(clientConfigMapper.find(clientId)); + return optionalClientConfigInfo; + } + +} diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 325fcfd50..7b0de4e2b 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -2,7 +2,6 @@ package au.com.royalpay.payment.manage.merchants.core.impls; import au.com.royalpay.payment.channels.alipay.config.AlipayConfig; import au.com.royalpay.payment.channels.alipay.config.AlipayEnvironment; -import au.com.royalpay.payment.channels.alipay.runtime.AlipayCommonApi; import au.com.royalpay.payment.channels.alipay.runtime.AlipayOnlineApi; import au.com.royalpay.payment.channels.alipay.runtime.AlipayRetailApi; import au.com.royalpay.payment.channels.alipay.runtime.entity.AlipayMerchantEntity; @@ -21,16 +20,15 @@ import au.com.royalpay.payment.channels.wechat.runtime.impls.WxPayMerchantRegist import au.com.royalpay.payment.channels.wechat.runtime.impls.WxPayMerchantRegisterLegacy; import au.com.royalpay.payment.channels.wechat.runtime.mappers.PaymentChannelMccGoodMapper; import au.com.royalpay.payment.channels.wechat.runtime.mappers.WxMerchantApplyMapper; -import au.com.royalpay.payment.core.ChannelMerchantApplicationService; import au.com.royalpay.payment.core.PaymentApi; import au.com.royalpay.payment.core.PaymentChannelApi; import au.com.royalpay.payment.core.beans.ChannelMerchantInfo; import au.com.royalpay.payment.core.beans.EmptyMerchantApplication; -import au.com.royalpay.payment.core.beans.MchChannelContract; import au.com.royalpay.payment.core.beans.MerchantApplicationResult; import au.com.royalpay.payment.core.exceptions.EmailException; import au.com.royalpay.payment.core.exceptions.InvalidShortIdException; import au.com.royalpay.payment.core.impls.MerchantChannelApplicationManager; +import au.com.royalpay.payment.core.impls.MerchantChannelPermissionManager; import au.com.royalpay.payment.core.mappers.SysClientMapper; import au.com.royalpay.payment.core.utils.OrderExpiryRuleResolver; import au.com.royalpay.payment.manage.analysis.mappers.TransactionAnalysisMapper; @@ -99,6 +97,7 @@ import au.com.royalpay.payment.tools.lock.Locker; import au.com.royalpay.payment.tools.mail.SendMail; import au.com.royalpay.payment.tools.merchants.beans.QRCodeConfig; import au.com.royalpay.payment.tools.merchants.beans.UpdateSurchargeDTO; +import au.com.royalpay.payment.tools.merchants.core.MerchantChannelPermissionResolver; import au.com.royalpay.payment.tools.merchants.core.MerchantInfoProvider; import au.com.royalpay.payment.tools.merchants.qrboard.QRBoard; import au.com.royalpay.payment.tools.merchants.qrboard.QRBoardProvider; @@ -127,8 +126,6 @@ import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; -import org.dom4j.DocumentException; -import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; @@ -330,7 +327,10 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid @Resource private SysClientUpayProfileMapper sysClientUpayProfileMapper; @Resource - private PaymentApi paymentApi; + private PaymentApi paymentApi; + @Resource + private MerchantChannelPermissionManager merchantChannelPermissionManager; + DateTimeFormatter formatter = DateTimeFormat.forPattern("dd MMM yyyy"); @@ -549,6 +549,13 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if (wechatMcc != null) { client.put("mc_code", wechatMcc.getIntValue("mc_code")); } + client.put("enable_alipayplus", false); + MerchantChannelPermissionResolver resolver = this.paymentApi.channelApi(PayChannel.ALIPAY_PLUS.getChannelCode()).getChannelPermissionResolver(); + if(!Objects.isNull(resolver)) { + if (resolver.newOrderEnabled(client)) { + client.put("enable_alipayplus", true); + } + } return client; } @@ -1565,13 +1572,17 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid @Override public void switchChannelPermission(JSONObject manager, String clientMoniker, String channel, boolean allow) { for (PaymentChannelApi channelApi : paymentApi.channels()) { - if (channelApi.channel().equalsIgnoreCase(channel) || "CB_BankPay".equalsIgnoreCase(channel)) { + if (channelApi.channel().equalsIgnoreCase(channel) ) { JSONObject client = getClientInfoByMoniker(clientMoniker); if (client == null) { throw new NotFoundException("Client Not Exists"); } - clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, "enable_" + channel.toLowerCase(), allow)); - + merchantChannelPermissionManager.switchMerchantChannelPermission(channelApi.getMetadata().payChannel(), client.getIntValue("client_id"), allow); + try { + clientModifySupport.processModify(new SwitchPermissionModify(manager, clientMoniker, "enable_" + channel.toLowerCase(), allow)); + } catch (Exception e) { + logger.error("Failed to change channel switch:{}" ,channel); + } logger.info("{}({}) switched client {} channel {} to {}", manager.getString("display_name"), manager.getString("manager_id"), clientMoniker, channel, allow); if (allow && (StringUtils.equalsAnyIgnoreCase("Wechat", channel) || StringUtils.equalsAnyIgnoreCase("Alipay", channel))) { int clientId = client.getIntValue("client_id"); diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/web/AlipayConfigController.java b/src/main/java/au/com/royalpay/payment/manage/merchants/web/AlipayConfigController.java new file mode 100644 index 000000000..88e78fa6f --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/web/AlipayConfigController.java @@ -0,0 +1,31 @@ +package au.com.royalpay.payment.manage.merchants.web; + + +import au.com.royalpay.payment.manage.merchants.core.impls.AlipayChannelsConfig; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * @Description + * @title: + * @Date 2021/2/1 9:42 + * @author: zhangTao + */ +@RestController +@RequestMapping("/sys/partners") +public class AlipayConfigController { + + @Resource + AlipayChannelsConfig alipayChannelsConfig; + + @RequestMapping(method = RequestMethod.PUT,value = "/modifyAlipayPaymentChannels/{clientId}/{alipayPaymentChannelsStatus}") + public void modifyAlipayPaymentChannels(@PathVariable Integer clientId, @PathVariable Boolean alipayPaymentChannelsStatus) { + alipayChannelsConfig.modifyAlipayPaymentChannels(clientId,alipayPaymentChannelsStatus); + } + + +} From 08222f3d561069429e0de6a56d19f4a810443b7e Mon Sep 17 00:00:00 2001 From: yixian Date: Thu, 18 Mar 2021 18:16:30 +0800 Subject: [PATCH 3/6] nginx config update --- .../manage/merchants/core/impls/ClientManagerImpl.java | 5 ----- uidocker/conf.d/default.conf | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 325fcfd50..79c6a499e 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -2,7 +2,6 @@ package au.com.royalpay.payment.manage.merchants.core.impls; import au.com.royalpay.payment.channels.alipay.config.AlipayConfig; import au.com.royalpay.payment.channels.alipay.config.AlipayEnvironment; -import au.com.royalpay.payment.channels.alipay.runtime.AlipayCommonApi; import au.com.royalpay.payment.channels.alipay.runtime.AlipayOnlineApi; import au.com.royalpay.payment.channels.alipay.runtime.AlipayRetailApi; import au.com.royalpay.payment.channels.alipay.runtime.entity.AlipayMerchantEntity; @@ -21,12 +20,10 @@ import au.com.royalpay.payment.channels.wechat.runtime.impls.WxPayMerchantRegist import au.com.royalpay.payment.channels.wechat.runtime.impls.WxPayMerchantRegisterLegacy; import au.com.royalpay.payment.channels.wechat.runtime.mappers.PaymentChannelMccGoodMapper; import au.com.royalpay.payment.channels.wechat.runtime.mappers.WxMerchantApplyMapper; -import au.com.royalpay.payment.core.ChannelMerchantApplicationService; import au.com.royalpay.payment.core.PaymentApi; import au.com.royalpay.payment.core.PaymentChannelApi; import au.com.royalpay.payment.core.beans.ChannelMerchantInfo; import au.com.royalpay.payment.core.beans.EmptyMerchantApplication; -import au.com.royalpay.payment.core.beans.MchChannelContract; import au.com.royalpay.payment.core.beans.MerchantApplicationResult; import au.com.royalpay.payment.core.exceptions.EmailException; import au.com.royalpay.payment.core.exceptions.InvalidShortIdException; @@ -127,8 +124,6 @@ import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; -import org.dom4j.DocumentException; -import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; diff --git a/uidocker/conf.d/default.conf b/uidocker/conf.d/default.conf index 9bbf8bfde..ea284d694 100644 --- a/uidocker/conf.d/default.conf +++ b/uidocker/conf.d/default.conf @@ -68,7 +68,7 @@ server { } - location ~ ^/api/v1.0/((alipay_connect)|(customs)|(alipay)|(rpay)|(yeepay)|(card_payment_view)|(lakala_pay)|(cb_bankpay)|(bestpay)|(hf)|(wechat_jsapi_gateway)|(h5_payment)|(gateway)|(hf_gateway)|(jd_gateway)|(micropay)|(retail_qrcode)|(jsapi_gateway)|(share_code)|(payment))/ { + location ~ ^/api/v1.0/((alipay\w*)|(customs)|(rpay)|(yeepay)|(card_payment_view)|(lakala_pay)|(cb_bankpay)|(bestpay)|(hf)|(\w*gateway)|(micropay)|(retail_qrcode)|(share_code)|(payment))/ { proxy_pass http://rppaycenter; proxy_http_version 1.1; From f315edac4fa01b0961525dff86500539580d32bc Mon Sep 17 00:00:00 2001 From: yixian Date: Thu, 18 Mar 2021 18:42:43 +0800 Subject: [PATCH 4/6] fix stackoverflow --- .../manage/merchants/core/impls/ClientManagerImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 7b0de4e2b..3ad05d758 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -5759,10 +5759,10 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid WechatMerchantInfo info = Optional.ofNullable(merchantChannelApplicationManager.getRegister(WxPayMerchantRegister.class)) .map(register -> register.findMerchant(client)) .orElseThrow(() -> new ServerErrorException("No Register found for wechat")); - Element xml = info.getRawResponseXml(); + Element elem = info.getRawResponseXml(); JSONObject object = new JSONObject(); - object.put("response_str", xml); - object.put("apply_status", info.getRawResponse()); + object.put("response_str", info.getRawResponse()); + object.put("apply_status", elem.elementText("result_code")); return object; } From b0d12dfdb34cd9c70835aa66702f218c7689bb45 Mon Sep 17 00:00:00 2001 From: yixian Date: Fri, 19 Mar 2021 18:00:44 +0800 Subject: [PATCH 5/6] add h5_payment api --- uidocker/conf.d/default.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uidocker/conf.d/default.conf b/uidocker/conf.d/default.conf index ea284d694..d2567b576 100644 --- a/uidocker/conf.d/default.conf +++ b/uidocker/conf.d/default.conf @@ -68,7 +68,7 @@ server { } - location ~ ^/api/v1.0/((alipay\w*)|(customs)|(rpay)|(yeepay)|(card_payment_view)|(lakala_pay)|(cb_bankpay)|(bestpay)|(hf)|(\w*gateway)|(micropay)|(retail_qrcode)|(share_code)|(payment))/ { + location ~ ^/api/v1.0/((alipay\w*)|(customs)|(rpay)|(yeepay)|(card_payment_view)|(lakala_pay)|(cb_bankpay)|(bestpay)|(hf)|(\w*gateway)|(micropay)|(retail_qrcode)|(share_code)|(payment)|(h5_payment)/ { proxy_pass http://rppaycenter; proxy_http_version 1.1; From 0eb612d53f710fea835d7a00369708582b5ef0e4 Mon Sep 17 00:00:00 2001 From: yixian Date: Fri, 19 Mar 2021 18:02:56 +0800 Subject: [PATCH 6/6] add h5_payment api --- uidocker/conf.d/default.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uidocker/conf.d/default.conf b/uidocker/conf.d/default.conf index d2567b576..e3deafc4f 100644 --- a/uidocker/conf.d/default.conf +++ b/uidocker/conf.d/default.conf @@ -68,7 +68,7 @@ server { } - location ~ ^/api/v1.0/((alipay\w*)|(customs)|(rpay)|(yeepay)|(card_payment_view)|(lakala_pay)|(cb_bankpay)|(bestpay)|(hf)|(\w*gateway)|(micropay)|(retail_qrcode)|(share_code)|(payment)|(h5_payment)/ { + location ~ ^/api/v1.0/((alipay\w*)|(customs)|(rpay)|(yeepay)|(card_payment_view)|(lakala_pay)|(cb_bankpay)|(bestpay)|(hf)|(\w*gateway)|(micropay)|(retail_qrcode)|(share_code)|(payment)|(h5_payment))/ { proxy_pass http://rppaycenter; proxy_http_version 1.1;