diff --git a/README.md b/README.md index f280016f..c610b90d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Sample app for frappe +# Frappe Accounting -Sample To Do app for frappe +Simple JS based app for personal and small businesses accounting ### Install diff --git a/dist/css/style.css b/dist/css/style.css index d35ce32c..346c4b91 100644 --- a/dist/css/style.css +++ b/dist/css/style.css @@ -5737,9 +5737,11 @@ a.text-dark:hover, a.text-dark:focus { html { font-size: 14px; } .main { - border-left: 1px solid #dee2e6; } + border-left: 1px solid #dee2e6; + min-height: calc(100vh - 50px); } .sidebar .list-group-item { - padding: 0.5rem 1rem; } + padding: 0.5rem 1rem; + border: none; } .sidebar .list-group-flush { margin: -1rem; } .hide { @@ -5760,6 +5762,8 @@ html { margin-top: 1rem; } .list-row .checkbox { margin-right: 0.5rem; } +.list-row a, .list-row a:hover, .list-row a:visited, .list-row a:active { + color: #343a40; } .dropdown-menu-right { right: 0; left: auto; } diff --git a/dist/js/bundle.js b/dist/js/bundle.js index cc3450b8..cb29c6cc 100644 --- a/dist/js/bundle.js +++ b/dist/js/bundle.js @@ -231,17 +231,23 @@ var frappejs = { async getDoc(doctype, name) { let doc = this.getDocFromCache(doctype, name); if (!doc) { - let controller_class = this.getControllerClass(doctype); - doc = new controller_class({doctype:doctype, name: name}); + let controllerClass = this.getControllerClass(doctype); + doc = new controllerClass({doctype:doctype, name: name}); await doc.load(); this.addToCache(doc); } return doc; }, + async getSingle(doctype) { + return await this.getDoc(doctype, doctype); + }, + newDoc(data) { - let controller_class = this.getControllerClass(data.doctype); - return new controller_class(data); + let controllerClass = this.getControllerClass(data.doctype); + let doc = new controllerClass(data); + doc.setDefaults(); + return doc; }, getControllerClass(doctype) { @@ -255,8 +261,8 @@ var frappejs = { async getNewDoc(doctype) { let doc = this.newDoc({doctype: doctype}); - doc.setName(); doc._notInserted = true; + doc.name = this.getRandomName(); this.addToCache(doc); return doc; }, @@ -282,7 +288,7 @@ var frappejs = { }; var model = { - async get_series_next(prefix) { + async getSeriesNext(prefix) { let series; try { series = await frappejs.getDoc('Number Series', prefix); @@ -360,6 +366,20 @@ var document$1 = class BaseDocument { this.handlers[key].push(method || key); } + get meta() { + if (!this._meta) { + this._meta = frappejs.getMeta(this.doctype); + } + return this._meta; + } + + async getSettings() { + if (!this._settings) { + this._settings = await frappejs.getSingle(this.meta.settings); + } + return this._settings; + } + get(fieldname) { return this[fieldname]; } @@ -376,7 +396,24 @@ var document$1 = class BaseDocument { } } - setName() { + async setName() { + if (this.name) { + return; + } + + // name === doctype for Single + if (this.meta.isSingle) { + this.name = this.meta.name; + return; + } + + if (this.meta.settings) { + const number_series = (await this.getSettings()).number_series; + if(number_series) { + this.name = await frappejs.model.getSeriesNext(number_series); + } + } + // assign a random name by default // override this to set a name if (!this.name) { @@ -384,6 +421,14 @@ var document$1 = class BaseDocument { } } + setDefaults() { + for (let field of this.meta.fields) { + if (!this[field.fieldname] && field.default) { + this[field.fieldname] = field.default; + } + } + } + setKeywords() { let keywords = []; for (let fieldname of this.meta.getKeywordFields()) { @@ -392,13 +437,6 @@ var document$1 = class BaseDocument { this.keywords = keywords.join(', '); } - get meta() { - if (!this._meta) { - this._meta = frappejs.getMeta(this.doctype); - } - return this._meta; - } - append(key, document) { if (!this[key]) { this[key] = []; @@ -507,7 +545,7 @@ var document$1 = class BaseDocument { async commit() { // re-run triggers - this.setName(); + await this.setName(); this.setStandardValues(); this.setKeywords(); this.setChildIdx(); @@ -638,15 +676,15 @@ var meta = class BaseMeta extends document$1 { return this[fieldname]; } - getValidFields({ with_children = true } = {}) { + getValidFields({ withChildren = true } = {}) { if (!this._valid_fields) { this._valid_fields = []; - this._valid_fields_with_children = []; + this._valid_fields_withChildren = []; const _add = (field) => { this._valid_fields.push(field); - this._valid_fields_with_children.push(field); + this._valid_fields_withChildren.push(field); }; const doctype_fields = this.fields.map((field) => field.fieldname); @@ -658,7 +696,7 @@ var meta = class BaseMeta extends document$1 { } } - if (this.is_child) { + if (this.isChild) { // child fields for (let field of frappejs.model.child_fields) { if (frappejs.db.type_map[field.fieldtype] && !doctype_fields.includes(field.fieldname)) { @@ -682,22 +720,31 @@ var meta = class BaseMeta extends document$1 { _add(field); } - // include tables if (with_children = True) + // include tables if (withChildren = True) if (!include && field.fieldtype === 'Table') { - this._valid_fields_with_children.push(field); + this._valid_fields_withChildren.push(field); } } } - if (with_children) { - return this._valid_fields_with_children; + if (withChildren) { + return this._valid_fields_withChildren; } else { return this._valid_fields; } } getKeywordFields() { - return this.keyword_fields || this.meta.fields.filter(field => field.required).map(field => field.fieldname); + if (!this._keywordFields) { + this._keywordFields = this.keywordFields; + if (!(this._keywordFields && this._keywordFields.length && this.fields)) { + this._keywordFields = this.fields.filter(field => field.required).map(field => field.fieldname); + } + if (!(this._keywordFields && this._keywordFields.length)) { + this._keywordFields = ['name']; + } + } + return this._keywordFields; } validate_select(field, value) { @@ -2462,6 +2509,15 @@ class FloatControl extends base { var float_1 = FloatControl; +class IntControl extends float_1 { + parse(value) { + value = parseInt(value); + return value===NaN ? 0 : value; + } +} + +var int_1 = IntControl; + class CurrencyControl extends float_1 { parse(value) { return frappejs.parse_number(value); @@ -5208,7 +5264,6 @@ var CellManager = function () { var _this2 = this; var focusCell = function focusCell(direction) { - console.log(direction); if (!_this2.$focusedCell || _this2.$editingCell) { return false; } @@ -5540,6 +5595,8 @@ var CellManager = function () { }, { key: 'activateEditing', value: function activateEditing($cell) { + this.focusCell($cell); + var _$$data6 = _dom2.default.data($cell), rowIndex = _$$data6.rowIndex, colIndex = _$$data6.colIndex; @@ -8263,7 +8320,7 @@ module.exports = {"name":"frappe-datatable","version":"0.0.1","description":"A m /***/ }) /******/ ]); }); - +//# sourceMappingURL=frappe-datatable.js.map }); unwrapExports(frappeDatatable); @@ -25094,6 +25151,7 @@ class TableControl extends base { return { initValue: (value, rowIndex, column) => { + column.activeControl = control; control.parent_control = this; control.doc = this.doc[this.fieldname][rowIndex]; control.set_focus(); @@ -25156,11 +25214,29 @@ class TableControl extends base { return []; } if (!this.doc[this.fieldname]) { - this.doc[this.fieldname] = [{}]; + this.doc[this.fieldname] = [{idx: 0}]; } return this.doc[this.fieldname]; } + + checkValidity() { + let data = this.getTableData(); + for (let rowIndex=0; rowIndex < data.length; rowIndex++) { + let row = data[rowIndex]; + for (let column of this.datatable.datamanager.columns) { + if (column.field && column.field.required) { + let value = row[column.field.fieldname]; + if (value==='' || value===undefined || value===null) { + let $cell = this.datatable.cellmanager.getCell$(column.colIndex, rowIndex); + this.datatable.cellmanager.activateEditing($cell); + return false; + } + } + } + } + return true; + } } var table = TableControl; @@ -25171,6 +25247,7 @@ const control_classes = { Select: select, Link: link, Float: float_1, + Int: int_1, Currency: currency, Password: password, Table: table @@ -25270,8 +25347,24 @@ var form = class BaseForm extends observable { }); } + checkValidity() { + let validity = this.form.checkValidity(); + if (validity) { + for (let control of this.controlList) { + // check validity in table + if (control.fieldtype==='Table') { + validity = control.checkValidity(); + if (!validity) { + break; + } + } + } + } + return validity; + } + async submit() { - if (!this.form.checkValidity()) { + if (!this.checkValidity()) { this.form.classList.add('was-validated'); return; } @@ -25551,15 +25644,15 @@ var client = { var autoname = "hash"; var name = "ToDo"; var doctype = "DocType"; -var is_single = 0; -var keyword_fields = ["subject","description"]; +var isSingle = 0; +var keywordFields = ["subject","description"]; var fields = [{"fieldname":"subject","label":"Subject","fieldtype":"Data","required":1},{"fieldname":"status","label":"Status","fieldtype":"Select","options":["Open","Closed"],"default":"Open","required":1},{"fieldname":"description","label":"Description","fieldtype":"Text"}]; var todo = { autoname: autoname, name: name, doctype: doctype, - is_single: is_single, - keyword_fields: keyword_fields, + isSingle: isSingle, + keywordFields: keywordFields, fields: fields }; @@ -25567,8 +25660,8 @@ var todo$1 = Object.freeze({ autoname: autoname, name: name, doctype: doctype, - is_single: is_single, - keyword_fields: keyword_fields, + isSingle: isSingle, + keywordFields: keywordFields, fields: fields, default: todo }); @@ -25597,33 +25690,88 @@ var todo$2 = { Meta: ToDoMeta }; -var name$1 = "Account"; +var name$1 = "Number Series"; var doctype$1 = "DocType"; -var is_single$1 = 0; -var keyword_fields$1 = ["name","account_type"]; -var fields$1 = [{"fieldname":"name","label":"Account Name","fieldtype":"Data","required":1},{"fieldname":"parent_account","label":"Parent Account","fieldtype":"Link","target":"Account"},{"fieldname":"account_type","label":"Account Type","fieldtype":"Select","options":["Asset","Liability","Equity","Income","Expense"]}]; -var account = { +var isSingle$1 = 0; +var isChild = 0; +var keywordFields$1 = []; +var fields$1 = [{"fieldname":"name","label":"Name","fieldtype":"Data","required":1},{"fieldname":"current","label":"Current","fieldtype":"Int","required":1}]; +var number_series = { name: name$1, doctype: doctype$1, - is_single: is_single$1, - keyword_fields: keyword_fields$1, + isSingle: isSingle$1, + isChild: isChild, + keywordFields: keywordFields$1, fields: fields$1 }; -var account$1 = Object.freeze({ +var number_series$1 = Object.freeze({ name: name$1, doctype: doctype$1, - is_single: is_single$1, - keyword_fields: keyword_fields$1, + isSingle: isSingle$1, + isChild: isChild, + keywordFields: keywordFields$1, fields: fields$1, + default: number_series +}); + +var require$$0$5 = ( number_series$1 && number_series ) || number_series$1; + +class NumberSeriesMeta extends meta { + setupMeta() { + Object.assign(this, require$$0$5); + } +} + +class NumberSeries extends document$1 { + setup() { + this.addHandler('validate'); + } + validate() { + if (this.current===null || this.current===undefined) { + this.current = 0; + } + } + async next() { + this.validate(); + this.current++; + await this.update(); + return this.current; + } +} + +var number_series$2 = { + Document: NumberSeries, + Meta: NumberSeriesMeta +}; + +var name$2 = "Account"; +var doctype$2 = "DocType"; +var isSingle$2 = 0; +var keywordFields$2 = ["name","account_type"]; +var fields$2 = [{"fieldname":"name","label":"Account Name","fieldtype":"Data","required":1},{"fieldname":"parent_account","label":"Parent Account","fieldtype":"Link","target":"Account"},{"fieldname":"account_type","label":"Account Type","fieldtype":"Select","options":["Asset","Liability","Equity","Income","Expense"]}]; +var account = { + name: name$2, + doctype: doctype$2, + isSingle: isSingle$2, + keywordFields: keywordFields$2, + fields: fields$2 +}; + +var account$1 = Object.freeze({ + name: name$2, + doctype: doctype$2, + isSingle: isSingle$2, + keywordFields: keywordFields$2, + fields: fields$2, default: account }); -var require$$0$5 = ( account$1 && account ) || account$1; +var require$$0$6 = ( account$1 && account ) || account$1; class AccountMeta extends meta { setupMeta() { - Object.assign(this, require$$0$5); + Object.assign(this, require$$0$6); } } @@ -25647,33 +25795,33 @@ var account$2 = { Meta: AccountMeta }; -var name$2 = "Item"; -var doctype$2 = "DocType"; -var is_single$2 = 0; -var keyword_fields$2 = ["name","description"]; -var fields$2 = [{"fieldname":"name","label":"Item Name","fieldtype":"Data","required":1},{"fieldname":"description","label":"Description","fieldtype":"Text"},{"fieldname":"unit","label":"Unit","fieldtype":"Select","options":["No","Kg","Gram","Hour","Day"]},{"fieldname":"rate","label":"Rate","fieldtype":"Currency"}]; +var name$3 = "Item"; +var doctype$3 = "DocType"; +var isSingle$3 = 0; +var keywordFields$3 = ["name","description"]; +var fields$3 = [{"fieldname":"name","label":"Item Name","fieldtype":"Data","required":1},{"fieldname":"description","label":"Description","fieldtype":"Text"},{"fieldname":"unit","label":"Unit","fieldtype":"Select","options":["No","Kg","Gram","Hour","Day"]},{"fieldname":"rate","label":"Rate","fieldtype":"Currency"}]; var item$1 = { - name: name$2, - doctype: doctype$2, - is_single: is_single$2, - keyword_fields: keyword_fields$2, - fields: fields$2 + name: name$3, + doctype: doctype$3, + isSingle: isSingle$3, + keywordFields: keywordFields$3, + fields: fields$3 }; var item$2 = Object.freeze({ - name: name$2, - doctype: doctype$2, - is_single: is_single$2, - keyword_fields: keyword_fields$2, - fields: fields$2, + name: name$3, + doctype: doctype$3, + isSingle: isSingle$3, + keywordFields: keywordFields$3, + fields: fields$3, default: item$1 }); -var require$$0$6 = ( item$2 && item$1 ) || item$2; +var require$$0$7 = ( item$2 && item$1 ) || item$2; class ItemMeta extends meta { setupMeta() { - Object.assign(this, require$$0$6); + Object.assign(this, require$$0$7); } } @@ -25685,36 +25833,36 @@ var item$3 = { Meta: ItemMeta }; -var name$3 = "Customer"; -var doctype$3 = "DocType"; -var is_single$3 = 0; +var name$4 = "Customer"; +var doctype$4 = "DocType"; +var isSingle$4 = 0; var istable = 0; -var keyword_fields$3 = ["name"]; -var fields$3 = [{"fieldname":"name","label":"Name","fieldtype":"Data","required":1}]; +var keywordFields$4 = ["name"]; +var fields$4 = [{"fieldname":"name","label":"Name","fieldtype":"Data","required":1}]; var customer = { - name: name$3, - doctype: doctype$3, - is_single: is_single$3, + name: name$4, + doctype: doctype$4, + isSingle: isSingle$4, istable: istable, - keyword_fields: keyword_fields$3, - fields: fields$3 + keywordFields: keywordFields$4, + fields: fields$4 }; var customer$1 = Object.freeze({ - name: name$3, - doctype: doctype$3, - is_single: is_single$3, + name: name$4, + doctype: doctype$4, + isSingle: isSingle$4, istable: istable, - keyword_fields: keyword_fields$3, - fields: fields$3, + keywordFields: keywordFields$4, + fields: fields$4, default: customer }); -var require$$0$7 = ( customer$1 && customer ) || customer$1; +var require$$0$8 = ( customer$1 && customer ) || customer$1; class CustomerMeta extends meta { setupMeta() { - Object.assign(this, require$$0$7); + Object.assign(this, require$$0$8); } } @@ -25726,36 +25874,39 @@ var customer$2 = { Meta: CustomerMeta }; -var name$4 = "Invoice"; -var doctype$4 = "DocType"; -var is_single$4 = 0; +var name$5 = "Invoice"; +var doctype$5 = "DocType"; +var isSingle$5 = 0; var istable$1 = 0; -var keyword_fields$4 = []; -var fields$4 = [{"fieldname":"customer","label":"Customer","fieldtype":"Link","target":"Customer","required":1},{"fieldname":"items","label":"Items","fieldtype":"Table","childtype":"Invoice Item","required":true},{"fieldname":"total","label":"Total","fieldtype":"Currency","formula":"doc.getSum('items', 'amount')","required":true,"disabled":true}]; +var keywordFields$5 = []; +var settings = "Invoice Settings"; +var fields$5 = [{"fieldname":"customer","label":"Customer","fieldtype":"Link","target":"Customer","required":1},{"fieldname":"items","label":"Items","fieldtype":"Table","childtype":"Invoice Item","required":true},{"fieldname":"total","label":"Total","fieldtype":"Currency","formula":"doc.getSum('items', 'amount')","required":true,"disabled":true}]; var invoice = { - name: name$4, - doctype: doctype$4, - is_single: is_single$4, + name: name$5, + doctype: doctype$5, + isSingle: isSingle$5, istable: istable$1, - keyword_fields: keyword_fields$4, - fields: fields$4 + keywordFields: keywordFields$5, + settings: settings, + fields: fields$5 }; var invoice$1 = Object.freeze({ - name: name$4, - doctype: doctype$4, - is_single: is_single$4, + name: name$5, + doctype: doctype$5, + isSingle: isSingle$5, istable: istable$1, - keyword_fields: keyword_fields$4, - fields: fields$4, + keywordFields: keywordFields$5, + settings: settings, + fields: fields$5, default: invoice }); -var require$$0$8 = ( invoice$1 && invoice ) || invoice$1; +var require$$0$9 = ( invoice$1 && invoice ) || invoice$1; class InvoiceMeta extends meta { setupMeta() { - Object.assign(this, require$$0$8); + Object.assign(this, require$$0$9); } } @@ -25767,36 +25918,36 @@ var invoice$2 = { Meta: InvoiceMeta }; -var name$5 = "Invoice Item"; -var doctype$5 = "DocType"; -var is_single$5 = 0; -var is_child = 1; -var keyword_fields$5 = []; -var fields$5 = [{"fieldname":"item","label":"Item","fieldtype":"Link","target":"Item","required":1},{"fieldname":"description","label":"Description","fieldtype":"Text","formula":"doc.getFrom('Item', row.item, 'description')","required":1},{"fieldname":"quantity","label":"Quantity","fieldtype":"Float","required":1},{"fieldname":"rate","label":"Rate","fieldtype":"Currency","required":1},{"fieldname":"amount","label":"Amount","fieldtype":"Currency","disabled":1,"formula":"row.quantity * row.rate"}]; +var name$6 = "Invoice Item"; +var doctype$6 = "DocType"; +var isSingle$6 = 0; +var isChild$1 = 1; +var keywordFields$6 = []; +var fields$6 = [{"fieldname":"item","label":"Item","fieldtype":"Link","target":"Item","required":1},{"fieldname":"description","label":"Description","fieldtype":"Text","formula":"doc.getFrom('Item', row.item, 'description')","required":1},{"fieldname":"quantity","label":"Quantity","fieldtype":"Float","required":1},{"fieldname":"rate","label":"Rate","fieldtype":"Currency","required":1},{"fieldname":"amount","label":"Amount","fieldtype":"Currency","disabled":1,"formula":"row.quantity * row.rate"}]; var invoice_item = { - name: name$5, - doctype: doctype$5, - is_single: is_single$5, - is_child: is_child, - keyword_fields: keyword_fields$5, - fields: fields$5 + name: name$6, + doctype: doctype$6, + isSingle: isSingle$6, + isChild: isChild$1, + keywordFields: keywordFields$6, + fields: fields$6 }; var invoice_item$1 = Object.freeze({ - name: name$5, - doctype: doctype$5, - is_single: is_single$5, - is_child: is_child, - keyword_fields: keyword_fields$5, - fields: fields$5, + name: name$6, + doctype: doctype$6, + isSingle: isSingle$6, + isChild: isChild$1, + keywordFields: keywordFields$6, + fields: fields$6, default: invoice_item }); -var require$$0$9 = ( invoice_item$1 && invoice_item ) || invoice_item$1; +var require$$0$10 = ( invoice_item$1 && invoice_item ) || invoice_item$1; class InvoiceItemMeta extends meta { setupMeta() { - Object.assign(this, require$$0$9); + Object.assign(this, require$$0$10); } } @@ -25808,6 +25959,47 @@ var invoice_item$2 = { Meta: InvoiceItemMeta }; +var name$7 = "Invoice Settings"; +var doctype$7 = "DocType"; +var isSingle$7 = 1; +var isChild$2 = 0; +var keywordFields$7 = []; +var fields$7 = [{"fieldname":"number_series","label":"Number Series","fieldtype":"Link","target":"Number Series","required":1}]; +var invoice_settings = { + name: name$7, + doctype: doctype$7, + isSingle: isSingle$7, + isChild: isChild$2, + keywordFields: keywordFields$7, + fields: fields$7 +}; + +var invoice_settings$1 = Object.freeze({ + name: name$7, + doctype: doctype$7, + isSingle: isSingle$7, + isChild: isChild$2, + keywordFields: keywordFields$7, + fields: fields$7, + default: invoice_settings +}); + +var require$$0$11 = ( invoice_settings$1 && invoice_settings ) || invoice_settings$1; + +class InvoiceSettingsMeta extends meta { + setupMeta() { + Object.assign(this, require$$0$11); + } +} + +class InvoiceSettings extends document$1 { +} + +var invoice_settings$2 = { + Document: InvoiceSettings, + Meta: InvoiceSettingsMeta +}; + class ToDoList extends list { getFields() { return ['name', 'subject', 'status']; @@ -25857,11 +26049,13 @@ client.start({ // require modules frappe.modules.todo = todo$2; + frappe.modules.number_series = number_series$2; frappe.modules.account = account$2; frappe.modules.item = item$3; frappe.modules.customer = customer$2; frappe.modules.invoice = invoice$2; frappe.modules.invoice_item = invoice_item$2; + frappe.modules.invoice_settings = invoice_settings$2; frappe.modules.todo_client = todo_client; frappe.modules.account_client = account_client; diff --git a/models/doctype/account/account.json b/models/doctype/account/account.json index 85111622..127bb623 100644 --- a/models/doctype/account/account.json +++ b/models/doctype/account/account.json @@ -1,8 +1,8 @@ { "name": "Account", "doctype": "DocType", - "is_single": 0, - "keyword_fields": [ + "isSingle": 0, + "keywordFields": [ "name", "account_type" ], diff --git a/models/doctype/customer/customer.json b/models/doctype/customer/customer.json index 31b3340f..e0de070e 100644 --- a/models/doctype/customer/customer.json +++ b/models/doctype/customer/customer.json @@ -1,9 +1,9 @@ { "name": "Customer", "doctype": "DocType", - "is_single": 0, + "isSingle": 0, "istable": 0, - "keyword_fields": [ + "keywordFields": [ "name" ], "fields": [ diff --git a/models/doctype/invoice/invoice.json b/models/doctype/invoice/invoice.json index daee9706..ebf15a36 100644 --- a/models/doctype/invoice/invoice.json +++ b/models/doctype/invoice/invoice.json @@ -1,9 +1,10 @@ { "name": "Invoice", "doctype": "DocType", - "is_single": 0, + "isSingle": 0, "istable": 0, - "keyword_fields": [], + "keywordFields": [], + "settings": "Invoice Settings", "fields": [ { "fieldname": "customer", diff --git a/models/doctype/invoice_item/invoice_item.json b/models/doctype/invoice_item/invoice_item.json index 55477cfe..06d26dcf 100644 --- a/models/doctype/invoice_item/invoice_item.json +++ b/models/doctype/invoice_item/invoice_item.json @@ -1,9 +1,9 @@ { "name": "Invoice Item", "doctype": "DocType", - "is_single": 0, - "is_child": 1, - "keyword_fields": [], + "isSingle": 0, + "isChild": 1, + "keywordFields": [], "fields": [ { "fieldname": "item", diff --git a/models/doctype/invoice_settings/invoice_settings.js b/models/doctype/invoice_settings/invoice_settings.js new file mode 100644 index 00000000..ca074870 --- /dev/null +++ b/models/doctype/invoice_settings/invoice_settings.js @@ -0,0 +1,16 @@ +const BaseMeta = require('frappejs/model/meta'); +const BaseDocument = require('frappejs/model/document'); + +class InvoiceSettingsMeta extends BaseMeta { + setupMeta() { + Object.assign(this, require('./invoice_settings.json')); + } +} + +class InvoiceSettings extends BaseDocument { +} + +module.exports = { + Document: InvoiceSettings, + Meta: InvoiceSettingsMeta +}; \ No newline at end of file diff --git a/models/doctype/invoice_settings/invoice_settings.json b/models/doctype/invoice_settings/invoice_settings.json new file mode 100644 index 00000000..00d375b0 --- /dev/null +++ b/models/doctype/invoice_settings/invoice_settings.json @@ -0,0 +1,16 @@ +{ + "name": "Invoice Settings", + "doctype": "DocType", + "isSingle": 1, + "isChild": 0, + "keywordFields": [], + "fields": [ + { + "fieldname": "number_series", + "label": "Number Series", + "fieldtype": "Link", + "target": "Number Series", + "required": 1 + } + ] +} \ No newline at end of file diff --git a/models/doctype/item/item.json b/models/doctype/item/item.json index 2534f1b6..a79b549a 100644 --- a/models/doctype/item/item.json +++ b/models/doctype/item/item.json @@ -1,8 +1,8 @@ { "name": "Item", "doctype": "DocType", - "is_single": 0, - "keyword_fields": [ + "isSingle": 0, + "keywordFields": [ "name", "description" ], diff --git a/package.json b/package.json index c2a580ce..718316c4 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "frappe-todo", + "name": "frappe-accounting", "version": "1.0.0", "main": "index.js", "license": "MIT", diff --git a/src/index.js b/src/index.js index d078fbeb..d8a5bfc4 100644 --- a/src/index.js +++ b/src/index.js @@ -8,11 +8,13 @@ client.start({ // require modules frappe.modules.todo = require('frappejs/models/doctype/todo/todo.js'); + frappe.modules.number_series = require('frappejs/models/doctype/number_series/number_series.js'); frappe.modules.account = require('../models/doctype/account/account.js'); frappe.modules.item = require('../models/doctype/item/item.js'); frappe.modules.customer = require('../models/doctype/customer/customer.js'); frappe.modules.invoice = require('../models/doctype/invoice/invoice.js'); frappe.modules.invoice_item = require('../models/doctype/invoice_item/invoice_item.js'); + frappe.modules.invoice_settings = require('../models/doctype/invoice_settings/invoice_settings.js'); frappe.modules.todo_client = require('frappejs/models/doctype/todo/todo_client.js'); frappe.modules.account_client = require('../models/doctype/account/account_client.js');