From cf4f8d368c018b5e721e25301852c1730350f0bf Mon Sep 17 00:00:00 2001 From: 18alantom <2.alan.tom@gmail.com> Date: Mon, 16 Jan 2023 11:01:12 +0530 Subject: [PATCH 1/7] feat: add enable barcode --- models/baseModels/Item/Item.ts | 1 + models/inventory/InventorySettings.ts | 1 + schemas/app/Item.json | 7 +++++++ schemas/app/inventory/InventorySettings.json | 5 +++++ src/pages/Settings/Settings.vue | 3 ++- 5 files changed, 16 insertions(+), 1 deletion(-) diff --git a/models/baseModels/Item/Item.ts b/models/baseModels/Item/Item.ts index 0eac8acd..61db702b 100644 --- a/models/baseModels/Item/Item.ts +++ b/models/baseModels/Item/Item.ts @@ -120,6 +120,7 @@ export class Item extends Doc { !this.fyo.singles.AccountingSettings?.enableInventory || this.itemType !== 'Product' || (this.inserted && !this.trackItem), + barcode: () => !this.fyo.singles.InventorySettings?.enableBarcodes, }; readOnly: ReadOnlyMap = { diff --git a/models/inventory/InventorySettings.ts b/models/inventory/InventorySettings.ts index eee67389..b6e3ff68 100644 --- a/models/inventory/InventorySettings.ts +++ b/models/inventory/InventorySettings.ts @@ -9,6 +9,7 @@ export class InventorySettings extends Doc { valuationMethod?: ValuationMethod; stockReceivedButNotBilled?: string; costOfGoodsSold?: string; + enableBarcodes?: boolean; static filters: FiltersMap = { stockInHand: () => ({ diff --git a/schemas/app/Item.json b/schemas/app/Item.json index 23a30650..b9d81b9d 100644 --- a/schemas/app/Item.json +++ b/schemas/app/Item.json @@ -106,6 +106,12 @@ "fieldtype": "Int", "placeholder": "HSN/SAC Code" }, + { + "fieldname": "barcode", + "label": "Barcode", + "fieldtype": "Data", + "placeholder": "Barcode" + }, { "fieldname": "trackItem", "label": "Track Item", @@ -122,6 +128,7 @@ "description", "incomeAccount", "expenseAccount", + "barcode", "hsnCode", "trackItem" ], diff --git a/schemas/app/inventory/InventorySettings.json b/schemas/app/inventory/InventorySettings.json index e9d3afde..b00252d9 100644 --- a/schemas/app/inventory/InventorySettings.json +++ b/schemas/app/inventory/InventorySettings.json @@ -45,6 +45,11 @@ "label": "Cost Of Goods Sold Acc.", "fieldtype": "Link", "target": "Account" + }, + { + "fieldname": "enableBarcodes", + "label": "Enable Barcodes", + "fieldtype": "Check" } ] } diff --git a/src/pages/Settings/Settings.vue b/src/pages/Settings/Settings.vue index df61d737..ac814296 100644 --- a/src/pages/Settings/Settings.vue +++ b/src/pages/Settings/Settings.vue @@ -126,7 +126,8 @@ export default { fieldnames.includes('hideGetStarted') || fieldnames.includes('displayPrecision') || fieldnames.includes('enableDiscounting') || - fieldnames.includes('enableInventory') + fieldnames.includes('enableInventory') || + fieldnames.includes('enableBarcodes') ) { this.showReloadToast(); } From 7656476b6a62d152ca5bf83897d527b2d6d921a2 Mon Sep 17 00:00:00 2001 From: 18alantom <2.alan.tom@gmail.com> Date: Mon, 16 Jan 2023 15:08:02 +0530 Subject: [PATCH 2/7] incr: update item docs with addItem - start with barcode widget --- fyo/model/doc.ts | 16 ++++ models/baseModels/Invoice/Invoice.ts | 10 ++- models/helpers.ts | 26 +++++++ models/inventory/StockMovement.ts | 6 +- models/inventory/StockTransfer.ts | 6 +- src/components/Controls/Barcode.vue | 109 +++++++++++++++++++++++++++ src/components/Modal.vue | 5 -- src/components/SearchBar.vue | 2 +- src/pages/DatabaseSelector.vue | 2 +- src/pages/GeneralForm.vue | 26 +++++++ src/pages/InvoiceForm.vue | 6 ++ src/pages/ListView/ListView.vue | 1 + 12 files changed, 202 insertions(+), 13 deletions(-) create mode 100644 src/components/Controls/Barcode.vue diff --git a/fyo/model/doc.ts b/fyo/model/doc.ts index 8ca10616..c78d9aba 100644 --- a/fyo/model/doc.ts +++ b/fyo/model/doc.ts @@ -157,6 +157,22 @@ export class Doc extends Observable { return false; } + get canEdit() { + if (!this.schema.isSubmittable) { + return true; + } + + if (this.submitted) { + return false; + } + + if (this.cancelled) { + return false; + } + + return true; + } + get canSave() { if (!!this.submitted) { return false; diff --git a/models/baseModels/Invoice/Invoice.ts b/models/baseModels/Invoice/Invoice.ts index c854b1bc..01b21778 100644 --- a/models/baseModels/Invoice/Invoice.ts +++ b/models/baseModels/Invoice/Invoice.ts @@ -6,13 +6,11 @@ import { DefaultMap, FiltersMap, FormulaMap, - HiddenMap + HiddenMap, } from 'fyo/model/types'; import { DEFAULT_CURRENCY } from 'fyo/utils/consts'; import { ValidationError } from 'fyo/utils/errors'; -import { - getExchangeRate, getNumberSeries -} from 'models/helpers'; +import { addItem, getExchangeRate, getNumberSeries } from 'models/helpers'; import { InventorySettings } from 'models/inventory/InventorySettings'; import { StockTransfer } from 'models/inventory/StockTransfer'; import { Transactional } from 'models/Transactional/Transactional'; @@ -695,4 +693,8 @@ export abstract class Invoice extends Transactional { })) .sort((a, b) => a.date.valueOf() - b.date.valueOf()); } + + async addItem(name: string) { + return await addItem(name, this); + } } diff --git a/models/helpers.ts b/models/helpers.ts index 5859f83b..f66ff961 100644 --- a/models/helpers.ts +++ b/models/helpers.ts @@ -14,6 +14,8 @@ import { numberSeriesDefaultsMap, } from './baseModels/Defaults/Defaults'; import { Invoice } from './baseModels/Invoice/Invoice'; +import { StockMovement } from './inventory/StockMovement'; +import { StockTransfer } from './inventory/StockTransfer'; import { InvoiceStatus, ModelNameEnum } from './types'; export function getInvoiceActions( @@ -321,3 +323,27 @@ export function getDocStatusListColumn(): ColumnConfig { }, }; } + +type ModelsWithItems = Invoice | StockTransfer | StockMovement; +export async function addItem(name: string, doc: M) { + if (!doc.canEdit) { + return; + } + + const items = (doc.items ?? []) as NonNullable[number][]; + + let item = items.find((i) => i.item === name); + if (item) { + const q = item.quantity ?? 0; + await item.set('quantity', q + 1); + return; + } + + await doc.append('items'); + item = doc.items?.at(-1); + if (!item) { + return; + } + + await item.set('item', name); +} diff --git a/models/inventory/StockMovement.ts b/models/inventory/StockMovement.ts index 20811237..25fabee1 100644 --- a/models/inventory/StockMovement.ts +++ b/models/inventory/StockMovement.ts @@ -6,7 +6,7 @@ import { FormulaMap, ListViewSettings, } from 'fyo/model/types'; -import { getDocStatusListColumn, getLedgerLinkAction } from 'models/helpers'; +import { addItem, getDocStatusListColumn, getLedgerLinkAction } from 'models/helpers'; import { LedgerPosting } from 'models/Transactional/LedgerPosting'; import { ModelNameEnum } from 'models/types'; import { Money } from 'pesa'; @@ -92,4 +92,8 @@ export class StockMovement extends Transfer { static getActions(fyo: Fyo): Action[] { return [getLedgerLinkAction(fyo, true)]; } + + async addItem(name: string) { + return await addItem(name, this); + } } diff --git a/models/inventory/StockTransfer.ts b/models/inventory/StockTransfer.ts index 5aae9c1f..ae0f992b 100644 --- a/models/inventory/StockTransfer.ts +++ b/models/inventory/StockTransfer.ts @@ -5,7 +5,7 @@ import { Action, DefaultMap, FiltersMap, FormulaMap } from 'fyo/model/types'; import { ValidationError } from 'fyo/utils/errors'; import { Defaults } from 'models/baseModels/Defaults/Defaults'; import { Invoice } from 'models/baseModels/Invoice/Invoice'; -import { getLedgerLinkAction, getNumberSeries } from 'models/helpers'; +import { addItem, getLedgerLinkAction, getNumberSeries } from 'models/helpers'; import { LedgerPosting } from 'models/Transactional/LedgerPosting'; import { ModelNameEnum } from 'models/types'; import { Money } from 'pesa'; @@ -232,4 +232,8 @@ export abstract class StockTransfer extends Transfer { role: doc.isSales ? 'Customer' : 'Supplier', }), }; + + async addItem(name: string) { + return await addItem(name, this); + } } diff --git a/src/components/Controls/Barcode.vue b/src/components/Controls/Barcode.vue new file mode 100644 index 00000000..aa4f67d8 --- /dev/null +++ b/src/components/Controls/Barcode.vue @@ -0,0 +1,109 @@ + + diff --git a/src/components/Modal.vue b/src/components/Modal.vue index 4a30a04a..34cf627a 100644 --- a/src/components/Modal.vue +++ b/src/components/Modal.vue @@ -21,7 +21,6 @@ bg-white rounded-lg shadow-2xl - w-form border overflow-hidden inner @@ -44,10 +43,6 @@ export default defineComponent({ default: false, type: Boolean, }, - setCloseListener: { - default: true, - type: Boolean, - }, }, emits: ['closemodal'], watch: { diff --git a/src/components/SearchBar.vue b/src/components/SearchBar.vue index 50ed9d6a..a4e02cae 100644 --- a/src/components/SearchBar.vue +++ b/src/components/SearchBar.vue @@ -17,7 +17,7 @@ :set-close-listener="false" > -
+
-
+

Set Base Count

Base Count is a lower bound on the number of entries made when diff --git a/src/pages/GeneralForm.vue b/src/pages/GeneralForm.vue index 77991940..4d178983 100644 --- a/src/pages/GeneralForm.vue +++ b/src/pages/GeneralForm.vue @@ -3,6 +3,10 @@