diff --git a/application/modules/backend/views/scripts/index/index.phtml b/application/modules/backend/views/scripts/index/index.phtml
index 4e7a37ea3..5ab8221c5 100644
--- a/application/modules/backend/views/scripts/index/index.phtml
+++ b/application/modules/backend/views/scripts/index/index.phtml
@@ -1,168 +1,174 @@
.
**/
$modelCategory = new Default_Model_ProjectCategory();
$this->categories = $modelCategory->fetchTreeForView(22);
$jsonTree = json_encode($this->categories);
?>
= $this->partial('yui.phtml'); ?>
#number of months back
2
3
4
5
6
7
8
9
10
11
12
+
+
diff --git a/application/modules/default/controllers/UserController.php b/application/modules/default/controllers/UserController.php
index 83a6635e3..80b54f01b 100644
--- a/application/modules/default/controllers/UserController.php
+++ b/application/modules/default/controllers/UserController.php
@@ -1,794 +1,796 @@
.
**/
class UserController extends Local_Controller_Action_DomainSwitch
{
protected $_memberId;
protected $_userName;
/** @var Zend_Db_Table_Row */
protected $_memberSettings;
public function init()
{
parent::init();
if ($this->hasParam('user_name')) {
$this->_userName = $this->getParam('user_name');
$this->_userName = urldecode($this->_userName);
$modelMember = new Default_Model_Member();
$this->_memberId = $modelMember->fetchActiveUserByUsername($this->_userName);
} else {
$this->_memberId = (int)$this->getParam('member_id');
}
}
public function indexAction()
{
$this->_helper->viewRenderer('aboutme');
$this->aboutmeAction();
}
public function aboutmeAction()
{
$tableMember = new Default_Model_Member();
$tableProject = new Default_Model_Project();
$earnModel = new Default_Model_StatDownload();
$helperUserRole = new Backend_View_Helper_UserRole();
$pageLimit = 500;
$projectpage = (int)$this->getParam('projectpage', 1);
$this->view->authMember = $this->_authMember;
//$this->view->member = $tableMember->find($this->_memberId)->current();
$this->view->member = $tableMember->fetchMemberData($this->_memberId);
if (null == $this->view->member) {
$this->redirect("/");
}
if ($this->view->member->is_deleted == 1 or $this->view->member->is_active == 0) {
$this->redirect("/");
}
$this->view->mainProject = $this->view->member->findDependentRowset($tableProject, 'MainProject')->current();
$this->view->userProjectCategories = $tableProject->getUserCreatingCategorys($this->_memberId);
$this->view->aboutmeUserInfo = $this->getAboutmeUserInfo($this->_memberId,$this->view->member->username);
$userRoleName = $helperUserRole->userRole();
if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) {
-
- $amount = $earnModel->getMonthEarn($this->_memberId,201812);
+ $datetime = new DateTime();
+ $datetime->sub(new DateInterval('P1M'));
+ $month = $datetime->format('Ym');
+ $amount = $earnModel->getMonthEarn($this->_memberId,$month);
if($amount && $amount['amount'])
{
$this->view->earnInfo = ' Last month I earned $'.$amount['amount'].'.';
}else
{
$this->view->earnInfo=' Last month I earned 0.';
}
}else{
$this->view->earnInfo='';
}
// ajax load more products
if ($this->getParam('projectpage', null)) {
$total_records = $tableProject->countAllProjectsForMemberCatFilter($this->_memberId, true, null);
$this->view->pageLimit = $pageLimit;
$this->view->projectpage = $projectpage;
$this->view->total_records = $total_records;
// get last project category id
$lastproject = $tableProject->getUserActiveProjects($this->_memberId, 1, (($projectpage - 1) * $pageLimit-1));
foreach ($lastproject as $value) {
$this->view->lastcatid = $value['project_category_id'];
}
$this->view->userProducts =
$tableProject->getUserActiveProjects($this->_memberId, $pageLimit, ($projectpage - 1) * $pageLimit);
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer('partials/aboutmeProducts');
//$this->forward('showmoreproductsajax', 'user', null, $this->getAllParams());
return;
} else {
$total_records = $tableProject->countAllProjectsForMemberCatFilter($this->_memberId, true, null);
$this->view->pageLimit = $pageLimit;
$this->view->projectpage = $projectpage;
$this->view->total_records = $total_records;
//$this->view->userProducts = $tableProject->fetchAllProjectsForMember($this->_memberId, $pageLimit, ($projectpage - 1) * $pageLimit,true);
$this->view->userProducts =
$tableProject->getUserActiveProjects($this->_memberId, $pageLimit, ($projectpage - 1) * $pageLimit);
$this->view->userFeaturedProducts = $tableProject->fetchAllFeaturedProjectsForMember($this->_memberId);
$paginationComments = $tableMember->fetchComments($this->_memberId);
if ($paginationComments) {
$offset = (int)$this->getParam('page');
$paginationComments->setItemCountPerPage(50);
$paginationComments->setCurrentPageNumber($offset);
$this->view->comments = $paginationComments;
}
// favs Currently no paging...
$this->view->paramLikePageId = (int)$this->getParam('likepage');
$model = new Default_Model_DbTable_ProjectFollower();
$offset = $this->view->paramLikePageId;
$list = $model->fetchLikesForMember($this->_memberId);
$list->setItemCountPerPage(1000);
$list->setCurrentPageNumber($offset);
$this->view->likes = $list;
// plings Currently no paging...
$plingmodel = new Default_Model_ProjectPlings();
$offset = null;
$plist = $plingmodel->fetchPlingsForMember($this->_memberId);
$plist->setItemCountPerPage(1000);
$plist->setCurrentPageNumber($offset);
$this->view->plings = $plist;
// plings Currently no paging...
$plingmodel = new Default_Model_ProjectPlings();
$offset = null;
$pslist = $plingmodel->fetchPlingsForSupporter($this->_memberId);
$pslist->setItemCountPerPage(1000);
$pslist->setCurrentPageNumber($offset);
$this->view->supportersplings = $pslist;
// rated
$ratemodel = new Default_Model_DbTable_ProjectRating();
$this->view->rated = $ratemodel->getRatedForMember($this->_memberId);
$stat = array();
$stat['cntProducts'] = $total_records;
if ($this->view->userFeaturedProducts) {
$cnt = 0;
foreach ($this->view->userFeaturedProducts as $tmp) {
$cnt++;
}
$stat['cntFProducts'] = $cnt;
} else {
$stat['cntFProducts'] = 0;
}
$stat['cntComments'] = $paginationComments->getTotalItemCount();
$tblFollower = new Default_Model_DbTable_ProjectFollower();
$stat['cntLikesHeGave'] = $tblFollower->countLikesHeGave($this->_memberId);
$stat['cntLikesHeGot'] = $tblFollower->countLikesHeGot($this->_memberId);
$tblPling = new Default_Model_DbTable_ProjectPlings();
$stat['cntPlingsHeGave'] = $tblPling->countPlingsHeGave($this->_memberId);
$stat['cntPlingsHeGot'] = $tblPling->countPlingsHeGot($this->_memberId);
$donationinfo = $tableMember->fetchSupporterDonationInfo($this->_memberId);
if ($donationinfo) {
$stat['donationIssupporter'] = $donationinfo['issupporter'];
$stat['donationMax'] = $donationinfo['active_time_max'];
$stat['donationMin'] = $donationinfo['active_time_min'];
$stat['donationCnt'] = $donationinfo['cnt'];
}
// $cntmb = $tableMember->fetchCntSupporters($this->_memberId);
// $stat['cntSupporters'] = $cntmb;
$stat['userLastActiveTime'] = $tableMember->fetchLastActiveTime($this->_memberId);
$userRoleName = $helperUserRole->userRole();
if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) {
$stat['cntDuplicateSourceurl'] = $tableProject->getCountProjectsDuplicateSourceurl($this->_memberId);
}
$this->view->stat = $stat;
}
}
public function getAboutmeUserInfo($member_id,$username)
{
$tableProject = new Default_Model_Project();
$userProjectCategories = $tableProject->getUserCreatingCategorys($member_id);
$cnt = sizeof($userProjectCategories );
$userinfo='';
$isAdmin = false;
$helperUserRole = new Backend_View_Helper_UserRole();
$userRoleName = $helperUserRole->userRole();
if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName){
$isAdmin= true;
}
if($cnt>0)
{
$userinfo = "Hi, I am ".$username." and I'm creating ";
if($cnt==1)
{
$userinfo = $userinfo.' '.$userProjectCategories[0]['category1'].' ';
if($isAdmin)
{
$userinfo = $userinfo.'['.$userProjectCategories[0]['cnt'].'].';
}
}else if($cnt==2)
{
$userinfo = $userinfo.' '.$userProjectCategories[0]['category1'].' ';
if($isAdmin)
{
$userinfo = $userinfo.'['.$userProjectCategories[0]['cnt'].']';
}
$userinfo = $userinfo.' and '.$userProjectCategories[1]['category1'].' ';
if($isAdmin)
{
$userinfo = $userinfo.'['.$userProjectCategories[1]['cnt'].'].';
}
}else if($cnt==3)
{
$userinfo = $userinfo.' '.$userProjectCategories[0]['category1'].' ';
if($isAdmin)
{
$userinfo = $userinfo.'['.$userProjectCategories[0]['cnt'].']';
}
$userinfo = $userinfo.', '.$userProjectCategories[1]['category1'].' ';
if($isAdmin)
{
$userinfo = $userinfo.'['.$userProjectCategories[1]['cnt'].']';
}
$userinfo = $userinfo.' and '.$userProjectCategories[2]['category1'].' ';
if($isAdmin)
{
$userinfo = $userinfo.'['.$userProjectCategories[2]['cnt'].'].';
}
}else if($cnt>3)
{
$userinfo = $userinfo.' '.$userProjectCategories[0]['category1'].' ';
if($isAdmin)
{
$userinfo = $userinfo.'['.$userProjectCategories[0]['cnt'].']';
}
$userinfo = $userinfo.', '.$userProjectCategories[1]['category1'].' ';
if($isAdmin)
{
$userinfo = $userinfo.'['.$userProjectCategories[1]['cnt'].']';
}
$userinfo = $userinfo.', '.$userProjectCategories[2]['category1'].' ';
if($isAdmin)
{
$userinfo = $userinfo.'['.$userProjectCategories[2]['cnt'].']';
}
$userinfo = $userinfo.' and more.';
}
}
return $userinfo;
}
public function avatarAction()
{
$this->_helper->layout->disableLayout();
$size = (int)$this->getParam("size", 200);
$width = (int)$this->getParam("width", ($size / 2));
$this->view->size = (int)$size / 2;
$emailHash = $this->getParam("emailhash", null);
if ($emailHash) {
$memberTable = new Default_Model_Member();
$member = $memberTable->findMemberForMailHash($emailHash);
if ($member) {
$helperImage = new Default_View_Helper_Image();
$imgUrl = $helperImage->Image($member['profile_image_url'], array('width' => $width, 'height' => $width));
$this->view->avatar = $imgUrl;
$this->redirect($imgUrl);
return;
}
}
$this->view->avatar = "";
$helperImage = new Default_View_Helper_Image();
$imgUrl = $helperImage->Image("default-profile.png", array('width' => $width, 'height' => $width));
$this->redirect($imgUrl);
}
public function aboutAction()
{
$modelMember = new Default_Model_Member();
$this->view->member = $modelMember->fetchMember($this->_memberId)->toArray();
$this->view->currentPageOffset = (int)$this->getParam('page');
}
public function showmoreproductsajaxAction()
{
$this->_helper->layout->disableLayout();
$tableProject = new Default_Model_Project();
$pageLimit = 21;
$page = (int)$this->getParam('page', 1);
$total_records = $tableProject->countAllProjectsForMemberCatFilter($this->_memberId, true, null);
$this->view->pageLimit = $pageLimit;
$this->view->page = $page;
$this->view->total_records = $total_records;
$this->view->userProducts =
$tableProject->fetchAllProjectsForMember($this->_memberId, $pageLimit, ($page - 1) * $pageLimit, true);
$this->_helper->viewRenderer('/partials/aboutmeProducts');
}
public function userdataajaxAction()
{
$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender(true);
$resultArray = array();
header('Access-Control-Allow-Origin: *');
$this->getResponse()->setHeader('Access-Control-Allow-Origin', '*')->setHeader('Access-Control-Allow-Credentials', 'true')
->setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
->setHeader('Access-Control-Allow-Headers', 'origin, content-type, accept')
;
$userid = $this->getParam('id');
$modelMember = new Default_Model_Member();
$user = $modelMember->find($userid)->current();
if (Zend_Auth::getInstance()->hasIdentity()) {
$auth = Zend_Auth::getInstance();
$user = $auth->getStorage()->read();
$resultArray['member_id'] = $user->member_id;
$resultArray['username'] = $user->username;
$resultArray['mail'] = $user->mail;
$resultArray['avatar'] = $user->profile_image_url;
} else if (null != $userid && null != $user) {
$resultArray['member_id'] = $user['member_id'];
$resultArray['username'] = $user['username'];
$resultArray['mail'] = $user['mail'];
$resultArray['avatar'] = $user['profile_image_url'];
} else {
$resultArray['member_id'] = null;
$resultArray['username'] = null;
$resultArray['mail'] = null;
$resultArray['avatar'] = null;
}
$resultAll = array();
$resultAll['status'] = "success";
$resultAll['data'] = $resultArray;
$this->_helper->json($resultAll);
}
public function followsAction()
{
$this->redirect($this->_helper->url('follows', 'member', null, $this->getAllParams()));
}
public function followAction()
{
$this->_helper->layout->disableLayout();
$this->view->authMember = $this->_authMember;
$this->view->member_id = $this->_memberId;
if ($this->_memberId == $this->_authMember->member_id) {
return;
}
$memberFollowTable = new Default_Model_DbTable_MemberFollower();
$newVals = array('member_id' => $this->_memberId, 'follower_id' => (int)$this->_authMember->member_id);
$where = $memberFollowTable->select()->where('member_id = ?', $this->_memberId)
->where('follower_id = ?', $this->_authMember->member_id, 'INTEGER')
;
$result = $memberFollowTable->fetchRow($where);
if (null === $result) {
$memberFollowTable->createRow($newVals)->save();
}
}
public function unfollowAction()
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer('follow');
$memberFollowTable = new Default_Model_DbTable_MemberFollower();
$memberFollowTable->delete('member_id=' . $this->_memberId . ' AND follower_id=' . $this->_authMember->member_id);
$this->view->authMember = $this->_authMember;
$this->view->member_id = $this->_memberId;
}
public function newsAction()
{
$this->productsAction();
$this->render('products');
}
public function productsAction()
{
$pageLimit = 25;
$page = (int)$this->getParam('page', 1);
//create ppload download hash: secret + collection_id + expire-timestamp
$salt = PPLOAD_DOWNLOAD_SECRET;
$timestamp = time() + 3600; // one hour valid
$hash = md5($salt . $timestamp); // order isn't important at all... just do the same when verifying
$this->view->download_hash = $hash;
$this->view->download_timestamp = $timestamp;
$this->view->member_id = null;
if (null != $this->_authMember && null != $this->_authMember->member_id) {
$this->view->member_id = $this->_authMember->member_id;
}
$modelProject = new Default_Model_Project();
$userProjects = $modelProject->fetchAllProjectsForMember($this->_authMember->member_id, $pageLimit, ($page - 1) * $pageLimit);
$paginator = Local_Paginator::factory($userProjects);
$paginator->setItemCountPerPage($pageLimit);
$paginator->setCurrentPageNumber($page);
$paginator->setTotalItemCount($modelProject->countAllProjectsForMember($this->_authMember->member_id));
$this->view->products = $paginator;
$modelMember = new Default_Model_Member();
$this->view->member = $modelMember->fetchMemberData($this->_authMember->member_id);
}
public function activitiesAction()
{
$modelInfo = new Default_Model_Info();
$this->view->member = $this->_authMember;
$this->view->comments = $modelInfo->getLastCommentsForUsersProjects($this->_authMember->member_id);
$this->view->votes = $modelInfo->getLastVotesForUsersProjects($this->_authMember->member_id);
$this->view->donations = $modelInfo->getLastDonationsForUsersProjects($this->_authMember->member_id);
}
public function settingsAction()
{
$this->_helper->layout()->setLayout('settings');
}
public function reportAction()
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer('product/add');
$this->forward('report', 'product', null, $this->getAllParams());
}
public function paymentsAction()
{
$this->view->headScript()->setFile('');
$this->view->headLink()->setStylesheet('');
$member_id = $this->_authMember->member_id;
$this->view->member = $this->_authMember;
$tableMember = new Default_Model_Member();
$this->view->hits = $tableMember->fetchPlingedProjects($member_id);
}
public function incomeAction()
{
$this->view->member = $this->_authMember;
$tableMember = new Default_Model_Member();
$modelPlings = new Default_Model_Pling();
$this->view->donations = $modelPlings->fetchRecentDonationsForUser($this->_authMember->member_id);
}
public function tooltipAction()
{
$this->_helper->layout->disableLayout();
$info = new Default_Model_Info();
$data = $info->getTooptipForMember($this->_memberId);
$this->_helper->json(array('status' => 'ok', 'data' => $data));
}
public function shareAction()
{
$this->_helper->layout->disableLayout();
$modelProduct = new Default_Model_Member();
$memberInfo = $modelProduct->fetchMemberData($this->_memberId);
$form = new Default_Form_ProjectShare();
$form->setAction('/member/' . $this->_memberId . '/share/');
// $helperBaseUrl = new Default_View_Helper_BaseUrl();
// $helperServerUrl = new Zend_View_Helper_ServerUrl();
$helpMemberUrl = new Default_View_Helper_BuildMemberUrl();
$this->view->permaLink = $helpMemberUrl->buildMemberUrl($memberInfo->username);
// $this->view->permaLink = $helperServerUrl->serverUrl() . $helperBaseUrl->baseUrl() . '/member/' . $this->_memberId . '/';
if ($this->_request->isGet()) {
$this->view->form = $form;
$this->renderScript('product/share.phtml');
return;
}
if (false === $form->isValid($_POST)) { // form not valid
$this->view->form = $form;
$dummy = $this->view->render('product/share.phtml');
$this->_helper->json(array('status' => 'ok', 'message' => $dummy));
return;
}
$values = $form->getValues();
if (empty($memberInfo->firstname) and empty($memberInfo->lastname)) {
$username = $memberInfo->username;
} else {
$username = $memberInfo->firstname . ' ' . $memberInfo->lastname;
}
$shareMail = new Default_Plugin_SendMail('tpl_social_mail_user');
$shareMail->setTemplateVar('sender', $values['sender_mail']);
$shareMail->setTemplateVar('username', $username);
$shareMail->setTemplateVar('permalink', $this->view->permaLink);
$shareMail->setTemplateVar('permalinktext', 'View user\'s page ');
$shareMail->setReceiverMail($values['mail']);
$shareMail->send();
$this->_helper->json(array('status' => 'ok', 'redirect' => $this->view->permaLink));
}
public function plingsAction()
{
$tableMember = new Default_Model_Member();
$this->view->view_member = $tableMember->fetchMemberData($this->_memberId);
$paypalValidStatusTable = new Default_Model_DbTable_PaypalValidStatus();
$paypalValidStatus = $paypalValidStatusTable->find($this->view->view_member->paypal_valid_status)->current();
$this->view->paypal_valid_status = $paypalValidStatus;
//backdoor for admins
$helperUserRole = new Backend_View_Helper_UserRole();
$userRoleName = $helperUserRole->userRole();
if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) {
$this->view->member = $this->view->view_member;
} else {
$this->view->member = $this->_authMember;
}
}
public function plingsoldAction()
{
$tableMember = new Default_Model_Member();
$this->view->view_member = $tableMember->fetchMemberData($this->_memberId);
$paypalValidStatusTable = new Default_Model_DbTable_PaypalValidStatus();
$paypalValidStatus = $paypalValidStatusTable->find($this->view->view_member->paypal_valid_status)->current();
$this->view->paypal_valid_status = $paypalValidStatus;
//backdoor for admins
$helperUserRole = new Backend_View_Helper_UserRole();
$userRoleName = $helperUserRole->userRole();
if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) {
$this->view->member = $this->view->view_member;
} else {
$this->view->member = $this->_authMember;
}
}
public function plingsajaxAction()
{
$this->_helper->layout->disableLayout();
$tableMember = new Default_Model_Member();
$this->view->view_member = $tableMember->fetchMemberData($this->_memberId);
$paypalValidStatusTable = new Default_Model_DbTable_PaypalValidStatus();
$paypalValidStatus = $paypalValidStatusTable->find($this->view->view_member->paypal_valid_status)->current();
$this->view->paypal_valid_status = $paypalValidStatus;
//backdoor for admins
$helperUserRole = new Backend_View_Helper_UserRole();
$userRoleName = $helperUserRole->userRole();
if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) {
$this->view->member = $this->view->view_member;
} else {
$this->view->member = $this->_authMember;
}
$year = null;
if($this->hasParam('year')) {
$year = $this->getParam('year');
}
$this->view->year = $year;
$this->_helper->viewRenderer('/plingsajax');
}
public function plingsmonthajaxAction()
{
$this->_helper->layout->disableLayout();
$tableMember = new Default_Model_Member();
$this->view->view_member = $tableMember->fetchMemberData($this->_memberId);
$paypalValidStatusTable = new Default_Model_DbTable_PaypalValidStatus();
$paypalValidStatus = $paypalValidStatusTable->find($this->view->view_member->paypal_valid_status)->current();
$this->view->paypal_valid_status = $paypalValidStatus;
//backdoor for admins
$helperUserRole = new Backend_View_Helper_UserRole();
$userRoleName = $helperUserRole->userRole();
if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) {
$this->view->member = $this->view->view_member;
} else {
$this->view->member = $this->_authMember;
}
$yearmonth = null;
if($this->hasParam('yearmonth')) {
$yearmonth = $this->getParam('yearmonth');
}
$this->view->yearmonth = $yearmonth;
$this->_helper->viewRenderer('/plingsmonthajax');
}
public function downloadhistoryAction()
{
$tableMember = new Default_Model_Member();
$this->view->view_member = $tableMember->fetchMemberData($this->_memberId);
//backdore for admins
$helperUserRole = new Backend_View_Helper_UserRole();
$userRoleName = $helperUserRole->userRole();
if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) {
$this->view->member = $this->view->view_member;
} else {
$this->view->member = $this->_authMember;
}
if ($this->view->member) {
$this->view->paramPageId = (int)$this->getParam('page');
//TODO do really sql paging instead of Zend_Paginator
$dhistory = new Default_Model_DbTable_MemberDownloadHistory();
$offset = $this->view->paramPageId;
$list = $dhistory->getDownloadhistory($this->view->member->member_id);
$list->setItemCountPerPage(250);
$list->setCurrentPageNumber($offset);
$this->view->downloadhistory = $list;
} else {
$this->view->downloadhistory = array();
}
}
public function likesAction()
{
$tableMember = new Default_Model_Member();
$this->view->view_member = $tableMember->fetchMemberData($this->_memberId);
//backdore for admins
$helperUserRole = new Backend_View_Helper_UserRole();
$userRoleName = $helperUserRole->userRole();
if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) {
$this->view->member = $this->view->view_member;
} else {
$this->view->member = $this->_authMember;
}
if ($this->view->member) {
$this->view->paramPageId = (int)$this->getParam('page');
$model = new Default_Model_DbTable_ProjectFollower();
$offset = $this->view->paramPageId;
$list = $model->fetchLikesForMember($this->view->member->member_id);
$list->setItemCountPerPage(250);
$list->setCurrentPageNumber($offset);
$this->view->likes = $list;
} else {
$this->view->likes = array();
}
}
public function payoutAction()
{
$tableMember = new Default_Model_Member();
$this->view->view_member = $tableMember->fetchMemberData($this->_memberId);
//backdore for admins
$helperUserRole = new Backend_View_Helper_UserRole();
$userRoleName = $helperUserRole->userRole();
if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) {
$this->view->member = $this->view->view_member;
} else {
$this->view->member = $this->_authMember;
}
}
/**
* @return Default_Form_Settings
* @throws Zend_Form_Exception
*/
private function formPassword()
{
$form = new Default_Form_Settings();
$form->setMethod("POST")->setAttrib("id", "settingsPasswordForm")->setAction('/member/' . $this->_memberId . '/changepass');
$passOld = $form->createElement('password', 'passwordOld')->setLabel('Enter old Password:')->setRequired(true)
->removeDecorator('HtmlTag')->addValidator(new Local_Validate_OldPasswordConfirm())->setDecorators(array(
'ViewHelper',
'Label',
'Errors',
array(
'ViewScript',
array(
'viewScript' => 'settings/viewscripts/flatui_input.phtml',
'placement' => false
)
)
))
;
$pass1 = $form->createElement('password', 'password1')->setLabel('Enter new Password:')->setRequired(true)
->addValidator(new Zend_Validate_NotEmpty(Zend_Validate_NotEmpty::STRING))->removeDecorator('HtmlTag')
->setDecorators(array(
'ViewHelper',
'Label',
'Errors',
array(
'ViewScript',
array(
'viewScript' => 'settings/viewscripts/flatui_input.phtml',
'placement' => false
)
)
))
;
$pass2 = $form->createElement('password', 'password2')->setLabel('Re-enter new Password:')->setRequired(true)
->addValidator(new Zend_Validate_NotEmpty(Zend_Validate_NotEmpty::STRING))->removeDecorator('HtmlTag')
->setDecorators(array(
'ViewHelper',
'Label',
'Errors',
array(
'ViewScript',
array(
'viewScript' => 'settings/viewscripts/flatui_input.phtml',
'placement' => false
)
)
))
;
$passValid = new Local_Validate_PasswordConfirm($pass2->getValue());
$pass1->addValidator($passValid);
$form->addElement($passOld)->addElement($pass1)->addElement($pass2);
return $form;
}
}
\ No newline at end of file
diff --git a/application/modules/statistics/models/Data.php b/application/modules/statistics/models/Data.php
index 6681b12bf..5658b54d9 100644
--- a/application/modules/statistics/models/Data.php
+++ b/application/modules/statistics/models/Data.php
@@ -1,583 +1,594 @@
.
*
* Created: 31.07.2017
*/
class Statistics_Model_Data
{
const DEFAULT_STORE_ID = 22; //opendesktop
/** @var Zend_Db_Adapter_Pdo_Abstract */
protected $_db;
public function __construct($options) {
if (isset($options['db'])) {
$this->initDbAdapter($options['db']);
} else {
throw new Exception('configuration parameter for database connection needed');
}
}
private function initDbAdapter($db)
{
$adapter = $db['adapter'];
$params = $db['params'];
//$default = (int)(isset($params['isDefaultTableAdapter']) && $params['isDefaultTableAdapter']
// || isset($params['default']) && $params['default']);
unset($params['adapter'], $params['default'], $params['isDefaultTableAdapter']);
$adapter = Zend_Db::factory($adapter, $params);
$this->_db = $adapter;
}
public function getNewmemberstats(){
$sql = "SELECT DATE(`created_at`) as memberdate , count(*) as daycount FROM dwh.ods_member_v group by memberdate order by memberdate desc limit 30";
$result = $this->_db->fetchAll($sql);
return $result;
}
public function getNewprojectstats(){
$sql = "SELECT DATE(`created_at`) as projectdate , count(*) as daycount FROM dwh.ods_project_v where status>=40 group by projectdate order by projectdate desc limit 30";
$result = $this->_db->fetchAll($sql);
return $result;
}
+
+ public function getNewprojectWeeklystats(){
+ $sql = "SELECT YEARWEEK(`created_at`) as yyyykw , count(*) as amount
+ FROM project
+ where status=100 and type_id = 1
+ group by yyyykw
+ order by yyyykw
+ desc limit 60";
+ $result = $this->_db->fetchAll($sql);
+ return $result;
+ }
public function getPayout($yyyymm){
$sql = "SELECT * ,
(select username from member m where m.member_id = p.member_id) username
FROM dwh.member_payout p where yearmonth = :yyyymm order by amount desc";
$result = $this->_db->fetchAll($sql, array("yyyymm"=>$yyyymm));
return $result;
}
public function getPayoutMemberPerCategory($yyyymm,$catid){
$modelProjectCategories = new Default_Model_DbTable_ProjectCategory();
$ids = $modelProjectCategories->fetchChildIds($catid);
array_push($ids, $catid);
$idstring = implode(',', $ids);
$sql = "
select * from
(
select
member_id
,(select username from member m where m.member_id = v.member_id) username
,round(sum(probably_payout_amount)) as amount
from member_dl_plings_v as v
where project_category_id IN (".$idstring.") and v.yearmonth= :yyyymm
group by v.member_id
order by amount desc
) tmp where amount>0
";
$result = $this->_db->fetchAll($sql, array("yyyymm"=>$yyyymm));
return $result;
}
public function getNewcomer($yyyymm){
$yyyymm_vor = $this->getLastYearMonth($yyyymm);
$sql = "SELECT member_id
, (select username from member m where m.member_id = member_payout.member_id) as username
, paypal_mail,round(amount,2) as amount FROM member_payout WHERE yearmonth =:yyyymm
and member_id not in (select member_id from member_payout where yearmonth =:yyyymm_vor)
order by amount desc
";
$result = $this->_db->fetchAll($sql, array("yyyymm"=>$yyyymm, "yyyymm_vor"=>$yyyymm_vor));
return $result;
}
public function getNewloser($yyyymm){
$yyyymm_vor = $this->getLastYearMonth($yyyymm);
$sql = "SELECT member_id
, (select username from member m where m.member_id = member_payout.member_id) as username
, paypal_mail,round(amount,2) as amount FROM member_payout WHERE yearmonth =:yyyymm_vor
and member_id not in (select member_id from member_payout where yearmonth =:yyyymm)
order by amount desc
";
$result = $this->_db->fetchAll($sql, array("yyyymm"=>$yyyymm, "yyyymm_vor"=>$yyyymm_vor));
return $result;
}
public function getMonthDiff($yyyymm){
$yyyymm_vor = $this->getLastYearMonth($yyyymm);
$sql = "
select akt.member_id
, (select username from member m where m.member_id = akt.member_id) as username
, akt.amount as am_akt
, let.amount as am_let
, round(akt.amount-let.amount) as am_diff
, akt.yearmonth ym_akt
, let.yearmonth ym_let
from
(select member_id, amount,yearmonth from member_payout where yearmonth = :yyyymm) akt,
(select member_id, amount,yearmonth from member_payout where yearmonth = :yyyymm_vor) let
where akt.member_id = let.member_id
order by am_diff desc
";
$result = $this->_db->fetchAll($sql, array("yyyymm"=>$yyyymm, "yyyymm_vor"=>$yyyymm_vor));
return $result;
}
/*
public function getDownloadsDaily($numofmonthback){
$sql = "
select
SUBSTR(d.date_yyyymmdd,1,6) as symbol
,SUBSTR(d.date_yyyymmdd,7,8)*1 as date
,d.count as price
from dwh.files_downloads_daily as d
where STR_TO_DATE(date_yyyymmdd,'%Y%m%d' ) >= (DATE_FORMAT(CURDATE(), '%Y-%m-01')- INTERVAL :numofmonthback MONTH)
and STR_TO_DATE(date_yyyymmdd,'%Y%m%d' )< CURDATE()
order by date_yyyymmdd asc
";
$result = $this->_db->fetchAll($sql,array("numofmonthback"=>$numofmonthback));
return $result;
}
*/
public function getDownloadsDaily($numofmonthback){
$sql = "
select
SUBSTR(d.date_yyyymmdd,1,6) as symbol
,SUBSTR(d.date_yyyymmdd,7,8)*1 as date
,d.count as price
from dwh.files_downloads_daily as d
where STR_TO_DATE(date_yyyymmdd,'%Y%m%d' ) >= (DATE_FORMAT(CURDATE(), '%Y-%m-01')- INTERVAL :numofmonthback MONTH)
and STR_TO_DATE(date_yyyymmdd,'%Y%m%d' )< CURDATE()
union
select
concat(SUBSTR(d.date_yyyymmdd,1,6),' payout') as symbol
,SUBSTR(d.date_yyyymmdd,7,8)*1 as date
,d.count as price
from dwh.payout_daily as d
where STR_TO_DATE(date_yyyymmdd,'%Y%m%d' ) >= (DATE_FORMAT(CURDATE(), '%Y-%m-01')- INTERVAL :numofmonthback MONTH)
and STR_TO_DATE(date_yyyymmdd,'%Y%m%d' )< CURDATE()
";
$result = $this->_db->fetchAll($sql,array("numofmonthback"=>$numofmonthback));
return $result;
}
public function getDownloadsUndPayoutsDaily($yyyymm){
$sql = "
select
concat(SUBSTR(d.date_yyyymmdd,1,6),' downloads') as symbol
,SUBSTR(d.date_yyyymmdd,7,8)*1 as date
,d.count as price
from dwh.files_downloads_daily as d
where SUBSTR(d.date_yyyymmdd,1,6)=:yyyymm
union
select
concat(SUBSTR(d.date_yyyymmdd,1,6),' payouts') as symbol
,SUBSTR(d.date_yyyymmdd,7,8)*1 as date
,d.count as price
from dwh.payout_daily as d
where SUBSTR(d.date_yyyymmdd,1,6)=:yyyymm
";
$result = $this->_db->fetchAll($sql,array("yyyymm"=>$yyyymm));
return $result;
}
/**
,(select count(1) from dwh.files_downloads dd where dd.project_id = d.project_id
and dd.downloaded_timestamp between :date_start and :date_end
and dd.referer like 'https://www.google%') as cntGoogle
*/
public function getTopDownloadsPerDate($date){
$date_start =$date.' 00:00:00';
$date_end =$date.' 23:59:59';
$sql = "
select d.project_id
, count(1) as cnt
,(select p.title from project p where p.project_id = d.project_id) as ptitle
,(select p.created_at from project p where p.project_id = d.project_id) as pcreated_at
,(select c.title from category c, project p where p.project_id = d.project_id and p.project_category_id=c.project_category_id) as ctitle
,(select username from member m , project p where m.member_id = p.member_id and p.project_id = d.project_id) as username
from dwh.files_downloads d
where d.downloaded_timestamp between :date_start and :date_end
group by d.project_id
order by cnt desc
limit 50
";
$result = $this->_db->fetchAll($sql,array("date_start"=>$date_start,"date_end"=>$date_end));
return $result;
}
public function getTopDownloadsPerMonth($month,$catid){
$sd = $month.'-01';
$date_start =date('Y-m-01', strtotime($sd)).' 00:00:00';
$date_end =date('Y-m-t', strtotime($sd)).' 23:59:59';
if($catid==0)
{
// $sql = "
// select d.project_id
// , count(1) as cnt
// ,(select p.title from project p where p.project_id = d.project_id) as ptitle
// ,(select p.created_at from project p where p.project_id = d.project_id) as pcreated_at
// ,(select c.title from category c where d.project_category_id=c.project_category_id) as ctitle
// ,(select username from member m where m.member_id = d.member_id) as username
// from dwh.files_downloads d
// where d.yyyymm = :month
// group by d.project_id,project_category_id,member_id
// order by cnt desc
// limit 50
// ";
$sql = "select d.project_id
, sum(d.count) as cnt
,p.title as ptitle
,p.created_at as pcreated_at
,(select c.title from category c where d.project_category_id=c.project_category_id) as ctitle
,(select username from member m where m.member_id = p.member_id) as username
from dwh.files_downloads_project_daily d
join project p on d.project_id = p.project_id
where d.yyyymm = :month
group by d.project_id,d.project_category_id,p.member_id
order by cnt desc
limit 50";
}else
{
$modelProjectCategories = new Default_Model_DbTable_ProjectCategory();
$ids = $modelProjectCategories->fetchChildIds($catid);
array_push($ids, $catid);
$idstring = implode(',', $ids);
// $sql = '
// select d.project_id
// , count(1) as cnt
// ,(select p.title from project p where p.project_id = d.project_id) as ptitle
// ,(select p.created_at from project p where p.project_id = d.project_id) as pcreated_at
// ,(select c.title from category c where d.project_category_id=c.project_category_id) as ctitle
// ,(select username from member m where m.member_id = d.member_id) as username
// from dwh.files_downloads d
// where d.yyyymm = :month
// and d.project_category_id in ('.$idstring.')
// group by d.project_id,project_category_id,member_id
// order by cnt desc
// limit 50
// ';
$sql = 'select d.project_id
, sum(d.count) as cnt
,p.title as ptitle
,p.created_at as pcreated_at
,(select c.title from category c where d.project_category_id=c.project_category_id) as ctitle
,(select username from member m where m.member_id = p.member_id) as username
from dwh.files_downloads_project_daily d
join project p on d.project_id = p.project_id
where d.yyyymm = :month
and d.project_category_id in ('.$idstring.')
group by d.project_id,d.project_category_id,p.member_id
order by cnt desc
limit 50';
}
$result = $this->_db->fetchAll($sql,array("month"=>$month));
return $result;
}
public function getProductMonthly($project_id)
{
$sql = "
select
yyyymm as yearmonth
,sum(count) as amount
from dwh.files_downloads_project_daily
where project_id = :project_id
group by yyyymm
limit 100
";
$result = $this->_db->fetchAll($sql,array("project_id"=>$project_id));
return $result;
}
public function getProductDayly($project_id)
{
$sql = "
select yyyymmdd as yearmonth,count as amount
from dwh.files_downloads_project_daily
where project_id = :project_id
order by yyyymmdd desc
limit 1000
";
$result = $this->_db->fetchAll($sql,array("project_id"=>$project_id));
return array_reverse($result);
}
public function getDownloadsDomainStati($begin, $end){
$date_start =$begin.' 00:00:00';
$date_end =$end.' 23:59:59';
$sql = "
select count(1) as cnt
,d.referer_domain
,is_from_own_domain
from dwh.files_downloads d
where d.downloaded_timestamp between :date_start and :date_end
group by d.referer_domain,is_from_own_domain
order by is_from_own_domain desc, cnt desc
";
$result = $this->_db->fetchAll($sql,array("date_start"=>$date_start,"date_end"=>$date_end));
return $result;
}
public function getPayoutCategoryMonthly($yyyymm){
$sql = "
select * from
(
select project_category_id
,(select title from category as c where c.project_category_id = v.project_category_id) as title
,round(sum(probably_payout_amount)) as amount
,sum(v.num_downloads) as num_downloads
from member_dl_plings_v as v
where yearmonth =:yyyymm
group by v.project_category_id
order by amount desc
) tmp where amount>0
";
$result = $this->_db->fetchAll($sql, array("yyyymm"=>$yyyymm));
return $result;
}
private function getPayoutCategorySingle($catid)
{
$modelProjectCategories = new Default_Model_DbTable_ProjectCategory();
$ids = $modelProjectCategories->fetchChildIds($catid);
array_push($ids, $catid);
$idstring = implode(',', $ids);
// Zend_Registry::get('logger')->info(__METHOD__ . ' - ===================================' );
// Zend_Registry::get('logger')->info(__METHOD__ . ' - ' . $idstring);
$sql = "
select * from
(
select
yearmonth
,(select title from category as c where c.project_category_id = ".$catid.") as symbol
,round(sum(probably_payout_amount)) as amount
from member_dl_plings_v as v
where project_category_id IN (".$idstring.")
group by v.yearmonth
order by yearmonth asc
) tmp where amount>0
";
$result = $this->_db->fetchAll($sql);
return $result;
}
public function getPayoutCategory_($catid){
if($catid==0)
{
$pids = array(152, 233,158, 148,491,445,295);
$sql = "
select * from
(
select
'All' as symbol
,yearmonth
,round(sum(probably_payout_amount)) as amount
from member_dl_plings_v as v
group by v.yearmonth
order by yearmonth asc
) tmp where amount>0
";
$result = $this->_db->fetchAll($sql);
foreach ($pids as $catid) {
$t = self::getPayoutCategorySingle($catid);
$result = array_merge($result, $t);
}
}
else
{
$result = self::getPayoutCategorySingle($catid);
}
return $result;
}
public function getPayoutCategory($catid){
if($catid==0)
{
// $pids = array(152, 233,158,404, 148,491,445,295);
$modelCategoryStore = new Default_Model_DbTable_ConfigStoreCategory();
$pids = $modelCategoryStore->fetchCatIdsForStore(self::DEFAULT_STORE_ID);
$sql = "
select * from
(
select
'All' as symbol
,yearmonth
,round(sum(probably_payout_amount)) as amount
from member_dl_plings_v as v
group by v.yearmonth
order by yearmonth asc
) tmp where amount>0
";
$result = $this->_db->fetchAll($sql);
foreach ($pids as $c) {
$tmp = self::getPayoutCategorySingle($c);
foreach ($result as &$row) {
$row['amount'.$c] = 0;
foreach ($tmp as $t) {
if($t['yearmonth']==$row['yearmonth'])
{
$row['amount'.$c] = $t['amount'];
break;
}
}
}
}
}
else
{
$result = self::getPayoutCategorySingle($catid);
$modelCategoriesTable = new Default_Model_DbTable_ProjectCategory();
$pids = $modelCategoriesTable->fetchImmediateChildrenIds($catid);
foreach ($pids as $c) {
$tmp = self::getPayoutCategorySingle($c);
foreach ($result as &$row) {
$row['amount'.$c] = 0;
foreach ($tmp as $t) {
if($t['yearmonth']==$row['yearmonth'])
{
$row['amount'.$c] = $t['amount'];
break;
}
}
}
}
}
return $result;
}
public function _getPayoutCategory($catid){
if($catid==0)
{
$pids = array(152, 233,158,404, 148,491,445,295);
$sql = "
select * from
(
select
'All' as symbol
,yearmonth
,round(sum(probably_payout_amount)) as amount
from member_dl_plings_v as v
group by v.yearmonth
order by yearmonth asc
) tmp where amount>0
";
$result = $this->_db->fetchAll($sql);
foreach ($pids as $c) {
$tmp = self::getPayoutCategorySingle($c);
foreach ($result as &$row) {
$row['amount'.$c] = 0;
foreach ($tmp as $t) {
if($t['yearmonth']==$row['yearmonth'])
{
$row['amount'.$c] = $t['amount'];
break;
}
}
}
}
}
else
{
$result = self::getPayoutCategorySingle($catid);
}
return $result;
}
public function getLastYearMonth($yyyymm){
$aktdate = strval($yyyymm).'01';
$fmt = 'Ymd';
$d = DateTime::createFromFormat($fmt, $aktdate);
$d->modify( 'last day of previous month' );
return $d->format( 'Ym' );
}
public function getPayoutyear(){
$sql = "select round(sum(amount)) amount,yearmonth from dwh.member_payout group by yearmonth order by yearmonth";
$result = $this->_db->fetchAll($sql);
return $result;
}
public function getPayoutOfMember($member_id){
//$sql = "select yearmonth, amount from dwh.member_payout where member_id = :member_id order by yearmonth asc";
$sql = "select yearmonth, amount from dwh.member_payout where member_id = :member_id order by yearmonth asc";
$result = $this->_db->fetchAll($sql, array("member_id"=>$member_id));
return $result;
}
public function getProject($project_id)
{
$sql = "SELECT * FROM ods_project_v WHERE project_id = :projectId";
$result = $this->_db->fetchAll($sql, array('projectId' => $project_id));
return $result;
}
public function getProjects($limit = 50)
{
$limit = (int)$limit;
$sql = "SELECT * FROM ods_project_v LIMIT {$limit}";
$result = $this->_db->fetchAll($sql);
return $result;
}
public function getMember($member_id)
{
$sql = "SELECT * FROM ods_member_v WHERE member_id = :memberId";
$result = $this->_db->fetchAll($sql, array('memberId' => (int)$member_id));
return $result;
}
public function getMembers($limit = 50)
{
$sql = "SELECT * FROM ods_member_v";
$sql = $this->_db->limit($sql, (int)$limit);
$result = $this->_db->fetchAll($sql);
return $result;
}
}
\ No newline at end of file
diff --git a/httpdocs/theme/backend/css/backend/stati.css b/httpdocs/theme/backend/css/backend/stati.css
index b862e5197..bdf4ce40e 100644
--- a/httpdocs/theme/backend/css/backend/stati.css
+++ b/httpdocs/theme/backend/css/backend/stati.css
@@ -1,368 +1,374 @@
.pling-nav-tabs a{
cursor: pointer;
}
.spinning {
animation: spin 1s infinite linear;
-webkit-animation: spin2 1s infinite linear;
float:left;
margin-top:5px;
margin-right:5px;
}
@keyframes spin {
from { transform: scale(1) rotate(0deg); }
to { transform: scale(1) rotate(360deg); }
}
@-webkit-keyframes spin2 {
from { -webkit-transform: rotate(0deg); }
to { -webkit-transform: rotate(360deg); }
}
.chart {
width: 700px;
height: 450px;
margin-bottom: 10px;
}
.chart_title {
display: block;
font-size: 1.2em;
font-weight: bold;
margin-bottom: 0.4em;
}
#tabContainer {
width: 720px;
}
/*
path { stroke: #fff; }
path:hover { opacity:0.9; }
rect:hover { fill:blue; }
.axis { font: 10px sans-serif; }
.legend tr{ border-bottom:1px solid grey; }
.legend tr:first-child{ border-top:1px solid grey; }
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.x.axis path { display: none; }
.legend{
margin-bottom:76px;
display:inline-block;
border-collapse: collapse;
border-spacing: 0px;
}
.legend td{
padding:4px 5px;
vertical-align:bottom;
}
.legendFreq, .legendPerc{
align:right;
width:50px;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.bar {
fill: steelblue;
}
.bar:hover {
fill: blue ;
}
.x.axis path {
display: none;
}
*/
+
+
+.bar { fill: steelblue; }
+
+
+
.d3-tip {
line-height: 1;
font-weight: bold;
padding: 12px;
background: rgba(0, 0, 0, 0.8);
color: #fff;
border-radius: 2px;
}
/* Creates a small triangle extender for the tooltip */
.d3-tip:after {
box-sizing: border-box;
display: inline;
font-size: 10px;
width: 100%;
line-height: 1;
color: rgba(0, 0, 0, 0.8);
content: "\25BC";
position: absolute;
text-align: center;
}
/* Style northward tooltips differently */
.d3-tip.n:after {
margin: -1px 0 0 0;
top: 100%;
left: 0;
}
#d3bar-member {
display: block;
}
#d3bar-project {
display: block;
}
.d3linepath text {
font: 10px sans-serif;
}
.d3linepath .axis path,
.d3linepath .axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.d3linepath .line {
fill: none;
stroke-width: 1.5px;
}
.d3linepath .label {
text-anchor: middle;
}
.d3linepath .label rect {
fill: #ECECEC;
}
.d3linepath .label-key {
font-weight: bold;
}
table.tablestati {
display: block;
background-color: #ccc;
margin-top: 40px;
float: left;
margin-left: 20px;
}
table.tablestati thead td {
font-weight: bold;
background-color: #fff;
}
table.tablestati td {
padding: 1px;
margin: 1px;
}
table.tablestati td.number {
text-align: right;
width: 80px;
padding-right: 10px;
}
.d3linepath path {
stroke: steelblue;
stroke-width: 2;
}
.d3linepath .axis path,
.d3linepath .axis line {
stroke: grey;
stroke-width: 1;
shape-rendering: crispEdges;
}
.d3linepath .legend {
font-size: 16px;
font-weight: bold;
text-anchor: middle;
}
#category-tree-container{
max-height: 750px;
overflow-y: auto;
}
#category-tree-container .product-counter{
padding-left: 20px;
color:#1879B6;
font-size: smaller;
}
#category-tree-container ul{
list-style: none;
}
#category-tree-container ul li span.submenu-toggle
{
float: left;
padding-right: 10px;
font-weight: bold;
display: block;
min-width: 25px;min-height: 15px;
cursor: default;
}
/*multiline.css*/
.chart-wrapper {
max-width: 950px;
min-width: 804px;
margin: 0 auto;
background-color: #FAF7F7;
}
.chart-wrapper .inner-wrapper {
position: relative;
padding-bottom: 50%;
width: 100%;
}
.chart-wrapper .outer-box {
position: absolute;
top: 0; bottom: 0; left: 0; right: 0;
}
.chart-wrapper .inner-box {
width: 100%;
height: 100%;
}
.chart-wrapper text {
font-family: sans-serif;
font-size: 11px;
}
.chart-wrapper p {
font-size: 16px;
margin-top:5px;
margin-bottom: 40px;
}
.chart-wrapper .axis path,
.chart-wrapper .axis line {
fill: none;
stroke: #1F1F2E;
stroke-opacity: 0.7;
shape-rendering: crispEdges;
}
.chart-wrapper .axis path {
stroke-width: 2px;
}
.chart-wrapper .line {
fill: none;
stroke: steelblue;
stroke-width: 5px;
}
.chart-wrapper .legend {
min-width: 200px;
display: flex;
justify-content: flex-start;
flex-wrap: wrap;
font-size: 16px;
padding: 10px 40px;
}
.chart-wrapper .legend > div {
margin: 0px 25px 10px 0px;
flex-grow: 0;
}
.chart-wrapper .legend p {
display:inline;
font-size: 0.8em;
font-family: sans-serif;
font-weight: 600;
}
.chart-wrapper .legend .series-marker {
height: 1em;
width: 1em;
border-radius: 35%;
background-color: crimson;
display: inline-block;
margin-right: 4px;
margin-bottom: -0.16rem;
}
.chart-wrapper .overlay {
fill: none;
pointer-events: all;
}
.chart-wrapper .focus circle {
fill: crimson;
stroke: crimson;
stroke-width: 2px;
fill-opacity: 15%;
}
.chart-wrapper .focus rect {
fill: lightblue;
opacity: 0.4;
border-radius: 2px;
}
.chart-wrapper .focus.line {
stroke: steelblue;
stroke-dasharray: 2,5;
stroke-width: 2;
opacity: 0.5;
}
@media (max-width:500px){
.chart-wrapper .line {stroke-width: 3px;}
.chart-wrapper .legend {font-size: 14px;}
}
/*payout monthly line chart*/
/*
.payoutCategoryLineChart path{
stroke: steelblue;
stroke-width: 2;
fill: none;
}
.payoutCategoryLineChart .axis path,
.payoutCategoryLineChart .axis line {
fill: none;
stroke: grey;
stroke-width: 1;
shape-rendering: crispEdges;
}
.payoutCategoryLineChart .legend {
font-size: 16px;
font-weight: bold;
text-anchor: middle;
}
.payoutCategoryLineChart .overlay {
fill: none;
pointer-events: all;
}
.payoutCategoryLineChart .focus circle {
fill: #F1F3F3;
stroke: #6F257F;
stroke-width: 5px;
}
.payoutCategoryLineChart .hover-line {
stroke: #6F257F;
stroke-width: 2px;
stroke-dasharray: 3,3;
}
*/
\ No newline at end of file
diff --git a/httpdocs/theme/backend/js/backend_stati.js b/httpdocs/theme/backend/js/backend_stati.js
index 2828191ad..46969fe8b 100644
--- a/httpdocs/theme/backend/js/backend_stati.js
+++ b/httpdocs/theme/backend/js/backend_stati.js
@@ -1,313 +1,317 @@
/**
* ocs-webserver
*
* Copyright 2016 by pling GmbH.
*
* This file is part of ocs-webserver.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
**/
$(document).ready(function () {
var parseTime = d3.timeParse("%Y%m");
window.selectedCatid = 0;
window.selectedTab = '';
window.selectedMonth;
var indicator = ' ';
function createMonthFilter(selectid, triggerEvent) {
let html = '';
for (i = 1; i < 10; i++) {
let oneMonthsAgo = moment().subtract(i, 'months');
if (i == 1) {
html = html + '' + oneMonthsAgo.format('YYYYMM') + ' ';
} else {
html = html + '' + oneMonthsAgo.format('YYYYMM') + ' ';
}
}
html = html + ' ';
return html;
}
function createMonthFilterWithCurrent(selectid, triggerEvent) {
let html = '';
for (i = 0; i < 10; i++) {
let oneMonthsAgo = moment().subtract(i, 'months');
if (i == 0) {
html = html + '' + oneMonthsAgo.format('YYYYMM') + ' ';
} else {
html = html + '' + oneMonthsAgo.format('YYYYMM') + ' ';
}
}
html = html + ' ';
return html;
}
$.ajaxSetup({
// Disable caching of AJAX responses
// Used when debugging
cache: false
});
$.getScript("/theme/flatui/js/stati/newUserProject.js");
$(".newuserprojectTab").click(function () {
$.getScript("/theme/flatui/js/stati/newUserProject.js");
});
$(".downloadsdailyTab").click(function () {
$('#downloadsdailyTabContainer').empty();
$.getScript("/theme/flatui/js/stati/downloadsdaily.js");
});
+ $(".newproductsweeklyTab").click(function () {
+ $('#newproductsweekly').empty();
+ $.getScript("/theme/flatui/js/stati/newproductsweekly.js");
+ });
$('#numofmonthback').change(function () {
$.getScript("/theme/flatui/js/stati/downloadsdaily.js");
});
$('button.filterDownloadsDomainDate').click(function () {
loadDownloadsDomain();
});
function loadDownloadsDomain() {
$('#downloadsDomainTabContainer').empty();
let dateBegin = $("#filterDownloadsDomainDateBegin").val();
let dateEnd = $("#filterDownloadsDomainDateEnd").val();
$.getJSON("/backend/index/getdownloadsdomain?dateBegin=" + dateBegin + "&dateEnd=" + dateEnd, function (response) {
let data = response.results;
let table = "CNT Domain IS_OWN? ";
$.each(data, function (index, value) {
table = table + ''
+ '' + value.cnt + ' '
+ '' + value.referer_domain + ' '
+ '' + value.is_from_own_domain + ' '
+ ' ';
});
table = table + "
";
$('#downloadsDomainTabContainer').append(table);
});
}
$(".downloadsDomainTab").click(function () {
loadDownloadsDomain();
});
// topdownloadsperdate
$('button.filterTopDownloadsDate').click(function () {
loadTopdownloadsperday();
});
$('button.filterTopDownloadsDateClear').click(function () {
$('#topDownloadsPerDayTabContainer').empty();
});
function loadTopdownloadsperday() {
let date = $("#filterTopDownloadsDate").val();
$.getJSON("/backend/index/gettopdownloadsperdate?date=" + date, function (response) {
let data = response.results;
let table = "" + date + " ProjectID Username CNT Title Category created_at ";
$.each(data, function (index, value) {
table = table + ''
+ ''
+ value.project_id + ' '
+ '' + value.username + ' '
+ '' + value.cnt + ' '
+ '' + value.ptitle + ' '
+ '' + value.ctitle + ' '
+ '' + value.pcreated_at + ' '
+ ' ';
});
table = table + "
";
$('#topDownloadsPerDayTabContainer').append(table);
});
}
function loadTopdownloadspermonth() {
console.log(window.selectedMonth);
$('#topDownloadsPerMonthTabContainer').empty();
$('#topDownloadsPerMonthTabContainer').append(indicator);
$.getJSON("/backend/index/gettopdownloadspermonth?month=" + window.selectedMonth+'&catid='+window.selectedCatid, function (
response) {
let data = response.results;
let table = "" + window.selectedMonth+'_'+window.selectedCatTitle + " ProjectID Username CNT Title Category created_at ";
$.each(data, function (index, value) {
table = table + ''
+ ''
+ value.project_id + ' '
+ '' + value.username + ' '
+ '' + value.cnt + ' '
+ '' + value.ptitle + ' '
+ '' + value.ctitle + ' '
+ '' + value.pcreated_at + ' '
+ ' ';
});
table = table + "
";
$('#topDownloadsPerMonthTabContainer').empty();
$('#topDownloadsPerMonthTabContainer').append(table);
$('.loadTopdownloadspermonthDetail').on('click',function(){
console.log($(this).attr("data-pid"));
var project_id = $(this).attr("data-pid");
loadTopdownloadspermonth_daily(project_id);
});
});
}
function loadTopdownloadspermonth_daily(project_id){
$('#topDownloadsPerMonthTabContainer').append('
').append('
');
window.project_id = project_id;
$.getScript("/theme/flatui/js/stati/productMonthly.js");
$.getScript("/theme/flatui/js/stati/productDayly.js");
}
$(".topDownloadsPerDayTab").click(function () {
$('#topDownloadsPerDayTabContainer').empty();
loadTopdownloadsperday();
});
$('#payoutTab').prepend(createMonthFilter('selectmonth'));
$('#selectmonth').change(function () {
$.getScript("/theme/flatui/js/stati/memberPayout.js");
});
$(".payoutTab").click(function () {
$('#detailContainer').empty();
$.getScript("/theme/flatui/js/stati/payoutyear.js");
$.getScript("/theme/flatui/js/stati/memberPayout.js");
});
// payout Category Monthly tab begin
$('#payoutCategoryMonthlyTab').prepend(createMonthFilter('selectmonthCategoryMonthly'));
$(".payoutCategoryMonthlyTab").click(function () {
$.getScript("/theme/flatui/js/stati/payoutCategoryMonthly.js");
});
$('#selectmonthCategoryMonthly').change(function () {
$('.payoutCategoryMonthlyTab').trigger('click');
});
// payout Category Monthly tab end
$('#payoutNewcomerTab').prepend(createMonthFilter('selectmonthNewcomer'));
$('#selectmonthNewcomer').change(function () {
$(".payoutNewcomerTab").trigger('click');
});
$(".payoutNewcomerTab").click(function () {
$('#payoutNewcomerTabContainer').empty();
let yyyymm = $("#selectmonthNewcomer option:selected").text();
$.getJSON("/backend/index/newcomer?yyyymm=" + yyyymm, function (response) {
let data = response.results;
let table = "";
$.each(data, function (index, value) {
table = table + '' + value.member_id + ' ' + value.username + ' ' + value.paypal_mail + ' ' + value.amount + ' ';
});
table = table + "
";
$('#payoutNewcomerTabContainer').html(table);
});
});
$('#payoutNewloserTab').prepend(createMonthFilter('selectmonthNewloser'));
$('#selectmonthNewloser').change(function () {
$(".payoutNewloserTab").trigger('click');
});
$(".payoutNewloserTab").click(function () {
$('#payoutNewloserTabContainer').empty();
let yyyymm = $("#selectmonthNewloser option:selected").text();
$.getJSON("/backend/index/newloser?yyyymm=" + yyyymm, function (response) {
let data = response.results;
let table = "";
$.each(data, function (index, value) {
table = table + '' + value.member_id + ' ' + value.username + ' ' + value.paypal_mail + ' ' + value.amount + ' ';
});
table = table + "
";
$('#payoutNewloserTabContainer').html(table);
});
});
$('#payoutMonthDiffTab').prepend(createMonthFilter('selectmonthMonthDiff'));
$('#selectmonthMonthDiff').change(function () {
$(".payoutMonthDiffTab").trigger('click');
});
$(".payoutMonthDiffTab").click(function () {
$('#payoutMonthDiffTabContainer').empty();
let yyyymm = $("#selectmonthMonthDiff option:selected").text();
$.getJSON("/backend/index/monthdiff?yyyymm=" + yyyymm, function (response) {
let data = response.results;
let table = "";
table = table + 'Member Username Diff month amount last month amount ';
$.each(data, function (index, value) {
table = table + '' + value.member_id + ' ' + value.username + ' ' + value.am_diff + ' '
+ '' + value.ym_akt + ' ' + value.am_akt + ' '
+ '' + value.ym_let + ' ' + value.am_let + ' '
;
});
table = table + "
";
$('#payoutMonthDiffTabContainer').html(table);
});
});
$('#filterTopDownloadsMonth').MonthPicker({ StartYear: 2018, ShowIcon: true,MonthFormat:'yymm',OnAfterChooseMonth: function() {
window.selectedMonth = $(this).val();
} });
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
var target = $(e.target).attr("href");
console.log(target);
if('#topDownloadsPerMonthTab' == target || '#payoutCategoryTab' ==target)
{
var cattree = $('#category-tree-container');
$(target).find('.filter').append(cattree);
}
window.selectedTab = target;
window.selectedCatid = 0;
window.selectedCatTitle = '';
});
$('body').on('click', '#category-tree a', function (event) {
event.preventDefault();
event.stopPropagation();
var start = this.href.indexOf("cat");
var catid;
var title;
if(start<0) {
catid = 0;
title = 'All';
}else
{
catid = this.href.substring(start+4, (this.href.length-1));
title = $(this).text();
}
window.selectedCatid = catid;
window.selectedCatTitle = title;
if(window.selectedTab=='#payoutCategoryTab')
{
if($('#payoutCategoryLineChart').find('#payoutCategoryLineChart'+catid).length==0)
{
$('#payoutCategoryLineChart').append(' loading ...
');
$.getScript("/theme/flatui/js/stati/payoutCategory.js");
}
}
if(window.selectedTab=='#topDownloadsPerMonthTab')
{
window.selectedMonth = $('#filterTopDownloadsMonth').val();
loadTopdownloadspermonth();
}
});
$('#clearChartPanel').on('click',function(){
$("#payoutCategoryLineChart").empty();
});
});
\ No newline at end of file
diff --git a/httpdocs/theme/flatui/js/stati/newproductsweekly.js b/httpdocs/theme/flatui/js/stati/newproductsweekly.js
new file mode 100755
index 000000000..1b293c610
--- /dev/null
+++ b/httpdocs/theme/flatui/js/stati/newproductsweekly.js
@@ -0,0 +1,68 @@
+!(function (d3) {
+
+
+ var margin = {top: 20, right: 20, bottom: 80, left: 40},
+ width = 1240 - margin.left - margin.right,
+ height = 500 - margin.top - margin.bottom;
+
+ // set the ranges
+ var x = d3.scaleBand()
+ .range([0, width])
+ .padding(0.1);
+ var y = d3.scaleLinear()
+ .range([height, 0]);
+
+ // append the svg object to the body of the page
+ // append a 'group' element to 'svg'
+ // moves the 'group' element to the top left margin
+ var svg = d3.select("#newproductsweekly").append("svg")
+ .attr("width", width + margin.left + margin.right)
+ .attr("height", height + margin.top + margin.bottom)
+ .append("g")
+ .attr("transform",
+ "translate(" + margin.left + "," + margin.top + ")");
+
+ // get the data
+ d3.json("/backend/index/newproductsweekly", function(error, data) {
+
+ if (error) throw error;
+ data = data.results;
+ // format the data
+ data.forEach(function(d) {
+
+ d.amount = +d.amount;
+ });
+
+ // Scale the range of the data in the domains
+ x.domain(data.map(function(d) { return d.yyyykw; }));
+ y.domain([0, d3.max(data, function(d) { return d.amount; })]);
+
+ // append the rectangles for the bar chart
+ svg.selectAll(".bar")
+ .data(data)
+ .enter().append("rect")
+ .attr("class", "bar")
+ .attr("x", function(d) { return x(d.yyyykw); })
+ .attr("width", x.bandwidth())
+ .attr("y", function(d) { return y(d.amount); })
+ .attr("height", function(d) { return height - y(d.amount); });
+
+ // add the x Axis
+ svg.append("g")
+ .attr("transform", "translate(0," + height + ")")
+ .call(d3.axisBottom(x))
+.selectAll("text")
+ .attr("y", 0)
+ .attr("x", 9)
+ .attr("dy", ".35em")
+ .attr("transform", "rotate(90)")
+ .style("text-anchor", "start");
+
+
+ // add the y Axis
+ svg.append("g")
+ .call(d3.axisLeft(y));
+
+ });
+
+})(d3);
\ No newline at end of file