355 lines
13 KiB
PHP
355 lines
13 KiB
PHP
<?
|
||
namespace soft\subscribe;
|
||
|
||
use common\Image;
|
||
use core\db\structure\Column as C;
|
||
use core\db\structure\eColumnType;
|
||
use core\site\Theme;
|
||
use ModuleBZ\Form\Input\ImagePicker;
|
||
use ModuleBZ\Form\Input\Select;
|
||
use ModuleBZ\Form\Input\Switcher;
|
||
use ModuleBZ\Form\Input\Text;
|
||
use ModuleBZ\Form\Input\Textarea;
|
||
use ModuleBZ\Layout\Row;
|
||
use soft\Subscribe;
|
||
use soft\subscribe\group\Soft as GroupSoft;
|
||
use soft\soft;
|
||
use core\lang\structure\LangVariable as V;
|
||
use ms\ms\structure\msModuleTable;
|
||
use soft\subscribe\group\structure\softSubscribeGroupLang as Vars;
|
||
use soft\Subscribe\structure\ESoftSubscribeStatus;
|
||
|
||
|
||
class Group extends msModuleTable {
|
||
static $self;
|
||
static $table_name = 'softSubscribeGroup';
|
||
static $controller = 'soft.subscribe.group';
|
||
|
||
static $easy_left_joins;
|
||
|
||
static $ID = 'id';
|
||
static $NAME = 'name';
|
||
static $IMAGE = 'image';
|
||
static $TEXT_ID = 'text_id';
|
||
static $ANNOTATION = 'annotation';
|
||
static $DESCRIPTION = 'description';
|
||
static $ACTIVE = 'active';
|
||
static $SUPER = 'super';
|
||
static $OLD = 'old'; // Старая цена
|
||
static $TOTAL = 'total'; // Общая стоимость
|
||
static $PORTAL = 'portal';
|
||
static $ARCHIVE = 'archive';
|
||
static $ACCOUNT = 'account';
|
||
static $CREATED = 'created';
|
||
static $UPDATED = 'updated';
|
||
|
||
// Псевдостолбцы
|
||
static $SALE = 'sale';
|
||
|
||
|
||
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 function __construct($install_id = null) {
|
||
parent::__construct($install_id);
|
||
static::$easy_left_joins =[
|
||
[Image::$table_name,image::$ID,self::$IMAGE]
|
||
];
|
||
}
|
||
|
||
public function _deleteByIDS(array $ids) {
|
||
self::updateByIds($ids,[self::$ARCHIVE=>1]);
|
||
}
|
||
|
||
static function remath($id){
|
||
$id = intval($id);
|
||
$C = self::getByID($id);
|
||
if($C[self::$SUPER]) return;
|
||
$r = GroupSoft::select([
|
||
\Query::SELECT => [
|
||
'SUM('.Soft::$PRICE.') as old',
|
||
'SUM('.GroupSoft::$PRICE.') as total',
|
||
],
|
||
\Query::WHERE => new \Where(\Where::_and([
|
||
\Where::_operator(GroupSoft::$GROUP,'=',$id)
|
||
])),
|
||
]);
|
||
$l = \DB::fetch($r);
|
||
self::updateById($id,[
|
||
self::$OLD => cfloatval($l['old']),
|
||
self::$TOTAL => cfloatval($l['total']),
|
||
]);
|
||
}
|
||
|
||
public static function afterUadd($values, $id, $result) {
|
||
parent::afterUadd($values, $id, $result);
|
||
self::remath($id);
|
||
}
|
||
|
||
static function isSubscribed($group_id,$pid = PID):bool{
|
||
$group_id = intval($group_id);
|
||
$pid = intval($pid);
|
||
$r = Subscribe::select([
|
||
\Query::SELECT => ['COUNT('.Subscribe::$ID.') as cc'],
|
||
\Query::WHERE => new \Where(\Where::_and([
|
||
\Where::_operator(Subscribe::$PROFILE,'=',$pid),
|
||
\Where::_operator(Subscribe::$GROUP,'=',$group_id),
|
||
\Where::_in(Subscribe::$ARCHIVE,[
|
||
ESoftSubscribeStatus::ACTIVE,
|
||
ESoftSubscribeStatus::PAUSE,
|
||
])
|
||
]))
|
||
]);
|
||
$l = \DB::fetch($r);
|
||
return intval($l['cc'])>0;
|
||
}
|
||
|
||
|
||
static function canSubscribe($v,$pid = PID){
|
||
$errors = [];
|
||
if(!IF_PROFILE) {
|
||
//$errors[] = "Вы не авторизованы";
|
||
}
|
||
else{
|
||
if(Subscribe::hasSuperSubscribe($pid)){
|
||
$errors[] = 'У вас есть супер подписка, которая даёт доступ ко всем программам';
|
||
}
|
||
}
|
||
if(!$v[self::$ACTIVE]){
|
||
$errors[] = 'Набор программ пока формируется и ещё не доступна для продажи';
|
||
}
|
||
if($v[self::$ARCHIVE]){
|
||
$errors[] = 'Набор программ находится в архиве и уже не доступен для продажи';
|
||
}
|
||
return [
|
||
'result' => count($errors)==0,
|
||
'errors' => $errors,
|
||
];
|
||
}
|
||
|
||
|
||
public static function getFormInputs(\ModuleBZ\Form &$form, array $data, $C, bool $isEdit) {
|
||
$img = null;
|
||
if($c = $C[self::$IMAGE]) $img = Image::getByID($c);
|
||
|
||
$form
|
||
->addInput((new ImagePicker())
|
||
->setName(self::$IMAGE)
|
||
->setLabel(V::get(Vars::$IMAGE))
|
||
->setClassAll('c-1-3')
|
||
->setUploadUrl(\Site::sectionUrl(substr(Image::UPLOAD_URL_ACCOUNT,1),true))
|
||
// TODO: Удалить
|
||
->setAjaxData(['token'=>1])
|
||
->setSrc($img?$img[Image::$URL]:'')
|
||
->setValue($C[self::$IMAGE])
|
||
)
|
||
->addRow((new Row())
|
||
->addColumn(((new Text())
|
||
->setName(self::$NAME)
|
||
->setValue($C[self::$NAME])
|
||
->setClassAll('c-50')
|
||
->setLabel(V::get(Vars::$NAME))
|
||
->setPlaceholder(V::get(Vars::$NAME))
|
||
))
|
||
->addColumn(((new Text())
|
||
->setName(self::$TEXT_ID)
|
||
->setValue($C[self::$TEXT_ID])
|
||
->setClassAll('c-50')
|
||
->setLabel(V::get(Vars::$TEXT_ID))
|
||
->setPlaceholder(V::get(Vars::$TEXT_ID))
|
||
))
|
||
)
|
||
->addRow((new Row())
|
||
->addColumn(((new Switcher())
|
||
->setName(self::$ACTIVE)
|
||
->setChecked(boolval($C[self::$ACTIVE]))
|
||
->setClassAll('c')
|
||
->setPlaceholder(V::get(Vars::$ACTIVE))
|
||
))
|
||
->addColumn(((new Switcher())
|
||
->setName(self::$ARCHIVE)
|
||
->setChecked(boolval($C[self::$ARCHIVE]))
|
||
->setClassAll('c')
|
||
->setPlaceholder(V::get(Vars::$ARCHIVE))
|
||
))
|
||
->addColumn(((new Switcher())
|
||
->setName(self::$SUPER)
|
||
->setChecked(boolval($C[self::$SUPER]))
|
||
->setClassAll('c')
|
||
->setPlaceholder(V::get(Vars::$SUPER))
|
||
))
|
||
)
|
||
->addRow((new Row())
|
||
->addColumn(((new Text())
|
||
->setName(self::$OLD)
|
||
->setValue($C[self::$OLD])
|
||
->setClassAll('c-50')
|
||
->setLabel(V::get(Vars::$OLD))
|
||
->setPlaceholder(V::get(Vars::$OLD))
|
||
))
|
||
->addColumn(((new Text())
|
||
->setName(self::$TOTAL)
|
||
->setValue($C[self::$TOTAL])
|
||
->setClassAll('c-50')
|
||
->setLabel(V::get(Vars::$TOTAL))
|
||
->setPlaceholder(V::get(Vars::$TOTAL))
|
||
))
|
||
)
|
||
->addInput((new Textarea())
|
||
->setName(self::$ANNOTATION)
|
||
->setLabel(V::get(Vars::$ANNOTATION))
|
||
->setValue($C[self::$ANNOTATION])
|
||
//->setIsHtmlEditor(true)
|
||
//->setTinyMCEImageUploadUrl(\Site::$theme::getTinyMCEImageUploadUrl())
|
||
//->setTinyMCEApiKey(\Site::$theme::getTinyMCEApiKey())
|
||
)
|
||
->addInput((new Textarea())
|
||
->setName(self::$DESCRIPTION)
|
||
->setLabel(V::get(Vars::$DESCRIPTION))
|
||
->setValue($C[self::$DESCRIPTION])
|
||
->setIsHtmlEditor(true)
|
||
->setTinyMCEImageUploadUrl(\Site::$theme::getTinyMCEImageUploadUrl())
|
||
->setTinyMCEApiKey(\Site::$theme::getTinyMCEApiKey())
|
||
)
|
||
;
|
||
}
|
||
|
||
|
||
|
||
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::TH =>V::get(Vars::$ID),
|
||
]),
|
||
new C([
|
||
C::VAR_NAME => &self::$IMAGE,
|
||
C::TYPE => eColumnType::INT,
|
||
C::TH => V::get(Vars::$IMAGE),
|
||
C::FUNC_VALUE_DATA => function($v){
|
||
return Image::imageResize($v[Image::$URL],40,40,90,['crop'=>'center']);
|
||
}
|
||
]),
|
||
new C([
|
||
C::VAR_NAME => &self::$NAME,
|
||
C::TYPE => eColumnType::VARCHAR,
|
||
C::LENGTH => 1023,
|
||
C::TH => V::get(Vars::$NAME),
|
||
]),
|
||
new C([
|
||
C::VAR_NAME => &self::$TEXT_ID,
|
||
C::TYPE => eColumnType::VARCHAR,
|
||
C::LENGTH => 63,
|
||
C::TH => V::get(Vars::$TEXT_ID),
|
||
]),
|
||
|
||
new C([
|
||
C::VAR_NAME => &self::$ANNOTATION,
|
||
C::TYPE => eColumnType::TEXT,
|
||
C::HIDDEN => true,
|
||
C::TH => V::get(Vars::$ANNOTATION),
|
||
]),
|
||
new C([
|
||
C::VAR_NAME => &self::$DESCRIPTION,
|
||
C::TYPE => eColumnType::LONGTEXT,
|
||
C::HIDDEN => true,
|
||
C::TH => V::get(Vars::$DESCRIPTION),
|
||
]),
|
||
new C([
|
||
C::VAR_NAME => &self::$ACTIVE,
|
||
C::TYPE => eColumnType::TINYINT,
|
||
C::DEFAULT => 0,
|
||
C::LENGTH => 1,
|
||
C::TH => V::get(Vars::$ACTIVE),
|
||
]),
|
||
new C([
|
||
C::VAR_NAME => &self::$SUPER,
|
||
C::TYPE => eColumnType::TINYINT,
|
||
C::DEFAULT => 0,
|
||
C::LENGTH => 1,
|
||
C::TH => V::get(Vars::$SUPER),
|
||
]),
|
||
new C([
|
||
C::VAR_NAME => &self::$OLD,
|
||
C::TYPE => eColumnType::DOUBLE,
|
||
C::LENGTH => '10,2',
|
||
C::TH => V::get(Vars::$OLD),
|
||
]),
|
||
new C([
|
||
C::VAR_NAME => &self::$TOTAL,
|
||
C::TYPE => eColumnType::DOUBLE,
|
||
C::LENGTH => '10,2',
|
||
C::TH => V::get(Vars::$TOTAL),
|
||
]),
|
||
new C([
|
||
C::VAR_NAME => &self::$SALE,
|
||
C::TYPE => eColumnType::NONE,
|
||
C::TH => V::get(Vars::$SALE),
|
||
C::FUNC_VALUE_DATA => function($v){
|
||
return number_format((1 - $v[self::$TOTAL]/$v[self::$OLD])*100,0).'%';
|
||
}
|
||
]),
|
||
new C([
|
||
C::VAR_NAME => &self::$PORTAL,
|
||
C::TYPE => eColumnType::INT,
|
||
C::HIDDEN => true,
|
||
C::DEFAULT => intval(\Site::$portal_id)
|
||
]),
|
||
|
||
new C([
|
||
C::VAR_NAME => &self::$ARCHIVE,
|
||
C::TYPE => eColumnType::TINYINT,
|
||
C::DEFAULT => 0,
|
||
C::TH => V::get(Vars::$ARCHIVE),
|
||
]),
|
||
|
||
|
||
new C([
|
||
C::VAR_NAME => &self::$ACCOUNT,
|
||
C::TYPE => eColumnType::INT,
|
||
C::LENGTH => 11,
|
||
C::TH => V::get(Vars::$ACCOUNT),
|
||
C::DEFAULT => intval(\Site::$owner_id),
|
||
c::HIDDEN=>true,
|
||
c::FUNC_VALUE => function($v){
|
||
if($id = $v[self::$ACCOUNT]) {
|
||
return \Account::getName( \Account::getByID($id) );
|
||
} else return '-';
|
||
},
|
||
]),
|
||
new C([
|
||
C::VAR_NAME => &self::$CREATED,
|
||
C::TYPE => eColumnType::INT,
|
||
C::LENGTH => 11,
|
||
C::TH => 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 => V::get(Vars::$UPDATED),
|
||
c::FUNC_VALUE => function($v){return self::formatDate($v[self::$UPDATED]);},
|
||
c::HIDDEN=>true,
|
||
]),
|
||
];
|
||
}
|
||
|
||
}
|
||
new Group();
|
||
|
||
|
||
///
|
||
|