//jexcel next-hd.netサーバ配置 loadcdn('script', 'https://next-hd.net/jexcel/jexcel.min.js'); loadcdn('css', 'https://next-hd.net/jexcel/jexcel.min.css'); loadcdn('script', 'https://next-hd.net/jexcel/jsuites.min.js'); loadcdn('css', 'https://next-hd.net/jexcel/jsuites.min.css'); let pageLoading = 0; let editableFlag = true; let myData; let apiKey = '6504c8a807677a3a576e10327f3c19876c55736ee45d4a845796b9e7f5e087bfd4bd0d8184863da8cf1733ca635111432ab334aea59102b06a96ee6d2c05190d'; window.addEventListener('load', function () { tableLoad = 0; if (pageLoading == 0) { console.log('load Event'); onLoad(); } }); $p.events.on_editor_load = function () { tableLoad = 0; if (pageLoading == 1) { console.log('on Editor Load'); onLoad(); } //setKankeisya(); } function onLoad() { //ステータスチェック let status = $('#Results_Status').val(); if (status == '100' || status == '110' || status == '200' || status == '300') { editableFlag = true; } else { editableFlag = false; } if ($p.userId() == '460' || $p.userId() == '678' || $p.userId() == '421') { editableFlag = true; } pageLoading = 1; /*実績情報収集反映*/ getMyData(); getJissekiData(); createTable(); createSpreadsheet(); summaryCalc(); labelOption(); //createEigyoGaiTable(); //createMembersTable(); //$p.ex.columnReadOnly('DateA'); //$p.ex.columnReadOnly('DateB'); //$p.ex.columnReadOnly('DateC'); createSummaryButton(); } function getMyData() { let thisId = $p.id(); $p.apiGet({ 'id': thisId, 'data': { 'ApiVersion': 1.1, 'ApiKey': apiKey, }, 'async': false, 'done': function (data) { myData = data.Response.Data[0]; }, 'fail': function (data) { console.log(data); } }); } //実績計上テーブルからデータ取得 function getJissekiData() { let jissekiTable = '263191'; let classE = myData.ClassHash.ClassB //計上営業所 let jissekiA = { '1': [], '2': [], '3': [], '4': [], '5': [], '6': [], '7': [], '8': [], '9': [], '10': [], '11': [], '12': [] }; let jissekiB = { '1': [], '2': [], '3': [], '4': [], '5': [], '6': [], '7': [], '8': [], '9': [], '10': [], '11': [], '12': [] }; let jissekiC = { '1': [], '2': [], '3': [], '4': [], '5': [], '6': [], '7': [], '8': [], '9': [], '10': [], '11': [], '12': [] }; //絞り込み日付 let sYear = myData.ClassHash.ClassZ; let eYear = parseFloat(myData.ClassHash.ClassZ) + 1; let sDate = sYear + '/04/01 00:00:00'; let eDate = eYear + '/04/30 23:59:59'; //着工と完成は当月まで let thisMonthLastDay = new Date(); thisMonthLastDay.setMonth(thisMonthLastDay.getMonth() + 1, 0) let eDate1 = thisMonthLastDay.getFullYear() + '/' + (thisMonthLastDay.getMonth() + 1).toString().padStart(2, '0') + '/' + (thisMonthLastDay.getDate()).toString().padStart(2, '0') + ' 23:59:59'; console.log(eDate1); //受注(本契約のみ) $p.apiGet({ 'id': jissekiTable, 'data': { 'ApiVersion': 1.1, 'ApiKey': apiKey, 'View': { 'ColumnFilterHash': { 'ClassE': '["' + classE + '"]', //計上営業所 'ClassO': '["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"]', //契約カウント月 'DateA': '["' + sDate + ',' + eDate + '"]', //契約日 'DateB': '["\t"]', //設計契約日は空欄 }, 'ColumnSorterHash': { 'DateA': 'asc', } } }, 'async': false, 'done': function (data) { //console.log(data); $.each(data.Response.Data, function (index, value) { let countMonth = parseFloat(value.ClassHash.ClassO.replace('月', '')); let date0 = new Date(value.DateHash.DateA); date0.setHours(date0.getHours() + 9); let countYear = date0.getFullYear(); if (countMonth <= 3 && countYear == sYear) { //対象外 } else if (countMonth == 4 && countYear == eYear) { //対象外 } else { let kubun = value.ClassHash.ClassD; let cname = value.ClassHash.ClassC; let ukeoi = parseFloat(value.NumHash.NumA); let arari = parseFloat(value.NumHash.NumB); let arariPer = Math.floor(arari / ukeoi * 1000) / 10; let tanto = value.ClassHash.ClassF; let data0 = { '0': '0', '1': date0, '2': kubun, '3': cname, '4': ukeoi, '5': arariPer, '6': arari, '7': tanto, } jissekiA[countMonth].push(data0); } }); }, 'fail': function (data) { console.log(data); } }); //受注(設計契約) $p.apiGet({ 'id': jissekiTable, 'data': { 'ApiVersion': 1.1, 'ApiKey': apiKey, 'View': { 'ColumnFilterHash': { 'ClassE': '["' + classE + '"]', //計上営業所 'ClassO': '["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"]', //契約カウント月 'DateB': '["' + sDate + ',' + eDate + '"]', //設計契約日 }, 'ColumnSorterHash': { 'DateB': 'asc', } } }, 'async': false, 'done': function (data) { //console.log(data); $.each(data.Response.Data, function (index, value) { let countMonth = parseFloat(value.ClassHash.ClassO.replace('月', '')); let date0 = new Date(value.DateHash.DateB); date0.setHours(date0.getHours() + 9); let countYear = date0.getFullYear(); if (countMonth <= 3 && countYear == sYear) { //対象外 } else if (countMonth == 4 && countYear == eYear) { //対象外 } else { let kubun = value.ClassHash.ClassD; let cname = '[設]' + value.ClassHash.ClassC; let ukeoi = parseFloat(value.NumHash.NumC); let arari = parseFloat(value.NumHash.NumD); let tanto = value.ClassHash.ClassF; //本契約ありの場合は、本契約の金額に差し替え・案件名の先頭に[請]を点ける if (value.DateHash.DateA != '1899-12-30T00:00:00') { cname = '[本]' + value.ClassHash.ClassC; ukeoi = parseFloat(value.NumHash.NumA); arari = parseFloat(value.NumHash.NumB); } else { cname = '[設]' + value.ClassHash.ClassC; } let arariPer = Math.floor(arari / ukeoi * 1000) / 10; let data0 = { '0': '0', '1': date0, '2': kubun, '3': cname, '4': ukeoi, '5': arariPer, '6': arari, '7': tanto, } jissekiA[countMonth].push(data0); } }); }, 'fail': function (data) { console.log(data); } }); //着工 $p.apiGet({ 'id': jissekiTable, 'data': { 'ApiVersion': 1.1, 'ApiKey': apiKey, 'View': { 'ColumnFilterHash': { 'ClassE': '["' + classE + '"]', 'DateC': '["' + sDate + ',' + eDate1 + '"]', }, 'ColumnSorterHash': { 'DateC': 'asc', } } }, 'async': false, 'done': function (data) { //console.log(data); let num = 1; let month0 = 0; $.each(data.Response.Data, function (index, value) { let date0 = new Date(value.DateHash.DateC); date0.setHours(date0.getHours() + 9); let month = date0.getMonth() + 1; let kubun = value.ClassHash.ClassD; let cname = value.ClassHash.ClassC; let ukeoi = parseFloat(value.NumHash.NumA); let arari = parseFloat(value.NumHash.NumB); let arariPer = Math.floor(arari / ukeoi * 1000) / 10; let tanto = value.ClassHash.ClassF; if (index > 0 && month0 != month) { num = 1; } let data0 = { '0': num, '1': date0, '2': kubun, '3': cname, '4': ukeoi, '5': arariPer, '6': arari, '7': tanto, } jissekiB[month].push(data0); num = num + 1; month0 = month; }); }, 'fail': function (data) { console.log(data); } }); //完成 $p.apiGet({ 'id': jissekiTable, 'data': { 'ApiVersion': 1.1, 'ApiKey': apiKey, 'View': { 'ColumnFilterHash': { 'ClassE': '["' + classE + '"]', 'DateD': '["' + sDate + ',' + eDate1 + '"]', }, 'ColumnSorterHash': { 'DateD': 'asc', } } }, 'async': false, 'done': function (data) { //console.log(data); let num = 1; let month0 = 0; $.each(data.Response.Data, function (index, value) { let date0 = new Date(value.DateHash.DateD); date0.setHours(date0.getHours() + 9); let month = date0.getMonth() + 1; let kubun = value.ClassHash.ClassD; let cname = value.ClassHash.ClassC; let ukeoi = parseFloat(value.NumHash.NumA); let arari = parseFloat(value.NumHash.NumB); let arariPer = Math.floor(arari / ukeoi * 1000) / 10; let tanto = value.ClassHash.ClassF; if (index > 0 && month0 != month) { num = 1; } let data0 = { '0': num, '1': date0, '2': kubun, '3': cname, '4': ukeoi, '5': arariPer, '6': arari, '7': tanto, } jissekiC[month].push(data0); num = num + 1; month0 = month; }); }, 'fail': function (data) { console.log(data); } }); let jissekiTemplate = JSON.parse('[{"0": "1","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "2","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "3","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "4","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "5","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "6","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "7","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "8","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "9","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "10","1": "","2": "","3": "","4": "","5": "","6": "","7": ""}]'); for (i = 1; i <= 12; i++) { let desc1 = (i + 20).toString().padStart(3, '0'); if (jissekiA[i].length) { for (j = 0; j < jissekiA[i].length; j++) { //console.log(jissekiA[i]); let num = j + 1; jissekiA[i][j]['0'] = num.toString(); } for (k = 0; k < 10; k++) { if (k >= jissekiA[i].length) { jissekiA[i][k] = { "0": (k + 1).toString(), "1": "", "2": "", "3": "", "4": "", "5": "", "6": "", "7": "" } } } $p.set($('#Results_Description' + desc1), JSON.stringify(jissekiA[i])); } else { $p.set($('#Results_Description' + desc1), JSON.stringify(jissekiTemplate)); } let desc2 = (i + 80).toString().padStart(3, '0'); if (jissekiB[i].length) { for (k = 0; k < 10; k++) { if (k >= jissekiB[i].length) { jissekiB[i][k] = { "0": (k + 1).toString(), "1": "", "2": "", "3": "", "4": "", "5": "", "6": "", "7": "" } } } $p.set($('#Results_Description' + desc2), JSON.stringify(jissekiB[i])); } else { $p.set($('#Results_Description' + desc2), JSON.stringify(jissekiTemplate)); } let desc3 = (i + 140).toString().padStart(3, '0'); if (jissekiC[i].length) { for (k = 0; k < 10; k++) { if (k >= jissekiC[i].length) { jissekiC[i][k] = { "0": (k + 1).toString(), "1": "", "2": "", "3": "", "4": "", "5": "", "6": "", "7": "" } } } $p.set($('#Results_Description' + desc3), JSON.stringify(jissekiC[i])); } else { $p.set($('#Results_Description' + desc3), JSON.stringify(jissekiTemplate)); } } //console.log(jissekiA); //console.log(jissekiB); //console.log(jissekiC); } function createSummaryButton() { let button = document.createElement('button'); let url = 'https://nextoffice.next-hd.co.jp/pleasanter/profit_loss/profit_loss.html?reqId=' + $p.id(); button.type = 'button'; button.id = 'openSummaryWindowButton'; button.innerHTML = ' ▶▶▶損益計算書を開く '; button.setAttribute('onclick', 'window.open("' + url + '","_blank")'); button.style.marginLeft = '15px'; $('#HeaderTitle').append(button); $('#openSummaryWindowButton').button(); } $('.YesNoDatePicker').click(function () { $.each($('div.day'), function (index, value) { //console.log(value); value.innerText = value.innerText.replaceAll('日', ''); }) }) /* $p.on('change', 'ClassZ', function () { let limitDate = ''; let nendo = $('#Results_ClassZ').val(); if (nendo == '2023') { limitDate = '2024/02/28 12:00'; } else if (nendo == '2024') { limitDate = '2024/04/05 12:00'; } $p.set($('#Results_DateA'), limitDate); }) */ function labelOption() { let checkA = $('#Results_CheckA').prop("checked"); let tanka = $('#Results_NumA').val(); let arariPer = $('#Results_NumB').val(); let tenpo = $('#Results_ClassB option:selected').text(); //let span = document.createElement('span'); let labelName1 = ''; let labelName2 = ''; let labelName3 = ''; if (checkA) { labelName1 = '契約' + '    ' + tenpo; labelName2 = '着工' + '    ' + tenpo; labelName3 = '売上' + '    ' + tenpo; } else { labelName1 = '受注' + '    ' + tenpo + '  1棟単価:' + tanka + '  粗利基準:' + arariPer + '%'; labelName2 = '着工' + '    ' + tenpo + '  1棟単価:' + tanka + '  粗利基準:' + arariPer + '%'; labelName3 = '完成' + '    ' + tenpo + '  1棟単価:' + tanka + '  粗利基準:' + arariPer + '%'; } //ラベルの色変更 $.each($('label.field-section'), function (index, value) { $('label.field-section.juchuLabel').text("受注"); switch (value.innerText) { case '受注・契約': value.classList.add('juchuLabel'); break; case '着工': value.classList.add('chakoLabel'); break; case '完成・売上': value.classList.add('kanseiLabel'); break; } }); $('label.field-section.juchuLabel').text(labelName1); $('label.field-section.chakoLabel').text(labelName2); $('label.field-section.kanseiLabel').text(labelName3); if (checkA) { $('#SectionFields4Container').hide(); $('#SectionFields7Container').hide(); $('#SectionFields10Container').hide(); $('#SectionFields13Container').hide(); } } //SpreadSheetを保管するTableタグの生成 function createTable() { let colName = ['計画', '実績', '合計']; for (m = 1; m <= 12; m += 3) { for (i = 0; i <= 160; i += 60) { let table = document.createElement('table'); table.id = 'jigyoTable'; let thead = document.createElement('thead'); let tbody = document.createElement('tbody'); let c = 0; for (j = i; j <= i + 40; j += 20) { if (j == i) { let tr = document.createElement('tr'); let th = document.createElement('th'); tr.append(th); for (month = m; month < m + 3; month++) { let th = document.createElement('th'); th.classList.add('head1'); th.id = 'month_' + month; th.innerHTML = month + '月'; tr.append(th); } thead.append(tr); table.append(thead); } let tr = document.createElement('tr'); let td = document.createElement('td'); td.classList.add('head2'); td.classList.add('head2_' + c); td.innerHTML = colName[c]; tr.append(td); for (mm = j + m; mm < j + m + 3; mm++) { let td = document.createElement('td'); td.classList.add('tableBody'); td.id = 'table_' + (mm).toString().padStart(3, '0'); //td.innerHTML = ' '; tr.append(td); } c++; tbody.append(tr); } table.append(tbody); //console.log(table); let desc = (i + m).toString().padStart(3, '0'); $('#Results_Description' + desc + 'Field').after(table); } } } function createSpreadsheet() { //1月~12月 for (let month1 = 4; month1 < 16; month1++) { let month2; (month1 >= 13) ? month2 = month1 - 12 : month2 = month1; let count = 1; for (let i = 0; i <= 160; i += 20) { let tableId = (month2 + i).toString().padStart(3, '0'); switch (count) { case 1: //計画 createKeikakuTable(tableId); break; case 2: //実績 createJissekiTable(tableId); break; case 3: //合計 createGoukeiTable(tableId); break } if (count < 3) { count += 1; } else { count = 1; } } } } let keikakuTable = {}; function createKeikakuTable(tableId) { let dataArea = '#Results_Description' + tableId; let tableArea = '#table_' + tableId; //スプレッドシートベース let keikakuTableEl = document.createElement('div'); keikakuTableEl.classList.add('keikakuTable'); keikakuTableEl.id = 'Keikaku_' + tableId; //保管エリアからデータ取得 let descData = $(dataArea).val(); let keikakuData; if (descData) { keikakuData = JSON.parse(descData); } else { keikakuData = JSON.parse('[{"0": "1","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "2","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "3","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "4","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "5","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "6","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "7","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "8","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "9","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "10","1": "","2": "","3": "","4": "","5": "","6": "","7": ""}]'); $p.set($(dataArea), JSON.stringify(keikakuData)); } $(tableArea).append(keikakuTableEl); keikakuTable[tableId] = jspreadsheet(document.getElementById('Keikaku_' + tableId), { data: keikakuData, columns: [{ type: 'text', title: '#', width: 25, align: 'center', readOnly: true, }, { type: 'calendar', title: '日付', width: 80, align: 'center', options: { format: 'MM/DD', months: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], weekdays: ['日曜日', '月曜日', '木曜日', '水曜日', '木曜日', '金曜日', '土曜日'], weekdays_short: ['日', '月', '火', '水', '木', '金', '土'] }, readOnly: true, }, { type: 'text', title: '区分', width: 60, align: 'center', }, { type: 'text', title: '施主名', width: 140, align: 'left', }, { type: 'number', title: '請負金額', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '利益率', width: 60, mask: '#,##0.0%;[Red]#,##0.0%', align: 'right', readOnly: true, }, { type: 'number', title: '利益額', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'text', title: '担当者', width: 60, align: 'center', }], allowInsertColumn: false, allowInsertRow: false, allowManualInsertRow: false, allowDeleteColumn: false, allowDeletingAllRows: false, columnSorting: false, columnResize: false, minSpareRows: 0, editable: editableFlag, contextMenu: false, onchange: function (el, cell, x, y, value, oldValue) { keikakuCalc(tableId); } }); keikakuTable[tableId].hideIndex(); } let jissekiTable = {}; function createJissekiTable(tableId) { let dataArea = '#Results_Description' + tableId; let tableArea = '#table_' + tableId; //スプレッドシートベース let jissekiTableEl = document.createElement('div'); jissekiTableEl.classList.add('jissekiTable'); jissekiTableEl.id = 'jisseki_' + tableId; //保管エリアからデータ取得 let descData = $(dataArea).val(); let jissekiData; if (descData) { jissekiData = JSON.parse(descData); } else { jissekiData = JSON.parse('[{"0": "1","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "2","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "3","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "4","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "5","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "6","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "7","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "8","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "9","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "10","1": "","2": "","3": "","4": "","5": "","6": "","7": ""}]'); $p.set($(dataArea), JSON.stringify(jissekiData)); } $(tableArea).append(jissekiTableEl); jissekiTable[tableId] = jspreadsheet(document.getElementById('jisseki_' + tableId), { data: jissekiData, columns: [{ type: 'text', title: '#', width: 25, align: 'center', readOnly: true, }, { type: 'calendar', title: '日付', width: 80, align: 'center', options: { format: 'MM/DD', months: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], weekdays: ['日曜日', '月曜日', '木曜日', '水曜日', '木曜日', '金曜日', '土曜日'], weekdays_short: ['日', '月', '火', '水', '木', '金', '土'] }, //readOnly: true, }, { type: 'text', title: '区分', width: 60, align: 'center', //readOnly: true, }, { type: 'text', title: '施主名', width: 140, align: 'left', //readOnly: true, }, { type: 'number', title: '請負金額', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '利益率', width: 60, mask: '#,##0.0%;[Red]#,##0.0%', align: 'right', readOnly: true, }, { type: 'number', title: '利益額', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'text', title: '担当者', width: 60, align: 'center', //readOnly: true, }], allowInsertColumn: false, allowInsertRow: false, allowManualInsertRow: false, allowDeleteColumn: false, allowDeletingAllRows: false, columnSorting: false, columnResize: false, minSpareRows: 0, editable: false, contextMenu: false, onchange: function (el, cell, x, y, value, oldValue) { jissekiCalc(tableId); } }); jissekiTable[tableId].hideIndex(); } let goukeiTable = {}; function createGoukeiTable(tableId) { let dataArea = '#Results_Description' + tableId; let tableArea = '#table_' + tableId; //スプレッドシートベース let goukeiTableEl = document.createElement('div'); goukeiTableEl.classList.add('goukeiTable'); goukeiTableEl.id = 'goukei_' + tableId; //保管エリアからデータ取得 let descData = $(dataArea).val(); let goukeiData; if (descData) { goukeiData = JSON.parse(descData); } else { goukeiData = JSON.parse('[{"0": "当月","1": "計画","2": "","3": "","4": "","5": "","6": "請負金額"},{"0": "","1": "実績","2": "","3": "","4": "","5": "","6": "0%"},{"0": "","1": "差異","2": "","3": "","4": "","5": "","6": ""},{"0": "累計","1": "計画","2": "","3": "","4": "","5": "","6": "棟数"},{"0": "","1": "実績","2": "","3": "","4": "","5": "","6": "0%"},{"0": "","1": "差異","2": "","3": "","4": "","5": "","6": ""}]'); } $(tableArea).append(goukeiTableEl); goukeiTable[tableId] = jspreadsheet(document.getElementById('goukei_' + tableId), { data: goukeiData, columns: [{ type: 'text', title: '#', width: 25, align: 'center', //readOnly: true, }, { type: 'text', title: '##', width: 30, align: 'center', //readOnly: true, }, { type: 'number', title: '棟数', width: 60, mask: '#,##0;[Red]#,##0', align: 'center', //readOnly: true, }, { type: 'number', title: '請負金額', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '利益率', width: 60, mask: '#,##0.00%;[Red]#,##0.00%', align: 'center', //readOnly: true, }, { type: 'number', title: '利益額', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'text', title: '累計達成率', width: 160, align: 'center', //readOnly: true, }], allowInsertColumn: false, allowInsertRow: false, allowManualInsertRow: false, allowDeleteColumn: false, allowDeletingAllRows: false, columnSorting: false, columnResize: false, minSpareRows: 0, editable: false, contextMenu: false, }); goukeiTable[tableId].hideIndex(); $('#goukei_' + tableId + ' td[data-x="0"][data-y="0"]').attr('rowspan', 3); $('#goukei_' + tableId + ' td[data-x="0"][data-y="0"]').css({ 'vertical-align': 'middle', 'writing-mode': 'vertical-rl' }); $('#goukei_' + tableId + ' td[data-x="0"][data-y="1"]').hide(); $('#goukei_' + tableId + ' td[data-x="0"][data-y="2"]').hide(); $('#goukei_' + tableId + ' td[data-x="0"][data-y="3"]').attr('rowspan', 3); $('#goukei_' + tableId + ' td[data-x="0"][data-y="3"]').css({ 'vertical-align': 'middle', 'writing-mode': 'vertical-rl' }); $('#goukei_' + tableId + ' td[data-x="0"][data-y="4"]').hide(); $('#goukei_' + tableId + ' td[data-x="0"][data-y="5"]').hide(); $('#goukei_' + tableId + ' td[data-x="6"][data-y="1"]').attr('rowspan', 2); $('#goukei_' + tableId + ' td[data-x="6"][data-y="1"]').css({ 'font-size': '2.0em', 'font-weight': 'bold', 'vertical-align': 'middle', }); $('#goukei_' + tableId + ' td[data-x="6"][data-y="2"]').hide(); $('#goukei_' + tableId + ' td[data-x="6"][data-y="4"]').attr('rowspan', 2); $('#goukei_' + tableId + ' td[data-x="6"][data-y="4"]').css({ 'font-size': '2.0em', 'font-weight': 'bold', 'vertical-align': 'middle', }); $('#goukei_' + tableId + ' td[data-x="6"][data-y="5"]').hide(); $(function () { $('#goukei_' + tableId + ' td').each(function () { var test = $(this).text(); $(this).text(test.replace(/-/g, "▲")); }); }); } //計画 計算 function keikakuCalc(tableId) { let dataArea = '#Results_Description' + tableId; //基本単価・粗利 let tanka = parseFloat($('#Results_NumA').val().toString().replaceAll(/[¥,]/g, '')); let arariPer = parseFloat($('#Results_NumB').val().toString().replaceAll(/[¥,]/g, '')); let arari = Math.floor(tanka * arariPer / 100); let keikakuData = keikakuTable[tableId].getData(); for (i = 0; i < keikakuData.length; i++) { if (keikakuData[i][3] != '') { if (keikakuData[i][4] == '') { keikakuData[i][4] = tanka; keikakuData[i][5] = arariPer; keikakuData[i][6] = arari; } else { if (keikakuData[i][4] != '' && keikakuData[i][4] > 0 && keikakuData[i][6] != '' && keikakuData[i][6] > 0) { let ukeoi = keikakuData[i][4]; let arari = keikakuData[i][6]; let arariPer = Math.floor(arari / ukeoi * 1000) / 10; keikakuData[i][4] = ukeoi; keikakuData[i][5] = arariPer; keikakuData[i][6] = arari; } } } else { keikakuData[i][4] = ''; keikakuData[i][5] = ''; keikakuData[i][6] = ''; } } keikakuTable[tableId].setData(keikakuData); $p.set($(dataArea), JSON.stringify(keikakuTable[tableId].getJson())); summaryCalc(); } //実績計算 function jissekiCalc(tableId) { let dataArea = '#Results_Description' + tableId; //let tanka = parseFloat($('#Results_NumA').val().toString().replaceAll(/[¥,]/g, '')); //let arariPer = parseFloat($('#Results_NumB').val().toString().replaceAll(/[¥,]/g, '')); //let arari = Math.floor(tanka * arariPer / 100); let jissekiData = jissekiTable[tableId].getData(); for (i = 0; i < jissekiData.length; i++) { if (jissekiData[i][3] != '') { if (jissekiData[i][4] != '' && jissekiData[i][4] > 0) { if (jissekiData[i][6] != '' && jissekiData[i][6] > 0) { jissekiData[i][5] = Math.floor(jissekiData[i][6] / jissekiData[i][4] * 1000) / 10; } } } else { jissekiData[i][4] = ''; jissekiData[i][5] = ''; jissekiData[i][6] = ''; } } jissekiTable[tableId].setData(jissekiData); $p.set($(dataArea), JSON.stringify(jissekiTable[tableId].getJson())); summaryCalc(); } //合計・累計計算 function summaryCalc() { //受注j、着工c、完成k //計画keikaku、実績jisseki //累積テーブル初期化 let keikakuCumulative = {}; let jissekiCumulative = {}; for (let month1 = 4; month1 < 16; month1++) { let month2; (month1 >= 13) ? month2 = month1 - 12 : month2 = month1; for (let i = 40; i <= 160; i += 60) { let tableId = (month2 + i).toString().padStart(3, '0'); keikakuCumulative[tableId] = [0, 0, 0, 0, 0, 0]; jissekiCumulative[tableId] = [0, 0, 0, 0, 0, 0]; } } for (let month1 = 4; month1 < 16; month1++) { let month2; (month1 >= 13) ? month2 = month1 - 12 : month2 = month1; for (let i = 0; i <= 120; i += 60) { let tableId = (month2 + i).toString().padStart(3, '0'); let keikakuTableId = tableId; let jissekiTableId = (month2 + i + 20).toString().padStart(3, '0'); let goukeiTableId = (month2 + i + 40).toString().padStart(3, '0'); let keikakuData = keikakuTable[keikakuTableId].getData(); let jissekiData = jissekiTable[jissekiTableId].getData(); let goukeiData = goukeiTable[goukeiTableId].getData(); let keikakuDataArea = '#Results_Description' + keikakuTableId; let jissekiDataArea = '#Results_Description' + jissekiTableId; let goukeiDataArea = '#Results_Description' + goukeiTableId; let keikakuSum = [0, 0, 0, 0, 0, 0]; let jissekiSum = [0, 0, 0, 0, 0, 0]; for (j = 0; j < keikakuData.length; j++) { if (keikakuData[j][4] > 0) { keikakuSum[1] += parseFloat(keikakuData[j][4].toString().replaceAll(/[¥,]/g, '')); //請負金額計上 keikakuSum[3] += parseFloat(keikakuData[j][6].toString().replaceAll(/[¥,]/g, '')); //利益額計上 if (keikakuData[j][2] != "カウント外") { keikakuSum[0]++; //棟数計上 keikakuSum[4] += parseFloat(keikakuData[j][4].toString().replaceAll(/[¥,]/g, '')); //請負金額計上 keikakuSum[5] += parseFloat(keikakuData[j][6].toString().replaceAll(/[¥,]/g, '')); //利益額計上 } } } if (keikakuSum[4] > 0 && keikakuSum[5] > 0) { //keikakuSum[2] = Math.floor(keikakuSum[2] / keikakuSum[0] * 100) / 100; keikakuSum[2] = Math.floor(keikakuSum[5] / keikakuSum[4] * 10000) / 100; } for (j = 0; j < jissekiData.length; j++) { if (jissekiData[j][4] > 0) { jissekiSum[1] += parseFloat(jissekiData[j][4].toString().replaceAll(/[¥,]/g, '')); //請負金額計上 jissekiSum[3] += parseFloat(jissekiData[j][6].toString().replaceAll(/[¥,]/g, '')); //利益額計上 if (jissekiData[j][2] != "カウント外") { jissekiSum[0]++; //棟数計上 jissekiSum[4] += parseFloat(jissekiData[j][4].toString().replaceAll(/[¥,]/g, '')); //請負金額計上 jissekiSum[5] += parseFloat(jissekiData[j][6].toString().replaceAll(/[¥,]/g, '')); //利益額計上 } } } if (jissekiSum[4] > 0 && jissekiSum[5] > 0) { //jissekiSum[2] = Math.floor(jissekiSum[2] / jissekiSum[0] * 100) / 100; jissekiSum[2] = Math.floor(jissekiSum[5] / jissekiSum[4] * 10000) / 100; } //当月 計画 goukeiData[0][2] = keikakuSum[0]; //棟数 goukeiData[0][3] = keikakuSum[1]; //請負金額 goukeiData[0][4] = keikakuSum[2]; //利益率 goukeiData[0][5] = keikakuSum[3]; //利益額 //当月 実績 goukeiData[1][2] = jissekiSum[0]; //棟数 goukeiData[1][3] = jissekiSum[1]; //請負金額 goukeiData[1][4] = jissekiSum[2]; //利益率 goukeiData[1][5] = jissekiSum[3]; //利益額 //当月 差異 goukeiData[2][2] = jissekiSum[0] - keikakuSum[0]; goukeiData[2][3] = jissekiSum[1] - keikakuSum[1]; goukeiData[2][4] = jissekiSum[2] - keikakuSum[2]; goukeiData[2][5] = jissekiSum[3] - keikakuSum[3]; //累計 for (let month3 = month1; month3 < 16; month3++) { let month2; (month3 >= 13) ? month2 = month3 - 12 : month2 = month3; let tableId = (month2 + i + 40).toString().padStart(3, '0'); keikakuCumulative[tableId][0] += keikakuSum[0]; keikakuCumulative[tableId][1] += keikakuSum[1]; keikakuCumulative[tableId][3] += keikakuSum[3]; keikakuCumulative[tableId][4] += keikakuSum[4]; keikakuCumulative[tableId][5] += keikakuSum[5]; if (keikakuCumulative[tableId][1] > 0) { keikakuCumulative[tableId][2] = Math.floor(keikakuCumulative[tableId][5] / keikakuCumulative[tableId][4] * 10000) / 100; } else { keikakuCumulative[tableId][2] = 0; } jissekiCumulative[tableId][0] += jissekiSum[0]; jissekiCumulative[tableId][1] += jissekiSum[1]; jissekiCumulative[tableId][3] += jissekiSum[3]; jissekiCumulative[tableId][4] += jissekiSum[4]; jissekiCumulative[tableId][5] += jissekiSum[5]; if (jissekiCumulative[tableId][1] > 0) { jissekiCumulative[tableId][2] = Math.floor(jissekiCumulative[tableId][5] / jissekiCumulative[tableId][4] * 10000) / 100; } else { jissekiCumulative[tableId][2] = 0; } } //累計 計画 goukeiData[3][2] = keikakuCumulative[goukeiTableId][0]; //棟数 goukeiData[3][3] = keikakuCumulative[goukeiTableId][1]; //請負金額 goukeiData[3][4] = keikakuCumulative[goukeiTableId][2]; //利益率 goukeiData[3][5] = keikakuCumulative[goukeiTableId][3]; //利益額 //累計 実績 goukeiData[4][2] = jissekiCumulative[goukeiTableId][0]; //棟数 goukeiData[4][3] = jissekiCumulative[goukeiTableId][1]; //請負金額 goukeiData[4][4] = jissekiCumulative[goukeiTableId][2]; //利益率 goukeiData[4][5] = jissekiCumulative[goukeiTableId][3]; //利益額 //累計 差異 goukeiData[5][2] = jissekiCumulative[goukeiTableId][0] - keikakuCumulative[goukeiTableId][0]; goukeiData[5][3] = jissekiCumulative[goukeiTableId][1] - keikakuCumulative[goukeiTableId][1]; goukeiData[5][4] = jissekiCumulative[goukeiTableId][2] - keikakuCumulative[goukeiTableId][2]; goukeiData[5][5] = jissekiCumulative[goukeiTableId][3] - keikakuCumulative[goukeiTableId][3]; //達成率 if (keikakuCumulative[goukeiTableId][1] > 0 && jissekiCumulative[goukeiTableId][1] > 0) { goukeiData[1][6] = (Math.floor(jissekiCumulative[goukeiTableId][1] / keikakuCumulative[goukeiTableId][1] * 10000) / 100).toString() + '%'; } else { goukeiData[1][6] = '0%'; } if (keikakuCumulative[goukeiTableId][0] > 0 && jissekiCumulative[goukeiTableId][0] > 0) { goukeiData[4][6] = (Math.floor(jissekiCumulative[goukeiTableId][0] / keikakuCumulative[goukeiTableId][0] * 10000) / 100).toString() + '%'; } else { goukeiData[4][6] = '0%'; } goukeiTable[goukeiTableId].setData(goukeiData); $p.set($(goukeiDataArea), JSON.stringify(goukeiTable[goukeiTableId].getJson())); //goukeiテーブル見た目修正 $('#goukei_' + goukeiTableId + ' td[data-x="0"][data-y="0"]').attr('rowspan', 3); $('#goukei_' + goukeiTableId + ' td[data-x="0"][data-y="0"]').css({ 'vertical-align': 'middle', 'writing-mode': 'vertical-rl' }); $('#goukei_' + goukeiTableId + ' td[data-x="0"][data-y="1"]').hide(); $('#goukei_' + goukeiTableId + ' td[data-x="0"][data-y="2"]').hide(); $('#goukei_' + goukeiTableId + ' td[data-x="0"][data-y="3"]').attr('rowspan', 3); $('#goukei_' + goukeiTableId + ' td[data-x="0"][data-y="3"]').css({ 'vertical-align': 'middle', 'writing-mode': 'vertical-rl' }); $('#goukei_' + goukeiTableId + ' td[data-x="0"][data-y="4"]').hide(); $('#goukei_' + goukeiTableId + ' td[data-x="0"][data-y="5"]').hide(); $('#goukei_' + goukeiTableId + ' td[data-x="6"][data-y="1"]').attr('rowspan', 2); $('#goukei_' + goukeiTableId + ' td[data-x="6"][data-y="1"]').css({ 'font-size': '2.0em', 'font-weight': 'bold', 'vertical-align': 'middle', }); $('#goukei_' + goukeiTableId + ' td[data-x="6"][data-y="2"]').hide(); $('#goukei_' + goukeiTableId + ' td[data-x="6"][data-y="4"]').attr('rowspan', 2); $('#goukei_' + goukeiTableId + ' td[data-x="6"][data-y="4"]').css({ 'font-size': '2.0em', 'font-weight': 'bold', 'vertical-align': 'middle', }); $('#goukei_' + goukeiTableId + ' td[data-x="6"][data-y="5"]').hide(); $(function () { $('#goukei_' + goukeiTableId + ' td').each(function () { var test = $(this).text(); $(this).text(test.replace(/-/g, "▲")); }); }); } } } let eigyoGaiTable; function createEigyoGaiTable() { let tableId = 'X'; let dataArea = '#Results_Description' + tableId; //スプレッドシートベース let eigyoGaiTableEl = document.createElement('div'); eigyoGaiTableEl.classList.add('eigyoGaiTable'); eigyoGaiTableEl.id = 'eigyoGaiTable'; //保管エリアからデータ取得 let descData = $(dataArea).val(); let eigyouGaiData; if (descData) { eigyouGaiData = JSON.parse(descData); } else { eigyouGaiData = JSON.parse('[{"0":"営業外収益","1":"計画","2":"0","3":"0","4":"0","5":"0","6":"0","7":"0","8":"0","9":"0","10":"0","11":"0","12":"0","13":"0"},{"0":"0","1":"実績","2":"0","3":"0","4":"0","5":"0","6":"0","7":"0","8":"0","9":"0","10":"0","11":"0","12":"0","13":"0"},{"0":"営業外費用","1":"計画","2":"0","3":"0","4":"0","5":"0","6":"0","7":"0","8":"0","9":"0","10":"0","11":"0","12":"0","13":"0"},{"0":"0","1":"実績","2":"0","3":"0","4":"0","5":"0","6":"0","7":"0","8":"0","9":"0","10":"0","11":"0","12":"0","13":"0"}]'); } $(dataArea + 'Field').after(eigyoGaiTableEl); eigyoGaiTable = jspreadsheet(document.getElementById('eigyoGaiTable'), { data: eigyouGaiData, columns: [{ type: 'text', title: '#', width: 40, align: 'center', readOnly: true, }, { type: 'text', title: '項目', width: 40, align: 'center', readOnly: true, }, { type: 'number', title: '4月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '5月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '6月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '7月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '8月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '9月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '10月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '11月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '12月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '1月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '2月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '3月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }], allowInsertColumn: false, allowInsertRow: false, allowManualInsertRow: false, allowDeleteColumn: false, allowDeletingAllRows: false, columnSorting: false, columnResize: false, minSpareRows: 0, editable: editableFlag, contextMenu: false, onchange: function (el, cell, x, y, value, oldValue) { if (value == '') eigyoGaiTable.setValue(cell, '0', true); $p.set($('#Results_DescriptionX'), JSON.stringify(eigyoGaiTable.getJson())); } }); eigyoGaiTable.hideIndex(); $('#eigyoGaiTable td[data-x="0"][data-y="0"]').attr('rowspan', 2); $('#eigyoGaiTable td[data-x="0"][data-y="0"]').css({ 'vertical-align': 'middle', }); $('#eigyoGaiTable td[data-x="0"][data-y="1"]').hide(); $('#eigyoGaiTable td[data-x="0"][data-y="2"]').attr('rowspan', 2); $('#eigyoGaiTable td[data-x="0"][data-y="2"]').css({ 'vertical-align': 'middle', }); $('#eigyoGaiTable td[data-x="0"][data-y="3"]').hide(); let message = document.createElement('div'); message.innerText = '各月に発生した収益またはコストを入力する'; $(dataArea + 'Field').after(message); } let membersTable; function createMembersTable() { let tableId = 'Y'; let dataArea = '#Results_Description' + tableId; //スプレッドシートベース let membersTableEl = document.createElement('div'); membersTableEl.classList.add('membersTable'); membersTableEl.id = 'membersTable'; //保管エリアからデータ取得 let descData = $(dataArea).val(); let eigyouGaiData; if (descData) { eigyouGaiData = JSON.parse(descData); } else { eigyouGaiData = JSON.parse('[{"0":"人員増減","1":"所長","2":"0","3":"0","4":"0","5":"0","6":"0","7":"0","8":"0","9":"0","10":"0","11":"0","12":"0","13":"0"},{"0":"0","1":"営業A","2":"0","3":"0","4":"0","5":"0","6":"0","7":"0","8":"0","9":"0","10":"0","11":"0","12":"0","13":"0"},{"0":"0","1":"営業B","2":"0","3":"0","4":"0","5":"0","6":"0","7":"0","8":"0","9":"0","10":"0","11":"0","12":"0","13":"0"},{"0":"0","1":"営業C","2":"0","3":"0","4":"0","5":"0","6":"0","7":"0","8":"0","9":"0","10":"0","11":"0","12":"0","13":"0"},{"0":"0","1":"設計","2":"0","3":"0","4":"0","5":"0","6":"0","7":"0","8":"0","9":"0","10":"0","11":"0","12":"0","13":"0"},{"0":"0","1":"IC","2":"0","3":"0","4":"0","5":"0","6":"0","7":"0","8":"0","9":"0","10":"0","11":"0","12":"0","13":"0"},{"0":"0","1":"工務","2":"0","3":"0","4":"0","5":"0","6":"0","7":"0","8":"0","9":"0","10":"0","11":"0","12":"0","13":"0"},{"0":"0","1":"事務","2":"0","3":"0","4":"0","5":"0","6":"0","7":"0","8":"0","9":"0","10":"0","11":"0","12":"0","13":"0"},{"0":"0","1":"アシスタント","2":"0","3":"0","4":"0","5":"0","6":"0","7":"0","8":"0","9":"0","10":"0","11":"0","12":"0","13":"0"},{"0":"0","1":"パート","2":"0","3":"0","4":"0","5":"0","6":"0","7":"0","8":"0","9":"0","10":"0","11":"0","12":"0","13":"0"},{"0":"0","1":"アルバイト","2":"0","3":"0","4":"0","5":"0","6":"0","7":"0","8":"0","9":"0","10":"0","11":"0","12":"0","13":"0"},{"0":"0","1":"その他","2":"0","3":"0","4":"0","5":"0","6":"0","7":"0","8":"0","9":"0","10":"0","11":"0","12":"0","13":"0"}]'); } $(dataArea + 'Field').after(membersTableEl); membersTable = jspreadsheet(document.getElementById('membersTable'), { data: eigyouGaiData, columns: [{ type: 'text', title: '#', width: 40, align: 'center', readOnly: true, }, { type: 'text', title: '項目', width: 40, align: 'center', readOnly: true, }, { type: 'number', title: '4月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '5月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '6月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '7月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '8月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '9月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '10月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '11月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '12月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '1月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '2月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }, { type: 'number', title: '3月', width: 80, mask: '#,##0;[Red]#,##0', align: 'right', //readOnly: true, }], allowInsertColumn: false, allowInsertRow: false, allowManualInsertRow: false, allowDeleteColumn: false, allowDeletingAllRows: false, columnSorting: false, columnResize: false, minSpareRows: 0, editable: editableFlag, contextMenu: false, onchange: function (el, cell, x, y, value, oldValue) { if (value == '') membersTable.setValue(cell, '0', true); $p.set($('#Results_DescriptionY'), JSON.stringify(membersTable.getJson())); } }); membersTable.hideIndex(); $('#membersTable td[data-x="0"][data-y="0"]').attr('rowspan', 12); $('#membersTable td[data-x="0"][data-y="0"]').css({ 'vertical-align': 'middle', 'writing-mode': 'vertical-rl' }); $('#membersTable td[data-x="0"][data-y="1"]').hide(); $('#membersTable td[data-x="0"][data-y="2"]').hide(); $('#membersTable td[data-x="0"][data-y="3"]').hide(); $('#membersTable td[data-x="0"][data-y="4"]').hide(); $('#membersTable td[data-x="0"][data-y="5"]').hide(); $('#membersTable td[data-x="0"][data-y="6"]').hide(); $('#membersTable td[data-x="0"][data-y="7"]').hide(); $('#membersTable td[data-x="0"][data-y="8"]').hide(); $('#membersTable td[data-x="0"][data-y="9"]').hide(); $('#membersTable td[data-x="0"][data-y="10"]').hide(); $('#membersTable td[data-x="0"][data-y="11"]').hide(); let message = document.createElement('div'); message.innerText = '各月の人員の増減を入力する'; $(dataArea + 'Field').after(message); } $p.events.after_send_Update = function (args) { let status = $('#Results_Status').val(); if (status == '901') { summaryRecord(); } } function summaryRecord() { let classA = myData.ClassHash.ClassA; let classB = myData.ClassHash.ClassB; let classC = myData.ClassHash.ClassC; let classD = myData.ClassHash.ClassD; let classE = myData.ClassHash.ClassE; let classH = myData.ClassHash.ClassH; let classZ = myData.ClassHash.ClassZ; //キー //ClassA : エリア //ClassB : 営業所 //ClassC : 所長 //ClassD : 担当役員 //ClassE : 主要ブランド //ClassH : 大分類 //ClassK : ソート //ClassZ : 年度 //ClassY : 月 //ClassV : 分類 受注 着工 完成 //(当月)計画 //Num001 : 棟数 //Num002 : 請負金額 //Num003 : 利益率 //Num004 : 利益額 //(当月)実績 //Num011 : 棟数 //Num012 : 請負金額 //Num013 : 利益率 //Num014 : 利益額 //(累計)計画 //Num021 : 棟数 //Num022 : 請負金額 //Num023 : 利益率 //Num024 : 利益額 //(累計)実績 //Num031 : 棟数 //Num032 : 請負金額 //Num033 : 利益率 //Num034 : 利益額 for (i = 1; i <= 12; i++) { let sortKey; if (i >= 4) { sortKey = (i - 3).toString().padStart(3, '0'); } else { sortKey = (i + 9).toString().padStart(3, '0'); } let count = 1; for (j = 40; j <= 160; j += 60) { let tableId = (i + j).toString().padStart(3, '0'); let goukeiData = goukeiTable[tableId].getData(); let classHash = { 'ClassA': classA, 'ClassB': classB, 'ClassC': classC, 'ClassD': classD, 'ClassE': classE, 'ClassH': classH, 'ClassK': sortKey, 'ClassY': i, 'ClassV': count, 'ClassZ': classZ, } let numHash = { 'Num001': goukeiData[0][2], 'Num002': goukeiData[0][3], 'Num003': goukeiData[0][4], 'Num004': goukeiData[0][5], 'Num011': goukeiData[1][2], 'Num012': goukeiData[1][3], 'Num013': goukeiData[1][4], 'Num014': goukeiData[1][5], 'Num021': goukeiData[3][2], 'Num022': goukeiData[3][3], 'Num023': goukeiData[3][4], 'Num024': goukeiData[3][5], 'Num031': goukeiData[4][2], 'Num032': goukeiData[4][3], 'Num033': goukeiData[4][4], 'Num034': goukeiData[4][5], } let json = { 'ApiVersion': 1.1, 'ApiKey': apiKey, 'Keys': [ 'ClassA', 'ClassB', 'ClassV', 'ClassY', 'ClassZ', ], 'ClassHash': classHash, 'NumHash': numHash, }; upsertRecord(json); count++; } } } function upsertRecord(json) { let shukeiTable = '214922'; //集計情報を集計テーブルに保存・更新 //集計テーブル 214922 let url = 'https://' + location.hostname + '/pleasanter/api/items/' + shukeiTable + '/upsert'; $.ajax({ "type": "post", "url": url, "contentType": "application/json", "data": JSON.stringify(json), "success": function (data) { console.log(data); }, "error": function (data) { console.log(data); } }) } /* //項目を読み取り専用にするスクリプト //標準の読み取り専用チェックを入れると、値の参照や入れ込みのためのスクリプトに影響が出るため //純粋に操作不能にするのみのスクリプトを作成 //第1引数:カラム番号(例:ClassA,DateAなど) //第2引数:フォントカラー //第3引数:背景カラー //第4引数:文字の太さ(normal or bold) //第2引数以降は任意 //----------------------------------------------------------------------------------------------------------- $p.ex.columnReadOnly = function (col, color = '#000000', bgColor = '#f5f5f5', weight = 'normal') { //テーブルの種類を取得 let ref = $('#ReferenceType').val(); if (col) { //項目情報取得 let colName = ref + '_' + col; console.log(colName + ' ReadOnly'); //CSS定義 $('#' + colName).css({ 'pointer-events': 'none', 'color': color, 'background-color': bgColor, 'font-weight': weight, 'display': 'block' }); //タブ移動禁止 $('#' + colName).prop('tabindex', '-1'); //前要素がある場合、非表示処理 let prev = $('#' + colName).prev(); while (prev.length) { prev.css('display', 'none'); prev = prev.prev(); } //次要素がある場合、非表示処理 let next = $('#' + colName).next(); while (next.length) { next.css('display', 'none'); next = next.next(); } //ラベルクリック禁止・表示あり $('label[for="' + colName + '"').css({ 'pointer-events': 'none', 'display': 'block' }); //説明欄(テキストエリア)調整 //高さ300以上の場合は300固定 if ($('#' + colName).get(0).localName == 'textarea') { let height = $('#' + colName).get(0).scrollHeight; if (height > 300) height = 300; $('#' + colName).css({ 'overflow': 'hidden', 'height': height }); } } else { console.log('error'); } } */ $p.events.before_validate = function (args) { //処理内容 //保存前処理 //諸経費合計の保存 $p.ex.keihiSummary(); //スラッシュ削除 //数字からカンマとスペースと円マーク削除 for (i = 1; i <= 12; i++) { for (j = 0; j <= 120; j = j + 60) { let desc1 = (i + j).toString().padStart(3, '0'); let descData = JSON.parse($('#Results_Description' + desc1).val()); //console.log($('#Results_Description' + desc1).val()); for (x = 0; x < descData.length; x++) { descData[x]['2'] = descData[x]['2'] != '' ? descData[x]['2'].toString().replaceAll(/[,/]/g, '_') : ''; descData[x]['3'] = descData[x]['3'] != '' ? descData[x]['3'].toString().replaceAll(/[,/]/g, '_') : ''; descData[x]['7'] = descData[x]['7'] != '' ? descData[x]['7'].toString().replaceAll(/[,/]/g, '_') : ''; descData[x]['4'] = descData[x]['4'] != '' ? parseFloat(descData[x]['4'].toString().replaceAll(/[¥, ]/g, '')) : ''; descData[x]['5'] = descData[x]['5'] != '' ? parseFloat(descData[x]['5'].toString().replaceAll(/[¥, ]/g, '')) : ''; descData[x]['6'] = descData[x]['6'] != '' ? parseFloat(descData[x]['6'].toString().replaceAll(/[¥, ]/g, '')) : ''; } $p.set($('#Results_Description' + desc1), JSON.stringify(descData)); //console.log($('#Results_Description' + desc1).val()); } } } //諸経費合計計算 $p.ex.keihiSummary = function () { let num001 = parseFloat($('#Results_Num001').val().toString().replaceAll(/[¥,]/g, '')); //人件費 let num002 = parseFloat($('#Results_Num002').val().toString().replaceAll(/[¥,]/g, '')); //販売費 let num011 = parseFloat($('#Results_Num011').val().toString().replaceAll(/[¥,]/g, '')); //減価償却費 let num012 = parseFloat($('#Results_Num012').val().toString().replaceAll(/[¥,]/g, '')); //地代・家賃 let num013 = parseFloat($('#Results_Num013').val().toString().replaceAll(/[¥,]/g, '')); //その他経費 let num014 = parseFloat($('#Results_Num014').val().toString().replaceAll(/[¥,]/g, '')); //本社経費 let sum = num001 + num002 + num011 + num012 + num013 + num014; //諸経費合計の保存 $p.set($('#Results_Num015'), sum); } function updateAllRecord() { let apiKey = '6504c8a807677a3a576e10327f3c19876c55736ee45d4a845796b9e7f5e087bfd4bd0d8184863da8cf1733ca635111432ab334aea59102b06a96ee6d2c05190d'; //let tableId = '214737'//全部 let tableId = '214737' // $p.apiGet({ 'id': tableId, 'data': { 'ApiVersion': 1.1, 'ApiKey': apiKey, }, 'async': false, 'done': function (data) { //console.log(data.Response.Data); $.each(data.Response.Data, function (index, value) { let resultId = value.ResultId; for (i = 1; i <= 12; i++) { for (j = 0; j <= 120; j = j + 60) { let desc1 = (i + j).toString().padStart(3, '0'); if (value.DescriptionHash['Description' + desc1] != '') { let descData = JSON.parse(value.DescriptionHash['Description' + desc1]); //console.log(value.DescriptionHash['Description' + desc1]); for (x = 0; x < descData.length; x++) { descData[x]['2'] = descData[x]['2'] != '' ? descData[x]['2'].toString().replaceAll(/[,/]/g, '_') : ''; descData[x]['3'] = descData[x]['3'] != '' ? descData[x]['3'].toString().replaceAll(/[,/]/g, '_') : ''; descData[x]['7'] = descData[x]['7'] != '' ? descData[x]['7'].toString().replaceAll(/[,/]/g, '_') : ''; descData[x]['4'] = descData[x]['4'] != '' ? parseFloat(descData[x]['4'].toString().replaceAll(/[¥, ]/g, '')) : ''; descData[x]['5'] = descData[x]['5'] != '' ? parseFloat(descData[x]['5'].toString().replaceAll(/[¥, ]/g, '')) : ''; descData[x]['6'] = descData[x]['6'] != '' ? parseFloat(descData[x]['6'].toString().replaceAll(/[¥, ]/g, '')) : ''; } value.DescriptionHash['Description' + desc1] = JSON.stringify(descData); //console.log(value.DescriptionHash['Description' + desc1]); } else { //'[{"0": "1","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "2","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "3","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "4","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "5","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "6","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "7","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "8","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "9","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "10","1": "","2": "","3": "","4": "","5": "","6": "","7": ""}]' value.DescriptionHash['Description' + desc1] = '[{"0": "1","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "2","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "3","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "4","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "5","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "6","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "7","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "8","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "9","1": "","2": "","3": "","4": "","5": "","6": "","7": ""},{"0": "10","1": "","2": "","3": "","4": "","5": "","6": "","7": ""}]'; } } } //説明欄データ更新 $p.apiUpdate({ 'id': resultId, 'data': { 'ApiVersion': 1.1, 'ApiKey': apiKey, 'DescriptionHash': value.DescriptionHash, }, 'done': function (data) { //console.log(data); }, 'fail': function (data) { console.log(data); } }) }) }, 'fail': function (data) { console.log(data); } }); }