after dot 2 digit fixed
This commit is contained in:
parent
dbee0d4a30
commit
83750fb4e5
@ -31,6 +31,10 @@ export const createOrder = async (req, res) => {
|
||||
}
|
||||
const addedBy = req.user._id;
|
||||
// Create a new PdOrder instance
|
||||
// Ensure subtotal, gstTotal, and grandTotal are formatted to two decimal places
|
||||
const formattedSubtotal = parseFloat(subtotal).toFixed(2);
|
||||
const formattedGstTotal = parseFloat(gstTotal).toFixed(2);
|
||||
const formattedGrandTotal = parseFloat(grandTotal).toFixed(2);
|
||||
const newOrder = new PdOrder({
|
||||
paymentMode,
|
||||
shipTo,
|
||||
@ -51,9 +55,9 @@ export const createOrder = async (req, res) => {
|
||||
quantity: item.count,
|
||||
remainingQuantity: item.count,
|
||||
})),
|
||||
subtotal,
|
||||
gstTotal,
|
||||
grandTotal,
|
||||
subtotal: formattedSubtotal,
|
||||
gstTotal: formattedGstTotal,
|
||||
grandTotal: formattedGrandTotal,
|
||||
addedBy,
|
||||
});
|
||||
|
||||
@ -131,7 +135,10 @@ export const processOrder = async (req, res) => {
|
||||
gstTotal += itemGST;
|
||||
invoiceAmount += itemSubtotal + itemGST;
|
||||
});
|
||||
|
||||
// Round the final totals to two decimal places
|
||||
subtotal = parseFloat(subtotal.toFixed(2));
|
||||
gstTotal = parseFloat(gstTotal.toFixed(2));
|
||||
invoiceAmount = parseFloat(invoiceAmount.toFixed(2));
|
||||
// Create a new invoice
|
||||
const newInvoice = new Invoice({
|
||||
invoiceId,
|
||||
@ -180,7 +187,9 @@ export const processOrder = async (req, res) => {
|
||||
pendingTotalAmount += itemPendingSubtotal + itemPendingGST;
|
||||
}
|
||||
});
|
||||
|
||||
itemPendingSubtotal = parseFloat(itemPendingSubtotal.toFixed(2));
|
||||
itemPendingGST = parseFloat(itemPendingGST.toFixed(2));
|
||||
pendingTotalAmount = parseFloat(pendingTotalAmount.toFixed(2));
|
||||
// Only update order status if all items have been fully processed
|
||||
if (allItemsProcessed) {
|
||||
order.status = "processing"; // All items are fully processed
|
||||
@ -251,13 +260,13 @@ export const processOrder = async (req, res) => {
|
||||
item.remainingQuantity
|
||||
}</td>
|
||||
<td style="border: 1px solid #555; padding: 2px; text-align: center;">₹${
|
||||
item.price
|
||||
(item.price).toFixed(2)
|
||||
}</td>
|
||||
<td style="border: 1px solid #555; padding: 2px; text-align: center;">₹${
|
||||
(item.GST * item.price) / 100
|
||||
((item.GST * item.price) / 100).toFixed(2)
|
||||
}</td>
|
||||
<td style="border: 1px solid #555; padding: 2px; text-align: center;">₹${
|
||||
(item.price + (item.GST * item.price) / 100) * item.remainingQuantity
|
||||
((item.price + (item.GST * item.price) / 100) * item.remainingQuantity).toFixed(2)
|
||||
}</td>
|
||||
</tr>
|
||||
`
|
||||
@ -415,9 +424,9 @@ export const cancelOrderController = async (req, res) => {
|
||||
|
||||
const processedItems = invoice.items
|
||||
.map((item) => {
|
||||
const itemSubtotal = item.price * item.processquantity;
|
||||
const itemSubtotal = (item.price * item.processquantity).toFixed(2);
|
||||
const itemGST =
|
||||
((item.price * item.GST) / 100) * item.processquantity;
|
||||
(((item.price * item.GST) / 100) * item.processquantity).toFixed(2);
|
||||
|
||||
subtotal += itemSubtotal;
|
||||
gstTotal += itemGST;
|
||||
@ -441,13 +450,13 @@ export const cancelOrderController = async (req, res) => {
|
||||
item.processquantity
|
||||
}</td>
|
||||
<td style="border: 1px solid #555; padding: 2px; text-align: center;">₹${
|
||||
item.price
|
||||
(item.price).toFixed(2)
|
||||
}</td>
|
||||
<td style="border: 1px solid #555; padding: 2px; text-align: center;">₹${
|
||||
(item.price * item.GST) / 100
|
||||
((item.price * item.GST) / 100).toFixed(2)
|
||||
}</td>
|
||||
<td style="border: 1px solid #555; padding: 2px; text-align: center;">₹${
|
||||
itemSubtotal + itemGST
|
||||
(itemSubtotal + itemGST).toFixed(2)
|
||||
}</td>
|
||||
</tr>
|
||||
`;
|
||||
@ -468,9 +477,9 @@ export const cancelOrderController = async (req, res) => {
|
||||
if (Array.isArray(order.orderItem)) {
|
||||
order.orderItem.forEach((item) => {
|
||||
if (item.remainingQuantity > 0) {
|
||||
const itemSubtotal = item.price * item.remainingQuantity;
|
||||
const itemSubtotal = i(tem.price * item.remainingQuantity).toFixed(2);
|
||||
const itemGST =
|
||||
((item.price * item.GST) / 100) * item.remainingQuantity;
|
||||
(((item.price * item.GST) / 100) * item.remainingQuantity).toFixed(2);
|
||||
|
||||
totalCancelAmount += itemSubtotal + itemGST;
|
||||
|
||||
@ -492,13 +501,13 @@ export const cancelOrderController = async (req, res) => {
|
||||
item.remainingQuantity
|
||||
}</td>
|
||||
<td style="border: 1px solid #555; padding: 2px; text-align: center;">₹${
|
||||
item.price
|
||||
(item.price).toFixed(2)
|
||||
}</td>
|
||||
<td style="border: 1px solid #555; padding: 2px; text-align: center;">₹${
|
||||
(item.price * item.GST) / 100
|
||||
((item.price * item.GST) / 100).toFixed(2)
|
||||
}</td>
|
||||
<td style="border: 1px solid #555; padding: 2px; text-align: center;">₹${
|
||||
itemSubtotal + itemGST
|
||||
(itemSubtotal + itemGST).toFixed(2)
|
||||
}</td>
|
||||
</tr>
|
||||
`;
|
||||
@ -968,7 +977,7 @@ export const updateCourierStatusToDispatched = async (req, res) => {
|
||||
product.processquantity
|
||||
}</td>
|
||||
<td style="border: 1px solid #555; padding: 2px; text-align: center;">₹${
|
||||
product.price
|
||||
(product.price).toFixed(2)
|
||||
}</td>
|
||||
<td style="border: 1px solid #555; padding: 2px; text-align: center;">₹${(
|
||||
(product.GST * product.price) /
|
||||
@ -985,7 +994,7 @@ export const updateCourierStatusToDispatched = async (req, res) => {
|
||||
<tr>
|
||||
<th colspan="7" style="border: 1px solid #555; padding: 2px; text-align: right;">Total Amount:</th>
|
||||
<td style="border: 1px solid #555; padding: 2px; text-align: center;">₹${
|
||||
invoice.invoiceAmount
|
||||
(invoice.invoiceAmount).toFixed(2)
|
||||
}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@ -1181,7 +1190,7 @@ export const updateCourierStatusToDelivered = async (req, res) => {
|
||||
product.processquantity
|
||||
}</td>
|
||||
<td style="border: 1px solid #555; padding: 2px; text-align: center;">₹${
|
||||
product.price
|
||||
(product.price).toFixed(2)
|
||||
}</td>
|
||||
<td style="border: 1px solid #555; padding: 2px; text-align: center;">₹${(
|
||||
(product.GST * product.price) /
|
||||
@ -1490,13 +1499,11 @@ export const gettotalorderandvalueofpd = async (req, res) => {
|
||||
// Get the date of the last order
|
||||
const lastPurchaseOrderDate = totalOrders > 0 ? orders[0].createdAt : null;
|
||||
|
||||
res
|
||||
.status(200)
|
||||
.json({
|
||||
totalOrders,
|
||||
totalValue: parseFloat(totalValue),
|
||||
lastPurchaseOrderDate,
|
||||
});
|
||||
res.status(200).json({
|
||||
totalOrders,
|
||||
totalValue: parseFloat(totalValue),
|
||||
lastPurchaseOrderDate,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("Error fetching orders:", error);
|
||||
res.status(500).json({ message: "Server error", error });
|
||||
|
@ -80,9 +80,11 @@ export const getProductsWithOpenInventoryInfo = async (req, res) => {
|
||||
name: product.name,
|
||||
brand: product.brand?.brandName || "N/A", // Access brandName here
|
||||
category: product.category?.categoryName || "N/A", // Access categoryName here
|
||||
allPDs: pdMap[product.SKU] || 0,
|
||||
allRDs: rdMap[product.SKU] || 0,
|
||||
allPdAndRd: (pdMap[product.SKU] || 0) + (rdMap[product.SKU] || 0),
|
||||
allPDs: (pdMap[product.SKU] || 0).toFixed(2),
|
||||
allRDs: (rdMap[product.SKU] || 0).toFixed(2),
|
||||
allPdAndRd: (
|
||||
(pdMap[product.SKU] || 0) + (rdMap[product.SKU] || 0)
|
||||
).toFixed(2),
|
||||
}));
|
||||
|
||||
// Step 7: Get total count for pagination
|
||||
@ -179,9 +181,11 @@ export const getProductsWithStockInfo = async (req, res) => {
|
||||
name: product.name,
|
||||
brand: product.brand?.brandName || "N/A", // Access brandName here
|
||||
category: product.category?.categoryName || "N/A", // Access categoryName here
|
||||
allPDs: pdMap[product.SKU] || 0,
|
||||
allRDs: rdMap[product.SKU] || 0,
|
||||
allPdAndRd: (pdMap[product.SKU] || 0) + (rdMap[product.SKU] || 0),
|
||||
allPDs: (pdMap[product.SKU] || 0).toFixed(2),
|
||||
allRDs: (rdMap[product.SKU] || 0).toFixed(2),
|
||||
allPdAndRd: (
|
||||
(pdMap[product.SKU] || 0) + (rdMap[product.SKU] || 0)
|
||||
).toFixed(2),
|
||||
}));
|
||||
|
||||
// Step 7: Get total count for pagination
|
||||
@ -261,24 +265,37 @@ export const DownloadProductsWithOpenInventoryInfo = async (req, res) => {
|
||||
// Combine product info with PD/RD counts using SKU
|
||||
const productData = products.map((product) => ({
|
||||
"SKU Code": product.SKU,
|
||||
"SKU Description": product.name, // SKU Description
|
||||
"Category Name": product.category?.categoryName || "N/A", // Category Name
|
||||
"Brand Name": product.brand?.brandName || "N/A", // Brand Name
|
||||
"Total At PDs And Retailers": (pdMap[product.SKU] || 0) + (rdMap[product.SKU] || 0), // Total At PDs & Retailers
|
||||
"All PDs": pdMap[product.SKU] || 0, // All PDs
|
||||
"All Retailers": rdMap[product.SKU] || 0, // All Retailers
|
||||
"SKU Description": product.name, // SKU Description
|
||||
"Category Name": product.category?.categoryName || "N/A", // Category Name
|
||||
"Brand Name": product.brand?.brandName || "N/A", // Brand Name
|
||||
"Total At PDs And Retailers": (
|
||||
(pdMap[product.SKU] || 0) + (rdMap[product.SKU] || 0)
|
||||
).toFixed(2), // Total At PDs & Retailers
|
||||
"All PDs": (pdMap[product.SKU] || 0).toFixed(2), // All PDs
|
||||
"All Retailers": (rdMap[product.SKU] || 0).toFixed(2), // All Retailers
|
||||
}));
|
||||
|
||||
// Define headers (first row in the sheet)
|
||||
const headers = [
|
||||
["SKU Code", "SKU Description", "Category Name", "Brand Name", "Total At PDs And Retailers", "All PDs", "All Retailers"]
|
||||
[
|
||||
"SKU Code",
|
||||
"SKU Description",
|
||||
"Category Name",
|
||||
"Brand Name",
|
||||
"Total At PDs And Retailers",
|
||||
"All PDs",
|
||||
"All Retailers",
|
||||
],
|
||||
];
|
||||
|
||||
// Create worksheet with headers
|
||||
const worksheet = XLSX.utils.aoa_to_sheet(headers);
|
||||
|
||||
// Append product data below headers
|
||||
XLSX.utils.sheet_add_json(worksheet, productData, { skipHeader: true, origin: "A2" });
|
||||
XLSX.utils.sheet_add_json(worksheet, productData, {
|
||||
skipHeader: true,
|
||||
origin: "A2",
|
||||
});
|
||||
|
||||
// Calculate and set column widths based on content
|
||||
const columnWidths = headers[0].map((header, index) => {
|
||||
@ -289,20 +306,28 @@ export const DownloadProductsWithOpenInventoryInfo = async (req, res) => {
|
||||
}
|
||||
return { wch: maxLength + 2 }; // Add some padding
|
||||
});
|
||||
worksheet['!cols'] = columnWidths;
|
||||
worksheet["!cols"] = columnWidths;
|
||||
|
||||
// Create workbook and append worksheet
|
||||
const workbook = XLSX.utils.book_new();
|
||||
XLSX.utils.book_append_sheet(workbook, worksheet, "OpeningInventoryReport");
|
||||
|
||||
// Write workbook to buffer
|
||||
const excelBuffer = XLSX.write(workbook, { bookType: "xlsx", type: "buffer" });
|
||||
const excelBuffer = XLSX.write(workbook, {
|
||||
bookType: "xlsx",
|
||||
type: "buffer",
|
||||
});
|
||||
|
||||
// Send Excel file as response
|
||||
res.setHeader("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
||||
res.setHeader("Content-Disposition", "attachment; filename=OpeningInventoryReport.xlsx");
|
||||
res.setHeader(
|
||||
"Content-Type",
|
||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
||||
);
|
||||
res.setHeader(
|
||||
"Content-Disposition",
|
||||
"attachment; filename=OpeningInventoryReport.xlsx"
|
||||
);
|
||||
res.send(excelBuffer);
|
||||
|
||||
} catch (error) {
|
||||
res.status(500).json({ success: false, message: error.message });
|
||||
}
|
||||
@ -367,24 +392,37 @@ export const DownloadProductsWithStockInfo = async (req, res) => {
|
||||
// Combine product info with PD/RD counts using SKU
|
||||
const productData = products.map((product) => ({
|
||||
"SKU Code": product.SKU,
|
||||
"SKU Description": product.name, // SKU Description
|
||||
"Category Name": product.category?.categoryName || "N/A", // Category Name
|
||||
"Brand Name": product.brand?.brandName || "N/A", // Brand Name
|
||||
"Total At PDs And Retailers": (pdMap[product.SKU] || 0) + (rdMap[product.SKU] || 0), // Total At PDs & Retailers
|
||||
"All PDs": pdMap[product.SKU] || 0, // All PDs
|
||||
"All Retailers": rdMap[product.SKU] || 0, // All Retailers
|
||||
"SKU Description": product.name, // SKU Description
|
||||
"Category Name": product.category?.categoryName || "N/A", // Category Name
|
||||
"Brand Name": product.brand?.brandName || "N/A", // Brand Name
|
||||
"Total At PDs And Retailers": (
|
||||
(pdMap[product.SKU] || 0) + (rdMap[product.SKU] || 0)
|
||||
).toFixed(2), // Total At PDs & Retailers
|
||||
"All PDs": (pdMap[product.SKU] || 0).toFixed(2), // All PDs
|
||||
"All Retailers": (rdMap[product.SKU] || 0).toFixed(2), // All Retailers
|
||||
}));
|
||||
|
||||
// Define headers (first row in the sheet)
|
||||
const headers = [
|
||||
["SKU Code", "SKU Description", "Category Name", "Brand Name", "Total At PDs And Retailers", "All PDs", "All Retailers"]
|
||||
[
|
||||
"SKU Code",
|
||||
"SKU Description",
|
||||
"Category Name",
|
||||
"Brand Name",
|
||||
"Total At PDs And Retailers",
|
||||
"All PDs",
|
||||
"All Retailers",
|
||||
],
|
||||
];
|
||||
|
||||
// Create worksheet with headers
|
||||
const worksheet = XLSX.utils.aoa_to_sheet(headers);
|
||||
|
||||
// Append product data below headers
|
||||
XLSX.utils.sheet_add_json(worksheet, productData, { skipHeader: true, origin: "A2" });
|
||||
XLSX.utils.sheet_add_json(worksheet, productData, {
|
||||
skipHeader: true,
|
||||
origin: "A2",
|
||||
});
|
||||
|
||||
// Calculate and set column widths based on content
|
||||
const columnWidths = headers[0].map((header, index) => {
|
||||
@ -395,20 +433,28 @@ export const DownloadProductsWithStockInfo = async (req, res) => {
|
||||
}
|
||||
return { wch: maxLength + 2 }; // Add some padding
|
||||
});
|
||||
worksheet['!cols'] = columnWidths;
|
||||
worksheet["!cols"] = columnWidths;
|
||||
|
||||
// Create workbook and append worksheet
|
||||
const workbook = XLSX.utils.book_new();
|
||||
XLSX.utils.book_append_sheet(workbook, worksheet, "StockReport");
|
||||
|
||||
// Write workbook to buffer
|
||||
const excelBuffer = XLSX.write(workbook, { bookType: "xlsx", type: "buffer" });
|
||||
const excelBuffer = XLSX.write(workbook, {
|
||||
bookType: "xlsx",
|
||||
type: "buffer",
|
||||
});
|
||||
|
||||
// Send Excel file as response
|
||||
res.setHeader("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
||||
res.setHeader("Content-Disposition", "attachment; filename=StockReport.xlsx");
|
||||
res.setHeader(
|
||||
"Content-Type",
|
||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
||||
);
|
||||
res.setHeader(
|
||||
"Content-Disposition",
|
||||
"attachment; filename=StockReport.xlsx"
|
||||
);
|
||||
res.send(excelBuffer);
|
||||
|
||||
} catch (error) {
|
||||
res.status(500).json({ success: false, message: error.message });
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user