diff --git a/packages/server/src/i18n/en/vendor_credit.json b/packages/server/src/i18n/en/vendor_credit.json new file mode 100644 index 000000000..f0059f923 --- /dev/null +++ b/packages/server/src/i18n/en/vendor_credit.json @@ -0,0 +1,6 @@ +{ + "view.draft": "Draft", + "view.published": "Published", + "view.open": "Open", + "view.closed": "Closed" +} diff --git a/packages/server/src/modules/Accounts/constants.ts b/packages/server/src/modules/Accounts/constants.ts index deab658bc..c06fe95df 100644 --- a/packages/server/src/modules/Accounts/constants.ts +++ b/packages/server/src/modules/Accounts/constants.ts @@ -34,7 +34,7 @@ export const DEFAULT_VIEW_COLUMNS = [ export const MAX_ACCOUNTS_CHART_DEPTH = 5; // Accounts default views. -export const DEFAULT_VIEWS = [ +export const AccountDefaultViews = [ { name: 'Assets', slug: 'assets', diff --git a/packages/server/src/modules/Accounts/models/Account.model.ts b/packages/server/src/modules/Accounts/models/Account.model.ts index d4f034607..cd26630c3 100644 --- a/packages/server/src/modules/Accounts/models/Account.model.ts +++ b/packages/server/src/modules/Accounts/models/Account.model.ts @@ -14,10 +14,13 @@ import { ExportableModel } from '../../Export/decorators/ExportableModel.decorat import { AccountMeta } from './Account.meta'; import { InjectModelMeta } from '@/modules/Tenancy/TenancyModels/decorators/InjectModelMeta.decorator'; import { ImportableModel } from '@/modules/Import/decorators/Import.decorator'; +import { InjectModelDefaultViews } from '@/modules/Views/decorators/InjectModelDefaultViews.decorator'; +import { AccountDefaultViews } from '../constants'; @ExportableModel() @ImportableModel() @InjectModelMeta(AccountMeta) +@InjectModelDefaultViews(AccountDefaultViews) export class Account extends TenantBaseModel { public name!: string; public slug!: string; @@ -227,7 +230,7 @@ export class Account extends TenantBaseModel { to: 'accounts_transactions.accountId', }, }, - + /** * Account may has many items as cost account. */ @@ -422,20 +425,6 @@ export class Account extends TenantBaseModel { }); } - /** - * Model settings. - */ - // static get meta() { - // return AccountSettings; - // } - - /** - * Retrieve the default custom views, roles and columns. - */ - // static get defaultViews() { - // return DEFAULT_VIEWS; - // } - /** * Model search roles. */ diff --git a/packages/server/src/modules/BankingTransactions/models/BankAccount.ts b/packages/server/src/modules/BankingTransactions/models/BankAccount.ts index fab1d9db5..5c9edabf9 100644 --- a/packages/server/src/modules/BankingTransactions/models/BankAccount.ts +++ b/packages/server/src/modules/BankingTransactions/models/BankAccount.ts @@ -109,24 +109,10 @@ export class BankAccount extends TenantBaseModel { isParentType(parentType) { return AccountTypesUtils.isParentTypeEqualsKey( this.accountType, - parentType + parentType, ); } - // /** - // * Model settings. - // */ - // static get meta() { - // return CashflowAccountSettings; - // } - - // /** - // * Retrieve the default custom views, roles and columns. - // */ - // static get defaultViews() { - // return DEFAULT_VIEWS; - // } - /** * Model search roles. */ diff --git a/packages/server/src/modules/BillPayments/constants.ts b/packages/server/src/modules/BillPayments/constants.ts index 29c93b1f5..3c950108b 100644 --- a/packages/server/src/modules/BillPayments/constants.ts +++ b/packages/server/src/modules/BillPayments/constants.ts @@ -14,7 +14,7 @@ export const ERRORS = { WITHDRAWAL_ACCOUNT_CURRENCY_INVALID: 'WITHDRAWAL_ACCOUNT_CURRENCY_INVALID', }; -export const DEFAULT_VIEWS = []; +export const BillPaymentDefaultViews = []; export const BillsPaymentsSampleData = [ { diff --git a/packages/server/src/modules/BillPayments/models/BillPayment.ts b/packages/server/src/modules/BillPayments/models/BillPayment.ts index 057ab6d84..5f05d9e4b 100644 --- a/packages/server/src/modules/BillPayments/models/BillPayment.ts +++ b/packages/server/src/modules/BillPayments/models/BillPayment.ts @@ -1,3 +1,4 @@ +import { Model } from 'objection'; import { BillPaymentEntry } from './BillPaymentEntry'; import { Vendor } from '@/modules/Vendors/models/Vendor'; import { Document } from '@/modules/ChromiumlyTenancy/models/Document'; @@ -6,11 +7,13 @@ import { ExportableModel } from '@/modules/Export/decorators/ExportableModel.dec import { InjectModelMeta } from '@/modules/Tenancy/TenancyModels/decorators/InjectModelMeta.decorator'; import { BillPaymentMeta } from './BillPayment.meta'; import { TenantBaseModel } from '@/modules/System/models/TenantBaseModel'; -import { Model } from 'objection'; +import { InjectModelDefaultViews } from '@/modules/Views/decorators/InjectModelDefaultViews.decorator'; +import { BillPaymentDefaultViews } from '../constants'; @ImportableModel() @ExportableModel() @InjectModelMeta(BillPaymentMeta) +@InjectModelDefaultViews(BillPaymentDefaultViews) export class BillPayment extends TenantBaseModel { vendorId: number; amount: number; @@ -61,7 +64,7 @@ export class BillPayment extends TenantBaseModel { get localAmount() { return this.amount * this.exchangeRate; } - + /** * Relationship mapping. */ @@ -154,13 +157,6 @@ export class BillPayment extends TenantBaseModel { }; } - /** - * Retrieve the default custom views, roles and columns. - */ - // static get defaultViews() { - // return DEFAULT_VIEWS; - // } - /** * Model search attributes. */ diff --git a/packages/server/src/modules/Bills/Bills.constants.ts b/packages/server/src/modules/Bills/Bills.constants.ts index fe61c5857..d68365b50 100644 --- a/packages/server/src/modules/Bills/Bills.constants.ts +++ b/packages/server/src/modules/Bills/Bills.constants.ts @@ -23,7 +23,7 @@ export const ERRORS = { export const DEFAULT_VIEW_COLUMNS = []; -export const DEFAULT_VIEWS = [ +export const BillDefaultViews = [ { name: 'Draft', slug: 'draft', diff --git a/packages/server/src/modules/Bills/models/Bill.ts b/packages/server/src/modules/Bills/models/Bill.ts index 1012b230d..b3194585e 100644 --- a/packages/server/src/modules/Bills/models/Bill.ts +++ b/packages/server/src/modules/Bills/models/Bill.ts @@ -11,9 +11,12 @@ import { TenantBaseModel } from '@/modules/System/models/TenantBaseModel'; import { ExportableModel } from '@/modules/Export/decorators/ExportableModel.decorator'; import { InjectModelMeta } from '@/modules/Tenancy/TenancyModels/decorators/InjectModelMeta.decorator'; import { BillMeta } from './Bill.meta'; +import { InjectModelDefaultViews } from '@/modules/Views/decorators/InjectModelDefaultViews.decorator'; +import { BillDefaultViews } from '../Bills.constants'; @ExportableModel() @InjectModelMeta(BillMeta) +@InjectModelDefaultViews(BillDefaultViews) export class Bill extends TenantBaseModel { public amount: number; public paymentAmount: number; @@ -486,7 +489,9 @@ export class Bill extends TenantBaseModel { TaxRateTransaction, } = require('../../TaxRates/models/TaxRateTransaction.model'); const { Document } = require('../../ChromiumlyTenancy/models/Document'); - const { MatchedBankTransaction } = require('../../BankingMatching/models/MatchedBankTransaction'); + const { + MatchedBankTransaction, + } = require('../../BankingMatching/models/MatchedBankTransaction'); return { vendor: { @@ -631,13 +636,6 @@ export class Bill extends TenantBaseModel { [changeMethod]('payment_amount', Math.abs(amount)); } - /** - * Retrieve the default custom views, roles and columns. - */ - // static get defaultViews() { - // return DEFAULT_VIEWS; - // } - /** * Model search attributes. */ diff --git a/packages/server/src/modules/CreditNotes/constants.ts b/packages/server/src/modules/CreditNotes/constants.ts index 4f1d51d30..ad0db2e2c 100644 --- a/packages/server/src/modules/CreditNotes/constants.ts +++ b/packages/server/src/modules/CreditNotes/constants.ts @@ -13,7 +13,7 @@ export const ERRORS = { }; export const DEFAULT_VIEW_COLUMNS = []; -export const DEFAULT_VIEWS = [ +export const CreditNoteDefaultViews = [ { name: 'credit_note.view.draft', slug: 'draft', @@ -71,7 +71,7 @@ export const defaultCreditNoteBrandingAttributes = { // # Colors primaryColor: '', secondaryColor: '', - + // # Company logo showCompanyLogo: true, companyLogoKey: '', diff --git a/packages/server/src/modules/CreditNotes/models/CreditNote.ts b/packages/server/src/modules/CreditNotes/models/CreditNote.ts index ec029ca62..15ad3a78a 100644 --- a/packages/server/src/modules/CreditNotes/models/CreditNote.ts +++ b/packages/server/src/modules/CreditNotes/models/CreditNote.ts @@ -10,10 +10,13 @@ import { ItemEntry } from '@/modules/TransactionItemEntry/models/ItemEntry'; import { Warehouse } from '@/modules/Warehouses/models/Warehouse.model'; import { mixin, Model, raw } from 'objection'; import { CreditNoteMeta } from './CreditNote.meta'; +import { InjectModelDefaultViews } from '@/modules/Views/decorators/InjectModelDefaultViews.decorator'; +import { CreditNoteDefaultViews } from '../constants'; @ExportableModel() @ImportableModel() @InjectModelMeta(CreditNoteMeta) +@InjectModelDefaultViews(CreditNoteDefaultViews) export class CreditNote extends TenantBaseModel { public amount: number; public exchangeRate: number; @@ -402,20 +405,6 @@ export class CreditNote extends TenantBaseModel { }; } - // /** - // * Sale invoice meta. - // */ - // static get meta() { - // return CreditNoteMeta; - // } - - // /** - // * Retrieve the default custom views, roles and columns. - // */ - // static get defaultViews() { - // return DEFAULT_VIEWS; - // } - /** * Model searchable. */ diff --git a/packages/server/src/modules/Customers/constants.ts b/packages/server/src/modules/Customers/constants.ts index d14770903..012a09cc6 100644 --- a/packages/server/src/modules/Customers/constants.ts +++ b/packages/server/src/modules/Customers/constants.ts @@ -1,6 +1,6 @@ export const DEFAULT_VIEW_COLUMNS = []; -export const DEFAULT_VIEWS = [ +export const CustomerDefaultViews = [ { name: 'Overdue', slug: 'overdue', diff --git a/packages/server/src/modules/Customers/models/Customer.ts b/packages/server/src/modules/Customers/models/Customer.ts index ee86a5b81..743bbff81 100644 --- a/packages/server/src/modules/Customers/models/Customer.ts +++ b/packages/server/src/modules/Customers/models/Customer.ts @@ -1,10 +1,12 @@ import { TenantBaseModel } from '@/modules/System/models/TenantBaseModel'; import { InjectModelMeta } from '@/modules/Tenancy/TenancyModels/decorators/InjectModelMeta.decorator'; import { CustomerMeta } from './Customer.meta'; - +import { InjectModelDefaultViews } from '@/modules/Views/decorators/InjectModelDefaultViews.decorator'; +import { CustomerDefaultViews } from '../constants'; @InjectModelMeta(CustomerMeta) -export class Customer extends TenantBaseModel{ +@InjectModelDefaultViews(CustomerDefaultViews) +export class Customer extends TenantBaseModel { contactService: string; contactType: string; @@ -49,7 +51,6 @@ export class Customer extends TenantBaseModel{ note: string; active: boolean; - /** * Query builder. */ @@ -110,7 +111,7 @@ export class Customer extends TenantBaseModel{ { mail: this.email, label: this.displayName, - primary: true + primary: true, }, ].filter((c) => c.mail); } @@ -147,7 +148,7 @@ export class Customer extends TenantBaseModel{ '*', Customer.relatedQuery('overDueInvoices', query.knex()) .count() - .as('countOverdue') + .as('countOverdue'), ); query.having('countOverdue', '>', 0); }, @@ -190,17 +191,6 @@ export class Customer extends TenantBaseModel{ // }; // } - // static get meta() { - // return CustomerSettings; - // } - - // /** - // * Retrieve the default custom views, roles and columns. - // */ - // static get defaultViews() { - // return DEFAULT_VIEWS; - // } - /** * Model search attributes. */ diff --git a/packages/server/src/modules/Expenses/constants.ts b/packages/server/src/modules/Expenses/constants.ts index 713610ca2..ce40843e3 100644 --- a/packages/server/src/modules/Expenses/constants.ts +++ b/packages/server/src/modules/Expenses/constants.ts @@ -1,7 +1,7 @@ -import { ACCOUNT_TYPE } from "@/constants/accounts"; +import { ACCOUNT_TYPE } from '@/constants/accounts'; export const DEFAULT_VIEW_COLUMNS = []; -export const DEFAULT_VIEWS = [ +export const ExpenseDefaultViews = [ { name: 'Draft', slug: 'draft', diff --git a/packages/server/src/modules/Expenses/models/Expense.model.ts b/packages/server/src/modules/Expenses/models/Expense.model.ts index 2ea6e560a..63433d510 100644 --- a/packages/server/src/modules/Expenses/models/Expense.model.ts +++ b/packages/server/src/modules/Expenses/models/Expense.model.ts @@ -7,10 +7,13 @@ import { ExportableModel } from '@/modules/Export/decorators/ExportableModel.dec import { ImportableModel } from '@/modules/Import/decorators/Import.decorator'; import { InjectModelMeta } from '@/modules/Tenancy/TenancyModels/decorators/InjectModelMeta.decorator'; import { ExpenseMeta } from './Expense.meta'; +import { InjectModelDefaultViews } from '@/modules/Views/decorators/InjectModelDefaultViews.decorator'; +import { ExpenseDefaultViews } from '../constants'; @ExportableModel() @ImportableModel() @InjectModelMeta(ExpenseMeta) +@InjectModelDefaultViews(ExpenseDefaultViews) export class Expense extends TenantBaseModel { totalAmount!: number; currencyCode!: string; @@ -202,7 +205,9 @@ export class Expense extends TenantBaseModel { const { ExpenseCategory } = require('./ExpenseCategory.model'); const { Document } = require('../../ChromiumlyTenancy/models/Document'); const { Branch } = require('../../Branches/models/Branch.model'); - const { MatchedBankTransaction } = require('../../BankingMatching/models/MatchedBankTransaction'); + const { + MatchedBankTransaction, + } = require('../../BankingMatching/models/MatchedBankTransaction'); return { /** @@ -280,17 +285,6 @@ export class Expense extends TenantBaseModel { }; } - // static get meta() { - // return ExpenseSettings; - // } - - // /** - // * Retrieve the default custom views, roles and columns. - // */ - // static get defaultViews() { - // return DEFAULT_VIEWS; - // } - /** * Model search attributes. */ diff --git a/packages/server/src/modules/Items/Items.constants.ts b/packages/server/src/modules/Items/Items.constants.ts index 9b4089687..1408921bf 100644 --- a/packages/server/src/modules/Items/Items.constants.ts +++ b/packages/server/src/modules/Items/Items.constants.ts @@ -34,7 +34,7 @@ export const ERRORS = { }; export const DEFAULT_VIEW_COLUMNS = []; -export const DEFAULT_VIEWS = [ +export const ItemDefaultViews = [ { name: 'Services', slug: 'services', diff --git a/packages/server/src/modules/Items/models/Item.ts b/packages/server/src/modules/Items/models/Item.ts index 20c85c451..d3a5900f1 100644 --- a/packages/server/src/modules/Items/models/Item.ts +++ b/packages/server/src/modules/Items/models/Item.ts @@ -6,11 +6,14 @@ import { InjectModelMeta } from '@/modules/Tenancy/TenancyModels/decorators/Inje import { ItemMeta } from './Item.meta'; import { ImportableModel } from '@/modules/Import/decorators/Import.decorator'; import { PreventMutateBaseCurrency } from '@/common/decorators/LockMutateBaseCurrency.decorator'; +import { InjectModelDefaultViews } from '@/modules/Views/decorators/InjectModelDefaultViews.decorator'; +import { ItemDefaultViews } from '../Items.constants'; @ExportableModel() @ImportableModel() -@InjectModelMeta(ItemMeta) @PreventMutateBaseCurrency() +@InjectModelMeta(ItemMeta) +@InjectModelDefaultViews(ItemDefaultViews) export class Item extends TenantBaseModel { public readonly quantityOnHand: number; public readonly name: string; diff --git a/packages/server/src/modules/ManualJournals/constants.ts b/packages/server/src/modules/ManualJournals/constants.ts index e72cc11cf..f10b4d44f 100644 --- a/packages/server/src/modules/ManualJournals/constants.ts +++ b/packages/server/src/modules/ManualJournals/constants.ts @@ -28,7 +28,7 @@ export const CONTACTS_CONFIG = [ }, ]; -export const DEFAULT_VIEWS = []; +export const ManualJournalDefaultViews = []; export const ManualJournalsSampleData = [ { diff --git a/packages/server/src/modules/ManualJournals/models/ManualJournal.ts b/packages/server/src/modules/ManualJournals/models/ManualJournal.ts index 0e8c0508e..1f2dc98db 100644 --- a/packages/server/src/modules/ManualJournals/models/ManualJournal.ts +++ b/packages/server/src/modules/ManualJournals/models/ManualJournal.ts @@ -1,11 +1,4 @@ import { Model, mixin } from 'objection'; -// import TenantModel from 'models/TenantModel'; -// import { formatNumber } from 'utils'; -// import ModelSetting from './ModelSetting'; -// import ManualJournalSettings from './ManualJournal.Settings'; -// import CustomViewBaseModel from './CustomViewBaseModel'; -// import { DEFAULT_VIEWS } from '@/services/ManualJournals/constants'; -// import ModelSearchable from './ModelSearchable'; import { ManualJournalEntry } from './ManualJournalEntry'; import { Document } from '@/modules/ChromiumlyTenancy/models/Document'; import { TenantBaseModel } from '@/modules/System/models/TenantBaseModel'; @@ -13,10 +6,13 @@ import { ExportableModel } from '@/modules/Export/decorators/ExportableModel.dec import { InjectModelMeta } from '@/modules/Tenancy/TenancyModels/decorators/InjectModelMeta.decorator'; import { ManualJournalMeta } from './ManualJournal.meta'; import { ImportableModel } from '@/modules/Import/decorators/Import.decorator'; +import { InjectModelDefaultViews } from '@/modules/Views/decorators/InjectModelDefaultViews.decorator'; +import { ManualJournalDefaultViews } from '../constants'; @ExportableModel() @ImportableModel() @InjectModelMeta(ManualJournalMeta) +@InjectModelDefaultViews(ManualJournalDefaultViews) export class ManualJournal extends TenantBaseModel { date: Date; journalNumber: string; @@ -120,10 +116,14 @@ export class ManualJournal extends TenantBaseModel { * Relationship mapping. */ static get relationMappings() { - const { AccountTransaction } = require('../../Accounts/models/AccountTransaction.model'); + const { + AccountTransaction, + } = require('../../Accounts/models/AccountTransaction.model'); const { ManualJournalEntry } = require('./ManualJournalEntry'); const { Document } = require('../../ChromiumlyTenancy/models/Document'); - const { MatchedBankTransaction } = require('../../BankingMatching/models/MatchedBankTransaction'); + const { + MatchedBankTransaction, + } = require('../../BankingMatching/models/MatchedBankTransaction'); return { entries: { @@ -185,17 +185,6 @@ export class ManualJournal extends TenantBaseModel { }; } - // static get meta() { - // return ManualJournalSettings; - // } - - // /** - // * Retrieve the default custom views, roles and columns. - // */ - // static get defaultViews() { - // return DEFAULT_VIEWS; - // } - /** * Model search attributes. */ diff --git a/packages/server/src/modules/PaymentReceived/constants.ts b/packages/server/src/modules/PaymentReceived/constants.ts index c3929d978..b55fbfef2 100644 --- a/packages/server/src/modules/PaymentReceived/constants.ts +++ b/packages/server/src/modules/PaymentReceived/constants.ts @@ -32,7 +32,7 @@ export const ERRORS = { NO_INVOICE_CUSTOMER_EMAIL_ADDR: 'NO_INVOICE_CUSTOMER_EMAIL_ADDR', }; -export const DEFAULT_VIEWS = []; +export const PaymentReceivedDefaultViews = []; export const PaymentsReceiveSampleData = [ { diff --git a/packages/server/src/modules/PaymentReceived/models/PaymentReceived.ts b/packages/server/src/modules/PaymentReceived/models/PaymentReceived.ts index a360e99e6..55edd254e 100644 --- a/packages/server/src/modules/PaymentReceived/models/PaymentReceived.ts +++ b/packages/server/src/modules/PaymentReceived/models/PaymentReceived.ts @@ -5,10 +5,13 @@ import { ExportableModel } from '@/modules/Export/decorators/ExportableModel.dec import { ImportableModel } from '@/modules/Import/decorators/Import.decorator'; import { InjectModelMeta } from '@/modules/Tenancy/TenancyModels/decorators/InjectModelMeta.decorator'; import { PaymentReceivedMeta } from './PaymentReceived.meta'; +import { InjectModelDefaultViews } from '@/modules/Views/decorators/InjectModelDefaultViews.decorator'; +import { PaymentReceivedDefaultViews } from '../constants'; @ExportableModel() @ImportableModel() @InjectModelMeta(PaymentReceivedMeta) +@InjectModelDefaultViews(PaymentReceivedDefaultViews) export class PaymentReceived extends TenantBaseModel { customerId: number; paymentDate: string; @@ -79,7 +82,9 @@ export class PaymentReceived extends TenantBaseModel { const { DocumentModel, } = require('../../Attachments/models/Document.model'); - const { PdfTemplateModel } = require('../../PdfTemplate/models/PdfTemplate'); + const { + PdfTemplateModel, + } = require('../../PdfTemplate/models/PdfTemplate'); return { customer: { @@ -172,20 +177,6 @@ export class PaymentReceived extends TenantBaseModel { }; } - /** - * - */ - // static get meta() { - // return PaymentReceiveSettings; - // } - - // /** - // * Retrieve the default custom views, roles and columns. - // */ - // static get defaultViews() { - // return DEFAULT_VIEWS; - // } - /** * Model search attributes. */ diff --git a/packages/server/src/modules/SaleEstimates/constants.ts b/packages/server/src/modules/SaleEstimates/constants.ts index fd8738a4d..d0e581363 100644 --- a/packages/server/src/modules/SaleEstimates/constants.ts +++ b/packages/server/src/modules/SaleEstimates/constants.ts @@ -26,7 +26,7 @@ export const ERRORS = { }; export const DEFAULT_VIEW_COLUMNS = []; -export const DEFAULT_VIEWS = [ +export const SaleEstimateDefaultViews = [ { name: 'Draft', slug: 'draft', diff --git a/packages/server/src/modules/SaleEstimates/models/SaleEstimate.ts b/packages/server/src/modules/SaleEstimates/models/SaleEstimate.ts index ca5f10a5a..69721ebf6 100644 --- a/packages/server/src/modules/SaleEstimates/models/SaleEstimate.ts +++ b/packages/server/src/modules/SaleEstimates/models/SaleEstimate.ts @@ -10,10 +10,13 @@ import { ItemEntry } from '@/modules/TransactionItemEntry/models/ItemEntry'; import { Document } from '@/modules/ChromiumlyTenancy/models/Document'; import { Customer } from '@/modules/Customers/models/Customer'; import { DiscountType } from '@/common/types/Discount'; +import { InjectModelDefaultViews } from '@/modules/Views/decorators/InjectModelDefaultViews.decorator'; +import { SaleEstimateDefaultViews } from '../constants'; @ExportableModel() @ImportableModel() @InjectModelMeta(SaleEstimateMeta) +@InjectModelDefaultViews(SaleEstimateDefaultViews) export class SaleEstimate extends TenantBaseModel { exchangeRate!: number; amount!: number; @@ -87,59 +90,57 @@ export class SaleEstimate extends TenantBaseModel { ]; } - /** + /** * Estimate subtotal. * @returns {number} */ - get subtotal() { - return this.amount;; - } - - /** - * Estimate subtotal in local currency. - * @returns {number} - */ - get subtotalLocal() { - return this.localAmount; - } - - /** - * Discount amount. - * @returns {number} - */ - get discountAmount() { - return this.discountType === DiscountType.Amount - ? this.discount - : this.subtotal * (this.discount / 100); - } - - /** - * Discount percentage. - * @returns {number | null} - */ - get discountPercentage(): number | null { - return this.discountType === DiscountType.Percentage - ? this.discount - : null; - } - - /** - * Estimate total. - * @returns {number} - */ - get total() { - const adjustmentAmount = defaultTo(this.adjustment, 0); - - return this.subtotal - this.discountAmount - adjustmentAmount; - } - - /** - * Estimate total in local currency. - * @returns {number} - */ - get totalLocal() { - return this.total * this.exchangeRate; - } + get subtotal() { + return this.amount; + } + + /** + * Estimate subtotal in local currency. + * @returns {number} + */ + get subtotalLocal() { + return this.localAmount; + } + + /** + * Discount amount. + * @returns {number} + */ + get discountAmount() { + return this.discountType === DiscountType.Amount + ? this.discount + : this.subtotal * (this.discount / 100); + } + + /** + * Discount percentage. + * @returns {number | null} + */ + get discountPercentage(): number | null { + return this.discountType === DiscountType.Percentage ? this.discount : null; + } + + /** + * Estimate total. + * @returns {number} + */ + get total() { + const adjustmentAmount = defaultTo(this.adjustment, 0); + + return this.subtotal - this.discountAmount - adjustmentAmount; + } + + /** + * Estimate total in local currency. + * @returns {number} + */ + get totalLocal() { + return this.total * this.exchangeRate; + } /** * Estimate amount in local currency. @@ -374,13 +375,6 @@ export class SaleEstimate extends TenantBaseModel { }; } - /** - * Retrieve the default custom views, roles and columns. - */ - // static get defaultViews() { - // return DEFAULT_VIEWS; - // } - /** * Model search roles. */ diff --git a/packages/server/src/modules/SaleInvoices/constants.ts b/packages/server/src/modules/SaleInvoices/constants.ts index 58e6413c1..9c889a49f 100644 --- a/packages/server/src/modules/SaleInvoices/constants.ts +++ b/packages/server/src/modules/SaleInvoices/constants.ts @@ -60,7 +60,7 @@ export const ERRORS = { }; export const DEFAULT_VIEW_COLUMNS = []; -export const DEFAULT_VIEWS = [ +export const SaleInvoiceDefaultViews = [ { name: 'Draft', slug: 'draft', diff --git a/packages/server/src/modules/SaleInvoices/models/SaleInvoice.ts b/packages/server/src/modules/SaleInvoices/models/SaleInvoice.ts index 90b5034c0..bf2168d0e 100644 --- a/packages/server/src/modules/SaleInvoices/models/SaleInvoice.ts +++ b/packages/server/src/modules/SaleInvoices/models/SaleInvoice.ts @@ -16,11 +16,14 @@ import { InjectAttachable } from '@/modules/Attachments/decorators/InjectAttacha import { ExportableModel } from '@/modules/Export/decorators/ExportableModel.decorator'; import { InjectModelMeta } from '@/modules/Tenancy/TenancyModels/decorators/InjectModelMeta.decorator'; import { SaleInvoiceMeta } from './SaleInvoice.meta'; +import { InjectModelDefaultViews } from '@/modules/Views/decorators/InjectModelDefaultViews.decorator'; +import { SaleInvoiceDefaultViews } from '../constants'; @InjectAttachable() @ExportableModel() @InjectModelMeta(SaleInvoiceMeta) -export class SaleInvoice extends TenantBaseModel{ +@InjectModelDefaultViews(SaleInvoiceDefaultViews) +export class SaleInvoice extends TenantBaseModel { public taxAmountWithheld: number; public balance: number; public paymentAmount: number; @@ -512,7 +515,9 @@ export class SaleInvoice extends TenantBaseModel{ TaxRateTransaction, } = require('../../TaxRates/models/TaxRateTransaction.model'); const { Document } = require('../../ChromiumlyTenancy/models/Document'); - const { MatchedBankTransaction } = require('../../BankingMatching/models/MatchedBankTransaction'); + const { + MatchedBankTransaction, + } = require('../../BankingMatching/models/MatchedBankTransaction'); const { TransactionPaymentServiceEntry, } = require('../../PaymentServices/models/TransactionPaymentServiceEntry.model'); @@ -724,24 +729,10 @@ export class SaleInvoice extends TenantBaseModel{ [changeMethod]('payment_amount', Math.abs(amount)); } - /** - * Sale invoice meta. - */ - // static get meta() { - // return SaleInvoiceMeta; - // } - static dueAmountFieldSortQuery(query, role) { query.modify('sortByDueAmount', role.order); } - /** - * Retrieve the default custom views, roles and columns. - */ - // static get defaultViews() { - // return DEFAULT_VIEWS; - // } - /** * Model searchable. */ diff --git a/packages/server/src/modules/SaleReceipts/constants.ts b/packages/server/src/modules/SaleReceipts/constants.ts index 653e373ce..ccacb614d 100644 --- a/packages/server/src/modules/SaleReceipts/constants.ts +++ b/packages/server/src/modules/SaleReceipts/constants.ts @@ -1,6 +1,6 @@ export const DEFAULT_RECEIPT_MAIL_SUBJECT = 'Receipt {Receipt Number} from {Company Name}'; - + export const DEFAULT_RECEIPT_MAIL_CONTENT = `Hi {Customer Name}, Here's receipt # {Receipt Number} for Receipt {Receipt Amount} @@ -29,7 +29,7 @@ export const ERRORS = { }; export const DEFAULT_VIEW_COLUMNS = []; -export const DEFAULT_VIEWS = [ +export const SaleReceiptDefaultViews = [ { name: 'Draft', slug: 'draft', diff --git a/packages/server/src/modules/SaleReceipts/models/SaleReceipt.ts b/packages/server/src/modules/SaleReceipts/models/SaleReceipt.ts index 34eaa2c39..87a840369 100644 --- a/packages/server/src/modules/SaleReceipts/models/SaleReceipt.ts +++ b/packages/server/src/modules/SaleReceipts/models/SaleReceipt.ts @@ -16,6 +16,8 @@ import { ExportableModel } from '@/modules/Export/decorators/ExportableModel.dec import { ImportableModel } from '@/modules/Import/decorators/Import.decorator'; import { InjectModelMeta } from '@/modules/Tenancy/TenancyModels/decorators/InjectModelMeta.decorator'; import { SaleReceiptMeta } from './SaleReceipt.meta'; +import { InjectModelDefaultViews } from '@/modules/Views/decorators/InjectModelDefaultViews.decorator'; +import { SaleReceiptDefaultViews } from '../constants'; const ExtendedModel = R.pipe( CustomViewBaseModelMixin, @@ -27,6 +29,7 @@ const ExtendedModel = R.pipe( @ExportableModel() @ImportableModel() @InjectModelMeta(SaleReceiptMeta) +@InjectModelDefaultViews(SaleReceiptDefaultViews) export class SaleReceipt extends ExtendedModel { public amount!: number; public exchangeRate!: number; @@ -371,20 +374,6 @@ export class SaleReceipt extends ExtendedModel { }; } - /** - * Sale invoice meta. - */ - // static get meta() { - // return SaleReceiptSettings; - // } - - /** - * Retrieve the default custom views, roles and columns. - */ - // static get defaultViews() { - // return DEFAULT_VIEWS; - // } - /** * Model search attributes. */ diff --git a/packages/server/src/modules/VendorCredit/constants.ts b/packages/server/src/modules/VendorCredit/constants.ts index d686669d8..1bc985607 100644 --- a/packages/server/src/modules/VendorCredit/constants.ts +++ b/packages/server/src/modules/VendorCredit/constants.ts @@ -12,7 +12,7 @@ export const ERRORS = { }; export const DEFAULT_VIEW_COLUMNS = []; -export const DEFAULT_VIEWS = [ +export const VendorCreditDefaultViews = [ { name: 'vendor_credit.view.draft', slug: 'draft', diff --git a/packages/server/src/modules/VendorCredit/models/VendorCredit.ts b/packages/server/src/modules/VendorCredit/models/VendorCredit.ts index 009918ab0..11912c2b5 100644 --- a/packages/server/src/modules/VendorCredit/models/VendorCredit.ts +++ b/packages/server/src/modules/VendorCredit/models/VendorCredit.ts @@ -9,10 +9,13 @@ import { ExportableModel } from '@/modules/Export/decorators/ExportableModel.dec import { ImportableModel } from '@/modules/Import/decorators/Import.decorator'; import { InjectModelMeta } from '@/modules/Tenancy/TenancyModels/decorators/InjectModelMeta.decorator'; import { VendorCreditMeta } from './VendorCredit.meta'; +import { InjectModelDefaultViews } from '@/modules/Views/decorators/InjectModelDefaultViews.decorator'; +import { VendorCreditDefaultViews } from '../constants'; @ExportableModel() @ImportableModel() @InjectModelMeta(VendorCreditMeta) +@InjectModelDefaultViews(VendorCreditDefaultViews) export class VendorCredit extends TenantBaseModel { vendorId: number; amount: number; @@ -367,20 +370,6 @@ export class VendorCredit extends TenantBaseModel { }; } - /** - * - */ - // static get meta() { - // return VendorCreditMeta; - // } - - /** - * Retrieve the default custom views, roles and columns. - */ - // static get defaultViews() { - // return DEFAULT_VIEWS; - // } - /** * Model search attributes. */ diff --git a/packages/server/src/modules/Vendors/constants.ts b/packages/server/src/modules/Vendors/constants.ts index 25f31f36a..a0179c38e 100644 --- a/packages/server/src/modules/Vendors/constants.ts +++ b/packages/server/src/modules/Vendors/constants.ts @@ -1,6 +1,6 @@ export const DEFAULT_VIEW_COLUMNS = []; -export const DEFAULT_VIEWS = [ +export const VendorDefaultViews = [ { name: 'Overdue', slug: 'overdue', diff --git a/packages/server/src/modules/Vendors/models/Vendor.ts b/packages/server/src/modules/Vendors/models/Vendor.ts index cc26bac3b..f98d53a47 100644 --- a/packages/server/src/modules/Vendors/models/Vendor.ts +++ b/packages/server/src/modules/Vendors/models/Vendor.ts @@ -11,21 +11,12 @@ import { TenantBaseModel } from '@/modules/System/models/TenantBaseModel'; import { ExportableModel } from '@/modules/Export/decorators/ExportableModel.decorator'; import { InjectModelMeta } from '@/modules/Tenancy/TenancyModels/decorators/InjectModelMeta.decorator'; import { VendorMeta } from './Vendor.meta'; - -// class VendorQueryBuilder extends PaginationQueryBuilder { -// constructor(...args) { -// super(...args); - -// this.onBuild((builder) => { -// if (builder.isFind() || builder.isDelete() || builder.isUpdate()) { -// builder.where('contact_service', 'vendor'); -// } -// }); -// } -// } +import { InjectModelDefaultViews } from '@/modules/Views/decorators/InjectModelDefaultViews.decorator'; +import { VendorDefaultViews } from '../constants'; @ExportableModel() @InjectModelMeta(VendorMeta) +@InjectModelDefaultViews(VendorDefaultViews) export class Vendor extends TenantBaseModel { contactService: string; contactType: string; @@ -196,17 +187,6 @@ export class Vendor extends TenantBaseModel { }; } - // static get meta() { - // return VendorSettings; - // } - - // /** - // * Retrieve the default custom views, roles and columns. - // */ - // static get defaultViews() { - // return DEFAULT_VIEWS; - // } - /** * Model search attributes. */ diff --git a/packages/server/src/modules/Views/GetResourceView.transformer.ts b/packages/server/src/modules/Views/GetResourceView.transformer.ts new file mode 100644 index 000000000..f5fd20127 --- /dev/null +++ b/packages/server/src/modules/Views/GetResourceView.transformer.ts @@ -0,0 +1,12 @@ +import { Transformer } from '../Transformer/Transformer'; +import { View } from './models/View.model'; + +export class GetResourceViewTransformer extends Transformer { + public includeAttributes = (): string[] => { + return ['name']; + }; + + name(view: View) { + return this.context.i18n.t(view.name); + } +} diff --git a/packages/server/src/modules/Views/GetResourceViews.service.ts b/packages/server/src/modules/Views/GetResourceViews.service.ts index 8dcd2c733..5ee87e2e2 100644 --- a/packages/server/src/modules/Views/GetResourceViews.service.ts +++ b/packages/server/src/modules/Views/GetResourceViews.service.ts @@ -1,10 +1,17 @@ import { Injectable } from '@nestjs/common'; import { View } from './models/View.model'; import { ResourceService } from '../Resource/ResourceService'; +import { I18nService } from 'nestjs-i18n'; +import { TransformerInjectable } from '../Transformer/TransformerInjectable.service'; +import { GetResourceViewTransformer } from './GetResourceView.transformer'; @Injectable() export class GetResourceViewsService { - constructor(private readonly resourceService: ResourceService) {} + constructor( + private readonly resourceService: ResourceService, + private readonly transformerInjectable: TransformerInjectable, + ) {} + /** * Listing resource views. * @param {string} resourceModel - @@ -16,6 +23,9 @@ export class GetResourceViewsService { // Default views. const defaultViews = resourceModel().getDefaultViews(); - return defaultViews; + return this.transformerInjectable.transform( + defaultViews, + new GetResourceViewTransformer(), + ); } } diff --git a/packages/server/src/modules/Views/Views.controller.ts b/packages/server/src/modules/Views/Views.controller.ts index 703d16fc6..e9df0e120 100644 --- a/packages/server/src/modules/Views/Views.controller.ts +++ b/packages/server/src/modules/Views/Views.controller.ts @@ -1,20 +1,38 @@ import { Controller, Get, Param } from '@nestjs/common'; -import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; +import { + ApiExtraModels, + ApiOperation, + ApiParam, + ApiResponse, + ApiTags, + getSchemaPath, +} from '@nestjs/swagger'; import { GetResourceViewsService } from './GetResourceViews.service'; +import { ViewResponseDto } from './dtos/ViewResponse.dto'; @Controller('views') @ApiTags('Views') +@ApiExtraModels(ViewResponseDto) export class ViewsController { constructor( private readonly getResourceViewsService: GetResourceViewsService, ) {} @Get('/resource/:resourceModel') - @ApiResponse({ status: 200, description: 'Specific resource views' }) + @ApiParam({ + name: 'resourceModel', + description: 'The resource model to get views for', + type: String, + }) + @ApiResponse({ + status: 200, + description: 'Specific resource views', + schema: { $ref: getSchemaPath(ViewResponseDto) }, + }) @ApiOperation({ summary: 'Get the given resource views' }) async getResourceViews(@Param('resourceModel') resourceModel: string) { const views = await this.getResourceViewsService.getResourceViews(resourceModel); - return { views }; + return views; } } diff --git a/packages/server/src/modules/Views/decorators/InjectModelDefaultViews.decorator.ts b/packages/server/src/modules/Views/decorators/InjectModelDefaultViews.decorator.ts new file mode 100644 index 000000000..681a4e26f --- /dev/null +++ b/packages/server/src/modules/Views/decorators/InjectModelDefaultViews.decorator.ts @@ -0,0 +1,14 @@ +export function InjectModelDefaultViews(defaultViews: any[]) { + return function (target: any) { + // Define the defaultViews static property on the class + Object.defineProperty(target, 'defaultViews', { + get: function () { + return defaultViews; + }, + enumerable: true, + configurable: true, + }); + + return target; + }; +} diff --git a/packages/server/src/modules/Views/dtos/RoleResponse.dto.ts b/packages/server/src/modules/Views/dtos/RoleResponse.dto.ts new file mode 100644 index 000000000..5fecc2c95 --- /dev/null +++ b/packages/server/src/modules/Views/dtos/RoleResponse.dto.ts @@ -0,0 +1,30 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class RoleResponseDto { + @ApiProperty({ description: 'The unique identifier of the role' }) + id: number; + + @ApiProperty({ description: 'The index of the role' }) + index: number; + + @ApiProperty({ description: 'The field key associated with the role' }) + fieldKey: string; + + @ApiProperty({ + description: + 'The comparator used for the role (equals, not_equal, contains, not_contain)', + }) + comparator: string; + + @ApiProperty({ description: 'The value to compare against' }) + value: string; + + @ApiProperty({ description: 'The ID of the view this role belongs to' }) + viewId: number; + + @ApiProperty({ description: 'The creation timestamp' }) + createdAt: Date; + + @ApiProperty({ description: 'The last update timestamp' }) + updatedAt: Date; +} diff --git a/packages/server/src/modules/Views/dtos/ViewResponse.dto.ts b/packages/server/src/modules/Views/dtos/ViewResponse.dto.ts new file mode 100644 index 000000000..fac98b3cc --- /dev/null +++ b/packages/server/src/modules/Views/dtos/ViewResponse.dto.ts @@ -0,0 +1,44 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { ViewColumn } from '../models/ViewColumn.model'; +import { RoleResponseDto } from './RoleResponse.dto'; + +export class ViewResponseDto { + @ApiProperty({ description: 'The unique identifier of the view' }) + id: number; + + @ApiProperty({ description: 'The name of the view' }) + name: string; + + @ApiProperty({ description: 'The slug of the view' }) + slug: string; + + @ApiProperty({ description: 'Whether the view is predefined' }) + predefined: boolean; + + @ApiProperty({ description: 'The resource model associated with the view' }) + resourceModel: string; + + @ApiProperty({ description: 'Whether the view is marked as favourite' }) + favourite: boolean; + + @ApiProperty({ description: 'The roles logic expression for the view' }) + rolesLogicExpression: string; + + @ApiProperty({ + type: [RoleResponseDto], + description: 'The roles associated with the view', + }) + roles: RoleResponseDto[]; + + @ApiProperty({ + type: [ViewColumn], + description: 'The columns associated with the view', + }) + columns: ViewColumn[]; + + @ApiProperty({ description: 'The creation timestamp' }) + createdAt: Date; + + @ApiProperty({ description: 'The last update timestamp' }) + updatedAt: Date; +} diff --git a/packages/server/src/modules/Views/models/View.model.ts b/packages/server/src/modules/Views/models/View.model.ts index 9749b1b2c..d688dd0f6 100644 --- a/packages/server/src/modules/Views/models/View.model.ts +++ b/packages/server/src/modules/Views/models/View.model.ts @@ -1,7 +1,14 @@ import { Model } from 'objection'; import { BaseModel } from '@/models/Model'; +import { ViewRole } from './ViewRole.model'; export class View extends BaseModel { + name: string; + slug: string; + rolesLogicExpression: number; + + roles!: Array; + /** * Table name. */ diff --git a/packages/server/src/modules/Views/models/ViewRole.model.ts b/packages/server/src/modules/Views/models/ViewRole.model.ts index f9531d0e8..7af0a8f1a 100644 --- a/packages/server/src/modules/Views/models/ViewRole.model.ts +++ b/packages/server/src/modules/Views/models/ViewRole.model.ts @@ -2,6 +2,10 @@ import { BaseModel } from '@/models/Model'; import { Model } from 'objection'; export class ViewRole extends BaseModel { + index: number; + fieldKey: string; + comparator: string; + value: string; /** * Virtual attributes. @@ -11,9 +15,7 @@ export class ViewRole extends BaseModel { } static get comparators() { - return [ - 'equals', 'not_equal', 'contains', 'not_contain', - ]; + return ['equals', 'not_equal', 'contains', 'not_contain']; } /** diff --git a/packages/webapp/src/hooks/query/views.tsx b/packages/webapp/src/hooks/query/views.tsx index 228d1a48c..42a18d5f2 100644 --- a/packages/webapp/src/hooks/query/views.tsx +++ b/packages/webapp/src/hooks/query/views.tsx @@ -10,7 +10,7 @@ export function useResourceViews(resourceSlug) { ['RESOURCE_VIEW', resourceSlug], { method: 'get', url: `views/resource/${resourceSlug}` }, { - select: (response) => response.data.views, + select: (response) => response.data, defaultData: [], }, );