836 lines
32 KiB
PHP
836 lines
32 KiB
PHP
|
|
<?
|
|||
|
|
|
|||
|
|
use common\Image;
|
|||
|
|
use core\columns\structure\eFilterType;
|
|||
|
|
use core\core\structure\eRowClick;
|
|||
|
|
use core\db\structure\Column as C;
|
|||
|
|
use core\db\structure\eColumnType;
|
|||
|
|
use ms\ms\structure\eTab;
|
|||
|
|
use ms\ms\structure\eTabType;
|
|||
|
|
use shop\order\Pay;
|
|||
|
|
use shop\Shop;
|
|||
|
|
use ui\form\structure\eInputType;
|
|||
|
|
use ui\Form;
|
|||
|
|
use ui\input\Input;
|
|||
|
|
use core\lang\structure\LangVariable as V;
|
|||
|
|
use ms\ms\structure\msModuleTable;
|
|||
|
|
use core\user\profile\structure\profileLang as Vars;
|
|||
|
|
use shop\Order;
|
|||
|
|
use shop\Delivery;
|
|||
|
|
use common\Payment;
|
|||
|
|
use shop\order\Status as OrderStatus;
|
|||
|
|
use core\Token;
|
|||
|
|
use shop\order\cashback;
|
|||
|
|
use shop\cashback\Profile as CashbackProfile;
|
|||
|
|
|
|||
|
|
|
|||
|
|
class Profile extends msModuleTable {
|
|||
|
|
static $self;
|
|||
|
|
static $table_name = 'profile';
|
|||
|
|
static $controller = 'core.user.profile';
|
|||
|
|
|
|||
|
|
static $ID = 'id';
|
|||
|
|
static $SNAME = 'sname';
|
|||
|
|
static $NAME = 'name';
|
|||
|
|
static $FNAME = 'fname';
|
|||
|
|
static $LOGIN = 'login';
|
|||
|
|
static $EMAIL = 'email';
|
|||
|
|
static $PHONE = 'phone';
|
|||
|
|
static $CART = 'cart';
|
|||
|
|
static $PASSWORD = 'password';
|
|||
|
|
static $PORTAL = 'portal';
|
|||
|
|
static $CREATED = 'created';
|
|||
|
|
static $UPDATED = 'updated';
|
|||
|
|
static $IMAGE = 'image';
|
|||
|
|
static $CASHBACK = 'cashback';
|
|||
|
|
static $NICKNAME = 'nickname';
|
|||
|
|
static $CITY = 'city';
|
|||
|
|
static $BDATE = 'birth_date';
|
|||
|
|
static $SALE_PERCENT = 'sale_percent';
|
|||
|
|
|
|||
|
|
static $portal_id = 0;
|
|||
|
|
static $cookieIDKey = 'pid';
|
|||
|
|
static $cookieHashKey = 'ph';
|
|||
|
|
static $data = [];
|
|||
|
|
|
|||
|
|
static function init(int $portal_id = 0){
|
|||
|
|
|
|||
|
|
if($portal_id) {
|
|||
|
|
self::$portal_id = $portal_id;
|
|||
|
|
self::$cookieIDKey .= '_' . self::$portal_id;
|
|||
|
|
self::$cookieHashKey .= '_' . self::$portal_id;
|
|||
|
|
define("IF_PROFILE", self::if_auth());
|
|||
|
|
define("PID", IF_PROFILE ? self::$data[self::$ID] : 0);
|
|||
|
|
} else {
|
|||
|
|
define("IF_PROFILE", false);
|
|||
|
|
define("PID", 0);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static function afterUadd($values, $id, $result) {
|
|||
|
|
parent::afterUadd($values, $id, $result); // TODO: Change the autogenerated stub
|
|||
|
|
if($c = self::preparePass($values['password'])){
|
|||
|
|
$C = self::getByID($id);
|
|||
|
|
$C[self::$PASSWORD] = $c;
|
|||
|
|
self::updateById($id, [ self::$PASSWORD => self::hash($C) ] );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static function installUniques() {
|
|||
|
|
\DB::addIndex(self::$table_name,self::$EMAIL);
|
|||
|
|
\DB::addIndex(self::$table_name,self::$LOGIN);
|
|||
|
|
\DB::addIndex(self::$table_name,self::$PORTAL);
|
|||
|
|
\DB::addIndex(self::$table_name,self::$NICKNAME);
|
|||
|
|
\DB::addIndexManyColumns(self::$table_name,[self::$PORTAL,self::$LOGIN]);
|
|||
|
|
\DB::addIndexManyColumns(self::$table_name,[self::$PORTAL,self::$EMAIL]);
|
|||
|
|
\DB::addIndexManyColumns(self::$table_name,[self::$PORTAL,self::$NICKNAME]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static function exit(){
|
|||
|
|
Core::setCookie(self::$cookieIDKey,'-');
|
|||
|
|
Core::setCookie(self::$cookieHashKey,'-');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static function formatPublic($v){
|
|||
|
|
return [
|
|||
|
|
'id'=>$v[self::$ID],
|
|||
|
|
'name'=>$v[self::$NAME],
|
|||
|
|
'avatar'=>Image::format($v[self::$IMAGE])
|
|||
|
|
];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static function AuthByULogin($ulogin_token) {
|
|||
|
|
// $_SERVER['HTTP_HOST'] = 'update.msto.me';
|
|||
|
|
$s = file_get_contents($x = 'http://ulogin.ru/token.php?token=' . $ulogin_token .'&host=' . $_SERVER['HTTP_HOST']);
|
|||
|
|
$user = json_decode($s, true);
|
|||
|
|
|
|||
|
|
$res = new stdClass();
|
|||
|
|
$res->e = 0;
|
|||
|
|
|
|||
|
|
$login = $user['email'];
|
|||
|
|
$network = $user['network'];
|
|||
|
|
$network_id = $user['uid'];
|
|||
|
|
|
|||
|
|
$token = $ulogin_token.'_'.$network.$network_id;
|
|||
|
|
|
|||
|
|
$r = Token::select($q = [
|
|||
|
|
\Query::LEFT_JOINS => [
|
|||
|
|
[self::$table_name,self::$ID,Token::$PROFILE]
|
|||
|
|
],
|
|||
|
|
\Query::WHERE => new \Where(\Where::_and( $x=[
|
|||
|
|
\Where::_operator(Token::$NETWORK,'=',$network),
|
|||
|
|
\Where::_operator(Token::$NETWORK_ID,'=',$network_id),
|
|||
|
|
\Where::_operator(self::$PORTAL,'=',\Site::$portal_id),
|
|||
|
|
])),
|
|||
|
|
\Query::COUNT => 1
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
|
|||
|
|
// если есть, то авторизовываемся по токену..
|
|||
|
|
if(\DB::numRows($r)){
|
|||
|
|
$l = \DB::fetch($r);
|
|||
|
|
$r = self::loginByToken($l[Token::$HASH]);
|
|||
|
|
if($r){
|
|||
|
|
$res->e = 0;
|
|||
|
|
$res->id = \Profile::$data[\Profile::$ID];
|
|||
|
|
} else {
|
|||
|
|
$res->e = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// если такого пользователя нет, то пытаемся зарегистрироваться
|
|||
|
|
} else {
|
|||
|
|
$password = \Core::randomPassword();
|
|||
|
|
$data = [
|
|||
|
|
'login' =>$login,
|
|||
|
|
'pass' =>$password,
|
|||
|
|
|
|||
|
|
'sname' =>$user['last_name'],
|
|||
|
|
'name' =>$user['first_name'],
|
|||
|
|
'img_url' =>$user['photo_big'],
|
|||
|
|
];
|
|||
|
|
$res = self::reg($data,\Site::$portal_id);
|
|||
|
|
if($res->e==0){
|
|||
|
|
Token::insert([
|
|||
|
|
Token::$NETWORK => $network,
|
|||
|
|
Token::$NETWORK_ID => $network_id,
|
|||
|
|
Token::$PROFILE => $res->id,
|
|||
|
|
Token::$HASH => $token,
|
|||
|
|
Token::$DATA => je($user),
|
|||
|
|
]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return $res;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
static function getMyOrders($options = [],$isAssoc = true){
|
|||
|
|
$options[\Query::WHERE] = new \Where(\Where::_and([
|
|||
|
|
Where::_operator(Order::$PROFILE,'=',PID),
|
|||
|
|
])
|
|||
|
|
);
|
|||
|
|
$options[\Query::LEFT_JOINS] = [
|
|||
|
|
[Delivery::$table_name, Delivery::$ID, Order::$DELIVERY_ID],
|
|||
|
|
[Payment::$table_name, Payment::$ID, Order::$PAYMENT_ID ],
|
|||
|
|
[OrderStatus::$table_name, OrderStatus::$ID, Order::$STATUS ],
|
|||
|
|
];
|
|||
|
|
return Order::select($options,$isAssoc);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static function getMyFullName(): string {
|
|||
|
|
return self::getFullName(\Profile::$data);
|
|||
|
|
}
|
|||
|
|
static function getFullName($data): string {
|
|||
|
|
$x = [];
|
|||
|
|
if($c = trim($data[self::$SNAME])) $x[] = $c;
|
|||
|
|
if($c = trim($data[self::$NAME])) $x[] = $c;
|
|||
|
|
if($c = trim($data[self::$FNAME])) $x[] = $c;
|
|||
|
|
return implode(" ",$x);
|
|||
|
|
}
|
|||
|
|
static function getName($v, array $options = []): string {
|
|||
|
|
$x = [];
|
|||
|
|
if($c = trim($v[self::$SNAME])) $x[] = $c;
|
|||
|
|
if($c = trim($v[self::$NAME])) $x[] = $c;
|
|||
|
|
if($c = trim($v[self::$FNAME])) $x[] = $c;
|
|||
|
|
return implode(" ",$x);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static function reg($data,$portal_id){
|
|||
|
|
$res = new stdClass();
|
|||
|
|
$res->e = 0;
|
|||
|
|
$res->m = '';
|
|||
|
|
|
|||
|
|
$login = self::prepareLogin($data['login']);
|
|||
|
|
$pass = self::preparePass($data['pass']);
|
|||
|
|
|
|||
|
|
$googleCaptcha = \Site::$theme::checkGoogleCaptcha($data['google_captcha']);
|
|||
|
|
$isGoogleCaptcha = $googleCaptcha['e']==0;
|
|||
|
|
if(!$isGoogleCaptcha) {
|
|||
|
|
$res->e = 1;
|
|||
|
|
$res->m = $googleCaptcha['m'];
|
|||
|
|
}
|
|||
|
|
if($res->e==0) {
|
|||
|
|
$acc = self::getByLogin($login, $portal_id);
|
|||
|
|
if (!$acc) {
|
|||
|
|
$r = self::add($d = [
|
|||
|
|
self::$PORTAL => self::$portal_id,
|
|||
|
|
self::$PASSWORD => $pass,
|
|||
|
|
self::$SNAME => $data['sname'],
|
|||
|
|
self::$NAME => $data['name'],
|
|||
|
|
self::$FNAME => $data['fname'],
|
|||
|
|
self::$PHONE => $data['phone'],
|
|||
|
|
self::$NICKNAME => $data['nickname'],
|
|||
|
|
self::$LOGIN => $login,
|
|||
|
|
self::$PORTAL => $portal_id,
|
|||
|
|
]);
|
|||
|
|
$acc = self::getByID($r->id);
|
|||
|
|
$hash = $acc[self::$PASSWORD];
|
|||
|
|
Core::setCookie(self::$cookieIDKey, $acc[self::$ID]);
|
|||
|
|
Core::setCookie(self::$cookieHashKey, $hash);
|
|||
|
|
$res->id = $r->id;
|
|||
|
|
$res->h = $hash;
|
|||
|
|
|
|||
|
|
if (Core::$IS_APP) {
|
|||
|
|
$hash = Token::getHash(0, $acc[self::$ID], \Site::$portal_id);
|
|||
|
|
Token::insert([
|
|||
|
|
Token::$PROFILE => $acc[self::$ID],
|
|||
|
|
Token::$HASH => $hash,
|
|||
|
|
]);
|
|||
|
|
$res->token = $hash;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
\ms\MS::prepareNewUser($r->id);
|
|||
|
|
shop::prepareProfile($r->id);
|
|||
|
|
|
|||
|
|
|
|||
|
|
if ($img_url = $data['img_url']) {
|
|||
|
|
$name = time() . '.jpg';
|
|||
|
|
$to_base = '/upload/images/acc' . \Site::$owner_id . '/profile/' . $res->id . '/' . $name;
|
|||
|
|
$img_path = \Core::$FOLDER . $to_base;
|
|||
|
|
mkdir(dirname($img_path), 0755, true);
|
|||
|
|
$copied = copy($img_url, $img_path);
|
|||
|
|
if ($copied) {
|
|||
|
|
$r = Image::insert([
|
|||
|
|
Image::$URL => $to_base,
|
|||
|
|
Image::$ORIGINAL => $to_base,
|
|||
|
|
Image::$PROFILE => $res->id,
|
|||
|
|
]);
|
|||
|
|
$pid = $r->id;
|
|||
|
|
Profile::updateById($res->id, [
|
|||
|
|
\Profile::$IMAGE => $r->id,
|
|||
|
|
]);
|
|||
|
|
\Profile::remathCashback($pid);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
\Site::$theme::afterRegProfile($r->id,$data);
|
|||
|
|
} else {
|
|||
|
|
$res->e = 1;
|
|||
|
|
$res->m = V::get(Vars::$ACCOUNT_BUSY);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return $res;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
static function if_auth(){
|
|||
|
|
if($uid = intval($_COOKIE[ self::$cookieIDKey ]) and $hash = $_COOKIE[ self::$cookieHashKey ]) {
|
|||
|
|
$acc = self::getByID($uid);
|
|||
|
|
$res = strcmp($acc[self::$PASSWORD],$hash)==0;
|
|||
|
|
if($res) self::$data = $acc;
|
|||
|
|
return $res;
|
|||
|
|
} else if( \Core::$TOKEN ){
|
|||
|
|
$token = Token::getByHash(\Core::$TOKEN);
|
|||
|
|
if($token[Token::$PROFILE]){
|
|||
|
|
self::$data = self::getByID( $token[Token::$PROFILE] );
|
|||
|
|
return true;
|
|||
|
|
} else return false;
|
|||
|
|
} else return false;
|
|||
|
|
/*
|
|||
|
|
|
|||
|
|
if($uid = intval($_COOKIE[ self::$cookieIDKey ]) and $hash = $_COOKIE[ self::$cookieHashKey ]) {
|
|||
|
|
$acc = self::getByID($uid);
|
|||
|
|
$res = strcmp($acc[self::$PASSWORD],$hash)==0;
|
|||
|
|
if($res) self::$data = $acc;
|
|||
|
|
return $res;
|
|||
|
|
} else return false;
|
|||
|
|
/**/
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static function prepareLogin($login) {return trim(strtolower((string)$login));}
|
|||
|
|
static function preparePass($pass) {return trim((string)$pass);}
|
|||
|
|
|
|||
|
|
static function updatePass($acc,$pass){
|
|||
|
|
$acc[self::$PASSWORD] = $pass;
|
|||
|
|
$c = [self::$PASSWORD => self::hash($acc) ];
|
|||
|
|
self::updateById($acc[self::$ID], $c);
|
|||
|
|
}
|
|||
|
|
static function updateMyPass($acc,$pass){
|
|||
|
|
$acc[self::$PASSWORD] = $pass;
|
|||
|
|
$c = [self::$PASSWORD => self::hash($acc) ];
|
|||
|
|
self::updateById($acc[self::$ID], $c);
|
|||
|
|
Core::setCookie(self::$cookieIDKey,$acc[self::$ID]);
|
|||
|
|
Core::setCookie(self::$cookieHashKey,$c[self::$PASSWORD]);
|
|||
|
|
}
|
|||
|
|
static function loginByToken($hash){
|
|||
|
|
$token = Token::getByHash($hash);
|
|||
|
|
if(!$token) return false;
|
|||
|
|
$profile = self::getByID($token[Token::$PROFILE]);
|
|||
|
|
self::$data = $profile;
|
|||
|
|
Core::setCookie(self::$cookieIDKey, $profile[self::$ID]);
|
|||
|
|
Core::setCookie(self::$cookieHashKey,$profile[self::$PASSWORD]);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
static function login($login,$pass,$portal_id){
|
|||
|
|
$res = new stdClass();
|
|||
|
|
$portal_id = intval($portal_id);
|
|||
|
|
$res->e = 0;
|
|||
|
|
$res->m = '';
|
|||
|
|
$login = self::prepareLogin($login);
|
|||
|
|
$pass = self::preparePass($pass);
|
|||
|
|
$acc = null;
|
|||
|
|
if(!$login){
|
|||
|
|
$res->e = 1;
|
|||
|
|
$res->m = 'Введите логин';
|
|||
|
|
} else {
|
|||
|
|
if(!$pass){
|
|||
|
|
$res->e = 1;
|
|||
|
|
$res->m = 'Введите пароль';
|
|||
|
|
} else {
|
|||
|
|
$acc = self::getByLogin($login, $portal_id);
|
|||
|
|
|
|||
|
|
if($acc) {
|
|||
|
|
if(self::checkPassword($acc,$pass)){
|
|||
|
|
Core::setCookie(self::$cookieIDKey, $acc[self::$ID]);
|
|||
|
|
Core::setCookie(self::$cookieHashKey,$acc[self::$PASSWORD]);
|
|||
|
|
|
|||
|
|
if(Core::$IS_APP) {
|
|||
|
|
$hash = Token::getHash(0,$acc[self::$ID],\Site::$portal_id);
|
|||
|
|
$res->r = Token::insert([
|
|||
|
|
Token::$PROFILE => $acc[self::$ID],
|
|||
|
|
Token::$HASH => $hash,
|
|||
|
|
]);
|
|||
|
|
$res->token = $hash;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
shop::prepareProfile($acc[self::$ID]);
|
|||
|
|
|
|||
|
|
$res->id = $acc[self::$ID];
|
|||
|
|
|
|||
|
|
} else {
|
|||
|
|
$res->e = 1;
|
|||
|
|
$res->m = V::get(Vars::$WRONG_PASSWORD);
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
$res->e = 1;
|
|||
|
|
$res->m = V::get(Vars::$ACCOUNT_NOT_FOUND);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return $res;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static function add($values){
|
|||
|
|
$res = new stdClass();
|
|||
|
|
$res->e = 0;
|
|||
|
|
$res->m = '';
|
|||
|
|
$admin = self::getByLogin($values[ self::$LOGIN ],\site::$portal_id);
|
|||
|
|
if(!$admin) {
|
|||
|
|
$r = self::insert($values);
|
|||
|
|
$a = self::getByID($r->id);
|
|||
|
|
$c[self::$PASSWORD] = self::hash($a);
|
|||
|
|
self::updateById($r->id, $c);
|
|||
|
|
$res->id = $r->id;
|
|||
|
|
} else {
|
|||
|
|
$res->e = 1;
|
|||
|
|
$res->m = V::get(Vars::$ACCOUNT_BUSY);
|
|||
|
|
}
|
|||
|
|
return $res;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static function hash($acc){
|
|||
|
|
if(\site::$theme){
|
|||
|
|
$hash = \Site::$theme::getProfileAuthHash($acc);
|
|||
|
|
if($hash!=null) return $hash;
|
|||
|
|
}
|
|||
|
|
return md5(\Config::$SALT.\Config::$SALT.$acc[self::$ID].self::$CREATED.\Config::$SALT.$acc[self::$PASSWORD]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static function checkPassword($acc,$pass):bool{
|
|||
|
|
$hash = $acc[self::$PASSWORD];
|
|||
|
|
$acc[self::$PASSWORD] = $pass;
|
|||
|
|
return strcmp($hash, self::hash($acc) )===0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static function getByLogin(string $account,$portal_id = null){
|
|||
|
|
return DB::fetch(self::select( [Query::WHERE => new Where (Where::_and([
|
|||
|
|
Where::_operator(self::$LOGIN,'=',$account),
|
|||
|
|
$portal_id ? Where::_operator(self::$PORTAL,'=',$portal_id) : null,
|
|||
|
|
|
|||
|
|
]))] ));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static function getByNickname(string $nickname,$portal_id){
|
|||
|
|
return DB::fetch(self::select( [Query::WHERE => new Where (Where::_and([
|
|||
|
|
Where::_operator(self::$NICKNAME,'=',$nickname),
|
|||
|
|
Where::_operator(self::$PORTAL,'=',$portal_id),
|
|||
|
|
|
|||
|
|
]))] ));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static function remath($id){
|
|||
|
|
self::remathCashback($id);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static function remathCashback($id){
|
|||
|
|
$id = intval($id);
|
|||
|
|
// Сначала посчитаем списания
|
|||
|
|
$r = Cashback::select([
|
|||
|
|
\Query::SELECT => 'SUM('.Cashback::$VALUE.') as cc',
|
|||
|
|
\Query::WHERE => new \Where(\Where::_and([
|
|||
|
|
\Where::_operator(Cashback::$PROFILE,'=',$id),
|
|||
|
|
\Where::_operator(Cashback::$VALUE,'<',0),
|
|||
|
|
]))
|
|||
|
|
],false);
|
|||
|
|
$minus = \DB::fetch($r);
|
|||
|
|
$minus = floatval($minus['cc']);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Теперь посчитаем поступления, но только от оплаченных заказов
|
|||
|
|
$r = Cashback::select([
|
|||
|
|
\Query::LEFT_JOINS => [
|
|||
|
|
[Order::$table_name,Order::$ID,Cashback::$ORDER]
|
|||
|
|
],
|
|||
|
|
\Query::SELECT => 'SUM('.Cashback::$VALUE.') as cc',
|
|||
|
|
\Query::WHERE => new \Where(\Where::_and([
|
|||
|
|
\Where::_operator(Cashback::$PROFILE,'=',$id),
|
|||
|
|
\Where::_operator(Cashback::$VALUE,'>',0),
|
|||
|
|
\Where::_operator(Cashback::$ORDER,'<>',0),
|
|||
|
|
\Where::_operator(Order::$PAID,'=',1),
|
|||
|
|
]))
|
|||
|
|
],false);
|
|||
|
|
$plus = \DB::fetch($r);
|
|||
|
|
$plus = floatval($plus['cc']);
|
|||
|
|
|
|||
|
|
// Теперь посчитаем поступления, которые не связаны с заказом
|
|||
|
|
$r = Cashback::select([
|
|||
|
|
\Query::SELECT => 'SUM('.Cashback::$VALUE.') as cc',
|
|||
|
|
\Query::WHERE => new \Where(\Where::_and([
|
|||
|
|
\Where::_operator(Cashback::$PROFILE,'=',$id),
|
|||
|
|
\Where::_operator(Cashback::$ORDER,'=',0),
|
|||
|
|
\Where::_operator(Cashback::$VALUE,'>',0),
|
|||
|
|
]))
|
|||
|
|
],false);
|
|||
|
|
$plus2 = \DB::fetch($r);
|
|||
|
|
$plus2 = floatval($plus2['cc']);
|
|||
|
|
|
|||
|
|
|
|||
|
|
$r = Order::select([
|
|||
|
|
\Query::LEFT_JOINS => [
|
|||
|
|
[Shop::$table_name,Shop::$ID,Order::$OID],
|
|||
|
|
],
|
|||
|
|
\Query::SELECT => [
|
|||
|
|
'SUM('.Order::$TOTAL.') as cc',
|
|||
|
|
Shop::$CASHBACK_GROUP,
|
|||
|
|
Order::$PAID,
|
|||
|
|
],
|
|||
|
|
\Query::WHERE => new \Where(\Where::_and([
|
|||
|
|
\Where::_operator(Order::$PROFILE,'=',$id),
|
|||
|
|
// \Where::_operator(Order::$PAID,'=',1),
|
|||
|
|
])),
|
|||
|
|
\Query::GROUP_BY => [Shop::$CASHBACK_GROUP,Order::$PAID]
|
|||
|
|
]);
|
|||
|
|
while($l = \DB::fetch($r)){
|
|||
|
|
$group_id = $l[Shop::$CASHBACK_GROUP];
|
|||
|
|
if($group_id){
|
|||
|
|
CashbackProfile::setProfileGroupValue($id,$group_id,$l[Order::$PAID] ? $l['cc'] : 0);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$cashback = floatval($minus) + floatval($plus) + floatval($plus2) ;
|
|||
|
|
self::updateById($id,[
|
|||
|
|
self::$CASHBACK=>$cashback
|
|||
|
|
]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static function getTitle(){return V::get(Vars::$MODULE_NAME);}
|
|||
|
|
static function getSystemLangValues():array{return Vars::getArray(); }
|
|||
|
|
public function _update(\Where $w, array $values) {
|
|||
|
|
$values[self::$UPDATED] = time();
|
|||
|
|
return parent::_update($w, $values);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static function isMy($id){
|
|||
|
|
$res = false;
|
|||
|
|
$C = $id?static::getById($id):null;
|
|||
|
|
if($C){
|
|||
|
|
$res = boolval(\ms\Portal::isMy($C[self::$PORTAL]));
|
|||
|
|
}
|
|||
|
|
return $res?$C:false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static function getEditTabs($values=[])
|
|||
|
|
{
|
|||
|
|
$id = $values[self::$ID];
|
|||
|
|
|
|||
|
|
return
|
|||
|
|
[
|
|||
|
|
[
|
|||
|
|
eTab::NAME => 'Редактировать',
|
|||
|
|
eTab::TYPE => eTabType::FORM,
|
|||
|
|
eTab::CONTENT => function ($values = []) {
|
|||
|
|
return self::_getForm($values, static::getFormOptions($values));
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
[
|
|||
|
|
eTab::NAME=>'Кэшбек',
|
|||
|
|
eTab::TYPE=>eTabType::TABLE,
|
|||
|
|
eTab::CONTENT=>function($values=[]){
|
|||
|
|
$id = $values[self::$ID];
|
|||
|
|
|
|||
|
|
$o = [
|
|||
|
|
\Query::WHERE=>new \Where(\Where::_operator(Cashback::$PROFILE,'=',$id)),
|
|||
|
|
\ModuleTable::TABLE_ID => self::$table_name.'_'.Cashback::$table_name.'_'.$id,
|
|||
|
|
\ModuleTable::ROW_CLICK=>eRowClick::CARD,
|
|||
|
|
\ModuleTable::FORM_INIT_DATA=>[
|
|||
|
|
Cashback::$PROFILE => $id,
|
|||
|
|
Cashback::$ORDER => 0,
|
|||
|
|
],
|
|||
|
|
//\ModuleTable::NO_CHECKBOX=>true,
|
|||
|
|
//\ModuleTable::HIDE_TITLE=>true,
|
|||
|
|
];
|
|||
|
|
return boolval($values['justData']) ? Cashback::getTableData( $o ) : Cashback::drawTable( $o );
|
|||
|
|
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static function getForm($values = [], $options = []) :array {
|
|||
|
|
|
|||
|
|
$isNew = !boolval($values[self::$ID]);
|
|||
|
|
return [
|
|||
|
|
self::getCommonFormInputs(),
|
|||
|
|
$isNew?[
|
|||
|
|
Form::VIEW =>Form::INPUT,
|
|||
|
|
Form::KEY_VALUE =>self::$PORTAL,
|
|||
|
|
Form::TYPE =>eInputType::HIDDEN,
|
|||
|
|
]:null,
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
[
|
|||
|
|
Form::VIEW=>Form::ROW,
|
|||
|
|
Form::COLS => [
|
|||
|
|
[
|
|||
|
|
Form::VIEW => Form::INPUT,
|
|||
|
|
Form::COL_CLASSES => 'c',
|
|||
|
|
Form::KEY_VALUE => self::$IMAGE,
|
|||
|
|
Form::TYPE => eInputType::IMAGE,
|
|||
|
|
Form::INPUT_OPT => [
|
|||
|
|
Input::PLACEHOLDER => $c = V::get(Vars::$IMAGE),
|
|||
|
|
Input::LABEL => $c,
|
|||
|
|
Input::SRC => ($c = $values[self::$IMAGE]) ? Image::imageResize(Image::getByID($c)[Image::$URL],600,0,100) : '',
|
|||
|
|
],
|
|||
|
|
],
|
|||
|
|
]
|
|||
|
|
],
|
|||
|
|
|
|||
|
|
[
|
|||
|
|
Form::VIEW=>Form::TITLE,
|
|||
|
|
Form::TITLE_TEXT => '<b>Данные для авторизации</b><br>При смене этих данных пользователю понадобится авторизовываться заново',
|
|||
|
|
],
|
|||
|
|
[
|
|||
|
|
Form::VIEW=>Form::ROW,
|
|||
|
|
Form::COLS => [
|
|||
|
|
|
|||
|
|
[
|
|||
|
|
Form::VIEW =>Form::INPUT,
|
|||
|
|
Form::COL_CLASSES =>'c c-50',
|
|||
|
|
Form::KEY_VALUE =>self::$LOGIN,
|
|||
|
|
Form::TYPE =>eInputType::TEXT,
|
|||
|
|
Form::INPUT_OPT => [
|
|||
|
|
Input::PLACEHOLDER => $c = V::get(Vars::$LOGIN),
|
|||
|
|
Input::LABEL => $c.($isNew?'':'<br><b>При смене логина, указывайте и новый пароль</b>'),
|
|||
|
|
],
|
|||
|
|
],
|
|||
|
|
[
|
|||
|
|
Form::VIEW =>Form::INPUT,
|
|||
|
|
Form::COL_CLASSES =>'c c-50',
|
|||
|
|
Form::TYPE =>eInputType::TEXT,
|
|||
|
|
Form::INPUT_OPT => [
|
|||
|
|
Input::PLACEHOLDER => $c = V::get(Vars::$PASSWORD),
|
|||
|
|
Input::LABEL => $c.($isNew?'':'<br><b>Вводить, только если надо поменять пароль, или меняется логин</b>'),
|
|||
|
|
Input::VALUE => '',
|
|||
|
|
Input::NAME => 'password',
|
|||
|
|
],
|
|||
|
|
],
|
|||
|
|
],
|
|||
|
|
],
|
|||
|
|
[
|
|||
|
|
Form::VIEW=>Form::TITLE,
|
|||
|
|
Form::TITLE_TEXT => '<b>Личные данные</b>',
|
|||
|
|
],
|
|||
|
|
[
|
|||
|
|
Form::VIEW=>Form::ROW,
|
|||
|
|
Form::COLS => [
|
|||
|
|
[
|
|||
|
|
Form::VIEW =>Form::INPUT,
|
|||
|
|
Form::COL_CLASSES =>'c c-1-3',
|
|||
|
|
Form::KEY_VALUE =>self::$EMAIL,
|
|||
|
|
Form::TYPE =>eInputType::TEXT,
|
|||
|
|
Form::INPUT_OPT => [
|
|||
|
|
Input::PLACEHOLDER => $c = V::get(Vars::$EMAIL),
|
|||
|
|
Input::LABEL => $c,
|
|||
|
|
],
|
|||
|
|
],
|
|||
|
|
[
|
|||
|
|
Form::VIEW =>Form::INPUT,
|
|||
|
|
Form::COL_CLASSES =>'c c-1-3',
|
|||
|
|
Form::KEY_VALUE =>self::$PHONE,
|
|||
|
|
Form::TYPE =>eInputType::TEXT,
|
|||
|
|
Form::INPUT_OPT => [
|
|||
|
|
Input::PLACEHOLDER => $c = V::get(Vars::$PHONE),
|
|||
|
|
Input::LABEL => $c,
|
|||
|
|
],
|
|||
|
|
],
|
|||
|
|
],
|
|||
|
|
],
|
|||
|
|
|
|||
|
|
[
|
|||
|
|
Form::VIEW=>Form::ROW,
|
|||
|
|
Form::COLS => [
|
|||
|
|
[
|
|||
|
|
Form::VIEW =>Form::INPUT,
|
|||
|
|
Form::COL_CLASSES =>'c c-1-3',
|
|||
|
|
Form::KEY_VALUE =>self::$SNAME,
|
|||
|
|
Form::TYPE =>eInputType::TEXT,
|
|||
|
|
Form::INPUT_OPT => [
|
|||
|
|
Input::PLACEHOLDER => $c = V::get(Vars::$SNAME),
|
|||
|
|
Input::LABEL => $c,
|
|||
|
|
],
|
|||
|
|
],
|
|||
|
|
[
|
|||
|
|
Form::VIEW =>Form::INPUT,
|
|||
|
|
Form::COL_CLASSES =>'c c-1-3',
|
|||
|
|
Form::KEY_VALUE =>self::$NAME,
|
|||
|
|
Form::TYPE =>eInputType::TEXT,
|
|||
|
|
Form::INPUT_OPT => [
|
|||
|
|
Input::PLACEHOLDER => $c = V::get(Vars::$NAME),
|
|||
|
|
Input::LABEL => $c,
|
|||
|
|
],
|
|||
|
|
],
|
|||
|
|
[
|
|||
|
|
Form::VIEW =>Form::INPUT,
|
|||
|
|
Form::COL_CLASSES =>'c c-1-3',
|
|||
|
|
Form::KEY_VALUE =>self::$FNAME,
|
|||
|
|
Form::TYPE =>eInputType::TEXT,
|
|||
|
|
Form::INPUT_OPT => [
|
|||
|
|
Input::PLACEHOLDER => $c = V::get(Vars::$FNAME),
|
|||
|
|
Input::LABEL => $c,
|
|||
|
|
],
|
|||
|
|
],
|
|||
|
|
]
|
|||
|
|
],
|
|||
|
|
[
|
|||
|
|
Form::VIEW=>Form::ROW,
|
|||
|
|
Form::COLS => [
|
|||
|
|
[
|
|||
|
|
Form::VIEW =>Form::INPUT,
|
|||
|
|
Form::COL_CLASSES =>'c c-1-3',
|
|||
|
|
Form::KEY_VALUE =>self::$SALE_PERCENT,
|
|||
|
|
Form::TYPE =>eInputType::TEXT,
|
|||
|
|
Form::INPUT_OPT => [
|
|||
|
|
Input::PLACEHOLDER => $c = V::get(Vars::$SALE_PERCENT),
|
|||
|
|
Input::LABEL => $c,
|
|||
|
|
],
|
|||
|
|
],
|
|||
|
|
]
|
|||
|
|
],
|
|||
|
|
self::getCommonFormSubmits($values),
|
|||
|
|
];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static function columnInfo() : array {
|
|||
|
|
return [
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME =>&self::$ID,
|
|||
|
|
C::TYPE =>eColumnType::INT,
|
|||
|
|
C::AUTO_INCREMENT =>true,
|
|||
|
|
C::PRIMARY =>true,
|
|||
|
|
C::DEFAULT =>0,
|
|||
|
|
// C::HIDDEN =>true,
|
|||
|
|
C::FILTER_TYPE => eFilterType::NUMBER,
|
|||
|
|
C::TH =>function(){return V::get(Vars::$ID);},
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME => &self::$CART,
|
|||
|
|
C::TYPE => eColumnType::INT,
|
|||
|
|
C::HIDDEN => true,
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME => &self::$IMAGE,
|
|||
|
|
C::TYPE => eColumnType::INT,
|
|||
|
|
C::LENGTH => 11,
|
|||
|
|
C::DEFAULT => 0,
|
|||
|
|
C::HIDDEN => true,
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME => &self::$NAME,
|
|||
|
|
C::TYPE => eColumnType::VARCHAR,
|
|||
|
|
C::LENGTH => 255,
|
|||
|
|
C::TH => function(){return V::get(Vars::$NAME);},
|
|||
|
|
C::FILTER_TYPE => eFilterType::TEXT,
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME => &self::$SNAME,
|
|||
|
|
C::TYPE => eColumnType::VARCHAR,
|
|||
|
|
C::LENGTH => 255,
|
|||
|
|
C::TH => function(){return V::get(Vars::$SNAME);},
|
|||
|
|
C::FILTER_TYPE => eFilterType::TEXT,
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME => &self::$FNAME,
|
|||
|
|
C::TYPE => eColumnType::VARCHAR,
|
|||
|
|
C::LENGTH => 255,
|
|||
|
|
C::TH => function(){return V::get(Vars::$FNAME);},
|
|||
|
|
C::FILTER_TYPE => eFilterType::TEXT,
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME => &self::$PHONE,
|
|||
|
|
C::TYPE => eColumnType::VARCHAR,
|
|||
|
|
C::LENGTH => 255,
|
|||
|
|
C::TH => function(){return V::get(Vars::$PHONE);},
|
|||
|
|
C::FILTER_TYPE => eFilterType::TEXT,
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME => &self::$LOGIN,
|
|||
|
|
C::TYPE => eColumnType::VARCHAR,
|
|||
|
|
C::LENGTH => 63,
|
|||
|
|
C::TH => function(){return V::get(Vars::$LOGIN);},
|
|||
|
|
C::FILTER_TYPE => eFilterType::TEXT,
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME => &self::$EMAIL,
|
|||
|
|
C::TYPE => eColumnType::VARCHAR,
|
|||
|
|
C::LENGTH => 255,
|
|||
|
|
C::TH => function(){return V::get(Vars::$EMAIL);},
|
|||
|
|
C::FILTER_TYPE => eFilterType::TEXT,
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME => &self::$CITY,
|
|||
|
|
C::TYPE => eColumnType::TEXT,
|
|||
|
|
C::DEFAULT => '',
|
|||
|
|
C::HIDDEN => true,
|
|||
|
|
C::TH => function(){return V::get(Vars::$CITY);},
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME => &self::$NICKNAME,
|
|||
|
|
C::TYPE => eColumnType::TEXT,
|
|||
|
|
C::DEFAULT => '',
|
|||
|
|
C::HIDDEN => true,
|
|||
|
|
C::TH => function(){return V::get(Vars::$NICKNAME);},
|
|||
|
|
C::FILTER_TYPE => eFilterType::TEXT,
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME => &self::$PASSWORD,
|
|||
|
|
C::TYPE => eColumnType::VARCHAR,
|
|||
|
|
C::LENGTH => 63,
|
|||
|
|
C::TH => function(){return V::get(Vars::$PASSWORD);},
|
|||
|
|
C::HIDDEN => true,
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME => &self::$BDATE,
|
|||
|
|
C::TYPE => eColumnType::DATE,
|
|||
|
|
C::HIDDEN => true,
|
|||
|
|
C::NULL => true,
|
|||
|
|
//C::DEFAULT => '0000-00-00',
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME => &self::$CASHBACK,
|
|||
|
|
C::TYPE => eColumnType::DOUBLE,
|
|||
|
|
C::TH => function(){return V::get(Vars::$CASHBACK);},
|
|||
|
|
//C::HIDDEN => true,
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME => &self::$SALE_PERCENT,
|
|||
|
|
C::TYPE => eColumnType::DOUBLE,
|
|||
|
|
C::DEFAULT => 0,
|
|||
|
|
C::TH => function(){return V::get(Vars::$SALE_PERCENT);},
|
|||
|
|
//C::HIDDEN => true,
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME => &self::$PORTAL,
|
|||
|
|
C::TYPE => eColumnType::INT,
|
|||
|
|
C::TH => function(){return V::get(Vars::$PORTAL);},
|
|||
|
|
C::HIDDEN => true,
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME => &self::$CREATED,
|
|||
|
|
C::TYPE => eColumnType::INT,
|
|||
|
|
C::LENGTH => 11,
|
|||
|
|
C::TH => function(){return V::get(Vars::$CREATED);},
|
|||
|
|
C::DEFAULT => time(),
|
|||
|
|
c::FUNC_VALUE => function($v){return self::formatDate($v[self::$CREATED]);},
|
|||
|
|
c::HIDDEN=>true,
|
|||
|
|
]),
|
|||
|
|
new C([
|
|||
|
|
C::VAR_NAME => &self::$UPDATED,
|
|||
|
|
C::TYPE => eColumnType::INT,
|
|||
|
|
C::DEFAULT => time(),
|
|||
|
|
C::TH => function(){return V::get(Vars::$UPDATED);},
|
|||
|
|
c::FUNC_VALUE => function($v){return self::formatDate($v[self::$UPDATED]);},
|
|||
|
|
c::HIDDEN=>true,
|
|||
|
|
]),
|
|||
|
|
];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
new Profile();
|
|||
|
|
|