import constants from "../../common/constants.mjs";
import app from "../../you_need_a_budget.app.mjs";
export default {
key: "you_need_a_budget-update-transaction",
name: "Update Transaction",
description: "Update an existing transaction. [See the docs](https://api.youneedabudget.com/v1#/Transactions/updateTransaction)",
version: "0.0.2",
type: "action",
props: {
app,
budgetId: {
propDefinition: [
app,
"budgetId",
],
},
accountId: {
propDefinition: [
app,
"accountId",
({ budgetId }) => ({
budgetId,
}),
],
},
transactionId: {
propDefinition: [
app,
"transactionId",
({ budgetId }) => ({
budgetId,
}),
],
},
date: {
description: "The transaction date in ISO format `YYYY-MM-DD` (e.g. `2016-12-01`). Future dates (scheduled transactions) are not permitted. Split transaction dates cannot be changed and if a different date is supplied it will be ignored.",
propDefinition: [
app,
"date",
],
},
payeeId: {
label: "Payee ID",
description: "The id of the payee.",
optional: true,
propDefinition: [
app,
"payee",
({ budgetId }) => ({
budgetId,
}),
],
},
categoryId: {
propDefinition: [
app,
"categoryId",
({ budgetId }) => ({
budgetId,
}),
],
optional: true,
},
amount: {
propDefinition: [
app,
"amount",
],
},
memo: {
type: "string",
label: "Memo",
description: "A short description.",
optional: true,
},
cleared: {
type: "string[]",
label: "Cleared",
description: "The cleared status of the transaction.",
options: Object.values(constants.CLEARED_STATUS),
optional: true,
},
approved: {
type: "boolean",
label: "Approved",
description: "Approve the transaction directly?",
optional: true,
},
},
methods: {
updateTransaction({
budgetId, transactionId, data = {},
}) {
return this.app._client().transactions.updateTransaction(
budgetId,
transactionId,
data,
);
},
},
async run({ $: step }) {
const {
budgetId,
transactionId,
accountId,
date,
payeeId,
categoryId,
amount,
memo,
cleared,
approved,
} = this;
try {
const response = await this.updateTransaction({
budgetId,
transactionId,
data: {
transaction: {
account_id: accountId,
date,
amount: this.app._convertToMilliunit(amount),
payee_id: payeeId,
category_id: categoryId?.value ?? categoryId,
memo,
cleared,
approved,
},
},
});
step.export("$summary", `Transaction ${this.response.data.transaction.id} updated.`);
return response;
} catch (error) {
const msg = "Error updating transaction";
const strError = JSON.stringify(error, null, 2);
if (!error?.error) {
console.log("Error in API response, please check your transactions to make sure the changes were applied.");
step.export("$summary", `Transaction ${this.transactionId} updated.`);
return {
success: true,
transactionId,
};
}
console.log(msg, error);
throw new Error(`${msg}: ${strError}`);
}
},
};