Страна за трансакции
Креирање договор
Првенствено, за креирање на договор имавме
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
7 weeks ago
Last modified on 09/11/25 04:43:31
Note:
See TracWiki
for help on using the wiki.
