| Line 68... |
Line 68... |
| 68 |
$(document).on('click', '#exportCsvBtn', function () {
|
68 |
$(document).on('click', '#exportCsvBtn', function () {
|
| 69 |
exportPurchaseSaleCSV();
|
69 |
exportPurchaseSaleCSV();
|
| 70 |
});
|
70 |
});
|
| 71 |
|
71 |
|
| 72 |
function exportPurchaseSaleCSV() {
|
72 |
function exportPurchaseSaleCSV() {
|
| 73 |
if (!currentPurchaseSaleData.length && !currentCatalogData.length) {
|
73 |
if (!currentPurchaseSaleData.length) {
|
| 74 |
alert('No data to export');
|
74 |
alert('No data to export');
|
| 75 |
return;
|
75 |
return;
|
| 76 |
}
|
76 |
}
|
| 77 |
|
77 |
|
| 78 |
let csvContent = '';
|
- |
|
| 79 |
|
- |
|
| 80 |
// Summary section
|
- |
|
| 81 |
if (currentPurchaseSaleData.length) {
|
- |
|
| 82 |
csvContent += 'Status,Purchase,Sale,Sale %\n';
|
- |
|
| 83 |
currentPurchaseSaleData.forEach(row => {
|
- |
|
| 84 |
let pct = row.totalQuantity > 0 ? ((row.soldQuantity / row.totalQuantity) * 100).toFixed(1) : '0.0';
|
- |
|
| 85 |
csvContent += `${row.status},${row.totalQuantity},${row.soldQuantity},${pct}%\n`;
|
- |
|
| 86 |
});
|
- |
|
| 87 |
}
|
- |
|
| 88 |
|
- |
|
| 89 |
// Catalog detail section
|
- |
|
| 90 |
if (currentCatalogData.length) {
|
- |
|
| 91 |
csvContent += '\nCatalog Detail\n';
|
- |
|
| 92 |
csvContent += 'Model,Status,Purchase,Sale,Sale %\n';
|
- |
|
| 93 |
currentCatalogData.forEach(row => {
|
- |
|
| 94 |
let pct = row.purchase > 0 ? ((row.sale / row.purchase) * 100).toFixed(1) : '0.0';
|
- |
|
| 95 |
csvContent += `${row.model},${row.status},${row.purchase},${row.sale},${pct}%\n`;
|
- |
|
| 96 |
});
|
- |
|
| 97 |
}
|
- |
|
| 98 |
|
- |
|
| 99 |
let startDate = $('input[name="startDate"]').val();
|
78 |
let startDate = $('input[name="startDate"]').val();
|
| 100 |
let endDate = $('input[name="endDate"]').val();
|
79 |
let endDate = $('input[name="endDate"]').val();
|
| 101 |
let brand = $('select[name="brand"]').val() || '';
|
80 |
let brand = $('select[name="brand"]').val() || '';
|
| - |
|
81 |
let supplierId = $('select[name="supplier"]').val() || 0;
|
| - |
|
82 |
|
| - |
|
83 |
doGetAjaxRequestHandler(`${context}/pur-sale-ratio/catalog-export?startDate=${startDate}&endDate=${endDate}&brand=${brand}&supplierId=${supplierId}`, function (response) {
|
| - |
|
84 |
let csvContent = 'Model,Status,Purchase,Sale,Sale %,Unsold (0-5 Days),Unsold (6-15 Days),Unsold (16-30 Days),Unsold (31-45 Days),Unsold (>45 Days)\n';
|
| - |
|
85 |
response.forEach(row => {
|
| 102 |
let fileName = `purchase_sale_ratio_${brand}_${startDate}_to_${endDate}.csv`;
|
86 |
let pct = row.purchase > 0 ? ((row.sale / row.purchase) * 100).toFixed(1) : '0.0';
|
| - |
|
87 |
csvContent += `${row.model},${row.status},${row.purchase},${row.sale},${pct}%,${row.unsold5},${row.unsold15},${row.unsold30},${row.unsold45},${row.unsoldAbove45}\n`;
|
| - |
|
88 |
});
|
| 103 |
|
89 |
|
| - |
|
90 |
let fileName = `purchase_sale_ratio_${brand}_${startDate}_to_${endDate}.csv`;
|
| 104 |
let blob = new Blob([csvContent], {type: 'text/csv;charset=utf-8;'});
|
91 |
let blob = new Blob([csvContent], {type: 'text/csv;charset=utf-8;'});
|
| 105 |
let link = document.createElement('a');
|
92 |
let link = document.createElement('a');
|
| 106 |
link.href = URL.createObjectURL(blob);
|
93 |
link.href = URL.createObjectURL(blob);
|
| 107 |
link.download = fileName;
|
94 |
link.download = fileName;
|
| 108 |
link.click();
|
95 |
link.click();
|
| 109 |
URL.revokeObjectURL(link.href);
|
96 |
URL.revokeObjectURL(link.href);
|
| - |
|
97 |
});
|
| 110 |
}
|
98 |
}
|
| 111 |
|
99 |
|
| 112 |
function createPurchaseSaleBarChart(response, startDate, endDate, brand, supplierId) {
|
100 |
function createPurchaseSaleBarChart(response, startDate, endDate, brand, supplierId) {
|
| 113 |
response = arrangeLabelsOrder(response);
|
101 |
response = arrangeLabelsOrder(response);
|
| 114 |
currentPurchaseSaleData = response;
|
102 |
currentPurchaseSaleData = response;
|
| 115 |
currentCatalogData = [];
|
103 |
currentCatalogData = [];
|
| 116 |
$('#exportCsvBtn').hide();
|
104 |
$('#exportCsvBtn').show();
|
| 117 |
let labels = [], totalQuantities = [], soldQuantities = [];
|
105 |
let labels = [], totalQuantities = [], soldQuantities = [];
|
| 118 |
labels = response.map(sale => sale.status);
|
106 |
labels = response.map(sale => sale.status);
|
| 119 |
totalQuantities = response.map(sale => sale.totalQuantity);
|
107 |
totalQuantities = response.map(sale => sale.totalQuantity);
|
| 120 |
soldQuantities = response.map(sale => sale.soldQuantity);
|
108 |
soldQuantities = response.map(sale => sale.soldQuantity);
|
| 121 |
const ctx = document.getElementById('salesChart').getContext('2d');
|
109 |
const ctx = document.getElementById('salesChart').getContext('2d');
|
| Line 235... |
Line 223... |
| 235 |
function createCatalogPurchaseSaleBarChart(response, startDate, endDate, supplierId) {
|
223 |
function createCatalogPurchaseSaleBarChart(response, startDate, endDate, supplierId) {
|
| 236 |
let labels = [], totalQuantities = [], soldQuantities = [];
|
224 |
let labels = [], totalQuantities = [], soldQuantities = [];
|
| 237 |
|
225 |
|
| 238 |
let filterResponse = response.filter(res => res.sale !== res.purchase);
|
226 |
let filterResponse = response.filter(res => res.sale !== res.purchase);
|
| 239 |
currentCatalogData = filterResponse;
|
227 |
currentCatalogData = filterResponse;
|
| 240 |
$('#exportCsvBtn').show();
|
- |
|
| 241 |
|
228 |
|
| 242 |
labels = filterResponse.map(sale => sale.model);
|
229 |
labels = filterResponse.map(sale => sale.model);
|
| 243 |
totalQuantities = filterResponse.map(sale => sale.purchase);
|
230 |
totalQuantities = filterResponse.map(sale => sale.purchase);
|
| 244 |
soldQuantities = filterResponse.map(sale => sale.sale);
|
231 |
soldQuantities = filterResponse.map(sale => sale.sale);
|
| 245 |
let status = filterResponse.map(sale => sale.status)[0];
|
232 |
let status = filterResponse.map(sale => sale.status)[0];
|