PNG  IHDRQgAMA a cHRMz&u0`:pQ<bKGDgmIDATxwUﹻ& ^CX(J I@ "% (** BX +*i"]j(IH{~R)[~>h{}gy)I$Ij .I$I$ʊy@}x.: $I$Ii}VZPC)I$IF ^0ʐJ$I$Q^}{"r=OzI$gRZeC.IOvH eKX $IMpxsk.쒷/&r[޳<v| .I~)@$updYRa$I |M.e JaֶpSYR6j>h%IRز if&uJ)M$I vLi=H;7UJ,],X$I1AҒJ$ XY XzI@GNҥRT)E@;]K*Mw;#5_wOn~\ DC&$(A5 RRFkvIR}l!RytRl;~^ǷJj اy뷦BZJr&ӥ8Pjw~vnv X^(I;4R=P[3]J,]ȏ~:3?[ a&e)`e*P[4]T=Cq6R[ ~ޤrXR Հg(t_HZ-Hg M$ãmL5R uk*`%C-E6/%[t X.{8P9Z.vkXŐKjgKZHg(aK9ڦmKjѺm_ \#$5,)-  61eJ,5m| r'= &ڡd%-]J on Xm|{ RҞe $eڧY XYrԮ-a7RK6h>n$5AVڴi*ֆK)mѦtmr1p| q:흺,)Oi*ֺK)ܬ֦K-5r3>0ԔHjJئEZj,%re~/z%jVMڸmrt)3]J,T K֦OvԒgii*bKiNO~%PW0=dii2tJ9Jݕ{7"I P9JKTbu,%r"6RKU}Ij2HKZXJ,妝 XYrP ެ24c%i^IK|.H,%rb:XRl1X4Pe/`x&P8Pj28Mzsx2r\zRPz4J}yP[g=L) .Q[6RjWgp FIH*-`IMRaK9TXcq*I y[jE>cw%gLRԕiFCj-ďa`#e~I j,%r,)?[gp FI˨mnWX#>mʔ XA DZf9,nKҲzIZXJ,L#kiPz4JZF,I,`61%2s $,VOϚ2/UFJfy7K> X+6 STXIeJILzMfKm LRaK9%|4p9LwJI!`NsiazĔ)%- XMq>pk$-$Q2x#N ؎-QR}ᶦHZډ)J,l#i@yn3LN`;nڔ XuX5pF)m|^0(>BHF9(cզEerJI rg7 4I@z0\JIi䵙RR0s;$s6eJ,`n 䂦0a)S)A 1eJ,堌#635RIgpNHuTH_SԕqVe ` &S)>p;S$魁eKIuX`I4춒o}`m$1":PI<[v9^\pTJjriRŭ P{#{R2,`)e-`mgj~1ϣLKam7&U\j/3mJ,`F;M'䱀 .KR#)yhTq;pcK9(q!w?uRR,n.yw*UXj#\]ɱ(qv2=RqfB#iJmmL<]Y͙#$5 uTU7ӦXR+q,`I}qL'`6Kͷ6r,]0S$- [RKR3oiRE|nӦXR.(i:LDLTJjY%o:)6rxzҒqTJjh㞦I.$YR.ʼnGZ\ֿf:%55 I˼!6dKxm4E"mG_ s? .e*?LRfK9%q#uh$)i3ULRfK9yxm܌bj84$i1U^@Wbm4uJ,ҪA>_Ij?1v32[gLRD96oTaR׿N7%L2 NT,`)7&ƝL*꽙yp_$M2#AS,`)7$rkTA29_Iye"|/0t)$n XT2`YJ;6Jx".e<`$) PI$5V4]29SRI>~=@j]lp2`K9Jaai^" Ԋ29ORI%:XV5]JmN9]H;1UC39NI%Xe78t)a;Oi Ҙ>Xt"~G>_mn:%|~ޅ_+]$o)@ǀ{hgN;IK6G&rp)T2i୦KJuv*T=TOSV>(~D>dm,I*Ɛ:R#ۙNI%D>G.n$o;+#RR!.eU˽TRI28t)1LWϚ>IJa3oFbu&:tJ*(F7y0ZR ^p'Ii L24x| XRI%ۄ>S1]Jy[zL$adB7.eh4%%누>WETf+3IR:I3Xה)3אOۦSRO'ٺ)S}"qOr[B7ϙ.edG)^ETR"RtRݜh0}LFVӦDB^k_JDj\=LS(Iv─aTeZ%eUAM-0;~˃@i|l @S4y72>sX-vA}ϛBI!ݎߨWl*)3{'Y|iSlEڻ(5KtSI$Uv02,~ԩ~x;P4ցCrO%tyn425:KMlD ^4JRxSهF_}شJTS6uj+ﷸk$eZO%G*^V2u3EMj3k%)okI]dT)URKDS 7~m@TJR~荪fT"֛L \sM -0T KfJz+nإKr L&j()[E&I ߴ>e FW_kJR|!O:5/2跌3T-'|zX ryp0JS ~^F>-2< `*%ZFP)bSn"L :)+pʷf(pO3TMW$~>@~ū:TAIsV1}S2<%ޟM?@iT ,Eūoz%i~g|`wS(]oȤ8)$ ntu`өe`6yPl IzMI{ʣzʨ )IZ2= ld:5+請M$-ї;U>_gsY$ÁN5WzWfIZ)-yuXIfp~S*IZdt;t>KūKR|$#LcԀ+2\;kJ`]YǔM1B)UbG"IRߊ<xܾӔJ0Z='Y嵤 Leveg)$znV-º^3Ւof#0Tfk^Zs[*I꯳3{)ˬW4Ւ4 OdpbZRS|*I 55#"&-IvT&/윚Ye:i$ 9{LkuRe[I~_\ؠ%>GL$iY8 9ܕ"S`kS.IlC;Ҏ4x&>u_0JLr<J2(^$5L s=MgV ~,Iju> 7r2)^=G$1:3G< `J3~&IR% 6Tx/rIj3O< ʔ&#f_yXJiގNSz; Tx(i8%#4 ~AS+IjerIUrIj362v885+IjAhK__5X%nV%Iͳ-y|7XV2v4fzo_68"S/I-qbf; LkF)KSM$ Ms>K WNV}^`-큧32ŒVؙGdu,^^m%6~Nn&͓3ŒVZMsRpfEW%IwdǀLm[7W&bIRL@Q|)* i ImsIMmKmyV`i$G+R 0tV'!V)֏28vU7͒vHꦼtxꗞT ;S}7Mf+fIRHNZUkUx5SAJㄌ9MqμAIRi|j5)o*^'<$TwI1hEU^c_j?Е$%d`z cyf,XO IJnTgA UXRD }{H}^S,P5V2\Xx`pZ|Yk:$e ~ @nWL.j+ϝYb퇪bZ BVu)u/IJ_ 1[p.p60bC >|X91P:N\!5qUB}5a5ja `ubcVxYt1N0Zzl4]7­gKj]?4ϻ *[bg$)+À*x쳀ogO$~,5 زUS9 lq3+5mgw@np1sso Ӻ=|N6 /g(Wv7U;zωM=wk,0uTg_`_P`uz?2yI!b`kĸSo+Qx%!\οe|އԁKS-s6pu_(ֿ$i++T8=eY; צP+phxWQv*|p1. ά. XRkIQYP,drZ | B%wP|S5`~́@i޾ E;Չaw{o'Q?%iL{u D?N1BD!owPHReFZ* k_-~{E9b-~P`fE{AܶBJAFO wx6Rox5 K5=WwehS8 (JClJ~ p+Fi;ŗo+:bD#g(C"wA^ r.F8L;dzdIHUX݆ϞXg )IFqem%I4dj&ppT{'{HOx( Rk6^C٫O.)3:s(۳(Z?~ٻ89zmT"PLtw䥈5&b<8GZ-Y&K?e8,`I6e(֍xb83 `rzXj)F=l($Ij 2*(F?h(/9ik:I`m#p3MgLaKjc/U#n5S# m(^)=y=đx8ŬI[U]~SцA4p$-F i(R,7Cx;X=cI>{Km\ o(Tv2vx2qiiDJN,Ҏ!1f 5quBj1!8 rDFd(!WQl,gSkL1Bxg''՞^ǘ;pQ P(c_ IRujg(Wz bs#P­rz> k c&nB=q+ؔXn#r5)co*Ũ+G?7< |PQӣ'G`uOd>%Mctz# Ԫڞ&7CaQ~N'-P.W`Oedp03C!IZcIAMPUۀ5J<\u~+{9(FbbyAeBhOSܳ1 bÈT#ŠyDžs,`5}DC-`̞%r&ڙa87QWWp6e7 Rϫ/oY ꇅ Nܶըtc!LA T7V4Jsū I-0Pxz7QNF_iZgúWkG83 0eWr9 X]㾮݁#Jˢ C}0=3ݱtBi]_ &{{[/o[~ \q鯜00٩|cD3=4B_b RYb$óBRsf&lLX#M*C_L܄:gx)WΘsGSbuL rF$9';\4Ɍq'n[%p.Q`u hNb`eCQyQ|l_C>Lb꟟3hSb #xNxSs^ 88|Mz)}:](vbۢamŖ࿥ 0)Q7@0=?^k(*J}3ibkFn HjB׻NO z x}7p 0tfDX.lwgȔhԾŲ }6g E |LkLZteu+=q\Iv0쮑)QٵpH8/2?Σo>Jvppho~f>%bMM}\//":PTc(v9v!gոQ )UfVG+! 35{=x\2+ki,y$~A1iC6#)vC5^>+gǵ@1Hy٪7u;p psϰu/S <aʸGu'tD1ԝI<pg|6j'p:tպhX{o(7v],*}6a_ wXRk,O]Lܳ~Vo45rp"N5k;m{rZbΦ${#)`(Ŵg,;j%6j.pyYT?}-kBDc3qA`NWQū20/^AZW%NQ MI.X#P#,^Ebc&?XR tAV|Y.1!؅⨉ccww>ivl(JT~ u`ٵDm q)+Ri x/x8cyFO!/*!/&,7<.N,YDŽ&ܑQF1Bz)FPʛ?5d 6`kQձ λc؎%582Y&nD_$Je4>a?! ͨ|ȎWZSsv8 j(I&yj Jb5m?HWp=g}G3#|I,5v珿] H~R3@B[☉9Ox~oMy=J;xUVoj bUsl_35t-(ՃɼRB7U!qc+x4H_Qo֮$[GO<4`&č\GOc[.[*Af%mG/ ňM/r W/Nw~B1U3J?P&Y )`ѓZ1p]^l“W#)lWZilUQu`-m|xĐ,_ƪ|9i:_{*(3Gѧ}UoD+>m_?VPۅ15&}2|/pIOʵ> GZ9cmíتmnz)yߐbD >e}:) r|@R5qVSA10C%E_'^8cR7O;6[eKePGϦX7jb}OTGO^jn*媓7nGMC t,k31Rb (vyܴʭ!iTh8~ZYZp(qsRL ?b}cŨʊGO^!rPJO15MJ[c&~Z`"ѓޔH1C&^|Ш|rʼ,AwĴ?b5)tLU)F| &g٣O]oqSUjy(x<Ϳ3 .FSkoYg2 \_#wj{u'rQ>o;%n|F*O_L"e9umDds?.fuuQbIWz |4\0 sb;OvxOSs; G%T4gFRurj(֍ڑb uԖKDu1MK{1^ q; C=6\8FR艇!%\YÔU| 88m)֓NcLve C6z;o&X x59:q61Z(T7>C?gcļxѐ Z oo-08jہ x,`' ҔOcRlf~`jj".Nv+sM_]Zk g( UOPyεx%pUh2(@il0ݽQXxppx-NS( WO+轾 nFߢ3M<;z)FBZjciu/QoF 7R¥ ZFLF~#ȣߨ^<쩡ݛкvџ))ME>ώx4m#!-m!L;vv#~Y[đKmx9.[,UFS CVkZ +ߟrY٧IZd/ioi$%͝ب_ֶX3ܫhNU ZZgk=]=bbJS[wjU()*I =ώ:}-蹞lUj:1}MWm=̛ _ ¾,8{__m{_PVK^n3esw5ӫh#$-q=A̟> ,^I}P^J$qY~Q[ Xq9{#&T.^GVj__RKpn,b=`żY@^՝;z{paVKkQXj/)y TIc&F;FBG7wg ZZDG!x r_tƢ!}i/V=M/#nB8 XxЫ ^@CR<{䤭YCN)eKOSƟa $&g[i3.C6xrOc8TI;o hH6P&L{@q6[ Gzp^71j(l`J}]e6X☉#͕ ׈$AB1Vjh㭦IRsqFBjwQ_7Xk>y"N=MB0 ,C #o6MRc0|$)ف"1!ixY<B9mx `,tA>)5ػQ?jQ?cn>YZe Tisvh# GMމȇp:ԴVuږ8ɼH]C.5C!UV;F`mbBk LTMvPʍϤj?ԯ/Qr1NB`9s"s TYsz &9S%U԰> {<ؿSMxB|H\3@!U| k']$U+> |HHMLޢ?V9iD!-@x TIî%6Z*9X@HMW#?nN ,oe6?tQwڱ.]-y':mW0#!J82qFjH -`ѓ&M0u Uγmxϵ^-_\])@0Rt.8/?ٰCY]x}=sD3ojަЫNuS%U}ԤwHH>ڗjܷ_3gN q7[q2la*ArǓԖ+p8/RGM ]jacd(JhWko6ڎbj]i5Bj3+3!\j1UZLsLTv8HHmup<>gKMJj0@H%,W΃7R) ">c, xixј^ aܖ>H[i.UIHc U1=yW\=S*GR~)AF=`&2h`DzT󑓶J+?W+}C%P:|0H܆}-<;OC[~o.$~i}~HQ TvXΈr=b}$vizL4:ȰT|4~*!oXQR6Lk+#t/g lԁߖ[Jڶ_N$k*". xsxX7jRVbAAʯKҎU3)zSNN _'s?f)6X!%ssAkʱ>qƷb hg %n ~p1REGMHH=BJiy[<5 ǁJҖgKR*倳e~HUy)Ag,K)`Vw6bRR:qL#\rclK/$sh*$ 6덤 KԖc 3Z9=Ɣ=o>X Ώ"1 )a`SJJ6k(<c e{%kϊP+SL'TcMJWRm ŏ"w)qc ef꒵i?b7b('"2r%~HUS1\<(`1Wx9=8HY9m:X18bgD1u ~|H;K-Uep,, C1 RV.MR5άh,tWO8WC$ XRVsQS]3GJ|12 [vM :k#~tH30Rf-HYݺ-`I9%lIDTm\ S{]9gOڒMNCV\G*2JRŨ;Rҏ^ڽ̱mq1Eu?To3I)y^#jJw^Ńj^vvlB_⋌P4x>0$c>K†Aļ9s_VjTt0l#m>E-,,x,-W)سo&96RE XR.6bXw+)GAEvL)͞K4$p=Ũi_ѱOjb HY/+@θH9޼]Nԥ%n{ &zjT? Ty) s^ULlb,PiTf^<À] 62R^V7)S!nllS6~͝V}-=%* ʻ>G DnK<y&>LPy7'r=Hj 9V`[c"*^8HpcO8bnU`4JȪAƋ#1_\ XϘHPRgik(~G~0DAA_2p|J묭a2\NCr]M_0 ^T%e#vD^%xy-n}-E\3aS%yN!r_{ )sAw ڼp1pEAk~v<:`'ӭ^5 ArXOI驻T (dk)_\ PuA*BY]yB"l\ey hH*tbK)3 IKZ򹞋XjN n *n>k]X_d!ryBH ]*R 0(#'7 %es9??ښFC,ՁQPjARJ\Ρw K#jahgw;2$l*) %Xq5!U᢯6Re] |0[__64ch&_}iL8KEgҎ7 M/\`|.p,~`a=BR?xܐrQ8K XR2M8f ?`sgWS%" Ԉ 7R%$ N}?QL1|-эټwIZ%pvL3Hk>,ImgW7{E xPHx73RA @RS CC !\ȟ5IXR^ZxHл$Q[ŝ40 (>+ _C >BRt<,TrT {O/H+˟Pl6 I B)/VC<6a2~(XwV4gnXR ϱ5ǀHٻ?tw똤Eyxp{#WK qG%5],(0ӈH HZ])ג=K1j&G(FbM@)%I` XRg ʔ KZG(vP,<`[ Kn^ SJRsAʠ5xՅF`0&RbV tx:EaUE/{fi2;.IAwW8/tTxAGOoN?G}l L(n`Zv?pB8K_gI+ܗ #i?ޙ.) p$utc ~DžfՈEo3l/)I-U?aԅ^jxArA ΧX}DmZ@QLےbTXGd.^|xKHR{|ΕW_h] IJ`[G9{).y) 0X YA1]qp?p_k+J*Y@HI>^?gt.06Rn ,` ?);p pSF9ZXLBJPWjgQ|&)7! HjQt<| ؅W5 x W HIzYoVMGP Hjn`+\(dNW)F+IrS[|/a`K|ͻ0Hj{R,Q=\ (F}\WR)AgSG`IsnAR=|8$}G(vC$)s FBJ?]_u XRvύ6z ŨG[36-T9HzpW̞ú Xg큽=7CufzI$)ki^qk-) 0H*N` QZkk]/tnnsI^Gu't=7$ Z;{8^jB% IItRQS7[ϭ3 $_OQJ`7!]W"W,)Iy W AJA;KWG`IY{8k$I$^%9.^(`N|LJ%@$I}ֽp=FB*xN=gI?Q{٥4B)mw $Igc~dZ@G9K X?7)aK%݅K$IZ-`IpC U6$I\0>!9k} Xa IIS0H$I H ?1R.Чj:4~Rw@p$IrA*u}WjWFPJ$I➓/6#! LӾ+ X36x8J |+L;v$Io4301R20M I$-E}@,pS^ޟR[/s¹'0H$IKyfŸfVOπFT*a$I>He~VY/3R/)>d$I>28`Cjw,n@FU*9ttf$I~<;=/4RD~@ X-ѕzἱI$: ԍR a@b X{+Qxuq$IЛzo /~3\8ڒ4BN7$IҀj V]n18H$IYFBj3̵̚ja pp $Is/3R Ӻ-Yj+L;.0ŔI$Av? #!5"aʄj}UKmɽH$IjCYs?h$IDl843.v}m7UiI=&=0Lg0$I4: embe` eQbm0u? $IT!Sƍ'-sv)s#C0:XB2a w I$zbww{."pPzO =Ɔ\[ o($Iaw]`E).Kvi:L*#gР7[$IyGPI=@R 4yR~̮´cg I$I/<tPͽ hDgo 94Z^k盇΄8I56^W$I^0̜N?4*H`237}g+hxoq)SJ@p|` $I%>-hO0eO>\ԣNߌZD6R=K ~n($I$y3D>o4b#px2$yڪtzW~a $I~?x'BwwpH$IZݑnC㧄Pc_9sO gwJ=l1:mKB>Ab<4Lp$Ib o1ZQ@85b̍ S'F,Fe,^I$IjEdù{l4 8Ys_s Z8.x m"+{~?q,Z D!I$ϻ'|XhB)=…']M>5 rgotԎ 獽PH$IjIPhh)n#cÔqA'ug5qwU&rF|1E%I$%]!'3AFD/;Ck_`9 v!ٴtPV;x`'*bQa w I$Ix5 FC3D_~A_#O݆DvV?<qw+I$I{=Z8".#RIYyjǪ=fDl9%M,a8$I$Ywi[7ݍFe$s1ՋBVA?`]#!oz4zjLJo8$I$%@3jAa4(o ;p,,dya=F9ً[LSPH$IJYЉ+3> 5"39aZ<ñh!{TpBGkj}Sp $IlvF.F$I z< '\K*qq.f<2Y!S"-\I$IYwčjF$ w9 \ߪB.1v!Ʊ?+r:^!I$BϹB H"B;L'G[ 4U#5>੐)|#o0aڱ$I>}k&1`U#V?YsV x>{t1[I~D&(I$I/{H0fw"q"y%4 IXyE~M3 8XψL}qE$I[> nD?~sf ]o΁ cT6"?'_Ἣ $I>~.f|'!N?⟩0G KkXZE]ޡ;/&?k OۘH$IRۀwXӨ<7@PnS04aӶp.:@\IWQJ6sS%I$e5ڑv`3:x';wq_vpgHyXZ 3gЂ7{{EuԹn±}$I$8t;b|591nءQ"P6O5i }iR̈́%Q̄p!I䮢]O{H$IRϻ9s֧ a=`- aB\X0"+5"C1Hb?߮3x3&gşggl_hZ^,`5?ߎvĸ%̀M!OZC2#0x LJ0 Gw$I$I}<{Eb+y;iI,`ܚF:5ܛA8-O-|8K7s|#Z8a&><a&/VtbtLʌI$I$I$I$I$I$IRjDD%tEXtdate:create2022-05-31T04:40:26+00:00!Î%tEXtdate:modify2022-05-31T04:40:26+00:00|{2IENDB`Mini Shell

HOME


Mini Shell 1.0
DIR:/home/drishtigems.com/www/vendor/s-cart/core/src/Front/Controllers/
Upload File :
Current File : /home/drishtigems.com/www/vendor/s-cart/core/src/Front/Controllers/ShopCartController.php
<?php
namespace SCart\Core\Front\Controllers;

use SCart\Core\Front\Controllers\RootFrontController;
use SCart\Core\Front\Models\ShopEmailTemplate;
use SCart\Core\Front\Models\ShopAttributeGroup;
use SCart\Core\Front\Models\ShopCountry;
use SCart\Core\Front\Models\ShopState;    
use SCart\Core\Front\Models\ShopOrder;
use SCart\Core\Front\Models\ShopOrderTotal;
use SCart\Core\Front\Models\ShopProduct;
use SCart\Core\Front\Models\ShopCustomer;
use SCart\Core\Front\Models\ShopCustomerAddress;
use Cart;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

class ShopCartController extends RootFrontController
{
    const ORDER_STATUS_NEW = 1;
    const PAYMENT_UNPAID   = 1;
    const SHIPPING_NOTSEND = 1;

    public function __construct()
    {
        parent::__construct();	
    }

    /**
     * Process front get cart
     *
     * Step 01.1
     *
     * @param [type] ...$params
     * @return void
     */
    public function getCartFront(...$params)
    {
        if (config('app.seoLang')) {
            $lang = $params[0] ?? '';
            sc_lang_switch($lang);
        }
        return $this->_getCart();
    }

    /**
     * Get list cart: screen get cart
     * Step 01.2
     * @return [type] [description]
     */
    private function _getCart()
    {
		//Clear session
        //$this->clearSession();         
        $cart = Cart::content();   		
		$objects = ShopOrderTotal::getObjectOrderTotal();	
		
		session(['dataCheckout' => $cart]);     
		
		if(auth()->user())
		{
			$customer = auth()->user(); 		
			$customer_id = $customer->id;  	
		}
		else
		{
			$customer_id=0;  
		}

        sc_check_view($this->templatePath . '.screen.shop_cart');
        return view(
            $this->templatePath . '.screen.shop_cart',
            [
                'title'           => sc_language_render('cart.cart_title'),
                'description'     => '',
                'keyword'         => '',
                'cart'            => $cart,
                'attributesGroup' => ShopAttributeGroup::pluck('name', 'id')->all(),
                'layout_page'     => 'shop_cart',
				'customer_id'	  => $customer_id, 
				'dataTotal'       => ShopOrderTotal::processDataTotal($objects),    	
                'breadcrumbs'  => [
                    ['url' => '', 'title' => sc_language_render('cart.cart_title')],
                ],
            ]
        );	
		
    } 

    /**
     * Prepare data checkout
     * Submit page cart
     * Step 02
     */
    public function prepareCheckout()
    {
        $customer = auth()->user();

        //Not allow for guest
        if (!sc_config('shop_allow_guest') && !$customer) {
            return redirect(sc_route('login'));
        }

        $data = request()->all();

        $storeId = $data['store_id'] ?? 0;

        //If not exist store Id
        if (!$storeId) {
            return redirect(sc_route('cart'))->with(['error' => sc_language_render('cart.cart_store_id_notfound')]);
        }

        $cartGroup = Cart::getItemsGroupByStore();

        //Check cart store empty
        if (empty($cartGroup[$storeId])) {
            return redirect(sc_route('cart'))->with(['error' => sc_language_render('cart.cart_store_empty')]);
        }

        //Check minimum
        $arrCheckQty = [];
        $cart = $cartGroup[$storeId];
        foreach ($cart as $key => $row) {
            $arrCheckQty[$row->id] = ($arrCheckQty[$row->id] ?? 0) + $row->qty;
        }
        $arrProductMinimum = ShopProduct::whereIn('id', array_keys($arrCheckQty))->pluck('minimum', 'id')->all();
        $arrErrorQty = [];
        foreach ($arrProductMinimum as $pId => $min) {
            if ($arrCheckQty[$pId] < $min) {
                $arrErrorQty[$pId] = $min;
            }
        }
        if (count($arrErrorQty)) {
            return redirect(sc_route('cart'))->with(['arrErrorQty' => $arrErrorQty, 'error'=> sc_language_render('cart.have_error')]);
        }

        //Set session
        session(['dataCheckout' => $cart]);
        session(['storeCheckout' => $storeId]);

        //End check minimum
        return redirect(sc_route('checkout'));
    }


    /**
     * Process front checkout screen
     *
     * Step 03.1
     *
     * @param [type] ...$params
     * @return void
     */
    public function getCheckoutFront(...$params)
    {
        if (config('app.seoLang')) {
            $lang = $params[0] ?? '';
            sc_lang_switch($lang);
        }
        return $this->_getCheckout();
    }


    /**
     * Screen checkout
     *
     * Step 03.2
     *
     * @return [type] [description]
     */
    private function _getCheckout()
    {
        $dataCheckout = session('dataCheckout') ?? '';  
        $storeCheckout = session('storeCheckout') ?? '';
		
		$cart_count=Cart::instance('default')->count();   
		
        //If cart info empty
        if ((!$dataCheckout || !$storeCheckout) && !$cart_count) 
		{			
            return redirect(sc_route('cart'))->with(['error' => sc_language_render('cart.cart_empty')]);
        }

        //Shipping
        $moduleShipping = sc_get_plugin_installed('shipping');
        $sourcesShipping = sc_get_all_plugin('shipping');
        $shippingMethod = array();
        foreach ($moduleShipping as $module) {
            if (array_key_exists($module['key'], $sourcesShipping)) {
                $moduleClass = sc_get_class_plugin_config('shipping', $module['key']);
                $shippingMethod[$module['key']] = (new $moduleClass)->getData();
            }
        }

        //Payment
        $modulePayment = sc_get_plugin_installed('payment');
        $sourcesPayment = sc_get_all_plugin('payment');
        $paymentMethod = array();
        foreach ($modulePayment as $module) {
            if (array_key_exists($module['key'], $sourcesPayment)) {
                $moduleClass = $sourcesPayment[$module['key']].'\AppConfig';
                $paymentMethod[$module['key']] = (new $moduleClass)->getData();
            }
        }

        //Total
        $moduleTotal = sc_get_plugin_installed('total');
        $sourcesTotal = sc_get_all_plugin('total');
        $totalMethod = array();
        foreach ($moduleTotal as $module) {
            if (array_key_exists($module['key'], $sourcesTotal)) {
                $moduleClass = $sourcesTotal[$module['key']].'\AppConfig';
                $totalMethod[$module['key']] = (new $moduleClass)->getData();
            }
        }

        // Shipping address
        $customer = auth()->user();
		if($customer->country !='')
		{
			$nation = ShopCountry::where('code',$customer->country)->first();
			$states_list = ShopState::where('country_id',$nation->id)->get();      
		}
		else
		{
			$states_list = array(); 
		}
		
        if ($customer) {
            $address = $customer->getAddressDefault();
            if ($address) {
                $addressDefault = [
                    'first_name'      => $address->first_name,
                    'last_name'       => $address->last_name,
                    'first_name_kana' => $address->first_name_kana,
                    'last_name_kana'  => $address->last_name_kana,
                    'email'           => $customer->email,
                    'address1'        => $address->address1,
                    'address2'        => $address->address2,
                    'address3'        => $address->address3,
                    'postcode'        => $address->postcode,
                    'company'         => $customer->company,
                    'country'         => $address->country,
					'state'           => $address->state,      
                    'phone'           => $address->phone,
                    'comment'         => '',
                ];
            } else {
                $addressDefault = [
                    'first_name'      => $customer->first_name,
                    'last_name'       => $customer->last_name,
                    'first_name_kana' => $customer->first_name_kana,
                    'last_name_kana'  => $customer->last_name_kana,
                    'email'           => $customer->email,
                    'address1'        => $customer->address1,
                    'address2'        => $customer->address2,
                    'address3'        => $customer->address3,
                    'postcode'        => $customer->postcode,
                    'company'         => $customer->company,
                    'country'         => $customer->country,
					'state'           => $customer->state,    
                    'phone'           => $customer->phone,
                    'comment'         => '',
                ];
            }
        } else {
            $addressDefault = [
                'first_name'      => '',
                'last_name'       => '',
                'first_name_kana' => '',
                'last_name_kana'  => '',
                'postcode'        => '',
                'company'         => '',
                'email'           => '',
                'address1'        => '',
                'address2'        => '',
                'address3'        => '',
                'country'         => '',
				'state'           => '',    
                'phone'           => '',
                'comment'         => '',
            ];
        }
        
		// $shippingAddress = session('shippingAddress') ?? $addressDefault;
		$shippingAddress = $addressDefault;   
        $objects = ShopOrderTotal::getObjectOrderTotal();

        //Process captcha
        $viewCaptcha = '';
        if (sc_captcha_method() && in_array('checkout', sc_captcha_page())) {
            if (view()->exists(sc_captcha_method()->pathPlugin.'::render')) {
                $dataView = [
                    'titleButton' => sc_language_render('cart.checkout'),
                    'idForm' => 'form-process',
                    'idButtonForm' => 'button-form-process',
                ];
                $viewCaptcha = view(sc_captcha_method()->pathPlugin.'::render', $dataView)->render();
            }
        }

        //Check view
        sc_check_view($this->templatePath . '.screen.shop_checkout');

        return view(
            $this->templatePath . '.screen.shop_checkout',
            [
                'title'           => sc_language_render('cart.checkout'),
                'description'     => '',
                'keyword'         => '',
                'cartItem'        => $dataCheckout,
                'storeCheckout'   => $storeCheckout,
                'shippingMethod'  => $shippingMethod,
                'paymentMethod'   => $paymentMethod,
                'totalMethod'     => $totalMethod,
                'addressList'     => $customer ? $customer->addresses : [],
                'dataTotal'       => ShopOrderTotal::processDataTotal($objects),
                'shippingAddress' => $shippingAddress,
                'countries'       => ShopCountry::getCodeAll(),
				'states'          => $states_list,       
                'attributesGroup' => ShopAttributeGroup::pluck('name', 'id')->all(),
                'viewCaptcha'     => $viewCaptcha,
                'layout_page'     => 'shop_checkout',
                'breadcrumbs'     => [
                    ['url'        => '', 'title' => sc_language_render('cart.checkout')],
                ],
            ]
        );
    }


    /**
     * Checkout process, from screen checkout to checkout confirm
     *
     * Step 04
     *
     */
    public function processCheckout()
    {
        $dataCheckout  = session('dataCheckout') ?? '';
        $storeCheckout = session('storeCheckout') ?? '';
        //If cart info empty
        if (!$dataCheckout || !$storeCheckout) {
            return redirect(sc_route('cart'))->with(['error' => sc_language_render('cart.cart_empty')]);
        }

        $customer = auth()->user();

        //Not allow for guest
        if (!sc_config('shop_allow_guest') && !$customer) {
            return redirect(sc_route('login'));
        }

        $data = request()->all();

        $validate = [
            'first_name'     => config('validation.customer.first_name', 'required|string|max:100'),
            'email'          => config('validation.customer.email', 'required|string|email|max:255'),
        ];
        //check shipping
        if (!sc_config('shipping_off')) {
            $validate['shippingMethod'] = 'required';
        }
        //check payment
        if (!sc_config('payment_off')) {
            $validate['paymentMethod'] = 'required';
        }

        if (sc_config('customer_lastname')) {
            if (sc_config('customer_lastname_required')) {
                $validate['last_name'] = config('validation.customer.last_name_required', 'required|string|max:100');
            } else {
                $validate['last_name'] = config('validation.customer.last_name_null', 'nullable|string|max:100');
            }
        }
        if (sc_config('customer_address1')) {
            if (sc_config('customer_address1_required')) {
                $validate['address1'] = config('validation.customer.address1_required', 'required|string|max:100');
            } else {
                $validate['address1'] = config('validation.customer.address1_null', 'nullable|string|max:100');
            }
        }

        if (sc_config('customer_address2')) {
            if (sc_config('customer_address2_required')) {
                $validate['address2'] = config('validation.customer.address2_required', 'required|string|max:100');
            } else {
                $validate['address2'] = config('validation.customer.address2_null', 'nullable|string|max:100');
            }
        }

        if (sc_config('customer_address3')) {
            if (sc_config('customer_address3_required')) {
                $validate['address3'] = config('validation.customer.address3_required', 'required|string|max:100');
            } else {
                $validate['address3'] = config('validation.customer.address3_null', 'nullable|string|max:100');
            }
        }

        if (sc_config('customer_phone')) {
            if (sc_config('customer_phone_required')) {
                $validate['phone'] = config('validation.customer.phone_required', 'required|regex:/^0[^0][0-9\-]{6,12}$/');
            } else {
                $validate['phone'] = config('validation.customer.phone_null', 'nullable|regex:/^0[^0][0-9\-]{6,12}$/');
            }
        }
        if (sc_config('customer_country')) {
            $arraycountry = (new ShopCountry)->pluck('code')->toArray();
            if (sc_config('customer_country_required')) {
                $validate['country'] = config('validation.customer.country_required', 'required|string|min:2').'|in:'. implode(',', $arraycountry);
            } else {
                $validate['country'] = config('validation.customer.country_null', 'nullable|string|min:2').'|in:'. implode(',', $arraycountry);
            }
        }

        if (sc_config('customer_postcode')) {
            if (sc_config('customer_postcode_required')) {
                $validate['postcode'] = config('validation.customer.postcode_required', 'required|min:5');
            } else {
                $validate['postcode'] = config('validation.customer.postcode_null', 'nullable|min:5');
            }
        }
        if (sc_config('customer_company')) {
            if (sc_config('customer_company_required')) {
                $validate['company'] = config('validation.customer.company_required', 'required|string|max:100');
            } else {
                $validate['company'] = config('validation.customer.company_null', 'nullable|string|max:100');
            }
        }

        if (sc_config('customer_name_kana')) {
            if (sc_config('customer_name_kana_required')) {
                $validate['first_name_kana'] = config('validation.customer.name_kana_required', 'required|string|max:100');
                $validate['last_name_kana'] = config('validation.customer.name_kana_required', 'required|string|max:100');
            } else {
                $validate['first_name_kana'] = config('validation.customer.name_kana_null', 'nullable|string|max:100');
                $validate['last_name_kana'] = config('validation.customer.name_kana_null', 'nullable|string|max:100');
            }
        }

        $messages = [
            'last_name.required'      => sc_language_render('validation.required', ['attribute'=> sc_language_render('cart.last_name')]),
            'first_name.required'     => sc_language_render('validation.required', ['attribute'=> sc_language_render('cart.first_name')]),
            'email.required'          => sc_language_render('validation.required', ['attribute'=> sc_language_render('cart.email')]),
            'address1.required'       => sc_language_render('validation.required', ['attribute'=> sc_language_render('cart.address1')]),
            'address2.required'       => sc_language_render('validation.required', ['attribute'=> sc_language_render('cart.address2')]),
            'address3.required'       => sc_language_render('validation.required', ['attribute'=> sc_language_render('cart.address3')]),
            'phone.required'          => sc_language_render('validation.required', ['attribute'=> sc_language_render('cart.phone')]),
            'country.required'        => sc_language_render('validation.required', ['attribute'=> sc_language_render('cart.country')]),
            'postcode.required'       => sc_language_render('validation.required', ['attribute'=> sc_language_render('cart.postcode')]),
            'company.required'        => sc_language_render('validation.required', ['attribute'=> sc_language_render('cart.company')]),
            'sex.required'            => sc_language_render('validation.required', ['attribute'=> sc_language_render('cart.sex')]),
            'birthday.required'       => sc_language_render('validation.required', ['attribute'=> sc_language_render('cart.birthday')]),
            'email.email'             => sc_language_render('validation.email', ['attribute'=> sc_language_render('cart.email')]),
            'phone.regex'             => sc_language_render('customer.phone_regex'),
            'postcode.min'            => sc_language_render('validation.min', ['attribute'=> sc_language_render('cart.postcode')]),
            'country.min'             => sc_language_render('validation.min', ['attribute'=> sc_language_render('cart.country')]),
            'first_name.max'          => sc_language_render('validation.max', ['attribute'=> sc_language_render('cart.first_name')]),
            'email.max'               => sc_language_render('validation.max', ['attribute'=> sc_language_render('cart.email')]),
            'address1.max'            => sc_language_render('validation.max', ['attribute'=> sc_language_render('cart.address1')]),
            'address2.max'            => sc_language_render('validation.max', ['attribute'=> sc_language_render('cart.address2')]),
            'address3.max'            => sc_language_render('validation.max', ['attribute'=> sc_language_render('cart.address3')]),
            'last_name.max'           => sc_language_render('validation.max', ['attribute'=> sc_language_render('cart.last_name')]),
            'birthday.date'           => sc_language_render('validation.date', ['attribute'=> sc_language_render('cart.birthday')]),
            'birthday.date_format'    => sc_language_render('validation.date_format', ['attribute'=> sc_language_render('cart.birthday')]),
            'shippingMethod.required' => sc_language_render('cart.validation.shippingMethod_required'),
            'paymentMethod.required'  => sc_language_render('cart.validation.paymentMethod_required'),
        ];

        if (sc_captcha_method() && in_array('checkout', sc_captcha_page())) {
            $data['captcha_field'] = $data[sc_captcha_method()->getField()] ?? '';
            $validate['captcha_field'] = ['required', 'string', new \SCart\Core\Rules\CaptchaRule];
        }


        $v = Validator::make(
            $data,
            $validate,
            $messages
        );
        if ($v->fails()) {
            return redirect()->back()
                ->withInput()
                ->withErrors($v->errors());
        }

        //Set session shippingMethod
        if (!sc_config('shipping_off')) {
            session(['shippingMethod' => request('shippingMethod')]);
        }

        //Set session paymentMethod
        if (!sc_config('payment_off')) {
            session(['paymentMethod' => request('paymentMethod')]);
        }

        //Set session address process
        session(['address_process' => request('address_process')]);
        
        //Set session shippingAddressshippingAddress
        if(STRTOUPPER(request('address_process'))!='NEW')     
		{
			$shipping_address=ShopCustomerAddress::find(request('address_process'));	
				session(
				[
					'shippingAddress' => [
						'first_name'      => $shipping_address->first_name,    
						'last_name'       => $shipping_address->last_name,    
						'first_name_kana' => $shipping_address->first_name_kana,    
						'last_name_kana'  => $shipping_address->last_name_kana,        
						'email'           => request('email'),
						'country'         => $shipping_address->country,    
						'address1'        => $shipping_address->address1,  
						'address2'        => $shipping_address->address2,  
						'address3'        => $shipping_address->address3,  
						'phone'           => $shipping_address->phone,    
						'postcode'        => $shipping_address->postcode,      
						'company'         => $shipping_address->company,        
						'comment'         => request('comment'),    
					],
				]
			);
		}
		else
		{
			session(
				[
					'shippingAddress' => [
						'first_name'      => request('first_name'),
						'last_name'       => request('last_name'),
						'first_name_kana' => request('first_name_kana'),    
						'last_name_kana'  => request('last_name_kana'),
						'email'           => request('email'),
						'country'         => request('country'),
						'address1'        => request('address1'),
						'address2'        => request('address2'),
						'address3'        => request('address3'),
						'phone'           => request('phone'),
						'postcode'        => request('postcode'),   
						'company'         => request('company'),
						'comment'         => request('comment'),
					],
				]
			);
		}       

        //Check minimum
        $arrCheckQty = [];
        $cart = $dataCheckout;
        foreach ($cart as $key => $row) {
            $arrCheckQty[$row->id] = ($arrCheckQty[$row->id] ?? 0) + $row->qty;
        }
        $arrProductMinimum = ShopProduct::whereIn('id', array_keys($arrCheckQty))->pluck('minimum', 'id')->all();
        $arrErrorQty = [];
        foreach ($arrProductMinimum as $pId => $min) {
            if ($arrCheckQty[$pId] < $min) {
                $arrErrorQty[$pId] = $min;
            }
        }
        if (count($arrErrorQty)) {
            return redirect(sc_route('cart'))->with('arrErrorQty', $arrErrorQty);
        }
        //End check minimum

        return redirect(sc_route('checkout.confirm'))->with('step', 'checkout.confirm');
    }



    /**
     * Process front checkout confirm screen
     *
     * Step 05.1
     *
     * @param [type] ...$params
     * @return void
     */
    public function getCheckoutConfirmFront(...$params)
    {
        if (config('app.seoLang')) {
            $lang = $params[0] ?? '';
            sc_lang_switch($lang);
        }
        return $this->_getCheckoutConfirm();
    }

    /**
     * Checkout screen
     *
     * Step 05.2
     *
     * @return [view]
     */
    private function _getCheckoutConfirm()
    {
        //Check shipping address
        if (
            !session('shippingAddress')
        ) {
            return redirect(sc_route('cart'));
        }
        $shippingAddress = session('shippingAddress');


        //Shipping method
        if (sc_config('shipping_off')) {
            $shippingMethodData = null;
        } else {
            if (!session('shippingMethod')) {
                return redirect(sc_route('cart'));
            }
            $shippingMethod = session('shippingMethod');
            $classShippingMethod = sc_get_class_plugin_config('Shipping', $shippingMethod);
            $shippingMethodData = (new $classShippingMethod)->getData();
        }

        //Payment method
        if (sc_config('payment_off')) {
            $paymentMethodData = null;
        } else {
            if (!session('paymentMethod')) {
                return redirect(sc_route('cart'));
            }
            $paymentMethod = session('paymentMethod');
            $classPaymentMethod = sc_get_class_plugin_config('Payment', $paymentMethod);
            $paymentMethodData = (new $classPaymentMethod)->getData();
        }

        //Check plugin invalid
        if (!sc_config(session('shippingMethod'))) {
            return redirect(sc_route('cart'))->with(['error' => 'Plugin shipping invalid!']);
        }
        if (!sc_config(session('paymentMethod'))) {
            return redirect(sc_route('cart'))->with(['error' => 'Plugin payment invalid!']);
        }
        //End check plugin invalid
        
        //Screen confirm only active if submit from screen checkout
        if (session('step', '') != 'checkout.confirm') {
            return redirect(sc_route('checkout'));
        }

        $objects = ShopOrderTotal::getObjectOrderTotal();
        $dataTotal = ShopOrderTotal::processDataTotal($objects);

        //Set session dataTotal
        session(['dataTotal' => $dataTotal]);

        sc_check_view($this->templatePath . '.screen.shop_checkout_confirm');
        return view(
            $this->templatePath . '.screen.shop_checkout_confirm',
            [
                'title'              => sc_language_render('checkout.page_title'),
                'cart'               => session('dataCheckout'),
                'dataTotal'          => $dataTotal,
                'paymentMethodData'  => $paymentMethodData,
                'shippingMethodData' => $shippingMethodData,
                'shippingAddress'    => $shippingAddress,
                'attributesGroup'    => ShopAttributeGroup::getListAll(),
                'layout_page'        => 'shop_checkout_confirm',
                'breadcrumbs'        => [
                    ['url'           => '', 'title' => sc_language_render('checkout.page_title')],
                ],
            ]
        );
    }

    /**
     * Create new order
     *
     * Step 06
     *
     * @return [redirect]
     */
    public function addOrder(Request $request)
    {
        $agent = new \Jenssegers\Agent\Agent();
        $customer = auth()->user();
        $uID = $customer->id ?? 0;

        //if cart empty
        if (count(session('dataCheckout', [])) == 0) {
            return redirect()->route('home');
        }
        //Not allow for guest
        if (!sc_config('shop_allow_guest') && !$customer) {
            return redirect(sc_route('login'));
        } //

        $data = request()->all();
        if (!$data) {
            return redirect(sc_route('cart'));
        } else {
            $dataTotal       = session('dataTotal') ?? [];
            $shippingAddress = session('shippingAddress') ?? [];
            $paymentMethod   = session('paymentMethod') ?? '';
            $shippingMethod  = session('shippingMethod') ?? '';
            $address_process = session('address_process') ?? '';
            $storeCheckout   = session('storeCheckout') ?? '';
            $dataCheckout    = session('dataCheckout') ?? '';
        }

        //Process total
        $subtotal = (new ShopOrderTotal)->sumValueTotal('subtotal', $dataTotal); //sum total
        $tax      = (new ShopOrderTotal)->sumValueTotal('tax', $dataTotal); //sum tax
        $shipping = (new ShopOrderTotal)->sumValueTotal('shipping', $dataTotal); //sum shipping
        $discount = (new ShopOrderTotal)->sumValueTotal('discount', $dataTotal); //sum discount
        $otherFee = (new ShopOrderTotal)->sumValueTotal('other_fee', $dataTotal); //sum other_fee
        $received = (new ShopOrderTotal)->sumValueTotal('received', $dataTotal); //sum received
        $total    = (new ShopOrderTotal)->sumValueTotal('total', $dataTotal);
        //end total

        $dataOrder['store_id']        = $storeCheckout;
        $dataOrder['customer_id']     = $uID;
        $dataOrder['subtotal']        = $subtotal;
        $dataOrder['shipping']        = $shipping;
        $dataOrder['discount']        = $discount;
        $dataOrder['other_fee']        = $otherFee;
        $dataOrder['received']        = $received;
        $dataOrder['tax']             = $tax;
        $dataOrder['payment_status']  = self::PAYMENT_UNPAID;
        $dataOrder['shipping_status'] = self::SHIPPING_NOTSEND;
        $dataOrder['status']          = self::ORDER_STATUS_NEW;
        $dataOrder['currency']        = sc_currency_code();
        $dataOrder['exchange_rate']   = sc_currency_rate();
        $dataOrder['total']           = $total;
        $dataOrder['balance']         = $total + $received;
        $dataOrder['email']           = $shippingAddress['email'];
        $dataOrder['first_name']      = $shippingAddress['first_name'];
        $dataOrder['payment_method']  = $paymentMethod;
        $dataOrder['shipping_method'] = $shippingMethod;
        $dataOrder['user_agent']      = $request->header('User-Agent');
        $dataOrder['device_type']      = $agent->deviceType();
        $dataOrder['ip']              = $request->ip();
        $dataOrder['created_at']      = sc_time_now();

        if (!empty($shippingAddress['last_name'])) {
            $dataOrder['last_name']       = $shippingAddress['last_name'];
        }
        if (!empty($shippingAddress['first_name_kana'])) {
            $dataOrder['first_name_kana']       = $shippingAddress['first_name_kana'];
        }
        if (!empty($shippingAddress['last_name_kana'])) {
            $dataOrder['last_name_kana']       = $shippingAddress['last_name_kana'];
        }
        if (!empty($shippingAddress['address1'])) {
            $dataOrder['address1']       = $shippingAddress['address1'];
        }
        if (!empty($shippingAddress['address2'])) {
            $dataOrder['address2']       = $shippingAddress['address2'];
        }
        if (!empty($shippingAddress['address3'])) {
            $dataOrder['address3']       = $shippingAddress['address3'];
        }
        if (!empty($shippingAddress['country'])) {
            $dataOrder['country']       = $shippingAddress['country'];
        }
        if (!empty($shippingAddress['phone'])) {
            $dataOrder['phone']       = $shippingAddress['phone'];
        }
        if (!empty($shippingAddress['postcode'])) {
            $dataOrder['postcode']       = $shippingAddress['postcode'];
        }
        if (!empty($shippingAddress['company'])) {
            $dataOrder['company']       = $shippingAddress['company'];
        }
        if (!empty($shippingAddress['comment'])) {
            $dataOrder['comment']       = $shippingAddress['comment'];
        }

        $arrCartDetail = [];
        foreach ($dataCheckout as $cartItem) {
            $arrDetail['product_id']  = $cartItem->id;
            $arrDetail['name']        = $cartItem->name;
            $arrDetail['price']       = sc_currency_value($cartItem->price);
            $arrDetail['qty']         = $cartItem->qty;
            $arrDetail['store_id']    = $cartItem->storeId;
            $arrDetail['attribute']   = ($cartItem->options) ? $cartItem->options->toArray() : null;
            $arrDetail['total_price'] = sc_currency_value($cartItem->price) * $cartItem->qty;
            $arrCartDetail[]          = $arrDetail;
        }

        //Set session info order
        session(['dataOrder' => $dataOrder]);
        session(['arrCartDetail' => $arrCartDetail]);		

        //Create new order
        $newOrder = (new ShopOrder)->createOrder($dataOrder, $dataTotal, $arrCartDetail);

        if ($newOrder['error'] == 1) {
            sc_report($newOrder['msg']);
            return redirect(sc_route('cart'))->with(['error' => $newOrder['msg']]);
        }
        //Set session orderID
        session(['orderID' => $newOrder['orderID']]);
		
		 

        //Create new address
        if ($address_process == 'new') {
            $addressNew = [
                'first_name'      => $shippingAddress['first_name'] ?? '',
                'last_name'       => $shippingAddress['last_name'] ?? '',
                'first_name_kana' => $shippingAddress['first_name_kana'] ?? '',
                'last_name_kana'  => $shippingAddress['last_name_kana'] ?? '',
                'postcode'        => $shippingAddress['postcode'] ?? '',
                'address1'        => $shippingAddress['address1'] ?? '',
                'address2'        => $shippingAddress['address2'] ?? '',
                'address3'        => $shippingAddress['address3'] ?? '',
                'country'         => $shippingAddress['country'] ?? '',
                'phone'           => $shippingAddress['phone'] ?? '',
            ];

            //Process escape
            $addressNew = sc_clean($addressNew);

            ShopCustomer::find($uID)->addresses()->save(new ShopCustomerAddress($addressNew));
            session()->forget('address_process'); //destroy address_process
        }

        $paymentMethod = sc_get_class_plugin_controller('Payment', session('paymentMethod'));
		
		

        if ($paymentMethod) {
            // Check payment method
            return (new $paymentMethod)->processOrder();
        } else {
            return (new ShopCartController)->completeOrder();
        }
    }

	public function addajaxOrder(Request $request)
    {
		if($request->ajax()) 
		{			
			$agent = new \Jenssegers\Agent\Agent();  
			$customer = auth()->user();
			$uID = $customer->id ?? 0;

			//if cart empty
			if (count(session('dataCheckout', [])) == 0) 
			{
				$response = array(  
					'code'=>202,  
					'text'=>'cart empty!!.'  	  	
				);
				
				goto AJAX_O;  
				
			}
			//Not allow for guest
			if (!sc_config('shop_allow_guest') && !$customer) 
			{
				$response = array(
					'code'=>202,
					'text'=>'Not allow for guest!!'    	  	
				);
				goto AJAX_O;   
			} //

			$data = request()->all();
			if (!$data) {
				$response = array(
					'code'=>202,
					'text'=>'Empty data!!'    	  	
				);
				goto AJAX_O;    
			} else {
				$dataTotal       = session('dataTotal') ?? [];
				$shippingAddress = session('shippingAddress') ?? [];
				$paymentMethod   = session('paymentMethod') ?? '';
				$shippingMethod  = session('shippingMethod') ?? '';
				$address_process = session('address_process') ?? '';
				$storeCheckout   = session('storeCheckout') ?? '';
				$dataCheckout    = session('dataCheckout') ?? '';
			}

			//Process total
			$subtotal = (new ShopOrderTotal)->sumValueTotal('subtotal', $dataTotal); //sum total
			$tax      = (new ShopOrderTotal)->sumValueTotal('tax', $dataTotal); //sum tax
			$shipping = (new ShopOrderTotal)->sumValueTotal('shipping', $dataTotal); //sum shipping
			$discount = (new ShopOrderTotal)->sumValueTotal('discount', $dataTotal); //sum discount
			$otherFee = (new ShopOrderTotal)->sumValueTotal('other_fee', $dataTotal); //sum other_fee
			$received = (new ShopOrderTotal)->sumValueTotal('received', $dataTotal); //sum received
			$total    = (new ShopOrderTotal)->sumValueTotal('total', $dataTotal);
			//end total

			$dataOrder['store_id']        = $storeCheckout;
			$dataOrder['customer_id']     = $uID;
			$dataOrder['subtotal']        = $subtotal;
			$dataOrder['shipping']        = $shipping;
			$dataOrder['discount']        = $discount;
			$dataOrder['other_fee']        = $otherFee;
			$dataOrder['received']        = $received;
			$dataOrder['tax']             = $tax;
			$dataOrder['payment_status']  = self::PAYMENT_UNPAID;
			$dataOrder['shipping_status'] = self::SHIPPING_NOTSEND;
			$dataOrder['status']          = self::ORDER_STATUS_NEW;
			$dataOrder['currency']        = sc_currency_code();
			$dataOrder['exchange_rate']   = sc_currency_rate();
			$dataOrder['total']           = $total;
			$dataOrder['balance']         = $total + $received;
			$dataOrder['email']           = $shippingAddress['email'];
			$dataOrder['first_name']      = $shippingAddress['first_name'];
			$dataOrder['payment_method']  = $paymentMethod;
			$dataOrder['shipping_method'] = $shippingMethod;
			$dataOrder['user_agent']      = $request->header('User-Agent');
			$dataOrder['device_type']      = $agent->deviceType();
			$dataOrder['ip']              = $request->ip();
			$dataOrder['created_at']      = sc_time_now();

			if (!empty($shippingAddress['last_name'])) {
				$dataOrder['last_name']       = $shippingAddress['last_name'];
			}
			if (!empty($shippingAddress['first_name_kana'])) {
				$dataOrder['first_name_kana']       = $shippingAddress['first_name_kana'];
			}
			if (!empty($shippingAddress['last_name_kana'])) {
				$dataOrder['last_name_kana']       = $shippingAddress['last_name_kana'];
			}
			if (!empty($shippingAddress['address1'])) {
				$dataOrder['address1']       = $shippingAddress['address1'];
			}
			if (!empty($shippingAddress['address2'])) {
				$dataOrder['address2']       = $shippingAddress['address2'];
			}
			if (!empty($shippingAddress['address3'])) {
				$dataOrder['address3']       = $shippingAddress['address3'];
			}
			if (!empty($shippingAddress['country'])) {
				$dataOrder['country']       = $shippingAddress['country'];
			}
			if (!empty($shippingAddress['phone'])) {
				$dataOrder['phone']       = $shippingAddress['phone'];
			}
			if (!empty($shippingAddress['postcode'])) {
				$dataOrder['postcode']       = $shippingAddress['postcode'];
			}
			if (!empty($shippingAddress['company'])) {
				$dataOrder['company']       = $shippingAddress['company'];
			}
			if (!empty($shippingAddress['comment'])) {
				$dataOrder['comment']       = $shippingAddress['comment'];
			}

			$arrCartDetail = [];
			foreach ($dataCheckout as $cartItem) {
				$arrDetail['product_id']  = $cartItem->id;
				$arrDetail['name']        = $cartItem->name;
				$arrDetail['price']       = sc_currency_value($cartItem->price);
				$arrDetail['qty']         = $cartItem->qty;
				$arrDetail['certification'] = $cartItem->certification;    
				$arrDetail['weight_scale']  = $cartItem->weight_scale;
				$arrDetail['weight_carat']  = $cartItem->weight_carat; 
				$arrDetail['buying_option']  = $cartItem->buying_option;      	
				$arrDetail['ornaments_option']  = $cartItem->ornaments_option;			
				$arrDetail['ornament_metal']  = $cartItem->ornament_metal;
				$arrDetail['design_option']  = $cartItem->design_option;   
				$arrDetail['ornament_size']  = $cartItem->ornament_size;      	
				$arrDetail['ornament_system']  = $cartItem->ornament_system;  	     			
				$arrDetail['store_id']    = $cartItem->storeId;  
				$arrDetail['attribute']   = ($cartItem->options) ? $cartItem->options->toArray() : null;
				$arrDetail['total_price'] = sc_currency_value($cartItem->price) * $cartItem->qty;
				$arrCartDetail[]          = $arrDetail;
			}

			//Set session info order
			session(['dataOrder' => $dataOrder]);
			session(['arrCartDetail' => $arrCartDetail]);

			//Create new order
			$newOrder = (new ShopOrder)->createOrder($dataOrder, $dataTotal, $arrCartDetail);

			if ($newOrder['error'] == 1) {
				sc_report($newOrder['msg']);  				
				$response = array(
					'code'=>202,
					'text'=>$newOrder['msg']   	  	
				);
				goto AJAX_O;  
				
			}
			//Set session orderID
			session(['orderID' => $newOrder['orderID']]);

			//Create new address
			if ($address_process == 'new') {
				$addressNew = [
					'first_name'      => $shippingAddress['first_name'] ?? '',
					'last_name'       => $shippingAddress['last_name'] ?? '',
					'first_name_kana' => $shippingAddress['first_name_kana'] ?? '',
					'last_name_kana'  => $shippingAddress['last_name_kana'] ?? '',
					'postcode'        => $shippingAddress['postcode'] ?? '',
					'address1'        => $shippingAddress['address1'] ?? '',
					'address2'        => $shippingAddress['address2'] ?? '',
					'address3'        => $shippingAddress['address3'] ?? '',
					'country'         => $shippingAddress['country'] ?? '',
					'phone'           => $shippingAddress['phone'] ?? '',
				];

				//Process escape
				$addressNew = sc_clean($addressNew);

				ShopCustomer::find($uID)->addresses()->save(new ShopCustomerAddress($addressNew));
				session()->forget('address_process'); //destroy address_process
			}

			$paymentMethod = sc_get_class_plugin_controller('Payment', session('paymentMethod'));   
			
			$this->clearCartStore();

			$orderID = session('orderID') ?? 0;
			$paymentMethod  = session('paymentMethod');
			$shippingMethod = session('shippingMethod');
			$totalMethod    = session('totalMethod', []);

			if ($orderID === 0) {
				// return redirect()->route('home', ['error' => 'Error Order ID!']);  
				$response = array(
					'code'=>202,
					'text'=>'Error Order ID!!'    	  	
				);
				goto AJAX_O;    
			}

			// Process event success
			sc_event_order_success($order = ShopOrder::find($orderID));

			$classPaymentConfig = sc_get_class_plugin_config('Payment', $paymentMethod);
			if (method_exists($classPaymentConfig, 'endApp')) {
				(new $classPaymentConfig)->endApp();
			}

			$classShippingConfig = sc_get_class_plugin_config('Shipping', $shippingMethod);
			if (method_exists($classShippingConfig, 'endApp')) {
				(new $classShippingConfig)->endApp();
			}

			if ($totalMethod && is_array($totalMethod)) {
				foreach ($totalMethod as $keyMethod => $valueMethod) {
					$classTotalConfig = sc_get_class_plugin_config('Total', $keyMethod);
					if (method_exists($classTotalConfig, 'endApp')) {
						(new $classTotalConfig)->endApp(['orderID' => $orderID, 'code' => $valueMethod]);
					}
				}
			}

			//Clear session
			$this->clearSession();

			if ((sc_config('order_success_to_admin') || sc_config('order_success_to_customer')) && sc_config('email_action_mode')) {
				$data = ShopOrder::with('details')->find($orderID)->toArray();
				$checkContent = (new ShopEmailTemplate)->where('group', 'order_success_to_admin')->where('status', 1)->first();
				$checkContentCustomer = (new ShopEmailTemplate)->where('group', 'order_success_to_customer')->where('status', 1)->first();
				if ($checkContent || $checkContentCustomer) {
					$orderDetail = '';
					$orderDetail .= '<tr>
										<td>' . sc_language_render('email.order.sort') . '</td>
										<td>' . sc_language_render('email.order.sku') . '</td>
										<td>' . sc_language_render('email.order.name') . '</td>
										<td>' . sc_language_render('email.order.price') . '</td>
										<td>' . sc_language_render('email.order.qty') . '</td>
										<td>' . sc_language_render('email.order.total') . '</td>
									</tr>';
					foreach ($data['details'] as $key => $detail) {
						$product = (new ShopProduct)->getDetail($detail['product_id']);
						$pathDownload = $product->downloadPath->path ?? '';
						$nameProduct = $detail['name'];
						if ($product && $pathDownload && $product->property == SC_PROPERTY_DOWNLOAD) {
							$nameProduct .="<br><a href='".sc_path_download_render($pathDownload)."'>Download</a>";
						}

						$orderDetail .= '<tr>
										<td>' . ($key + 1) . '</td>
										<td>' . $detail['sku'] . '</td>
										<td>' . $nameProduct . '</td>
										<td>' . sc_currency_render($detail['price'], '', '', '', false) . '</td>
										<td>' . number_format($detail['qty']) . '</td>
										<td align="right">' . sc_currency_render($detail['total_price'], '', '', '', false) . '</td>
									</tr>';
					}
					$dataFind = [
						'/\{\{\$title\}\}/',
						'/\{\{\$orderID\}\}/',
						'/\{\{\$firstName\}\}/',
						'/\{\{\$lastName\}\}/',
						'/\{\{\$toname\}\}/',
						'/\{\{\$address\}\}/',
						'/\{\{\$address1\}\}/',
						'/\{\{\$address2\}\}/',
						'/\{\{\$address3\}\}/',
						'/\{\{\$email\}\}/',
						'/\{\{\$phone\}\}/',
						'/\{\{\$comment\}\}/',
						'/\{\{\$orderDetail\}\}/',
						'/\{\{\$subtotal\}\}/',
						'/\{\{\$shipping\}\}/',
						'/\{\{\$discount\}\}/',
						'/\{\{\$otherFee\}\}/',
						'/\{\{\$total\}\}/',
					];
					$dataReplace = [
						sc_language_render('email.order.email_subject_customer') . '#' . $orderID,
						$orderID,
						$data['first_name'],
						$data['last_name'],
						$data['first_name'].' '.$data['last_name'],
						$data['address1'] . ' ' . $data['address2'].' '.$data['address3'],
						$data['address1'],
						$data['address2'],
						$data['address3'],
						$data['email'],
						$data['phone'],
						$data['comment'],
						$orderDetail,
						sc_currency_render($data['subtotal'], '', '', '', false),
						sc_currency_render($data['shipping'], '', '', '', false),
						sc_currency_render($data['discount'], '', '', '', false),
						sc_currency_render($data['other_fee'], '', '', '', false),
						sc_currency_render($data['total'], '', '', '', false),
					];

					// Send mail order success to admin
					if (sc_config('order_success_to_admin') && $checkContent) {
						$content = $checkContent->text;
						$content = preg_replace($dataFind, $dataReplace, $content);
						$dataView = [
							'content' => $content,
						];
						$config = [
							'to' => sc_store('email'),
							'subject' => sc_language_render('email.order.email_subject_to_admin', ['order_id' => $orderID]),
						];
						sc_send_mail($this->templatePath . '.mail.order_success_to_admin', $dataView, $config, []);
					}

					// Send mail order success to customer
					if (sc_config('order_success_to_customer') && $checkContentCustomer) {
						$contentCustomer = $checkContentCustomer->text;
						$contentCustomer = preg_replace($dataFind, $dataReplace, $contentCustomer);
						$dataView = [
							'content' => $contentCustomer,
						];
						$config = [
							'to' => $data['email'],
							'replyTo' => sc_store('email'),
							'subject' => sc_language_render('email.order.email_subject_customer', ['order_id' => $orderID]),
						];

						$attach = [];
						if (sc_config('order_success_to_customer_pdf')) {
							// Invoice pdf
							\PDF::loadView($this->templatePath . '.mail.order_success_to_customer_pdf', $dataView)
								->save(\Storage::disk('invoice')->path('order-'.$orderID.'.pdf'));
							$attach['attachFromStorage'] = [
								[
									'file_storage' => 'invoice',
									'file_path' => 'order-'.$orderID.'.pdf',
								]
							];
						}

						sc_send_mail($this->templatePath . '.mail.order_success_to_customer', $dataView, $config, $attach);
					}
				}
			}
			
			if($orderID)
			{
				$response = array( 
					'code'=>200,
					'text'=>'Order placed successfully.'  	  		  	
				);
			}
			else
			{
				$response = array( 
					'code'=>202, 
					'text'=>'Order could not be placed !!'  			  	
				);
			}
			
			AJAX_O:  
			
			return response()->json($response,200);       
			
		}  	
		
	}	

    /**
     * Add to cart by method post, always use in the product page detail
     *
     * @return [redirect]
     */
    public function addToCart()
    {
        $data      = request()->all();   
		
		$ornaments_option = (!empty(request()->ornaments_option))?request()->ornaments_option:'';  

		$metal_rule = $design_rule = $system_rule = $size_rule ="";  	
		
		if($ornaments_option !='')
		{
			$metal_rule='required|string';    
			$design_rule='required|string';  	
			$system_rule=($ornaments_option=='Ring')?'required':'';    
			$size_rule='required';   
		}
		
		
		$validate = [  
			// 'pincode' => 'min:6',  
			// 'weight_scale' => 'required|string',      
			// 'weight_carat' => 'required|string',
			'ornament_metal' =>$metal_rule,	
			'design_option' =>$design_rule,
			'ornament_system' =>$system_rule,	
			'ornament_size' =>$size_rule  	
		];  

		$messages = [
			'required' => 'The :attribute field is required.',  
			'required' => 'The :attribute field is required.',  
		];	
		
	    $v = Validator::make(
            $data,
            $validate,
            $messages  
        );
		
		if ($v->fails())   
		{
			return redirect()->back()
                ->withInput()
                ->withErrors($v->errors());      
		}  		
		
        //Process escape
        $data      = sc_clean($data);

        $productId = $data['product_id'];
        $qty       = $data['qty'] ?? 0;
        $storeId   = $data['storeId'] ?? config('app.storeId');
		
		$pincode = (!empty(request()->pincode))?request()->pincode:''; 
		$weight_scale = (!empty(request()->weight_scale))?request()->weight_scale:''; 
		$weight_carat = (!empty(request()->weight_carat))?request()->weight_carat:''; 
		$certification = (!empty(request()->certification))?request()->certification:'Drishti Gem Lab';   
		$buying_option = (!empty(request()->buying_option))?request()->buying_option:'';   
		
		$ornament_metal = (!empty(request()->ornament_metal))?request()->ornament_metal:''; 
		$design_option = (!empty(request()->design_option))?request()->design_option:'';  		  
		$ornament_size = (!empty(request()->ornament_size))?implode(',',request()->ornament_size):'';   
		$ornament_system = (!empty(request()->ornament_system))?implode(',',request()->ornament_system):'';  		   

        //Process attribute price
        $formAttr = $data['form_attr'] ?? [];
        $optionPrice  = 0;
        if ($formAttr) {
            foreach ($formAttr as $key => $attr) {
                $optionPrice += explode('__', $attr)[1] ??0;
            }
        }
        //End attribute price

        $product = (new ShopProduct)->getDetail($productId, null, $storeId);

        if (!$product) {
            return response()->json(
                [
                    'error' => 1,
                    'msg' => sc_language_render('front.data_notfound'),
                ]
            );
        }
        

        if ($product->allowSale()) {
            $options = $formAttr;
            $dataCart = array(
                'id'      => $productId,
                'name'    => $product->name,
                'qty'     => $qty,
                'price'   => $product->getFinalPrice() + $optionPrice,
                'tax'     => $product->getTaxValue(),
				'pincode'     => $pincode,    				 
				'weight_scale'     => $weight_scale,
				'weight_carat'     => $weight_carat,  
				'certification'     => ($certification=='')?'Drishti Gem Lab':$certification,	
				'buying_option'     => $buying_option,
				'ornaments_option'     => ($ornaments_option=='')?'Loose Gemstone':$ornaments_option,			
				'ornament_metal'     => $ornament_metal,
				'design_option'     => $design_option,  	
                'ornament_size' => $ornament_size,
				'ornament_system' => $ornament_system,   	    
                'storeId' => $storeId,
            );
            $dataCart['options'] = $options;     
			
            Cart::add($dataCart);
            return redirect(sc_route('cart'))
                ->with(
                    ['success' => sc_language_render('cart.add_to_cart_success', ['instance' => 'cart'])]
                );
        } else {
            return redirect(sc_route('cart'))
                ->with(
                    ['error' => sc_language_render('product.dont_allow_sale', ['sku' => $product->sku])]
                );
        }
    }


    /**
     * Add product to cart
     * @param Request $request [description]
     * @return [json]
     */
    public function addToCartAjax(Request $request)
    {
        if (!$request->ajax()) {
            return redirect(sc_route('cart'));
        }
        $data     = request()->all();
        $instance = $data['instance'] ?? 'default';
        $id       = $data['id'] ?? '';
        $storeId  = $data['storeId'] ?? config('app.storeId');
        $cart     = Cart::instance($instance);
		
		$pincode = $weight_scale = $weight_carat = $certification = $buying_option = ""; 
		$ornaments_option = $ornament_metal = $design_option = $ornament_size = $ornament_system = "";   

        $product = (new ShopProduct)->getDetail($id, null, $storeId);
        if (!$product) {
            return response()->json(
                [
                    'error' => 1,
                    'msg' => sc_language_render('front.data_notfound'),
                ]
            );
        }
        switch ($instance) {
            case 'default':
                if ($product->attributes->count() || $product->kind == SC_PRODUCT_GROUP) {
                    //Products have attributes or kind is group,
                    //need to select properties before adding to the cart
                    return response()->json(
                        [
                            'error' => 1,
                            'redirect' => $product->getUrl(),
                            'msg' => '',
                        ]
                    );
                }

                //Check product allow for sale
                if ($product->allowSale()) {
                    $cart->add(
                        array(
                            'id'      => $id,
                            'name'    => $product->name,
                            'qty'     => 1,
                            'price'   => $product->getFinalPrice(),
                            'tax'     => $product->getTaxValue(),
							'pincode'     => $pincode,    				 
							'weight_scale'     => $weight_scale,  
							'weight_carat'     => $weight_carat,
							'certification'     => ($certification=='')?'Drishti Gem Lab':$certification, 
							'buying_option'     => $buying_option,
							'ornaments_option'     => ($ornaments_option=='')?'Loose Gemstone':$ornaments_option,
							'ornament_metal'     => $ornament_metal,   
							'design_option'     => $design_option,  	
							'ornament_size' => $ornament_size,
							'ornament_system' => $ornament_system,   	  	
                            'storeId' => $storeId,
                        )
                    );
                } else {
                    return response()->json(
                        [
                            'error' => 1,
                            'msg' => sc_language_render('product.dont_allow_sale', ['sku' => $product->sku]),
                        ]
                    );
                }
                break;

            default:
                //Wishlist or Compare...
                ${'arrID' . $instance} = array_keys($cart->content()->groupBy('id')->toArray());
                if (!in_array($id, ${'arrID' . $instance})) {
                    try {
                        $cart->add(
                            array(
                                'id'      => $id,
                                'name'    => $product->name,
                                'qty'     => 1,
                                'price'   => $product->getFinalPrice(),
                                'tax'     => $product->getTaxValue(),
								'pincode'     => $pincode,    				 
								'weight_scale'     => $weight_scale,
								'weight_carat'     => $weight_carat,
								'certification'     => ($certification=='')?'Drishti Gem Lab':$certification, 
							    'buying_option'     => $buying_option,
							    'ornaments_option'     => ($ornaments_option=='')?'Loose Gemstone':$ornaments_option,	
								'ornament_metal'     => $ornament_metal,   
								'design_option'     => $design_option,  	
								'ornament_size' => $ornament_size,
								'ornament_system' => $ornament_system,   	  	
                                'storeId' => $storeId,
                            )
                        );
                    } catch (\Throwable $e) {
                        return response()->json(
                            [
                                'error' => 1,
                                'msg' => $e->getMessage(),  
                            ]
                        );
                    }
                } else {
					
					if(strtoupper($instance)=='WISHLIST')  
					{   					
						$wishlist = Cart::instance($instance)->content();   
						foreach($wishlist as $item)
						{
							if($item->id==$id)   
							{
								$row_id = $item->rowId; 		
								break;		   	
							}
							
						} 
		
						if($row_id !='')
						{
							Cart::instance($instance)->remove($row_id);     
						}
						
						 $carts = Cart::getListCart($instance);   		
						 $html = view('templates/s-cart-light/ajax/wishlist-products',[])->render();	
						
						 return response()->json(
							[
								'error' => 2,
								'count_cart' => $carts['count'],		
								'instance'   => $instance,  
								'content'    => $html,   	
								'msg' => sc_language_render('Item is removed from the wishlist!!', ['instance' => $instance]),
							]
						 );
					}
					else 
					{
						return response()->json(   		
							[
								'error' => 1,
								'msg' => sc_language_render('cart.item_exist_in_cart', ['instance' => $instance]),
							]
						);		
					}
                }
                break;
        }

        $carts = Cart::getListCart($instance);
		
		if(strtoupper($instance)=='CART' || strtoupper($instance)=='DEFAULT')
		{
			$html = view('templates/s-cart-light/ajax/cart-products',[])->render();		
		}
		elseif(strtoupper($instance)=='WISHLIST')  
		{
			$html = view('templates/s-cart-light/ajax/wishlist-products',[])->render();		    
		}
		else
		{
			$html="";  
		} 		
		
        return response()->json(
            [
                'error'      => 0,
                'count_cart' => $carts['count'],
                'instance'   => $instance,
				'content'    => $html,         
                'subtotal'   => $carts['subtotal'],
                'msg'        => sc_language_render('cart.add_to_cart_success', ['instance' => ($instance == 'default') ? 'cart' : $instance]),
            ]
        );
    }

    /**
     * Update product to cart
     * @param  Request $request [description]
     * @return [json]
     */
    public function updateToCart(Request $request)
    {
        if (!$request->ajax()) {
            return redirect(sc_route('cart'));
        }
        $data    = request()->all();
        $id      = $data['id'] ?? '';
        $rowId   = $data['rowId'] ?? '';
        $new_qty = $data['new_qty'] ?? 0;
        $storeId = $data['storeId'] ?? config('app.storeId');
        $product = (new ShopProduct)->getDetail($id, null, $storeId);
        
        if (!$product) {
            return response()->json(
                [
                    'error' => 1,
                    'msg' => sc_language_render('front.data_notfound'),
                ]
            );
        }
        
        if ($product->stock < $new_qty && !sc_config('product_buy_out_of_stock', $product->store_id)) {
            return response()->json(
                [
                    'error' => 1,
                    'msg' => sc_language_render('cart.item_over_qty', ['sku' => $product->sku, 'qty' => $new_qty]),
                ]
            );
        } else {
            Cart::update($rowId, ($new_qty) ? $new_qty : 0);
            return response()->json(
                [
                    'error' => 0,
                ]
            );
        }
    }

    /**
     * Process front wishlist
     *
     * @param [type] ...$params
     * @return void
     */
    public function wishlistProcessFront(...$params)
    {
        if (config('app.seoLang')) {
            $lang = $params[0] ?? '';
            sc_lang_switch($lang);
        }
        return $this->_wishlist();
    }

    /**
     * Get product in wishlist
     * @return [view]
     */
    private function _wishlist()
    {
        $wishlist = Cart::instance('wishlist')->content();
        sc_check_view($this->templatePath . '.screen.shop_wishlist');
        return view(
            $this->templatePath . '.screen.shop_wishlist',
            array(
                'title'       => sc_language_render('cart.page_wishlist_title'),
                'description' => '',
                'keyword'     => '',
                'wishlist'    => $wishlist,
                'layout_page' => 'shop_wishlist',
                'breadcrumbs' => [
                    ['url'    => '', 'title' => sc_language_render('cart.page_wishlist_title')],
                ],
            )
        );
    }

    /**
     * Process front compare
     *
     * @param [type] ...$params
     * @return void
     */
    public function compareProcessFront(...$params)
    {
        if (config('app.seoLang')) {
            $lang = $params[0] ?? '';
            sc_lang_switch($lang);
        }
        return $this->_compare();
    }

    /**
     * Get product in compare
     * @return [view]
     */
    private function _compare()
    {
        $compare = Cart::instance('compare')->content();

        sc_check_view($this->templatePath . '.screen.shop_compare');
        return view(
            $this->templatePath . '.screen.shop_compare',
            array(
                'title'       => sc_language_render('cart.page_compare_title'),
                'description' => '',
                'keyword'     => '',
                'compare'     => $compare,
                'layout_page' => 'shop_compare',
                'breadcrumbs' => [
                    ['url'    => '', 'title' => sc_language_render('cart.page_compare_title')],
                ],
            )
        );
    }


    /**
     * Process front compare
     *
     * @param [type] ...$params
     * @return void
     */
    public function clearCartProcessFront(...$params)
    {
        if (config('app.seoLang')) {
            $lang = $params[0] ?? '';
            $instance = $params[1] ?? 'cart';
            sc_lang_switch($lang);
        } else {
            $instance = $params[0] ?? 'cart';
        }
        return $this->_clearCart($instance);
    }


    /**
     * Clear all cart
     * @return [redirect]
     */
    private function _clearCart($instance = 'cart')
    {
        Cart::instance($instance)->destroy();
        return redirect(sc_route($instance));
    }

    /**
     * Process front remove item cart
     *
     * @param [type] ...$params
     * @return void
     */
    public function removeItemProcessFront(...$params)
    {
        if (config('app.seoLang')) {
            $lang = $params[0] ?? '';
            $instance = $params[1] ?? 'cart';
            $id = $params[2] ?? '';
            sc_lang_switch($lang);
        } else {
            $instance = $params[0] ?? 'cart';
            $id = $params[1] ?? '';
        }
        return $this->_removeItem($instance, $id);
    }


    /**
     * Remove item from cart
     * @return [redirect]
     */
    private function _removeItem($instance = 'cart', $id = null)
    {
        if ($id === null) {
            return redirect(sc_route($instance));
        }
        if (array_key_exists($id, Cart::instance($instance)->content()->toArray())) {
            Cart::instance($instance)->remove($id);
        }
        return redirect(sc_route($instance));
    }

    
    /**
     * Complete order
     *
     * Step 07
     *
     * @return [redirect]
     */
    public function completeOrder()
    {
        //Clear cart store
        $this->clearCartStore();

        $orderID = session('orderID') ?? 0;
        $paymentMethod  = session('paymentMethod');
        $shippingMethod = session('shippingMethod');
        $totalMethod    = session('totalMethod', []);
		
	
        if ($orderID === 0) {
            return redirect()->route('home', ['error' => 'Error Order ID!']);     
        }

        // Process event success
        sc_event_order_success($order = ShopOrder::find($orderID));

        $classPaymentConfig = sc_get_class_plugin_config('Payment', $paymentMethod);
        if (method_exists($classPaymentConfig, 'endApp')) {
            (new $classPaymentConfig)->endApp();
        }

        $classShippingConfig = sc_get_class_plugin_config('Shipping', $shippingMethod);
        if (method_exists($classShippingConfig, 'endApp')) {
            (new $classShippingConfig)->endApp();
        }

        if ($totalMethod && is_array($totalMethod)) {
            foreach ($totalMethod as $keyMethod => $valueMethod) {
                $classTotalConfig = sc_get_class_plugin_config('Total', $keyMethod);
                if (method_exists($classTotalConfig, 'endApp')) {
                    (new $classTotalConfig)->endApp(['orderID' => $orderID, 'code' => $valueMethod]);
                }
            }
        }

        //Clear session
        $this->clearSession();

        if ((sc_config('order_success_to_admin') || sc_config('order_success_to_customer')) && sc_config('email_action_mode')) {
            $data = ShopOrder::with('details')->find($orderID)->toArray();
            $checkContent = (new ShopEmailTemplate)->where('group', 'order_success_to_admin')->where('status', 1)->first();
            $checkContentCustomer = (new ShopEmailTemplate)->where('group', 'order_success_to_customer')->where('status', 1)->first();
            if ($checkContent || $checkContentCustomer) {
                $orderDetail = '';
                $orderDetail .= '<tr>
                                    <td>' . sc_language_render('email.order.sort') . '</td>
                                    <td>' . sc_language_render('email.order.sku') . '</td>
                                    <td>' . sc_language_render('email.order.name') . '</td>
                                    <td>' . sc_language_render('email.order.price') . '</td>
                                    <td>' . sc_language_render('email.order.qty') . '</td>
                                    <td>' . sc_language_render('email.order.total') . '</td>
                                </tr>';
                foreach ($data['details'] as $key => $detail) {
                    $product = (new ShopProduct)->getDetail($detail['product_id']);
                    $pathDownload = $product->downloadPath->path ?? '';
                    $nameProduct = $detail['name'];
                    if ($product && $pathDownload && $product->property == SC_PROPERTY_DOWNLOAD) {
                        $nameProduct .="<br><a href='".sc_path_download_render($pathDownload)."'>Download</a>";
                    }

                    $orderDetail .= '<tr>
                                    <td>' . ($key + 1) . '</td>
                                    <td>' . $detail['sku'] . '</td>
                                    <td>' . $nameProduct . '</td>
                                    <td>' . sc_currency_render($detail['price'], '', '', '', false) . '</td>
                                    <td>' . number_format($detail['qty']) . '</td>
                                    <td align="right">' . sc_currency_render($detail['total_price'], '', '', '', false) . '</td>
                                </tr>';
                }
                $dataFind = [
                    '/\{\{\$title\}\}/',
                    '/\{\{\$orderID\}\}/',
                    '/\{\{\$firstName\}\}/',
                    '/\{\{\$lastName\}\}/',
                    '/\{\{\$toname\}\}/',
                    '/\{\{\$address\}\}/',
                    '/\{\{\$address1\}\}/',
                    '/\{\{\$address2\}\}/',
                    '/\{\{\$address3\}\}/',
                    '/\{\{\$email\}\}/',
                    '/\{\{\$phone\}\}/',
                    '/\{\{\$comment\}\}/',
                    '/\{\{\$orderDetail\}\}/',
                    '/\{\{\$subtotal\}\}/',
                    '/\{\{\$shipping\}\}/',
                    '/\{\{\$discount\}\}/',
                    '/\{\{\$otherFee\}\}/',
                    '/\{\{\$total\}\}/',
                ];
                $dataReplace = [
                    sc_language_render('email.order.email_subject_customer') . '#' . $orderID,
                    $orderID,
                    $data['first_name'],
                    $data['last_name'],
                    $data['first_name'].' '.$data['last_name'],
                    $data['address1'] . ' ' . $data['address2'].' '.$data['address3'],
                    $data['address1'],
                    $data['address2'],
                    $data['address3'],
                    $data['email'],
                    $data['phone'],
                    $data['comment'],
                    $orderDetail,
                    sc_currency_render($data['subtotal'], '', '', '', false),
                    sc_currency_render($data['shipping'], '', '', '', false),
                    sc_currency_render($data['discount'], '', '', '', false),
                    sc_currency_render($data['other_fee'], '', '', '', false),
                    sc_currency_render($data['total'], '', '', '', false),
                ];

                // Send mail order success to admin
                if (sc_config('order_success_to_admin') && $checkContent) {
                    $content = $checkContent->text;
                    $content = preg_replace($dataFind, $dataReplace, $content);
                    $dataView = [
                        'content' => $content,
                    ];
                    $config = [
                        'to' => sc_store('email'),
                        'subject' => sc_language_render('email.order.email_subject_to_admin', ['order_id' => $orderID]),
                    ];
                    sc_send_mail($this->templatePath . '.mail.order_success_to_admin', $dataView, $config, []);
                }

                // Send mail order success to customer
                if (sc_config('order_success_to_customer') && $checkContentCustomer) {
                    $contentCustomer = $checkContentCustomer->text;
                    $contentCustomer = preg_replace($dataFind, $dataReplace, $contentCustomer);
                    $dataView = [
                        'content' => $contentCustomer,
                    ];
                    $config = [
                        'to' => $data['email'],
                        'replyTo' => sc_store('email'),
                        'subject' => sc_language_render('email.order.email_subject_customer', ['order_id' => $orderID]),
                    ];

                    $attach = [];
                    if (sc_config('order_success_to_customer_pdf')) {
                        // Invoice pdf
                        \PDF::loadView($this->templatePath . '.mail.order_success_to_customer_pdf', $dataView)
                            ->save(\Storage::disk('invoice')->path('order-'.$orderID.'.pdf'));
                        $attach['attachFromStorage'] = [
                            [
                                'file_storage' => 'invoice',
                                'file_path' => 'order-'.$orderID.'.pdf',
                            ]
                        ];
                    }

                    sc_send_mail($this->templatePath . '.mail.order_success_to_customer', $dataView, $config, $attach);
                }
            }
        }

        $dataResponse = [
            'orderID'        => $orderID,
        ];
        return redirect(sc_route('order.success'))->with($dataResponse);
    }

	public function processPayment(Request $request)
    {
		$agent = new \Jenssegers\Agent\Agent();
        $customer = auth()->user();
        $uID = $customer->id ?? 0;

        //if cart empty
        if (count(session('dataCheckout', [])) == 0) {
            return redirect()->route('home');
        }
        //Not allow for guest
        if (!sc_config('shop_allow_guest') && !$customer) {
            return redirect(sc_route('login'));
        } //

        $data = request()->all();
		
		 //Set session shippingMethod
        if (!sc_config('shipping_off')) {
            session(['shippingMethod' => request('shippingMethod')]);
        }

        //Set session paymentMethod
        if (!sc_config('payment_off')) {
            session(['paymentMethod' => request('paymentMethod')]);
        }

        //Set session address process
        session(['address_process' => request('address_process')]);    
		
		if(STRTOUPPER(request('address_process'))!='NEW')     
		{
			$shipping_address=ShopCustomerAddress::find(request('address_process'));	
				session(
				[
					'shippingAddress' => [
						'first_name'      => $shipping_address->first_name,    
						'last_name'       => $shipping_address->last_name,    
						'first_name_kana' => $shipping_address->first_name_kana,    
						'last_name_kana'  => $shipping_address->last_name_kana,        
						'email'           => request('email'),
						'country'         => $shipping_address->country,    
						'address1'        => $shipping_address->address1,  
						'address2'        => $shipping_address->address2,  
						'address3'        => $shipping_address->address3,  
						'phone'           => $shipping_address->phone,    
						'postcode'        => $shipping_address->postcode,      
						'company'         => $shipping_address->company,        
						'comment'         => request('comment'),    
					],
				]
			);
		}
		else
		{
			session(
				[
					'shippingAddress' => [
						'first_name'      => request('first_name'),
						'last_name'       => request('last_name'),
						'first_name_kana' => request('first_name_kana'),    
						'last_name_kana'  => request('last_name_kana'),
						'email'           => request('email'),
						'country'         => request('country'),
						'address1'        => request('address1'),
						'address2'        => request('address2'),
						'address3'        => request('address3'),
						'phone'           => request('phone'),
						'postcode'        => request('postcode'),   
						'company'         => request('company'),
						'comment'         => request('comment'),
					],
				]
			);
		}       
		
		$objects = ShopOrderTotal::getObjectOrderTotal();	

		session(['dataTotal' => ShopOrderTotal::processDataTotal($objects)]);	
		
        if (!$data) {
            return redirect(sc_route('cart'));
        } else {
            $dataTotal       = session('dataTotal') ?? [];
            $shippingAddress = session('shippingAddress') ?? [];  
            $paymentMethod   = session('paymentMethod') ?? '';
			$shippingMethod  = session('shippingMethod') ?? '';  
            $address_process = session('address_process') ?? '';
            $storeCheckout   = session('storeCheckout') ?? '';
            $dataCheckout    = session('dataCheckout') ?? '';
        }  
		
		//Process total
			$subtotal = (new ShopOrderTotal)->sumValueTotal('subtotal', $dataTotal); //sum total
			$tax      = (new ShopOrderTotal)->sumValueTotal('tax', $dataTotal); //sum tax
			$shipping = (new ShopOrderTotal)->sumValueTotal('shipping', $dataTotal); //sum shipping
			$discount = (new ShopOrderTotal)->sumValueTotal('discount', $dataTotal); //sum discount
			$otherFee = (new ShopOrderTotal)->sumValueTotal('other_fee', $dataTotal); //sum other_fee
			$received = (new ShopOrderTotal)->sumValueTotal('received', $dataTotal); //sum received
			$total    = (new ShopOrderTotal)->sumValueTotal('total', $dataTotal);
			
			$pay_id=request()->razorpay_payment_id;
			$pay_sign=request()->razorpay_signature; 
			
			if(strtoupper($pay_sign)=='SUCCESS')
			{
				$pay_status=1;
			}
			else if(strtoupper($pay_sign)=='FAILURE')  
			{
				$pay_status=0;  
			}
			else
			{
				$pay_status=0;  		
			}				
			//end total

			$dataOrder['store_id']        = $storeCheckout;
			$dataOrder['customer_id']     = $uID;
			$dataOrder['subtotal']        = $subtotal;
			$dataOrder['shipping']        = $shipping;
			$dataOrder['discount']        = $discount;
			$dataOrder['other_fee']        = $otherFee;
			$dataOrder['received']        = $received;
			$dataOrder['tax']             = $tax;
			$dataOrder['razorpay_payment_id']  = $pay_id;  	
			$dataOrder['payment_status']  = $pay_status;
			$dataOrder['shipping_status'] = self::SHIPPING_NOTSEND;  
			$dataOrder['status']          = self::ORDER_STATUS_NEW;
			$dataOrder['currency']        = sc_currency_code();
			$dataOrder['exchange_rate']   = sc_currency_rate();
			$dataOrder['total']           = $total;
			$dataOrder['balance']         = $total + $received;
			$dataOrder['email']           = (!empty($shippingAddress['email']))?$shippingAddress['email']:'';
			$dataOrder['first_name']      = (!empty($shippingAddress['first_name']))?$shippingAddress['first_name']:''; 
			$dataOrder['payment_method']  = $paymentMethod;
			$dataOrder['shipping_method'] = $shippingMethod;
			$dataOrder['user_agent']      = $request->header('User-Agent');
			$dataOrder['device_type']      = $agent->deviceType();
			$dataOrder['ip']              = $request->ip();
			$dataOrder['created_at']      = sc_time_now();
			
			if (!empty($shippingAddress['last_name'])) {
				$dataOrder['last_name']       = $shippingAddress['last_name'];
			}
			if (!empty($shippingAddress['first_name_kana'])) {
				$dataOrder['first_name_kana']       = $shippingAddress['first_name_kana'];
			}
			if (!empty($shippingAddress['last_name_kana'])) {
				$dataOrder['last_name_kana']       = $shippingAddress['last_name_kana'];
			}
			if (!empty($shippingAddress['address1'])) {
				$dataOrder['address1']       = $shippingAddress['address1'];
			}
			if (!empty($shippingAddress['address2'])) {
				$dataOrder['address2']       = $shippingAddress['address2'];
			}
			if (!empty($shippingAddress['address3'])) {
				$dataOrder['address3']       = $shippingAddress['address3'];
			}
			if (!empty($shippingAddress['country'])) {
				$dataOrder['country']       = $shippingAddress['country'];
			}
			if (!empty($shippingAddress['state'])) {
				$dataOrder['state']         = $shippingAddress['state'];   
			}      
			if (!empty($shippingAddress['phone'])) {
				$dataOrder['phone']       = $shippingAddress['phone'];
			}
			if (!empty($shippingAddress['postcode'])) {
				$dataOrder['postcode']       = $shippingAddress['postcode'];
			}
			if (!empty($shippingAddress['company'])) {
				$dataOrder['company']       = $shippingAddress['company'];
			}
			if (!empty($shippingAddress['comment'])) {
				$dataOrder['comment']       = $shippingAddress['comment'];
			}

			$arrCartDetail = [];
			foreach ($dataCheckout as $cartItem) {
				$arrDetail['product_id']  = $cartItem->id;
				$arrDetail['name']        = $cartItem->name;
				$arrDetail['price']       = sc_currency_value($cartItem->price);
				$arrDetail['qty']         = $cartItem->qty;
				$arrDetail['certification'] = $cartItem->certification;    
				$arrDetail['weight_scale']  = $cartItem->weight_scale;
				$arrDetail['weight_carat']  = $cartItem->weight_carat; 
				$arrDetail['buying_option']  = $cartItem->buying_option;      	
				$arrDetail['ornaments_option']  = $cartItem->ornaments_option;			
				$arrDetail['ornament_metal']  = $cartItem->ornament_metal;
				$arrDetail['design_option']  = $cartItem->design_option;   
				$arrDetail['ornament_size']  = $cartItem->ornament_size;      	
				$arrDetail['ornament_system']  = $cartItem->ornament_system;  	     			
				$arrDetail['store_id']    = $cartItem->storeId;  
				$arrDetail['attribute']   = ($cartItem->options) ? $cartItem->options->toArray() : null;
				$arrDetail['total_price'] = sc_currency_value($cartItem->price) * $cartItem->qty;
				$arrCartDetail[]          = $arrDetail;
			}

			//Set session info order
			session(['dataOrder' => $dataOrder]);
			session(['arrCartDetail' => $arrCartDetail]);  

			//Create new order
			$newOrder = (new ShopOrder)->createOrder($dataOrder, $dataTotal, $arrCartDetail);  
			
			// dd($newOrder);    

			if ($newOrder['error'] == 1) {
				return redirect()->route('home', ['error' => 'Error Order ID!']);     
				
			}
			//Set session orderID
			session(['orderID' => $newOrder['orderID']]);

			//Create new address
			if ($address_process == 'new') {
				$addressNew = [
					'first_name'      => $shippingAddress['first_name'] ?? '',
					'last_name'       => $shippingAddress['last_name'] ?? '',
					'first_name_kana' => $shippingAddress['first_name_kana'] ?? '',
					'last_name_kana'  => $shippingAddress['last_name_kana'] ?? '',
					'postcode'        => $shippingAddress['postcode'] ?? '',
					'address1'        => $shippingAddress['address1'] ?? '',
					'address2'        => $shippingAddress['address2'] ?? '',
					'address3'        => $shippingAddress['address3'] ?? '',
					'country'         => $shippingAddress['country'] ?? '',
					'state'           => $shippingAddress['state'] ?? '',     
					'phone'           => $shippingAddress['phone'] ?? '',
				];

				//Process escape
				$addressNew = sc_clean($addressNew);

				ShopCustomer::find($uID)->addresses()->save(new ShopCustomerAddress($addressNew));
				session()->forget('address_process'); //destroy address_process
			}

			$paymentMethod = sc_get_class_plugin_controller('Payment', session('paymentMethod'));   
			
			$this->clearCartStore();

			$orderID = session('orderID') ?? 0;
			$paymentMethod  = session('paymentMethod');
			$shippingMethod = session('shippingMethod');
			$totalMethod    = session('totalMethod', []);

			if ($orderID === 0) {
				return redirect()->route('home', ['error' => 'Error Order ID!']);   				  
			}

			// Process event success
			sc_event_order_success($order = ShopOrder::find($orderID));

			$classPaymentConfig = sc_get_class_plugin_config('Payment', $paymentMethod);
			if (method_exists($classPaymentConfig, 'endApp')) {
				(new $classPaymentConfig)->endApp();
			}

			$classShippingConfig = sc_get_class_plugin_config('Shipping', $shippingMethod);
			if (method_exists($classShippingConfig, 'endApp')) {
				(new $classShippingConfig)->endApp();
			}

			if ($totalMethod && is_array($totalMethod)) {
				foreach ($totalMethod as $keyMethod => $valueMethod) {
					$classTotalConfig = sc_get_class_plugin_config('Total', $keyMethod);
					if (method_exists($classTotalConfig, 'endApp')) {
						(new $classTotalConfig)->endApp(['orderID' => $orderID, 'code' => $valueMethod]);
					}
				}
			}

			//Clear session
			$this->clearSession();

			if ((sc_config('order_success_to_admin') || sc_config('order_success_to_customer')) && sc_config('email_action_mode')) {
				$data = ShopOrder::with('details')->find($orderID)->toArray();
				$checkContent = (new ShopEmailTemplate)->where('group', 'order_success_to_admin')->where('status', 1)->first();
				$checkContentCustomer = (new ShopEmailTemplate)->where('group', 'order_success_to_customer')->where('status', 1)->first();
				if ($checkContent || $checkContentCustomer) {
					$orderDetail = '';
					$orderDetail .= '<tr>
										<td>' . sc_language_render('email.order.sort') . '</td>
										<td>' . sc_language_render('email.order.sku') . '</td>
										<td>' . sc_language_render('email.order.name') . '</td>
										<td>' . sc_language_render('email.order.price') . '</td>
										<td>' . sc_language_render('email.order.qty') . '</td>
										<td>' . sc_language_render('email.order.total') . '</td>
									</tr>';
					foreach ($data['details'] as $key => $detail) {
						$product = (new ShopProduct)->getDetail($detail['product_id']);
						$pathDownload = $product->downloadPath->path ?? '';
						$nameProduct = $detail['name'];
						if ($product && $pathDownload && $product->property == SC_PROPERTY_DOWNLOAD) {
							$nameProduct .="<br><a href='".sc_path_download_render($pathDownload)."'>Download</a>";
						}

						$orderDetail .= '<tr>
										<td>' . ($key + 1) . '</td>
										<td>' . $detail['sku'] . '</td>
										<td>' . $nameProduct . '</td>
										<td>' . sc_currency_render($detail['price'], '', '', '', false) . '</td>
										<td>' . number_format($detail['qty']) . '</td>
										<td align="right">' . sc_currency_render($detail['total_price'], '', '', '', false) . '</td>
									</tr>';
					}
					$dataFind = [
						'/\{\{\$title\}\}/',
						'/\{\{\$orderID\}\}/',
						'/\{\{\$firstName\}\}/',
						'/\{\{\$lastName\}\}/',
						'/\{\{\$toname\}\}/',
						'/\{\{\$address\}\}/',
						'/\{\{\$address1\}\}/',
						'/\{\{\$address2\}\}/',
						'/\{\{\$address3\}\}/',
						'/\{\{\$email\}\}/',
						'/\{\{\$phone\}\}/',
						'/\{\{\$comment\}\}/',
						'/\{\{\$orderDetail\}\}/',
						'/\{\{\$subtotal\}\}/',
						'/\{\{\$shipping\}\}/',
						'/\{\{\$discount\}\}/',
						'/\{\{\$otherFee\}\}/',
						'/\{\{\$total\}\}/',
					];
					$dataReplace = [
						sc_language_render('email.order.email_subject_customer') . '#' . $orderID,
						$orderID,
						$data['first_name'],
						$data['last_name'],
						$data['first_name'].' '.$data['last_name'],
						$data['address1'] . ' ' . $data['address2'].' '.$data['address3'],
						$data['address1'],
						$data['address2'],
						$data['address3'],
						$data['email'],
						$data['phone'],
						$data['comment'],
						$orderDetail,
						sc_currency_render($data['subtotal'], '', '', '', false),
						sc_currency_render($data['shipping'], '', '', '', false),
						sc_currency_render($data['discount'], '', '', '', false),
						sc_currency_render($data['other_fee'], '', '', '', false),
						sc_currency_render($data['total'], '', '', '', false),
					];

					// Send mail order success to admin
					if (sc_config('order_success_to_admin') && $checkContent) {
						$content = $checkContent->text;
						$content = preg_replace($dataFind, $dataReplace, $content);
						$dataView = [
							'content' => $content,
						];
						$config = [
							'to' => sc_store('email'),
							'subject' => sc_language_render('email.order.email_subject_to_admin', ['order_id' => $orderID]),
						];
						sc_send_mail($this->templatePath . '.mail.order_success_to_admin', $dataView, $config, []);
					}

					// Send mail order success to customer
					if (sc_config('order_success_to_customer') && $checkContentCustomer) {
						$contentCustomer = $checkContentCustomer->text;
						$contentCustomer = preg_replace($dataFind, $dataReplace, $contentCustomer);
						$dataView = [
							'content' => $contentCustomer,
						];
						$config = [
							'to' => $data['email'],
							'replyTo' => sc_store('email'),
							'subject' => sc_language_render('email.order.email_subject_customer', ['order_id' => $orderID]),
						];

						$attach = [];
						if (sc_config('order_success_to_customer_pdf')) {
							// Invoice pdf
							\PDF::loadView($this->templatePath . '.mail.order_success_to_customer_pdf', $dataView)
								->save(\Storage::disk('invoice')->path('order-'.$orderID.'.pdf'));
							$attach['attachFromStorage'] = [
								[
									'file_storage' => 'invoice',
									'file_path' => 'order-'.$orderID.'.pdf',
								]
							];
						}

						sc_send_mail($this->templatePath . '.mail.order_success_to_customer', $dataView, $config, $attach);
					}
				}
			}
			
			if($orderID)
			{ 				
				if(strtoupper($pay_sign)=='SUCCESS')  
				{
					return redirect()->route('order.process', ['response' => 'payment is successful!']);    	
				}
				else if(strtoupper($pay_sign)=='FAILURE')  
				{
					return redirect()->route('order.process', ['response' => 'payment is failed!!']);        
				}
				else
				{
					return redirect()->route('home', ['response' => 'Error Order ID!']);        
				} 				
			}
			else
			{
				return redirect()->route('home', ['error' => 'Error Order ID!']);    		
			}  			
		
	}  

    /**
     * Process front page order success
     *
     * Step 08.1
     *
     * @param [type] ...$params
     * @return void
     */
    public function orderSuccessProcessFront(...$params)
    {
        if (config('app.seoLang')) {
            $lang = $params[0] ?? '';
            sc_lang_switch($lang);
        }
        return $this->_orderSuccess();
    }

	public function thankYou(Request $request)  
    {
        sc_check_view($this->templatePath . '.screen.shop_thank_you');     
        
        return view(
            $this->templatePath . '.screen.shop_thank_you',
            [
                'title'       => 'Payment Successful | Drishti Gems',                 
                'layout_page' => 'shop_thank_you',
                'content' => $request->input('response'),  
            ]
        );
    }

	
    /**
     * Page order success
     *
     * Step 08.2
     *
     * @return  [view]
     */
    private function _orderSuccess()
    {
        if (!session('orderID')) {
            return redirect()->route('home');
        }
        sc_check_view($this->templatePath . '.screen.shop_order_success');
        $orderInfo = ShopOrder::with('details')->find(session('orderID'))->toArray();
        return view(
            $this->templatePath . '.screen.shop_order_success',
            [
                'title'       => sc_language_render('checkout.success_title'),
                'orderInfo'   => $orderInfo,
                'layout_page' => 'shop_order_success',
                'breadcrumbs' => [
                    ['url'    => '', 'title' => sc_language_render('checkout.success_title')],
                ],
            ]
        );
    }

    /**
     * Remove cart store ordered
     */
    private function clearCartStore()
    {
        $dataCheckout = session('dataCheckout') ?? '';
        if ($dataCheckout) {
            foreach ($dataCheckout as $key => $row) {
                Cart::remove($row->rowId);
            }
        }
    }

    /**
     * Clear session
     */
    private function clearSession()
    {
        session()->forget('paymentMethod'); //destroy paymentMethod
        session()->forget('shippingMethod'); //destroy shippingMethod
        session()->forget('totalMethod'); //destroy totalMethod
        session()->forget('otherMethod'); //destroy otherMethod
        session()->forget('dataTotal'); //destroy dataTotal
        session()->forget('dataCheckout'); //destroy dataCheckout
        session()->forget('storeCheckout'); //destroy storeCheckout
        session()->forget('dataOrder'); //destroy dataOrder
        session()->forget('arrCartDetail'); //destroy arrCartDetail
        session()->forget('orderID'); //destroy orderID
    }
}