Страна за трансакции
Креирање договор
Првенствено, за креирање на договор имавме
pool.query( "INSERT INTO agreement (A_Id, Price, Status, Datum, Tax_Nr, VIN, EMBG) VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING *", [A_Id, Price, Status, Datum, Tax_Nr, VIN, EMBG], (error, results) => { if (error) { reject(new Error("Not able to create agreement.")); } if (results && results.rows) { // Update vehicle status to sold pool.query( "UPDATE vehicle SET status = false WHERE vin = $1", [VIN], (updateError, updateResults) => { if (updateError) { console.error("Error updating vehicle status:", updateError); } } ); resolve(`Agreement created successfully.`); } else { reject(new Error("Not able to create agreement.")); } } );
Меѓутоа сега со трансакции за да се осигураме дека возилото постои, возилото е достапно, и да се постави како продадено и тргне од продажба доколку е креиран договорот успешно имаме:
pool.connect((err, client, done) => { if (err) { console.error('Error getting client from pool:', err); reject(err); return; } client.query('BEGIN', (beginError) => { if (beginError) { console.error('Begin transaction error:', beginError); done(); reject(beginError); return; } // First, validate that the vehicle exists and is available client.query( "SELECT vin, status, price FROM vehicle WHERE vin = $1 AND tax_nr = $2", [VIN, Tax_Nr], (validateError, validateResults) => { if (validateError) { console.error('Vehicle validation error:', validateError); client.query('ROLLBACK', () => { done(); }); reject(new Error("Error validating vehicle.")); return; } if (!validateResults.rows || validateResults.rows.length === 0) { console.error('Vehicle not found or not owned by dealership'); client.query('ROLLBACK', () => { done(); }); reject(new Error("Vehicle not found or you don't have permission to sell it.")); return; } const vehicle = validateResults.rows[0]; if (vehicle.status === false) { console.error('Vehicle is already sold'); client.query('ROLLBACK', () => { done(); }); reject(new Error("Vehicle is already sold.")); return; } // Validate that the agreement price matches vehicle price if (parseFloat(Price) !== parseFloat(vehicle.price)) { console.error('Agreement price does not match vehicle price'); client.query('ROLLBACK', () => { done(); }); reject(new Error("Agreement price must match vehicle price.")); return; } // Insert agreement client.query( "INSERT INTO agreement (A_Id, Price, Status, Datum, Tax_Nr, VIN, EMBG) VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING *", [A_Id, Price, Status, Datum, Tax_Nr, VIN, EMBG], (error, results) => { if (error) { console.error('Agreement insert error:', error); client.query('ROLLBACK', () => { done(); }); reject(new Error("Not able to create agreement.")); return; } if (results && results.rows) { console.log('Agreement inserted successfully'); // Update vehicle status to sold client.query( "UPDATE vehicle SET status = false WHERE vin = $1", [VIN], (updateError, updateResults) => { if (updateError) { console.error('Vehicle update error:', updateError); client.query('ROLLBACK', () => { done(); }); reject(new Error("Error updating vehicle status.")); return; } console.log('Vehicle status updated successfully'); // Commit the transaction client.query('COMMIT', (commitError) => { done(); if (commitError) { console.error('Commit error:', commitError); reject(commitError); } else { console.log('Agreement transaction committed successfully'); resolve(`Agreement created successfully.`); } }); } ); } else { client.query('ROLLBACK', () => { done(); }); reject(new Error("Not able to create agreement.")); } } ); } ); }); });
Уплата
Исто како и за Договор, претходно во Уплатата имавме:
pool.query( "INSERT INTO payment (Bank, IBAN, Amount, EMBG, A_Id) VALUES ($1, $2, $3, $4, $5) RETURNING *", [Bank, IBAN, Amount, EMBG, A_Id], (error, results) => { if (error) { reject(new Error("Not able to create payment.")); } if (results && results.rows) { resolve(`Payment created successfully.`); } else { reject(new Error("Not able to create payment.")); } } );
Сега со трансакции се осигуруваме дали постои договор и дали точниот клиент е асоциран со него, дали е валиден договорот, проверуваме да не случано веќе е извршено уплаќање за него, и се означува како платен доколку е успешно извршена уплата.
pool.connect((err, client, done) => { if (err) { console.error('Error getting client from pool:', err); reject(err); return; } client.query('BEGIN', (beginError) => { if (beginError) { console.error('Begin transaction error:', beginError); done(); reject(beginError); return; } // First, validate that the agreement exists and belongs to the client client.query( `SELECT a.a_id, a.price as agreement_price, a.status as agreement_status, v.vin, v.make, v.model, v.p_year, v.color, c.c_name, c.embg FROM agreement a JOIN vehicle v ON a.vin = v.vin JOIN client c ON a.embg = c.embg WHERE a.a_id = $1 AND a.embg = $2`, [A_Id, EMBG], (validateError, validateResults) => { if (validateError) { console.error('Agreement validation error:', validateError); client.query('ROLLBACK', () => { done(); }); reject(new Error("Error validating agreement.")); return; } if (!validateResults.rows || validateResults.rows.length === 0) { console.error('Agreement not found or not owned by client'); client.query('ROLLBACK', () => { done(); }); reject(new Error("Agreement not found or you don't have permission to pay for it.")); return; } const agreement = validateResults.rows[0]; // Validate that the agreement is active if (agreement.agreement_status !== true) { console.error('Agreement is not active'); client.query('ROLLBACK', () => { done(); }); reject(new Error("Agreement is not active.")); return; } // Validate that the payment amount matches agreement price if (parseFloat(Amount) !== parseFloat(agreement.agreement_price)) { console.error('Payment amount does not match agreement price'); client.query('ROLLBACK', () => { done(); }); reject(new Error("Payment amount must match agreement price.")); return; } // Check if payment already exists for this agreement client.query( "SELECT p_id FROM payment WHERE a_id = $1", [A_Id], (checkError, checkResults) => { if (checkError) { console.error('Payment check error:', checkError); client.query('ROLLBACK', () => { done(); }); reject(new Error("Error checking existing payments.")); return; } if (checkResults.rows && checkResults.rows.length > 0) { console.error('Payment already exists for this agreement'); client.query('ROLLBACK', () => { done(); }); reject(new Error("Payment already exists for this agreement.")); return; } // Insert payment client.query( "INSERT INTO payment (Bank, IBAN, Amount, EMBG, A_Id) VALUES ($1, $2, $3, $4, $5) RETURNING *", [Bank, IBAN, Amount, EMBG, A_Id], (error, results) => { if (error) { console.error('Payment insert error:', error); client.query('ROLLBACK', () => { done(); }); reject(new Error("Not able to create payment.")); return; } if (results && results.rows) { console.log('Payment inserted successfully'); // Optionally update agreement status to paid client.query( "UPDATE agreement SET status = false WHERE a_id = $1", [A_Id], (updateError, updateResults) => { if (updateError) { console.error('Agreement status update error:', updateError); // Don't fail the transaction for this, just log it console.log('Payment created but agreement status not updated'); } else { console.log('Agreement status updated to paid'); } // Commit the transaction client.query('COMMIT', (commitError) => { done(); if (commitError) { console.error('Commit error:', commitError); reject(commitError); } else { console.log('Payment transaction committed successfully'); resolve(`Payment created successfully.`); } }); } ); } else { client.query('ROLLBACK', () => { done(); }); reject(new Error("Not able to create payment.")); } } ); } ); } ); }); });
Last modified
11 hours ago
Last modified on 09/11/25 04:43:31
Note:
See TracWiki
for help on using the wiki.