diff --git a/src/bsl_helper.js b/src/bsl_helper.js index d6e141d..0dd805f 100644 --- a/src/bsl_helper.js +++ b/src/bsl_helper.js @@ -1713,6 +1713,84 @@ class bslHelper { } + /** + * Returns subresources for the virtual table type + * + * @param {string} subTable subtable name like balance, turnovers, periodical + * @param {string} regType type of subtable like balance, turnovers, periodical + * + * @returns {array} array of subresources + */ + getGetVirtualTableSubresouces(subTable, regType) { + + let subresouces = {}; + + if (engLang) { + + if (subTable == 'balance') { + subresouces = { + "Balance": "(balance)" + }; + } + else if (subTable == 'turnovers') { + if (regType == 'balance') + subresouces = { + "Receipt": "(receipt)", + "Expense": "(expense)", + "Turnover": "(turnover)" + }; + else + subresouces = { + "Turnover": "(turnover)" + }; + + } + else if (subTable == 'balanceandturnovers') { + subresouces = { + "OpeningBalance": "(opening balance)", + "Receipt": "(receipt)", + "Expense": "(expense)", + "Turnover": "(turnover)", + "ClosingBalance": "(closing balance)" + }; + } + + } + else { + + if (subTable == 'остатки') { + subresouces = { + "Остаток": "(остаток)" + }; + } + else if (subTable == 'обороты') { + if (regType == 'balance') + subresouces = { + "Приход": "(приход)", + "Расход": "(расход)", + "Оборот": "(оборот)" + }; + else + subresouces = { + "Оборот": "(оборот)" + }; + } + else if (subTable == 'остаткииобороты') { + subresouces = { + "НачальныйОстаток": "(начальный остаток)", + "Приход": "(приход)", + "Расход": "(расход)", + "Оборот": "(оборот)", + "КонечныйОстаток": "(конечный остаток)" + }; + } + + } + + return subresouces; + + } + /** * Gets the list of properties (attributes) owned by object * (Catalog, Document, etc) and fills the suggestions by it @@ -1755,6 +1833,49 @@ class bslHelper { }); } + let resources = []; + + if (obj.hasOwnProperty('resources')) { + + for (const [rkey, rvalue] of Object.entries(obj.resources)) { + resources.push({'label': rkey, 'name': rvalue.name}); + } + + let regType = obj.hasOwnProperty('type') ? obj.type : ''; + let subresouces = this.getGetVirtualTableSubresouces(metadataSubtable, regType); + let subExists = false; + let items = []; + + for (let idx = 0; idx < resources.length; idx++) { + + let resource = resources[idx]; + + for (const [skey, svalue] of Object.entries(subresouces)) { + subExists = true; + items.push({'label': resource.label + skey, 'name': resource.name + ' ' + svalue}); + } + + if (!subExists) + items.push(resource); + + } + + for (let idx = 0; idx < items.length; idx++) { + + let item = items[idx]; + + suggestions.push({ + label: item.label, + kind: monaco.languages.CompletionItemKind.value, + insertText: item.label, + insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, + detail: item.name + }); + + } + + } + } } @@ -1914,13 +2035,13 @@ class bslHelper { } /** - * Returns temporary tables of register depending on the register's type + * Returns virtual tables of register depending on the register's type * * @param {string} type of register like balance, turnovers, periodical * * @returns {array} array of names */ - getRegisterTempraryTables(type) { + getRegisterVirtualTables(type) { let tables = {}; @@ -1994,7 +2115,7 @@ class bslHelper { } /** - * Fills array of completition for temporary tables of registers in source + * Fills array of completition for virtual tables of registers in source * * @param {object} data objects from BSL-JSON dictionary * @param {string} metadataItem name of metadata item like (ЦеныНоменклатуры/ProductPrices, СвободныеОстатки/AvailableStock) @@ -2006,7 +2127,7 @@ class bslHelper { if (ikey.toLowerCase() == metadataItem.toLowerCase() && ivalue.hasOwnProperty('type')) { - let tables = this.getRegisterTempraryTables(ivalue.type); + let tables = this.getRegisterVirtualTables(ivalue.type); for (const [tkey, tvalue] of Object.entries(tables)) { diff --git a/src/test_query.html b/src/test_query.html index 37a64cd..71390d0 100644 --- a/src/test_query.html +++ b/src/test_query.html @@ -1110,7 +1110,11 @@ '////////////////////////////////////////////////////////////////////////////////', 'ВЫБРАТЬ', ' Товары.Ссылка КАК Ссылка,', - ' Цены.Цена КАК Цена', + ' Цены.Цена КАК Цена,', + ' Остатки.Номенклатура КАК Остатки_Номенклатура,', + ' Обороты.Номенклатура КАК Обороты_Номенклатура,', + ' ОстаткиИОбороты.Номенклатура КАК ОстаткиИОбороты_Номенклатура,', + ' Продажи.Номенклатура КАК Продажи_Номенклатура', 'ИЗ', ' Справочник.Товары КАК Товары', ' ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(', @@ -1124,6 +1128,8 @@ ' ПО Товары.Ссылка = Обороты.Номенклатура', ' ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты КАК ОстаткиИОбороты', ' ПО Товары.Ссылка = ОстаткиИОбороты.Номенклатура', + ' ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты КАК Продажи', + ' ПО Товары.Ссылка = Продажи.Номеклатура', 'ГДЕ', ' Товары.Ссылка <> &Товар' ].join('\n'); diff --git a/src/test_query.js b/src/test_query.js index c3c24dd..5f961c6 100644 --- a/src/test_query.js +++ b/src/test_query.js @@ -218,6 +218,50 @@ describe("Проверка автокомлита и подсказок реда assert.equal(suggestions.some(suggest => suggest.label === "ВидЦены"), true); }); + it("проверка подсказки полей виртуальной таблицы остатков", function () { + bsl = helper(getCode(), 1095, 10); + let suggestions = []; + bsl.getQueryFieldsCompletition(suggestions); + expect(suggestions).to.be.an('array').that.not.is.empty; + assert.equal(suggestions.some(suggest => suggest.label === "КоличествоОстаток"), true); + assert.equal(suggestions.some(suggest => suggest.label === "КоличествоНачальныйОстаток"), false); + assert.equal(suggestions.some(suggest => suggest.label === "КоличествоПриход"), false); + assert.equal(suggestions.some(suggest => suggest.label === "КоличествоОборот"), false); + }); + + it("проверка подсказки полей виртуальной таблицы остатков и оборотов", function () { + bsl = helper(getCode(), 1097, 18); + let suggestions = []; + bsl.getQueryFieldsCompletition(suggestions); + expect(suggestions).to.be.an('array').that.not.is.empty; + assert.equal(suggestions.some(suggest => suggest.label === "КоличествоПриход"), true); + assert.equal(suggestions.some(suggest => suggest.label === "КоличествоОборот"), true); + assert.equal(suggestions.some(suggest => suggest.label === "КоличествоНачальныйОстаток"), true); + assert.equal(suggestions.some(suggest => suggest.label === "КоличествоОстаток"), false); + }); + + it("проверка подсказки полей виртуальной таблицы оборотов (вид регистра 'Остатки')", function () { + bsl = helper(getCode(), 1096, 10); + let suggestions = []; + bsl.getQueryFieldsCompletition(suggestions); + expect(suggestions).to.be.an('array').that.not.is.empty; + assert.equal(suggestions.some(suggest => suggest.label === "КоличествоПриход"), true); + assert.equal(suggestions.some(suggest => suggest.label === "КоличествоОборот"), true); + assert.equal(suggestions.some(suggest => suggest.label === "КоличествоОстаток"), false); + assert.equal(suggestions.some(suggest => suggest.label === "КоличествоНачальныйОстаток"), false); + }); + + it("проверка подсказки полей виртуальной таблицы оборотов (вид регистра 'Обороты')", function () { + bsl = helper(getCode(), 1098, 10); + let suggestions = []; + bsl.getQueryFieldsCompletition(suggestions); + expect(suggestions).to.be.an('array').that.not.is.empty; + assert.equal(suggestions.some(suggest => suggest.label === "КоличествоОборот"), true); + assert.equal(suggestions.some(suggest => suggest.label === "КоличествоПриход"), false); + assert.equal(suggestions.some(suggest => suggest.label === "КоличествоОстаток"), false); + assert.equal(suggestions.some(suggest => suggest.label === "КоличествоНачальныйОстаток"), false); + }); + switchQueryMode(); mocha.run();