Skip to content

Commit d14d04e

Browse files
authored
Merge pull request #117 from AmandeepMandal1077/feat/confirm-ocr
added editing for ocr extracted receipt Closes #11
2 parents 6bbb847 + 03eb368 commit d14d04e

File tree

3 files changed

+344
-154
lines changed

3 files changed

+344
-154
lines changed

backend/controllers/receiptController.js

Lines changed: 59 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -75,19 +75,6 @@ const uploadReceipt = async (req, res) => {
7575

7676
const savedReceipt = await newReceipt.save();
7777

78-
// Automatically create a corresponding expense transaction
79-
if (savedReceipt) {
80-
const newTransaction = new IncomeExpense({
81-
user: req.user.id,
82-
name: savedReceipt.extractedData.merchant,
83-
category: savedReceipt.extractedData.category,
84-
cost: savedReceipt.extractedData.amount,
85-
addedOn: savedReceipt.extractedData.date,
86-
isIncome: false,
87-
});
88-
await newTransaction.save();
89-
}
90-
9178
res.status(201).json(savedReceipt);
9279
} catch (error) {
9380
console.error("Error with Gemini API:", error);
@@ -103,6 +90,65 @@ const uploadReceipt = async (req, res) => {
10390
}
10491
};
10592

93+
// @desc Save transaction after user confirmation and edits
94+
// @route POST /api/receipts/save-transaction
95+
// @access Private
96+
const saveTransactionFromReceipt = async (req, res) => {
97+
try {
98+
const { receiptId, transactionData } = req.body;
99+
100+
// Validate required fields
101+
if (!receiptId || !transactionData) {
102+
return res.status(400).json({ message: 'Receipt ID and transaction data are required' });
103+
}
104+
105+
// Verify the receipt belongs to the user
106+
const receipt = await Receipt.findOne({ _id: receiptId, user: req.user.id });
107+
if (!receipt) {
108+
return res.status(404).json({ message: 'Receipt not found' });
109+
}
110+
111+
// Validate and parse the date
112+
const transactionDate = new Date(transactionData.addedOn);
113+
if (isNaN(transactionDate.getTime())) {
114+
return res.status(400).json({ message: 'Invalid date format provided' });
115+
}
116+
117+
// Create the transaction with user-confirmed data
118+
const newTransaction = new IncomeExpense({
119+
user: req.user.id,
120+
name: transactionData.name,
121+
category: transactionData.category,
122+
cost: transactionData.cost,
123+
addedOn: transactionDate,
124+
isIncome: transactionData.isIncome || false,
125+
});
126+
127+
const savedTransaction = await newTransaction.save();
128+
129+
// Update the receipt with the final confirmed data
130+
receipt.extractedData = {
131+
merchant: transactionData.name,
132+
amount: transactionData.cost,
133+
category: transactionData.category,
134+
date: transactionDate,
135+
isIncome: transactionData.isIncome || false,
136+
};
137+
await receipt.save();
138+
139+
res.status(201).json({
140+
message: 'Transaction saved successfully',
141+
transaction: savedTransaction,
142+
receipt: receipt
143+
});
144+
145+
} catch (error) {
146+
console.error('Error saving transaction:', error);
147+
res.status(500).json({ message: 'Failed to save transaction', error: error.message });
148+
}
149+
};
150+
106151
module.exports = {
107152
uploadReceipt,
153+
saveTransactionFromReceipt,
108154
};

backend/routes/receiptRoutes.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
const express = require('express');
22
const router = express.Router();
3-
const { uploadReceipt } = require('../controllers/receiptController');
3+
const { uploadReceipt, saveTransactionFromReceipt } = require('../controllers/receiptController');
44
const { protect } = require('../middleware/authMiddleware');
55
const upload = require('../middleware/uploadMiddleware');
66

77
router.post('/upload', protect, upload, uploadReceipt);
8+
router.post('/save-transaction', protect, saveTransactionFromReceipt);
89

910
module.exports = router;

0 commit comments

Comments
 (0)