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 => 'Данные для авторизации
При смене этих данных пользователю понадобится авторизовываться заново',
],
[
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?'':'
При смене логина, указывайте и новый пароль'),
],
],
[
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?'':'
Вводить, только если надо поменять пароль, или меняется логин'),
Input::VALUE => '',
Input::NAME => 'password',
],
],
],
],
[
Form::VIEW=>Form::TITLE,
Form::TITLE_TEXT => 'Личные данные',
],
[
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();