ken_nogi/pleasanter/develop/事業計画テーブル/事業計画テーブル.js
Kenichiro NOGI 48d993652f 20251006
2025-10-06 09:23:38 +09:00

1893 lines
68 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//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 = '&nbsp';
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":"","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);
}
});
}