mirror of
https://github.com/openclassify/openclassify.git
synced 2026-02-10 23:36:08 -06:00
#2480 Sales Reports
This commit is contained in:
parent
37043a1e15
commit
420a25f801
@ -0,0 +1,59 @@
|
|||||||
|
$(document).ready( function () {
|
||||||
|
$('#stockReport').DataTable({
|
||||||
|
ajax: '/admin/api/classified/report/stock',
|
||||||
|
order: [[ 1, "asc" ]],
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
data: 'name',
|
||||||
|
render: function ( data, type, row, meta ) {
|
||||||
|
return `
|
||||||
|
<a href="/admin/advs/edit/${row.id}" class="text-info">
|
||||||
|
${data ?? productsReportTrans.undefined_product}
|
||||||
|
</a>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ data: 'stock' },
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#activePassiveReport').DataTable({
|
||||||
|
ajax: '/admin/api/classified/report/status',
|
||||||
|
columns: [
|
||||||
|
{ data: 'status' },
|
||||||
|
{ data: 'count' },
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#unexplainedReport').DataTable({
|
||||||
|
ajax: '/admin/api/classified/report/unexplained',
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
data: 'name',
|
||||||
|
render: function ( data, type, row, meta ) {
|
||||||
|
return `
|
||||||
|
<a href="/admin/advs/edit/${row.id}" class="text-info">
|
||||||
|
${data ?? productsReportTrans.undefined_product}
|
||||||
|
</a>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#noImageReport').DataTable({
|
||||||
|
ajax: '/admin/api/classified/report/no-image',
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
data: 'name',
|
||||||
|
render: function ( data, type, row, meta ) {
|
||||||
|
return `
|
||||||
|
<a href="/admin/advs/edit/${row.id}" class="text-info">
|
||||||
|
${data ?? productsReportTrans.undefined_product}
|
||||||
|
</a>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
} );
|
||||||
@ -383,4 +383,13 @@ return [
|
|||||||
'name_a_z' => 'Name (A to Z)',
|
'name_a_z' => 'Name (A to Z)',
|
||||||
'name_z_a' => 'Name (Z to A)',
|
'name_z_a' => 'Name (Z to A)',
|
||||||
'select_lang_ads' => 'select the language of the ads',
|
'select_lang_ads' => 'select the language of the ads',
|
||||||
|
|
||||||
|
// Report
|
||||||
|
'product_stock_report' => 'Product Stock Report',
|
||||||
|
'active_passive_products_report' => 'Active-Passive Products Report',
|
||||||
|
'unexplained_products_report' => 'Unexplained Products Report',
|
||||||
|
'non_image_products_report' => 'Non-Image Products Report',
|
||||||
|
'product' => 'Product',
|
||||||
|
'count' => 'Count',
|
||||||
|
'undefined_product' => 'Undefined Product',
|
||||||
];
|
];
|
||||||
|
|||||||
@ -0,0 +1,64 @@
|
|||||||
|
<div class="row">
|
||||||
|
{% set reports = [
|
||||||
|
{
|
||||||
|
'title': trans('visiosoft.module.advs::field.product_stock_report'),
|
||||||
|
'id': 'stockReport',
|
||||||
|
'columns': [
|
||||||
|
trans('visiosoft.module.advs::field.product'),
|
||||||
|
trans('visiosoft.module.advs::field.stock.name'),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'title': trans('visiosoft.module.advs::field.active_passive_products_report'),
|
||||||
|
'id': 'activePassiveReport',
|
||||||
|
'columns': [
|
||||||
|
trans('visiosoft.module.advs::field.status.name'),
|
||||||
|
trans('visiosoft.module.advs::field.count'),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'title': trans('visiosoft.module.advs::field.unexplained_products_report'),
|
||||||
|
'id': 'unexplainedReport',
|
||||||
|
'columns': [
|
||||||
|
trans('visiosoft.module.advs::field.product'),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'title': trans('visiosoft.module.advs::field.non_image_products_report'),
|
||||||
|
'id': 'noImageReport',
|
||||||
|
'columns': [
|
||||||
|
trans('visiosoft.module.advs::field.product'),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
] %}
|
||||||
|
|
||||||
|
{% for report in reports %}
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header bg-primary">
|
||||||
|
<h5 class="card-title text-white">{{ report.title }}</h5>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-block">
|
||||||
|
<table id="{{ report.id }}" class="display">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
{% for column in report.columns %}
|
||||||
|
<th>{{ column }}</th>
|
||||||
|
{% endfor %}
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const productsReportTrans = {
|
||||||
|
undefined_product: `{{ trans('visiosoft.module.advs::field.undefined_product') }}`,
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{{ asset_add('scripts.js', 'visiosoft.module.advs::js/admin/dashboard/report.js') }}
|
||||||
@ -543,4 +543,13 @@ class AdvModel extends AdvsAdvsEntryModel implements AdvInterface
|
|||||||
|
|
||||||
return $lastCat;
|
return $lastCat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function scopeCurrent($query)
|
||||||
|
{
|
||||||
|
return $query
|
||||||
|
->whereDate('finish_at', '>=', date("Y-m-d H:i:s"))
|
||||||
|
->where('status', '=', 'approved')
|
||||||
|
->where('slug', '!=', '')
|
||||||
|
->orderBy('publish_at', 'desc');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -97,4 +97,6 @@ interface AdvInterface extends EntryInterface
|
|||||||
public function getCatsIDs();
|
public function getCatsIDs();
|
||||||
|
|
||||||
public function lastCategory();
|
public function lastCategory();
|
||||||
|
|
||||||
|
public function scopeCurrent($query);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,6 +248,12 @@ class AdvsModuleServiceProvider extends AddonServiceProvider
|
|||||||
'as' => 'visiosoft.module.advs::ad.change.status',
|
'as' => 'visiosoft.module.advs::ad.change.status',
|
||||||
'uses' => 'Visiosoft\AdvsModule\Http\Controller\StatusController@change'
|
'uses' => 'Visiosoft\AdvsModule\Http\Controller\StatusController@change'
|
||||||
],
|
],
|
||||||
|
|
||||||
|
// Admin ReportController
|
||||||
|
'admin/api/classified/report/stock' => 'Visiosoft\AdvsModule\Http\Controller\Admin\ReportController@stock',
|
||||||
|
'admin/api/classified/report/status' => 'Visiosoft\AdvsModule\Http\Controller\Admin\ReportController@status',
|
||||||
|
'admin/api/classified/report/unexplained' => 'Visiosoft\AdvsModule\Http\Controller\Admin\ReportController@unexplained',
|
||||||
|
'admin/api/classified/report/no-image' => 'Visiosoft\AdvsModule\Http\Controller\Admin\ReportController@noImage',
|
||||||
];
|
];
|
||||||
|
|
||||||
protected $middleware = [
|
protected $middleware = [
|
||||||
|
|||||||
@ -0,0 +1,19 @@
|
|||||||
|
$(document).ready( function () {
|
||||||
|
$('#newMemberReport').DataTable({
|
||||||
|
ajax: '/admin/api/profile/report/latest',
|
||||||
|
order: [[ 1, "desc" ]],
|
||||||
|
columns: [
|
||||||
|
{ data: 'member', defaultContent: usersReportTrans.undefined_member },
|
||||||
|
{ data: 'date' },
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#loginMemberReport').DataTable({
|
||||||
|
ajax: '/admin/api/profile/report/login',
|
||||||
|
order: [[ 1, "desc" ]],
|
||||||
|
columns: [
|
||||||
|
{ data: 'member', defaultContent: usersReportTrans.undefined_member },
|
||||||
|
{ data: 'date' },
|
||||||
|
],
|
||||||
|
});
|
||||||
|
} );
|
||||||
@ -496,4 +496,12 @@ return [
|
|||||||
'receive_messages_email' => [
|
'receive_messages_email' => [
|
||||||
'name' => 'Receive Messages Email',
|
'name' => 'Receive Messages Email',
|
||||||
],
|
],
|
||||||
|
|
||||||
|
// Report
|
||||||
|
'member' => 'Member',
|
||||||
|
'registered_at' => 'Registered At',
|
||||||
|
'login_at' => 'Login At',
|
||||||
|
'undefined_member' => 'Undefined Member',
|
||||||
|
'new_membership_report' => 'New Membership Report',
|
||||||
|
'member_login_reports' => 'Member Login Reports',
|
||||||
];
|
];
|
||||||
|
|||||||
@ -0,0 +1,50 @@
|
|||||||
|
<div class="row">
|
||||||
|
{% set reports = [
|
||||||
|
{
|
||||||
|
'title': trans('visiosoft.module.profile::field.new_membership_report'),
|
||||||
|
'id': 'newMemberReport',
|
||||||
|
'columns': [
|
||||||
|
trans('visiosoft.module.profile::field.member'),
|
||||||
|
trans('visiosoft.module.profile::field.registered_at'),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'title': trans('visiosoft.module.profile::field.member_login_reports'),
|
||||||
|
'id': 'loginMemberReport',
|
||||||
|
'columns': [
|
||||||
|
trans('visiosoft.module.profile::field.member'),
|
||||||
|
trans('visiosoft.module.profile::field.login_at'),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
] %}
|
||||||
|
|
||||||
|
{% for report in reports %}
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header bg-warning">
|
||||||
|
<h5 class="card-title text-white">{{ report.title }}</h5>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-block">
|
||||||
|
<table id="{{ report.id }}" class="display">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
{% for column in report.columns %}
|
||||||
|
<th>{{ column }}</th>
|
||||||
|
{% endfor %}
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const usersReportTrans = {
|
||||||
|
undefined_member: `{{ trans('visiosoft.module.profile::field.undefined_member') }}`,
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{{ asset_add('scripts.js', 'visiosoft.module.profile::assets/js/admin/dashboard/report.js') }}
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
<?php namespace Visiosoft\ProfileModule\Http\Controller\Admin;
|
||||||
|
|
||||||
|
use Anomaly\Streams\Platform\Http\Controller\AdminController;
|
||||||
|
use Anomaly\UsersModule\User\Contract\UserRepositoryInterface;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
|
||||||
|
class ReportController extends AdminController
|
||||||
|
{
|
||||||
|
protected $userRepository;
|
||||||
|
|
||||||
|
public function __construct(UserRepositoryInterface $userRepository)
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
$this->userRepository = $userRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function latest()
|
||||||
|
{
|
||||||
|
$members = $this->userRepository->newQuery()
|
||||||
|
->selectRaw("DATE_FORMAT(created_at, '%d.%m.%Y %H:%i') as date, CONCAT_WS('', first_name, ' ', last_name) AS member")
|
||||||
|
->where('created_at', '>=', Carbon::today()->subWeek())
|
||||||
|
->get();
|
||||||
|
|
||||||
|
return [
|
||||||
|
'data' => $members
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function login()
|
||||||
|
{
|
||||||
|
$members = $this->userRepository->newQuery()
|
||||||
|
->selectRaw("DATE_FORMAT(last_login_at, '%d.%m.%Y %H:%i') as date, CONCAT_WS('', first_name, ' ', last_name) AS member")
|
||||||
|
->whereNotNull('last_login_at')
|
||||||
|
->where('last_login_at', '>=', Carbon::today()->subWeek())
|
||||||
|
->get();
|
||||||
|
|
||||||
|
return [
|
||||||
|
'data' => $members
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -124,6 +124,10 @@ class ProfileModuleServiceProvider extends AddonServiceProvider
|
|||||||
|
|
||||||
// CacheController
|
// CacheController
|
||||||
'ajax/get-user-info' => 'Visiosoft\ProfileModule\Http\Controller\CacheController@getUserInfo',
|
'ajax/get-user-info' => 'Visiosoft\ProfileModule\Http\Controller\CacheController@getUserInfo',
|
||||||
|
|
||||||
|
// Admin ReportController
|
||||||
|
'admin/api/profile/report/latest' => 'Visiosoft\ProfileModule\Http\Controller\Admin\ReportController@latest',
|
||||||
|
'admin/api/profile/report/login' => 'Visiosoft\ProfileModule\Http\Controller\Admin\ReportController@login',
|
||||||
];
|
];
|
||||||
|
|
||||||
protected $aliases = [
|
protected $aliases = [
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user