@@ -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+
106151module . exports = {
107152 uploadReceipt,
153+ saveTransactionFromReceipt,
108154} ;
0 commit comments