Skip to content

Commit 79ec764

Browse files
committed
complete reports
1 parent a2bfe06 commit 79ec764

4 files changed

Lines changed: 243 additions & 0 deletions

File tree

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import React from 'react';
2+
import Paper from 'material-ui/Paper';
3+
import { Bar } from 'react-chartjs-2';
4+
import style from './style.css';
5+
6+
const BarChart = ({ data, title, subTitle, legendDisplay }) => (
7+
<div className="row row--no-gutter">
8+
<div className="col--no-gutter col-xs-12">
9+
<Paper className="paper-box" zDepth={1}>
10+
<div className={style.title}>{title}</div>
11+
<div className={style.subTitle}>{subTitle}</div>
12+
<div style={{ padding: 30 }}>
13+
<Bar
14+
data={data}
15+
width={100}
16+
height={200}
17+
options={{
18+
legend: {
19+
display: legendDisplay
20+
},
21+
scales: {
22+
xAxes: [
23+
{
24+
stacked: true,
25+
barPercentage: 0.99,
26+
categoryPercentage: 0.99,
27+
gridLines: {
28+
display: false,
29+
drawBorder: false
30+
},
31+
ticks: {
32+
display: true,
33+
fontColor: 'rgba(0,0,0,0.3)',
34+
padding: 0
35+
}
36+
}
37+
],
38+
yAxes: [
39+
{
40+
stacked: true,
41+
gridLines: {
42+
display: true,
43+
drawBorder: false,
44+
color: 'rgba(0,0,0,0.08)'
45+
},
46+
ticks: {
47+
maxTicksLimit: 4,
48+
display: true,
49+
padding: 10,
50+
fontColor: 'rgba(0,0,0,0.3)'
51+
}
52+
}
53+
]
54+
}
55+
}}
56+
/>
57+
</div>
58+
</Paper>
59+
</div>
60+
</div>
61+
);
62+
63+
export default BarChart;
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import React from 'react';
2+
import messages from 'lib/text';
3+
import api from 'lib/api';
4+
import BarChart from './barChart';
5+
import * as utils from './utils';
6+
import moment from 'moment';
7+
8+
export default class OrdersBar extends React.Component {
9+
constructor(props) {
10+
super(props);
11+
this.state = {
12+
ordersData: null,
13+
salesData: null
14+
};
15+
}
16+
17+
componentDidMount() {
18+
this.fetchData();
19+
}
20+
21+
fetchData = () => {
22+
const filter = {
23+
draft: false,
24+
cancelled: false,
25+
date_placed_min: moment()
26+
.subtract(1, 'months')
27+
.hour(0)
28+
.minute(0)
29+
.second(0)
30+
.toISOString()
31+
};
32+
33+
api.orders
34+
.list(filter)
35+
.then(({ status, json }) => {
36+
const reportData = utils.getReportDataFromOrders(json);
37+
const ordersData = utils.getOrdersDataFromReportData(reportData);
38+
const salesData = utils.getSalesDataFromReportData(reportData);
39+
this.setState({ ordersData, salesData });
40+
})
41+
.catch(error => {
42+
console.log(error);
43+
});
44+
};
45+
46+
render() {
47+
const { ordersData, salesData } = this.state;
48+
return (
49+
<div>
50+
<BarChart
51+
data={ordersData}
52+
legendDisplay={true}
53+
title={messages.drawer_orders}
54+
/>
55+
<BarChart
56+
data={salesData}
57+
legendDisplay={false}
58+
title={messages.salesReport}
59+
/>
60+
</div>
61+
);
62+
}
63+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
.title {
2+
padding: 30px 30px 0px 30px;
3+
font-size: 26px;
4+
color: rgba(0,0,0,0.87);
5+
font-weight: 300;
6+
}
7+
8+
.subTitle {
9+
padding: 5px 30px 0px 30px;
10+
font-size: 16px;
11+
color: rgba(0,0,0,0.54);
12+
font-weight: 400;
13+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
import messages from 'lib/text';
2+
import moment from 'moment';
3+
4+
const chartColors = {
5+
red: 'rgb(255, 99, 132)',
6+
orange: 'rgb(255, 159, 64)',
7+
yellow: 'rgb(255, 205, 86)',
8+
green: 'rgb(75, 192, 192)',
9+
blue: 'rgb(54, 162, 235)',
10+
purple: 'rgb(153, 102, 255)',
11+
grey: 'rgb(201, 203, 207)'
12+
};
13+
14+
const transparentize = (color, opacity) => {
15+
const alpha = opacity === undefined ? 0.5 : 1 - opacity;
16+
return Color(color)
17+
.alpha(alpha)
18+
.rgbString();
19+
};
20+
21+
const getOrdersByDate = (orders, dateMoment) => {
22+
return orders.filter(order =>
23+
moment(order.date_placed).isSame(dateMoment, 'day')
24+
);
25+
};
26+
27+
const filterSuccessOrders = order =>
28+
order.paid === true || order.closed === true;
29+
const filterNewOrders = order => !order.paid && !order.closed;
30+
31+
export const getReportDataFromOrders = ordersResponse => {
32+
let reportItems = [];
33+
let dateFrom = moment().subtract(1, 'months');
34+
let dateTo = moment();
35+
const daysDiff = dateFrom.diff(dateTo, 'days');
36+
37+
for (let i = daysDiff; i < 1; i++) {
38+
const reportingDate = moment().add(i, 'days');
39+
const ordersPlacedThisDate = getOrdersByDate(
40+
ordersResponse.data,
41+
reportingDate
42+
);
43+
const totalOrdersCount = ordersPlacedThisDate.length;
44+
const successOrdersCount = ordersPlacedThisDate.filter(filterSuccessOrders)
45+
.length;
46+
const newOrdersCount = ordersPlacedThisDate.filter(filterNewOrders).length;
47+
const successOrdersRevenue = ordersPlacedThisDate
48+
.filter(filterSuccessOrders)
49+
.reduce((a, b) => {
50+
return a + b.grand_total;
51+
}, 0);
52+
53+
reportItems.push({
54+
date: reportingDate.format('D MMM'),
55+
total: totalOrdersCount,
56+
success: successOrdersCount,
57+
new: newOrdersCount,
58+
revenue: successOrdersRevenue
59+
});
60+
}
61+
62+
return reportItems;
63+
};
64+
65+
export const getOrdersDataFromReportData = reportData => {
66+
const labels = reportData.map(item => item.date);
67+
const successData = reportData.map(item => item.success);
68+
const newData = reportData.map(item => item.new);
69+
70+
return {
71+
labels: labels,
72+
datasets: [
73+
{
74+
label: messages.closedAndPaidOrders,
75+
data: successData,
76+
backgroundColor: chartColors.blue,
77+
hoverBackgroundColor: transparentize(chartColors.blue, 0.4)
78+
},
79+
{
80+
label: messages.newOrders,
81+
data: newData,
82+
backgroundColor: chartColors.yellow,
83+
hoverBackgroundColor: transparentize(chartColors.yellow, 0.4)
84+
}
85+
]
86+
};
87+
};
88+
89+
export const getSalesDataFromReportData = reportData => {
90+
const labels = reportData.map(item => item.date);
91+
const revenueData = reportData.map(item => item.revenue);
92+
93+
return {
94+
labels: labels,
95+
datasets: [
96+
{
97+
label: messages.closedAndPaidOrders,
98+
data: revenueData,
99+
backgroundColor: chartColors.blue,
100+
hoverBackgroundColor: transparentize(chartColors.blue, 0.4)
101+
}
102+
]
103+
};
104+
};

0 commit comments

Comments
 (0)