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