Files
bigcapital/server/src/models/Expense.js
Ahmed Bouhuolia 188e411f02 feat: rewrite repositories with base entity repository class.
feat: sales and purchases status.
feat: sales and purchases auto-increment number.
fix: settings find query with extra columns.
2020-12-13 19:50:59 +02:00

182 lines
4.0 KiB
JavaScript

import { Model } from "objection";
import TenantModel from "models/TenantModel";
import { viewRolesBuilder } from "lib/ViewRolesBuilder";
export default class Expense extends TenantModel {
/**
* Table name
*/
static get tableName() {
return "expenses_transactions";
}
/**
* Account transaction reference type.
*/
static get referenceType() {
return "Expense";
}
/**
* Model timestamps.
*/
get timestamps() {
return ["createdAt", "updatedAt"];
}
/**
* Allows to mark model as resourceable to viewable and filterable.
*/
static get resourceable() {
return true;
}
/**
*
*/
static get media() {
return true;
}
static get virtualAttributes() {
return ["isPublished"];
}
isPublished() {
return Boolean(this.publishedAt);
}
/**
* Model modifiers.
*/
static get modifiers() {
return {
filterByDateRange(query, startDate, endDate) {
if (startDate) {
query.where("date", ">=", startDate);
}
if (endDate) {
query.where("date", "<=", endDate);
}
},
filterByAmountRange(query, from, to) {
if (from) {
query.where("amount", ">=", from);
}
if (to) {
query.where("amount", "<=", to);
}
},
filterByExpenseAccount(query, accountId) {
if (accountId) {
query.where("expense_account_id", accountId);
}
},
filterByPaymentAccount(query, accountId) {
if (accountId) {
query.where("payment_account_id", accountId);
}
},
viewRolesBuilder(query, conditionals, expression) {
viewRolesBuilder(conditionals, expression)(query);
},
};
}
/**
* Relationship mapping.
*/
static get relationMappings() {
const Account = require("models/Account");
const ExpenseCategory = require("models/ExpenseCategory");
const Media = require("models/Media");
return {
paymentAccount: {
relation: Model.BelongsToOneRelation,
modelClass: Account.default,
join: {
from: "expenses_transactions.paymentAccountId",
to: "accounts.id",
},
},
categories: {
relation: Model.HasManyRelation,
modelClass: ExpenseCategory.default,
join: {
from: "expenses_transactions.id",
to: "expense_transaction_categories.expenseId",
},
},
media: {
relation: Model.ManyToManyRelation,
modelClass: Media.default,
join: {
from: "expenses_transactions.id",
through: {
from: "media_links.model_id",
to: "media_links.media_id",
},
to: "media.id",
},
filter(query) {
query.where("model_name", "Expense");
},
},
};
}
/**
* Model defined fields.
*/
static get fields() {
return {
payment_date: {
label: "Payment date",
column: "payment_date",
columnType: "date",
},
payment_account: {
label: "Payment account",
column: "payment_account_id",
relation: "accounts.id",
optionsResource: "account",
},
amount: {
label: "Amount",
column: "total_amount",
columnType: "number",
},
currency_code: {
label: "Currency",
column: "currency_code",
optionsResource: "currency",
},
reference_no: {
label: "Reference No.",
column: "reference_no",
columnType: "string",
},
description: {
label: "Description",
column: "description",
columnType: "string",
},
published: {
label: "Published",
column: "published",
},
user: {
label: "User",
column: "user_id",
relation: "users.id",
relationColumn: "users.id",
},
created_at: {
label: "Created at",
column: "created_at",
columnType: "date",
},
};
}
}