meraproject/module/core/user/profile/model.php
keboss-m 5c21d25d45 Initial commit: Merakomis portal, Docker stack and user-reader API.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-24 11:04:05 +03:00

836 lines
32 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?
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();