diff --git a/pleasanter/develop/###neo999_templare/connectionSetting/next999.json b/pleasanter/develop/###neo999_templare/connectionSetting/next999.json new file mode 100644 index 00000000..aeb831e2 --- /dev/null +++ b/pleasanter/develop/###neo999_templare/connectionSetting/next999.json @@ -0,0 +1,4 @@ +{ + "apiKey": "c38903157cbffc30961f50bc29d0991a6cd8af495ab3009b05c5f98e82b2e61b94ba2d5c0a48fc518b1cd74c9e427b01051a228f670f3c5282544dfbec93db87", + "url": "https://neo999.next-hd.net/pleasanter/" +} \ No newline at end of file diff --git a/pleasanter/develop/##サーバー拡張関数など/connectionSetting/next999.json b/pleasanter/develop/##サーバー拡張関数など/connectionSetting/next999.json new file mode 100644 index 00000000..1be990f8 --- /dev/null +++ b/pleasanter/develop/##サーバー拡張関数など/connectionSetting/next999.json @@ -0,0 +1,4 @@ +{ + "apiKey": "870f99de74072e53f2637371bda5fc6e1313a85f1e2ac548419f71c5295beeb06809fef39eec98de14e7fce1faeade65625cc5dea3bf71964aa3c9ce6f048380", + "url": "https://neo999.next-hd.net/pleasanter/" +} \ No newline at end of file diff --git a/pleasanter/develop/##サーバー拡張関数など/extensions/sqls/DeleteResultsComments.json b/pleasanter/develop/##サーバー拡張関数など/extensions/sqls/DeleteResultsComments.json new file mode 100644 index 00000000..4350e252 --- /dev/null +++ b/pleasanter/develop/##サーバー拡張関数など/extensions/sqls/DeleteResultsComments.json @@ -0,0 +1,6 @@ +{ + "Name": "DeleteResultsComments", + "Description": "Resultsテーブルの指定されたレコードからコメントのデータを削除する", + "Api": true, + "ApiVersion": 1.1 +} \ No newline at end of file diff --git a/pleasanter/develop/##サーバー拡張関数など/extensions/sqls/DeleteResultsComments.sql b/pleasanter/develop/##サーバー拡張関数など/extensions/sqls/DeleteResultsComments.sql new file mode 100644 index 00000000..1f3a0c85 --- /dev/null +++ b/pleasanter/develop/##サーバー拡張関数など/extensions/sqls/DeleteResultsComments.sql @@ -0,0 +1,10 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@name :DeleteResultsComments +@description : +@disabled: false +*/ +UPDATE "Results" + SET "Comments" = @Comments + WHERE "ResultId" = @ResultId \ No newline at end of file diff --git a/pleasanter/develop/##サーバー拡張関数など/extensions/sqls/GetUserMailAddresses.json b/pleasanter/develop/##サーバー拡張関数など/extensions/sqls/GetUserMailAddresses.json new file mode 100644 index 00000000..1bc46deb --- /dev/null +++ b/pleasanter/develop/##サーバー拡張関数など/extensions/sqls/GetUserMailAddresses.json @@ -0,0 +1,6 @@ +{ + "Name": "GetUserMailAddresses", + "Description": "Get the mail addresses of the user.", + "Api": true, + "ApiVersion": 1.1 +} \ No newline at end of file diff --git a/pleasanter/develop/##サーバー拡張関数など/extensions/sqls/GetUserMailAddresses.sql b/pleasanter/develop/##サーバー拡張関数など/extensions/sqls/GetUserMailAddresses.sql new file mode 100644 index 00000000..dd360c7c --- /dev/null +++ b/pleasanter/develop/##サーバー拡張関数など/extensions/sqls/GetUserMailAddresses.sql @@ -0,0 +1,10 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@name :GetUserMailAddresses +@description : +@disabled: false +*/ + +SELECT "MailAddress" FROM "MailAddresses" +WHERE "OwnerId" = @OwnerId \ No newline at end of file diff --git a/pleasanter/develop/##サーバー拡張関数など/extensions/styles/ExtendedStyles.json.css b/pleasanter/develop/##サーバー拡張関数など/extensions/styles/ExtendedStyles.json.css new file mode 100644 index 00000000..df4c3c92 --- /dev/null +++ b/pleasanter/develop/##サーバー拡張関数など/extensions/styles/ExtendedStyles.json.css @@ -0,0 +1,231 @@ +/*#ViewSelectorField { + top: 0px; +} +*/ +/* +#BottomMargin::after { + content: " 右上のヘルプメニューに「目安箱」を設置しました。\A プリザンターに関する各種お問合せはそちらよりお寄せください。\A\A\A"; + font-size: 150%; + color: #4169e1; + white-space: pre; +}*/ + +.status-red { + color: white !important; + background: red !important; +} + +.status-blue { + color: white !important; + background: blue !important; +} + +.status-green { + color: white !important; + background: green !important; +} + +.status-yellow { + color: black !important; + background: yellow !important; +} + +.status-white { + color: black !important; + background: white !important; +} + +.status-grey { + color: white !important; + background: grey !important; +} + +.status-black { + color: white !important; + background: black !important; +} + +.status-purple { + color: white !important; + background: purple !important; +} + +.status-orange { + color: black !important; + background: orange !important; +} + +.status-pink { + color: black !important; + background: pink !important; +} + +.status-brown { + color: white !important; + background: brown !important; +} + +.status-big-red { + color: white !important; + background: red !important; + font-size: 150% !important; +} + +.status-big-blue { + color: white !important; + background: blue !important; + font-size: 150% !important; +} + +.status-big-green { + color: white !important; + background: green !important; + font-size: 150% !important; +} + +.status-big-yellow { + color: black !important; + background: yellow !important; + font-size: 150% !important; +} + +.status-big-white { + color: black !important; + background: white !important; + font-size: 150% !important; +} + +.status-big-grey { + color: white !important; + background: grey !important; + font-size: 150% !important; +} + +.status-big-black { + color: white !important; + background: black !important; + font-size: 150% !important; +} + +.status-big-purple { + color: white !important; + background: purple !important; + font-size: 150% !important; +} + +.status-big-orange { + color: black !important; + background: orange !important; + font-size: 150% !important; +} + +.status-big-pink { + color: black !important; + background: pink !important; + font-size: 150% !important; +} + +.status-big-brown { + color: white !important; + background: brown !important; + font-size: 150% !important; +} + + +div#PublishWarning { + background: blue; +} + +#Breadcrumb>li>a>span.label { + font-size: 200%; + font-weight: bold; +} + +#Breadcrumb>li>span { + font-size: 200%; + font-weight: bold; + margin: 0 3px 0 3px; +} + +/*コメント付記スタイル*/ +.commentAdd { + float: left; + margin-left: 121px; + font-weight: bold; + color: black; + + &.nowrap { + white-space: nowrap; + } + + &.big { + font-size: 1.3em; + } + + &.small { + font-size: 0.7em; + } + + &.right { + float: right; + } + + &.red { + color: red; + } + + &.blue { + color: blue; + } + + &.green { + color: green; + } + + &.grey { + color: grey; + } + + &.purple { + color: purple; + } + + &.skyblue { + color: skyblue; + } + + &.yellow { + color: yellow; + } +} + +/*フォントサイズ変更スタイル*/ +.fontSize60 { + font-size: 0.6em !important; + height: auto; +} + +.fontSize80 { + font-size: 0.8em !important; + height: auto; +} + +.fontSize120 { + font-size: 1.2em !important; + height: auto; +} + +.fontSize130 { + font-size: 1.3em !important; + height: auto; +} + +.fontSize150 { + font-size: 1.5em !important; + height: auto; +} + +.fontSize200 { + font-size: 2em !important; + height: auto; +} \ No newline at end of file diff --git a/pleasanter/develop/##サーバー拡張関数など/extensions/styles/new-status-color-big.css b/pleasanter/develop/##サーバー拡張関数など/extensions/styles/new-status-color-big.css new file mode 100644 index 00000000..dd6260c8 --- /dev/null +++ b/pleasanter/develop/##サーバー拡張関数など/extensions/styles/new-status-color-big.css @@ -0,0 +1,419 @@ +.new-status-big-red { + background: red !important; + background-color: red !important; + color: white !important; + font-size: 150% !important; +} + +.new-status-big-green { + background: green !important; + background-color: green !important; + color: white !important; + font-size: 150% !important; +} + +.new-status-big-blue { + background: blue !important; + background-color: blue !important; + color: white !important; + font-size: 150% !important; +} + +.new-status-big-yellow { + background: yellow !important; + background-color: yellow !important; + color: black !important; + font-size: 150% !important; +} + +.new-status-big-orange { + background: orange !important; + background-color: orange !important; + color: black !important; + font-size: 150% !important; +} + +.new-status-big-purple { + background: purple !important; + background-color: purple !important; + color: white !important; + font-size: 150% !important; +} + +.new-status-big-pink { + background: pink !important; + background-color: pink !important; + color: black !important; + font-size: 150% !important; +} + +.new-status-big-brown { + background: brown !important; + background-color: brown !important; + color: white !important; + font-size: 150% !important; +} + +.new-status-big-cyan { + background: cyan !important; + background-color: cyan !important; + color: black !important; + font-size: 150% !important; +} + +.new-status-big-magenta { + background: magenta !important; + background-color: magenta !important; + color: white !important; + font-size: 150% !important; +} + +.new-status-big-teal { + background: teal !important; + background-color: teal !important; + color: white !important; + font-size: 150% !important; +} + +.new-status-big-lime { + background: lime !important; + background-color: lime !important; + color: black !important; + font-size: 150% !important; +} + +.new-status-big-violet { + background: violet !important; + background-color: violet !important; + color: black !important; + font-size: 150% !important; +} + +.new-status-big-grey { + background: grey !important; + background-color: grey !important; + color: white !important; + font-size: 150% !important; +} + +.new-status-big-black { + background: black !important; + background-color: black !important; + color: white !important; + font-size: 150% !important; +} + +.new-status-big-white { + background: white !important; + background-color: white !important; + color: black !important; + font-size: 150% !important; +} + +.new-status-big-gold { + background: gold !important; + background-color: gold !important; + color: black !important; + font-size: 150% !important; +} + +.new-status-big-silver { + background: silver !important; + background-color: silver !important; + color: black !important; + font-size: 150% !important; +} + +.new-status-big-navy { + background: navy !important; + background-color: navy !important; + color: white !important; + font-size: 150% !important; +} + +.new-status-big-maroon { + background: maroon !important; + background-color: maroon !important; + color: white !important; + font-size: 150% !important; +} + +.new-status-big-olive { + background: olive !important; + background-color: olive !important; + color: black !important; + font-size: 150% !important; +} + +.new-status-big-aqua { + background: aqua !important; + background-color: aqua !important; + color: black !important; + font-size: 150% !important; +} + +.new-status-big-beige { + background: beige !important; + background-color: beige !important; + color: black !important; + font-size: 150% !important; +} + +.new-status-big-chocolate { + background: chocolate !important; + background-color: chocolate !important; + color: white !important; + font-size: 150% !important; +} + +.new-status-big-coral { + background: coral !important; + background-color: coral !important; + color: black !important; + font-size: 150% !important; +} + +.new-status-big-crimson { + background: crimson !important; + background-color: crimson !important; + color: white !important; + font-size: 150% !important; +} + +.new-status-big-indigo { + background: indigo !important; + background-color: indigo !important; + color: white !important; + font-size: 150% !important; +} + +.new-status-big-ivory { + background: ivory !important; + background-color: ivory !important; + color: black !important; + font-size: 150% !important; +} + +.new-status-big-khaki { + background: khaki !important; + background-color: khaki !important; + color: black !important; + font-size: 150% !important; +} + +.new-status-big-plum { + background: plum !important; + background-color: plum !important; + color: black !important; + font-size: 150% !important; +} + +.new-status-big-light-red { + background: lightcoral; + background-color: lightcoral; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-green { + background: lightgreen; + background-color: lightgreen; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-blue { + background: lightblue; + background-color: lightblue; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-yellow { + background: lightyellow; + background-color: lightyellow; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-orange { + background: lightsalmon; + background-color: lightsalmon; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-purple { + background: lavender; + background-color: lavender; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-pink { + background: lightpink; + background-color: lightpink; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-brown { + background: burlywood; + background-color: burlywood; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-cyan { + background: paleturquoise; + background-color: paleturquoise; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-magenta { + background: orchid; + background-color: orchid; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-teal { + background: mediumaquamarine; + background-color: mediumaquamarine; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-lime { + background: yellowgreen; + background-color: yellowgreen; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-violet { + background: thistle; + background-color: thistle; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-grey { + background: gainsboro; + background-color: gainsboro; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-black { + background: darkgray; + background-color: darkgray; + color: white; + font-size: 150% !important; +} + +.new-status-big-light-white { + background: whitesmoke; + background-color: whitesmoke; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-gold { + background: palegoldenrod; + background-color: palegoldenrod; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-silver { + background: lightgray; + background-color: lightgray; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-navy { + background: slategray; + background-color: slategray; + color: white; + font-size: 150% !important; +} + +.new-status-big-light-maroon { + background: rosybrown; + background-color: rosybrown; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-olive { + background: darkkhaki; + background-color: darkkhaki; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-aqua { + background: aquamarine; + background-color: aquamarine; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-beige { + background: moccasin; + background-color: moccasin; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-chocolate { + background: peru; + background-color: peru; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-coral { + background: peachpuff; + background-color: peachpuff; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-crimson { + background: indianred; + background-color: indianred; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-indigo { + background: mediumpurple; + background-color: mediumpurple; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-ivory { + background: ivory; + background-color: ivory; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-khaki { + background: lightgoldenrodyellow; + background-color: lightgoldenrodyellow; + color: black; + font-size: 150% !important; +} + +.new-status-big-light-plum { + background: plum; + background-color: plum; + color: black; + font-size: 150% !important; +} \ No newline at end of file diff --git a/pleasanter/develop/##サーバー拡張関数など/extensions/styles/new-status-color.css b/pleasanter/develop/##サーバー拡張関数など/extensions/styles/new-status-color.css new file mode 100644 index 00000000..8b3fd77a --- /dev/null +++ b/pleasanter/develop/##サーバー拡張関数など/extensions/styles/new-status-color.css @@ -0,0 +1,359 @@ +.new-status-red { + background: red !important; + background-color: red !important; + color: white !important; +} + +.new-status-green { + background: green !important; + background-color: green !important; + color: white !important; +} + +.new-status-blue { + background: blue !important; + background-color: blue !important; + color: white !important; +} + +.new-status-yellow { + background: yellow !important; + background-color: yellow !important; + color: black !important; +} + +.new-status-orange { + background: orange !important; + background-color: orange !important; + color: black !important; +} + +.new-status-purple { + background: purple !important; + background-color: purple !important; + color: white !important; +} + +.new-status-pink { + background: pink !important; + background-color: pink !important; + color: black !important; +} + +.new-status-brown { + background: brown !important; + background-color: brown !important; + color: white !important; +} + +.new-status-cyan { + background: cyan !important; + background-color: cyan !important; + color: black !important; +} + +.new-status-magenta { + background: magenta !important; + background-color: magenta !important; + color: white !important; +} + +.new-status-teal { + background: teal !important; + background-color: teal !important; + color: white !important; +} + +.new-status-lime { + background: lime !important; + background-color: lime !important; + color: black !important; +} + +.new-status-violet { + background: violet !important; + background-color: violet !important; + color: black !important; +} + +.new-status-grey { + background: grey !important; + background-color: grey !important; + color: white !important; +} + +.new-status-black { + background: black !important; + background-color: black !important; + color: white !important; +} + +.new-status-white { + background: white !important; + background-color: white !important; + color: black !important; +} + +.new-status-gold { + background: gold !important; + background-color: gold !important; + color: black !important; +} + +.new-status-silver { + background: silver !important; + background-color: silver !important; + color: black !important; +} + +.new-status-navy { + background: navy !important; + background-color: navy !important; + color: white !important; +} + +.new-status-maroon { + background: maroon !important; + background-color: maroon !important; + color: white !important; +} + +.new-status-olive { + background: olive !important; + background-color: olive !important; + color: black !important; +} + +.new-status-aqua { + background: aqua !important; + background-color: aqua !important; + color: black !important; +} + +.new-status-beige { + background: beige !important; + background-color: beige !important; + color: black !important; +} + +.new-status-chocolate { + background: chocolate !important; + background-color: chocolate !important; + color: white !important; +} + +.new-status-coral { + background: coral !important; + background-color: coral !important; + color: black !important; +} + +.new-status-crimson { + background: crimson !important; + background-color: crimson !important; + color: white !important; +} + +.new-status-indigo { + background: indigo !important; + background-color: indigo !important; + color: white !important; +} + +.new-status-ivory { + background: ivory !important; + background-color: ivory !important; + color: black !important; +} + +.new-status-khaki { + background: khaki !important; + background-color: khaki !important; + color: black !important; +} + +.new-status-plum { + background: plum !important; + background-color: plum !important; + color: black !important; +} + +.new-status-light-red { + background: lightcoral; + background-color: lightcoral; + color: black; +} + +.new-status-light-green { + background: lightgreen; + background-color: lightgreen; + color: black; +} + +.new-status-light-blue { + background: lightblue; + background-color: lightblue; + color: black; +} + +.new-status-light-yellow { + background: lightyellow; + background-color: lightyellow; + color: black; +} + +.new-status-light-orange { + background: lightsalmon; + background-color: lightsalmon; + color: black; +} + +.new-status-light-purple { + background: lavender; + background-color: lavender; + color: black; +} + +.new-status-light-pink { + background: lightpink; + background-color: lightpink; + color: black; +} + +.new-status-light-brown { + background: burlywood; + background-color: burlywood; + color: black; +} + +.new-status-light-cyan { + background: paleturquoise; + background-color: paleturquoise; + color: black; +} + +.new-status-light-magenta { + background: orchid; + background-color: orchid; + color: black; +} + +.new-status-light-teal { + background: mediumaquamarine; + background-color: mediumaquamarine; + color: black; +} + +.new-status-light-lime { + background: yellowgreen; + background-color: yellowgreen; + color: black; +} + +.new-status-light-violet { + background: thistle; + background-color: thistle; + color: black; +} + +.new-status-light-grey { + background: gainsboro; + background-color: gainsboro; + color: black; +} + +.new-status-light-black { + background: darkgray; + background-color: darkgray; + color: white; +} + +.new-status-light-white { + background: whitesmoke; + background-color: whitesmoke; + color: black; +} + +.new-status-light-gold { + background: palegoldenrod; + background-color: palegoldenrod; + color: black; +} + +.new-status-light-silver { + background: lightgray; + background-color: lightgray; + color: black; +} + +.new-status-light-navy { + background: slategray; + background-color: slategray; + color: white; +} + +.new-status-light-maroon { + background: rosybrown; + background-color: rosybrown; + color: black; +} + +.new-status-light-olive { + background: darkkhaki; + background-color: darkkhaki; + color: black; +} + +.new-status-light-aqua { + background: aquamarine; + background-color: aquamarine; + color: black; +} + +.new-status-light-beige { + background: moccasin; + background-color: moccasin; + color: black; +} + +.new-status-light-chocolate { + background: peru; + background-color: peru; + color: black; +} + +.new-status-light-coral { + background: peachpuff; + background-color: peachpuff; + color: black; +} + +.new-status-light-crimson { + background: indianred; + background-color: indianred; + color: black; +} + +.new-status-light-indigo { + background: mediumpurple; + background-color: mediumpurple; + color: black; +} + +.new-status-light-ivory { + background: ivory; + background-color: ivory; + color: black; +} + +.new-status-light-khaki { + background: lightgoldenrodyellow; + background-color: lightgoldenrodyellow; + color: black; +} + +.new-status-light-plum { + background: plum; + background-color: plum; + color: black; +} \ No newline at end of file diff --git a/pleasanter/develop/##サーバー拡張関数など/sites/scripts/setMyMessage.js b/pleasanter/develop/##サーバー拡張関数など/sites/scripts/setMyMessage.js new file mode 100644 index 00000000..a7f2d529 --- /dev/null +++ b/pleasanter/develop/##サーバー拡張関数など/sites/scripts/setMyMessage.js @@ -0,0 +1,11 @@ +//bZ[Wlj\ +$p.ex.setMyMessage = function (cssColor = 'alert-success', message, clear = 1) { + //NAw肳Ă玖OɃbZ[W + clear && $p.clearMessage(); + + $p.setMessage('#Message', JSON.stringify({ + Css: 'alert-success ' + cssColor, + Text: message + })); + +} diff --git a/pleasanter/develop/##サーバー拡張関数など/sites/serverscripts/deleteComments.js b/pleasanter/develop/##サーバー拡張関数など/sites/serverscripts/deleteComments.js new file mode 100644 index 00000000..0850e279 --- /dev/null +++ b/pleasanter/develop/##サーバー拡張関数など/sites/serverscripts/deleteComments.js @@ -0,0 +1,23 @@ +//コメントのリストを取得し1つずつ表示する +try { + let resultId = model.ResultId; + let comments = model.Comments; + let commentArray = JSON.parse(comments); + + context.Log(('ResultId: ' + resultId)); + + for (let comment of commentArray.slice(0, 5)) { + context.Log(JSON.stringify(comment)); + } + + let newComments = JSON.stringify(commentArray.slice(0, 5)); + let json = { + "Comments": newComments, + "ResultId": resultId + } + extendedSql.ExecuteTable('DeleteResultsComments', JSON.stringify(json)); + +} catch (error) { + context.Log(('エラーが発生しました: ' + error.message)); +} + diff --git a/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/connectionSetting/next999.json b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/connectionSetting/next999.json new file mode 100644 index 00000000..aeb831e2 --- /dev/null +++ b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/connectionSetting/next999.json @@ -0,0 +1,4 @@ +{ + "apiKey": "c38903157cbffc30961f50bc29d0991a6cd8af495ab3009b05c5f98e82b2e61b94ba2d5c0a48fc518b1cd74c9e427b01051a228f670f3c5282544dfbec93db87", + "url": "https://neo999.next-hd.net/pleasanter/" +} \ No newline at end of file diff --git a/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/sites/scripts/1.シフト情報保存.js b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/sites/scripts/1.シフト情報保存.js new file mode 100644 index 00000000..9df94a5f --- /dev/null +++ b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/sites/scripts/1.シフト情報保存.js @@ -0,0 +1,140 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 1.シフト情報保存 +@name : 1.シフト情報保存 +@siteIds : 310514 +@siteTitles : イオン多摩平シフト希望 +@disabled: false +*/ + +$p.events.on_editor_load = function () { + + + if ($p.action() == 'new') { + let now = new Date(); + let nextMonth = new Date(now.getFullYear(), now.getMonth() + 1, 1); + let yyyy = nextMonth.getFullYear(); + let mm = String(nextMonth.getMonth() + 1).padStart(2, '0'); + let ymStr = `${yyyy}年${mm}月`; + $p.set($('#Results_ClassA'), ymStr); + } + + //任意の処理 + setupCalendar(); +} + + + +//保存前野処理 +$p.events.before_validate = function (args) { + + //曜日判定 + let week = ['月', '火', '水', '木', '金', '土', '日']; + if ($('#Results_ClassC').val().includes('すべて可')) { + $p.set($('#Results_ClassC'), JSON.stringify('["すべて可"]')); + } else if (isSubset($('#Results_ClassC').val(), week)) { + $p.set($('#Results_ClassC'), JSON.stringify('["すべて可"]')); + } else if ($('#Results_ClassC').val().length === 0) { + $p.set($('#Results_ClassC'), JSON.stringify('["すべて可"]')); + } + + /* + //最低勤務時間 + if ($('#Results_NumA').val() == '0') { + $p.set($('#Results_ClassG'), "月あたり最低勤務時間:指定無し"); + } else { + $p.set($('#Results_ClassG'), "月あたり最低勤務時間:" + $('#Results_NumA').val() + "時間"); + } + + //最大勤務時間 + if ($('#Results_NumB').val() == '0') { + $p.set($('#Results_ClassH'), "月あたり最大勤務時間:指定無し"); + } else { + $p.set($('#Results_ClassH'), "月あたり最大勤務時間:" + $('#Results_NumB').val() + "時間"); + } + */ + + //曜日 + let classCStr = "希望曜日:" + $('#Results_ClassC').val().join(','); + + //時間帯 + let classD1 = $('#Results_ClassD').val(); + let classD2; + let classDStr; + + if (classD1.includes('いつでも')) { + $p.set($('#Results_ClassD'), JSON.stringify('["いつでも"]')); + classDStr = "時間:いつでも"; + } else if (classD1.length === 0) { + $p.set($('#Results_ClassD'), JSON.stringify('["いつでも"]')); + classDStr = "時間:いつでも"; + } else { + classD2 = convertToNumbers(classD1); + classDStr = "時間:" + formatRanges(classD2); + } + + //カレンダーチェック内容保存 + let checked = getCheckedDates(); + $p.set($('#Results_ClassW'), JSON.stringify(checked)); + + + //個別指定 + let classWArray = checked.map(date => Number(date.split('-')[2])); + let classWStr = "個別希望日:" + classWArray.join(','); + + $p.set($('#Results_ClassE'), classWArray.join(', ')); + + if (classWArray.length === 0) { + classWStr = "個別希望日:なし"; + } + + let list = []; + if (classCStr) list.push(classCStr); + if (classDStr) list.push(classDStr); + if (classWStr) list.push(classWStr); + + let classZStr = list.join('/'); + + //希望シフトの内容をすべて連結して保存 + $p.set($('#Results_ClassZ'), classZStr); + + //年月を保存 + $p.set($('#Results_ClassY'), $('#Results_ClassA').val()); + + //名前を保存 + $p.set($('#Results_ClassX'), $('#Results_ClassB option:selected').text()); + +} + +//配列ABを比較 +function isSubset(A, B) { + return B.every(value => A.includes(value)); +} + +//数字範囲を省略して返却 +function formatRanges(arr) { + arr.sort((a, b) => a - b); //配列を昇順にソート + let result = []; + let start = arr[0], end = arr[0]; + + for (let i = 1; i < arr.length; i++) { + if (arr[i] === end + 1) { + //連続する数値の場合、範囲を拡張 + end = arr[i]; + } else { + //連続が途切れたら結果に追加し、新しい範囲を開始 + result.push(start === end ? `${start}` : `${start}-${end}時`); + start = end = arr[i]; + } + } + + //最後の範囲を追加 + result.push(start === end ? `${start}` : `${start}-${end}時`); + return result.join(","); +} + +//配列の中身をすべて数値に置き換える +function convertToNumbers(arr) { + return arr.map(value => Number(value)); +} diff --git a/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/sites/scripts/2.カレンダー表示.js b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/sites/scripts/2.カレンダー表示.js new file mode 100644 index 00000000..20b9a21e --- /dev/null +++ b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/sites/scripts/2.カレンダー表示.js @@ -0,0 +1,289 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 2.カレンダー表示 +@name : 2.カレンダー表示 +@siteIds : 310514 +@siteTitles : イオン多摩平シフト希望 +@disabled: false +*/ + +//カレンダーを生成して挿入する関数 +function renderCalendar(year, month, checkedDates = [], selectedHoursArray = []) { + $('#custom-calendar-container').remove(); + + let containerHtml = `
`; // メインコンテナ + + let calendarAndControlsFlexContainer = `
`; // カレンダーと操作ボタンのFlexコンテナ + + // カレンダー本体 + let calendarTableHtml = `
+ + `; + + let firstDay = new Date(year, month - 1, 1); + let lastDay = new Date(year, month, 0); + for (let i = 0; i < firstDay.getDay(); i++) calendarTableHtml += ""; + + for (let d = 1; d <= lastDay.getDate(); d++) { + let dateObj = new Date(year, month - 1, d); + let dayOfWeek = dateObj.getDay(); + let dateStr = `${year}-${String(month).padStart(2, '0')}-${String(d).padStart(2, '0')}`; + let checked = checkedDates.includes(dateStr) ? 'checked' : ''; + calendarTableHtml += ``; + if ((firstDay.getDay() + d) % 7 === 0 && d !== lastDay.getDate()) calendarTableHtml += ""; + } + + let lastDayOfWeek = new Date(year, month - 1, lastDay.getDate()).getDay(); + for (let i = lastDayOfWeek + 1; i <= 6; i++) calendarTableHtml += ""; + calendarTableHtml += "
"; // カレンダーテーブルの閉じタグ + calendarAndControlsFlexContainer += calendarTableHtml; + + + // 操作コントロール(ボタンとタイムバー)のコンテナ + let controlsContainerHtml = `
`; + + // 一括操作ボタン + controlsContainerHtml += ` +
+ + +
`; + + // 曜日ボタン + controlsContainerHtml += `
+ + + + + + + +
`; + + // 時間選択バー + controlsContainerHtml += ` +
+ +
`; + for (let hour = 10; hour <= 21; hour++) { + controlsContainerHtml += `
${hour}
`; + } + controlsContainerHtml += `
+

選択された時間: なし

+
+ `; + controlsContainerHtml += `
`; // controls-container の閉じタグ + calendarAndControlsFlexContainer += controlsContainerHtml; + calendarAndControlsFlexContainer += `
`; // custom-calendar (Flexコンテナ) の閉じタグ + containerHtml += calendarAndControlsFlexContainer; + containerHtml += "
"; // custom-calendar-container の閉じタグ + + $('#SectionFields1Container').after(containerHtml); + + // ボタンイベント (変更なし) + $('#calendar-check-all').off('click').on('click', function () { + $('#custom-calendar .calendar-checkbox').prop('checked', true); + }); + $('#calendar-uncheck-all').off('click').on('click', function () { + $('#custom-calendar .calendar-checkbox').prop('checked', false); + }); + + let dayToggleState = { 0: false, 1: false, 2: false, 3: false, 4: false, 5: false, 6: false }; + + $('.calendar-day-toggle').off('click').on('click', function () { + const day = $(this).data('day'); + dayToggleState[day] = !dayToggleState[day]; + $('#custom-calendar .calendar-checkbox[data-day="' + day + '"]').prop('checked', dayToggleState[day]); + if (dayToggleState[day]) { + $(this).css('background', '#0078d7').css('color', '#fff'); + } else { + $(this).css('background', '').css('color', ''); + } + }); + + // 時間選択バーのロジック (変更なし) + const timeSlots = $('.time-slot'); + const selectedHoursDisplay = $('#selected-hours-display'); + let isDragging = false; + let selectionStartHour = -1; + let selectionEndHour = -1; + + if (selectedHoursArray && selectedHoursArray.length > 0) { + if (selectedHoursArray.length >= 1) { + selectionStartHour = Math.min(...selectedHoursArray); + selectionEndHour = Math.max(...selectedHoursArray); + updateSelectionVisuals(); + if (selectedHoursArray.length >= 2) { + selectedHoursDisplay.text(selectedHoursArray.sort((a, b) => a - b).join(',')); + } else { + selectedHoursDisplay.text('最低2時間選択してください'); + } + } + } + + timeSlots.on('mousedown touchstart', function (e) { // touchstart を追加 + e.preventDefault(); + isDragging = true; + const currentHour = parseInt($(this).data('hour')); + selectionStartHour = currentHour; + selectionEndHour = currentHour; + updateSelectionVisuals(); + }); + + timeSlots.on('mousemove touchmove', function (e) { // touchmove を追加 + if (isDragging) { + let pageX; + if (e.type === 'touchmove') { + pageX = e.originalEvent.touches[0].pageX; + } else { + pageX = e.pageX; + } + // マウス/タッチ位置から最も近いスロットを見つける + let closestSlot = null; + let minDistance = Infinity; + timeSlots.each(function () { + const slot = $(this); + const slotCenterX = slot.offset().left + slot.width() / 2; + const distance = Math.abs(pageX - slotCenterX); + if (distance < minDistance) { + minDistance = distance; + closestSlot = slot; + } + }); + if (closestSlot) { + const currentHour = parseInt(closestSlot.data('hour')); + selectionEndHour = currentHour; + updateSelectionVisuals(); + } + } + }); + + $(document).on('mouseup touchend', function () { // touchend を追加 + if (isDragging) { + isDragging = false; + const start = Math.min(selectionStartHour, selectionEndHour); + const end = Math.max(selectionStartHour, selectionEndHour); + const selectedCount = (start !== -1 && end !== -1) ? (end - start + 1) : 0; + + if (selectedCount < 2 && selectedCount > 0) { + $p.ex.setMyMessage('alert-error new-status-red', '開始時間と終了時間を選択してください'); + timeSlots.css('background-color', ''); + selectedHoursDisplay.text('なし'); + $p.set($('#Results_ClassD'), JSON.stringify([])); + selectionStartHour = -1; + selectionEndHour = -1; + } else if (selectedCount >= 2) { + $p.clearMessage(); + saveSelectedHoursToField(); + } else { + $p.clearMessage(); + timeSlots.css('background-color', ''); + selectedHoursDisplay.text('なし'); + $p.set($('#Results_ClassD'), JSON.stringify([])); + selectionStartHour = -1; + selectionEndHour = -1; + } + } + }); + + function updateSelectionVisuals() { + timeSlots.css('background-color', ''); + const start = Math.min(selectionStartHour, selectionEndHour); + const end = Math.max(selectionStartHour, selectionEndHour); + + if (start !== -1 && end !== -1) { + for (let i = start; i <= end; i++) { + $(`.time-slot[data-hour="${i}"]`).css('background-color', '#a0c4ff'); + } + } + } + + function saveSelectedHoursToField() { + const selected = []; + if (selectionStartHour !== -1 && selectionEndHour !== -1) { + const start = Math.min(selectionStartHour, selectionEndHour); + const end = Math.max(selectionStartHour, selectionEndHour); + if ((end - start + 1) >= 2) { + for (let i = start; i <= end; i++) { + selected.push(i.toString()); + } + + selectedHoursDisplay.text(selected.join(',') || 'なし'); + + $p.set($('#Results_ClassD'), JSON.stringify(selected)); + console.log('Selected hours saved to Results_ClassD:', JSON.stringify(selected)); + } else { + selectedHoursDisplay.text('開始時間と終了時間を選択してください'); + $p.set($('#Results_ClassD'), JSON.stringify([])); + console.log('Selection less than 2 hours, not saved.'); + } + } else { + selectedHoursDisplay.text('なし'); + $p.set($('#Results_ClassD'), JSON.stringify([])); + } + } +} + +//チェックされた日付を取得する関数 (変更なし) +function getCheckedDates() { + return $('.calendar-checkbox:checked').map(function () { + return this.value; + }).get(); +} + +//選択された時間を取得する関数 (Results_ClassDから読み込む) +function getSelectedHours() { + const classD = $('#Results_ClassD').val(); + let hoursArray = []; + if (classD[0] === 'いつでも') { + hoursArray = [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]; + } else { + for (let i = 0; i < classD.length; i++) { + hoursArray.push(parseFloat(classD[i])); + } + + } + + return hoursArray; +} + +/* + + console.log(hoursString); + if (hoursString) { + try { + const parsedHours = JSON.parse(hoursString); + if (Array.isArray(parsedHours) && parsedHours.every(h => typeof h === 'number')) { + return parsedHours; + } + } catch (e) { + console.error("Error parsing selected hours from Results_ClassD:", e); + if (typeof hoursString === 'string' && hoursString.includes(',')) { + return hoursString.split(',').map(h => parseInt(h.trim(), 10)).filter(h => !isNaN(h)); + } + } + } + return []; +} +*/ + +//年月選択UIとイベント (変更なし) +function setupCalendarUI(initialYear, initialMonth, checkedDates = [], initialSelectedHoursArray = []) { + renderCalendar(initialYear, initialMonth, checkedDates, initialSelectedHoursArray); + + $p.on('change', 'ClassA', function () { + let y = parseFloat($('#Results_ClassA').val().split('年')[0]); + let m = parseFloat($('#Results_ClassA').val().split('年')[1].split('月')[0]); + renderCalendar(y, m, getCheckedDates(), getSelectedHours()); + }); +} + +function setupCalendar() { + let initialYear = parseFloat($('#Results_ClassA').val().split('年')[0]); + let initialMonth = parseFloat($('#Results_ClassA').val().split('年')[1].split('月')[0]); + let initialCheckedDates = $('#Results_ClassW').val() ? JSON.parse($('#Results_ClassW').val()) : []; + let initialSelectedHoursArray = getSelectedHours(); + + setupCalendarUI(initialYear, initialMonth, initialCheckedDates, initialSelectedHoursArray); +} \ No newline at end of file diff --git a/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/sites/scripts/カレンダー.html b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/sites/scripts/カレンダー.html new file mode 100644 index 00000000..1fd9746d --- /dev/null +++ b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/sites/scripts/カレンダー.html @@ -0,0 +1,89 @@ + + + + + + カレンダー選択(jQuery版) + + + + + +

指定した月のカレンダー

+ + + + + +
+ +

+ + + + + \ No newline at end of file diff --git a/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/sites/serverscripts/選択年月リスト作成.js b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/sites/serverscripts/選択年月リスト作成.js new file mode 100644 index 00000000..7eb61b6f --- /dev/null +++ b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/sites/serverscripts/選択年月リスト作成.js @@ -0,0 +1,26 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 選択年月リスト作成 +@name : 選択年月リスト作成 +@siteIds : 310514 +@siteTitles : イオン多摩平シフト希望 +@disabled: false +*/ + +try { + //年月を当月から3ヶ月後まで自動表示 + let now = new Date(); + for (let i = 0; i < 3; i++) { + let date = new Date(now.getFullYear(), now.getMonth() + i, 1); + let year = date.getFullYear(); + let month = (date.getMonth() + 1).toString().padStart(2, '0'); + let ym = year + '年' + month + '月'; + columns.ClassA.AddChoiceHash(ym, ym); + + } + +} catch (e) { + context.Log(e.stack); +} + diff --git a/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/sites/styles/1.基本スタイル.css b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/sites/styles/1.基本スタイル.css new file mode 100644 index 00000000..0ae1c594 --- /dev/null +++ b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/sites/styles/1.基本スタイル.css @@ -0,0 +1,40 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 1.基本スタイル +@name : 1.基本スタイル +@siteIds : 310514 +@siteTitles : イオン多摩平シフト希望 +@disabled: false +*/ + +label.error { + pointer-events: none; + z-index: 100; +} + +.code-readonly { + pointer-events: none; + background-color: lightgrey; + font-weight: bold; +} + +.code-readonly2, +.code-readonly2+button, +.code-readonly2+div.ui-icon { + pointer-events: none; + font-weight: bold; +} + +.code-readonly2 select, +.code-readonly2 input, +.code-readonly2 button.ui-multiselect, +.code-readonly2 .control-markup, +span[data-readonly="1"] { + border: dashed 1px black !important; +} + +select[data-validate-required="1"], +input[data-validate-required="1"] { + border: dashed 1px red !important; +} \ No newline at end of file diff --git a/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/sites/styles/2.カレンダースタイル.css b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/sites/styles/2.カレンダースタイル.css new file mode 100644 index 00000000..c7fa57ba --- /dev/null +++ b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト希望/sites/styles/2.カレンダースタイル.css @@ -0,0 +1,183 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 2.カレンダースタイル +@name : 2.カレンダースタイル +@siteIds : 310514 +@siteTitles : イオン多摩平シフト希望 +@disabled: false +*/ + +/* グローバルコンテナ */ +#custom-calendar-container { + display: flex; + flex-direction: column; + width: 100%; +} + +/* カレンダーとコントロールのコンテナ */ +#custom-calendar { + display: flex; + flex-direction: column; + /* スマホ表示では縦並び */ + align-items: stretch; + /* 幅を合わせる */ + width: 100%; + background: #fff; + padding: 10px; + border-radius: 6px; + margin-bottom: 10px; + margin-left: 0 !important; + /* 初期値として左マージンをリセット */ +} + +/* カレンダーテーブルの直接の親div */ +#custom-calendar>div:first-child { + overflow-x: auto; + /* テーブルがはみ出る場合はスクロール */ + width: 100%; + margin-bottom: 15px; + /* ボタンとの間隔 */ +} + +/* テーブル全体 */ +#custom-calendar table { + border-collapse: collapse; + width: 100%; + background: #fff; + min-width: 300px; + /* 最小幅を設定 */ +} + +/* テーブルヘッダーとセル共通 */ +#custom-calendar th, +#custom-calendar td { + border: 1px solid #ccc; + text-align: center; + vertical-align: middle; + height: 40px; + /* 基本の高さを維持 */ + width: auto; + /* 幅は自動調整、または特定の列で指定 */ + padding: 5px; + /* 少しパディングを調整 */ + font-size: 1.2em; + /* フォントサイズを少し大きく */ +} + +/* 曜日行 */ +#custom-calendar thead th { + background: #f0f0f0; + color: #333; +} + +/* 日曜日 */ +#custom-calendar thead th:first-child, +#custom-calendar tbody td:nth-child(1) { + background: #e0f0ff; + color: #0070c0; +} + +/* 土曜日 */ +#custom-calendar thead th:last-child, +#custom-calendar tbody td:nth-child(7) { + background: #fff4e0; + color: #ff8000; +} + +/* チェックボックスと日付のラベル */ +#custom-calendar label { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + width: 100%; + cursor: pointer; +} + +/* タップしやすくするために td 内の label を block にする */ +#custom-calendar td label { + display: block; +} + + +/* 操作コントロール(ボタンとタイムバー)のコンテナ */ +.controls-container { + display: flex; + flex-direction: column; + gap: 15px; + width: 100%; + margin-left: 0 !important; + /* 初期値として左マージンをリセット */ +} + +/* 曜日ボタングループ */ +.day-toggle-buttons { + display: flex; + flex-wrap: wrap; + gap: 5px; + justify-content: center; + /* スマホ表示では中央揃え */ +} + +/* 曜日ボタン個別 */ +.calendar-day-toggle { + padding: 6px 6px; + font-size: 0.9em; +} + +/* タイムバーコンテナ */ +#time-bar { + width: 100%; + display: flex; + margin: 3px 0; + flex-wrap: nowrap; + -webkit-overflow-scrolling: touch; +} + +/* タイムスロット */ +.time-slot { + min-width: 25px; + text-align: center; + border: 1px solid #ccc; + font-size: 1.3em !important; + /* !important は元の指定を尊重 */ + /* font-size: 0.85em; 重複していたため、どちらかを選択または調整 */ +} + +/* タブレット以上の幅でレイアウト変更 */ +@media (min-width: 768px) { + #custom-calendar { + flex-direction: row; + /* 横並びに戻す */ + align-items: flex-start; + width: fit-content; + /* 元の指定に近い形に戻す */ + float: left; + /* 元の指定 */ + margin-left: 121px !important; + /* 元の指定に戻す */ + } + + #custom-calendar>div:first-child { + /* カレンダーテーブルのコンテナ */ + width: auto; + /* 自動幅に戻す */ + margin-bottom: 0; + margin-right: 15px; + /* 右側にマージン */ + } + + .controls-container { + width: auto; + /* 自動幅に戻す */ + margin-left: 16px !important; + /* 元のマージンに戻す */ + } + + .day-toggle-buttons { + justify-content: flex-start; + /* 左揃えに戻す */ + } +} \ No newline at end of file diff --git a/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト管理/connectionSetting/next999.json b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト管理/connectionSetting/next999.json new file mode 100644 index 00000000..aeb831e2 --- /dev/null +++ b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト管理/connectionSetting/next999.json @@ -0,0 +1,4 @@ +{ + "apiKey": "c38903157cbffc30961f50bc29d0991a6cd8af495ab3009b05c5f98e82b2e61b94ba2d5c0a48fc518b1cd74c9e427b01051a228f670f3c5282544dfbec93db87", + "url": "https://neo999.next-hd.net/pleasanter/" +} \ No newline at end of file diff --git a/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト管理/sites/scripts/1.シフト希望表示.js b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト管理/sites/scripts/1.シフト希望表示.js new file mode 100644 index 00000000..c2a6891e --- /dev/null +++ b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト管理/sites/scripts/1.シフト希望表示.js @@ -0,0 +1,302 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 1.シフト希望表示 +@name : +@siteIds : 310511 +@siteTitles : イオン多摩平シフト管理 +@disabled: false +*/ + +let apiKey = '6504c8a807677a3a576e10327f3c19876c55736ee45d4a845796b9e7f5e087bfd4bd0d8184863da8cf1733ca635111432ab334aea59102b06a96ee6d2c05190d'; +let subWin; +//シフト希望データの保存先 +let subTableId = '310514'; + +let now = new Date(); +let monthStr = now.getFullYear() + '年' + + (now.getMonth() + 1).toString().padStart(2, '0') + '月'; + +let shiftData; +let totalCount = 0; + + +// 名前とクラスのマッピング +const nameColorMap = +{ + /*"豊蔵 恵美": { "backgroundColor": "#9370DB", "fontColor": "#000000" }, + "長谷川 望": { "backgroundColor": "#008000", "fontColor": "#FFFFFF" }, + "河村 あゆみ": { "backgroundColor": "#0000FF", "fontColor": "#FFFFFF" }, + "渡部 直輝": { "backgroundColor": "#FFFF00", "fontColor": "#000000" }, + "小坂 志織": { "backgroundColor": "#FFA500", "fontColor": "#000000" }, + "佐藤 春樹": { "backgroundColor": "#800080", "fontColor": "#FFFFFF" }, + "河関 宏昌": { "backgroundColor": "#FFC0CB", "fontColor": "#000000" }, + "中嶋 透": { "backgroundColor": "#A52A2A", "fontColor": "#FFFFFF" }, + "西川 眞": { "backgroundColor": "#F08080", "fontColor": "#000000" }, + "岡本 祥子": { "backgroundColor": "#90EE90", "fontColor": "#000000" }, + "青柳 麻衣": { "backgroundColor": "#ADD8E6", "fontColor": "#000000" }, + "田渕 希美": { "backgroundColor": "#FFFFE0", "fontColor": "#000000" }, + "松村 花純": { "backgroundColor": "#FFDAB9", "fontColor": "#000000" }, + "菱田 朱夏": { "backgroundColor": "#E6E6FA", "fontColor": "#000000" }, + "奥山 喜美花": { "backgroundColor": "#FFB6C1", "fontColor": "#000000" }, + "山口 賢人": { "backgroundColor": "#DEB887", "fontColor": "#000000" }, + "小島 芙優": { "backgroundColor": "#E0FFFF", "fontColor": "#000000" }, + "滝澤 みづき": { "backgroundColor": "#DA70D6", "fontColor": "#000000" }, + "八代 美波": { "backgroundColor": "#20B2AA", "fontColor": "#000000" }, + "伊藤 亜子": { "backgroundColor": "#32CD32", "fontColor": "#000000" }, + "鈴木 梨紗都": { "backgroundColor": "#D8BFD8", "fontColor": "#000000" },*/ + "店長会議": { "backgroundColor": "#000000", "fontColor": "#FFFFFF" }, + "イオンセミナー": { "backgroundColor": "#DC143C", "fontColor": "#FFFFFF" }, + "説明会": { "backgroundColor": "#4B0082", "fontColor": "#FFFFFF" }, + "ティッシュ配布": { "backgroundColor": "#FFD700", "fontColor": "#000000" }, + "消防訓練": { "backgroundColor": "#800000", "fontColor": "#FFFFFF" }, + "欠員": { "backgroundColor": "#FF0000", "fontColor": "#FFFFFF" }, + "法定点検": { "backgroundColor": "#800000", "fontColor": "#FFFFFF" }, + "ラック申請": { "backgroundColor": "#00FFFF", "fontColor": "#000000" }, + "チラシ申請": { "backgroundColor": "#00FFFF", "fontColor": "#000000" }, + "アプリ申請": { "backgroundColor": "#00FFFF", "fontColor": "#000000" }, +} + +$p.events.on_calendar_load = function () { + //処理内容 + $p.ex.init('#Calendar'); + + //ペンマークの削除 + $('div.title>.ui-icon-pencil').remove(); + + //色分け + $('div.item').each(function () { + + const $item = $(this); + const itemId = $item.attr('data-id'); + const span = ''; + + // $(this)の子タグの下にspanを追加 + $(this).children().last().prepend(span); + + const titleText = $(this).text().trim(); + const name = titleText.split('-')[0].trim(); + + const startTime = titleText.split('-')[1]?.trim() || ''; + const endTime = titleText.split('-')[2]?.trim() || ''; + const restTime = endTime && startTime ? Math.max(0, parseInt(endTime, 10) - parseInt(startTime, 10) - 4) : 0; + + if (restTime > 0) { + $(this).css('background-color', 'yellow'); + $(this).css('color', 'black'); + $(this).css('border', '2px solid black'); // 休憩時間がある場合は赤枠 + } else { + $(this).css('border', '1px dashed black'); // 休憩時間がない場合は透明な枠 + } + + $(this).css('background-color', nameColorMap[name]?.backgroundColor); + $(this).css('color', nameColorMap[name]?.fontColor); + + }); + + // クリックイベントを追加 + $(document).off('click', '.custom-check').on('click', '.custom-check', function (e) { + e.stopPropagation(); + const itemId = $(this).data('id'); + $p.ex.changeTimeDataWindow(itemId, e.pageX, e.pageY); + }); + + $('span.data.link').each(function () { + const titleText = $(this).text().trim(); + const name = titleText.split(/\d+/)[0].trim(); + + $(this).css('background-color', nameColorMap[name]?.backgroundColor); + $(this).css('color', nameColorMap[name]?.fontColor); + }); +} + +$p.events.on_editor_load = function () { + //処理内容 + $p.ex.init('#EditorTabsContainer'); +} + +$p.events.on_grid_load = function () { + //処理内容 + $p.ex.init('.grid-wrap'); +} + +$p.ex.init = function (target) { + $(target).css({ + 'width': '60%', + 'float': 'left' + }); + + //ウインドウがすでにある場合は削除 + if ($('#shiftListWindow').length) $('#shiftListWindow').remove(); + + subWin = document.createElement('div'); + subWin.id = 'shiftListWindow'; + subWin.innerText = ''; + subWin.style.width = '40%'; + subWin.style.float = 'left'; + subWin.style.textAlign = 'center'; + + $(target).after(subWin); + + let savedMonth = localStorage.getItem('selectedMonth'); + let initialMonth = savedMonth || monthStr; + + + //シフトデータ挿入 + $p.ex.getShiftKibouData(initialMonth); + +} + +$p.events.before_validate = function (args) { + +} + +//シフト希望日データ取得 +$p.ex.getShiftKibouData = async function (monthStr) { + //プリザンターへゲット処理 + const pleasanterUrl = 'https://' + location.hostname + '/pleasanter/api/items/' + subTableId + '/get' + + const jsonBody = { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + 'View': { + 'ColumnSorterHash': { + 'ClassB': 'asc' + }, + 'ColumnFilterHash': { + 'ClassA': '["' + monthStr + '"]' + }, + } + }; + + const pleasanterRes = await fetch(pleasanterUrl, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(jsonBody) + }); + + const resData = await pleasanterRes.json(); + //console.log(resData); + + //リスト消して + if ($('#listTable').length) $('#listTable').remove(); + if ($('#monthSelect').length) $('#monthSelect').remove(); + + // 年月セレクトボックス作成 + let now = new Date(); + // ローカルストレージから選択値を取得 + let savedMonth = localStorage.getItem('selectedMonth'); + let initialMonth = savedMonth || monthStr; + let selectHtml = ``; + + // テーブルテンプレート + let templateHtml = + ` + + + + + {{#listData}} + + + + + {{/listData}} +
名前希望シフト内容
{{userName}}{{shiftData}}
`; + + let listData = []; + let userName = '   '; + let userName0; + + + //シフト希望データの作成 + shiftData = '名前,種別,勤務可能日,勤務可能時間帯,その他条件\n'; + + $.each(resData.Response.Data, function (index, value) { + if (userName0 != value.ClassHash.ClassX) { + userName = value.ClassHash.ClassX; + } else { + userName = '   '; + } + let data = { + 'userName': userName, + 'shiftData': value.ClassHash.ClassZ + } + listData.push(data); + userName0 = value.ClassHash.ClassX; + + //AI用のシフトデーt作成 + let dateList = JSON.parse(value.ClassHash.ClassW).join('/'); + //let weekList = JSON.parse(value.ClassHash.ClassC).join('/'); + let timeList = JSON.parse(value.ClassHash.ClassD).join('/'); + + //shiftData += `${value.ClassHash.ClassX},${value.ClassHash.ClassP},${value.ClassHash.ClassZ},${value.ClassHash.ClassE},${value.ClassHash.ClassF},${value.ClassHash.ClassG},${value.ClassHash.ClassH}\n`; + shiftData += `${value.ClassHash.ClassX},${value.ClassHash.ClassP},${dateList},${timeList},${value.ClassHash.ClassF}\n`; + + }); + + //最後に欠員の情報を配置 + shiftData += '欠員,社員,いつでも,いつでも,いつでも,他の社員が勤務している時間帯は不可,他のメンバーの勤務を優先し、誰も割当できない時間帯に勤務する\n'; + + //console.log(shiftData); + + let template = Hogan.compile(templateHtml); + let outputHtml = template.render({ + "listData": listData + }); + + // selectボックスとテーブルを挿入 + $('#shiftListWindow').append(selectHtml + outputHtml); + + // ▼▼ ここからボタン追加 ▼▼ + // 既存のボタンがあれば削除 + if ($('#generateShiftBtn').length) $('#generateShiftBtn').remove(); + if ($('#deleteShiftDataBtn').length) $('#deleteShiftDataBtn').remove(); + + // ボタンを作成してテーブルの下に追加 + const $btn1 = $(''); + + // ボタンを作成してテーブルの下に追加 + const $btn2 = $(''); + //対象年月のシフトデータの件数を取得 + getPleasanterCountByMonth().then(count => { + console.log('件数:' + count); + totalCount = count; + + if (count > 0) { + $('#shiftListWindow').append($btn2); + $btn2.on('click', function () { + deletePleasanterDataByDateRange(); + }); + //$('#deleteShiftDataBtn').show(); + } else { + $('#shiftListWindow').append($btn1); + + //$('#deleteShiftDataBtn').hide(); + } + }); + + // ボタンクリック時にcreatePrompotText(shiftData)を実行 + $btn1.on('click', function () { + createPrompotText(shiftData); + }); + // ▲▲ ここまでボタン追加 ▲▲ + + // selectボックスのイベント + $('#monthSelect').on('change', function () { + let selectedMonth = $(this).val(); + // 選択値をローカルストレージに保存 + localStorage.setItem('selectedMonth', selectedMonth); + $p.ex.getShiftKibouData(selectedMonth); + }); + +} diff --git a/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト管理/sites/scripts/2.予定の自動生成.js b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト管理/sites/scripts/2.予定の自動生成.js new file mode 100644 index 00000000..e23c66b6 --- /dev/null +++ b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト管理/sites/scripts/2.予定の自動生成.js @@ -0,0 +1,354 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 2.予定の自動生成 +@name : +@siteIds : 310511 +@siteTitles : イオン多摩平シフト管理 +@disabled: false +*/ + +async function createPrompotText(shiftData) { + if (totalCount > 0) { + window.alert('対象年月のシフトデータはすでに存在します。\nAIで生成し直す場合は、シフトをすべて削除してから実行してください。'); + return false; + } + + // 実行確認のポップアップ + if (!window.confirm('シフト希望に基づいて対象月のシフトを生成しますか?')) { + return false; + } + + let selectMonth = $('#monthSelect').val(); + + let prompt = ` +#指示 +営業所の店長として、次の条件で勤務シフトを作成し、CSV形式で出力しなさい。 + +#営業時間 +午前10時から午後9時 年中無休 + +#メンバーとそれぞれのシフト可能内容のCSVデータ +${shiftData} + +#シフトの条件として下記のルールをすべて完璧に守って構成を作成しなさい。 +下記に列挙したルールをすべて厳密に厳守してシフトを構成しなさい。 +・営業時間午前10時から午後9時の各時間に必ず1名以上の勤務者がいること。 +・開始時間は10から20までとすること。 +・終了時間は11から21までとすること。 +・開始時間は終了時間よりも必ず少ない数字にすること。 +・同じ時間帯に同時に勤務するメンバーは2名までとすること。 +・勤務時間は午前10時から午後9時の間で、1時間単位で設定すること。 +・1日の勤務時間は4時間よりも多い場合は休憩時間を1時間とし、休憩時間は勤務時間の真ん中あたりに設定すること。 +・休憩時間は必ず1時間とする。勤務時間が奇数の場合は、後半の勤務時間を1時間多くすること。 +・休憩時間を除く勤務時間の合計は最大8時間までとすること。 +・1日の勤務時間が4時間以下の場合は休憩時間を含めない。 +・勤務可能日,勤務可能曜日,勤務可能時間帯よりも、「その他の条件」を最優先に考慮すること。 +・勤務可能日,勤務可能曜日,勤務可能時間帯よりも、「その他の条件」を最優先に考慮すること。 +・昼12時から13時には2名の勤務が必ず入るようにすること。 +・同じメンバーが1日に2回以上の勤務時間が入らないようにすること。 +・同じメンバーが5日以上連続して絶対に勤務しないこと。 +・社員よりパートを優先的に配置し、パートで配置しきれない日は社員を配置するここと。 +・欠員という名前のメンバーの種別は欠員とすること。 +・対象年月のすべての日程の営業時間午前10時から午後9時において何も割り当てられていない時間帯が無いようにすること。 +・他の勤務者がいる時間帯には欠員は配置しないこと。 +・対象年月のすべての日程の営業時間午前10時から午後9時において、誰も勤務できない時間帯がある場合は欠員を割り当てること。 + +#対象年月 +${selectMonth} + +#出力形式 +次のカラムで項目名を含めて構成されるCSV形式のみを出力すること。 +時間部分には必ず整数を設定すること。 +対象年月はyyyy年mm月の形式で出力すること。 + +対象年月,対象日付,種別,名前,開始時間,終了時間,勤務時間,休憩時間 + `; + + //console.log(prompt); + generateAndSaveSchedule(prompt); + + /* + // ▼▼▼ プロンプトをテキストファイルでダウンロード ▼▼▼ + const now = new Date(); + const ymdhms = [ + now.getFullYear(), + String(now.getMonth() + 1).padStart(2, '0'), + String(now.getDate()).padStart(2, '0'), + String(now.getHours()).padStart(2, '0'), + String(now.getMinutes()).padStart(2, '0'), + String(now.getSeconds()).padStart(2, '0') + ].join(''); + const promptFileName = `シフト自動生成プロンプト_${selectMonth}_${ymdhms}.txt`; + const promptBlob = new Blob([prompt], { type: 'text/plain' }); + const promptUrl = URL.createObjectURL(promptBlob); + const promptA = document.createElement('a'); + promptA.href = promptUrl; + promptA.download = promptFileName; + document.body.appendChild(promptA); + promptA.click(); + setTimeout(() => { + document.body.removeChild(promptA); + URL.revokeObjectURL(promptUrl); + }, 100); + // ▲▲▲ プロンプトをテキストファイルでダウンロード ▲▲▲ + */ +} + +// モーダル表示用関数 +function showLoadingModal(message = "AIでシフトを自動生成中です...") { + if ($('#gemini-loading-modal').length) return; + const modalHtml = ` +
+
+
+ ${message} +
+
+ + `; + $('body').append(modalHtml); +} + +// モーダル非表示用関数 +function hideLoadingModal() { + $('#gemini-loading-modal').remove(); +} + +// Google Gemini API でプロンプト送信→CSV取得→プリザンターへ登録 +async function generateAndSaveSchedule(promptText) { + showLoadingModal(); + + try { + // 1. Google Gemini API へプロンプト送信 + const geminiApiKey = 'AIzaSyAy_BhxPbZmyA7uN6wOrFZpOc3GJQhLAu8'; + const geminiApiUrl = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=' + geminiApiKey; + const geminiBody = { + 'contents': [{ 'parts': [{ 'text': promptText }] }] + }; + + const geminiRes = await fetch(geminiApiUrl, { + 'method': 'POST', + 'headers': { 'Content-Type': 'application/json' }, + 'body': JSON.stringify(geminiBody) + }); + const geminiData = await geminiRes.json(); + // Geminiの返答からCSVテキストを抽出 + const csvText = geminiData.candidates?.[0]?.content?.parts?.[0]?.text || ''; + + // 2. CSVをパース + const rows = csvText.trim().split('\n').map(line => line.split(',')); + const filteredRows = rows.filter(arr => arr.length >= 2); + //console.log('CSV Data:', filteredRows); + + const jsonArray = convertFilteredRowsToJson(filteredRows); + console.log('JSON Data:', jsonArray); + uploadShiftData(jsonArray); + + // ▼▼▼ ここからCSV自動ダウンロード処理(Shift_JIS対応) ▼▼▼ + + // 年月の取得(例: プロンプト内や画面のselectから取得) + let ym = ''; + if ($('#monthSelect').length) { + ym = $('#monthSelect').val(); + } else { + const ymMatch = promptText.match(/#対象年月\s*([0-9]{4}年[0-9]{1,2}月)/); + ym = ymMatch ? ymMatch[1] : '年月未取得'; + } + + // ファイル名生成(末尾に年月日時分秒を追加) + const now = new Date(); + const ymdhms = [ + now.getFullYear(), + String(now.getMonth() + 1).padStart(2, '0'), + String(now.getDate()).padStart(2, '0'), + String(now.getHours()).padStart(2, '0'), + String(now.getMinutes()).padStart(2, '0'), + String(now.getSeconds()).padStart(2, '0') + ].join(''); + const fileName = `イオン多摩平自動生成シフト表_${ym}_${ymdhms}.csv`; + + // Shift_JISでエンコードしてダウンロード + let sjisArray = Encoding.convert(Encoding.stringToCode(csvText), 'SJIS', 'UNICODE'); + let sjisUint8 = new Uint8Array(sjisArray); + const blob = new Blob([sjisUint8], { type: 'text/csv' }); + + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = fileName; + document.body.appendChild(a); + //a.click(); + setTimeout(() => { + document.body.removeChild(a); + URL.revokeObjectURL(url); + }, 100); + + // ▲▲▲ ここまでCSV自動ダウンロード処理(Shift_JIS対応) ▲▲▲ + + } finally { + hideLoadingModal(); + window.location.reload(); + } +} + +async function uploadShiftData(jsonArray) { + const tableId = $p.siteId(); + + + const uploadUrl = `https://${location.hostname}/pleasanter/api/items/${tableId}/bulkupsert`; + const uploadBody = { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + 'Data': jsonArray + } + + //プリザンターから対象のデータをすべて一括削除 + const uploadRes = await fetch(uploadUrl, { + 'method': 'POST', + 'headers': { 'Content-Type': 'application/json' }, + 'body': JSON.stringify(uploadBody) + }); + + const resData = await uploadRes.json(); + console.log(resData); + +} + +// filteredRows からJSON配列へ変換(項目名置き換えルール適用) +function convertFilteredRowsToJson(filteredRows) { + if (!filteredRows || filteredRows.length < 2) return []; + + // 1行目をヘッダーとして取得 + const header = filteredRows[0]; + // 置き換えルール + const keyMap = { + '対象年月': 'ClassA', + '対象日付': 'DateA', + '種別': 'ClassP', + '名前': 'ClassB', + '開始時間': 'NumA', + '終了時間': 'NumB', + '勤務時間': 'NumC', + '休憩時間': 'NumD' + }; + + // ヘッダーをPleasanter用キーに変換 + const mappedHeader = header.map(col => keyMap[col.trim()] || col.trim()); + + // データ行をJSON化 + const jsonArray = filteredRows.slice(1).map(row => { + let obj = {}; + obj.ClassHash = {}; + obj.NumHash = {}; + obj.DateHash = {}; + + mappedHeader.forEach((key, idx) => { + const val = row[idx] !== undefined ? row[idx].trim() : ''; + if (key.startsWith('Class')) { + obj.ClassHash[key] = val; + } else if (key.startsWith('Num')) { + obj.NumHash[key] = val; + } else if (key.startsWith('Date')) { + obj.DateHash[key] = val; + } else { + obj[key] = val; + } + }); + + return obj; + }); + + return jsonArray; +} + +// 使い方例 +// const jsonArray = convertFilteredRowsToJson(filteredRows); + + +/** + * プリザンターのテーブルからDateA項目が指定年月の範囲にあるデータを一括削除する + */ + +async function deletePleasanterDataByDateRange() { + // 実行確認のポップアップ + if (!window.confirm('本当にこの年月のデータを一括削除してよろしいですか?')) { + return false; + } + + //自分自身 + let tableId = $p.siteId(); + + //選択した年月を取得 + if ($('#monthSelect').length) { + ym = $('#monthSelect').val(); + } else { + return false; + } + const year = ym.split('年')[0]; // "2025" + const month = ym.split('年')[1].replace('月', ''); // "06" + + //期間の開始日と終了日を作成 + const fromDate = year + '/' + month + '/01'; + + //終了年月の月末日を計算 + const lastDate = new Date(fromDate); + lastDate.setMonth(lastDate.getMonth() + 1); + lastDate.setDate(0); // 月末日を取得 + + const toDate = `${year}/${month}/${lastDate.getDate()}`; // "2025/06/30" + + //一括削除 + const deleteUrl = `https://${location.hostname}/pleasanter/api/items/${tableId}/bulkdelete`; + const deleteBody = { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + 'View': { + 'ColumnFilterHash': { + 'DateA': `["${fromDate} 00:00:00,${toDate} 23:59:59"]`, + 'ClassP': '["社員","パート","欠員"]' + } + } + } + + //プリザンターから対象のデータをすべて一括削除 + const deleteRes = await fetch(deleteUrl, { + 'method': 'POST', + 'headers': { 'Content-Type': 'application/json' }, + 'body': JSON.stringify(deleteBody) + }); + + const resData = await deleteRes.json(); + //console.log(resData); + window.location.reload(); +} + +/** + * #hiddenタグに保存されている件数をチェック + */ +async function getPleasanterCountByMonth() { + let ym = ''; + //選択した年月を取得 + if ($('#monthSelect').length) { + ym = $('#monthSelect').val(); + } else { + return 0; + } + + const year = ym.split('年')[0]; // "2025" + const month = ym.split('年')[1].replace('月', ''); // "06" + + + return parseFloat($('#' + year + '_' + month + '_Count').val()) || 0; +} diff --git a/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト管理/sites/scripts/3.予定編集ウインドウ.js b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト管理/sites/scripts/3.予定編集ウインドウ.js new file mode 100644 index 00000000..aa7cc7b3 --- /dev/null +++ b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト管理/sites/scripts/3.予定編集ウインドウ.js @@ -0,0 +1,137 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 3.予定編集ウインドウ +@name : +@siteIds : 310511 +@siteTitles : イオン多摩平シフト管理 +@disabled: false +*/ + +//$(document).on('click', 'div.item', function (e) { +$p.ex.changeTimeDataWindow = function (dataId, pageX, pageY) { + const $item = $('div.item[data-id="' + dataId + '"]'); + $('#edit-modal').remove(); + const itemId = $item.attr('data-id'); + const posX = pageX; + const posY = pageY; + + // 既存データ取得 + const textParts = $item.text().trim().split('-'); + const startTime = textParts[1] ? textParts[1].trim() : ''; + const endTime = textParts[2] ? textParts[2].trim() : ''; + // 休憩時間(NumD)がデータに含まれていれば取得、なければ自動計算 + let restTime = ''; + if (textParts[3]) { + restTime = textParts[3].trim(); + } else if (startTime !== '' && endTime !== '') { + const diff = parseInt(endTime, 10) - parseInt(startTime, 10); + restTime = (diff > 4) ? 1 : 0; + } else { + restTime = 0; + } + + // モーダルHTML(休憩時間も追加) + const modalHtml = ` +
+
+
+ +
+ `; + $('body').append(modalHtml); + $('body').css('overflow', 'hidden'); + + // 入力制限ロジック + $('#edit-start, #edit-end').on('input', function () { + let start = parseInt($('#edit-start').val(), 10); + let end = parseInt($('#edit-end').val(), 10); + + // startTimeはendTimeより大きくできない + if (!isNaN(end)) { + $('#edit-start').attr('max', end); + } else { + $('#edit-start').attr('max', 23); + } + + // endTimeはstartTimeより小さくできない + if (!isNaN(start)) { + $('#edit-end').attr('min', start); + } else { + $('#edit-end').attr('min', 0); + } + + // 休憩時間自動計算 + if (!isNaN(start) && !isNaN(end)) { + const diff = end - start; + const rest = (diff > 4) ? 1 : 0; + $('#edit-rest').val(rest); + } else { + $('#edit-rest').val(0); + } + }); + + setTimeout(() => { + $(document).on('mousedown.editModal', async function (event) { + if (!$(event.target).closest('#edit-modal').length) { + // 入力値取得 + const newStart = $('#edit-start').val(); + const newEnd = $('#edit-end').val(); + const newRest = $('#edit-rest').val(); + + // 変更がない場合は何もせず閉じる + if (newStart === startTime && newEnd === endTime && newRest == restTime) { + $('#edit-modal').remove(); + $(document).off('mousedown.editModal'); + $('body').css('overflow', ''); + return; + } + + // 更新リクエスト送信 + const pleasanterUrl = 'https://' + location.hostname + '/pleasanter/api/items/' + itemId + '/update'; + const jsonBody = { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + 'NumHash': { + 'NumA': newStart, + 'NumB': newEnd, + 'NumD': newRest // 休憩時間を追加 + } + }; + + try { + const pleasanterRes = await fetch(pleasanterUrl, { + 'method': 'POST', + 'headers': { 'Content-Type': 'application/json' }, + 'body': JSON.stringify(jsonBody) + }); + + const resData = await pleasanterRes.json(); + if (resData.StatusCode === 200) { + $('#edit-modal').remove(); + $(document).off('mousedown.editModal'); + $('body').css('overflow', ''); + location.reload(); + } else { + alert('更新に失敗しました'); + $('#edit-modal').remove(); + $(document).off('mousedown.editModal'); + $('body').css('overflow', ''); + } + } catch (err) { + alert('通信エラーが発生しました'); + $('#edit-modal').remove(); + $(document).off('mousedown.editModal'); + $('body').css('overflow', ''); + } + } + }); + }, 10); +} + +// モーダル内クリック時は閉じない +$(document).on('click', '#edit-modal', function (e) { + e.stopPropagation(); +}); \ No newline at end of file diff --git a/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト管理/sites/serverscripts/1.選択年月リスト作成.js b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト管理/sites/serverscripts/1.選択年月リスト作成.js new file mode 100644 index 00000000..e340152d --- /dev/null +++ b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト管理/sites/serverscripts/1.選択年月リスト作成.js @@ -0,0 +1,44 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 1.選択年月リスト作成 +@name : 1.選択年月リスト作成 +@siteIds : 310511 +@siteTitles : イオン多摩平シフト管理 +@disabled: false +*/ + +try { + // 年月を当月から2ヶ月後まで自動表示 + let now = new Date(); + for (let i = 0; i < 3; i++) { + let date = new Date(now.getFullYear(), now.getMonth() + i, 1); + let year = date.getFullYear(); + let month = (date.getMonth() + 1).toString().padStart(2, '0'); + let ym = year + '年' + month + '月'; + columns.ClassA.AddChoiceHash(ym, ym); + + //対象年月ごとの件数を調べてHTML内に保管する + let ymList = [ym] + let classP = ['社員', 'パート']; + + let view = { + 'View': { + 'ColumnFilterHash': { + 'ClassA': JSON.stringify(ymList), + 'ClassP': JSON.stringify(classP) + } + } + }; + + let count = items.Count(310511, JSON.stringify(view)); + let key = year + '_' + month + '_Count' + hidden.Add(key, count); + } + + +} catch (e) { + context.Log(e.stack); +} + + diff --git a/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト管理/sites/styles/1.シフト希望表示.css b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト管理/sites/styles/1.シフト希望表示.css new file mode 100644 index 00000000..2cb7dd55 --- /dev/null +++ b/pleasanter/develop/#リフォームラボ/■イオン多摩平シフト管理/sites/styles/1.シフト希望表示.css @@ -0,0 +1,76 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : シフト希望表示 +@name : +@siteIds : 310511 +@siteTitles : イオン多摩平シフト管理 +@disabled: false +*/ + +#listTable { + margin: 5px; + border-collapse: separate !important; +} + +#monthSelect { + margin: 5px; + border-radius: 10px; + background-color: #fff; + padding: 5px; + border: 1px solid #999; + font-size: 1.3em; +} + +table { + + th, + td { + border-color: #999 !important; + } +} + +.radius-table { + border-radius: 10px !important; + border-spacing: 0; + border: none; + border-left: 1px solid #999; + border-top: 1px solid #999; +} + +.radius-table th { + background-color: lightpink; + text-align: cennter; + white-space: nowrap; +} + +.radius-table .userName { + white-space: nowrap; +} + +.radius-table td { + text-align: left; +} + +.radius-table tr>* { + padding: 5px 10px; + border: none; + border-right: 1px solid #999; + border-bottom: 1px solid #999; +} + +.radius-table tr:first-child>*:first-child { + border-radius: 10px 0 0 0; +} + +.radius-table tr:first-child>*:last-child { + border-radius: 0 10px 0 0; +} + +.radius-table tr:last-child>*:first-child { + border-radius: 0 0 0 10px; +} + +.radius-table tr:last-child>*:last-child { + border-radius: 0 0 10px 0; +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/.vscode/settings.json b/pleasanter/develop/#営業積算/.vscode/settings.json new file mode 100644 index 00000000..5c0f1a87 --- /dev/null +++ b/pleasanter/develop/#営業積算/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "markdown.validate.enabled": true +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/FlowChart/flowchart.md b/pleasanter/develop/#営業積算/FlowChart/flowchart.md new file mode 100644 index 00000000..467f38fe --- /dev/null +++ b/pleasanter/develop/#営業積算/FlowChart/flowchart.md @@ -0,0 +1,12 @@ +:::mermaid + graph LR; + A(START) --> |作成| B(新規作成) + B --> |一時保管| C(登録未完) + B --> |登録完了| D(登録済み) + C --> |登録完了| D + D --> |保留| E(保留) + D --> |取消| F(取消) + D --> |依頼終了| G(終了) + G --> |復活?| D + +::: \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/FlowChart/jQuery UI Icons.pdf b/pleasanter/develop/#営業積算/FlowChart/jQuery UI Icons.pdf new file mode 100644 index 00000000..4333cf38 Binary files /dev/null and b/pleasanter/develop/#営業積算/FlowChart/jQuery UI Icons.pdf differ diff --git a/pleasanter/develop/#営業積算/FlowChart/jquery-icons.html b/pleasanter/develop/#営業積算/FlowChart/jquery-icons.html new file mode 100644 index 00000000..c3531a55 --- /dev/null +++ b/pleasanter/develop/#営業積算/FlowChart/jquery-icons.html @@ -0,0 +1,759 @@ + + + + + jQuery UI Icons + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/doc/2025-06-13/Re_カラーコード設定用2025.6.10.pdf b/pleasanter/develop/#営業積算/doc/2025-06-13/Re_カラーコード設定用2025.6.10.pdf new file mode 100644 index 00000000..862225d3 Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/2025-06-13/Re_カラーコード設定用2025.6.10.pdf differ diff --git a/pleasanter/develop/#営業積算/doc/2025-06-13/Re_デモフィードバック2025.6.10.pdf b/pleasanter/develop/#営業積算/doc/2025-06-13/Re_デモフィードバック2025.6.10.pdf new file mode 100644 index 00000000..fc1851b0 Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/2025-06-13/Re_デモフィードバック2025.6.10.pdf differ diff --git a/pleasanter/develop/#営業積算/doc/2025-06-13/Re_依頼パターン一覧2025.6.10.pdf b/pleasanter/develop/#営業積算/doc/2025-06-13/Re_依頼パターン一覧2025.6.10.pdf new file mode 100644 index 00000000..d844c9cb Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/2025-06-13/Re_依頼パターン一覧2025.6.10.pdf differ diff --git a/pleasanter/develop/#営業積算/doc/2025-06-13/各フロー図.PNG b/pleasanter/develop/#営業積算/doc/2025-06-13/各フロー図.PNG new file mode 100644 index 00000000..b5c1558a Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/2025-06-13/各フロー図.PNG differ diff --git a/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/(31ページ目)一部追加項目_仕様計画書2024.12.8.pdf b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/(31ページ目)一部追加項目_仕様計画書2024.12.8.pdf new file mode 100644 index 00000000..eb86286a Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/(31ページ目)一部追加項目_仕様計画書2024.12.8.pdf differ diff --git a/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/(31ページ目)一部追加項目あり_仕様計画書2025.1.10.pdf b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/(31ページ目)一部追加項目あり_仕様計画書2025.1.10.pdf new file mode 100644 index 00000000..0368332c Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/(31ページ目)一部追加項目あり_仕様計画書2025.1.10.pdf differ diff --git a/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/202505★積算問い合わせ2025ver_プリザンター項目定義書.xlsx b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/202505★積算問い合わせ2025ver_プリザンター項目定義書.xlsx new file mode 100644 index 00000000..279857b8 Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/202505★積算問い合わせ2025ver_プリザンター項目定義書.xlsx differ diff --git a/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/n★積算問い合わせ2025ver_プリザンター項目定義書.xlsx b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/n★積算問い合わせ2025ver_プリザンター項目定義書.xlsx new file mode 100644 index 00000000..9ebb266b Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/n★積算問い合わせ2025ver_プリザンター項目定義書.xlsx differ diff --git a/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/★積算問い合わせ2025ver_プリザンター項目定義書.xlsx b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/★積算問い合わせ2025ver_プリザンター項目定義書.xlsx new file mode 100644 index 00000000..aac572b4 Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/★積算問い合わせ2025ver_プリザンター項目定義書.xlsx differ diff --git a/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/【営業積算】プリザンター仕様計画書_2024.12.1.pdf b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/【営業積算】プリザンター仕様計画書_2024.12.1.pdf new file mode 100644 index 00000000..bd89d59e Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/【営業積算】プリザンター仕様計画書_2024.12.1.pdf differ diff --git a/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/【営業積算】プリザンター仕様計画書_2025.1.11.pdf b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/【営業積算】プリザンター仕様計画書_2025.1.11.pdf new file mode 100644 index 00000000..9a064725 Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/【営業積算】プリザンター仕様計画書_2025.1.11.pdf differ diff --git a/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/依頼P見直し)中分類_2025_06_23 16_18_41.xlsx b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/依頼P見直し)中分類_2025_06_23 16_18_41.xlsx new file mode 100644 index 00000000..b66b7f9f Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/依頼P見直し)中分類_2025_06_23 16_18_41.xlsx differ diff --git a/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/依頼パターン案.xlsx b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/依頼パターン案.xlsx new file mode 100644 index 00000000..e0000d39 Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/依頼パターン案.xlsx differ diff --git a/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/修正ver_積算問い合わせ(旧問い合わせ).xlsx b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/修正ver_積算問い合わせ(旧問い合わせ).xlsx new file mode 100644 index 00000000..3014c16d Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/修正ver_積算問い合わせ(旧問い合わせ).xlsx differ diff --git a/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/修正ver_積算問い合わせ.xlsx b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/修正ver_積算問い合わせ.xlsx new file mode 100644 index 00000000..65771d56 Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/修正ver_積算問い合わせ.xlsx differ diff --git a/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/営業積算_リニューアル2024-selected.zip b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/営業積算_リニューアル2024-selected.zip new file mode 100644 index 00000000..030768f9 Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/営業積算_リニューアル2024-selected.zip differ diff --git a/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/帳票テンプレ_単価リスト2024.11.24.xlsx b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/帳票テンプレ_単価リスト2024.11.24.xlsx new file mode 100644 index 00000000..7dd9fe31 Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/帳票テンプレ_単価リスト2024.11.24.xlsx differ diff --git a/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/帳票テンプレ_単価リスト2025.01.11.xlsx b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/帳票テンプレ_単価リスト2025.01.11.xlsx new file mode 100644 index 00000000..8cd9b5ef Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/帳票テンプレ_単価リスト2025.01.11.xlsx differ diff --git a/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/帳票テンプレ_単価リスト2025.01.26.xlsx b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/帳票テンプレ_単価リスト2025.01.26.xlsx new file mode 100644 index 00000000..fe199b5f Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/帳票テンプレ_単価リスト2025.01.26.xlsx differ diff --git a/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/帳票テンプレ_承認図以降問い合わせ2024.11.24.xlsx b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/帳票テンプレ_承認図以降問い合わせ2024.11.24.xlsx new file mode 100644 index 00000000..bc8d6c09 Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/帳票テンプレ_承認図以降問い合わせ2024.11.24.xlsx differ diff --git a/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/帳票テンプレ_通常問い合わせ2024.11.24.xlsx b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/帳票テンプレ_通常問い合わせ2024.11.24.xlsx new file mode 100644 index 00000000..e96680cb Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/帳票テンプレ_通常問い合わせ2024.11.24.xlsx differ diff --git a/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/部材リスト_ガイド欄2025.1.11.pdf b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/部材リスト_ガイド欄2025.1.11.pdf new file mode 100644 index 00000000..954f7bfb Binary files /dev/null and b/pleasanter/develop/#営業積算/doc/営業積算_リニューアル2024-selected/部材リスト_ガイド欄2025.1.11.pdf differ diff --git a/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/connectionSetting/next999.json b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/connectionSetting/next999.json new file mode 100644 index 00000000..aeb831e2 --- /dev/null +++ b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/connectionSetting/next999.json @@ -0,0 +1,4 @@ +{ + "apiKey": "c38903157cbffc30961f50bc29d0991a6cd8af495ab3009b05c5f98e82b2e61b94ba2d5c0a48fc518b1cd74c9e427b01051a228f670f3c5282544dfbec93db87", + "url": "https://neo999.next-hd.net/pleasanter/" +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/scripts/01_基本スクリプト.js b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/scripts/01_基本スクリプト.js new file mode 100644 index 00000000..feea8580 --- /dev/null +++ b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/scripts/01_基本スクリプト.js @@ -0,0 +1,386 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 01_基本スクリプト +@name : +@siteIds : 310406 +@siteTitles : Re①基本情報 +@disabled: false +*/ +let pageLoading = 0; +let apiKey = '6504c8a807677a3a576e10327f3c19876c55736ee45d4a845796b9e7f5e087bfd4bd0d8184863da8cf1733ca635111432ab334aea59102b06a96ee6d2c05190d'; + +//メッセージデータ +let messageData = JSON.parse($('#messageData').val() || '[]'); + +//---------------------------------------------------------------------- +//初期処理 +window.addEventListener('load', function () { + if (pageLoading == 0) { + console.log('Window load Event'); + $p.ex.onLoad(); + } +}); + +$p.events.on_editor_load = function () { + if (pageLoading == 0) { + console.log('on Editor Load'); + $p.ex.onLoad(); + } +} + +//---------------------------------------------------------------------- +$p.ex.onLoad = function () { + //ロード開始 + pageLoading = 1; + + //初期処理 + $p.ex.init(); +} + +//初期処理 +$p.ex.init = function () { + console.log('initialize...'); + //初期化 + + //一時保存ボタン処理1 + $('#UpdateCommand').empty(); + $('#UpdateCommand').html(`一時保存`); + $('#UpdateCommand').addClass('new-status-light-lime'); + + //プロセスボタン調整 + $p.ex.processButtonControl(); + + //依頼票登録処理の場合は何もしない + if ($('#Results_Class199').val() == '1') return; + + //新規作成時のみ処理 + if ($p.action() == 'new') { + //年度自動保存 + let now = new Date(); + let year = parseFloat(now.getFullYear()) - 2000; + let month = now.getMonth() + 1; + let code; + //年保存 + $p.set($('#Results_ClassF'), year); + + //四半期記号 + switch (month) { + case 1: + case 2: + case 3: + code = 'A'; + break; + case 4: + case 5: + case 6: + code = 'B'; + break; + case 7: + case 8: + case 9: + code = 'C'; + break; + case 10: + case 11: + case 12: + code = 'D'; + break; + } + $p.set($('#Results_ClassG'), code); + $p.set($('#Results_ClassH'), code); + + } else { + //スタートアップメッセージ表示 + $p.ex.startupMessage(); + + } + + //読取り専用 + $('.code-readonly2 input').prop('tabindex', '-1'); + $('.code-readonly2 select').prop('tabindex', '-1'); + + //Re②依頼票 作成ボタンを非表示 + $('button[data-from-site-id="' + $p.siteId() + '"]:contains("Re②依頼票")').hide(); + $('button[data-from-site-id="' + $p.siteId() + '"]:contains("Re③依頼項目")').hide(); + + +} + +//入力チェック後処理 +$p.events.before_validate = function (args) { + +} + +//入力チェック後処理 +$p.events.after_validate = function (args) { + //エリア-ブランド結合 + $p.ex.areaBrandName(); + //施主名 姓名結合 + $p.ex.setCustomerName(); + //担当者一覧マージ + $p.ex.usersMarge1(); + //CC一覧マージ + $p.ex.usersMarge2(); + //担当者・CC一覧マージ + $p.ex.usersMarge3(); + + + //変更履歴の保存 + $p.ex.saveHistory(); +} + +//画面更新後 +$p.events.after_set_Update = function (args) { + //初期処理 + $p.ex.init(); + + //一時保存ボタン処理2 + $('#UpdateCommand').empty(); + $('#UpdateCommand').html(` + + 一時保存`); + + + //一時保存メッセージ + let json8val = JSON.parse(args.json[8].Value); + if (json8val.Id == 'Updated') { + $p.ex.setMyMessage('new-status-light-lime', '基本情報の内容が一時保存されました'); + } + + //依頼票登録ボタンが押されたら + if ($('#Results_Class199').val() == '1') { + $p.apiUpdate({ + 'id': $p.id(), + 'data': { + 'ApiVersion': 1.1, + 'ClassHash': { + 'Class199': '0' + } + }, + 'done': function (data) { + //フラグを0に戻してから依頼票ボタンを押す + $('button[data-from-site-id="' + $p.siteId() + '"]:contains("Re②依頼票")').click(); + }, + 'fail': function (data) { + console.log(data); + } + }); + + } +} + +//エリアとブランド名を合体させて格納する +$p.ex.areaBrandName = function () { + let area = $('#Results_Class011 option:selected').text(); + let brand = $('#Results_Class012 option:selected').text(); + + if (area && brand) { + $p.set($('#Results_ClassL'), area + ' ' + brand); + } +} + +//施主名 姓名結合 +$p.ex.setCustomerName = function () { + let name1 = $('#Results_Class001').val(); + let name2 = $('#Results_Class002').val(); + let customerName = name1 + ' ' + name2 + ' 様'; + $p.set($('#Results_ClassK'), customerName); + + let eigyo = $('#Results_Class022').text(); + let area = $('#Results_Class011 option:selected').text(); + let flagData = name1 + ' ' + name2 + '_' + area + '_' + eigyo; + + $p.set($('#Results_Class200'), flagData); + +} + +//担当者一覧マージ +$p.ex.usersMarge1 = function () { + let users = []; + $('#Results_ClassB').val() && users.push($('#Results_ClassB').val()); //入力者 + $('#Results_Class022').val() && users.push($('#Results_Class022').val()); //主担当営業 Class022 + $('#Results_Class023').val() && users.push($('#Results_Class023').val()); //副担当営業 Class023 + $('#Results_Class024').val() && users.push($('#Results_Class024').val()); //営業設計 Class024 + $('#Results_Class025').val() && users.push($('#Results_Class025').val()); //担当監督 Class025 + $('#Results_Class026').val() && users.push($('#Results_Class026').val()); //担当IC Class026 + $('#Results_Class027').val() && users.push($('#Results_Class027').val()); //管理設計 Class027 + $('#Results_Class028').val() && users.push($('#Results_Class028').val()); //所属長 Class028 + + $p.set($('#Results_Class191'), JSON.stringify(users)); +} + +//CC一覧マージ +$p.ex.usersMarge2 = function () { + let users = []; + $('#Results_Class031').val() && users.push($('#Results_Class031').val()); //CC1 + $('#Results_Class032').val() && users.push($('#Results_Class032').val()); //CC2 + $('#Results_Class033').val() && users.push($('#Results_Class033').val()); //CC3 + $('#Results_Class034').val() && users.push($('#Results_Class034').val()); //CC4 + + $p.set($('#Results_Class192'), JSON.stringify(users)); +} + +//担当者・CC一覧マージ +$p.ex.usersMarge3 = function () { + /* + let users = []; + $('#Results_Class022').val() && users.push($('#Results_Class022').val()); //主担当営業 Class022 + $('#Results_Class023').val() && users.push($('#Results_Class023').val()); //副担当営業 Class023 + $('#Results_Class024').val() && users.push($('#Results_Class024').val()); //営業設計 Class024 + $('#Results_Class025').val() && users.push($('#Results_Class025').val()); //担当監督 Class025 + $('#Results_Class026').val() && users.push($('#Results_Class026').val()); //担当IC Class026 + $('#Results_Class027').val() && users.push($('#Results_Class027').val()); //管理設計 Class027 + $('#Results_Class028').val() && users.push($('#Results_Class028').val()); //所属長 Class028 + + $('#Results_Class031').val() && users.push($('#Results_Class031').val()); //CC1 + $('#Results_Class032').val() && users.push($('#Results_Class032').val()); //CC2 + $('#Results_Class033').val() && users.push($('#Results_Class033').val()); //CC3 + $('#Results_Class034').val() && users.push($('#Results_Class034').val()); //CC4 + */ + //担当者一覧とCC一覧をマージして保管 + let mergeAry = [...$('#Results_Class191').val(), ...$('#Results_Class192').val()]; + mergeAry.push($('#Results_ClassB').val()); + $p.set($('#Results_Class193'), JSON.stringify(mergeAry)); + +} + +//マスターシートの選択を外したら欄を削除する +$p.on('change', 'ClassY', function () { + + //マスターシート リンク解除 + if (!$("#Results_ClassY").val()) { + $p.ex.clearMSSData(); + + //100ms待機後にメッセージ表示 + setTimeout(() => { + $p.ex.setMyMessage('new-status-yellow', 'マスターシートの情報を削除しました'); + }, 100); + + } else { + $p.ex.getMSSData(); + } +}); + +$p.ex.getMSSData = function () { + let resultId = $("#Results_ClassY").val(); + + $p.apiGet({ + 'id': resultId, + 'done': function (data) { + console.log(data); + if (data.Response.TotalCount == '1') { + let mssData = data.Response.Data[0]; + + //既存データクリア + console.log('Clear MSS Data before Set'); + $p.ex.clearMSSData(); + + console.log('Set MSS Data'); + $p.set($('#Results_ClassZ'), mssData.ClassHash.ClassA); //契約コード + $p.set($('#Results_Class001'), mssData.ClassHash.Class001); //施主・姓 + $p.set($('#Results_Class002'), mssData.ClassHash.Class002); //施主・名 + $p.set($('#Results_Class003'), mssData.ClassHash.Class003); //施主・姓(カナ) + $p.set($('#Results_Class004'), mssData.ClassHash.Class004); //施主・名(カナ) + $p.set($('#Results_Class005'), mssData.ClassHash.ClassQ); //工事名 + $p.set($('#Results_Class006'), mssData.ClassHash.ClassR); //工事名_カナ + $p.set($('#Results_Class010'), mssData.ClassHash.Class029); //建上地 + $p.set($('#Results_Class011'), mssData.ClassHash.ClassW); //エリア + $p.set($('#Results_Class012'), mssData.ClassHash.Class033); //契約ブランド + $p.set($('#Results_Class013'), mssData.ClassHash.Class040); //防火指定 + $p.set($('#Results_Class014'), mssData.ClassHash.Class043); //建物種類 + + $p.set($('#Results_Class021'), mssData.ClassHash.ClassF); //契約営業所 + $p.set($('#Results_Class022'), mssData.ClassHash.ClassG); //主担当営業 + $p.set($('#Results_Class023'), mssData.ClassHash.ClassH); //副担当営業 + $p.set($('#Results_Class024'), mssData.ClassHash.ClassI); //営業設計 + $p.set($('#Results_Class025'), mssData.ClassHash.ClassJ); //担当監督 + $p.set($('#Results_Class026'), mssData.ClassHash.ClassK); //担当IC + $p.set($('#Results_Class027'), mssData.ClassHash.ClassL); //管理設計 + $p.set($('#Results_Class028'), mssData.ClassHash.ClassY); //所属長 + + if (mssData.DateHash.DateH != '1899-12-30T00:00:00') { + let dateH = new Date(mssData.DateHash.DateH); + let dateHStr = dateH.getFullYear() + '/' + (dateH.getMonth() + 1).toString().padStart(2, '0') + '/' + dateH.getDate().toString().padStart(2, '0'); + $p.set($('#Results_Date001'), dateHStr); + } + + if (mssData.DateHash.Date063 != '1899-12-30T00:00:00') { + let date063 = new Date(mssData.DateHash.Date063); + let date063Str = date063.getFullYear() + '/' + (date063.getMonth() + 1).toString().padStart(2, '0') + '/' + date063.getDate().toString().padStart(2, '0'); + $p.set($('#Results_Date002'), date063Str); + } + + $p.set($('#Results_ClassS'), '1'); //案件状況 + + $p.clearMessage(); + $p.ex.setMyMessage('new-status-lime', 'マスターシートの情報を取得しました'); + + + } else { + //既存データクリア + $p.ex.clearMSSData(); + + } + }, + 'fail': function (data) { + console.log(data); + //既存データクリア + $p.ex.clearMSSData(); + + } + }); +} + +//MSSからの引用データをクリア +$p.ex.clearMSSData = function () { + console.log('Clear MSS Data'); + + $p.set($('#Results_ClassS'), '0'); //案件状況 + $p.set($('#Results_ClassZ'), ''); //契約コード + + $p.set($('#Results_Class001'), ''); //施主・姓 + $p.set($('#Results_Class002'), ''); //施主・名 + $p.set($('#Results_Class003'), ''); //施主・姓(カナ) + $p.set($('#Results_Class004'), ''); //施主・名(カナ) + $p.set($('#Results_Class005'), ''); //連名 + $p.set($('#Results_Class006'), ''); //連名(カナ) + $p.set($('#Results_Class010'), ''); //建上地 + $p.set($('#Results_Class011'), ''); //エリア + $p.set($('#Results_Class012'), ''); //契約ブランド + $p.set($('#Results_Class013'), ''); //防火指定 + $p.set($('#Results_Class014'), ''); //建物種類 + + $p.set($('#Results_ClassK'), ''); //施主名 + $p.set($('#Results_ClassL'), ''); //エリアブランド + $p.set($('#Results_ClassM'), ''); //エリア記号 + $p.set($('#Results_ClassN'), ''); //ブランド記号 + + $p.set($('#Results_Class021'), ''); //契約営業所 + $p.set($('#Results_Class022'), ''); //主担当営業 + $p.set($('#Results_Class023'), ''); //副担当営業 + $p.set($('#Results_Class024'), ''); //営業設計 + $p.set($('#Results_Class025'), ''); //担当監督 + $p.set($('#Results_Class026'), ''); //担当IC + $p.set($('#Results_Class027'), ''); //管理設計 + $p.set($('#Results_Class028'), ''); //所属長 + + $p.set($('#Results_Date001'), ''); //承認図予定日 + $p.set($('#Results_Date002'), ''); //着工予定日 + +} + +/** + * 指定したIDのタグのID + */ +function addPlaceholderOption(selectId) { + //値が空の場合、プレースホルダー的なoptionを追加 + const val = $(`#${selectId}`).val(); + if (!val) { + //1つ目のoptionのテキストを変更 + $(`#${selectId} option:first`).text('次から選択してください'); + + } + //console.log($(`#${selectId}`)); +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/scripts/02_プロセス処理.js b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/scripts/02_プロセス処理.js new file mode 100644 index 00000000..75ecba84 --- /dev/null +++ b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/scripts/02_プロセス処理.js @@ -0,0 +1,122 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 02_プロセス処理 +@name : +@siteIds : 310406 +@siteTitles : Re①基本情報 +@disabled: false +*/ + +//プロセスごとに実行スクリプト +$p.ex.processScript = function (procNum) { + //プロセス共通処理 ------------------------------------------------------------------ + //確認メッセージの取得 + let confirmMessage = $('#Process_' + procNum).attr('data-confirm'); + //実行確認 + if (!confirm(confirmMessage)) { + //キャンセルなら終了 + console.log('Process_' + procNum + ' はキャンセルされました'); + return false; + } else { + //オリジナルの確認メッセージの削除 + $('#Process_' + procNum).removeAttr('data-confirm'); + } + + //プロセス名の取得 + let procName = $('#Process_' + procNum).text().replace(/^\s+/, ''); + console.log(`▷Process_${procNum} : ${procName} 処理開始`); + + //-------------------------------------------------------------------------------- + //プロセスごとの個別処理 + switch (procNum) { + case '1': //登録完了 + + break + case '2': //依頼終了 + + break + case '3': //保留 + + break; + case '4': //取消 + + break; + case '5': //依頼票登録 + + break; + case '6': //案件復帰 + + break; + case '7': //保留(営業積算) + + break; + case '8': //取消(営業積算) + + break; + case '9': //案件復帰(営業積算) + + break; + case '10': //テスト + + break; + } + + //プロセスの実行 + console.log(`▶Process_${procNum} : ${procName} 処理終了`); + $p.execProcess($('#Process_' + procNum)); + +} + +//プロセスボタン調整 +$p.ex.processButtonControl = function () { + $("button[id^='Process']").each(function () { + //close アイコンのボタンは非表示 + if ($(this).attr('data-icon') == 'ui-icon-close') { + $(this).hide(); + } + + //ui-icon-cancel アイコンのボタンはグレーアウト + if ($(this).attr('data-icon') == 'ui-icon-cancel') { + //グレーアウト + $(this).addClass('new-status-grey'); + + } else { + //その他のボタンはサイズ拡大 + $(this).addClass('processButtonSize'); + } + + //個別設定 + switch (this.id) { + case 'Process_1': //登録完了 + $(this).addClass('new-status-yellow'); + break; + case 'Process_2': //依頼終了 + $(this).addClass('new-status-red'); + break; + case 'Process_3': //保留 + //$(this).addClass('new-status-orange'); + break; + case 'Process_4': //取消 + //$(this).addClass('new-status-purple'); + break; + case 'Process_5': //依頼票登録 + $(this).addClass('new-status-blue'); + break; + case 'Process_6': //案件復帰 + $(this).addClass('new-status-orange'); + break; + case 'Process_7': //保留(営業積算) + //$(this).addClass('new-status-orange'); + break; + case 'Process_8': //取消(営業積算) + //$(this).addClass('new-status-purple'); + break; + case 'Process_9': //案件復帰(営業積算) + $(this).addClass('new-status-orange'); + break; + + } + + }); +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/scripts/90.スタートメッセージ表示.js b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/scripts/90.スタートメッセージ表示.js new file mode 100644 index 00000000..438fa502 --- /dev/null +++ b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/scripts/90.スタートメッセージ表示.js @@ -0,0 +1,35 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 90.スタートメッセージ表示 +@name : +@siteIds : 310406 +@siteTitles : Re①基本情報 +@disabled: false +*/ + +//スタートアップメッセージ表示 +$p.ex.startupMessage = function () { + + let count = 0; + for (message of messageData) { + //2つ目以降のメッセージの際にクリアフラグを0に設定。 + let clearFlag = 0;//count > 0 ? 0 : 1; + $p.ex.setMyMessage(message.colorCode, message.message, clearFlag); + count++; + } + + //開いたときにステータスごとに処理 + switch ($('#Results_Status').val()) { + case '100': //新規登録 + break; + case '200': //登録完了 + break; + case '900': //依頼終了 + break; + case '910': //保留 + break; + case '920': //取消 + break; + } +} diff --git a/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/scripts/99_更新履歴保存スクリプト.js b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/scripts/99_更新履歴保存スクリプト.js new file mode 100644 index 00000000..93dc8852 --- /dev/null +++ b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/scripts/99_更新履歴保存スクリプト.js @@ -0,0 +1,69 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 99_更新履歴保存スクリプト +@name : +@siteIds : 310406 +@siteTitles : Re①基本情報 +@disabled: false +*/ + +//変更内容を保存 +$p.ex.saveHistory = function () { + let history = ''; + let count = 0; + + //履歴に表示しない項目リスト + let excludeList = [ + 'Results_Timestamp', + 'Results_ClassK', + 'Results_ClassL', + 'Results_ClassM', + 'Results_ClassN', + 'Results_Class191', + 'Results_Class192', + 'Results_Class193', + 'Results_Class199', + 'Results_Class200', + 'Results_Description200' + ]; + + if ($p.data.MainForm) { + $p.set($('#Results_Description200'), ''); + + history = '◆ 変更内容 ◆\n'; + $.each($p.data.MainForm, function (index, val) { + if (index.startsWith('Results')) { + if (!excludeList.includes(index)) { + //項目名の取得 + let colName = $('label[for="' + index + '"]').text(); + let text; + //セレクトボックス判定 + if ($('#' + index + '.control-dropdown').length) { + //セレクトボックス処理 + if ($('#' + index).prop("multiple")) { + text = $('#' + index + '_ms span').eq(-1).text(); + } else { + text = $('#' + index + ' option:selected').text(); + } + } else if ($('#' + index + '.radio-value').length) { + //ラジオボタン処理 + text = val != '' ? $('label[for="' + index + val + '"').text() : ''; + } else { + //その他 + text = val; + } + + history += '▷ ' + colName + ' : ' + text + '\n'; + count++; + } + } + }); + + if (count) { + //console.log(history); + $p.set($('#Results_Description200'), history); + $p.set($('#Comments'), history); + } + } +} diff --git a/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/scripts/メッセージ管理.js b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/scripts/メッセージ管理.js new file mode 100644 index 00000000..d59bb486 --- /dev/null +++ b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/scripts/メッセージ管理.js @@ -0,0 +1,37 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : メッセージ管理 +@name : +@siteIds : 326371 +@siteTitles : メッセージ管理 +@disabled: false +*/ + +let pageLoading = 0; //ページロード中フラグ +//初期処理 +window.addEventListener('load', function () { + if (pageLoading == 0) { + console.log('Window load Event'); + $p.ex.onLoad(); + } +}); + +$p.events.on_editor_load = function () { + if (pageLoading == 0) { + console.log('on Editor Load'); + $p.ex.onLoad(); + } +} + +//---------------------------------------------------------------------- +$p.ex.onLoad = function () { + //ロード開始 + pageLoading = 1; + + //初期処理 + const colorCode = $('#Results_ClassC').val(); + const message = $('#Results_ClassD').val(); + $p.ex.setMyMessage(colorCode, message); +} + diff --git a/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/serverscripts/01_メッセージデータ取得.js b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/serverscripts/01_メッセージデータ取得.js new file mode 100644 index 00000000..72ee0b27 --- /dev/null +++ b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/serverscripts/01_メッセージデータ取得.js @@ -0,0 +1,60 @@ +/* +@config :next999.json +@filename : ${psFileBasename} +@title :01_メッセージデータ取得 +@name :01_メッセージデータ取得 +@siteIds : 310406 +@siteTitles : Re①基本情報 +@disabled: false +*/ +try { + //メッセージデータ取得 + getMessageData(); + +} catch (error) { + context.Log(error); +} + +//メッセージデータ取得 +function getMessageData() { + //メッセージデータを取得 + let data = { + "View": { + "ColumnFilterHash": { + "ClassA": "[\"" + model.SiteId + "\"]", + "ClassB": model.Status + }, + "ColumnSorterHash": { + "ClassA": "asc", + "ClassB": "asc", + "NumA": "asc" + } + } + } + + let results = items.Get(326371, JSON.stringify(data)); + if (results.length === 0) { + context.Log('メッセージデータが見つかりませんでした。'); + return; + } + + let messageData = [] + for (let item of results) { + const status = item.ClassB; + const colorCode = item.ClassC; + const message = item.ClassD; + messageData.push({ + "status": status, + "colorCode": colorCode, + "message": message, + }); + } + + //取得したメッセージデータをhiddenに格納 + if (messageData.length > 0) { + hidden.Add('messageData', JSON.stringify(messageData)); + } else { + context.Log('メッセージデータが見つかりませんでした。'); + } + +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/styles/01_読み取り専用スタイル.css b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/styles/01_読み取り専用スタイル.css new file mode 100644 index 00000000..7fc4a628 --- /dev/null +++ b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/styles/01_読み取り専用スタイル.css @@ -0,0 +1,134 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 01_読み取り専用スタイル +@name : +@siteIds : 310406 +@siteTitles : Re①基本情報 +@disabled: false +*/ +label.error { + pointer-events: none; + z-index: 100; + border-top: none !important; +} + +.code-readonly { + pointer-events: none; + background-color: lightgrey; + font-weight: bold; +} + +.code-readonly2, +.code-readonly2+button, +.code-readonly2+div.ui-icon, +.code-readonly3, +.code-readonly3+button, +.code-readonly3+div.ui-icon { + font-weight: bold; + + &:active { + pointer-events: none; + } + + a:not(.ui-spinner-button) { + pointer-events: auto; + } + +} + +.code-readonly2 select, +.code-readonly2 input, +.code-readonly2 button.ui-multiselect, +.code-readonly2 .control-markup, +.code-readonly2 .ui-spinner, +span[data-readonly="1"] { + pointer-events: none; + + border: dashed 1px black; + background-color: lightgray !important; + color: black !important; + + .ui-spinner-input { + border: none; + } +} + +.code-readonly3 select, +.code-readonly3 input, +.code-readonly3 button.ui-multiselect, +.code-readonly3 .control-markup, +.code-readonly3 .ui-spinner { + pointer-events: none; + + border: dashed 1px black; + + .ui-spinner-input { + border: none; + } +} + +.code-readonly2, +.code-readonly3, +.field-normal:has(span[data-readonly="1"]), +.field-wide:has(span[data-readonly="1"]) { + position: relative; + + &:hover::after { + content: "読取り専用です"; + position: absolute; + left: 120px; + top: calc(100% - 9px); + margin-top: 4px; + background: #00000080; + color: #fff; + padding: 4px 10px; + border-radius: 4px; + font-size: 12px; + font-weight: normal !important; + pointer-events: none; + z-index: 9999; + white-space: nowrap; + } +} + +.code-required, +select[data-validate-required="1"], +input[data-validate-required="1"] { + border: double 3px red !important; + + &+button.ui-multiselect { + border: double 3px red !important; + } + +} + +.field-normal:has(.code-required), +.field-wide:has(.code-required), +.field-normal:has(select[data-validate-required="1"]), +.field-wide:has(select[data-validate-required="1"]), +.field-normal:has(input[data-validate-required="1"]), +.field-wide:has(input[data-validate-required="1"]) { + position: relative; + + &:hover::after { + content: "入力必須です"; + position: absolute; + left: 120px; + top: calc(100% - 9px); + margin-top: 4px; + background: #ff000080; + color: #fff; + padding: 4px 10px; + border-radius: 4px; + font-size: 12px; + font-weight: normal !important; + pointer-events: none; + z-index: 9999; + white-space: nowrap; + } +} + +.error { + border: double 3px red !important; +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/styles/02_共通スタイル.css b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/styles/02_共通スタイル.css new file mode 100644 index 00000000..a64d409c --- /dev/null +++ b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/styles/02_共通スタイル.css @@ -0,0 +1,30 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 02_共通スタイル +@name : +@siteIds : 310406 +@siteTitles : Re①基本情報 +@disabled: false +*/ +/*見出しサイズ*/ +.field-section { + font-size: 1.5em !important; + font-weight: bold !important; + height: auto; +} + +/*項目の後ろの行間を少し狭める*/ +.field-normal { + height: 35px; +} + +.field-wide { + min-height: 35px; + padding: 0 10px 5px 0; +} + +/*コメントのある項目の高さだけ少し広げる*/ +div:has(.commentAdd).field-normal { + height: 50px; +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/styles/03_プロセスボタンの変更.css b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/styles/03_プロセスボタンの変更.css new file mode 100644 index 00000000..8998bcc6 --- /dev/null +++ b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/styles/03_プロセスボタンの変更.css @@ -0,0 +1,51 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 03_プロセスボタンの変更 +@name : +@siteIds : 310406 +@siteTitles : Re①基本情報 +@disabled: false +*/ + +.processButtonSize { + font-size: 1.2em !important; + font-weight: bold !important; +} + +/* +#Process_1, +#Process_2, +#Process_5 { + font-size: 1.5em; + font-weight: bold; +} + +#Process_1 { + background: yellow; + color: black; +} + +#Process_2 { + background: red; + color: white; +} + +#Process_3, +#Process_4, +#Process_6 { + background: grey; + color: black; +} + +#Process_5 { + background: blue; + color: white; +} + +#UpdateCommand { + background: lightgreen; + color: black !important; +} + +*/ \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/styles/04_特定項目のサイズ変更.css b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/styles/04_特定項目のサイズ変更.css new file mode 100644 index 00000000..4ee91dc6 --- /dev/null +++ b/pleasanter/develop/#営業積算/■1_310406_Re①基本情報/sites/styles/04_特定項目のサイズ変更.css @@ -0,0 +1,15 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 04_特定項目のサイズ変更 +@name : +@siteIds : 310406 +@siteTitles : Re①基本情報 +@disabled: false +*/ +#Results_ClassA, +label[for="Results_ClassA"] { + font-size: 1.5em !important; + font-weight: bold !important; + height: 2.2em !important; +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/connectionSetting/next999.json b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/connectionSetting/next999.json new file mode 100644 index 00000000..aeb831e2 --- /dev/null +++ b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/connectionSetting/next999.json @@ -0,0 +1,4 @@ +{ + "apiKey": "c38903157cbffc30961f50bc29d0991a6cd8af495ab3009b05c5f98e82b2e61b94ba2d5c0a48fc518b1cd74c9e427b01051a228f670f3c5282544dfbec93db87", + "url": "https://neo999.next-hd.net/pleasanter/" +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/scripts/01_基本スクリプト.js b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/scripts/01_基本スクリプト.js new file mode 100644 index 00000000..a4306fe4 --- /dev/null +++ b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/scripts/01_基本スクリプト.js @@ -0,0 +1,686 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 01_基本スクリプト +@name : +@siteIds : 310407 +@siteTitles : Re②依頼票 +@disabled: false +*/ + +let pageLoading = 0; +let apiKey = '6504c8a807677a3a576e10327f3c19876c55736ee45d4a845796b9e7f5e087bfd4bd0d8184863da8cf1733ca635111432ab334aea59102b06a96ee6d2c05190d'; + +//依頼上限表示 +let countLimit = [10, 3, 3, 10, 5, 5, 5, 10, 5, 5, 3]; + +let userList = JSON.parse($('#userList').val() || '[]'); //全従業員のユーザーデータ +let sekisanMemberList = JSON.parse($('#sekisanMemberList').val() || '[]'); +let sekisanDeptList = JSON.parse($('#sekisanDeptList').val() || '[]'); + +//メッセージデータ +let messageData = JSON.parse($('#messageData').val() || '[]'); +//---------------------------------------------------------------------- +//初期処理 +window.addEventListener('load', function () { + if (pageLoading == 0) { + console.log('Window load Event'); + $p.ex.onLoad(); + } +}); + +$p.events.on_editor_load = function () { + if (pageLoading == 0) { + console.log('on Editor Load'); + $p.ex.onLoad(); + } +} + + +//---------------------------------------------------------------------- +$p.ex.onLoad = function () { + //ロード開始 + pageLoading = 1; + + //初期処理 + $p.ex.init(); +} + +//初期処理 +$p.ex.init = function () { + console.log('initialize...'); + + //依頼項目登録処理の場合は何もしない + if ($('#Results_Class198').val() == '1') return; + + //一時保存ボタン処理1 + $('#UpdateCommand').empty(); + $('#UpdateCommand').html(`一時保存`); + $('#UpdateCommand').addClass('new-status-light-lime'); + + //コメント追加 + $('label[for="SectionFields5"]').append('※1つの依頼票で登録できる依頼項目の上限は10個までです'); + + //ブランドの横ににコメントを追加 + let commentDiv = document.createElement('div'); + commentDiv.className = 'brandComment'; + let commentBody = document.createElement('pre'); + commentBody.innerText = + `複数ブランド提案の場合はここでブランド変更し依頼をしてください。 +金額の取り違えには気を付けてください。`; + commentDiv.appendChild(commentBody); + $('#Results_Class012Field').after(commentDiv); + + //プロセスボタン調整 + $p.ex.processButtonControl(); + + //依頼項目ラベル + $p.ex.createLabelText(); + + //新規作成時のみ処理 + if ($p.action() == 'new') { + //直接新規作成したらエラー表示 + if (!$('#Results_ClassX').val()) { + $p.ex.setMyMessage('new-status-red', '【Re①基本情報】から【依頼票の登録】ボタンを押して作成してください'); + } else { + //祝日計算 + $p.ex.getHolidayTable(); + } + } else { + //スタートアップメッセージ表示 + $p.ex.startupMessage(); + + } + + //担当者一覧マージイベント + $('#Results_Class022,#Results_Class023,#Results_Class024,#Results_Class025,#Results_Class026,#Results_Class027,#Results_Class028').on('change', function () { + $p.ex.usersMarge1(); + }); + + //CC一覧変更マージイベント + $('#Results_Class031,#Results_Class032,#Results_Class033,#Results_Class034').on('change', function () { + $p.ex.usersMarge2(); + }); + + //事前相談を無しにしたら、事前相談者を消す + $p.on('change', 'CheckA', function () { + if ($('#Results_CheckA').prop('checked')) { + $p.set($('#Results_ClassJ'), 1);//事前相談あり + } else { + $p.set($('#Results_ClassJ'), 0);//事前相談なし + $p.set($('#Results_ClassK'), ''); + } + }); + + //アップ希望日 + $p.on('change', 'DateI', function () { + $p.clearMessage(); + $p.ex.upDateCheck(); + }); + + //Re③依頼項目ボタンは非表示 + $('button[data-from-site-id="' + $p.siteId() + '"]:contains("Re③依頼項目")').hide(); + + //現在の進捗の値によって項目を表示を切り替える + $p.ex.changeColor($('#Results_ClassO').val()); + $('input[name="Results_ClassO"]').on('change', function () { + $p.ex.changeColor($(this).val()); + if ($(this).val() == '0') { + $p.set($('#Results_ClassP'), ''); //現場の進捗状況 + $p.set($('#Results_ClassQ'), ''); //必要な見積金額 + $p.set($('#Results_DescriptionO'), ''); //問合せ経緯 + } + }); + + //読取り専用 + $('.code-readonly2 input').prop('tabindex', '-1'); + $('.code-readonly2 select').prop('tabindex', '-1'); + + //UP希望日 + $p.ex.upDateCheck(); + + //「依頼履歴」テーブルの読み込み完了後にボタン生成 + waitForElement('table[data-id="310405"]', function () { + console.log('依頼履歴テーブルが読み込まれました。'); + $p.ex.createReportButton(); + }); + + //セレクトボックスにプレースホルダーを追加 + addPlaceholderOption('Results_ClassK'); + +} + +//入力チェック前処理 +$p.events.before_validate_Create = function (args) { + if (!$('#Results_ClassX').val()) { + $p.ex.setMyMessage('new-status-red', '【Re①基本情報】から【依頼票の登録】ボタンを押して作成してください'); + return false; + } +} + + +//入力チェック後処理 +$p.events.after_validate = function (args) { + + if (!$('#Results_ClassT').val().length) { + $p.ex.setMyMessage('new-status-red', '通知先が入力されていません'); + focusOnColumn('ClassT', 'General'); + return false; + } + + //入力チェックエラーがある場合は処理を中止 + if ($('#Results_DateI').val()) { + if (!$p.ex.upDateCheck()) { + return false; + } + } else { + $p.ex.setMyMessage('new-status-red', 'アップ希望日を期限日より後ろに設定してください'); + focusOnColumn('ClassB', 'General'); + return false; + } + + + if ($('#Results_ClassJ').val() == 1 && $('#Results_ClassK').val() == '') { + $p.ex.setMyMessage('new-status-red', '営業積算課事前相談済みの場合、【事前相談者】を選択してください'); + focusOnColumn('ClassK', 'General'); + return false; + } + + //承認図後・着工中 の場合 + if ($('#Results_ClassO').val() == 1) { + if ($('#Results_ClassP').val() == '') { + $p.ex.setMyMessage('new-status-red', '【承認図後・着工中】物件の場合、【現在の進捗状況】を選択してください'); + focusOnColumn('ClassP', 'General'); + return false; + } + + if ($('#Results_ClassQ').val() == '') { + $p.ex.setMyMessage('new-status-red', '【承認図後・着工中】物件の場合、【必要な見積金額】を選択してください'); + focusOnColumn('ClassQ', 'General'); + return false; + } + + if ($('#Results_DescriptionO').val() == '') { + $p.ex.setMyMessage('new-status-red', '【承認図後・着工中】物件の場合、【問合せ経緯】を入力してください'); + focusOnColumn('DescriptionO', 'General'); + return false; + } + } + + //エリア-ブランド結合 + $p.ex.areaBrandName(); + + //担当者一覧マージ + $p.ex.usersMarge1(); + + //CC一覧マージ + $p.ex.usersMarge2(); + + //変更履歴の保存 + $p.ex.saveHistory(); + + + + //事前相談無しの場合、事前相談者を消す + if ($('#Results_ClassJ').val() == '0') { + $p.set($('#Results_ClassK'), ''); + } +} + +//親から子を作成した際に親への遷移を回避するスクリプト +$p.events.after_set_Create = function (args) { + //baseUrlを使ってitemsのidを含めたURLを取得 + itemsUrl = function (id) { + return $('#ApplicationPath').val() + 'items/' + id; + } + let response = args.json.filter(function (item, index) { + if (item.Method == 'Response') return true; + }); + //子テーブルに留まる + location.href = itemsUrl(response[0].Value); + + //初期処理 + $p.ex.init(); +} + +$p.events.after_set_Update = function (args) { + //初期処理 + $p.ex.init(); + + //一時保存ボタン処理2 + $('#UpdateCommand').empty(); + $('#UpdateCommand').html(` + + 一時保存`); + + + //一時保存メッセージ + let json8val = JSON.parse(args.json[8].Value); + if (json8val.Id == 'Updated') { + $p.ex.setMyMessage('new-status-light-lime', '依頼票の内容が一時保存されました'); + } + + //依頼項目登録ボタンが押されたら + if ($('#Results_Class198').val() == '1') { + $p.clearMessage(); + + // ウインドウ全体にモーダルを表示 + if ($('#global-modal').length === 0) { + const modalHtml = ` +
+
+ 処理中です。しばらくお待ちください... +
+
+ `; + $('body').append(modalHtml); + } + + $p.apiUpdate({ + 'id': $p.id(), + 'data': { + 'ApiVersion': 1.1, + 'ClassHash': { + 'Class198': '0' + } + }, + 'done': function (data) { + //フラグを0に戻してから依頼票ボタンを押す + $('button[data-from-site-id="' + $p.siteId() + '"]:contains("Re③依頼項目")').click(); + }, + 'fail': function (data) { + console.log(data); + } + }); + + } + +} + +//エリアとブランド名を合体させて格納する +$p.ex.areaBrandName = function () { + let area = $('#Results_Class011 option:selected').text(); + let brand = $('#Results_Class012 option:selected').text(); + + if (area && brand) { + $p.set($('#Results_ClassL'), area + ' ' + brand); + } +} + +//担当者一覧マージ +$p.ex.usersMarge1 = function () { + let users = []; + $('#Results_ClassE').val() && users.push($('#Results_ClassE').val()); //依頼者 + $('#Results_Class022').val() && users.push($('#Results_Class022').val()); //主担当営業 Class022 + $('#Results_Class023').val() && users.push($('#Results_Class023').val()); //副担当営業 Class023 + $('#Results_Class024').val() && users.push($('#Results_Class024').val()); //営業設計 Class024 + $('#Results_Class025').val() && users.push($('#Results_Class025').val()); //担当監督 Class025 + $('#Results_Class026').val() && users.push($('#Results_Class026').val()); //担当IC Class026 + $('#Results_Class027').val() && users.push($('#Results_Class027').val()); //管理設計 Class027 + $('#Results_Class028').val() && users.push($('#Results_Class028').val()); //所属長 Class028 + + $p.set($('#Results_Class191'), JSON.stringify(users)); + $p.ex.usersMarge3(); +} + +//CC一覧マージ +$p.ex.usersMarge2 = function () { + let users = []; + $('#Results_Class031').val() && users.push($('#Results_Class031').val()); //CC1 + $('#Results_Class032').val() && users.push($('#Results_Class032').val()); //CC2 + $('#Results_Class033').val() && users.push($('#Results_Class033').val()); //CC3 + $('#Results_Class034').val() && users.push($('#Results_Class034').val()); //CC4 + + $p.set($('#Results_Class192'), JSON.stringify(users)); + $p.ex.usersMarge3(); +} + +//担当者・CC一覧マージ +$p.ex.usersMarge3 = function () { + //担当者一覧とCC一覧をマージして保管 + let mergeAry = [...$('#Results_Class191').val(), ...$('#Results_Class192').val()]; + mergeAry.push($('#Results_ClassE').val()); + $p.set($('#Results_Class193'), JSON.stringify(mergeAry)); +} + +$p.ex.upDateCheck = function () { + if ($('#Results_DateI').val() != '') { + let dateI = new Date($('#Results_DateI').val()); + let dateJ = new Date($('#Results_DateJ').val()); + + //アップ希望日が期限日より手前の場合 + if (dateI.getTime() < dateJ.getTime()) { + $('#Results_DateI').addClass('dateI_alert'); + $p.ex.setMyMessage('new-status-red', 'アップ希望日は期限日より後ろに設定してください'); + focusOnColumn('ClassB', 'General'); + + return false; + } else { + $('#Results_DateI').removeClass('dateI_alert'); + + return true; + } + } +} + +//祝日判定テーブルの取得 +$p.ex.getHolidayTable = function () { + let holidays = []; + let today = new Date(); + let startDate = new Date(); + let endDate = new Date(); + + //30日前の日付を計算 + startDate.setDate(today.getDate() - 30); + //60日後の日付を計算 + endDate.setDate(today.getDate() + 60); + + //範囲指定 + let startDateStr = startDate.getFullYear() + '/' + + (startDate.getMonth() + 1).toString().padStart(2, '0') + '/' + + startDate.getDate().toString().padStart(2, '0') + ' 00:00:00'; + let endDateStr = endDate.getFullYear() + '/' + + (endDate.getMonth() + 1).toString().padStart(2, '0') + '/' + + endDate.getDate().toString().padStart(2, '0') + ' 23:59:59'; + + let filterDate = '["' + startDateStr + ',' + endDateStr + '"]'; + + //祝日テーブルからデータを取得 + $p.apiGet({ + 'id': 192267, + 'data': { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + 'View': { + 'ColumnFilterHash': { + 'DateA': filterDate, + }, + 'ColumnSorterHash': { + 'DateA': "asc", + } + } + }, + 'done': function (data) { + console.log(data); + $.each(data.Response.Data, function (index, value) { + let dateA = new Date(value.DateHash.DateA); + let holiday = dateA.getFullYear() + '/' + (dateA.getMonth() + 1).toString().padStart(2, '0') + '/' + dateA.getDate(); + holidays.push(holiday); + }); + + let limitDate = new Date(); + limitDate.setHours(0); + limitDate.setMinutes(0); + limitDate.setSeconds(0); + + //土日祝日を除く5日後をカウント + let count = 0; + while (count < 5) { + limitDate.setDate(limitDate.getDate() + 1); + let limitDateStr = limitDate.getFullYear() + '/' + (limitDate.getMonth() + 1).toString().padStart(2, '0') + '/' + limitDate.getDate().toString().padStart(2, '0'); + if (!(limitDate.getDay() == 0) && !(limitDate.getDay() == 6) && !(holidays.includes(limitDateStr))) { + count++; + } + } + + //let limitDateStr = limitDate.getFullYear() + "年" + (limitDate.getMonth() + 1) + "月" + limitDate.getDate() + "日以降"; + let limitDateStr = limitDate.getFullYear() + '/' + (limitDate.getMonth() + 1).toString().padStart(2, '0') + '/' + limitDate.getDate().toString().padStart(2, '0'); + $p.set($('#Results_DateJ'), limitDateStr); + + } + }); +} + +//進捗、見積、経緯の欄のクラス変更 +$p.ex.changeColor = function (flag) { + if (flag == 1) { + $('label[for="Results_ClassO1').addClass('fontColor_Red'); + + $('#Results_ClassPField').removeClass('display_none'); + $('#Results_ClassQField').removeClass('display_none'); + $('#Results_DescriptionOField').removeClass('display_none'); + + $('#Results_ClassPField').addClass('bgColor_Pink'); + $('#Results_ClassQField').addClass('bgColor_Pink'); + $('#Results_DescriptionOField').addClass('bgColor_Pink'); + } else { + $('label[for="Results_ClassO1').removeClass('fontColor_Red'); + + $('#Results_ClassPField').addClass('display_none'); + $('#Results_ClassQField').addClass('display_none'); + $('#Results_DescriptionOField').addClass('display_none'); + + $('#Results_ClassPField').removeClass('bgColor_Pink'); + $('#Results_ClassQField').removeClass('bgColor_Pink'); + $('#Results_DescriptionOField').removeClass('bgColor_Pink'); + } +} + +//要素が読み込まれるまで待機し、返す +function waitForElement(selector, callback, interval = 100, timeout = 5000) { + const startTime = Date.now(); + + const checkExist = setInterval(function () { + if ($(selector).length) { + clearInterval(checkExist); //要素が見つかったら停止 + callback(); + } else if (Date.now() - startTime > timeout) { + clearInterval(checkExist); //タイムアウト処理 + console.warn(`指定した要素 '${selector}' が ${timeout / 1000} 秒以内に見つかりませんでした。`); + } + }, interval); +} + +/* +[ + { + "TableName": "Users", + "View": { + "ColumnFilterExpressions": { + "UserId": "[Class193]", + } + } + } +] + +[ + { + "SiteId": "333888", + "View": { + "ColumnSorterHash": { + "ClassA": "asc" + } + }, + "Lookups": [ + {//管理番号 + "From": "ClassA", + "To": "ClassA", + "Type": 0, + "OverwriteForm": true + }, {//マスターシート + "From": "ClassY", + "To": "ClassY", + "Type": 0, + "OverwriteForm": true + }, {//契約コード + "From": "ClassZ", + "To": "ClassZ", + "Type": 0, + "OverwriteForm": true + }, {//施主名 + "From": "ClassK", + "To": "Class001", + "Type": 0, + "OverwriteForm": true + }, {//建上地 + "From": "Class010", + "To": "Class010", + "Type": 0, + "OverwriteForm": true + }, {//エリア + "From": "Class011", + "To": "Class011", + "Type": 0, + "OverwriteForm": true + }, {//契約ブランド + "From": "Class012", + "To": "Class012", + "Type": 0, + "OverwriteForm": true + }, {//防火指定 + "From": "Class013", + "To": "Class013", + "Type": 0, + "OverwriteForm": true + }, {//建物種類 + "From": "Class014", + "To": "Class014", + "Type": 0, + "OverwriteForm": true + }, {//承認図予定日 + "From": "Date001", + "To": "Date001", + "Type": 0, + "OverwriteForm": true + }, {//着工予定日 + "From": "Date002", + "To": "Date002", + "Type": 0, + "OverwriteForm": true + }, {//契約営業所 + "From": "Class021", + "To": "Class021", + "Type": 0, + "OverwriteForm": true + }, {//主担当営業 + "From": "Class022", + "To": "Class022", + "Type": 0, + "OverwriteForm": true + }, {//副担当営業 + "From": "Class023", + "To": "Class023", + "Type": 0, + "OverwriteForm": true + }, {//営業設計 + "From": "Class024", + "To": "Class024", + "Type": 0, + "OverwriteForm": true + }, {//担当監督 + "From": "Class025", + "To": "Class025", + "Type": 0, + "OverwriteForm": true + }, {//担当IC + "From": "Class026", + "To": "Class026", + "Type": 0, + "OverwriteForm": true + }, {//管理設計 + "From": "Class027", + "To": "Class027", + "Type": 0, + "OverwriteForm": true + }, {//所属長 + "From": "Class028", + "To": "Class028", + "Type": 0, + "OverwriteForm": true + }, {//CC1 + "From": "Class031", + "To": "Class031", + "Type": 0, + "OverwriteForm": true + }, {//CC2 + "From": "Class032", + "To": "Class032", + "Type": 0, + "OverwriteForm": true + }, {//CC3 + "From": "Class033", + "To": "Class033", + "Type": 0, + "OverwriteForm": true + }, {//CC4 + "From": "Class034", + "To": "Class034", + "Type": 0, + "OverwriteForm": true + }, {//その他の宛先 + "From": "ClassL", + "To": "ClassL", + "Type": 0, + "OverwriteForm": true + }, {//エリアブランド + "From": "Description001", + "To": "Description001", + "Type": 0, + "OverwriteForm": true + }, {//エリア記号 + "From": "ClassM", + "To": "ClassM", + "Type": 0, + "OverwriteForm": true + }, {//ブランド記号 + "From": "ClassN", + "To": "ClassN", + "Type": 0, + "OverwriteForm": true + }, {//担当者一覧 + "From": "Class191", + "To": "Class191", + "Type": 0, + "OverwriteForm": true + }, {//CC一覧 + "From": "Class192", + "To": "Class192", + "Type": 0, + "OverwriteForm": true + }, {//担当者・CC一覧 + "From": "Class193", + "To": "Class193", + "Type": 0, + "OverwriteForm": true + } + ] + } +] +*/ + +/** + * 指定したIDのタグのID + */ +function addPlaceholderOption(selectId) { + //値が空の場合、プレースホルダー的なoptionを追加 + const val = $(`#${selectId}`).val(); + if (!val) { + //1つ目のoptionのテキストを変更 + $(`#${selectId} option:first`).text('次から選択してください'); + + } + //console.log($(`#${selectId}`)); +} + +function focusOnColumn(columnName, fieldSet = 'General') { + + $(`a[href="#FieldSet${fieldSet}"]`).click(); + $("html, body").animate({ scrollTop: $(`#Results_${columnName}Field`).offset().top }, 100); + +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/scripts/02_プロセス処理.js b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/scripts/02_プロセス処理.js new file mode 100644 index 00000000..57051f2f --- /dev/null +++ b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/scripts/02_プロセス処理.js @@ -0,0 +1,89 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 02_プロセス処理 +@name : +@siteIds : 310407 +@siteTitles : Re②依頼票 +@disabled: false +*/ + +//プロセスごとに実行スクリプト +$p.ex.processScript = function (procNum) { + //プロセス共通処理 ------------------------------------------------------------------ + //確認メッセージの取得 + let confirmMessage = $('#Process_' + procNum).attr('data-confirm'); + //実行確認 + if (!confirm(confirmMessage)) { + //キャンセルなら終了 + console.log('Process_' + procNum + ' はキャンセルされました'); + return false; + } else { + //オリジナルの確認メッセージの削除 + $('#Process_' + procNum).removeAttr('data-confirm'); + } + + //プロセス名の取得 + let procName = $('#Process_' + procNum).text().replace(/^\s+/, ''); + console.log(`▷Process_${procNum} : ${procName} 処理開始`); + + //-------------------------------------------------------------------------------- + //プロセスごとの個別処理 + switch (procNum) { + case '1': //登録完了 + + break; + case '2': //積算依頼 + + break; + case '3': //積算受付 + + break; + case '4': //保留 + + break; + case '5': //取消 + + break; + case '6': //保留(営業積算) + + break; + case '7': //取消(営業積算) + + break; + } + + //プロセスの実行 + console.log(`▶Process_${procNum} : ${procName} 処理終了`); + $p.execProcess($('#Process_' + procNum)); + + +} + +//プロセスボタン調整 +$p.ex.processButtonControl = function () { + $("button[id^='Process']").each(function () { + //hideで始まるボタンの非表示 + if ($(this).attr('data-icon') == 'ui-icon-close') { + $(this).hide(); + } + + //hideで始まるボタンの非表示 + if ($(this).attr('data-icon') == 'ui-icon-cancel') { + //グレーアウト + $(this).addClass('new-status-grey'); + + } else { + //ボタンサイズ拡大 + $(this).addClass('processButtonSize'); + } + + //個別設定 + switch (this.id) { + case 'Process_1': + $(this).addClass('new-status-yellow'); + break; + } + + }); +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/scripts/03_依頼項目タブ.js b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/scripts/03_依頼項目タブ.js new file mode 100644 index 00000000..cec77ae9 --- /dev/null +++ b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/scripts/03_依頼項目タブ.js @@ -0,0 +1,436 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 03_依頼項目タブ +@name : +@siteIds : 310407 +@siteTitles : Re②依頼票 +@disabled: false +*/ + +//依頼項目数ラベル追加 +$p.ex.createLabelText = function () { + //依頼パターンにコメントを追加 + let commentDiv = document.createElement('div'); + commentDiv.className = 'patternComment'; + const patternTableHtml = ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
依頼パターン備考上限
件数
1.基本2~9に当てはまらない場合10
2.工法SE工法など3
3.基礎スラブ下げなど3
4.床材フローリング・フロアタイル・CFシートなど10
5.断熱材・バルコニー断熱材は遮⾳・界壁など含む5
6.外壁・軒天・タイルタイルは室内外の壁床いずれも含む5
7.内部建材階段‧⼱⽊‧建具‧床⽤造作材‧点検⼝など10
8.マトリックス5
9.造作家具‧造作建具‧造作洗⾯・他ミラー(姿⾒・⼀⾯鏡)・造作ガラス(造作窓)など含む5
`; + commentDiv.innerHTML = patternTableHtml; + $('#SectionFields5Container').append(commentDiv); + + + //「件」表示 + let countNumStr1 = document.createElement('span'); + countNumStr1.innerText = '件'; + countNumStr1.classList = 'koumokuStr'; + $('.numArea .container-normal').append(countNumStr1); + + //「件」表示 + let countNumStr2 = document.createElement('span'); + countNumStr2.innerText = '件'; + countNumStr2.classList = 'koumokuStr'; + $('.numArea2 .container-normal').append(countNumStr2); + + //「項目数」表示 + let koumokuStr1 = document.createElement('span'); + koumokuStr1.innerText = '項目数'; + koumokuStr1.classList = 'koumokuStr'; + $('.numArea .container-normal').prepend(koumokuStr1); + + //「項目数」表示 + let koumokuStr2 = document.createElement('span'); + koumokuStr2.innerText = '完了数'; + koumokuStr2.classList = 'koumokuStr'; + $('.numArea2 .container-normal').prepend(koumokuStr2); + +} + +//依頼項目追加ボタン +$p.ex.createIraiButton = function () { + //各項目の依頼リミット数 + let allCount = $('#Results_Num051').val(); //合計項目数 + const arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']; + + //依頼項目追加ボタン + for (i = 0; i < 9; i++) { + let j = (i + 1).toString().padStart(3, '0'); + let k = i + 21; + + let limit = countLimit[i]; + let countData = $('#Results_Num' + j).val(); + + let div1 = document.createElement('div'); + let button1 = document.createElement('button'); + button1.type = 'button'; + button1.id = 'addButton0' + k; + button1.innerHTML = '依頼項目追加'; + button1.setAttribute('onclick', '$p.ex.selectIraiPattern("' + arr[i] + '")'); //ボタンを押したときの処理 + button1.classList = 'koumokuAddButton'; + div1.append(button1); + $('#Results_Num0' + k + 'Field').after(div1); + + //全依頼数が10個以上の場合はボタン不可 + if (allCount >= 10) { + $('#addButton0' + k).button({ + icon: 'ui-icon-closethick', + disabled: true + }); + } else { + if (countData < limit) { + $('#addButton0' + k).button({ + icon: 'ui-icon-radio-on', + }); + } else { + //各項目ごとの依頼数 + $('#addButton0' + k).button({ + icon: 'ui-icon-closethick', + disabled: true + }); + } + } + } +} + +$p.ex.changeIraiCountColor = function () { + //各項目の依頼リミット数 + let allCount = $('#Results_Num051').val(); //合計項目数 + let clearCount = $('#Results_Num052').val(); //完了合計数 + + //合計数が1以上かつ完了数がそれ以下の場合 + if (allCount > 0) { + if (allCount > clearCount) { + $('#Results_Num051').addClass('iraiAri'); + + //完了している場合 + } else { + $('#Results_Num051').addClass('iraiComplete'); + $('#Results_Num052').addClass('iraiComplete'); + + } + } + + for (i = 1; i <= 9; i++) { + let countStr = i.toString().padStart(3, '0'); + let clearStr = (i + 20).toString().padStart(3, '0'); + let iraiCount = parseFloat($('#Results_Num' + countStr).val()); + let clearCount = parseFloat($('#Results_Num' + clearStr).val()); + + if (iraiCount > 0) { + if (iraiCount > clearCount) { + $('#Results_Num' + countStr).addClass('iraiAri'); + + } else { + $('#Results_Num' + countStr).addClass('iraiComplete'); + $('#Results_Num' + clearStr).addClass('iraiComplete'); + + } + } + } +} + +//依頼パターン切り替え +$p.ex.selectIraiPattern = function (patternNum) { + //パターン保存 + $p.set($('#Results_Class199'), patternNum); + + //依頼項目登録フラグ + $p.set($('#Results_Class198'), '1'); + + //更新ボタン + $('#UpdateCommand').click(); + +} + +$p.ex.createReportButton = function () { + //解析対象テーブル + const $table = $('table[data-id="310405"]'); + if ($table.length === 0) return; + + //ヘッダ行処理 + const $thead = $table.find('thead'); + if ($thead.length) { + const $headerRow = $thead.find('tr').first(); + //先頭にth追加 + const $th = $(''); + $headerRow.prepend($th); + + //ヘッダチェックボックス連動 + $th.find('input[type="checkbox"]').on('change', function () { + const checked = $(this).prop('checked'); + $table.find('tbody input[name="no3_report"]').prop('checked', checked); + }); + } + + //tbody行処理 + $table.find('tbody tr').each(function () { + const $row = $(this); + const $firstTd = $row.find('td').first(); + const value = $firstTd.text().trim(); + + //チェックボックス生成 + const $cbTd = $(''); + const $cb = $('').val(value); + + //tdクリックでチェックボックス連動 + $cbTd.on('click', function (e) { + if (e.target === $cb[0]) return; //チェックボックス自身は除外 + $cb.prop('checked', !$cb.prop('checked')); + }); + + $cbTd.append($cb); + $row.prepend($cbTd); + + //行クリック時の画面遷移無効化 + $row.on('click', function (e) { + //aタグと追加チェックボックス以外なら遷移無効 + if ($(e.target).is('a') || $(e.target).is('input[name="no3_report"]')) return; + e.preventDefault(); + e.stopPropagation(); + }); + //チェックボックスクリック時のイベントを無効化 + $cb.on('click', function (e) { + e.stopPropagation(); + }); + }); + + //ヘッダセルクリックで全選択/解除 + $table.find('thead th').first().on('click', function (e) { + if ($(e.target).is('input[type="checkbox"]')) return; + const $headerCb = $(this).find('input[type="checkbox"]'); + $headerCb.prop('checked', !$headerCb.prop('checked')).trigger('change'); + }); + + //帳票出力ボタンを追加 + const $reportBtn = $(''); + $reportBtn.button(); + $table.after($('
').append($reportBtn)); + + //帳票出力ボタンのクリックイベントに関数を紐付け + $('#no3-report-btn').on('click', function () { + //ここで取得した値を利用してレポート出力処理を実行 + if (confirm('依頼項目の帳票を出力しますか?')) { + $p.ex.getCheckedReportValues(); + } + + }); + + + const $reportMesssage = $('
▲チェックした依頼項目がまとめて帳票に出力されます▼
'); + $table.after($reportMesssage); +} + +$p.ex.getCheckedReportValues = async function () { + //共通キー項目 + const keys = [ + 'ResultId', + 'SiteId', + 'ItemTitle', + 'Title', + 'Body', + 'Status', + 'Manager', + 'Owner', + 'Locked', + 'Comments', + 'Creator', + 'CreatedTime', + 'Updator', + 'UpdatedTime', + 'Ver' + ] + + //チェックが入っているチェックボックスの値を取得 + const checkedValues = []; + $('input[name="no3_report"]:checked').each(function () { + checkedValues.push($(this).val()); + }); + + //取得した値をコンソールに表示(必要に応じて他の処理に利用) + //console.log('チェックされた値:', checkedValues); + let recordData = []; + + for (let recordId of checkedValues) { + const record = await $p.ex.getRecordData(recordId); + let param = {} + if (!record) { + console.error('Record data not found for ID:', recordId); + continue; + } + + //共通キー項目のデータをセット + for (let key of keys) { + param[key] = record[key]; + } + + //ClassHashの値をセット + Object.keys(record.ClassHash).forEach(function (key) { + param[key] = record.ClassHash[key]; + }); + + //Numhashの値をセット + Object.keys(record.NumHash).forEach(function (key) { + param[key] = record.NumHash[key]; + }); + + //DateHashの値をセット + Object.keys(record.DateHash).forEach(function (key) { + if (record.DateHash[key] != '1899-12-30T00:00:00') { + param[key] = dateFormatChange(record.DateHash[key]); + } + }); + + //DescriptionHashの値をセット + Object.keys(record.DescriptionHash).forEach(function (key) { + param[key] = record.DescriptionHash[key]; + }); + + //CheckHashの値をセット + Object.keys(record.CheckHash).forEach(function (key) { + param[key] = record.CheckHash[key]; + }); + + //日付変換 + param.CreatedTime = dateFormatChange(param.CreatedTime); + param.UpdatedTime = dateFormatChange(param.UpdatedTime); + + //UserList変換 + param.Manager = checkUserList(param.Manager); + param.Owner = checkUserList(param.Owner); + param.Creator = checkUserList(param.Creator); + param.Updator = checkUserList(param.Updator); + + //UserListの値をチェック + param.ClassE = checkUserList(param.ClassE); + param.ClassF = checkUserList(param.ClassF); + param.ClassK = checkUserList(param.ClassK); + param.ClassT = checkUserList(param.ClassT); + + param.Class111 = checkUserList(param.Class111); + param.Class113 = checkUserList(param.Class113); + param.Class116 = checkUserList(param.Class116); + + param.Class132 = checkUserList(param.Class132); + param.Class134 = checkUserList(param.Class134); + param.Class136 = checkUserList(param.Class136); + + param.Class141 = checkUserList(param.Class141); + param.Class151 = checkUserList(param.Class151); + param.Class153 = checkUserList(param.Class153); + + param.Class191 = checkUserList(param.Class191); + param.Class192 = checkUserList(param.Class192); + param.Class193 = checkUserList(param.Class193); + + param.Class031 = checkUserList(param.Class031); + param.Class032 = checkUserList(param.Class032); + param.Class033 = checkUserList(param.Class033); + param.Class034 = checkUserList(param.Class034); + + param.Class022 = checkUserList(param.Class022); + param.Class023 = checkUserList(param.Class023); + param.Class024 = checkUserList(param.Class024); + param.Class025 = checkUserList(param.Class025); + param.Class026 = checkUserList(param.Class026); + param.Class027 = checkUserList(param.Class027); + param.Class028 = checkUserList(param.Class028); + + + recordData.push(param); + + } + + //console.log('取得したレコードデータ:', recordData); + + //return checkedValues; //必要に応じて値を返す + createReport('326335', recordData); + +}; + +//ユーザーリストからユーザー名を返す +function checkUserList(value) { + try { + let users = JSON.parse(value); + let userNames = []; + for (let user of users) { + if (userList[user]) { + userNames.push(userList[user].name); + } else { + userNames.push(user); //ユーザーが見つからない場合はそのまま値を使用 + } + } + + return JSON.stringify(userNames); //値が文字列でない場合はそのまま返す + } catch (error) { + let userName = userList[value] ? userList[value].name : value; //ユーザーが見つからない場合はそのまま値を使用 + + return userName; //値が文字列でない場合はそのまま返す + } +} + +//日付フォーマット変換関数 +function dateFormatChange(dateStr) { + let dateObj = new Date(dateStr); + + //時分秒が00:00:00の場合は日付のみを返す + if (dateObj.getHours() === 0 && dateObj.getMinutes() === 0 && dateObj.getSeconds() === 0) { + //YYYY/MM/DD形式で返す + return dateObj.toLocaleDateString('ja-JP'); //日本語のロケールで日付をフォーマット + } else { + //YYYY/MM/DD HH:mm:ss形式で返す + return dateObj.toLocaleString('ja-JP', { timeZone: 'Asia/Tokyo' }); //日本語のロケールで日付と時間をフォーマット + } +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/scripts/90_スタートメッセージ表示.js b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/scripts/90_スタートメッセージ表示.js new file mode 100644 index 00000000..883e5ac0 --- /dev/null +++ b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/scripts/90_スタートメッセージ表示.js @@ -0,0 +1,70 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 90_スタートメッセージ表示 +@name : +@siteIds : 310407 +@siteTitles : Re②依頼票 +@disabled: false +*/ + +//スタートアップメッセージ表示 +$p.ex.startupMessage = function () { + let count = 0; + for (message of messageData) { + //2つ目以降のメッセージの際にクリアフラグを0に設定。 + let clearFlag = 0;//count > 0 ? 0 : 1; + $p.ex.setMyMessage(message.colorCode, message.message, clearFlag); + count++; + } + + //開いたときに表示するメッセージ一覧 + switch ($('#Results_Status').val()) { + case '100': //新規登録 + //Re③依頼項目タブ色変更 + $('a[href="#FieldSetTab1"]').addClass('status-grey'); + break; + case '200': //登録完了 + //Re③依頼項目タブ色変更 + $('a[href="#FieldSetTab1"]').addClass('status-yellow'); + + //依頼項目ボタン + $p.ex.createIraiButton(); + break; + case '300': //積算依頼 + //Re③依頼項目タブ色変更 + $('a[href="#FieldSetTab1"]').addClass('status-orange'); + + break; + case '400': //積算受付 + //Re③依頼項目タブ色変更 + $('a[href="#FieldSetTab1"]').addClass('status-purple'); + + break; + case '500': //積算対応中 + //Re③依頼項目タブ色変更 + $('a[href="#FieldSetTab1"]').addClass('status-green'); + + break; + case '800': //一部完了 + //Re③依頼項目タブ色変更 + $('a[href="#FieldSetTab1"]').addClass('status-black'); + + break; + case '900': //完了 + //Re③依頼項目タブ色変更 + $('a[href="#FieldSetTab1"]').addClass('status-blue'); + + break; + case '910': //保留 + //Re③依頼項目タブ色変更 + $('a[href="#FieldSetTab1"]').addClass('status-grey'); + + break; + case '920': //取消 + //Re③依頼項目タブ色変更 + $('a[href="#FieldSetTab1"]').addClass('status-grey'); + + break; + } +} diff --git a/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/scripts/999_汎用帳票出力スクリプト.js b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/scripts/999_汎用帳票出力スクリプト.js new file mode 100644 index 00000000..99ee3f61 --- /dev/null +++ b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/scripts/999_汎用帳票出力スクリプト.js @@ -0,0 +1,149 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 999_汎用帳票出力スクリプト +@name : +@siteIds : 310407 +@siteTitles : Re②依頼票 +@disabled: false +*/ + +//999_汎用帳票出力スクリプト + + +async function createReport(templateId, recordData = [], templateType = 'xlsx') { + //templateIdで帳票データを取得 + const templateData = await $p.ex.getRecordData(templateId); + if (!templateData) { + console.error('Report data not found for ID:', templateId); + return; + } else if (templateData.AttachmentsHash.AttachmentsA.length === 0) { + console.error('No attachments found for template ID:', templateId); + return; + } + const templateName = templateData.ClassHash.ClassA; + const templateGuid = templateData.AttachmentsHash.AttachmentsA[0].Guid; + + //Guidを使ってバイナリデータを取得 + const templateFile = await $p.ex.getTemplateFile(templateGuid); + const templateBinary = await base64ToArrayBuffer(templateFile.Base64); + + //XlsPopulate Workbookを作成 + let workbook = await XlsxPopulate.fromDataAsync(templateBinary); + //paramシート取得 + let param = workbook.sheet('param'); + if (!param) { + console.error('paramシートが見つかりません'); + return; + } + + //レコードデータを取得 + let col = 2; + for (let record of recordData) { + Object.keys(record).forEach(function (key) { + param = setValueToSheet(param, col, key, record[key]); + }); + col++; + } + + const blob = await workbook.outputAsync(); + //return blob; + + //年月日時分秒の文字列を生成 + const now = new Date(); + const dateStr = now.getFullYear() + ('0' + (now.getMonth() + 1)).slice(-2) + ('0' + now.getDate()).slice(-2) + + '_' + ('0' + now.getHours()).slice(-2) + ('0' + now.getMinutes()).slice(-2) + ('0' + now.getSeconds()).slice(-2); + + if (templateType === 'xlsx') { + //Blobをダウンロード + saveAs(blob, templateName + '_' + dateStr + '.' + templateFile.Extension); + + } else if (templateType === 'pdf') { + //PDF出力 + //const pdfBlob = await workbook.outputAsync('application/pdf'); + //saveAs(pdfBlob, templateName + '_' + dateStr + '.pdf'); + } + +} + +//A列からキーを検索し、該当する行の指定した列に値をセットする関数 +function setValueToSheet(sheet, col, key, value) { + //左端の列を下まで走査する + const lastRow = sheet.usedRange().endCell('down').rowNumber(); + + for (let row = 1; row <= lastRow; row++) { + const keyCell = sheet.cell(row, 1); + const keyValue = keyCell.value(); + if (!keyValue) continue; + if (keyValue === key) { + sheet.cell(row, col).value(value); + break; + } + } + + return sheet; +} + + +//base64エンコードされたバイナリデータをArrayBufferに変換 +async function base64ToArrayBuffer(base64) { + const binaryString = atob(base64); + const len = binaryString.length; + const bytes = new Uint8Array(len); + for (let i = 0; i < len; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + return bytes.buffer; +} + +//プリザンターから1件のレコードデータを取得する関数 +$p.ex.getRecordData = async function (id) { + //もしidが空鳴らんなら、空のオブジェクトを返す + if (!id) { + return {}; + } + + //プリザンターへゲット処理 + const url = 'https://' + location.hostname + '/pleasanter/api/items/' + id + '/get' + + const json = { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + } + + const res = await fetch(url, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(json) + }); + + const resData = await res.json(); + //console.log(resData); + return resData.Response.Data[0]; +} + +//プリザンターから1件の添付ファイルのbase64データを取得する関数 +$p.ex.getTemplateFile = async function (guid) { + //もしidが空鳴らんなら、空のオブジェクトを返す + if (!guid) { + return {}; + } + + //プリザンターへゲット処理 + const url = 'https://' + location.hostname + '/pleasanter/api/binaries/' + guid + '/get' + + const json = { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + } + + const res = await fetch(url, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(json) + }); + + const resData = await res.json(); + //console.log(resData); + return resData.Response; +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/scripts/99_更新履歴保存スクリプト.js b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/scripts/99_更新履歴保存スクリプト.js new file mode 100644 index 00000000..f8b91c44 --- /dev/null +++ b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/scripts/99_更新履歴保存スクリプト.js @@ -0,0 +1,70 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 99_更新履歴保存スクリプト +@name : +@siteIds : 310407 +@siteTitles : Re②依頼票 +@disabled: false +*/ + +//変更内容を保存 +$p.ex.saveHistory = function () { + let history = ''; + let count = 0; + + //履歴に表示しない項目リスト + let excludeList = [ + 'Results_Timestamp', + 'Results_ClassL', + 'Results_ClassM', + 'Results_ClassN', + 'Results_Class191', + 'Results_Class192', + 'Results_Class193', + 'Results_Class198', + 'Results_Class199', + 'Results_Class200', + 'Results_NumZ', + 'Results_Description200' + ]; + + if ($p.data.MainForm) { + $p.set($('#Results_Description200'), ''); + + history = '◆ 変更内容 ◆\n'; + $.each($p.data.MainForm, function (index, val) { + if (index.startsWith('Results')) { + if (!excludeList.includes(index)) { + //項目名の取得 + let colName = $('label[for="' + index + '"]').text(); + let text; + //セレクトボックス判定 + if ($('#' + index + '.control-dropdown').length) { + //セレクトボックス処理 + if ($('#' + index).prop("multiple")) { + text = $('#' + index + '_ms span').eq(-1).text(); + } else { + text = $('#' + index + ' option:selected').text(); + } + } else if ($('#' + index + '.radio-value').length) { + //ラジオボタン処理 + text = val != '' ? $('label[for="' + index + val + '"').text() : ''; + } else { + //その他 + text = val; + } + + history += '▷ ' + colName + ' : ' + text + '\n'; + count++; + } + } + }); + + if (count) { + //console.log(history); + $p.set($('#Results_Description200'), history); + $p.set($('#Comments'), history); + } + } +} diff --git a/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/serverscripts/01.原価閲覧メンバー照会.js b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/serverscripts/01.原価閲覧メンバー照会.js new file mode 100644 index 00000000..609a4fc3 --- /dev/null +++ b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/serverscripts/01.原価閲覧メンバー照会.js @@ -0,0 +1,160 @@ +/* +@config :next999.json +@filename : ${psFileBasename} +@title :01.原価閲覧メンバー照会 +@name :01.原価閲覧メンバー照会 +@siteIds : 310407 +@siteTitles : Re②依頼票 +@disabled: false +*/ + +//原価閲覧メンバーを紹介し、リストを返すサーバースクリプト +try { + //【営業積算】原価閲覧グループ 63 のメンバーを取得 + getSekisanMenberList(); + + //全従業員グループ 27 のメンバーを取得 + getUserList(); + + //マスターシートからデータを取得し、一部を格納する + getMSSdata(); + + //メッセージデータを取得 + getMessageData(); + +} catch (error) { + context.Log(error); +} + +function getMSSdata() { + try { + let mssDataId = model.ClassY; + if (!mssDataId) { + context.Log('マスターシートのデータIDが設定されていません。'); + return; + } else { + context.Log(`マスターシートのデータID: ${mssDataId}`); + let records = items.Get(mssDataId); + + hidden.Add('mssData_Brand', records[0].Class033); + hidden.Add('mssData_Series', records[0].Class035); + } + + } catch (error) { + context.Log(error); + + } + +} + +function getSekisanMenberList() { + try { + //【営業積算】原価閲覧グループ 63 のメンバーを取得 + let group = groups.Get(63); + let memberIds = [] + let deptIds = [] + + for (let member of group.GetMembers()) { + if (member.UserId == 0) { + deptIds.push(member.DeptId); + } else { + memberIds.push(member.UserId); + } + //context.Log(`${member.DeptId},${member.UserId}`); + } + + //【営業積算】原価閲覧グループの組織とメンバーをHTML隠し要素に出力 + hidden.Add('sekisanMemberList', JSON.stringify(memberIds)); + hidden.Add('sekisanDeptList', JSON.stringify(deptIds)); + } catch (error) { + context.Log(error); + + } + +} + +//ユーザー情報をHTML内に格納する関数 +function getUserList() { + try { + //--------------------------------------------------------------------- + group = groups.Get(27); //全従業員グループ27 + let userList = {}; + + //ユーザー情報を取得してリストを作成 + for (let member of group.GetMembers()) { + //ユーザー情報情報取得 + let user = users.Get(member.UserId); + let rows = extendedSql.ExecuteTable('GetUserMailAddresses', '{"OwnerId": ' + user.UserId + '}'); + let mailAddrs = []; + + for (let row of rows) { + mailAddrs.push(row.MailAddress); + } + + let dept = depts.Get(user.DeptId); + let deptName = dept ? dept.DeptName : ''; + + userList[user.UserId] = { + userId: user.UserId, + name: user.Name, + deptId: user.DeptId, + deptName: deptName, + mailAddresses: mailAddrs.join(','), + //deptName: dept.Name + } + + } + + //context.Log(`ユーザーリスト: ${JSON.stringify(userList)}`); + // ユーザーリストをHTML隠し要素に出力 + hidden.Add('userList', JSON.stringify(userList)); + } catch (error) { + context.Log(error); + + } + +} + +//メッセージデータ取得 +function getMessageData() { + //メッセージデータを取得 + let data = { + "View": { + "ColumnFilterHash": { + "ClassA": "[\"" + model.SiteId + "\"]", + "ClassB": model.Status + }, + "ColumnSorterHash": { + "ClassA": "asc", + "ClassB": "asc", + "NumA": "asc" + } + } + } + + let results = items.Get(326371, JSON.stringify(data)); + if (results.length === 0) { + context.Log('メッセージデータが見つかりませんでした。'); + return; + } + + let messageData = [] + for (let item of results) { + const status = item.ClassB; + const colorCode = item.ClassC; + const message = item.ClassD; + messageData.push({ + "status": status, + "colorCode": colorCode, + "message": message, + }); + } + + //取得したメッセージデータをhiddenに格納 + if (messageData.length > 0) { + hidden.Add('messageData', JSON.stringify(messageData)); + } else { + context.Log('メッセージデータが見つかりませんでした。'); + } + +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/styles/01_読み取り専用スタイル.css b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/styles/01_読み取り専用スタイル.css new file mode 100644 index 00000000..43ccae54 --- /dev/null +++ b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/styles/01_読み取り専用スタイル.css @@ -0,0 +1,134 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 01_読み取り専用スタイル +@name +@siteIds : 310407 +@siteTitles : Re②依頼票 +@disabled: false +*/ +label.error { + pointer-events: none; + z-index: 100; + border-top: none !important; +} + +.code-readonly { + pointer-events: none; + background-color: lightgrey; + font-weight: bold; +} + +.code-readonly2, +.code-readonly2+button, +.code-readonly2+div.ui-icon, +.code-readonly3, +.code-readonly3+button, +.code-readonly3+div.ui-icon { + font-weight: bold; + + &:active { + pointer-events: none; + } + + a:not(.ui-spinner-button) { + pointer-events: auto; + } + +} + +.code-readonly2 select, +.code-readonly2 input, +.code-readonly2 button.ui-multiselect, +.code-readonly2 .control-markup, +.code-readonly2 .ui-spinner, +span[data-readonly="1"] { + pointer-events: none; + + border: dashed 1px black; + background-color: lightgray !important; + color: black !important; + + .ui-spinner-input { + border: none; + } +} + +.code-readonly3 select, +.code-readonly3 input, +.code-readonly3 button.ui-multiselect, +.code-readonly3 .control-markup, +.code-readonly3 .ui-spinner { + pointer-events: none; + + border: dashed 1px black; + + .ui-spinner-input { + border: none; + } +} + +.code-readonly2, +.code-readonly3, +.field-normal:has(span[data-readonly="1"]), +.field-wide:has(span[data-readonly="1"]) { + position: relative; + + &:hover::after { + content: "読取り専用です"; + position: absolute; + left: 120px; + top: calc(100% - 9px); + margin-top: 4px; + background: #00000080; + color: #fff; + padding: 4px 10px; + border-radius: 4px; + font-size: 12px; + font-weight: normal !important; + pointer-events: none; + z-index: 9999; + white-space: nowrap; + } +} + +.code-required, +select[data-validate-required="1"], +input[data-validate-required="1"] { + border: double 3px red !important; + + &+button.ui-multiselect { + border: double 3px red !important; + } + +} + +.field-normal:has(.code-required), +.field-wide:has(.code-required), +.field-normal:has(select[data-validate-required="1"]), +.field-wide:has(select[data-validate-required="1"]), +.field-normal:has(input[data-validate-required="1"]), +.field-wide:has(input[data-validate-required="1"]) { + position: relative; + + &:hover::after { + content: "入力必須です"; + position: absolute; + left: 120px; + top: calc(100% - 9px); + margin-top: 4px; + background: #ff000080; + color: #fff; + padding: 4px 10px; + border-radius: 4px; + font-size: 12px; + font-weight: normal !important; + pointer-events: none; + z-index: 9999; + white-space: nowrap; + } +} + +.error { + border: double 3px red !important; +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/styles/02_共通スタイル.css b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/styles/02_共通スタイル.css new file mode 100644 index 00000000..8ab7916a --- /dev/null +++ b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/styles/02_共通スタイル.css @@ -0,0 +1,30 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 02_共通スタイル +@name +@siteIds : 310407 +@siteTitles : Re②依頼票 +@disabled: false +*/ +/*見出しサイズ*/ +.field-section { + font-size: 1.5em !important; + font-weight: bold !important; + height: auto; +} + +/*項目の後ろの行間を少し狭める*/ +.field-normal { + height: 35px; +} + +.field-wide { + min-height: 35px; + padding: 0 10px 5px 0; +} + +/*コメントのある項目の高さだけ少し広げる*/ +div:has(.commentAdd).field-normal { + height: 50px; +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/styles/03_プロセスボタンの変更.css b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/styles/03_プロセスボタンの変更.css new file mode 100644 index 00000000..0bac6547 --- /dev/null +++ b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/styles/03_プロセスボタンの変更.css @@ -0,0 +1,14 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 03_プロセスボタンの変更 +@name +@siteIds : 310407 +@siteTitles : Re②依頼票 +@disabled: false +*/ + +.processButtonSize { + font-size: 1.2em !important; + font-weight: bold !important; +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/styles/04_項目のサイズ変更.css b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/styles/04_項目のサイズ変更.css new file mode 100644 index 00000000..75507345 --- /dev/null +++ b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/styles/04_項目のサイズ変更.css @@ -0,0 +1,69 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 04_項目のサイズ変更 +@name +@siteIds : 310407 +@siteTitles : Re②依頼票 +@disabled: false +*/ +#Results_ClassB, +label[for="Results_ClassB"] { + font-size: 1.5em !important; + font-weight: bold !important; + height: 2.2em !important; +} + +label[for="Results_ClassO"], +label[for="Results_ClassP"], +label[for="Results_ClassQ"], +label[for="Results_DescriptionO"] { + font-size: 1.2em !important; + font-weight: bold !important; + color: red; +} + +.container-radio label { + font-size: 1.2em !important; + font-weight: bold !important; +} + +label[for="Results_DateJ"] { + font-weight: bold; + color: red; +} + +#Results_DateI { + font-weight: bold; + font-size: 1.2em; + background-color: lightblue; +} + + +#Results_DateJ { + font-weight: bold; + font-size: 1.2em; + background-color: red !important; + color: white !important; +} + +.dateI_alert { + background-color: red !important; + color: white !important; +} + +#Results_DescriptionOField { + margin-bottom: 10px; +} + +.brandComment { + font-size: 0.9em !important; + font-weight: bold !important; + color: white !important; + background-color: black !important; + width: 30%; + display: inline-block; + float: left; + padding: 10px; + border-radius: 10px; +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/styles/05_背景変更処理.css b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/styles/05_背景変更処理.css new file mode 100644 index 00000000..2041c574 --- /dev/null +++ b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/styles/05_背景変更処理.css @@ -0,0 +1,22 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 05_背景変更処理 +@name +@siteIds : 310407 +@siteTitles : Re②依頼票 +@disabled: false +*/ + +.bgColor_Pink { + background-color: #ffe5e5; + display: block; +} + +.display_none { + display: none; +} + +.fontColor_Red { + color: red; +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/styles/06_依頼項目数表示調整.css b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/styles/06_依頼項目数表示調整.css new file mode 100644 index 00000000..aee196c9 --- /dev/null +++ b/pleasanter/develop/#営業積算/■2_310407_Re②依頼票/sites/styles/06_依頼項目数表示調整.css @@ -0,0 +1,177 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 06_依頼項目数表示調整 +@name +@siteIds : 310407 +@siteTitles : Re②依頼票 +@disabled: false +*/ +#SectionFields5 { + width: 70%; +} + +.patternComment { + font-weight: bold !important; + width: 30%; + display: inline-block; + padding: 10px; + margin-left: 20px; + border-radius: 10px; +} + +.patternTable { + border: 1px solid grey; + border-collapse: collapse; + width: 100%; + + td { + border: 1px solid grey; + background-color: whitesmoke; + color: black; + font-size: 1.2em; + padding: 2px 5px; + white-space: nowrap; + } + + th { + border: 1px solid grey; + background-color: darkblue; + color: white; + font-weight: bold; + white-space: nowrap; + text-align: center; + vertical-align: middle; + padding: 5px 5px; + } + + td:first-child { + background-color: lightcyan; + font-weight: bold; + color: black; + } + + td:last-child { + background-color: lightyellow; + color: red; + text-align: center; + font-size: 1.2em; + font-weight: bold; + } +} + +.numArea { + width: 350px; + margin-left: 20px; + padding-right: 0px; + + .field-label { + width: 200px; + margin-right: -200px; + text-align-last: left; + + padding-top: 4px; + padding-left: 10px; + + label { + font-size: 1.1em; + font-weight: bold; + } + + } + + .field-control { + border-bottom: 1px dashed darkgray; + + .container-normal { + margin-left: 180px; + } + } +} + +.size130 { + label { + font-size: 1.3em; + font-weight: bold !important; + } + + input { + font-size: 1.3em; + font-weight: bold !important; + width: 85px !important; + height: 27px !important; + } + + span { + height: 35px; + width: 120px; + } + + +} + +.numArea2 { + width: 170px; + padding-right: 0px; + + .field-label { + display: none; + } + + .field-control { + border-bottom: 1px dashed darkgray; + + .container-normal { + margin-left: 0px; + } + } +} + +.koumokuStr { + font-size: 0.9em; + float: left; + margin: 7px; +} + +.limitStr { + font-size: 0.9em; + float: left; + margin: 7px; + font-weight: bold; + color: red; +} + + +.parent:has(.iraiAri) { + background-color: yellow; +} + +.parent:has(.iraiComplete) { + background-color: lightblue; +} + +.iraiAri, +.iraiComplete { + font-weight: bold; +} + +.koumokuAddButton { + margin: 1px 1px 1px 5px; + float: left; + pointer-events: auto; + font-weight: bold; + color: white; + background: blue !important; + + &:hover { + color: yellow !important; + } + +} + +.commentAdd2 { + font-size: 0.7em; + font-weight: bold; + color: red; + margin-left: 10px; +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/colorSample.html b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/colorSample.html new file mode 100644 index 00000000..08380e2a --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/colorSample.html @@ -0,0 +1,103 @@ + + + + + + 色見本をExcelに出力(背景色・文字色適用) + + + + + + + + + + \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/connectionSetting/next999.json b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/connectionSetting/next999.json new file mode 100644 index 00000000..aeb831e2 --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/connectionSetting/next999.json @@ -0,0 +1,4 @@ +{ + "apiKey": "c38903157cbffc30961f50bc29d0991a6cd8af495ab3009b05c5f98e82b2e61b94ba2d5c0a48fc518b1cd74c9e427b01051a228f670f3c5282544dfbec93db87", + "url": "https://neo999.next-hd.net/pleasanter/" +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/01_基本スクリプト.js b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/01_基本スクリプト.js new file mode 100644 index 00000000..a5058dcf --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/01_基本スクリプト.js @@ -0,0 +1,960 @@ +/* +@config :next999.json +@filename : ${psFileBasename} +@title : 01_基本スクリプト +@name : +@siteIds : 310405 +@siteTitles : Re③依頼項目 +@disabled: false +*/ + +let pageLoading = 0; +let apiKey = '6504c8a807677a3a576e10327f3c19876c55736ee45d4a845796b9e7f5e087bfd4bd0d8184863da8cf1733ca635111432ab334aea59102b06a96ee6d2c05190d'; +let userList = JSON.parse($('#userList').val() || '[]'); //全従業員のユーザーデータ + +//メッセージデータ +let messageData = JSON.parse($('#messageData').val() || '[]'); + +//組織、ユーザによって処理を分岐するフラグ +let eSekisanFlag = false; +let jSekisanFlag = false; + +//特権部署のID +let eSekisanDeptId = '25'; +let jSekisanDeptId = '26'; + +//部材リストのデータ +let partsData; + +//mssData +let mssData_Brand = $('#mssData_Brand').val() || ''; +let mssData_Series = $('#mssData_Series').val() || ''; + +//---------------------------------------------------------------------- +//初期処理 +window.addEventListener('load', function () { + if (pageLoading == 0) { + console.log('Window load Event'); + $p.ex.onLoad(); + } +}); + +$p.events.on_editor_load = function () { + if (pageLoading == 0) { + console.log('on Editor Load'); + $p.ex.onLoad(); + } +} + +//---------------------------------------------------------------------- +$p.ex.onLoad = function () { + //ロード開始 + pageLoading = 1; + + //初期処理 + $p.ex.init(); +} + +//初期処理 +$p.ex.init = function () { + console.log('initialize...'); + + //一時保存ボタン処理1 + $('#UpdateCommand').empty(); + $('#UpdateCommand').html(`一時保存`); + $('#UpdateCommand').addClass('new-status-light-lime'); + + //部材リスト検索欄にコメントを追加 + $('#SectionFields18').css('width', '70%'); + let commentDiv = document.createElement('div'); + commentDiv.className = 'buzaiComment'; + let commentBody = document.createElement('pre'); + commentBody.innerText = + `左から部材リストを検索してください。 +選択した部材の詳細を確認してください。 +【問合せ不要】となっている部材については、問合せは不要となります。算出法を確認し、金額をご確認ください。 +【使用不可】となっている部材は、使用できません。 + +メーカーや部材リストに表示されない部材は、下記の依頼項目に詳細を入力し、お問い合わせください。 +`; + commentDiv.appendChild(commentBody); + $('#SectionFields18Container').append(commentDiv); + + //コメント追加 + $('label[for="SectionFields5"]').append('※変更不可'); + $('label[for="SectionFields6"]').append('※変更不可'); + $('label[for="SectionFields8"]').append('※編集可能'); + + //ブランドの横ににコメントを追加 + let commentDiv2 = document.createElement('div'); + commentDiv2.className = 'brandComment'; + let commentBody2 = document.createElement('pre'); + commentBody2.innerText = + `複数ブランド提案の場合はここでブランド変更し依頼をしてください。 +金額の取り違えには気を付けてください。`; + commentDiv2.appendChild(commentBody2); + $('#Results_Class012Field').after(commentDiv2); + + //依頼パターン設定(11,12のときは部材リストリンク非表示) + switch ($('#Results_Class041').val()) { + case 'B': //工法 + case 'C': //基礎 + case 'H': //マトリックス + //部材マスタと大中小リンクの非表示 + $('#Results_Class042Field').hide(); + $('#Results_Class045Field').hide(); + $('#Results_Class046Field').hide(); + $('#Results_Class047Field').hide(); + $('#Results_Class048Field').hide(); + + //部材データコンテナ非表示 + $('#SectionFields17Container').hide(); + $('#SectionFields18Container').hide(); + $('#SectionFields19Container').hide(); + + break; + } + + let changeFlag = ''; + + //大分類の変更イベント + $p.on('change', 'Class035', function () { + console.log('Change Class045'); + changeFlag = 'Class045'; + //大分類が選択されたら、中分類をクリア + $p.ex.clearRadioChecked('Class046'); + $p.ex.clearAllRadioItems('Class047'); + $p.ex.clearAllRadioItems('Class048'); + }); + + //中分類の変更イベント + $p.on('change', 'Class036', function () { + console.log('Change Class046'); + changeFlag = 'Class046'; + //中分類が選択されたら、小分類をクリア + $p.ex.clearRadioChecked('Class047'); + $p.ex.clearAllRadioItems('Class048'); + }); + + //小分類の変更イベント + $p.on('change', 'Class037', function () { + console.log('Change Class047'); + changeFlag = 'Class047'; + //小分類が選択されたら、メーカーをクリア + $p.ex.clearRadioChecked('Class048'); + }); + + //メーカーの変更イベント + $p.on('change', 'Class038', function () { + console.log('Change Class048'); + changeFlag = 'Class048'; + //メーカーが選択されたら、部材リストリンクをクリア + $p.set($('#Results_Class042'), ''); + }); + + //部材マスタリンクの変更イベント + $p.on('change', 'Class042', function () { + console.log('Change Class042'); + let class042 = $('#Results_Class042').val(); + if (class042) { + //選択されたら + console.log($('#Results_Class042').val()); + $p.ex.getPartsData(class042); + //$('#SectionFields17Container').show(); + } else { + //選択を解除されたら + console.log('Results_Class042 is cleared'); + //部材リストのデータをクリア + $p.ex.clearPartsData(); + + let buzaiListCount = $('#Results_Class043 option').length; + + switch (changeFlag) { + case 'Class045': + case 'Class046': + case 'Class047': + $('#Results_Class042 option:first').text('分類~メーカーを選択してください'); + + $p.set($('#Results_CheckA'), 0); //部材リストあり? + $p.ex.changeIraiPage(); + break + case 'Class048': + if (buzaiListCount === 1) { + $('#Results_Class042 option:first').text('該当する部材がありません。下記の依頼項目に入力してください。'); + $('#Results_Class042Field').css('pointer-events', 'none'); + + $p.set($('#Results_CheckA'), 1); //部材リスト無し + $p.ex.changeIraiPage(); + + } else { + $('#Results_Class042 option:first').text('部材リストを選択してください'); + $('#Results_Class042Field').css('pointer-events', 'auto'); + + $p.set($('#Results_CheckA'), 0); //部材リストあり? + $p.ex.changeIraiPage(); + } + break + } + } + }); + + //部材リストの初期表示調整 + if (!$('#Results_Class042').val()) { + let buzaiListCount = $('#Results_Class043 option').length; + if (buzaiListCount === 1) { + $('#Results_Class042 option:first').text('分類~メーカーを選択してください'); + $('#Results_Class042Field').css('pointer-events', 'none'); + //$p.ex.changeIraiPage(); + } else { + $('#Results_Class042 option:first').text('部材リストを選択してください'); + $('#Results_Class042Field').css('pointer-events', 'auto'); + //$p.ex.changeIraiPage(); + } + } + + //プロセスボタン調整 + $p.ex.processButtonControl(); + + //ラジオボタン調整 + $p.ex.radioButtonReadOnly('ClassO'); + $p.ex.radioButtonReadOnly('ClassP'); + $p.ex.radioButtonReadOnly('ClassQ'); + + //現在の進捗 が 商談~承認図 の場合 + if ($('#Results_ClassO').val() == '0') { + $('#Results_ClassPField').hide(); + $('#Results_ClassQField').hide(); + $('#Results_DescriptionOField').hide(); + } + + //所属部署判定 + $p.ex.eSekisanCheck(); + $p.ex.jSekisanCheck(); + + //担当者一覧マージイベント + $('#Results_Class022,#Results_Class023,#Results_Class024,#Results_Class025,#Results_Class026,#Results_Class027,#Results_Class028').on('change', function () { + console.log('Change UsersMarge1'); + $p.ex.usersMarge1(); + }); + + //CC一覧変更マージイベント + $('#Results_Class031,#Results_Class032,#Results_Class033,#Results_Class034').on('change', function () { + console.log('Change UsersMarge2'); + $p.ex.usersMarge2(); + }); + + //新規作成時のみ処理 + if ($p.action() == 'new') { + switch ($('#Results_Class041').val()) { + case 'B': //工法 + case 'C': //基礎 + case 'H': //マトリックス + //部材マスタと大中小リンクの非表示 + $('#Results_Class042Field').hide(); + $('#Results_Class045Field').hide(); + $('#Results_Class046Field').hide(); + $('#Results_Class047Field').hide(); + $('#Results_Class048Field').hide(); + + //部材データコンテナ非表示 + $('#SectionFields17Container').hide(); + $('#SectionFields18Container').hide(); + $('#SectionFields19Container').hide(); + + break; + + default: + $('#SectionFields2Container').hide(); //依頼項目の非表示 + $('#SectionFields4Container').hide(); //不備追加資料の非表示 + + break; + } + + //マスターシートからシリーズを反映させる + if (mssData_Brand && mssData_Series) { + //mssData_Brandの値が109101のとき、mssData_Seriesの値をResults_Class056に設定する + if (mssData_Brand == '109101') { + $p.set($('#Results_Class056'), mssData_Series); + } + } + + + } else { + //スタートアップメッセージ表示 + $p.ex.startupMessage(); + + //質疑応答送信ボタン生成 + $p.ex.messageSaveButton(); + + //見積関連ボタン + $p.ex.mitsumoriButton(); + + //依頼パターンによって表示項目を切り替える処理 + //$p.ex.changeColumnList(); + + //対象エリアと対象ブランドのチェック + waitForElement('#Results_Class074_ms span', function () { + $p.ex.checkAreaAndBrand() + }); + + //部材リストの内容によって表示内容を修正する + waitForElement('li[aria-controls="FieldSetTab5"]', function () { + $p.ex.changeIraiPage(); + }); + + //補完済みの部材データを読込む + partsData = $('#Results_DescriptionX').val() && JSON.parse($('#Results_DescriptionX').val()); + + //質疑応答メッセージテーブル作成 + $p.ex.messageHistory(); + + //部材リストの内容によって表示内容を修正する + waitForElement('#SectionFields4Container', function () { + if ($('#Results_Class062').val() == '1') { + $('#SectionFields4Container').show(); + } else { + $('#SectionFields4Container').hide(); + } + }); + } + + if (!eSekisanFlag) { + $('#Results_Class132Field').hide(); + $('#Results_Description131Field').hide(); + //$('#Results_Attachments131Field').hide(); + } + + //担当者・CC一覧に含まれる場合、営業積算からの質疑は非表示 + if (!$('#Results_Class193').val().includes($p.userId().toString())) { + $('#Results_Class132Field').hide(); + $('#Results_Description132Field').hide(); + //$('#Results_Attachments132Field').hide(); + } + + let num131 = parseFloat($('#Results_Num131').val()); + let num132 = parseFloat($('#Results_Num132').val()); + + //1つ以上の質疑または回答がある場合は閉じる + /* + if (num131 > 0 || num132 > 0) { + waitForElement('#SectionFields11', function () { + $('label[for="SectionFields11"]').click(); + }); + + }*/ + + //セレクトボックスにプレースホルダーを追加 + addPlaceholderOption('Results_Class059'); + addPlaceholderOption('Results_Class063'); + + //添付ファイルのダウンロードチェックボックスを生成 + let attachColumns = $('.control-attachments'); + $.each(attachColumns, function (index, value) { + let attach = value.dataset.name; + $p.ex.createDownloadCheckBox(attach); + }) + + //不備追加資料 + $p.on('change', 'Class062', function () { + if ($('#Results_Class062').val() == '1') { + $('#SectionFields4Container').show(); + } else { + $('#SectionFields4Container').hide(); + } + }); + + + +} + + +$p.ex.modalWindow = function () { + //Results_Class045Field + //Results_Class046Field + //Results_Class047Field + //Results_Class048Field + //Results_Class042Field + + // 対象フィールドのjQuery要素を取得 + const fields = [ + '#Results_Class045Field', + '#Results_Class046Field', + '#Results_Class047Field', + '#Results_Class048Field', + '#Results_Class042Field' + ]; + + // フィールドの位置とサイズを計算 + let top = Infinity, left = Infinity, right = -Infinity, bottom = -Infinity; + fields.forEach(selector => { + const $el = $(selector); + if ($el.length) { + const offset = $el.offset(); + const width = $el.outerWidth(); + const height = $el.outerHeight(); + top = Math.min(top, offset.top); + left = Math.min(left, offset.left); + right = Math.max(right, offset.left + width); + bottom = Math.max(bottom, offset.top + height); + } + }); + + // モーダルが既に存在していれば削除 + $('#custom-modal-overlay').remove(); + + // モーダル用のdivを作成 + const $modal = $(` +
+
+ +
+ 部材リストを読み込んでいます… +
+
+
+ `); + + // モーダルをbodyに追加 + $('body').append($modal); + +} + +//入力チェック後処理 +$p.events.after_validate = function (args) { + //エリア-ブランド結合 + $p.ex.areaBrandName(); + + //施主名 姓名結合 + //$p.ex.setCustomerName(); + + //担当者一覧マージ + $p.ex.usersMarge1(); + + //CC一覧マージ + $p.ex.usersMarge2(); + + //担当者・CC一覧マージ + $p.ex.usersMarge3(); + + //変更履歴の保存 + $p.ex.saveHistory(); + + //依頼項目のマージ + $p.ex.mergeIraiItems(); +} + +$p.ex.mergeIraiItems = function () { + const IraiColumns = [ + 'Results_Class051', //メーカー + 'Results_Class052', //シリーズ・商品名 + 'Results_Class053', //品番 + 'Results_Class054', //施工範囲・箇所 + 'Results_Class055', //サイズ + 'Results_Class056', //nextシリーズ + 'Results_Class057', //iPadVer + 'Results_Class058', //マトリックスサイズ + 'Results_Class059', //階数(設置階) + 'Results_Description051', //副資材 + 'Results_Class060', //標準仕様 + 'Results_Description052' //その他 + ]; + + let IraiItemList = []; + + for (let column of IraiColumns) { + let columnName = $('#' + column + 'Field label').text(); + let columnValue = $('#' + column).val(); + if (columnValue) { + //値がある場合、項目名と値を配列に追加 + IraiItemList.push('■' + columnName + ' : ' + columnValue); + } + } + + let IraiItemStr = IraiItemList.join('\n'); + $p.set($('#Results_Description055'), IraiItemStr); + +} + +$p.ex.clearIraiItems = function () { + const IraiColumns = [ + 'Results_Class051', //メーカー + 'Results_Class052', //シリーズ・商品名 + 'Results_Class053', //品番 + 'Results_Class054', //施工範囲・箇所 + 'Results_Class055', //サイズ + 'Results_Class056', //nextシリーズ + 'Results_Class057', //iPadVer + 'Results_Class058', //マトリックスサイズ + 'Results_Class059', //階数(設置階) + 'Results_Description051', //副資材 + 'Results_Class060', //標準仕様 + 'Results_Description052' //その他 + ]; + + for (let column of IraiColumns) { + //該当の項目をクリア + $p.set($('#' + column).val(), ''); + } + + $p.set($('#Results_Description055'), ''); +} + +// 親から子を作成した際に、親への遷移を回避するスクリプト +$p.events.after_set_Create = function (args) { + //baseUrlを使ってitemsのidを含めたURLを取得 + itemsUrl = function (id) { + return $('#ApplicationPath').val() + 'items/' + id; + } + let response = args.json.filter(function (item, index) { + if (item.Method == 'Response') return true; + }); + //子テーブルに留まる + location.href = itemsUrl(response[0].Value); + + //初期処理 + $p.ex.init(); + +} + +$p.events.after_set_Update = function (args) { + //初期処理 + $p.ex.init(); + + //一時保存ボタン処理2 + $('#UpdateCommand').empty(); + $('#UpdateCommand').html(` + + 一時保存`); + + + //一時保存メッセージ + let json8val = JSON.parse(args.json[8].Value); + if (json8val.Id == 'Updated') { + $p.ex.setMyMessage('new-status-light-lime', '依頼項目の内容が一時保存されました'); + } + + + +} + +//エリアとブランド名を合体させて格納する +$p.ex.areaBrandName = function () { + let area = $('#Results_Class011 option:selected').text(); + let brand = $('#Results_Class012 option:selected').text(); + + if (area && brand) { + $p.set($('#Results_ClassL'), area + ' ' + brand); + } +} + +//担当者一覧マージ +$p.ex.usersMarge1 = function () { + let users = []; + $('#Results_ClassE').val() && users.push($('#Results_ClassE').val()); //依頼者 + $('#Results_Class022').val() && users.push($('#Results_Class022').val()); //主担当営業 Class022 + $('#Results_Class023').val() && users.push($('#Results_Class023').val()); //副担当営業 Class023 + $('#Results_Class024').val() && users.push($('#Results_Class024').val()); //営業設計 Class024 + $('#Results_Class025').val() && users.push($('#Results_Class025').val()); //担当監督 Class025 + $('#Results_Class026').val() && users.push($('#Results_Class026').val()); //担当IC Class026 + $('#Results_Class027').val() && users.push($('#Results_Class027').val()); //管理設計 Class027 + $('#Results_Class028').val() && users.push($('#Results_Class028').val()); //所属長 Class028 + + $p.set($('#Results_Class191'), JSON.stringify(users)); + $p.ex.usersMarge3(); +} + +//CC一覧マージ +$p.ex.usersMarge2 = function () { + let users = []; + $('#Results_Class031').val() && users.push($('#Results_Class031').val()); //CC1 + $('#Results_Class032').val() && users.push($('#Results_Class032').val()); //CC2 + $('#Results_Class033').val() && users.push($('#Results_Class033').val()); //CC3 + $('#Results_Class034').val() && users.push($('#Results_Class034').val()); //CC4 + + $p.set($('#Results_Class192'), JSON.stringify(users)); + $p.ex.usersMarge3(); +} + +//担当者・CC一覧マージ +$p.ex.usersMarge3 = function () { + //担当者一覧とCC一覧をマージして保管 + let mergeAry = [...$('#Results_Class191').val(), ...$('#Results_Class192').val()]; + mergeAry.push($('#Results_ClassE').val()); + $p.set($('#Results_Class193'), JSON.stringify(mergeAry)); +} + +//アクセスと権限チェック +//営業積算メンバーチェック +$p.ex.eSekisanCheck = function () { + console.log('Check e-sekisan Depts Code'); + if ($p.userId() == '460') { + eSekisanFlag = true; + } else if ($p.deptId() == eSekisanDeptId) { + eSekisanFlag = true; + } else { + //タブ4非表示 + waitForElement('li[aria-controls="FieldSetTab4"]', function () { + $('li[aria-controls="FieldSetTab4"]').hide(); + }); + } +} + +//アクセスと権限チェック +//【営業積算】閲覧権限 グループメンバーチェック +$p.ex.jSekisanCheck = function () { + console.log('Check j-sekisan Depts Code'); + + let sekisanMemberList = JSON.parse($('#sekisanMemberList').val()); + let sekisanDeptList = JSON.parse($('#sekisanDeptList').val()); + + //console.log(sekisanMemberList); + //console.log(sekisanDeptList); + + if (sekisanMemberList.includes($p.userId())) { + jSekisanFlag = true; + } else if (sekisanDeptList.includes($p.deptId())) { + jSekisanFlag = true; + } else { + //タブ5非表示 + waitForElement('li[aria-controls="FieldSetTab5"]', function () { + $('li[aria-controls="FieldSetTab5"]').hide(); + }); + } + +} + +//要素が読み込まれるまで待機し、返す +function waitForElement(selector, callback, interval = 100, timeout = 5000) { + const startTime = Date.now(); + + const checkExist = setInterval(function () { + if ($(selector).length) { + clearInterval(checkExist); // 要素が見つかったら停止 + callback(); + } else if (Date.now() - startTime > timeout) { + clearInterval(checkExist); // タイムアウト処理 + console.warn(`指定した要素 '${selector}' が ${timeout / 1000} 秒以内に見つかりませんでした。`); + } + }, interval); +} + +//ラジオボタンを無効化する +$p.ex.radioButtonReadOnly = function (column) { + //console.log($('input[name="Results_' + column + '"][type="radio"]')) + $('input[name="Results_' + column + '"][type="radio"]').each(function (index, value) { + if ($(this)[0].checked) { + $(this).parent().css('color', 'blue'); + } else { + $(this).prop('disabled', true); + } + }) +} + +//プリザンターから1件のレコードデータを取得する関数 +$p.ex.getRecordData = async function (id) { + //もしidが空鳴らんば、空のオブジェクトを返す + if (!id) { + return {}; + } + + //プリザンターへゲット処理 + const url = 'https://' + location.hostname + '/pleasanter/api/items/' + id + '/get' + + const json = { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + } + + const res = await fetch(url, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(json) + }); + + const resData = await res.json(); + //console.log(resData); + return resData.Response.Data[0]; +} + +/* +//マトリックスサイズ入力欄について +$('#Results_Num052Field span.ui-widget-content').prependTo('#Results_Class051Field .container-normal'); +$('
').prependTo('#Results_Class051Field .container-normal'); +$('#Results_Num051Field span.ui-widget-content').prependTo('#Results_Class051Field .container-normal'); + +[ + { + "SiteId": 310407, + "View": { + "ColumnSorterHash": { + "ClassA": "asc" + } + }, + "Lookups": [ + { + "From": "ClassA", + "To": "ClassA", + "OverwriteForm": true + }, { + "From": "ClassB", + "To": "ClassB", + "OverwriteForm": true + }, { + "From": "ClassE", + "To": "ClassE", + "OverwriteForm": true + }, { + "From": "Class199", + "To": "Class041", + "OverwriteForm": true + }, { + "From": "DateI", + "To": "DateI", + "OverwriteForm": true + }, { + "From": "ClassI", + "To": "ClassI", + "OverwriteForm": true + }, { + "From": "ClassJ", + "To": "ClassJ", + "OverwriteForm": true + }, { + "From": "ClassK", + "To": "ClassK", + "OverwriteForm": true + }, { + "From": "ClassL", + "To": "ClassL", + "OverwriteForm": true + }, { + "From": "ClassM", + "To": "ClassM", + "OverwriteForm": true + }, { + "From": "ClassN", + "To": "ClassN", + "OverwriteForm": true + }, { + "From": "ClassO", + "To": "ClassO", + "OverwriteForm": true + }, { + "From": "ClassP", + "To": "ClassP", + "OverwriteForm": true + }, { + "From": "ClassQ", + "To": "ClassQ", + "OverwriteForm": true + }, { + "From": "DescriptionO", + "To": "DescriptionO", + "OverwriteForm": true + }, { + "From": "ClassX", + "To": "ClassX", + "OverwriteForm": true + }, { + "From": "ClassY", + "To": "ClassY", + "OverwriteForm": true + }, { + "From": "ClassZ", + "To": "ClassZ", + "OverwriteForm": true + }, { + "From": "Class001", + "To": "Class001", + "OverwriteForm": true + }, { + "From": "Class010", + "To": "Class010", + "OverwriteForm": true + }, { + "From": "Class011", + "To": "Class011", + "OverwriteForm": true + }, { + "From": "Class012", + "To": "Class012", + "OverwriteForm": true + }, { + "From": "Class013", + "To": "Class013", + "OverwriteForm": true + }, { + "From": "Class014", + "To": "Class014", + "OverwriteForm": true + }, { + "From": "Date001", + "To": "Date001", + "OverwriteForm": true + }, { + "From": "Date002", + "To": "Date002", + "OverwriteForm": true + }, { + "From": "Class021", + "To": "Class021", + "OverwriteForm": true + }, { + "From": "Class022", + "To": "Class022", + "OverwriteForm": true + }, { + "From": "Class023", + "To": "Class023", + "OverwriteForm": true + }, { + "From": "Class024", + "To": "Class024", + "OverwriteForm": true + }, { + "From": "Class025", + "To": "Class025", + "OverwriteForm": true + }, { + "From": "Class026", + "To": "Class026", + "OverwriteForm": true + }, { + "From": "Class027", + "To": "Class027", + "OverwriteForm": true + }, { + "From": "Class028", + "To": "Class028", + "OverwriteForm": true + }, { + "From": "Class031", + "To": "Class031", + "OverwriteForm": true + }, { + "From": "Class032", + "To": "Class032", + "OverwriteForm": true + }, { + "From": "Class033", + "To": "Class033", + "OverwriteForm": true + }, { + "From": "Class034", + "To": "Class034", + "OverwriteForm": true + }, { + "From": "Description001", + "To": "Description001", + "OverwriteForm": true + }, { + "From": "ClassT", + "To": "ClassT", + "OverwriteForm": true + }, { + "From": "DescriptionT", + "To": "DescriptionT", + "OverwriteForm": true + }, { + "From": "Class191", + "To": "Class191", + "OverwriteForm": true + }, { + "From": "Class192", + "To": "Class192", + "OverwriteForm": true + }, { + "From": "Class193", + "To": "Class193", + "OverwriteForm": true + }, { + "From": "Class193", + "To": "Class111", + "OverwriteForm": true + }, { + "From": "Class193", + "To": "Class132", + "OverwriteForm": true + } + ] + } +] + +*/ +/* +[ + { + "SiteId": 68782, + "SearchFormat": "[Title] - [ClassA] - [Owner]", + "View": { + "ColumnSorterHash": { + "ResultId": "desc" + }, + "ColumnFilterHash": { + "Status": "[\"100\",\"110\",\"150\",\"200\",\"210\",\"500\"]" + } + }, + } +] + +[ + { + "SiteId": 109112, + "SearchFormat": "[Title] - [ClassA] - [Owner]", + "View": { + "ColumnSorterHash": { + "ClassB": "asc" + }, + "ColumnFilterHash": { + "ClassA": "[\"109101\"]" + } + }, + } +] +*/ + +/* +[ + { + "SiteId": "320587", + "SearchFormat": "[ClassD]■[ClassI]-[ClassJ]-[ClassK]■[ClassV]■[ClassW]", + "View": { + "ColumnSorterHash": { + "ClassA": "asc", + "ClassB": "asc", + "ClassC": "asc", + "ClassD": "asc", + } + } + } +] +*/ diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/02_プロセス.js b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/02_プロセス.js new file mode 100644 index 00000000..3e87e3b3 --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/02_プロセス.js @@ -0,0 +1,140 @@ +/* +@config :next999.json +@filename : ${psFileBasename} +@title : 02_プロセス +@name : +@siteIds : 310405 +@siteTitles : Re③依頼項目 +@disabled: false +*/ + +// プロセスごとに実行スクリプト +$p.ex.processScript = function (procNum) { + //プロセス共通処理 ------------------------------------------------------------------ + //確認メッセージの取得 + let confirmMessage = $('#Process_' + procNum).attr('data-confirm'); + //実行確認 + if (!confirm(confirmMessage)) { + //キャンセルなら終了 + console.log('Process_' + procNum + ' はキャンセルされました'); + return false; + } else { + //オリジナルの確認メッセージの削除 + $('#Process_' + procNum).removeAttr('data-confirm'); + } + + //プロセス名の取得 + let procName = $('#Process_' + procNum).text().replace(/^\s+/, ''); + console.log(`▷Process_${procNum} : ${procName} 処理開始`); + + //-------------------------------------------------------------------------------- + //プロセスごとの個別処理 + switch (procNum) { + case '1': //質疑送信 + let questionMessage = $('#Results_Description131').val(); + if (questionMessage) { + $p.ex.saveQuestionMessage(); + } else { + //質疑本文が空欄 + $p.ex.setMyMessage('new-status-red', '質疑本文を入力してください'); + return false; + } + + break; + case '2': //回答送信 + let answerMessage = $('#Results_Description132').val(); + if (answerMessage) { + $p.ex.saveAnswerMessage(); + } else { + //回答本文が空欄 + $p.ex.setMyMessage('new-status-red', '回答本文を入力してください'); + return false; + } + + break; + case '3': //回答確認 + + break; + case '4': //見積回答削除 + if ($('input[name="messageDeleteCheck"]:checked').length) { + $p.ex.messageDelete(); + } else { + $p.ex.setMyMessage('new-status-red', '回答本文を入力削除したい質疑回答メッセージ選択してくださいしてください'); + } + + break; + + case '5': //登録完了 + break; + case '6': //積算依頼 + break; + case '7': //積算受付 + break; + case '8': //積算対応 + break; + case '9': //外部見積 + break; + case '10': //社内確認 + break; + case '11': //チェック + break; + case '12': //差戻し + break; + case '13': //積算回答 + break; + case '14': //完了 + break; + case '15': //保留 + break; + case '16': //取消 + break; + case '17': //e保留 + break; + case '18': //e取消 + break; + case '19': //依頼不要 + break; + case '20': //再依頼 + break; + + } + + //プロセスの実行 + console.log(`▶Process_${procNum} : ${procName} 処理終了`); + $p.execProcess($('#Process_' + procNum)); + +} + +//プロセスボタン調整 +$p.ex.processButtonControl = function () { + $("button[id^='Process']").each(function () { + //hideで始まるボタンの非表示 + if ($(this).attr('data-icon') == 'ui-icon-close') { + $(this).hide(); + } + + //hideで始まるボタンの非表示 + if ($(this).attr('data-icon') == 'ui-icon-cancel') { + //グレーアウト + $(this).addClass('new-status-grey'); + + } else { + //ボタンサイズ拡大 + $(this).addClass('processButtonSize'); + } + + //個別設定 + switch (this.id) { + case 'Process_1': + $(this).addClass('new-status-yellow'); + break; + case 'Process_2': + $(this).addClass('new-status-red'); + break; + case 'Process_5': + $(this).addClass('new-status-blue'); + break; + } + + }); +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/03_質疑応答スクリプト.js b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/03_質疑応答スクリプト.js new file mode 100644 index 00000000..512a8211 --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/03_質疑応答スクリプト.js @@ -0,0 +1,304 @@ +/* +@config :next999.json +@filename : ${psFileBasename} +@title : 03_質疑応答スクリプト +@name : +@siteIds : 310405 +@siteTitles : Re③依頼項目 +@disabled: false +*/ + +//営業積算からの質疑を保存 +$p.ex.saveQuestionMessage = function () { + + let message = $('#Results_Description131').val(); + let userName = $p.userName(); + let now = new Date(); + let nowStr = now.getFullYear() + '/' + (now.getMonth() + 1).toString().padStart(2, '0') + '/' + now.getDate().toString().padStart(2, '0') + ' ' + + now.getHours().toString().padStart(2, '0') + ':' + now.getMinutes().toString().padStart(2, '0') + ':' + now.getSeconds().toString().padStart(2, '0'); + + let messageID = 'a' + now.getFullYear() + '' + (now.getMonth() + 1).toString().padStart(2, '0') + '' + now.getDate().toString().padStart(2, '0') + '' + + now.getHours().toString().padStart(2, '0') + '' + now.getMinutes().toString().padStart(2, '0') + '' + now.getSeconds().toString().padStart(2, '0') + '-' + $p.userId(); + let num = parseFloat($('#Results_Num131').val()) + 1; + + let data = { + 'messageID': messageID, + 'type': 'Question', + 'num': toCircledNumber(num), + 'typeStr': '営業積算からの質疑', + 'userName': userName, + 'messageTime': nowStr, + 'messageBody': message, + 'enabled': true, + }; + + + //質疑回答 保管用項目に保存する + let saveData = $('#Results_Description135').val(); + let shitsugiData; + + if (saveData == '') { + shitsugiData = []; + shitsugiData.push(data); + } else { + shitsugiData = JSON.parse(saveData); + shitsugiData.push(data); + } + $p.set($('#Results_Description135'), JSON.stringify(shitsugiData)); + + //保管したら入力欄は削除する + $p.set($('#Results_Description136'), $('#Results_Description131').val()); + $p.set($('#Results_Description131'), ''); + +} + +//依頼者からの回答を保存 +$p.ex.saveAnswerMessage = function () { + + let message = $('#Results_Description132').val(); + let userName = $p.userName(); + let now = new Date(); + let nowStr = now.getFullYear() + '/' + (now.getMonth() + 1).toString().padStart(2, '0') + '/' + now.getDate().toString().padStart(2, '0') + ' ' + + now.getHours().toString().padStart(2, '0') + ':' + now.getMinutes().toString().padStart(2, '0') + ':' + now.getSeconds().toString().padStart(2, '0'); + + let messageID = 'b' + now.getFullYear() + '' + (now.getMonth() + 1).toString().padStart(2, '0') + '' + now.getDate().toString().padStart(2, '0') + '' + + now.getHours().toString().padStart(2, '0') + '' + now.getMinutes().toString().padStart(2, '0') + '' + now.getSeconds().toString().padStart(2, '0') + '-' + $p.userId(); + let num = parseFloat($('#Results_Num132').val()) + 1; + + + let data = { + 'messageID': messageID, + 'type': 'Answer', + 'num': toCircledNumber(num), + 'typeStr': '依頼者からの回答', + 'userName': userName, + 'messageTime': nowStr, + 'messageBody': message, + 'enabled': true, + }; + + //質疑回答 保管用項目に保存する + let saveData = $('#Results_Description135').val(); + let shitsugiData; + + if (saveData == '') { + shitsugiData = []; + shitsugiData.push(data); + } else { + shitsugiData = JSON.parse(saveData); + shitsugiData.push(data); + } + $p.set($('#Results_Description135'), JSON.stringify(shitsugiData)); + + //保管したら入力欄は削除する + $p.set($('#Results_Description136'), $('#Results_Description132').val()); + $p.set($('#Results_Description132'), ''); + +} + +$p.ex.messageHistory = function () { + //質疑開通と回答回数の参照 + let num131 = parseFloat($('#Results_Num131').val()); + let num132 = parseFloat($('#Results_Num132').val()); + + if (num131 > 0 || num132 > 0) { + //タブの色の変更 + let shitsugi_Status = $('#Results_Class131').val(); + //console.log('質疑回答ステータス: ' + shitsugi_Status); + + switch (shitsugi_Status) { + case '': //質疑なし + case '0': //質疑なし + $('a[href="#FieldSetTab3"] label').text('質疑なし'); + $('a[href="#FieldSetTab3"]').css('background-color', 'blue'); + $('a[href="#FieldSetTab3"]').css('color', 'white'); + break; + case '1'://質疑あり + $('a[href="#FieldSetTab3"] label').text('質疑あり'); + $('a[href="#FieldSetTab3"]').css('background-color', 'red'); + $('a[href="#FieldSetTab3"]').css('color', 'white'); + break; + case '2'://回答あり + $('a[href="#FieldSetTab3"] label').text('回答あり'); + $('a[href="#FieldSetTab3"]').css('background-color', 'yellow'); + $('a[href="#FieldSetTab3"]').css('color', 'black'); + break; + case '3'://回答確認済み + $('a[href="#FieldSetTab3"] label').text('回答確認済み'); + $('a[href="#FieldSetTab3"]').css('background-color', 'green'); + $('a[href="#FieldSetTab3"]').css('color', 'white'); + break; + + } + + //メッセージテーブルがすでに存在したら削除 + if ($('#messageTable').length) { + $('#messageTable').remove(); + } + + //削除ボタン削除 + if ($('#messageDelete').length) { + $('#messageDelete').remove(); + } + + let saveData = $('#Results_Description135').val(); + + if (saveData) { + //メッセージデータの取得 + let messageData = []; + messageData = JSON.parse(saveData); + //messageData.reverse(); + + //console.log('質疑回答メッセージデータ: ' + JSON.stringify(messageData)); + + let templateHtml; + templateHtml = + ` + + {{#messageData}} + + + + + + + + + + {{/messageData}} + +
{{typeStr}} {{num}}{{userName}}{{messageTime}}
+
{{{messageBody}}}
+
`; + + let template = Hogan.compile(templateHtml); + let outputHtml = template.render({ + "messageData": messageData + }); + + //console.log(outputHtml); + setTimeout(function () { + $('#SectionFields12').prepend(outputHtml); + }, 300); + + } + + + //営業積算のみ表示 + if (eSekisanFlag) { + //質疑回答削除ボタンを作成 + let div3 = document.createElement('div'); + let button3 = document.createElement('button'); + button3.type = 'button'; + button3.id = 'messageDelete'; + button3.innerHTML = '質疑回答削除'; + button3.setAttribute('onclick', '$("#Process_4").click()'); + button3.style.margin = '5px'; + button3.style.float = 'right'; + button3.style.fontSize = '1.3em'; + div3.append(button3); + + $('#SectionFields12').prepend(div3); + + $('#messageDelete').button({ + icon: 'ui-icon-document' + }); + + } + } else { + $('#SectionFields12Container').hide(); + } +} + +//質疑回答送信ボタン作成 +$p.ex.messageSaveButton = function () { + //営業積算のみ表示 + if (eSekisanFlag) { + //質疑送信ボタン + let div1 = document.createElement('div'); + div1.style.textAlign = 'right'; + let button1 = document.createElement('button'); + button1.type = 'button'; + button1.id = 'saveQuestion'; + button1.innerHTML = '質疑送信'; + button1.setAttribute('onclick', '$("#Process_1").click()'); + button1.style.margin = '5px'; + button1.style.fontSize = '1.3em'; + div1.append(button1); + $('#Results_Attachments131Field').after(div1); + $('#saveQuestion').button({ + icon: 'ui-icon-document' + }); + + } + + //回答送信ボタン + let div2 = document.createElement('div'); + div2.style.textAlign = 'right'; + let button2 = document.createElement('button'); + button2.type = 'button'; + button2.id = 'saveAnswer'; + button2.innerHTML = '回答送信'; + button2.setAttribute('onclick', '$("#Process_2").click()'); + button2.style.margin = '5px'; + button2.style.fontSize = '1.3em'; + div2.append(button2); + $('#Results_Attachments132Field').after(div2); + $('#saveAnswer').button({ + icon: 'ui-icon-document' + }); +} + +$p.ex.messageDelete = function () { + //チェックが入っていたら実行 + + let messageData = JSON.parse($('#Results_Description135').val()); + //チェックのあるメッセージを配列から除去する + $('input[name="messageDeleteCheck"]:checked').each(function (index) { + let messageID = $(this).val(); + // messageIDが一致するデータのenabledをfalseに変更 + messageData = messageData.map(item => { + if (item.messageID === messageID) { + return { + ...item, + enabled: false, + type: item.type + '.Disabled' + }; + } + return item; + }); + + //質疑 回答判定 + /* + if (messageID.charAt(0) == 'a') { + //質疑回数の数を1つ減らす + let num131 = parseFloat($('#Results_Num131').val()); + $p.set($('#Results_Num131'), num131 - 1); + + } else if (messageID.charAt(0) == 'b') { + //回答回数の数を1つ減らす + let num132 = parseFloat($('#Results_Num132').val()); + $p.set($('#Results_Num131'), num132 - 1); + + } + */ + //console.log(messageId); + //messageData = messageData.filter(item => item.messageID !== messageID); + }); + $p.set($('#Results_Description135'), JSON.stringify(messageData)); + + $p.ex.setMyMessage('new-status-green', '選択した質疑回答メッセージを削除しました'); + +} + +// numを丸数字に変換して表示 +function toCircledNumber(n) { + n = Math.floor(Number(n)); + if (isNaN(n) || n < 0 || n > 100) return n; + if (n === 0) return '⓪'; + if (n <= 20) return String.fromCharCode(9311 + n); // 9312 = ① + if (n <= 35) return String.fromCharCode(12881 + n - 21); // 12881 = ㉑ + if (n <= 50) return String.fromCharCode(12977 + n - 36); // 12977 = ㊱ + if (n <= 100) return n; // fallback for 51-100 + +} diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/04_見積遅延連絡スクリプト.js b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/04_見積遅延連絡スクリプト.js new file mode 100644 index 00000000..4a4ce1d3 --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/04_見積遅延連絡スクリプト.js @@ -0,0 +1,134 @@ +/* +@config :next999.json +@filename : ${psFileBasename} +@title : 04_見積遅延連絡スクリプト +@name : +@siteIds : 310405 +@siteTitles : Re③依頼項目 +@disabled: false +*/ + +$p.on('change', 'Class152', function () { + $p.ex.createChienMail(); +}); +$p.on('change', 'Date151', function () { + $p.ex.createChienMail(); +}); + +//遅延メール作成 +$p.ex.createChienMail = function () { + + let riyu = $('#Results_Class152').val(); + let riyuStr = $('#Results_Class152 option[value="' + riyu + '"').text(); + let dateStr = $('#Results_Date151').val(); + let henshinDate = new Date(dateStr); + + if (riyu && dateStr) { + let dayOfWeek = henshinDate.getDay(); // 曜日(数値) + let dayOfWeekStr = ["日", "月", "火", "水", "木", "金", "土"][dayOfWeek]; // 曜日(日本語表記) + + let body1 = `${riyuStr} につき、見積返信が遅延する予定です。 + +見積返信予定日:${dateStr} (${dayOfWeekStr}) + +お待たせしており申し訳ございません。 +いましばらくお待ちください。 + +宜しくお願い致します。`; + + let bodyA = `現在、積算問い合わせが集中しているため +見積り返信までに、通常よりも時間を要する見込みです。 + +見積アップ希望日が近い順から対応しておりますので、 +いましばらくお待ちください。 + +※急を要する場合は、お電話ください。`; + + let bodyB = `問い合わせ内容について依頼者からの質疑回答待ちのため +回答が届き次第、見積り対応を進めます。 + +『営業積算からの質疑』をご確認いただき、 +『依頼者からの回答欄』に入力をお願いいたします。 + +※急を要する場合は、お電話ください。`; + + let messageBody = body1; + //理由3,4の場合メッセージを変更する + switch (riyu) { + case '3': + messageBody = bodyA; + break; + case '4': + messageBody = bodyB; + break; + } + + $p.set($('#Results_Description151'), messageBody); + + } + +} + +//遅延メールを保存する +$p.ex.saveChienMail = function () { + //あて先 + let addr = $('#Results_Class151_ms span').text(); + + let riyu = $('#Results_Class152').val(); + let riyuStr = $('#Results_Class152 option[value="' + riyu + '"').text(); + + let message = $('#Results_Description151').val(); + let sendUser = $('#Results_Class153 option:selected').text(); + let lateDate = $('#Results_Date151').val(); + let sendDate = $('#Results_Date152').val(); + + let saveLog = `-------------------------------------------------------------------------- +■あて先:${addr} +■遅延理由:${riyuStr} +■返信予定日:${lateDate} +■遅延通知メール: +${message} + +■送信者:${sendUser} +■送信日時:${sendDate} +`; + + let log = $('#Results_Description155').val(); + log = log + saveLog; + $p.set($('#Results_Description155'), log); +} + +$p.ex.mitsumoriButton = function () { + //見積依頼ボタン + let div1 = document.createElement('div'); + let button1 = document.createElement('button'); + button1.type = 'button'; + button1.id = 'mitsumoriIrai'; + button1.innerHTML = '見積依頼'; + //button1.setAttribute('onclick', '$("#Process_5").click()'); + button1.style.margin = '5px'; + button1.style.float = 'right'; + button1.style.fontSize = '1.3em'; + div1.append(button1); + $('#Results_Class142').after(div1); + $('#mitsumoriIrai').button({ + icon: 'ui-icon-search' + }); + + //見積遅延連絡ボタン + let div2 = document.createElement('div'); + let button2 = document.createElement('button'); + button2.type = 'button'; + button2.id = 'mitsumoriChien'; + button2.innerHTML = '見積遅延連絡'; + //button2.setAttribute('onclick', '$("#Process_6").click()'); + button2.style.margin = '5px'; + button2.style.float = 'right'; + button2.style.fontSize = '1.3em'; + div2.append(button2); + $('#Results_Description151').after(div2); + $('#mitsumoriChien').button({ + icon: 'ui-icon-alert' + }); + +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/05_依頼項目操作スクリプト.js b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/05_依頼項目操作スクリプト.js new file mode 100644 index 00000000..f2da17fd --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/05_依頼項目操作スクリプト.js @@ -0,0 +1,624 @@ +/* +@config :next999.json +@filename : ${psFileBasename} +@title : 05_依頼項目操作スクリプト +@name : +@siteIds : 310405 +@siteTitles : Re③依頼項目 +@disabled: false +*/ + +//依頼パターンごとの表示項目リスト +$p.ex.changeColumnList = function () { + + let viewList = { + 'A': ['col1', 'col2', 'col3', 'col4', 'col9', 'col11', 'col12'], + 'B': ['col1', 'col8', 'col11'], + 'C': ['col4', 'col11', 'col12'], + 'D': ['col1', 'col2', 'col3', 'col4', 'col9', 'col11'], + 'E': ['col1', 'col2', 'col3', 'col4', 'col5'], + 'F': ['col1', 'col2', 'col3', 'col4', 'col10', 'col11'], + 'G': ['col1', 'col2', 'col3', 'col4', 'col10'], + 'H': ['col6', 'col7', 'col8', 'col9'], + 'I': ['col1', 'col2', 'col3', 'col4', 'col5', 'col10', 'col12'] + } + + //表示項目の定義名 + let columnList = { + 'col1': { "Name": "メーカー", "ColumnName": "Class051" }, + 'col2': { "Name": "シリーズ・商品名", "ColumnName": "Class052" }, + 'col3': { "Name": "品番", "ColumnName": "Class053" }, + 'col4': { "Name": "施工範囲・箇所", "ColumnName": "Class054" }, + 'col5': { "Name": "サイズ", "ColumnName": "Class055" }, + 'col6': { "Name": "nextシリーズ", "ColumnName": "Class056" }, + 'col7': { "Name": "iPadVer", "ColumnName": "Class057" }, + 'col8': { "Name": "マトリックスサイズ", "ColumnName": "Class058" }, + 'col9': { "Name": "階数(設置階)", "ColumnName": "Class059" }, + 'col10': { "Name": "副資材", "ColumnName": "Description051" }, + 'col11': { "Name": "標準仕様", "ColumnName": "Class060" }, + 'col12': { "Name": "その他", "ColumnName": "Description052" } + } + + //パターンの取得 + let pattern = $('#Results_Class041').val(); + + let idList = viewList[pattern]; + + //idListに含まれるColumnName(表示対象) + let matchColumnNames = idList.map(id => columnList[id].ColumnName); + + //idListに含まれないColumnName(非表示対象) + let allColumnNames = Object.values(columnList).map(item => item.ColumnName); + let unmatchColumnNames = allColumnNames.filter(name => !matchColumnNames.includes(name)); + + //ここで表示・非表示処理を追加可能 + unmatchColumnNames.map(id => { + //非表示 + $('#Results_' + id + 'Field').hide(); + }); + + //nextシリーズの調整 + let brand = $('#Results_Class012').val(); + if (brand === '109101') { + + } else { + //nextシリーズではない場合、欄を空欄にして非表示 + $('#Results_Class056Field').addClass('code-readonly2'); + $p.set($('#Results_Class056'), ''); //nextシリーズの値を空にする + $('#Results_Class056 option:first').text('非nexthouseです'); + $('#Results_Class056').css('background-color', 'grey'); + } + +} + +//ラジオボタンの選択を変更 +$p.ex.clearRadioChecked = function (id) { + //ラジオボタンの選択の解除 + $('input[name="Results_' + id + '"].control-radio:checked').each(function () { + $(this).prop('checked', false); + $(this).parent().remove(); + }); + + //値の削除 + $p.set($('#Results_' + id + ''), ''); + +} + +$p.ex.clearAllRadioItems = function (id) { + //ラジオボタンの選択の解除 + $('input[name="Results_' + id + '"].control-radio:checked').each(function () { + $(this).prop('checked', false); + }); + + //ラジオボタンのアイテムをすべて削除 + $('input[name="Results_' + id + '"].control-radio').each(function () { + $(this).parent().remove(); + }); + + //値の削除 + $p.set($('#Results_' + id + ''), ''); +} + +//部材リストからデータを取得する関数 +$p.ex.getPartsData = async function (id) { + //部材リストのデータの初期化 + partsData = { + "Status": { "Label": "問合せ有無", "Data": "" }, + "Comments": { "Label": "改訂履歴", "Data": "" }, + "ClassA": { "Label": "大分類", "Data": "" }, + "ClassB": { "Label": "中分類", "Data": "" }, + "ClassC": { "Label": "小分類", "Data": "" }, + "ClassD": { "Label": "メーカー", "Data": "" }, + "ClassE": { "Label": "算出方法", "Data": "" }, + "ClassI": { "Label": "品名/シリーズ", "Data": "" }, + "ClassJ": { "Label": "品番/コード", "Data": "" }, + "ClassK": { "Label": "タイプ/クラス/パターン", "Data": "" }, + "ClassL": { "Label": "サイズ", "Data": "" }, + "ClassM": { "Label": "追加・差額", "Data": "" }, + "ClassP": { "Label": "販売単位", "Data": "" }, + "ClassQ": { "Label": "単位", "Data": "" }, + "ClassV": { "Label": "対象エリア", "Data": "" }, //* + "ClassW": { "Label": "対象ブランド", "Data": "" }, //* + "Class001": { "Label": "単価表", "Data": "" }, //* + "Class002": { "Label": "販売算出表", "Data": "" }, //* + "Class003": { "Label": "カタログ1", "Data": "" }, //* + "Class004": { "Label": "カタログ2", "Data": "" }, //* + "Class005": { "Label": "NotePM1", "Data": "" }, //* + "Class006": { "Label": "NotePM2", "Data": "" }, //* + "Class007": { "Label": "NotePM3", "Data": "" }, //* + "NumA": { "Label": "販売価格", "Data": "" }, + "NumB": { "Label": "送料", "Data": "" }, + "DescriptionA": { "Label": "注記", "Data": "" }, //* + "DescriptionB": { "Label": "URL", "Data": "" }, + "Description001": { "Label": "検索キーワード", "Data": "" }, + "CheckA": { "Label": "注記有", "Data": "" }, + "CheckI": { "Label": "全エリア", "Data": "" }, + "CheckJ": { "Label": "全ブランド", "Data": "" }, + "Check001": { "Label": "東京", "Data": "" }, + "Check002": { "Label": "愛知", "Data": "" }, + "Check003": { "Label": "千葉", "Data": "" }, + "Check004": { "Label": "静岡", "Data": "" }, + "Check005": { "Label": "熊本", "Data": "" }, + "Check011": { "Label": "actie", "Data": "" }, + "Check012": { "Label": "nexthouse", "Data": "" }, + "Check013": { "Label": "ACTIVEHOUSE", "Data": "" }, + "Check014": { "Label": "Bluezia", "Data": "" }, + "Check015": { "Label": "CLEVERLYHOME", "Data": "" }, + "Check016": { "Label": "WELLHOMES", "Data": "" }, + "Check017": { "Label": "はちみつハウス", "Data": "" }, + "Check018": { "Label": "GRAPH", "Data": "" }, + } + + //部材リストの値を取得 + //プリザンターへゲット処理 + const recordData = await $p.ex.getRecordData(id); + + //取得データを格納 + partsData.Status.Data = recordData.Status; + partsData.Comments.Data = recordData.Comments; + + Object.keys(recordData.ClassHash).forEach(function (key) { + const value = recordData.ClassHash[key]; + if (partsData[key]) { + partsData[key].Data = value; + } + }); + + Object.keys(recordData.CheckHash).forEach(function (key) { + const value = recordData.CheckHash[key]; + if (partsData[key]) { + partsData[key].Data = value; + } + }); + Object.keys(recordData.DescriptionHash).forEach(function (key) { + const value = recordData.DescriptionHash[key]; + if (partsData[key]) { + partsData[key].Data = value; + } + }); + + Object.keys(recordData.NumHash).forEach(function (key) { + const value = recordData.NumHash[key]; + if (partsData[key]) { + partsData[key].Data = value; + } + }); + + console.log('部材リストのデータ:', partsData); + $p.set($('#Results_DescriptionX'), JSON.stringify(partsData)); + + //部材リストの値を設定 + $p.set($('#Results_Class071'), recordData.Status || ''); //問合せ有無 + $p.set($('#Results_Class072'), recordData.ClassHash.ClassE || ''); //算出方法 + $p.set($('#Results_Class073'), recordData.ClassHash.ClassV || ''); //対象エリア + $p.set($('#Results_Class074'), recordData.ClassHash.ClassW || ''); //対象ブランド + $p.set($('#Results_Description071'), recordData.DescriptionHash.DescriptionA || ''); //注記 + + $p.set($('#Results_Description072'), ''); //単価表と販売算出表のデータは後で取得するので空にしておく + $p.set($('#Results_Description073'), ''); //カタログ1,2とNotePM1,2,3のデータは後で取得するので空にしておく + $p.set($('#Results_Description074'), ''); //販売価格 + $p.set($('#Results_Description075'), ''); //送料 + + const tankaData = await $p.ex.getRecordData(recordData.ClassHash.Class001); + const hanbaiData = await $p.ex.getRecordData(recordData.ClassHash.Class002); + const catalog1Data = await $p.ex.getRecordData(recordData.ClassHash.Class003); + const catalog2Data = await $p.ex.getRecordData(recordData.ClassHash.Class004); + const notePM1Data = await $p.ex.getRecordData(recordData.ClassHash.Class005); + const notePM2Data = await $p.ex.getRecordData(recordData.ClassHash.Class006); + const notePM3Data = await $p.ex.getRecordData(recordData.ClassHash.Class007); + + //取得した各データをconsoleに出力 + + let desc072data = []; + + console.log('単価表のデータ:', Object.keys(tankaData).length === 0 ? 'データなし' : tankaData); + if (Object.keys(tankaData).length > 0) { + let attachmentsHash = tankaData.AttachmentsHash; + let fileList = attachmentsHash.AttachmentsA; + + fileList.length > 0 && desc072data.push('▶単価表'); + + for (let i = 0; i < fileList.length; i++) { + let file = fileList[i]; + let fileName = file.Name; + let guid = file.Guid; + + let url = 'https://' + location.hostname + '/pleasanter/binaries/' + guid + '/download'; + let link = `[${fileName}](${url})`; + desc072data.push(link); + } + } + + console.log('販売算出表のデータ:', Object.keys(hanbaiData).length === 0 ? 'データなし' : hanbaiData); + if (Object.keys(hanbaiData).length > 0) { + let attachmentsHash = hanbaiData.AttachmentsHash; + let fileList = attachmentsHash.AttachmentsA; + + fileList.length > 0 && desc072data.push('▶販売算出表'); + + for (let i = 0; i < fileList.length; i++) { + let file = fileList[i]; + let fileName = file.Name; + let guid = file.Guid; + + let url = 'https://' + location.hostname + '/pleasanter/binaries/' + guid + '/download'; + let link = `[${fileName}](${url})`; + + desc072data.push(link); + } + } + + let desc072 = desc072data.join('\n'); + $p.set($('#Results_Description072'), desc072); + + //カタログ1,2, NotePM1,2,3のデータを取得 + let desc073data = []; + + console.log('カタログ1のデータ:', Object.keys(catalog1Data).length === 0 ? 'データなし' : catalog1Data); + if (Object.keys(catalog1Data).length > 0) { + if (catalog1Data.Body) { + desc073data.push('▶カタログ1'); + desc073data.push(catalog1Data.Body); + } + } + console.log('カタログ2のデータ:', Object.keys(catalog2Data).length === 0 ? 'データなし' : catalog2Data); + if (Object.keys(catalog2Data).length > 0) { + if (catalog2Data.Body) { + desc073data.push('▶カタログ2'); + desc073data.push(catalog2Data.Body); + } + } + console.log('NotePM1のデータ:', Object.keys(notePM1Data).length === 0 ? 'データなし' : notePM1Data); + if (Object.keys(notePM1Data).length > 0) { + if (notePM1Data.Body) { + desc073data.push('▶NotePM1'); + desc073data.push(notePM1Data.Body); + } + } + console.log('NotePM2のデータ:', Object.keys(notePM2Data).length === 0 ? 'データなし' : notePM2Data); + if (Object.keys(notePM2Data).length > 0) { + if (notePM2Data.Body) { + desc073data.push('▶NotePM2'); + desc073data.push(notePM2Data.Body); + } + } + console.log('NotePM3のデータ:', Object.keys(notePM3Data).length === 0 ? 'データなし' : notePM3Data); + if (Object.keys(notePM3Data).length > 0) { + if (notePM3Data.Body) { + desc073data.push('▶NotePM3'); + desc073data.push(notePM3Data.Body); + } + } + + let desc073 = desc073data.join('\n'); + $p.set($('#Results_Description073'), desc073); + + + //販売価格と送料のデータを取得 + if (partsData.NumA.Data) { + //販売価格と販売単位を結合して表示 + let price = partsData.NumA.Data ? partsData.NumA.Data.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',') : ''; + let unit = partsData.ClassP.Data ? partsData.ClassP.Data : ''; + let priceUnit = '¥ ' + price + ' ' + unit; + + $p.set($('#Results_Description074'), priceUnit); + + } + + if (partsData.NumB.Data) { + //送料と単位を結合して表示 + let shipping = partsData.NumB.Data ? partsData.NumB.Data.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',') : ''; + let shippingUnit = partsData.ClassQ.Data ? partsData.ClassQ.Data : ''; + let shippingUnitStr = '¥ ' + shipping + ' ' + shippingUnit; + + $p.set($('#Results_Description075'), shippingUnitStr); + } + + + $p.ex.checkAreaAndBrand(); + + //部材リストの内容によって表示内容を修正する + $p.ex.changeIraiPage(); + +} + +$p.ex.clearPartsData = function () { + //部材リストのデータの初期化 + //部材リストのデータの初期化 + partsData = { + "Status": { "Label": "問合せ有無", "Data": "" }, + "Comments": { "Label": "改訂履歴", "Data": "" }, + "ClassA": { "Label": "大分類", "Data": "" }, + "ClassB": { "Label": "中分類", "Data": "" }, + "ClassC": { "Label": "小分類", "Data": "" }, + "ClassD": { "Label": "メーカー", "Data": "" }, + "ClassE": { "Label": "算出方法", "Data": "" }, + "ClassI": { "Label": "品名/シリーズ", "Data": "" }, + "ClassJ": { "Label": "品番/コード", "Data": "" }, + "ClassK": { "Label": "タイプ/クラス/パターン", "Data": "" }, + "ClassL": { "Label": "サイズ", "Data": "" }, + "ClassM": { "Label": "追加・差額", "Data": "" }, + "ClassP": { "Label": "販売単位", "Data": "" }, + "ClassQ": { "Label": "単位", "Data": "" }, + "ClassV": { "Label": "対象エリア", "Data": "" }, //* + "ClassW": { "Label": "対象ブランド", "Data": "" }, //* + "Class001": { "Label": "単価表", "Data": "" }, //* + "Class002": { "Label": "販売算出表", "Data": "" }, //* + "Class003": { "Label": "カタログ1", "Data": "" }, //* + "Class004": { "Label": "カタログ2", "Data": "" }, //* + "Class005": { "Label": "NotePM1", "Data": "" }, //* + "Class006": { "Label": "NotePM2", "Data": "" }, //* + "Class007": { "Label": "NotePM3", "Data": "" }, //* + "NumA": { "Label": "販売価格", "Data": "" }, + "NumB": { "Label": "送料", "Data": "" }, + "DescriptionA": { "Label": "注記", "Data": "" }, //* + "DescriptionB": { "Label": "URL", "Data": "" }, + "Description001": { "Label": "検索キーワード", "Data": "" }, + "CheckA": { "Label": "注記有", "Data": "" }, + "CheckI": { "Label": "全エリア", "Data": "" }, + "CheckJ": { "Label": "全ブランド", "Data": "" }, + "Check001": { "Label": "東京", "Data": "" }, + "Check002": { "Label": "愛知", "Data": "" }, + "Check003": { "Label": "千葉", "Data": "" }, + "Check004": { "Label": "静岡", "Data": "" }, + "Check005": { "Label": "熊本", "Data": "" }, + "Check011": { "Label": "actie", "Data": "" }, + "Check012": { "Label": "nexthouse", "Data": "" }, + "Check013": { "Label": "ACTIVEHOUSE", "Data": "" }, + "Check014": { "Label": "Bluezia", "Data": "" }, + "Check015": { "Label": "CLEVERLYHOME", "Data": "" }, + "Check016": { "Label": "WELLHOMES", "Data": "" }, + "Check017": { "Label": "はちみつハウス", "Data": "" }, + "Check018": { "Label": "GRAPH", "Data": "" }, + } + + $p.set($('#Results_DescriptionX'), JSON.stringify(partsData)); + + //部材リストの値を空にする + $p.set($('#Results_Class071'), ''); + $p.set($('#Results_Class072'), ''); + $p.set($('#Results_Class073'), ''); + $p.set($('#Results_Class074'), ''); + $p.set($('#Results_Description071'), ''); + $p.set($('#Results_Description072'), ''); + $p.set($('#Results_Description073'), ''); + $p.set($('#Results_Description074'), ''); + $p.set($('#Results_Description075'), ''); + +} + +//Class011とClass012に表示されているテキスト情報を取得し、Class0073のなかの配列とClass074の中の配列にそれぞれ値が含まれているか確認する関数 +$p.ex.checkAreaAndBrand = function () { + + //Class011とClass012の値を取得 + let areaData = $('#Results_Class011 option:selected').text(); + let brandData = $('#Results_Class012 option:selected').text(); + + //Class073とClass074の値を取得 + let areaList = $('#Results_Class073').val(); + let brandList = $('#Results_Class074').val(); + + let brandDataConvert = convertAreaData(brandData); + + //$p.clearMessage(); + + //一致するエリアがある場合は青文字で表示し、一致しない場合はエリア不一致と赤文字で表示 + let areaListStr = $('#Results_Class073_ms span').eq(2).html(); + if (areaList.includes(areaData)) { + //$p.ex.setMyMessage('alert-success', 'エリア一致', 0); + areaListStr = areaListStr.replaceAll(areaData, `${areaData}`); + } else { + //$p.ex.setMyMessage('alert-danger', 'エリア不一致', 0); + areaListStr = '一致エリア無し, ' + areaListStr; + } + $('#Results_Class073_ms span').eq(2).html(areaListStr); + + //一致するブランドがある場合は青文字で表示し、一致しない場合はブランド不一致と赤文字で表示 + let brandListStr = $('#Results_Class074_ms span').eq(2).html(); + if (brandList.includes(brandDataConvert)) { + //$p.ex.setMyMessage('alert-success', 'ブランド一致', 0); + brandListStr = brandListStr.replaceAll(brandDataConvert, `${brandDataConvert}`); + } else { + //$p.ex.setMyMessage('alert-danger', 'ブランド不一致', 0); + brandListStr = '一致ブランド無し, ' + brandListStr; + } + $('#Results_Class074_ms span').eq(2).html(brandListStr); + +} + +//MSSと積算のエリアデータの整合性 +function convertAreaData(areaData) { + const areaMap = { + 'actie': 'actie', + 'nexthouse': 'nexthouse', + 'アクティブハウス': 'ACTIVE HOUSE', + 'ブルージア': 'Bluezia', + 'クレバリーホーム': 'CLEVERLY HOME', + 'WELLHOMES': 'WELLHOMES', + 'Graph': 'GRAPH', + 'nexthouse VALUE': 'nexthouse', + 'one-happy': 'nexthouse', + 'niko and ... EDIT HOUSE': 'none', + 'RCnext': 'none', + 'リフォームラボ': 'none', + '君津住宅': 'none', + '特建事業部': 'none', + '不動産・建売・モデルハウス': 'none' + }; + + return areaMap[areaData] !== undefined ? areaMap[areaData] : 'none'; +} + +$p.ex.changeIraiPage = function () { + console.log('依頼項目の表示内容を変更します'); + + + //部材リストが選択されていたら部材データの欄は表示しておく + let class042 = $('#Results_Class042').val(); + if (class042) { + $('#SectionFields17Container').show(); + + //$('#SectionFields2Container').hide(); //依頼項目の非表示 + //$('#SectionFields4Container').hide(); //不備追加資料の非表示 + } else { + $('#SectionFields17Container').hide(); + + //$('#SectionFields2Container').show(); //依頼項目の表示 + //$('#SectionFields4Container').show(); //不備追加資料の表示 + } + + //部材リストから取得したデータを分析 Class071 Class072 のデータ + let class071 = $('#Results_Class071').val(); //問合せ有無 + let class072 = $('#Results_Class072').val(); //算出方法 + + let status = $('#Results_Status').val(); + + + // Results_CheckA のチェック状態を取得 + if ($('#Results_CheckA').prop('checked')) { + class071 = '150'; //問合せ有無を「必要」に設定 + } + + + switch (class071) {//問合せ有無 必要,不要,保留,使用不可 + /* + case '': //未選択 + $('#SectionFields19Container').show(); + $p.ex.clearIraiItems(); + $('#SectionFields2Container').hide(); //依頼項目の非表示 + $('#SectionFields4Container').hide(); //不備追加資料の非表示 + + break; + */ + case '150': //必要 + $('li[aria-controls="FieldSetTab2"]').show(); //算出回答タブの表示 + $('li[aria-controls="FieldSetTab3"]').show(); //質疑応答タブの表示 + $('li[aria-controls="FieldSetTab4"]').show(); //営業積算課タブの表示 + $('li[aria-controls="FieldSetTab5"]').show(); //積算発注かタブの表示 + + $('#SectionFields17Container').hide(); //部材リストのデータを非表示 + + $('#SectionFields19Container').hide(); + $('#SectionFields2Container').show(); //依頼項目の表示 + $('#SectionFields4Container').show(); //不備追加資料の表示 + + break; + case '900': //不要 + case '910': //保留 + case '920': //使用不可 + //積算見積もり依頼は不要なので、営業積算項目以降のタブを非表示にする + $('li[aria-controls="FieldSetTab2"]').hide(); //算出回答タブの非表示 + $('li[aria-controls="FieldSetTab3"]').hide(); //質疑応答タブの非表示 + $('li[aria-controls="FieldSetTab4"]').hide(); //営業積算課タブの非表示 + $('li[aria-controls="FieldSetTab5"]').hide(); //積算発注かタブの非表示 + + $('#SectionFields19Container').hide(); + $('#SectionFields17Container').show(); //部材リストのデータを表示 + + $p.ex.clearIraiItems(); + $('#SectionFields2Container').hide(); //依頼項目の非表示 + $('#SectionFields4Container').hide(); //不備追加資料の非表示 + + //ステータスを「依頼済み」に変更 + status != '902' && $p.set($('#Results_Status'), '902'); + + break; + } + + +} + +/** + * #Results_Class058Field をクリックすると、2つの0.5単位入力欄と✕マーク付きモーダルを表示し、 + * モーダル外クリックで2つの値を✕で連結して #Results_Class058 に保存する + */ +function showMatrixSizeModal() { + // 既存モーダルがあれば削除 + $('#matrixSizeModal').remove(); + + // スクロール抑制 + $('body').css('overflow', 'hidden'); + + // #Results_Class058Field の位置取得 + const offset = $('#Results_Class058').offset(); + const width = $('#Results_Class058').outerWidth(); + + // モーダルHTML + const modalHtml = ` +
+ + + +
+ `; + $('body').append(modalHtml); + + // 既存値があれば分割してセット + const current = $('#Results_Class058').val(); + if (current && current.includes('✕')) { + const [v1, v2] = current.split('✕').map(s => s.trim()); + $('#matrixInput1').val(v1); + $('#matrixInput2').val(v2); + } + + // モーダルを開いたら #matrixInput1 にフォーカス + $('#matrixInput1').focus(); + + // モーダル外クリックで保存&モーダル削除 + setTimeout(() => { + $(document).on('mousedown.matrixModal', function (e) { + if (!$(e.target).closest('#matrixSizeModal, #Results_Class058Field').length) { + const val1 = $('#matrixInput1').val(); + const val2 = $('#matrixInput2').val(); + let result = ''; + if (val1 && val2) { + result = `${val1}✕${val2}`; + } else if (val1) { + result = val1; + } else if (val2) { + result = val2; + } + $p.set($('#Results_Class058'), result); + $('#matrixSizeModal').remove(); + // スクロール抑制解除 + $('body').css('overflow', ''); + $(document).off('mousedown.matrixModal'); + } + }); + }, 10); +} + +//Results_Class058 onfocusイベント +$('#Results_Class058').on('focus', function () { + showMatrixSizeModal(); +}); + + +/** + * 指定したIDのタグのID + */ +function addPlaceholderOption(selectId) { + //値が空の場合、プレースホルダー的なoptionを追加 + const val = $(`#${selectId}`).val(); + if (!val) { + //1つ目のoptionのテキストを変更 + $(`#${selectId} option:first`).text('次から選択してください'); + + } + //console.log($(`#${selectId}`)); +} diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/06_算出回答処理スクリプト.js b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/06_算出回答処理スクリプト.js new file mode 100644 index 00000000..ba0df4a1 --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/06_算出回答処理スクリプト.js @@ -0,0 +1,18 @@ +/* +@config :next999.json +@filename : ${psFileBasename} +@title : 06_算出回答処理スクリプト +@name : +@siteIds : 310405 +@siteTitles : Re③依頼項目 +@disabled: true +*/ + +$p.ex.resultAnswer = function () { + //算出・回答 Results_Description111 + //別途費用・伝達事項 Results_Description112 + //算出者 Results_Class113 + //算出bi Results_Date110 + // + +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/100.LINEWORKSメッセージ送信.js b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/100.LINEWORKSメッセージ送信.js new file mode 100644 index 00000000..35353bee --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/100.LINEWORKSメッセージ送信.js @@ -0,0 +1,36 @@ +// LINE WORKSのBot APIを使って特定ユーザーにメッセージを送信するサンプル(ブラウザJS) +// ※実際の運用ではアクセストークンの安全な管理やCORS制約のため、サーバー経由での実装が推奨されます + +async function sendLineworksMessage(userId, messageText) { + const accessToken = 'OZ/7AjHT1H7B1zInX5nQEsssQ+0OZF'; + //const apiUrl = 'https://apis.worksmobile.com/r/{API_ID}/message/v1/bot/{BOT_NO}/message/push'; // {API_ID}と{BOT_NO}は自身の値に置換 + const botId = '10130468'; + //const userId = 'k.nogi@works-nextgroup2'; + const apiUrl = `https://www.worksapis.com/v1.0/bots/${botId}/users/${userId}/messages`; + + + const body = { + content: { + type: 'text', + text: messageText + } + }; + + const response = await fetch(apiUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json;charset=UTF-8', + 'Authorization': `Bearer ${accessToken}` + }, + body: JSON.stringify(body) + }); + + if (response.ok) { + console.log('送信成功', await response.json()); + } else { + console.error('送信失敗', await response.text()); + } +} + +// 使用例 +// sendLineworksMessage('user@example.com', 'こんにちは!LINE WORKS Botからのメッセージです。'); \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/200.添付ファイル一括取得スクリプト.js b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/200.添付ファイル一括取得スクリプト.js new file mode 100644 index 00000000..dbec27af --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/200.添付ファイル一括取得スクリプト.js @@ -0,0 +1,153 @@ +/* +@config :next999.json +@filename : ${psFileBasename} +@title : 200.添付ファイル一括取得スクリプト +@name : +@siteIds : 310405 +@siteTitles : Re③依頼項目 +@disabled: false +*/ + +$p.ex.createDownloadCheckBox = function (attachId) { + let attachName = $('#Results_' + attachId + 'Field label')[0].innerHTML; + let items = JSON.parse($('#Results_' + attachId).val()); + + if (items.length > 0) { + //保存されているアイテムにチェックボックスを追加 + for (let item of items) { + let checkbox = document.createElement('input'); + checkbox.type = 'checkbox'; + checkbox.style.margin = '2px'; + checkbox.style.float = 'left'; + checkbox.name = attachId + '_checkbox'; + checkbox.id = item.Guid + '_checkbox'; + checkbox.value = item.Guid; + + $('#' + item.Guid).prepend(checkbox); + + } + + let zipFilename = attachName; + + //ダウンロードボタンを追加 + //ダウンロードボタン + let div = document.createElement('div'); + div.style.margin = '0px 5px 10px 120px'; + div.style.clear = 'both'; + + let dlButton1 = document.createElement('button'); + dlButton1.id = attachId + '_dlButton1'; + dlButton1.style.marginRight = '5px'; + dlButton1.innerHTML = '全ファイルDL'; + dlButton1.setAttribute('attach', attachId); + dlButton1.setAttribute('onclick', '$p.ex.dlAllFiles("' + attachId + '","' + zipFilename + '■全ファイルDL' + '")'); + + div.append(dlButton1); + + if (items.length > 1) { + let dlButton2 = document.createElement('button'); + dlButton2.id = attachId + '_dlButton2'; + dlButton2.style.marginRight = '5px'; + dlButton2.innerHTML = '選択DL'; + dlButton2.setAttribute('attach', attachId); + dlButton2.setAttribute('onclick', '$p.ex.dlSelectedFiles("' + attachId + '","' + zipFilename + '■選択DL' + '")'); + + div.append(dlButton2); + } + + + + //設置 + $('#Results_' + attachId + 'Field').after(div); + + //jQuery UIボタン化 + $('#' + attachId + '_dlButton1').button({ + icon: 'ui-icon-document' + }); + + if (items.length > 1) { + $('#' + attachId + '_dlButton2').button({ + icon: 'ui-icon-document' + }); + } + } +} + + +$p.ex.dlSelectedFiles = function (attachId, zipFilename) { + //チェックがついているもののみ + const fileList = $('input[name="' + attachId + '_checkbox"]:checked'); + let guidList = new Array(); + for (item of fileList) { + console.log(item); + guidList.push(item.value); + } + + if (guidList.length > 0) { + dlZipAttachements(guidList, zipFilename); + } + +} + +$p.ex.dlAllFiles = function (attachId, zipFilename) { + let guidList = new Array(); + //全部 + const fileList = JSON.parse($p.getControl(attachId).val()); + for (item of fileList) { + guidList.push(item.Guid); + } + + if (guidList.length > 0) { + dlZipAttachements(guidList, zipFilename); + } +} + +/** + * 複数ファイルを1ファイルにzip圧縮してDLする + * @param guidList DLする添付ファイルのGUIDのリスト + * @param zipFilename zipファイル名 + * @return なし + */ +async function dlZipAttachements(guidList, zipFilename) { + const zip = new JSZip(); + const jsonReq = { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + }; + + for (const guid of guidList) { + try { + const response = await fetch(`/pleasanter/api/binaries/${guid}/get`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(jsonReq), + }); + + if (!response.ok) { + throw new Error(`Failed to fetch file with GUID: ${guid}`); + } + + const data = await response.json(); + const binary = decodeBase64(data.Response.Base64); + const filename = data.Response.FileName; + + zip.folder(zipFilename).file(filename, binary, { binary: true }); + } catch (error) { + console.error(`Error fetching file with GUID: ${guid}`, error); + } + } + + saveAs(await zip.generateAsync({ type: "blob" }), zipFilename + ".zip"); +} + +//base64デコード処理 +function decodeBase64(base64) { + const bin = atob(base64.replace(/^.*,/, '')); + const buffer = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; i++) { + buffer[i] = bin.charCodeAt(i); + } + return buffer.buffer; +} diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/90_スタートメッセージ表示.js b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/90_スタートメッセージ表示.js new file mode 100644 index 00000000..b5d7801d --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/90_スタートメッセージ表示.js @@ -0,0 +1,43 @@ +/* +@config :next999.json +@filename : ${psFileBasename} +@title : 90_スタートメッセージ表示 +@name : +@siteIds : 310405 +@siteTitles : Re③依頼項目 +@disabled: false +*/ + +//スタートアップメッセージ表示 +$p.ex.startupMessage = function () { + let count = 0; + for (message of messageData) { + //2つ目以降のメッセージの際にクリアフラグを0に設定。 + let clearFlag = 0;//count > 0 ? 0 : 1; + $p.ex.setMyMessage(message.colorCode, message.message, clearFlag); + count++; + } + + + //開いたときに表示するメッセージ一覧 + switch ($('#Results_Status').val()) { + case '100': //新規登録 + break; + case '200': //登録完了 + break; + case '300': //積算依頼 + break; + case '400': //積算受付 + break; + case '500': //積算対応中 + break; + case '800': //一部完了 + break; + case '900': //完了 + break; + case '910': //保留 + break; + case '920': //取消 + break; + } +} diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/99_更新履歴保存スクリプト.js b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/99_更新履歴保存スクリプト.js new file mode 100644 index 00000000..28a78d68 --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/99_更新履歴保存スクリプト.js @@ -0,0 +1,123 @@ +/* +@config :next999.json +@filename : ${psFileBasename} +@title : 99_更新履歴保存スクリプト +@name : +@siteIds : 310405 +@siteTitles : Re③依頼項目 +@disabled: false +*/ + +//変更内容を保存 +$p.ex.saveHistory = function () { + let history = ''; + let count = 0; + + //履歴に表示しない項目リスト + let excludeList = [ + 'Results_Timestamp', + 'Results_ClassL', + 'Results_ClassM', + 'Results_ClassN', + 'Results_CheckA', + 'Results_Class035', + 'Results_Class036', + 'Results_Class037', + 'Results_Class038', + 'Results_Class043', + 'Results_Class045', + 'Results_Class046', + 'Results_Class047', + 'Results_Class048', + 'Results_Class191', + 'Results_Class192', + 'Results_Class193', + 'Results_Class071', + 'Results_Class072', + 'Results_Class073', + 'Results_Class074', + 'Results_DescriptionX', + 'Results_Description055', + 'Results_Description115', + 'Results_Description131', + 'Results_Attachments131', + 'Results_Date131', + 'Results_Description132', + 'Results_Attachments132', + 'Results_Num131', + 'Results_Num132', + 'Results_Description135', + 'Results_Class136', + 'Results_Date136', + 'Results_Description136', + 'Results_Class151', + 'Results_Class152', + 'Results_Date151', + 'Results_Class153', + 'Results_Date152', + 'Results_Description151', + 'Results_Description155', + 'Results_NumX', + 'Results_NumY', + 'Results_Description200' + ]; + + if ($p.data.MainForm) { + $p.set($('#Results_Description200'), ''); + + history = '◆ 変更内容 ◆\n'; + $.each($p.data.MainForm, function (index, val) { + if (index.startsWith('Results')) { + if (!excludeList.includes(index)) { + //項目名の取得 + let colName = $('label[for="' + index + '"]').text(); + let text; + //セレクトボックス判定 + if ($('#' + index + '.control-dropdown').length) { + //セレクトボックス処理 + if ($('#' + index).prop("multiple")) { + text = $('#' + index + '_ms span').eq(-1).text(); + } else { + text = $('#' + index + ' option:selected').text(); + } + } else if ($('#' + index + '.radio-value').length) { + //ラジオボタン処理 + text = val != '' ? $('label[for="' + index + val + '"').text() : ''; + } else { + //その他 + text = val; + } + + history += '▷ ' + colName + ' : ' + text + '\n'; + count++; + } + } + }); + + if (count) { + //console.log(history); + $p.set($('#Results_Description200'), history); + $p.set($('#Comments'), history); + } + } +} + +//古いコメントを削除するスクリプトを作成予定 +$p.ex.deleteOldComments = function () { + $p.apiGet({ + 'id': $p.id(), + 'data': { + 'ApiVersion': 1.1, + //'ApiKey': apiKey, + }, + 'done': function (data) { + //console.log(data.Response.Data[0].Comments); + let comments = JSON.parse(data.Response.Data[0].Comments); + console.log(comments); + console.log(comments.slice(0, 5)); + console.log(JSON.stringify(comments)); + console.log(JSON.stringify(comments.slice(0, 5))); + + } + }); +} diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/messageData.html b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/messageData.html new file mode 100644 index 00000000..732a3399 --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/scripts/messageData.html @@ -0,0 +1,37 @@ + + + + + + + + + + {{flow_title}} + + + + + ` + + {{#messageData}} + + + + + + + + + {{/flowArray}} + +
{{type}}{{userName}}{{messageTime}}
+
{{{messageBody}}}
+
`; + + + \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/serverscripts/01.原価閲覧メンバー照会.js b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/serverscripts/01.原価閲覧メンバー照会.js new file mode 100644 index 00000000..b24c5bd3 --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/serverscripts/01.原価閲覧メンバー照会.js @@ -0,0 +1,219 @@ +/* +@config :next999.json +@filename : ${psFileBasename} +@title :01.原価閲覧メンバー照会 +@name :01.原価閲覧メンバー照会 +@siteIds : 310405 +@siteTitles : Re③依頼項目 +@disabled: false +*/ + +//原価閲覧メンバーを紹介し、リストを返すサーバースクリプト +try { + if (context.ControlId) { + //自動ポストバック + + //context.Log('自動ポストバック: ' + context.ControlId); + let controlIdPrefix = context.ControlId.substring(0, 16); + + switch (controlIdPrefix) { + case 'Results_Class045': + //context.Log('Results_Class045の自動ポストバック'); + columns.Class035.AddChoiceHash(model.Class045, model.Class045); + context.ResponseSet('Class035', model.Class045); //Class045の値をClass035に設定 + + //部材リストを読取り専用に設定 + columns.Class042.ExtendedFieldCss = 'code-readonly2'; + context.ResponseSet('Class042', ''); //Class042を空に設定 + + + break; + case 'Results_Class046': + //context.Log('Results_Class046の自動ポストバック'); + columns.Class036.AddChoiceHash(model.Class046, model.Class046); + context.ResponseSet('Class036', model.Class046); //Class045の値をClass035に設定 + + //部材リストを読取り専用に設定 + columns.Class042.ExtendedFieldCss = 'code-readonly2'; + context.ResponseSet('Class042', ''); //Class042を空に設定 + + break; + case 'Results_Class047': + //context.Log('Results_Class047の自動ポストバック'); + columns.Class037.AddChoiceHash(model.Class047, model.Class047); + context.ResponseSet('Class037', model.Class047); //Class047の値をClass037に設定 + + //部材リストを読取り専用に設定 + columns.Class042.ExtendedFieldCss = 'code-readonly2'; + context.ResponseSet('Class042', ''); //Class042を空に設定 + + break; + case 'Results_Class048': + //context.Log('Results_Class048の自動ポストバック'); + columns.Class038.AddChoiceHash(model.Class048, model.Class048); + context.ResponseSet('Class038', model.Class048); //Class048の値をClass038に設定 + + //部材リストを読取り専用に設定 + //columns.Class042.ExtendedFieldCss = 'code-readonly2'; + context.ResponseSet('Class042', ''); //Class042を空に設定 + + break; + } + + //自動ポストバックの処理はここで終了 + + } else { + + //部材リストを読取り専用に設定 + columns.Class042.ExtendedFieldCss = 'code-readonly2'; + + //【営業積算】原価閲覧グループ 63 のメンバーを取得 + getSekisanMenberList(); + + //全従業員グループ 27 のメンバーを取得 + getUserList(); + + //マスターシートからデータを取得し、一部を格納する + getMSSdata(); + + //メッセージデータを取得 + getMessageData(); + + } + +} catch (error) { + context.Log(error); +} + +function getMSSdata() { + try { + let mssDataId = model.ClassY; + if (!mssDataId) { + //context.Log('マスターシートのデータIDが設定されていません。'); + return; + } else { + context.Log(`マスターシートのデータID: ${mssDataId}`); + let records = items.Get(mssDataId); + + hidden.Add('mssData_Brand', records[0].Class033); + hidden.Add('mssData_Series', records[0].Class035); + } + + } catch (error) { + context.Log(error); + + } + +} + +function getSekisanMenberList() { + try { + //【営業積算】原価閲覧グループ 63 のメンバーを取得 + let group = groups.Get(63); + let memberIds = [] + let deptIds = [] + + for (let member of group.GetMembers()) { + if (member.UserId == 0) { + deptIds.push(member.DeptId); + } else { + memberIds.push(member.UserId); + } + //context.Log(`${member.DeptId},${member.UserId}`); + } + + //【営業積算】原価閲覧グループの組織とメンバーをHTML隠し要素に出力 + hidden.Add('sekisanMemberList', JSON.stringify(memberIds)); + hidden.Add('sekisanDeptList', JSON.stringify(deptIds)); + } catch (error) { + context.Log(error); + + } + +} + +//ユーザー情報をHTML内に格納する関数 +function getUserList() { + try { + //--------------------------------------------------------------------- + group = groups.Get(27); //全従業員グループ27 + let userList = {}; + + //ユーザー情報を取得してリストを作成 + for (let member of group.GetMembers()) { + //ユーザー情報情報取得 + let user = users.Get(member.UserId); + let rows = extendedSql.ExecuteTable('GetUserMailAddresses', '{"OwnerId": ' + user.UserId + '}'); + let mailAddrs = []; + + for (let row of rows) { + mailAddrs.push(row.MailAddress); + } + + let dept = depts.Get(user.DeptId); + let deptName = dept ? dept.DeptName : ''; + + userList[user.UserId] = { + userId: user.UserId, + name: user.Name, + deptId: user.DeptId, + deptName: deptName, + mailAddresses: mailAddrs.join(','), + //deptName: dept.Name + } + + } + + //context.Log(`ユーザーリスト: ${JSON.stringify(userList)}`); + // ユーザーリストをHTML隠し要素に出力 + hidden.Add('userList', JSON.stringify(userList)); + } catch (error) { + context.Log(error); + + } + +} + +//メッセージデータ取得 +function getMessageData() { + //メッセージデータを取得 + let data = { + "View": { + "ColumnFilterHash": { + "ClassA": "[\"" + model.SiteId + "\"]", + "ClassB": model.Status + }, + "ColumnSorterHash": { + "ClassA": "asc", + "ClassB": "asc", + "NumA": "asc" + } + } + } + + let results = items.Get(326371, JSON.stringify(data)); + if (results.length === 0) { + //context.Log('メッセージデータが見つかりませんでした。'); + return; + } + + let messageData = [] + for (let item of results) { + const status = item.ClassB; + const colorCode = item.ClassC; + const message = item.ClassD; + messageData.push({ + "status": status, + "colorCode": colorCode, + "message": message, + }); + } + + //取得したメッセージデータをhiddenに格納 + if (messageData.length > 0) { + hidden.Add('messageData', JSON.stringify(messageData)); + } else { + //context.Log('メッセージデータが見つかりませんでした。'); + } + +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/serverscripts/getUserList.js b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/serverscripts/getUserList.js new file mode 100644 index 00000000..33a78de6 --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/serverscripts/getUserList.js @@ -0,0 +1,33 @@ +function getUserList() { + try { + //--------------------------------------------------------------------- + group = groups.Get(27); //全従業員グループ27 + let userList = {}; + + //ユーザー情報を取得してリストを作成 + for (let member of group.GetMembers()) { + //ユーザー情報情報取得 + let user = users.Get(member.UserId); + let dept = depts.Get(user.DeptId); + + //let dept = depts.Get(user.DeptId); + context.Log(`ユーザーID: ${user.UserId}, 名前: ${user.Name}, 部署ID: ${user.DeptId}, 部署名: ${dept.DeptName}`); + + userList[user.UserId] = { + userId: user.UserId, + name: user.Name, + deptId: user.DeptId, + deptName: dept.DeptName + } + + } + + //context.Log(`ユーザーリスト: ${JSON.stringify(userList)}`); + // ユーザーリストをHTML隠し要素に出力 + hidden.Add('userList', JSON.stringify(userList)); + } catch (error) { + context.Log(error); + } +} + +getUserList(); diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/styles/01_読み取り専用スタイル.css b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/styles/01_読み取り専用スタイル.css new file mode 100644 index 00000000..cec3d078 --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/styles/01_読み取り専用スタイル.css @@ -0,0 +1,134 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 01_読み取り専用スタイル +@name +@siteIds : 310405 +@siteTitles : Re③依頼項目 +@disabled: false +*/ +label.error { + pointer-events: none; + z-index: 100; + border-top: none !important; +} + +.code-readonly { + pointer-events: none; + background-color: lightgrey; + font-weight: bold; +} + +.code-readonly2, +.code-readonly2+button, +.code-readonly2+div.ui-icon, +.code-readonly3, +.code-readonly3+button, +.code-readonly3+div.ui-icon { + font-weight: bold; + + &:active { + pointer-events: none; + } + + a:not(.ui-spinner-button) { + pointer-events: auto; + } + +} + +.code-readonly2 select, +.code-readonly2 input, +.code-readonly2 button.ui-multiselect, +.code-readonly2 .control-markup, +.code-readonly2 .ui-spinner, +span[data-readonly="1"] { + pointer-events: none; + + border: dashed 1px black !important; + background-color: lightgray !important; + color: black !important; + + .ui-spinner-input { + border: none; + } +} + +.code-readonly3 select, +.code-readonly3 input, +.code-readonly3 button.ui-multiselect, +.code-readonly3 .control-markup, +.code-readonly3 .ui-spinner { + pointer-events: none; + + border: dashed 1px black !important; + + .ui-spinner-input { + border: none; + } +} + +.code-readonly2, +.code-readonly3, +.field-normal:has(span[data-readonly="1"]), +.field-wide:has(span[data-readonly="1"]) { + position: relative; + + &:hover::after { + content: "読取り専用です"; + position: absolute; + left: 120px; + top: calc(100% - 9px); + margin-top: 4px; + background: #00000080; + color: #fff; + padding: 4px 10px; + border-radius: 4px; + font-size: 12px; + font-weight: normal !important; + pointer-events: none; + z-index: 9999; + white-space: nowrap; + } +} + +.code-required, +select[data-validate-required="1"], +input[data-validate-required="1"] { + border: double 3px red !important; + + &+button.ui-multiselect { + border: double 3px red !important; + } + +} + +.field-normal:has(.code-required), +.field-wide:has(.code-required), +.field-normal:has(select[data-validate-required="1"]), +.field-wide:has(select[data-validate-required="1"]), +.field-normal:has(input[data-validate-required="1"]), +.field-wide:has(input[data-validate-required="1"]) { + position: relative; + + &:hover::after { + content: "入力必須です"; + position: absolute; + left: 120px; + top: calc(100% - 9px); + margin-top: 4px; + background: #ff000080; + color: #fff; + padding: 4px 10px; + border-radius: 4px; + font-size: 12px; + font-weight: normal !important; + pointer-events: none; + z-index: 9999; + white-space: nowrap; + } +} + +.error { + border: double 3px red !important; +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/styles/02_共通スタイル.css b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/styles/02_共通スタイル.css new file mode 100644 index 00000000..6a242d13 --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/styles/02_共通スタイル.css @@ -0,0 +1,30 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 02_共通スタイル +@name +@siteIds : 310405 +@siteTitles : Re③依頼項目 +@disabled: false +*/ +/*見出しサイズ*/ +.field-section { + font-size: 1.5em !important; + font-weight: bold !important; + height: auto; +} + +/*項目の後ろの行間を少し狭める*/ +.field-normal { + height: 35px; +} + +.field-wide { + min-height: 35px; + padding: 0 10px 5px 0; +} + +/*コメントのある項目の高さだけ少し広げる*/ +div:has(.commentAdd).field-normal { + height: 50px; +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/styles/03_プロセスボタン表示調整.css b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/styles/03_プロセスボタン表示調整.css new file mode 100644 index 00000000..64237547 --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/styles/03_プロセスボタン表示調整.css @@ -0,0 +1,14 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 03_プロセスボタン表示調整 +@name +@siteIds : 310405 +@siteTitles : Re③依頼項目 +@disabled: false +*/ + +.processButtonSize { + font-size: 1.2em !important; + font-weight: bold !important; +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/styles/04_質疑回答テーブル.css b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/styles/04_質疑回答テーブル.css new file mode 100644 index 00000000..7dd13f83 --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/styles/04_質疑回答テーブル.css @@ -0,0 +1,94 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 04_質疑回答テーブル +@name +@siteIds : 310405 +@siteTitles : Re③依頼項目 +@disabled: false +*/ + +#messageTable { + width: 98%; + margin: 8px; + border-collapse: separate !important; +} + +.radius-table { + border-radius: 10px !important; + border-spacing: 0; + border: none; + border-left: 1px solid #999; + border-top: 1px solid #999; +} + +.radius-table tr>* { + padding: 5px 10px; + border: none; + border-right: 1px solid #999; + border-bottom: 1px solid #999; +} + +.radius-table tr:first-child>*:first-child { + border-radius: 10px 0 0 0; +} + +.radius-table tr:first-child>*:last-child { + border-radius: 0 10px 0 0; +} + +.radius-table tr:last-child>*:first-child { + border-radius: 0 0 0 10px; +} + +.radius-table tr:last-child>*:last-child { + border-radius: 0 0 10px 0; +} + +.Question>td { + background-color: coral; + vertical-align: middle; +} + +.Question\.Disabled>td, +.Answer\.Disabled>td { + background-color: grey !important; +} + +.Answer>td { + background-color: yellow; + vertical-align: middle; + +} + +.shitsugi_type { + font-weight: bold; + font-size: 1.5em; +} + +.shitsugi_userName { + text-align: center; + width: 150px; + font-size: 1.2em; +} + +.shitsugi_messageTime { + text-align: right; + font-size: 1.2em; +} + +.shitsugi_messageBody { + background-color: white !important; +} + +.shitsugi_deleteCheck { + background-color: white !important; + text-align: center; + width: 80px; +} + +.shitsugi_preWrap { + white-space: pre-wrap; + text-overflow: ellipsis; + break-inside: avoid; +} \ No newline at end of file diff --git a/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/styles/05_項目のサイズ変更.css b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/styles/05_項目のサイズ変更.css new file mode 100644 index 00000000..7fff7094 --- /dev/null +++ b/pleasanter/develop/#営業積算/■3_310405_Re③依頼項目/sites/styles/05_項目のサイズ変更.css @@ -0,0 +1,171 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 05_項目のサイズ変更 +@name +@siteIds : 310405 +@siteTitles : Re③依頼項目 +@disabled: false +*/ +.control-markup { + background: white !important; +} + +#Results_Description071\.viewer, +#Results_Description072\.viewer, +#Results_Description073\.viewer, +#Results_Description074\.viewer, +#Results_Description075\.viewer { + min-height: auto !important; +} + +#Results_Description074\.viewer, +label[for="Results_Description074"] { + font-size: 1.5em !important; + font-weight: bold !important; + + span { + font-weight: bold !important; + } +} + +#Results_Description075\.viewer, +label[for="Results_Description075"] { + font-size: 1.3em !important; + font-weight: bold !important; + + span { + font-weight: bold !important; + } +} + +#Results_ClassC { + width: 230px; +} + +#Results_ClassC, +label[for="Results_ClassC"] { + font-size: 1.5em !important; + font-weight: bold !important; + height: 2.2em !important; +} + +#Results_Class041 { + width: 330px; +} + +#Results_Class041, +label[for="Results_Class041"] { + font-size: 1.5em !important; + font-weight: bold !important; + height: 2.2em !important; +} + +#Results_Class041Field { + height: 60px !important; +} + +label[for="Results_ClassO"], +label[for="Results_ClassP"], +label[for="Results_ClassQ"], +label[for="Results_DescriptionO"] { + font-size: 1.2em !important; + font-weight: bold !important; +} + +.container-radio label { + font-size: 1.2em !important; + font-weight: bold !important; +} + +label[for="Results_DateJ"] { + font-weight: bold; + color: red; +} + +#Results_DateI { + font-weight: bold; + font-size: 1.2em; + background-color: lightblue; +} + +#Results_DateJ { + font-weight: bold; + font-size: 1.2em; + background-color: red !important; + color: white !important; +} + +.dateI_alert { + background-color: red !important; + color: white !important; +} + +#Results_DescriptionOField { + margin-bottom: 10px; +} + +a[href="#FieldSetTab4"] { + background-color: purple; + color: white !important; +} + +a[href="#FieldSetTab5"] { + background-color: darkgreen; + color: white !important; +} + +#Results_Class012 { + background-color: lightyellow; + border: 2px solid red; +} + +.matrix-input { + margin: 0px; + padding: 0px; + width: 60px; + text-align: center; +} + +p.field-label>label { + white-space: nowrap; + overflow: hidden; +} + +.buzaiComment { + font-size: 0.9em !important; + font-weight: bold !important; + color: white !important; + background-color: black !important; + + width: 30%; + display: inline-block; + padding: 10px; + border-radius: 10px; +} + +.brandComment { + font-size: 0.9em !important; + font-weight: bold !important; + color: white !important; + background-color: black !important; + width: 30%; + display: inline-block; + float: left; + padding: 10px; + border-radius: 10px; +} + +.commentAdd2 { + font-size: 0.7em; + font-weight: bold; + color: red; + margin-left: 10px; +} + +.commentAdd3 { + font-size: 0.7em; + font-weight: bold; + color: blue; + margin-left: 10px; +} \ No newline at end of file diff --git a/pleasanter/develop/MDエディタ/connectionSetting/next999.json b/pleasanter/develop/MDエディタ/connectionSetting/next999.json new file mode 100644 index 00000000..aeb831e2 --- /dev/null +++ b/pleasanter/develop/MDエディタ/connectionSetting/next999.json @@ -0,0 +1,4 @@ +{ + "apiKey": "c38903157cbffc30961f50bc29d0991a6cd8af495ab3009b05c5f98e82b2e61b94ba2d5c0a48fc518b1cd74c9e427b01051a228f670f3c5282544dfbec93db87", + "url": "https://neo999.next-hd.net/pleasanter/" +} \ No newline at end of file diff --git a/pleasanter/develop/MDエディタ/sites/scripts/memo.js b/pleasanter/develop/MDエディタ/sites/scripts/memo.js new file mode 100644 index 00000000..f42fa80a --- /dev/null +++ b/pleasanter/develop/MDエディタ/sites/scripts/memo.js @@ -0,0 +1,207 @@ +/** + * canvasJs + */ +const canvas = document.getElementById("canvas"); +const context = canvas.getContext("2d"); +const clearButton = document.getElementById("clear"); +const saveButton = document.getElementById('saveSign'); + +let isDragging = false; +let lastPosition = { + x: null, + y: null +}; + +/** + * 描画処理 + */ +function draw(x, y) { + if (!isDragging) { + return; + } + + // 線端の形状, 太さ, 色 + context.lineCap = "round"; + context.lineWidth = 3; + context.strokeStyle = "black"; + + if (lastPosition.x === null || lastPosition.y === null) { + context.moveTo(x, y); + } else { + context.moveTo(lastPosition.x, lastPosition.y); + } + context.lineTo(x, y); + context.stroke(); + + // 座標保持 + lastPosition.x = x; + lastPosition.y = y; +} + +/** + * 描画の開始 + */ +function dragStart(event) { + context.beginPath(); + isDragging = true; +} + +/** + * 描画の終了 + */ +function dragEnd(event) { + context.closePath(); + isDragging = false; + + // 座標リセット + lastPosition.x = null; + lastPosition.y = null; +} + +/** + * 描画の削除 + */ +function clear() { + context.clearRect(0, 0, canvas.width, canvas.height); + context.fillStyle = "#FFFFFF"; //筆に白い絵の具をつけて + context.fillRect(0, 0, 800, 200); //四角を描く +} + +/** + * イベント定義 + */ +function init() { + clear(); + // PC用 + canvas.addEventListener("mousedown", dragStart); + canvas.addEventListener("mouseup", dragEnd); + canvas.addEventListener("mouseout", dragEnd); + canvas.addEventListener("mousemove", (e) => { + //console.log(canvas.getBoundingClientRect().top); + draw( + e.layerX - canvas.getBoundingClientRect().left + 4, + e.layerY - canvas.getBoundingClientRect().top + 130 + ); + }); + // SP用 + canvas.addEventListener("touchstart", dragStart); + canvas.addEventListener("touchcancel", dragEnd); + canvas.addEventListener("touchend", dragEnd); + canvas.addEventListener("touchmove", (e) => { + // 描きづらいのでスワイプさせない + e.preventDefault(); + + let x = e.touches[0].clientX - canvas.getBoundingClientRect().left; + let y = e.touches[0].clientY - canvas.getBoundingClientRect().top; + + draw(x, y); + }); + // リセット + clearButton.addEventListener("click", clear); + saveButton.addEventListener('click', saveSign); +} + +function saveSign() { + let base64 = canvas.toDataURL('image/png'); + /* + console.log(base64); + $p.apiCreate({ + "id": $p.id(), + "data": { + "ApiVersion": 1.1, + "Title": "署名", + "AttachmentHash": { + "AttachmentA": { + "ContentType": "image/png", + "Name": "署名.txt", + "Base64": base64 + } + } + }, + "done": function (data) { + console.log(data); + }, + "fail": function (data) { + console.log(data); + }, + "always": function (data) { + console.log(data); + } + }); + */ + + + // Canvas から Blob オブジェクトを生成 + canvas.toBlob(async (blob) => { + // 画像データをクリップボードに書き込む + const item = new ClipboardItem({ + 'image/png': blob + }); + await navigator.clipboard.write([item]); + //window.alert('クリップボードにコピーしました。'); + + myClipboard2Column('DescriptionA', false); + + /* + //ペースト + let pasteArea = document.getElementById('Results_Body'); + + navigator.clipboard.readText() + .then(function(text) { + pasteArea.style.display = 'block'; + pasteArea.focus(); + let KEvent = new KeyboardEvent("keydown", { + key: "A" + }); + pasteArea.dispatchEvent(KEvent); + + }); + */ + }); + + +} + +$p.events.on_editor_load = function () { + init(); +} + +/* +myClipboard2Column + +引数 + columnName:対象カラム (ex:'分類A':ラベル、'ClassA':論理名) + appendFlg:追記フラグ (true:追記、false:上書き) + +使い方 + myClipboard2Column('説明です', true); + myClipboard2Column('ClassA', false); + +注意点 + ブラウザが前面のある時しか動作しません。 +*/ +async function myClipboard2Column(columnName, appendFlg) { + try { + const $control = $p.getControl(columnName); + const clipboardContents = await navigator.clipboard.read(); + for (const item of clipboardContents) { + if (item.types.includes("text/plain")) { + const str0 = (appendFlg) ? $control.val() : ""; + const str1 = await (await item.getType("text/plain")).text(); + $p.set($control, str0 + str1); + $p.setFormChanged($control); + } + else if (item.types.includes('image/png')) { + if ($control.hasClass("upload-image")) { + if (!appendFlg) $p.set($control, ""); + const blob = await item.getType("image/png"); + $p.uploadImage($control.attr('id'), blob); + $p.setFormChanged($control); + } + } + } + } + catch (error) { + console.error(error.message); + } +} \ No newline at end of file diff --git a/pleasanter/develop/MDエディタ/sites/scripts/mermaid_Editor.js b/pleasanter/develop/MDエディタ/sites/scripts/mermaid_Editor.js new file mode 100644 index 00000000..3f6016ad --- /dev/null +++ b/pleasanter/develop/MDエディタ/sites/scripts/mermaid_Editor.js @@ -0,0 +1,214 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : mermaid_Editor +@name : +@siteIds : 326341 +@siteTitles : MD作成 +@disabled: false +*/ +let pageLoading = 0; //ページのロード状態を管理する変数 +//---------------------------------------------------------------------- +//初期処理 +window.addEventListener('load', function () { + if (pageLoading == 0) { + console.log('Window load Event'); + $p.ex.onLoad(); + } +}); + +$p.events.on_editor_load = function () { + if (pageLoading == 0) { + console.log('on Editor Load'); + $p.ex.onLoad(); + } +} + +//---------------------------------------------------------------------- +$p.ex.onLoad = function () { + //ロード開始 + pageLoading = 1; + + //初期処理 + $p.ex.init(); +} + +//初期処理 +$p.ex.init = function () { + //初期化 + const mermaidContent = $('#Results_Body').val(); //値を取得 + + if ($('#mermaidWindow').length) { + $('#mermaidWindow').remove(); //既存のMermaidウインドウを削除 + } + + //Mermaidウインドウ + let mermaidWindow = document.createElement('div'); + mermaidWindow.id = 'mermaidWindow'; //任意のIDを指定 + mermaidWindow.className = 'mermaidWindow'; //任意のクラスを指定 + + let h1 = document.createElement('h1'); + h1.innerHTML = 'Mermaid Viewer'; + mermaidWindow.appendChild(h1); + + let h2 = document.createElement('h2'); + h2.innerHTML = 'Mermaid記法で記述された図がプレビューされます。'; + mermaidWindow.appendChild(h2); + + //Preview用Preタグを作成 + const pre = document.createElement('pre'); + pre.id = 'mermaidPreview'; + pre.className = 'mermaid'; //Mermaid描画用のクラスを設定 + pre.textContent = mermaidContent; //Mermaid記法を設定 + + //描画エリアに追加 + mermaidWindow.appendChild(pre); + $('#Editor').after(mermaidWindow); + + //Mermaidを再レンダリング + if (window.mermaid) { + mermaid.init(undefined, '#mermaidPreview'); + } else { + console.error('Mermaidライブラリが読み込まれていません。'); + } + + //PNG出力ボタンを作成 + createExportButton(); +}; + +//Mermaid図をPNG形式で出力するボタンを作成 +function createExportButton() { + const exportButton = document.createElement('button'); + exportButton.id = 'exportMermaid'; + exportButton.textContent = 'PNGとして保存'; + exportButton.style.marginTop = '10px'; + + //ボタンのクリックイベント + exportButton.addEventListener('click', function () { + const mermaidPreview = document.getElementById('mermaidPreview'); + if (mermaidPreview) { + html2canvas(mermaidPreview).then(canvas => { + const link = document.createElement('a'); + link.download = 'mermaid-diagram.png'; + link.href = canvas.toDataURL('image/png'); + link.click(); + }).catch(error => { + console.error('PNG出力中にエラーが発生しました:', error); + }); + } else { + console.error('Mermaidプレビューエリアが見つかりません。'); + } + }); + + //Mermaidウインドウにボタンを追加 + const mermaidWindow = document.getElementById('mermaidWindow'); + if (mermaidWindow) { + mermaidWindow.appendChild(exportButton); + $(exportButton).button({ + icon: "ui-icon-image", + showLabel: true + }); + } else { + console.error('Mermaidウインドウが見つかりません。'); + } +} + +//#Results_Body の中身が変更されたら処理を実行 +$p.on('change', 'Body', function () { + $p.ex.init(); + +}); + +$p.events.after_set = function (args) { + $p.ex.init(); + +} + +$p.events.before_validate_Update = async function (args) { + console.log('Mermaid画像の保存を開始します。'); + + // saveMermaidImage() の完了を待つ + const result = await saveMermaidImage(); + + if (result) { + console.log('Mermaid画像の保存が成功しました。次の処理を実行します。'); + // 次の処理をここに記述 + } else { + console.error('Mermaid画像の保存に失敗しました。処理を中断します。'); + return false; // 処理を中断 + } + + // 必要に応じて次の処理を続行 + console.log('次の処理を実行中...'); + return false; // 処理を続行 +}; + +async function saveMermaidImage() { + const mermaidPreview = document.getElementById('mermaidPreview'); + if (mermaidPreview) { + try { + const canvas = await html2canvas(mermaidPreview); + const pngBase64 = canvas.toDataURL('image/png').replace(/^data:image\/png;base64,/, ''); + + // uploadImage関数のレスポンスを待つ + const res = await uploadImage(pngBase64); + console.log('アップロード結果:', res); + + if (res && res.StatusCode === 200) { + console.log('アップロードが成功しました。'); + return true; // 成功 + } else { + console.error('アップロードに失敗しました。'); + return false; // 失敗 + } + } catch (error) { + console.error('PNG変換またはアップロード中にエラーが発生しました:', error); + return false; // エラー + } + } else { + console.error('Mermaidプレビューエリアが見つかりません。'); + return false; // プレビューエリアがない + } +} + +async function uploadImage(pngBase64) { + const url = 'https://' + location.hostname + '/pleasanter/api/items/' + $p.id() + '/update' + const json = { + 'ApiVersion': 1.1, + 'DescriptionHash': { + 'DescriptionA': '' // Mermaid記法を設定 + }, + 'ImageHash': { + 'DescriptionA': { + 'Base64': pngBase64, + } + } + } + + const res = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(json) + }); + + return res.json(); + +} + +//要素が読み込まれるまで待機し、返す +function waitForElement(selector, callback, interval = 100, timeout = 5000) { + const startTime = Date.now(); + + const checkExist = setInterval(function () { + if ($(selector).length) { + clearInterval(checkExist); //要素が見つかったら停止 + callback(); + } else if (Date.now() - startTime > timeout) { + clearInterval(checkExist); //タイムアウト処理 + console.warn(`指定した要素 '${selector}' が ${timeout / 1000} 秒以内に見つかりませんでした。`); + } + }, interval); +} + diff --git a/pleasanter/develop/MDエディタ/sites/scripts/mermaid_Editor2.js b/pleasanter/develop/MDエディタ/sites/scripts/mermaid_Editor2.js new file mode 100644 index 00000000..e0e148e3 --- /dev/null +++ b/pleasanter/develop/MDエディタ/sites/scripts/mermaid_Editor2.js @@ -0,0 +1,210 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : mermaid_Editor2 +@name : +@siteIds : 326341 +@siteTitles : Mermaid■チャート生成 +@disabled: false +*/ +let pageLoading = 0; //ページのロード状態を管理する変数 +//---------------------------------------------------------------------- +//初期処理 +window.addEventListener('load', function () { + if (pageLoading == 0) { + console.log('Window load Event'); + $p.ex.onLoad(); + } +}); + +$p.events.on_editor_load = function () { + if (pageLoading == 0) { + console.log('on Editor Load'); + $p.ex.onLoad(); + } +} + +//---------------------------------------------------------------------- +$p.ex.onLoad = function () { + //ロード開始 + pageLoading = 1; + + //初期処理 + $p.ex.init(); +} + +//初期処理 +$p.ex.init = function () { + initMermaid(); +}; + +async function initMermaid() { + //初期化 + //初期化 + const mermaidContent = $('#Results_Body').val(); //値を取得 + + if ($('#mermaidWindow').length) { + $('#mermaidWindow').remove(); //既存のMermaidウインドウを削除 + } + + //Mermaidウインドウ + let mermaidWindow = document.createElement('div'); + mermaidWindow.id = 'mermaidWindow'; //任意のIDを指定 + mermaidWindow.className = 'mermaidWindow'; //任意のクラスを指定 + + let h1 = document.createElement('h1'); + h1.innerHTML = 'Mermaid Viewer'; + mermaidWindow.appendChild(h1); + + let h2 = document.createElement('h2'); + h2.innerHTML = 'Mermaid記法で記述された図がプレビューされます。'; + mermaidWindow.appendChild(h2); + + //Preview用Preタグを作成 + const pre = document.createElement('pre'); + pre.id = 'mermaidPreview'; + pre.className = 'mermaid'; //Mermaid描画用のクラスを設定 + pre.textContent = mermaidContent; //Mermaid記法を設定 + + //描画エリアに追加 + mermaidWindow.appendChild(pre); + $('#Editor').after(mermaidWindow); + + //Mermaidを再レンダリング + if (window.mermaid) { + await mermaid.init(undefined, '#mermaidPreview'); + } else { + console.error('Mermaidライブラリが読み込まれていません。'); + } + + //PNG出力ボタンを作成 + createExportButton(); + + //クリップボード保存ボタンを作成 + //createSaveImageButton(); + +} + +//Mermaid図をPNG形式で出力するボタンを作成 +function createExportButton() { + const exportButton = document.createElement('button'); + exportButton.id = 'exportMermaid'; + exportButton.textContent = 'PNGとして保存'; + exportButton.style.marginTop = '10px'; + + //ボタンのクリックイベント + exportButton.addEventListener('click', function () { + const mermaidPreview = document.getElementById('mermaidPreview'); + if (mermaidPreview) { + html2canvas(mermaidPreview).then(canvas => { + const link = document.createElement('a'); + link.download = 'mermaid-diagram.png'; + link.href = canvas.toDataURL('image/png'); + link.click(); + }).catch(error => { + console.error('PNG出力中にエラーが発生しました:', error); + }); + } else { + console.error('Mermaidプレビューエリアが見つかりません。'); + } + }); + + //Mermaidウインドウにボタンを追加 + const mermaidWindow = document.getElementById('mermaidWindow'); + if (mermaidWindow) { + mermaidWindow.appendChild(exportButton); + $(exportButton).button({ + icon: "ui-icon-image", + showLabel: true + }); + } else { + console.error('Mermaidウインドウが見つかりません。'); + } +} + +//#Results_Body の中身が変更されたら処理を実行 +$p.on('change', 'Body', async function () { + await initMermaid(); + + await saveMermaidImage(); +}); + +$p.events.after_set = function (args) { + initMermaid(); + +} + +$p.events.before_validate_Update = function (args) { + +} + +async function saveMermaidImage() { + + const mermaidPreview = document.getElementById('mermaidPreview'); + const canvas = await html2canvas(mermaidPreview); + + canvas.toBlob(async (blob) => { + try { + await navigator.clipboard.write([ + new ClipboardItem({ 'image/png': blob }) + ]); + console.log('クリップボードにコピーしました。'); + // myClipboard2Columnを呼び出してクリップボードの内容をカラムに設定 + await myClipboard2Column('DescriptionA', false); // 'DescriptionA'は適切なカラム名に置き換えてください + } catch (err) { + console.error('クリップボードへのコピーに失敗しました:', err); + } + }, 'image/png'); + +} + +//myClipboard2Column +async function myClipboard2Column(columnName, appendFlg) { + try { + const $control = $p.getControl(columnName); + const clipboardContents = await navigator.clipboard.read(); + for (const item of clipboardContents) { + if (item.types.includes("text/plain")) { + const str0 = (appendFlg) ? $control.val() : ""; + const str1 = await (await item.getType("text/plain")).text(); + $p.set($control, str0 + str1); + $p.setFormChanged($control); + } + else if (item.types.includes('image/png')) { + if ($control.hasClass("upload-image")) { + if (!appendFlg) $p.set($control, ""); + const blob = await item.getType("image/png"); + $p.uploadImage($control.attr('id'), blob); + $p.setFormChanged($control); + } + } + } + } + catch (error) { + console.error(error.message); + } +} + +function createSaveImageButton() { + const saveImageButton = document.createElement('button'); + saveImageButton.id = 'saveMermaidImage'; + saveImageButton.textContent = 'Mermaidをクリップボードにコピー'; + saveImageButton.style.marginTop = '10px'; + + // ボタンのクリックイベント + saveImageButton.addEventListener('click', function () { + saveMermaidImage(); // saveMermaidImage() を実行 + }); + + // Mermaidウインドウにボタンを追加 + const mermaidWindow = document.getElementById('mermaidWindow'); + if (mermaidWindow) { + mermaidWindow.appendChild(saveImageButton); + $(saveImageButton).button({ + icon: "ui-icon-clipboard", + showLabel: true + }); + } else { + console.error('Mermaidウインドウが見つかりません。'); + } +} \ No newline at end of file diff --git a/pleasanter/develop/MDエディタ/sites/styles/style.css b/pleasanter/develop/MDエディタ/sites/styles/style.css new file mode 100644 index 00000000..68f46a01 --- /dev/null +++ b/pleasanter/develop/MDエディタ/sites/styles/style.css @@ -0,0 +1,51 @@ +/* +@config : next999.json +@filename : style.css +@title : style.css +@name : +@siteIds : 326341 +@siteTitles : MD作成 +@disabled: false +*/ + +#Editor { + width: 40%; +} + +#RecordHeader { + display: none; +} + +.mermaidWindow { + width: 60%; + float: left; + padding: 0 15px 15px 15px; + + h1 { + font-size: 2em; + margin-bottom: 5px; + font-weight: bold; + } + + h2 { + font-size: 1.2em; + margin-bottom: 5px; + margin-left: 3px; + } + + pre { + background-color: antiquewhite; + border-radius: 15px; + padding: 10px; + } +} + +#Results_Body, +#Results_Body\.viewer { + min-height: 400px !important; + max-height: 1200px !important; +} + +#Results_Body\.viewer { + overflow: hidden; +} \ No newline at end of file diff --git a/pleasanter/develop/★MSS/#経営計画/アクションプランシート/1.アクションプラン.js b/pleasanter/develop/★MSS/#経営計画/アクションプランシート/1.アクションプラン.js new file mode 100644 index 00000000..eca2a003 --- /dev/null +++ b/pleasanter/develop/★MSS/#経営計画/アクションプランシート/1.アクションプラン.js @@ -0,0 +1,203 @@ +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; + +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() { + pageLoading = 1; + + createMemberTable(); + createSeikaTable(); + createKPITable() + + //$p.ex.columnReadOnly('DateA'); + //$p.ex.columnReadOnly('DateB'); + //$p.ex.columnReadOnly('DateC'); +} + +$p.events.before_validate = function (args) { + //処理内容 + $p.set($('#Results_DescriptionA'), JSON.stringify(memberTable.getJson())); + $p.set($('#Results_DescriptionB'), JSON.stringify(seikaTable.getJson())); + $p.set($('#Results_DescriptionC'), JSON.stringify(KPITable.getJson())); + + //カンマ除去配列保存 + saveDataWithoutCommas1(); + saveDataWithoutCommas2(); + saveDataWithoutCommas3(); + +} + +function saveDataWithoutCommas1() { + // jspreadsheetのデータを取得 + let data = memberTable.getData(); + let processedData = []; + + // データをループ処理 + for (let i = 0; i < data.length; i++) { + let row = []; + for (let j = 0; j < data[i].length; j++) { + let cellValue = data[i][j]; + + // セルの値が文字列型で、かつカンマを含んでいる場合は削除 + if (typeof cellValue === 'string' && cellValue.includes(',')) { + cellValue = cellValue.replace(/,/g, ''); // 正規表現で全てのカンマを削除 + } + row.push(cellValue); + } + processedData.push(row); + } + + $p.set($('#Results_DescriptionD'), JSON.stringify(processedData)); +} + +function saveDataWithoutCommas2() { + // jspreadsheetのデータを取得 + let data = seikaTable.getData(); + let processedData = []; + + // データをループ処理 + for (let i = 0; i < data.length; i++) { + let row = []; + for (let j = 0; j < data[i].length; j++) { + let cellValue = data[i][j]; + + // セルの値が文字列型で、かつカンマを含んでいる場合は削除 + if (typeof cellValue === 'string' && cellValue.includes(',')) { + cellValue = cellValue.replace(/,/g, ''); // 正規表現で全てのカンマを削除 + } + row.push(cellValue); + } + processedData.push(row); + } + + $p.set($('#Results_DescriptionE'), JSON.stringify(processedData)); +} + +function saveDataWithoutCommas3() { + // jspreadsheetのデータを取得 + let data = KPITable.getData(); + let processedData = []; + + // データをループ処理 + for (let i = 0; i < data.length; i++) { + let row = []; + for (let j = 0; j < data[i].length; j++) { + let cellValue = data[i][j]; + + // セルの値が文字列型で、かつカンマを含んでいる場合は削除 + if (typeof cellValue === 'string' && cellValue.includes(',')) { + cellValue = cellValue.replace(/,/g, ''); // 正規表現で全てのカンマを削除 + } + row.push(cellValue); + } + processedData.push(row); + } + + $p.set($('#Results_DescriptionF'), JSON.stringify(processedData)); +} + + +/* +$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); + +}) +*/ + + +//項目を読み取り専用にするスクリプト +//標準の読み取り専用チェックを入れると、値の参照や入れ込みのためのスクリプトに影響が出るため +//純粋に操作不能にするのみのスクリプトを作成 +//第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'); + } +} \ No newline at end of file diff --git a/pleasanter/develop/★MSS/#経営計画/アクションプランシート/2.メンバーリスト.js b/pleasanter/develop/★MSS/#経営計画/アクションプランシート/2.メンバーリスト.js new file mode 100644 index 00000000..d57bcbbe --- /dev/null +++ b/pleasanter/develop/★MSS/#経営計画/アクションプランシート/2.メンバーリスト.js @@ -0,0 +1,133 @@ +let memberTable; + +function createMemberTable() { + let status = $('#Results_Status').val(); + let editableFlag = false; + let readOnly1 = false; + + //差戻,入力中,役員確認中 + if (status == '110' || status == '200' || status == '300') { + editableFlag = true; + } else { + readOnly1 = true; + } + + let tableId = 'A'; + let dataArea = '#Results_Description' + tableId; + + //スプレッドシートベース + let memberTableEl = document.createElement('div'); + memberTableEl.classList.add('memberTable'); + memberTableEl.id = 'member_' + tableId; + + //保管エリアからデータ取得 + let descData = $(dataArea).val(); + let memberData; + if (descData) { + memberData = JSON.parse(descData); + } else { + memberData = JSON.parse('[{"0":"西東京 太郎","1":10,"2":0,"3":0,"4":0}]'); + } + + $(dataArea + 'Field').after(memberTableEl); + + memberTable = jspreadsheet(document.getElementById('member_' + tableId), { + data: memberData, + columns: [{ + type: 'text', + title: '氏名', + width: 120, + align: 'left', + readOnly: readOnly1, + }, { + type: 'number', + title: '年次', + width: 120, + mask: '#,##0;[Red]#,##0', + align: 'right', + readOnly: readOnly1, + }, { + type: 'number', + title: '上期', + width: 120, + mask: '#,##0;[Red]#,##0', + align: 'right', + readOnly: readOnly1, + }, { + type: 'number', + title: '下期', + width: 120, + mask: '#,##0;[Red]#,##0', + align: 'right', + readOnly: readOnly1, + }, { + type: 'number', + title: '合計', + width: 120, + mask: '#,##0;[Red]#,##0', + align: 'right', + readOnly: true, + }], + allowInsertColumn: false, + allowInsertRow: true, + allowManualInsertRow: false, + allowDeleteColumn: false, + allowDeletingAllRows: false, + columnSorting: false, + columnResize: false, + minSpareRows: 1, + editable: editableFlag, + contextMenu: false, + onchange: function (el, cell, x, y, value, oldValue) { + if (x >= 1 && value == '') { + memberTable.setValue(cell, '0', true); + } + memberCalc(); + }, + onblur: function (el, cell, x, y, value, oldValue) { + memberTableDeleteBlankRow(); + } + }); + + //memberTable.hideIndex(); + +} + +function memberTableDeleteBlankRow() { + //console.log('Delete Blank Row'); + let memberData = memberTable.getData(); + + for (i = 0; i < memberData.length; i++) { + if (memberData[i][0] == '') { + memberData[i][1] = '' + memberData[i][2] = '' + memberData[i][3] = '' + memberData[i][4] = '' + memberTable.deleteRow(i, 1); + } + } + + //memberTable.setData(memberData); + $p.set($('#Results_DescriptionA'), JSON.stringify(memberTable.getJson())); +} + +function memberCalc() { + //console.log('OnChange Row'); + let memberData = memberTable.getData(); + + for (i = 0; i < memberData.length; i++) { + if (memberData[i][0] != '') { + if (memberData[i][1] == '') memberData[i][1] = 1; + if (memberData[i][2] == '') memberData[i][2] = 0; + if (memberData[i][3] == '') memberData[i][3] = 0; + + memberData[i][4] = memberData[i][2] + memberData[i][3]; + } else { + memberData.splice(i, 1); + memberTable.deleteRow(i, 1); + } + } + memberTable.setData(memberData); + $p.set($('#Results_DescriptionA'), JSON.stringify(memberTable.getJson())); + +} \ No newline at end of file diff --git a/pleasanter/develop/★MSS/#経営計画/アクションプランシート/3.成果テーブル.js b/pleasanter/develop/★MSS/#経営計画/アクションプランシート/3.成果テーブル.js new file mode 100644 index 00000000..c70c8c58 --- /dev/null +++ b/pleasanter/develop/★MSS/#経営計画/アクションプランシート/3.成果テーブル.js @@ -0,0 +1,144 @@ +let seikaTable; + +function createSeikaTable() { + let status = $('#Results_Status').val(); + let editableFlag = false; + let readOnly1 = false; + let readOnly2 = false; + + //差戻,入力中,役員確認中 + if (status == '110' || status == '200' || status == '300') { + editableFlag = true; + readOnly2 = true; + } else if (status == '201' || status == '301') { + editableFlag = true; + readOnly1 = true; + readOnly2 = false; + } else { + readOnly1 = true; + readOnly2 = true; + } + + let tableId = 'B'; + let dataArea = '#Results_Description' + tableId; + + //スプレッドシートベース + let seikaTableEl = document.createElement('div'); + seikaTableEl.classList.add('seikaTable'); + seikaTableEl.id = 'seika_' + tableId; + + //保管エリアからデータ取得 + let descData = $(dataArea).val(); + let seikaData; + if (descData) { + seikaData = JSON.parse(descData); + } else { + seikaData = JSON.parse('[{"0":"契約棟数","1":10,"2":0,"3":0,"4":0,"5":0,"6":0},{"0":"来場数・展示場","1":10,"2":0,"3":0,"4":0,"5":0,"6":0},{"0":"来場数・契約案件","1":10,"2":0,"3":0,"4":0,"5":0,"6":0},{"0":"来場数・資料請求","1":10,"2":0,"3":0,"4":0,"5":0,"6":0},{"0":"目標歩留・展示場","1":10,"2":0,"3":0,"4":0,"5":0,"6":0},{"0":"目標歩留・契約案件","1":10,"2":0,"3":0,"4":0,"5":0,"6":0},{"0":"目標歩留・資料請求","1":10,"2":0,"3":0,"4":0,"5":0,"6":0}]'); + } + + $(dataArea + 'Field').after(seikaTableEl); + + seikaTable = jspreadsheet(document.getElementById('seika_' + tableId), { + data: seikaData, + columns: [{ + type: 'text', + title: '指標', + width: 200, + align: 'left', + readOnly: readOnly1, + }, { + type: 'text', + title: '上期目標', + width: 100, + align: 'right', + readOnly: readOnly1, + }, { + type: 'text', + title: '下期目標', + width: 100, + align: 'right', + readOnly: readOnly1, + }, { + type: 'text', + title: '今期実績', + width: 100, + align: 'right', + readOnly: readOnly2, + }, { + type: 'text', + title: '昨年度同期間実績', + width: 100, + align: 'right', + readOnly: readOnly2, + }, { + type: 'text', + title: '目標対比', + width: 100, + align: 'right', + readOnly: readOnly2, + }, { + type: 'text', + title: '昨年対比', + width: 100, + align: 'right', + readOnly: readOnly2, + }], + allowInsertColumn: false, + allowInsertRow: true, + allowManualInsertRow: false, + allowDeleteColumn: false, + allowDeletingAllRows: false, + columnSorting: false, + columnResize: false, + minSpareRows: 1, + editable: editableFlag, + contextMenu: false, + onchange: function (el, cell, x, y, value, oldValue) { + if (x >= 1 && value == '') { + seikaTable.setValue(cell, '0', true); + } + seikaCalc(); + }, + onblur: function (el, cell, x, y, value, oldValue) { + seikaTableDeleteBlankRow(); + } + }); + + //seikaTable.hideIndex(); + +} + +function seikaTableDeleteBlankRow() { + //console.log('Delete Blank Row'); + let seikaData = seikaTable.getData(); + + for (i = 0; i < seikaData.length; i++) { + if (seikaData[i][0] == '') { + seikaData[i][1] = '' + seikaData[i][2] = '' + seikaData[i][3] = '' + seikaData[i][4] = '' + seikaData[i][5] = '' + seikaData[i][6] = '' + seikaTable.deleteRow(i, 1); + } + } + + //seikaTable.setData(seikaData); + $p.set($('#Results_DescriptionB'), JSON.stringify(seikaTable.getJson())); +} + +function seikaCalc() { + //console.log('OnChange Row'); + let seikaData = seikaTable.getData(); + + for (i = 0; i < seikaData.length; i++) { + if (seikaData[i][0] == '') { + seikaData.splice(i, 1); + seikaTable.deleteRow(i, 1); + } + } + seikaTable.setData(seikaData); + $p.set($('#Results_DescriptionB'), JSON.stringify(seikaTable.getJson())); + +} \ No newline at end of file diff --git a/pleasanter/develop/★MSS/#経営計画/アクションプランシート/4.KPIテーブル.js b/pleasanter/develop/★MSS/#経営計画/アクションプランシート/4.KPIテーブル.js new file mode 100644 index 00000000..7c275143 --- /dev/null +++ b/pleasanter/develop/★MSS/#経営計画/アクションプランシート/4.KPIテーブル.js @@ -0,0 +1,140 @@ +let KPITable; + +function createKPITable() { + let status = $('#Results_Status').val(); + let editableFlag = false; + let readOnly1 = false; + let readOnly2 = false; + + //差戻,入力中,役員確認中 + if (status == '110' || status == '200' || status == '300') { + editableFlag = true; + readOnly2 = true; + } else if (status == '201' || status == '301') { + editableFlag = true; + readOnly1 = true; + readOnly2 = false; + } else { + readOnly1 = true; + readOnly2 = true; + } + + let tableId = 'C'; + let dataArea = '#Results_Description' + tableId; + + //スプレッドシートベース + let KPITableEl = document.createElement('div'); + KPITableEl.classList.add('KPITable'); + KPITableEl.id = 'KPI_' + tableId; + + //保管エリアからデータ取得 + let descData = $(dataArea).val(); + let KPIData; + if (descData) { + KPIData = JSON.parse(descData); + } else { + KPIData = JSON.parse('[{"0":"90分面談","1":"50%","2":"0","3":"0","4":"0","5":"0"},{"0":"来場歩留まり","1":"8%","2":"0","3":"0","4":"0","5":"0"},{"0":"アポ率","1":"10%","2":"0","3":"0","4":"0","5":"0"}]'); + } + + $(dataArea + 'Field').after(KPITableEl); + + KPITable = jspreadsheet(document.getElementById('KPI_' + tableId), { + data: KPIData, + columns: [{ + type: 'text', + title: '指標', + width: 200, + align: 'left', + readOnly: readOnly1, + }, { + type: 'text', + title: '目標', + width: 100, + align: 'right', + readOnly: readOnly1, + }, { + type: 'text', + title: '今期実績', + width: 100, + align: 'right', + readOnly: readOnly2, + }, { + type: 'text', + title: '昨年度同期間実績', + width: 100, + align: 'right', + readOnly: readOnly2, + }, { + type: 'text', + title: '目標対比', + width: 100, + align: 'right', + readOnly: readOnly2, + }, { + type: 'text', + title: '昨年対比', + width: 100, + align: 'right', + readOnly: readOnly2, + }], + allowInsertColumn: false, + allowInsertRow: true, + allowManualInsertRow: false, + allowDeleteColumn: false, + allowDeletingAllRows: false, + columnSorting: false, + columnResize: false, + minSpareRows: 1, + editable: editableFlag, + contextMenu: false, + onchange: function (el, cell, x, y, value, oldValue) { + if (x == 1 && value == '') { + KPITable.setValue(cell, '0%', true); + } + if (x >= 2 && value == '') { + KPITable.setValue(cell, '0', true); + } + KPICalc(); + }, + onblur: function (el, cell, x, y, value, oldValue) { + KPITableDeleteBlankRow(); + } + }); + + //KPITable.hideIndex(); + +} + +function KPITableDeleteBlankRow() { + //console.log('Delete Blank Row'); + let KPIData = KPITable.getData(); + + for (i = 0; i < KPIData.length; i++) { + if (KPIData[i][0] == '') { + KPIData[i][1] = '' + KPIData[i][2] = '' + KPIData[i][3] = '' + KPIData[i][4] = '' + KPIData[i][5] = '' + KPITable.deleteRow(i, 1); + } + } + + //KPITable.setData(KPIData); + $p.set($('#Results_DescriptionC'), JSON.stringify(KPITable.getJson())); +} + +function KPICalc() { + //console.log('OnChange Row'); + let KPIData = KPITable.getData(); + + for (i = 0; i < KPIData.length; i++) { + if (KPIData[i][0] == '') { + KPIData.splice(i, 1); + KPITable.deleteRow(i, 1); + } + } + KPITable.setData(KPIData); + $p.set($('#Results_DescriptionC'), JSON.stringify(KPITable.getJson())); + +} \ No newline at end of file diff --git a/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/profit_loss.css b/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/profit_loss.css new file mode 100644 index 00000000..9bf229f2 --- /dev/null +++ b/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/profit_loss.css @@ -0,0 +1,161 @@ +body { + font-size: 75%; +} + +.mainTitle { + width: 800px; + text-align: left; + padding-left: 5px !important; + font-size: 2em; + font-weight: bold; + border: 0px !important; + vertical-align: middle !important; +} + +.shopSelectBox { + width: 400px; + font-size: 1.3em; + font-weight: bold; + border: 0px !important; + vertical-align: middle !important; + text-align: right; +} + +.reloadButton { + text-align: right; +} + +.mainTable, +.baseTable, +.subTable { + border: 0px #000000 solid; + border-collapse: collapse; +} + +#shopSelect { + font-size: 1em; + text-align: right; + border: 0px; +} + +.baseTable td { + border: 1px #000 solid; + padding: 0px; + margin: 0px; + vertical-align: top; +} + + +.mainTable th, +.mainTable td { + height: 22px; + width: 80px; + white-space: nowrap; + vertical-align: middle; + padding: 0px; +} + +.subTable th, +.subTable td { + height: 22px; + width: 166px; + white-space: nowrap; + vertical-align: middle; + padding: 0px; +} + +.mainTable tbody td, +.subTable tbody td { + text-align: right; + padding-right: 5px !important; +} + +.mainTable thead th, +.mainTable thead td, +.subTable thead th, +.subTable thead td { + border: 1px solid #000; + font-size: 100%; +} + +/*-------------------*/ +.mainTable .tbody1 tr:nth-of-type(2n-1)>th:nth-of-type(1), +.mainTable .tbody3 tr:nth-of-type(n)>th:nth-of-type(1), +.mainTable .tbody2 tr:nth-of-type(n)>th:nth-of-type(1), +.mainTable .tbody4 tr:nth-of-type(n)>th:nth-of-type(1) { + font-size: 100%; +} + +/*-------------------*/ +.mainTable .tbody1 tr th { + border: 1px solid #000; + background-color: lightcyan; +} + +/*-------------------*/ +.mainTable .tbody2 tr th { + border: 1px solid #000; + background-color: lightyellow; +} + +/*-------------------*/ +.mainTable .tbody3 tr th { + border: 1px solid #000; + background-color: orange; +} + +/*-------------------*/ +.mainTable .tbody4 tr th { + border: 1px solid #000; + background-color: pink; +} + +/*-------------------*/ +.mainTable .tbody1 tr:nth-of-type(1), +.mainTable .tbody2 tr:nth-of-type(1), +.mainTable .tbody3 tr:nth-of-type(1), +.mainTable .tbody4 tr:nth-of-type(1) { + border-top: 2px solid #000; +} + +.mainTable .tbody1 tr:nth-last-of-type(1), +.mainTable .tbody2 tr:nth-last-of-type(1), +.mainTable .tbody3 tr:nth-last-of-type(1), +.mainTable .tbody4 tr:nth-last-of-type(1), +.subTable .tbody1 tr:nth-of-type(1) { + border-bottom: 2px solid #000; +} + +/*-------------------*/ +.mainTable .tbody1 td:nth-of-type(2n-1), +.mainTable .tbody2 td:nth-of-type(2n-1), +.mainTable .tbody3 td:nth-of-type(2n-1), +.mainTable .tbody4 td:nth-of-type(2n-1) { + border-top: 1px dotted #000; + border-bottom: 1px dotted #000; + border-left: 1px solid #000; + border-right: 1px dashed #000; + background-color: white; +} + +.mainTable .tbody1 td:nth-of-type(2n), +.mainTable .tbody2 td:nth-of-type(2n), +.mainTable .tbody3 td:nth-of-type(2n), +.mainTable .tbody4 td:nth-of-type(2n) { + border-top: 1px dotted #000; + border-bottom: 1px dotted #000; + border-left: 1px dashed #000; + border-right: 1px solid #000; + background-color: lightyellow; +} + +@media print { + .reloadButton { + display: none !important; + } +} + +@page { + size: auto landscape; + margin: 10px; +} \ No newline at end of file diff --git a/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/profit_loss.html b/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/profit_loss.html new file mode 100644 index 00000000..c38a6393 --- /dev/null +++ b/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/profit_loss.html @@ -0,0 +1,927 @@ + + + + + + + + + Document + + + + + + + + + + + + + + + + + + + + + + + + +
+ 損益計算書 + + + + +
+ +
+
+
+ 単位:千円 +
+ + + \ No newline at end of file diff --git a/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/profit_loss.js b/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/profit_loss.js new file mode 100644 index 00000000..359b3220 --- /dev/null +++ b/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/profit_loss.js @@ -0,0 +1,410 @@ +let apiKey = '6504c8a807677a3a576e10327f3c19876c55736ee45d4a845796b9e7f5e087bfd4bd0d8184863da8cf1733ca635111432ab334aea59102b06a96ee6d2c05190d'; +let nendo = '2024'; + +window.addEventListener('load', function () { + + document.title = '損益確認書'; + + //getData('221608'); + let url_string = window.location.href; + let url = new URL(url_string); + let reqId = url.searchParams.get('reqId'); + console.log(reqId); + if (reqId == null) reqId = '999999'; + + if (reqId != '999999') { + console.log('getData!! ' + reqId); + getJigyouKeikakuData(reqId); + } else { + let template = Hogan.compile($('#profitLossTable').text()); + let output = template.render(); + $('#output').empty(); + $('#output').append(output); + } + + getShopList(reqId); + + $('#shopSelect').on('change', function () { + console.log($('#shopSelect').val()); + //getJigyouKeikakuData() + if ($('#shopSelect').val() != '999999') { + url.searchParams.set('reqId', $('#shopSelect').val()); + window.open(url.toString(), '_self'); + } + }) + + $('#reloadButton').button({ + icons: { + primary: 'ui-icon-refresh' + } + }); +}); + + +function getJigyouKeikakuData(recordId) { + let dataTable = {}; + let sumTable = {}; + + //データ初期化 + let label = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'u', 'v', 'x', 'y']; + //--------------------------------------------------------------------------- + for (i = 1; i <= 12; i++) { + for (j = 0; j < label.length; j++) { + dataTable['k-' + i + '-' + label[j]] = 0; + dataTable['j-' + i + '-' + label[j]] = 0; + } + } + + for (j = 0; j < label.length; j++) { + dataTable['k-' + 'hSum' + '-' + label[j]] = 0; + dataTable['j-' + 'hSum' + '-' + label[j]] = 0; + dataTable['k-' + 'gSum' + '-' + label[j]] = 0; + dataTable['j-' + 'gSum' + '-' + label[j]] = 0; + dataTable['k-' + 'aSum' + '-' + label[j]] = 0; + dataTable['j-' + 'aSum' + '-' + label[j]] = 0; + + sumTable['k-' + 'hSum' + '-' + label[j]] = 0; + sumTable['j-' + 'hSum' + '-' + label[j]] = 0; + sumTable['k-' + 'gSum' + '-' + label[j]] = 0; + sumTable['j-' + 'gSum' + '-' + label[j]] = 0; + sumTable['k-' + 'aSum' + '-' + label[j]] = 0; + sumTable['j-' + 'aSum' + '-' + label[j]] = 0; + } + //--------------------------------------------------------------------------- + console.log(dataTable); + + let template = Hogan.compile($('#profitLossTable').text()); + let output = template.render(dataTable); + $('#output').empty(); + $('#output').append(output); + + let json = { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + } + + let url = 'https:///nextoffice.next-hd.co.jp/pleasanter/api/items/' + recordId + '/get'; + $.ajax({ + 'type': 'post', + 'async': false, + 'url': url, + 'data': JSON.stringify(json), + 'contentType': 'application/json', + 'scriptCharset': 'utf-8', + 'dataType': 'json', + success: function (data) { + console.log(data); + document.title = data.Response.Data[0].ClassHash.ClassZ + '年度 損益確認書 ' + data.Response.Data[0].ClassHash.ClassB; + $('#mainTitle').text(document.title); + + nendo = data.Response.Data[0].ClassHash.ClassZ; + + let dataList = data.Response.Data[0].DescriptionHash; + let numList = data.Response.Data[0].NumHash; + + //1棟単価 + let numA = numList['NumA'] ? parseFloat(numList['NumA'].toString().replace(/,/g, '')) : 0; + let numB = numList['NumB'] ? parseFloat(numList['NumB'].toString().replace(/,/g, '')) : 0; + let numC = numList['NumC'] ? parseFloat(numList['NumC'].toString().replace(/,/g, '')) : 0; + let numA2 = numA ? Math.ceil(numA / 1000) : 0; + + for (m = 1; m <= 12; m++) { + let num = 160 + m; + //console.log(JSON.parse(dataList['Description' + num])); + let data = JSON.parse(dataList['Description' + num]); + + //----------------------------------------------------------------------------------- + //売上・粗利 + dataTable['k-' + m + '-a'] = data[0][3] ? Math.ceil(data[0][3] / 1000).toLocaleString() : ''; //売上高・計画 + dataTable['j-' + m + '-a'] = data[1][3] ? Math.ceil(data[1][3] / 1000).toLocaleString() : ''; //売上高・実績 + dataTable['k-' + m + '-b'] = data[0][2] ? data[0][2] : ''; //完成棟数・計画 + dataTable['j-' + m + '-b'] = data[1][2] ? data[1][2] : ''; //完成棟数・実績 + dataTable['k-' + m + '-e'] = data[0][5] ? Math.ceil(data[0][5] / 1000).toLocaleString() : ''; //総粗利・計画 + dataTable['j-' + m + '-e'] = data[1][5] ? Math.ceil(data[1][5] / 1000).toLocaleString() : ''; //総粗利・実績 + dataTable['k-' + m + '-f'] = data[0][4] ? data[0][4] + '%' : ''; //利益率・計画 + dataTable['j-' + m + '-f'] = data[1][4] ? data[1][4] + '%' : ''; //利益率・実績 + dataTable['k-' + m + '-c'] = data[0][3] ? Math.ceil((data[0][3] - data[0][5]) / 1000).toLocaleString() : ''; //売上原価(売上高-総粗利)・計画 + dataTable['j-' + m + '-c'] = data[1][3] ? Math.ceil((data[1][3] - data[1][5]) / 1000).toLocaleString() : ''; //売上原価(売上高-総粗利)・実績 + dataTable['k-' + m + '-d'] = data[0][3] ? Math.floor((data[0][3] - data[0][5]) / data[0][3] * 1000) / 10 + '%' : ''; //原価率・計画 + dataTable['j-' + m + '-d'] = data[1][3] ? Math.floor((data[1][3] - data[1][5]) / data[1][3] * 1000) / 10 + '%' : ''; //原価率・実績 + + //----------------------------------------------------------------------------------- + //人件費 + let num001 = numList['Num001'] ? parseFloat(numList['Num001'].toString().replace(/,/g, '')) : 0; + dataTable['k-' + m + '-g'] = num001 ? num001.toLocaleString() : ''; + dataTable['j-' + m + '-g'] = num001 ? num001.toLocaleString() : ''; + //販売費 + let num002 = numList['Num002'] ? parseFloat(numList['Num002'].toString().replace(/,/g, '')) : 0; + dataTable['k-' + m + '-h'] = num002 ? num002.toLocaleString() : ''; + dataTable['j-' + m + '-h'] = num002 ? num002.toLocaleString() : ''; + //減価償却費 + let num011 = numList['Num011'] ? parseFloat(numList['Num011'].toString().replace(/,/g, '')) : 0; + dataTable['k-' + m + '-i'] = num011 ? num011.toLocaleString() : ''; + dataTable['j-' + m + '-i'] = num011 ? num011.toLocaleString() : ''; + //地代・家賃 + let num012 = numList['Num012'] ? parseFloat(numList['Num012'].toString().replace(/,/g, '')) : 0; + dataTable['k-' + m + '-j'] = num012 ? num012.toLocaleString() : ''; + dataTable['j-' + m + '-j'] = num012 ? num012.toLocaleString() : ''; + //その他経費 + let num013 = numList['Num013'] ? parseFloat(numList['Num013'].toString().replace(/,/g, '')) : 0; + dataTable['k-' + m + '-k'] = num013 ? num013.toLocaleString() : ''; + dataTable['j-' + m + '-k'] = num013 ? num013.toLocaleString() : ''; + //本社経費 + let num014 = numList['Num014'] ? parseFloat(numList['Num014'].toString().replace(/,/g, '')) : 0; + dataTable['k-' + m + '-l'] = num014 ? num014.toLocaleString() : ''; + dataTable['j-' + m + '-l'] = num014 ? num014.toLocaleString() : ''; + + //諸経費合計 + let num025 = numList['Num025'] ? parseFloat(numList['Num025'].toString().replace(/,/g, '')) : 0; + dataTable['k-' + m + '-u'] = num025 ? num025.toLocaleString() : ''; + dataTable['j-' + m + '-u'] = num025 ? num025.toLocaleString() : ''; + + //経常利益 + let keiJo1 = (data[0][5] ? Math.ceil(data[0][5] / 1000) : 0) - (num025 ? num025 : 0); + dataTable['k-' + m + '-v'] = keiJo1 ? keiJo1.toLocaleString() : ''; + + let keiJo2 = (data[1][5] ? Math.ceil(data[1][5] / 1000) : 0) - (num025 ? num025 : 0); + dataTable['j-' + m + '-v'] = keiJo2 ? keiJo2.toLocaleString() : ''; + + //----------------------------------------------------------------------------------- + //BEP売上(諸経費合計 / 利益率) + let bep1 = data[0][4] ? Math.floor(num025 / (data[0][4] / 100)) : 0; + let bep2 = data[1][4] ? Math.floor(num025 / (data[1][4] / 100)) : 0; + dataTable['k-' + m + '-x'] = bep1 ? bep1.toLocaleString() : ''; + dataTable['j-' + m + '-x'] = bep2 ? bep2.toLocaleString() : ''; + + //BEP棟数 + if (numA) { + dataTable['k-' + m + '-y'] = bep1 ? Math.floor(bep1 / numA2 * 10) / 10 : ''; + dataTable['j-' + m + '-y'] = bep2 ? Math.floor(bep2 / numA2 * 10) / 10 : ''; + } + + //----------------------------------------------------------------------------------- + //累計計算 + if (m >= 4 && m <= 9) { + //前期 + sumTable['k-hSum-a'] += dataTable['k-' + m + '-a'] ? parseFloat(dataTable['k-' + m + '-a'].toString().replace(/,/g, '')) : 0; + sumTable['k-hSum-b'] += dataTable['k-' + m + '-b'] ? parseFloat(dataTable['k-' + m + '-b'].toString().replace(/,/g, '')) : 0; + sumTable['k-hSum-c'] += dataTable['k-' + m + '-c'] ? parseFloat(dataTable['k-' + m + '-c'].toString().replace(/,/g, '')) : 0; + sumTable['k-hSum-e'] += dataTable['k-' + m + '-e'] ? parseFloat(dataTable['k-' + m + '-e'].toString().replace(/,/g, '')) : 0; + + sumTable['k-hSum-g'] += dataTable['k-' + m + '-g'] ? parseFloat(dataTable['k-' + m + '-g'].toString().replace(/,/g, '')) : 0; + sumTable['k-hSum-h'] += dataTable['k-' + m + '-h'] ? parseFloat(dataTable['k-' + m + '-h'].toString().replace(/,/g, '')) : 0; + sumTable['k-hSum-i'] += dataTable['k-' + m + '-i'] ? parseFloat(dataTable['k-' + m + '-i'].toString().replace(/,/g, '')) : 0; + sumTable['k-hSum-j'] += dataTable['k-' + m + '-j'] ? parseFloat(dataTable['k-' + m + '-j'].toString().replace(/,/g, '')) : 0; + sumTable['k-hSum-k'] += dataTable['k-' + m + '-k'] ? parseFloat(dataTable['k-' + m + '-k'].toString().replace(/,/g, '')) : 0; + sumTable['k-hSum-l'] += dataTable['k-' + m + '-l'] ? parseFloat(dataTable['k-' + m + '-l'].toString().replace(/,/g, '')) : 0; + sumTable['k-hSum-u'] += dataTable['k-' + m + '-u'] ? parseFloat(dataTable['k-' + m + '-u'].toString().replace(/,/g, '')) : 0; + + sumTable['j-hSum-a'] += dataTable['j-' + m + '-a'] ? parseFloat(dataTable['j-' + m + '-a'].toString().replace(/,/g, '')) : 0; + sumTable['j-hSum-b'] += dataTable['j-' + m + '-b'] ? parseFloat(dataTable['j-' + m + '-b'].toString().replace(/,/g, '')) : 0; + sumTable['j-hSum-c'] += dataTable['j-' + m + '-c'] ? parseFloat(dataTable['j-' + m + '-c'].toString().replace(/,/g, '')) : 0; + sumTable['j-hSum-e'] += dataTable['j-' + m + '-e'] ? parseFloat(dataTable['j-' + m + '-e'].toString().replace(/,/g, '')) : 0; + + sumTable['j-hSum-g'] += dataTable['j-' + m + '-g'] ? parseFloat(dataTable['j-' + m + '-g'].toString().replace(/,/g, '')) : 0; + sumTable['j-hSum-h'] += dataTable['j-' + m + '-h'] ? parseFloat(dataTable['j-' + m + '-h'].toString().replace(/,/g, '')) : 0; + sumTable['j-hSum-i'] += dataTable['j-' + m + '-i'] ? parseFloat(dataTable['j-' + m + '-i'].toString().replace(/,/g, '')) : 0; + sumTable['j-hSum-j'] += dataTable['j-' + m + '-j'] ? parseFloat(dataTable['j-' + m + '-j'].toString().replace(/,/g, '')) : 0; + sumTable['j-hSum-k'] += dataTable['j-' + m + '-k'] ? parseFloat(dataTable['j-' + m + '-k'].toString().replace(/,/g, '')) : 0; + sumTable['j-hSum-l'] += dataTable['j-' + m + '-l'] ? parseFloat(dataTable['j-' + m + '-l'].toString().replace(/,/g, '')) : 0; + sumTable['j-hSum-u'] += dataTable['j-' + m + '-u'] ? parseFloat(dataTable['j-' + m + '-u'].toString().replace(/,/g, '')) : 0; + + } else { + //後期 + sumTable['k-gSum-a'] += dataTable['k-' + m + '-a'] ? parseFloat(dataTable['k-' + m + '-a'].toString().replace(/,/g, '')) : 0; + sumTable['k-gSum-b'] += dataTable['k-' + m + '-b'] ? parseFloat(dataTable['k-' + m + '-b'].toString().replace(/,/g, '')) : 0; + sumTable['k-gSum-c'] += dataTable['k-' + m + '-c'] ? parseFloat(dataTable['k-' + m + '-c'].toString().replace(/,/g, '')) : 0; + sumTable['k-gSum-e'] += dataTable['k-' + m + '-e'] ? parseFloat(dataTable['k-' + m + '-e'].toString().replace(/,/g, '')) : 0; + + sumTable['k-gSum-g'] += dataTable['k-' + m + '-g'] ? parseFloat(dataTable['k-' + m + '-g'].toString().replace(/,/g, '')) : 0; + sumTable['k-gSum-h'] += dataTable['k-' + m + '-h'] ? parseFloat(dataTable['k-' + m + '-h'].toString().replace(/,/g, '')) : 0; + sumTable['k-gSum-i'] += dataTable['k-' + m + '-i'] ? parseFloat(dataTable['k-' + m + '-i'].toString().replace(/,/g, '')) : 0; + sumTable['k-gSum-j'] += dataTable['k-' + m + '-j'] ? parseFloat(dataTable['k-' + m + '-j'].toString().replace(/,/g, '')) : 0; + sumTable['k-gSum-k'] += dataTable['k-' + m + '-k'] ? parseFloat(dataTable['k-' + m + '-k'].toString().replace(/,/g, '')) : 0; + sumTable['k-gSum-l'] += dataTable['k-' + m + '-l'] ? parseFloat(dataTable['k-' + m + '-l'].toString().replace(/,/g, '')) : 0; + sumTable['k-gSum-u'] += dataTable['k-' + m + '-u'] ? parseFloat(dataTable['k-' + m + '-u'].toString().replace(/,/g, '')) : 0; + + sumTable['j-gSum-a'] += dataTable['j-' + m + '-a'] ? parseFloat(dataTable['j-' + m + '-a'].toString().replace(/,/g, '')) : 0; + sumTable['j-gSum-b'] += dataTable['j-' + m + '-b'] ? parseFloat(dataTable['j-' + m + '-b'].toString().replace(/,/g, '')) : 0; + sumTable['j-gSum-c'] += dataTable['j-' + m + '-c'] ? parseFloat(dataTable['j-' + m + '-c'].toString().replace(/,/g, '')) : 0; + sumTable['j-gSum-e'] += dataTable['j-' + m + '-e'] ? parseFloat(dataTable['j-' + m + '-e'].toString().replace(/,/g, '')) : 0; + + sumTable['j-gSum-g'] += dataTable['j-' + m + '-g'] ? parseFloat(dataTable['j-' + m + '-g'].toString().replace(/,/g, '')) : 0; + sumTable['j-gSum-h'] += dataTable['j-' + m + '-h'] ? parseFloat(dataTable['j-' + m + '-h'].toString().replace(/,/g, '')) : 0; + sumTable['j-gSum-i'] += dataTable['j-' + m + '-i'] ? parseFloat(dataTable['j-' + m + '-i'].toString().replace(/,/g, '')) : 0; + sumTable['j-gSum-j'] += dataTable['j-' + m + '-j'] ? parseFloat(dataTable['j-' + m + '-j'].toString().replace(/,/g, '')) : 0; + sumTable['j-gSum-k'] += dataTable['j-' + m + '-k'] ? parseFloat(dataTable['j-' + m + '-k'].toString().replace(/,/g, '')) : 0; + sumTable['j-gSum-l'] += dataTable['j-' + m + '-l'] ? parseFloat(dataTable['j-' + m + '-l'].toString().replace(/,/g, '')) : 0; + sumTable['j-gSum-u'] += dataTable['j-' + m + '-u'] ? parseFloat(dataTable['j-' + m + '-u'].toString().replace(/,/g, '')) : 0; + } + + sumTable['k-aSum-a'] += dataTable['k-' + m + '-a'] ? parseFloat(dataTable['k-' + m + '-a'].toString().replace(/,/g, '')) : 0; + sumTable['k-aSum-b'] += dataTable['k-' + m + '-b'] ? parseFloat(dataTable['k-' + m + '-b'].toString().replace(/,/g, '')) : 0; + sumTable['k-aSum-c'] += dataTable['k-' + m + '-c'] ? parseFloat(dataTable['k-' + m + '-c'].toString().replace(/,/g, '')) : 0; + sumTable['k-aSum-e'] += dataTable['k-' + m + '-e'] ? parseFloat(dataTable['k-' + m + '-e'].toString().replace(/,/g, '')) : 0; + + sumTable['k-aSum-g'] += dataTable['k-' + m + '-g'] ? parseFloat(dataTable['k-' + m + '-g'].toString().replace(/,/g, '')) : 0; + sumTable['k-aSum-h'] += dataTable['k-' + m + '-h'] ? parseFloat(dataTable['k-' + m + '-h'].toString().replace(/,/g, '')) : 0; + sumTable['k-aSum-i'] += dataTable['k-' + m + '-i'] ? parseFloat(dataTable['k-' + m + '-i'].toString().replace(/,/g, '')) : 0; + sumTable['k-aSum-j'] += dataTable['k-' + m + '-j'] ? parseFloat(dataTable['k-' + m + '-j'].toString().replace(/,/g, '')) : 0; + sumTable['k-aSum-k'] += dataTable['k-' + m + '-k'] ? parseFloat(dataTable['k-' + m + '-k'].toString().replace(/,/g, '')) : 0; + sumTable['k-aSum-l'] += dataTable['k-' + m + '-l'] ? parseFloat(dataTable['k-' + m + '-l'].toString().replace(/,/g, '')) : 0; + sumTable['k-aSum-u'] += dataTable['k-' + m + '-u'] ? parseFloat(dataTable['k-' + m + '-u'].toString().replace(/,/g, '')) : 0; + + sumTable['j-aSum-a'] += dataTable['j-' + m + '-a'] ? parseFloat(dataTable['j-' + m + '-a'].toString().replace(/,/g, '')) : 0; + sumTable['j-aSum-b'] += dataTable['j-' + m + '-b'] ? parseFloat(dataTable['j-' + m + '-b'].toString().replace(/,/g, '')) : 0; + sumTable['j-aSum-c'] += dataTable['j-' + m + '-c'] ? parseFloat(dataTable['j-' + m + '-c'].toString().replace(/,/g, '')) : 0; + sumTable['j-aSum-e'] += dataTable['j-' + m + '-e'] ? parseFloat(dataTable['j-' + m + '-e'].toString().replace(/,/g, '')) : 0; + + sumTable['j-aSum-g'] += dataTable['j-' + m + '-g'] ? parseFloat(dataTable['j-' + m + '-g'].toString().replace(/,/g, '')) : 0; + sumTable['j-aSum-h'] += dataTable['j-' + m + '-h'] ? parseFloat(dataTable['j-' + m + '-h'].toString().replace(/,/g, '')) : 0; + sumTable['j-aSum-i'] += dataTable['j-' + m + '-i'] ? parseFloat(dataTable['j-' + m + '-i'].toString().replace(/,/g, '')) : 0; + sumTable['j-aSum-j'] += dataTable['j-' + m + '-j'] ? parseFloat(dataTable['j-' + m + '-j'].toString().replace(/,/g, '')) : 0; + sumTable['j-aSum-k'] += dataTable['j-' + m + '-k'] ? parseFloat(dataTable['j-' + m + '-k'].toString().replace(/,/g, '')) : 0; + sumTable['j-aSum-l'] += dataTable['j-' + m + '-l'] ? parseFloat(dataTable['j-' + m + '-l'].toString().replace(/,/g, '')) : 0; + sumTable['j-aSum-u'] += dataTable['j-' + m + '-u'] ? parseFloat(dataTable['j-' + m + '-u'].toString().replace(/,/g, '')) : 0; + + } + //原価率 + sumTable['k-hSum-d'] = sumTable['k-hSum-a'] ? Math.floor(sumTable['k-hSum-c'] / sumTable['k-hSum-a'] * 1000) / 10 : 0; + sumTable['j-hSum-d'] = sumTable['j-hSum-a'] ? Math.floor(sumTable['j-hSum-c'] / sumTable['j-hSum-a'] * 1000) / 10 : 0; + sumTable['k-gSum-d'] = sumTable['k-gSum-a'] ? Math.floor(sumTable['k-gSum-c'] / sumTable['k-gSum-a'] * 1000) / 10 : 0; + sumTable['j-gSum-d'] = sumTable['j-gSum-a'] ? Math.floor(sumTable['j-gSum-c'] / sumTable['j-gSum-a'] * 1000) / 10 : 0; + sumTable['k-aSum-d'] = sumTable['k-aSum-a'] ? Math.floor(sumTable['k-aSum-c'] / sumTable['k-aSum-a'] * 1000) / 10 : 0; + sumTable['j-aSum-d'] = sumTable['j-aSum-a'] ? Math.floor(sumTable['j-aSum-c'] / sumTable['j-aSum-a'] * 1000) / 10 : 0; + + //利益率 + sumTable['k-hSum-f'] = sumTable['k-hSum-a'] ? Math.floor(sumTable['k-hSum-e'] / sumTable['k-hSum-a'] * 1000) / 10 : 0; + sumTable['j-hSum-f'] = sumTable['j-hSum-a'] ? Math.floor(sumTable['j-hSum-e'] / sumTable['j-hSum-a'] * 1000) / 10 : 0; + sumTable['k-gSum-f'] = sumTable['k-gSum-a'] ? Math.floor(sumTable['k-gSum-e'] / sumTable['k-gSum-a'] * 1000) / 10 : 0; + sumTable['j-gSum-f'] = sumTable['j-gSum-a'] ? Math.floor(sumTable['j-gSum-e'] / sumTable['j-gSum-a'] * 1000) / 10 : 0; + sumTable['k-aSum-f'] = sumTable['k-aSum-a'] ? Math.floor(sumTable['k-aSum-e'] / sumTable['k-aSum-a'] * 1000) / 10 : 0; + sumTable['j-aSum-f'] = sumTable['j-aSum-a'] ? Math.floor(sumTable['j-aSum-e'] / sumTable['j-aSum-a'] * 1000) / 10 : 0; + + //経常利益 + sumTable['k-hSum-v'] = sumTable['k-hSum-e'] - sumTable['k-hSum-u']; + sumTable['j-hSum-v'] = sumTable['j-hSum-e'] - sumTable['j-hSum-u']; + sumTable['k-gSum-v'] = sumTable['k-gSum-e'] - sumTable['k-gSum-u']; + sumTable['j-gSum-v'] = sumTable['j-gSum-e'] - sumTable['j-gSum-u']; + sumTable['k-aSum-v'] = sumTable['k-aSum-e'] - sumTable['k-aSum-u']; + sumTable['j-aSum-v'] = sumTable['j-aSum-e'] - sumTable['j-aSum-u']; + + //BEP売上 + sumTable['k-hSum-x'] = sumTable['k-hSum-f'] ? Math.floor(sumTable['k-hSum-u'] / (sumTable['k-hSum-f'] / 100)) : 0; + sumTable['j-hSum-x'] = sumTable['j-hSum-f'] ? Math.floor(sumTable['j-hSum-u'] / (sumTable['j-hSum-f'] / 100)) : 0; + sumTable['k-gSum-x'] = sumTable['k-gSum-f'] ? Math.floor(sumTable['k-gSum-u'] / (sumTable['k-gSum-f'] / 100)) : 0; + sumTable['j-gSum-x'] = sumTable['j-gSum-f'] ? Math.floor(sumTable['j-gSum-u'] / (sumTable['j-gSum-f'] / 100)) : 0; + sumTable['k-aSum-x'] = sumTable['k-aSum-f'] ? Math.floor(sumTable['k-aSum-u'] / (sumTable['k-aSum-f'] / 100)) : 0; + sumTable['j-aSum-x'] = sumTable['j-aSum-f'] ? Math.floor(sumTable['j-aSum-u'] / (sumTable['j-aSum-f'] / 100)) : 0; + + //BEP棟数 + sumTable['k-hSum-y'] = sumTable['k-hSum-x'] ? Math.floor(sumTable['k-hSum-x'] / numA2 * 10) / 10 : 0; + sumTable['j-hSum-y'] = sumTable['j-hSum-x'] ? Math.floor(sumTable['j-hSum-x'] / numA2 * 10) / 10 : 0; + sumTable['k-gSum-y'] = sumTable['k-gSum-x'] ? Math.floor(sumTable['k-gSum-x'] / numA2 * 10) / 10 : 0; + sumTable['j-gSum-y'] = sumTable['j-gSum-x'] ? Math.floor(sumTable['j-gSum-x'] / numA2 * 10) / 10 : 0; + sumTable['k-aSum-y'] = sumTable['k-aSum-x'] ? Math.floor(sumTable['k-aSum-x'] / numA2 * 10) / 10 : 0; + sumTable['j-aSum-y'] = sumTable['j-aSum-x'] ? Math.floor(sumTable['j-aSum-x'] / numA2 * 10) / 10 : 0; + + for (j = 0; j < label.length; j++) { + dataTable['k-' + 'hSum' + '-' + label[j]] = sumTable['k-' + 'hSum' + '-' + label[j]] ? sumTable['k-' + 'hSum' + '-' + label[j]].toLocaleString() : ''; + dataTable['j-' + 'hSum' + '-' + label[j]] = sumTable['j-' + 'hSum' + '-' + label[j]] ? sumTable['j-' + 'hSum' + '-' + label[j]].toLocaleString() : ''; + dataTable['k-' + 'gSum' + '-' + label[j]] = sumTable['k-' + 'gSum' + '-' + label[j]] ? sumTable['k-' + 'gSum' + '-' + label[j]].toLocaleString() : ''; + dataTable['j-' + 'gSum' + '-' + label[j]] = sumTable['j-' + 'gSum' + '-' + label[j]] ? sumTable['j-' + 'gSum' + '-' + label[j]].toLocaleString() : ''; + dataTable['k-' + 'aSum' + '-' + label[j]] = sumTable['k-' + 'aSum' + '-' + label[j]] ? sumTable['k-' + 'aSum' + '-' + label[j]].toLocaleString() : ''; + dataTable['j-' + 'aSum' + '-' + label[j]] = sumTable['j-' + 'aSum' + '-' + label[j]] ? sumTable['j-' + 'aSum' + '-' + label[j]].toLocaleString() : ''; + } + + dataTable['k-hSum-d'] = dataTable['k-hSum-d'] ? dataTable['k-hSum-d'] + '%' : ''; + dataTable['j-hSum-d'] = dataTable['j-hSum-d'] ? dataTable['j-hSum-d'] + '%' : ''; + dataTable['k-gSum-d'] = dataTable['k-gSum-d'] ? dataTable['k-gSum-d'] + '%' : ''; + dataTable['j-gSum-d'] = dataTable['j-gSum-d'] ? dataTable['j-gSum-d'] + '%' : ''; + dataTable['k-aSum-d'] = dataTable['k-aSum-d'] ? dataTable['k-aSum-d'] + '%' : ''; + dataTable['j-aSum-d'] = dataTable['j-aSum-d'] ? dataTable['j-aSum-d'] + '%' : ''; + + dataTable['k-hSum-f'] = dataTable['k-hSum-f'] ? dataTable['k-hSum-f'] + '%' : ''; + dataTable['j-hSum-f'] = dataTable['j-hSum-f'] ? dataTable['j-hSum-f'] + '%' : ''; + dataTable['k-gSum-f'] = dataTable['k-gSum-f'] ? dataTable['k-gSum-f'] + '%' : ''; + dataTable['j-gSum-f'] = dataTable['j-gSum-f'] ? dataTable['j-gSum-f'] + '%' : ''; + dataTable['k-aSum-f'] = dataTable['k-aSum-f'] ? dataTable['k-aSum-f'] + '%' : ''; + dataTable['j-aSum-f'] = dataTable['j-aSum-f'] ? dataTable['j-aSum-f'] + '%' : ''; + + dataTable['tanka'] = numA.toLocaleString(); + dataTable['arari'] = numB + '%'; + dataTable['tsubo'] = numC + '坪'; + + let template = Hogan.compile($('#profitLossTable').text()); + let output = template.render(dataTable); + + $('#output').empty(); + $('#output').append(output); + + $.each($('.mainTable tbody td'), function (index, data) { + if (data.innerText != '') { + let num = parseFloat(data.innerText.toString().replace(/,|\%/g, '')); + if (num < 0) { + console.log(data); + data.style.color = 'red'; + data.style.fontWeight = 'bold'; + } + } + }) + + }, + error: function (data) { + console.log(data); + } + }); +} + +//事業所一覧を取得し、プルダウンメニューを更新 +function getShopList(reqId) { + let opEle = document.createElement('option'); + opEle.value = '999999'; + opEle.innerHTML = '--事業所を選択してください--'; + if (opEle.value == reqId) opEle.setAttribute('selected', true); + $('#shopSelect').append(opEle); + + console.log(nendo); + + let recordId = '214737'; + let json = { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + 'View': { + 'ColumnFilterHash': { + 'ClassZ': '["' + nendo + '"]', + }, + 'ColumnSorterHash': { + 'ResultId': 'asc' + } + }, + }; + + let url = 'https:///nextoffice.next-hd.co.jp/pleasanter/api/items/' + recordId + '/get'; + $.ajax({ + 'type': 'post', + 'async': false, + 'url': url, + 'data': JSON.stringify(json), + 'contentType': 'application/json', + 'scriptCharset': 'utf-8', + 'dataType': 'json', + success: function (data) { + console.log(data); + $.each(data.Response.Data, function (index, data) { + let shopName = data.ClassHash.ClassB; + let shopId = data.ResultId; + + let opEle = document.createElement('option'); + opEle.value = shopId; + opEle.innerHTML = shopName; + if (opEle.value == reqId) opEle.setAttribute('selected', true); + $('#shopSelect').append(opEle); + }); + + }, + error: function (data) { + console.log(data); + } + }); +} \ No newline at end of file diff --git a/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/事業計画.css b/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/事業計画.css new file mode 100644 index 00000000..270ed8e7 --- /dev/null +++ b/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/事業計画.css @@ -0,0 +1,101 @@ +.field-normal { + height: 37px !important; +} + +.field-section { + font-size: 2em; + font-weight: bold; +} + +.tableBody { + margin: 0px !important; + padding: 0px !important; + border: 1px solid #666; +} + +.jexcel_container, +.jexcel_content { + padding: 0px; +} + +#jigyoTable th.head1 { + font-size: 1.5em; + font-weight: bold; + background-color: darkolivegreen; + color: whitesmoke; + text-align: center; + border: 1px solid #666; +} + +#jigyoTable td.head2 { + width: 35px; + height: 100px; + font-size: 1.2em; + font-weight: bold; + text-align: center; + vertical-align: middle; + writing-mode: vertical-rl; + border: 1px solid #666; +} + +#jigyoTable td.head2_0 { + background-color: lightblue; + color: darkblue; +} + +#jigyoTable td.head2_1 { + background-color: lightyellow; + color: darkred; +} + +#jigyoTable td.head2_2 { + background-color: lightgrey; + color: black; +} + + +table.jexcel { + table-layout: fixed !important; + width: 100%; +} + + +table.jexcel>thead>tr>td { + text-align: center !important; + +} + +.keikakuTable td[data-x="2"], +.keikakuTable td[data-x="3"], +.keikakuTable td[data-x="4"], +.keikakuTable td[data-x="6"], +.keikakuTable td[data-x="7"] { + background-color: lightyellow; +} + +/* +.jissekiTable td[data-x="1"], +.jissekiTable td[data-x="2"], +.jissekiTable td[data-x="3"], +.jissekiTable td[data-x="4"], +.jissekiTable td[data-x="5"], +.jissekiTable td[data-x="7"] { + background-color: lightyellow; +} +*/ + +td.readonly { + color: #000 !important; +} + +.juchuLabel { + background-color: yellow; +} + +.chakoLabel { + background-color: lightgreen; +} + +.kanseiLabel { + background-color: lightskyblue; +} \ No newline at end of file diff --git a/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/事業計画テーブル.js b/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/事業計画テーブル.js new file mode 100644 index 00000000..2ed680c7 --- /dev/null +++ b/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/事業計画テーブル.js @@ -0,0 +1,1892 @@ +//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') { + 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); + } + + }); +} + diff --git a/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/事業計画テーブルorg.js b/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/事業計画テーブルorg.js new file mode 100644 index 00000000..b3e24d24 --- /dev/null +++ b/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/事業計画テーブルorg.js @@ -0,0 +1,1863 @@ +//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; + } + + + 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() { + + //ラベルの色変更 + $.each($('label.field-section'), function (index, value) { + let tanka = $('#Results_NumA').val(); + let arariPer = $('#Results_NumB').val(); + let tenpo = $('#Results_ClassB option:selected').text(); + let span = document.createElement('span'); + span.innerText = '    ' + tenpo + '  1棟単価:' + tanka + '  粗利基準:' + arariPer + '%'; + + switch (value.innerText) { + case '受注・契約': + value.classList.add('juchuLabel'); + value.appendChild(span); + break; + case '着工': + value.classList.add('chakoLabel'); + value.appendChild(span); + break; + case '完成・売上': + value.classList.add('kanseiLabel'); + value.appendChild(span); + break; + } + }); + +} + +//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); + } + + }); +} + diff --git a/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/実績計上テーブル.js b/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/実績計上テーブル.js new file mode 100644 index 00000000..419dade9 --- /dev/null +++ b/pleasanter/develop/★MSS/#経営計画/事業計画テーブル/実績計上テーブル.js @@ -0,0 +1,42 @@ +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(); + } +} + +function onLoad() { + //コメントの追加 + attachComments('DateA'); + attachComments('DateD'); + + +} + + +function attachComments(col) { + + //説明欄に記入されたコメントを取得 + if ($('#Results_' + col + 'Field>div.field-control').attr('title')) { + comments = $('#Results_' + col + 'Field>div.field-control').attr('title'); + } + + let dateDcome = document.createElement('div'); + dateDcome.innerHTML = comments; + dateDcome.style.marginLeft = '121px'; + dateDcome.style.fontWeight = 'bold'; + dateDcome.style.color = '#00F'; + + //位置調整とコメント追加 + $('#Results_' + col + 'Field').append(dateDcome); + $('#Results_' + col + 'Field').css('margin-bottom', '10px'); +} \ No newline at end of file diff --git a/pleasanter/develop/★MSS/#経営計画/課題遂行シート/提出期限.js b/pleasanter/develop/★MSS/#経営計画/課題遂行シート/提出期限.js new file mode 100644 index 00000000..7c9f9411 --- /dev/null +++ b/pleasanter/develop/★MSS/#経営計画/課題遂行シート/提出期限.js @@ -0,0 +1,90 @@ +//項目を読み取り専用にするスクリプト +//標準の読み取り専用チェックを入れると、値の参照や入れ込みのためのスクリプトに影響が出るため +//純粋に操作不能にするのみのスクリプトを作成 +//第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.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); + +}) + + + +window.addEventListener('load', function () { + + $p.ex.columnReadOnly('DateA'); + $p.ex.columnReadOnly('DateB'); + $p.ex.columnReadOnly('DateC'); + +}); \ No newline at end of file diff --git a/pleasanter/develop/★MSS/#経営計画/部門テーマ・発表資料/old部門テーマ.js b/pleasanter/develop/★MSS/#経営計画/部門テーマ・発表資料/old部門テーマ.js new file mode 100644 index 00000000..bb521048 --- /dev/null +++ b/pleasanter/develop/★MSS/#経営計画/部門テーマ・発表資料/old部門テーマ.js @@ -0,0 +1,222 @@ +window.addEventListener('load', function () { + + $p.ex.columnReadOnly('DateA'); + //$p.ex.columnReadOnly('ClassA'); + //$p.ex.columnReadOnly('ClassC'); + //$p.ex.columnReadOnly('ClassE'); + + getTemplateFile(); + +}); + +$p.on('change', 'ClassE', function () { + let limitDate = ''; + let nendo = $('#Results_ClassE').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); + +}) + + +//項目を読み取り専用にするスクリプト +//標準の読み取り専用チェックを入れると、値の参照や入れ込みのためのスクリプトに影響が出るため +//純粋に操作不能にするのみのスクリプトを作成 +//第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'); + } +} + + +function getTemplateFile() { + $p.apiGet({ + 'id': '231278', + 'data': { + "ApiVersion": 1.1, + "ApiKey": "6504c8a807677a3a576e10327f3c19876c55736ee45d4a845796b9e7f5e087bfd4bd0d8184863da8cf1733ca635111432ab334aea59102b06a96ee6d2c05190d" + }, + 'done': function (data) { + //(data.Response.Data); + $.each(data.Response.Data, function (index, data) { + let div = document.createElement('div'); + let guid = data + .AttachmentsHash + .AttachmentsA[0] + .Guid; + let dataId = data.ResultId; + let id = 'button_' + data.ResultId; + let fileName = data + .AttachmentsHash + .AttachmentsA[0] + .Name + let button = document.createElement('button'); + button.type = 'button'; + button.id = id; + button.innerHTML = fileName; + button.setAttribute('guid', guid); + button.setAttribute('onclick', 'clickEvent("' + dataId + '","' + guid + '")'); + div.style.marginLeft = '120px'; + div.style.marginBottom = '10px'; + div.style.float = 'left'; + div.append(button); + $('#Results_AttachmentsAField').before(div); + $('#' + id).button({ + icon: 'ui-icon-document' + }); + }) + } + }); +} + +function clickEvent(dataId, guid) { + + //console.log(dataId); + //console.log(guid); + + let jsonBody = { + "ApiVersion": 1.1, + "ApiKey": "6504c8a807677a3a576e10327f3c19876c55736ee45d4a845796b9e7f5e087bfd4bd0d8184863da8cf1733ca635111432ab334aea59102b06a96ee6d2c05190d" + }; + + let url = 'https://' + location.hostname + '/pleasanter/api/binaries/' + guid + '/get' + + $.ajax({ + "type": "post", + "url": url, + "contentType": "application/json", + "data": JSON.stringify(jsonBody), + "success": function (data) { + //(data); + let base64 = data.Response.Base64; + let fileName = data.Response.FileName; + let ctype = data.Response.ContentType; + downloadFile(fileName, ctype, base64); + }, + "error": function (data) { + console.log(data); + } + }) + +} + + +/** + * Base64とMIMEコンテンツタイプからBlobオブジェクトを作成する。 + * + * @param base64 + */ +function downloadFile(fileName, ctype, base64) { + let mime_ctype = ctype; + let blob = toBlob(base64, mime_ctype); + let ele = document.createElement('a'); + + + if (window.navigator.msSaveBlob) { + // IEやEdgeの場合、Blob URL Schemeへと変換しなくともダウンロードできる + window + .navigator + .msSaveOrOpenBlob(blob, fileName); + } else { + // BlobをBlob URL Schemeへ変換してリンクタグへ埋め込む + ele.href = window.URL.createObjectURL(blob); + ele.download = fileName; + ele.target = '_blank'; + // リンクをクリックする + ele.click(); + } +} + +/** + * Base64とMIMEコンテンツタイプからBlobオブジェクトを作成する。 + * 日本語対応。 + * + * @param base64 + * @param mime_ctype MIMEコンテンツタイプ + * @returns Blob + */ +function toBlob(base64, mime_ctype) { + // 日本語の文字化けに対処するためBOMを作成する。 + let bom = new Uint8Array([0xEF, 0xBB, 0xBF]); + + let bin = atob(base64.replace(/^.*,/, '')); + let buffer = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; i++) { + buffer[i] = bin.charCodeAt(i); + } + // Blobを作成 + let blob; + try { + blob = new Blob([ + bom, buffer.buffer + ], { + type: mime_ctype + }); + } catch (e) { + return false; + } + return blob; +} \ No newline at end of file diff --git a/pleasanter/develop/★MSS/#経営計画/部門テーマ・発表資料/old部門テーマcreate.js b/pleasanter/develop/★MSS/#経営計画/部門テーマ・発表資料/old部門テーマcreate.js new file mode 100644 index 00000000..f0dc9aa3 --- /dev/null +++ b/pleasanter/develop/★MSS/#経営計画/部門テーマ・発表資料/old部門テーマcreate.js @@ -0,0 +1,98 @@ +const apiKey = '6504c8a807677a3a576e10327f3c19876c55736ee45d4a845796b9e7f5e087bfd4bd0d8184863da8cf1733ca635111432ab334aea59102b06a96ee6d2c05190d'; + +window.addEventListener('load', function () { + + createButtons(); + +}); + +function createButtons() { + let button1 = document.createElement('button'); + button1.type = 'button'; + button1.id = 'button1'; + button1.innerHTML = '部門テーマ登録'; + button1.setAttribute('onclick', 'createRecordData1()'); + button1.style.margin = '2px'; + button1.style.float = 'left'; + $('#Results_Date001Field').after(button1); + $('#button1').button({ + icon: 'ui-icon-star' + }); +} + +//部門テーマレコード作成 +function createRecordData1() { + /* + let classA = '総務・労務課'; + let classC = '野木 健一郎'; + let classE = '2024'; + let dateA = '2024/04/05 12:00'; + */ + + let classA = $('#Results_ClassB').val(); + let classC = $('#Results_ClassC').val(); + let classE = $('#Results_ClassE').val(); + let dateA = $('#Results_DateA').val(); + + let classHash = { + 'ClassA': classA, //部署名 + 'ClassC': classC, //部門長 + 'ClassE': classE, //年度 + }; + + let dateHash = { + 'DateA': dateA, //提出期限 + } + + let json = { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + 'Keys': [ + 'ClassA', + 'ClassC', + 'ClassE', + ], + 'ClassHash': classHash, + 'DateHash': dateHash, + }; + + upsertRecord(json, 'Date001'); +} + + +function upsertRecord(json, dateCol) { + let upsertTable = '214976'; + //更新対象テーブル:214976 + + let url = 'https://' + location.hostname + '/pleasanter/api/items/' + upsertTable + '/upsert'; + + $.ajax({ + 'type': 'post', + 'url': url, + 'contentType': 'application/json', + 'data': JSON.stringify(json), + 'success': function (data) { + console.log(data); + let now = new Date(); + $p.apiUpdate({ + 'id': $p.id(), + 'ApiVersion': 1.1, + 'data': { + 'DateHash': { + 'Date001': now, + } + }, + 'done': function (data) { + console.log(data); + }, + 'fail': function (data) { + console.log(data); + }, + }); + + }, + 'error': function (data) { + console.log(data); + } + }); +} \ No newline at end of file diff --git a/pleasanter/develop/★MSS/#経営計画/部門テーマ・発表資料/部門テーマ.js b/pleasanter/develop/★MSS/#経営計画/部門テーマ・発表資料/部門テーマ.js new file mode 100644 index 00000000..76ba0ac4 --- /dev/null +++ b/pleasanter/develop/★MSS/#経営計画/部門テーマ・発表資料/部門テーマ.js @@ -0,0 +1,71 @@ +let apiKey = '6504c8a807677a3a576e10327f3c19876c55736ee45d4a845796b9e7f5e087bfd4bd0d8184863da8cf1733ca635111432ab334aea59102b06a96ee6d2c05190d'; + +window.addEventListener('load', function () { + + getTemplateFile(); + +}); + +function getTemplateFile() { + + let nendo = $('#Results_ClassE').val(); + if (nendo) { + $p.apiGet({ + 'id': '231161', + 'data': { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + 'View': { + 'ColumnFilterHash': { + 'ClassA': nendo.toString(), + } + }, + }, + 'done': function (data) { + //(data.Response.Data); + $.each(data.Response.Data, function (index, data) { + let guid = data.AttachmentsHash.AttachmentsA[0].Guid; + let dataId = data.ResultId; + let id = 'button_' + data.ResultId; + let fileName = data.AttachmentsHash.AttachmentsA[0].Name + + + let div = document.createElement('div'); + let link = document.createElement("a"); + link.innerHTML = fileName; + link.style.fontWeight = 'bold'; + link.style.fontSize = '1.5em'; + link.href = "/pleasanter/binaries/" + guid + "/download"; + div.style.marginLeft = '120px'; + div.style.marginBottom = '10px'; + div.style.float = 'left'; + div.append(link); + $('#Results_AttachmentsAField').before(div); + $('#' + id).button({ + icon: 'ui-icon-document' + }); + + /* + let button = document.createElement('button'); + button.type = 'button'; + button.id = id; + button.innerHTML = fileName; + button.setAttribute('guid', guid); + button.setAttribute('onclick', 'clickEvent("' + dataId + '","' + guid + '")'); + div.style.marginLeft = '120px'; + div.style.marginBottom = '10px'; + div.style.float = 'left'; + div.append(button); + $('#Results_AttachmentsAField').before(div); + $('#' + id).button({ + icon: 'ui-icon-document' + }); + */ + + }) + } + }); + + } + +} diff --git a/pleasanter/develop/★MSS/.vscode/settings.json b/pleasanter/develop/★MSS/.vscode/settings.json new file mode 100644 index 00000000..77984130 --- /dev/null +++ b/pleasanter/develop/★MSS/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "pleasanter-code-assist.enabled": false +} \ No newline at end of file diff --git a/pleasanter/develop/★MSS/★マスターシート/connectionSetting/next999.json b/pleasanter/develop/★MSS/★マスターシート/connectionSetting/next999.json new file mode 100644 index 00000000..aeb831e2 --- /dev/null +++ b/pleasanter/develop/★MSS/★マスターシート/connectionSetting/next999.json @@ -0,0 +1,4 @@ +{ + "apiKey": "c38903157cbffc30961f50bc29d0991a6cd8af495ab3009b05c5f98e82b2e61b94ba2d5c0a48fc518b1cd74c9e427b01051a228f670f3c5282544dfbec93db87", + "url": "https://neo999.next-hd.net/pleasanter/" +} \ No newline at end of file diff --git a/pleasanter/develop/★MSS/★マスターシート/sites/htmls/外部スクリプト.html b/pleasanter/develop/★MSS/★マスターシート/sites/htmls/外部スクリプト.html new file mode 100644 index 00000000..456d82e4 --- /dev/null +++ b/pleasanter/develop/★MSS/★マスターシート/sites/htmls/外部スクリプト.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pleasanter/develop/★MSS/★マスターシート/sites/htmls/外部スクリプト2.html b/pleasanter/develop/★MSS/★マスターシート/sites/htmls/外部スクリプト2.html new file mode 100644 index 00000000..3d35c3fb --- /dev/null +++ b/pleasanter/develop/★MSS/★マスターシート/sites/htmls/外部スクリプト2.html @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/pleasanter/develop/★MSS/★マスターシート/sites/scripts/0.工事名変更スクリプト.js b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/0.工事名変更スクリプト.js new file mode 100644 index 00000000..ba306120 --- /dev/null +++ b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/0.工事名変更スクリプト.js @@ -0,0 +1,567 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 0.工事名変更スクリプト +@name : +@siteIds : 189112 +@siteTitles : ★マスターシート +@disabled: false +*/ + +// +//事前チェック前にいろいろと内容をチェックする +// +$p.events.before_validate = function (args) { + let classC = ($('#Results_ClassC').attr('data-readonly') == '1') ? $('#Results_ClassC').text() : $('#Results_ClassC option:selected').text(); + let classC2 = ($('#Results_Class049').attr('data-readonly') == '1') ? $('#Results_Class049').text() : $('#Results_Class049 option:selected').text(); + + //派生コードが選択されている場合は派生コードを使用 + if (classC2.length > 5) classC = classC2; + if (classC.length < 5) classC = '9999AAABB'; + + $p.set($('#Results_ClassA'), classC); + + setKankeisya(); + createCustomerName(); + + console.log('before validate'); + + //法人オン、オフと施主名記入チェック + //処理内容 + let houjin = $('#Results_CheckA').prop("checked"); + //let status = $('#Results_Status').attr('data-value'); + let status = $('#Results_Status').val(); + + + //外構業者設定の確認 + //新規作成または差戻し後 + if (status == '100' || status == '101' || status == '102') { + let class104 = $('#Results_Class104').val(); //外構業者 + let class103 = $('#Results_Class103').val(); //その他外構業者 + + if (class104 == 'その他') { + if (class103 == '') {//空欄だった場合 + alert('施工関連タブで「その他外構業者」を入力してください'); + return false; + } + } + } + + if (status == '100' || status == '110') { + if (houjin) { + //法人オンの場合 + let class054 = $('#Results_Class054').val(); + let class055 = $('#Results_Class055').val(); + let class056 = $('#Results_Class056').val(); + let class057 = $('#Results_Class057').val(); + + if (class054 == '' || class055 == '' || class056 == '' || class057 == '') { + alert('法人名、代表者とカナ表記を入力してください'); + return false; + } + + } else { + //法人オフの場合 + let class001 = $('#Results_Class001').val(); + let class002 = $('#Results_Class002').val(); + let class003 = $('#Results_Class003').val(); + let class004 = $('#Results_Class004').val(); + + if (class001 == '' || class002 == '' || class003 == '' || class004 == '') { + alert('施主名とカナ名を入力してください'); + return false; + } + + } + } + + if ($p.action() != 'new') { + //新規作成でない限り差戻し権限者の内容を更新する + setSashimodoshiMembers(); + } + + return true; +} + +//差し戻し権限者の一覧に名前をいれる(固定処理) +function setSashimodoshiMembers() { + //役員一覧 + //豊蔵 一幸:421,杉山 康弘:422,川名 真治:423,小池 泰久:424,後藤 傑:425,遠藤 晃太:426,佐藤 宏幸:481,刈込 美智子:644, + //WF総務GR + //豊蔵 恵美:463,長谷川 望:459,秦野 勇輝:655,露﨑 直樹:691, + + //let yakuin = ["421", "422", "423", "424", "425", "426", "481", "644"]; + //let soumu = ["463", "459", "655", "691"] + + //総務メンバーのみ初期メンバー登録 + let sashimodoshiMembers = ["463", "459", "655", "691"]; + + //次承認者一覧を結合 + sashimodoshiMembers = sashimodoshiMembers.concat($("#Results_Class186").val()); + + //所属長 myData.ClassHash.ClassY + //主担当営業 myData.ClassHash.ClassG + //所属長が主担当営業の場合は含まない + //if (myData.ClassHash.ClassY != myData.ClassHash.ClassG) { + // sashimodoshiMembers.push(myData.ClassHash.ClassY + ""); + //} + + //console.log(sashimodoshiMembers); + $p.set($('#Results_Class176'), JSON.stringify(sashimodoshiMembers)); + +} + +function haseiCodeCheck() { + //派生契約コード使用有無チェック + let haseiCd = $('#Results_CheckB').prop("checked"); + + if (haseiCd) { + $('#Results_Class049Field').css('display', 'block'); + + } else { + $('#Results_Class049Field').css('display', 'none'); + if ($('#Results_Class049').val() != '') { + console.log('Class049 set blank') + $p.set($('#Results_Class049'), ''); + } + } + + let classC = ($('#Results_ClassC').attr('data-readonly') == '1') ? $('#Results_ClassC').text() : $('#Results_ClassC option:selected').text(); + let classC2 = ($('#Results_Class049').attr('data-readonly') == '1') ? $('#Results_Class049').text() : $('#Results_Class049 option:selected').text(); + + //派生コードが選択されている場合は派生コードを使用 + if (classC2.length > 5) classC = classC2; + if (classC.length < 5) classC = '9999AAABB'; + + if ($('#Results_ClassA').val() != classC) { + $p.set($('#Results_ClassA'), classC); + } + +} + +function houjinCheck() { + console.log('Houjin Check'); + let houjin = $('#Results_CheckA').prop("checked"); + + if (houjin) { + //法人オンの場合 + + $p.set($('#Results_Class001'), ''); + $p.set($('#Results_Class002'), ''); + $p.set($('#Results_Class003'), ''); + $p.set($('#Results_Class004'), ''); + + //連名2,3の中身を消して非表示 + $p.set($('#Results_Class009'), ''); + $p.set($('#Results_Class010'), ''); + $p.set($('#Results_Class011'), ''); + $p.set($('#Results_Class012'), ''); + $p.set($('#Results_Class013'), ''); + $p.set($('#Results_Class014'), ''); + $p.set($('#Results_Class015'), ''); + $p.set($('#Results_Class016'), ''); + $p.set($('#Results_Date002'), ''); + $p.set($('#Results_Num002'), ''); + + $p.set($('#Results_Class017'), ''); + $p.set($('#Results_Class018'), ''); + $p.set($('#Results_Class019'), ''); + $p.set($('#Results_Class020'), ''); + $p.set($('#Results_Class021'), ''); + $p.set($('#Results_Class022'), ''); + $p.set($('#Results_Class023'), ''); + $p.set($('#Results_Class024'), ''); + $p.set($('#Results_Date003'), ''); + $p.set($('#Results_Num003'), ''); + + $('#Results_Class054Field').css('display', 'block'); + $('#Results_Class055Field').css('display', 'block'); + $('#Results_Class056Field').css('display', 'block'); + $('#Results_Class057Field').css('display', 'block'); + + $('#Results_Class001Field').css('display', 'none'); + $('#Results_Class002Field').css('display', 'none'); + $('#Results_Class003Field').css('display', 'none'); + $('#Results_Class004Field').css('display', 'none'); + + $('#SectionFields3Container').css('display', 'none'); + $('#SectionFields4Container').css('display', 'none'); + + } else { + //法人オフの場合 + $p.set($('#Results_Class054'), ''); + $p.set($('#Results_Class055'), ''); + $p.set($('#Results_Class056'), ''); + $p.set($('#Results_Class057'), ''); + $('#Results_Class054Field').css('display', 'none'); + $('#Results_Class055Field').css('display', 'none'); + $('#Results_Class056Field').css('display', 'none'); + $('#Results_Class057Field').css('display', 'none'); + + $('#Results_Class001Field').css('display', 'block'); + $('#Results_Class002Field').css('display', 'block'); + $('#Results_Class003Field').css('display', 'block'); + $('#Results_Class004Field').css('display', 'block'); + + $('#SectionFields3Container').css('display', 'block'); + $('#SectionFields4Container').css('display', 'block'); + + } + +} + +function houjinCheck2() { + console.log('Houjin Check'); + let houjin = $('#Results_CheckA').prop("checked"); + + if (houjin) { + //法人オンの場合 + //連名2,3の中身を消して非表示 + $('#Results_Class054Field').css('display', 'block'); + $('#Results_Class055Field').css('display', 'block'); + $('#Results_Class056Field').css('display', 'block'); + $('#Results_Class057Field').css('display', 'block'); + + $('#Results_Class001Field').css('display', 'none'); + $('#Results_Class002Field').css('display', 'none'); + $('#Results_Class003Field').css('display', 'none'); + $('#Results_Class004Field').css('display', 'none'); + + $('#SectionFields3Container').css('display', 'none'); + $('#SectionFields4Container').css('display', 'none'); + + } else { + //法人オフの場合 + $('#Results_Class054Field').css('display', 'none'); + $('#Results_Class055Field').css('display', 'none'); + $('#Results_Class056Field').css('display', 'none'); + $('#Results_Class057Field').css('display', 'none'); + + $('#Results_Class001Field').css('display', 'block'); + $('#Results_Class002Field').css('display', 'block'); + $('#Results_Class003Field').css('display', 'block'); + $('#Results_Class004Field').css('display', 'block'); + + $('#SectionFields3Container').css('display', 'block'); + $('#SectionFields4Container').css('display', 'block'); + + } + +} + +/* +$('#Results_Class054,#Results_Class055,#Results_Class056,#Results_Class057,#Results_Class001,#Results_Class002,#Results_Class003,#Results_Class004,#Results_Class009,#Results_Class010,#Results_Class011,#Results_Class012,#Results_Class017,#Results_Class018,#Results_Class019,#Results_Class020').change(function (args) { + console.log('iroiro event'); + createCustomerName(); +}); +*/ + +//法人チェックボックス処理 +$p.on('change', 'CheckA', function () { + console.log('CheckA event'); + houjinCheck(); + createCustomerName(); +}); + +//法人チェックボックス処理 +$p.on('change', 'CheckB', function () { + console.log('CheckB event'); + haseiCodeCheck(); +}); + +$p.on('change', 'ClassC', function () { + console.log('ClassC event'); + houjinCheck(); + createCustomerName(); +}); +/* +$p.on('change', 'Class049', function () { + console.log('Class049 event'); + //houjinCheck(); + //createCustomerName(); +}); +*/ + +//差戻しチェックボックスイベント +$p.on('change', 'Check100', function () { + console.log('Check100 event'); + console.log($('#Results_Check100').prop("checked")); + let check100 = $('#Results_Check100').prop("checked"); + + if (check100) { + $('button#Process_10').prop('disabled', false); + } else { + $('button#Process_10').prop('disabled', false); + } +}); + +//工事名、発注者名処理 +function createCustomerName() { + + console.log('Create Customer Name'); + + let class001 = ($('#Results_Class001').attr('data-readonly') == '1') ? $('#Results_Class001').text() : $('#Results_Class001').val(); + let class002 = ($('#Results_Class002').attr('data-readonly') == '1') ? $('#Results_Class002').text() : $('#Results_Class002').val(); + let class003 = ($('#Results_Class003').attr('data-readonly') == '1') ? $('#Results_Class003').text() : $('#Results_Class003').val(); + let class004 = ($('#Results_Class004').attr('data-readonly') == '1') ? $('#Results_Class004').text() : $('#Results_Class004').val(); + let class009 = ($('#Results_Class009').attr('data-readonly') == '1') ? $('#Results_Class009').text() : $('#Results_Class009').val(); + let class010 = ($('#Results_Class010').attr('data-readonly') == '1') ? $('#Results_Class010').text() : $('#Results_Class010').val(); + let class011 = ($('#Results_Class011').attr('data-readonly') == '1') ? $('#Results_Class011').text() : $('#Results_Class011').val(); + let class012 = ($('#Results_Class012').attr('data-readonly') == '1') ? $('#Results_Class012').text() : $('#Results_Class012').val(); + let class017 = ($('#Results_Class017').attr('data-readonly') == '1') ? $('#Results_Class017').text() : $('#Results_Class017').val(); + let class018 = ($('#Results_Class018').attr('data-readonly') == '1') ? $('#Results_Class018').text() : $('#Results_Class018').val(); + let class019 = ($('#Results_Class019').attr('data-readonly') == '1') ? $('#Results_Class019').text() : $('#Results_Class019').val(); + let class020 = ($('#Results_Class020').attr('data-readonly') == '1') ? $('#Results_Class020').text() : $('#Results_Class020').val(); + + let class054 = ($('#Results_Class054').attr('data-readonly') == '1') ? $('#Results_Class054').text() : $('#Results_Class054').val(); + let class055 = ($('#Results_Class055').attr('data-readonly') == '1') ? $('#Results_Class055').text() : $('#Results_Class055').val(); + let class056 = ($('#Results_Class056').attr('data-readonly') == '1') ? $('#Results_Class056').text() : $('#Results_Class056').val(); + let class057 = ($('#Results_Class057').attr('data-readonly') == '1') ? $('#Results_Class057').text() : $('#Results_Class057').val(); + + //工事名 + let koujimei = ''; + let koujimei_k = ''; + //発注者 + let hachusya = ''; + let hachusya_k = ''; + + let houjin = $('#Results_CheckA').prop("checked"); + + if (houjin) { + //法人オンの場合 + koujimei = class054; + if (class056 != '') { + koujimei = koujimei + ' ' + class056; + } + //hachusya = class054; + hachusya = koujimei; + koujimei_k = class055; + if (class057 != '') { + koujimei_k = koujimei_k + ' ' + class057; + } + //hachusya_k = class055; + hachusya_k = koujimei_k; + + } else { + //工事名 漢字 + koujimei = class001 + ' ' + class002; + if (class001 != class009 && class009 != '') { + koujimei = koujimei + '・' + class009 + ' ' + class010; + } else if (class001 == class009 && class010 != '') { + koujimei = koujimei + '・' + class010; + } + if (class001 != class017 && class017 != '') { + koujimei = koujimei + '・' + class017 + ' ' + class018; + } else if (class001 == class017 && class018 != '') { + koujimei = koujimei + '・' + class018; + } + + //工事名 カナ + koujimei_k = class003 + ' ' + class004; + if (class003 != class011 && class011 != '') { + koujimei_k = koujimei_k + '・' + class011 + ' ' + class012; + } else if (class003 == class011 && class012 != '') { + koujimei_k = koujimei_k + '・' + class012; + } + if (class003 != class019 && class019 != '') { + koujimei_k = koujimei_k + '・' + class019 + ' ' + class020; + } else if (class003 == class019 && class020 != '') { + koujimei_k = koujimei_k + '・' + class020; + } + + //発注者 漢字 + if (class001 != '') hachusya = class001 + ' ' + class002; + if (class009 != '') hachusya = hachusya + '・' + class009 + ' ' + class010; + if (class017 != '') hachusya = hachusya + '・' + class017 + ' ' + class018; + + //発注者 カナ + if (class003 != '') hachusya_k = class003 + ' ' + class004; + if (class011 != '') hachusya_k = hachusya_k + '・' + class011 + ' ' + class012; + if (class019 != '') hachusya_k = hachusya_k + '・' + class019 + ' ' + class020; + + } + + $p.set($('#Results_ClassQ'), koujimei); + $p.set($('#Results_ClassR'), koujimei_k); + $p.set($('#Results_ClassS'), hachusya); + $p.set($('#Results_ClassT'), hachusya_k); + + + //let classA = ($('#Results_ClassA').attr('data-readonly') == '1') ? $('#Results_ClassA').text() : $('#Results_ClassA').val(); + let classC = ($('#Results_ClassC').attr('data-readonly') == '1') ? $('#Results_ClassC').text() : $('#Results_ClassC option:selected').text(); + let classC2 = ($('#Results_Class049').attr('data-readonly') == '1') ? $('#Results_Class049').text() : $('#Results_Class049 option:selected').text(); + + //派生コードが選択されている場合は派生コードを使用 + if (classC2.length > 5) classC = classC2; + if (classC.length < 5) classC = '9999AAABB'; + + + //console.log(classA); + $p.set($('#Results_Class200'), classC + '■' + hachusya); + +} + +function hoshoCheck() { + //契約コード 保証年数のチェック---------------------------------------------------------------- + let hosho1 = { + 0: 10, + 1: 20, + 2: 30, + 3: 60, + }; + + let hosho2 = { + 1: 10, + 2: 20, + 3: 30, + 6: 60, + }; + + let seino = { + 4: 1, + 3: 2, + 2: 3, + 1: 4, + 0: 5, + } + + //BVありの場合 + let planCode1 = { + 1: 2, + 2: 5, + 3: 6, + 4: 'NG', + 5: 'NG', + } + + //BVなしの場合 + let planCode2 = { + 1: 7, + 2: 3, + 3: 4, + 4: 8, + 5: 1, + } + + //console.log($('#Results_ClassC option:selected').text()) + + if ($('#Results_ClassA').val() != '9999AAABB') { + if ($('#Results_ClassC').attr('data-readonly') != '1') { + //console.log($('#Results_ClassA').val()); + let keiyakuCode = $('#Results_ClassC option:selected').text(); + let keiyakuCode2 = $('#Results_Class049 option:selected').text(); + + if (keiyakuCode2 != '') keiyakuCode = keiyakuCode2; + + let hosho_year = $('#Results_Class063').val(); + + let code = keiyakuCode.substring(3, 4); + let code2 = keiyakuCode.substring(1, 2); + + console.log('保証年数:' + hosho1[hosho_year]); + console.log('4桁目:' + code); + + if (hosho1[hosho_year] != hosho2[code]) { + //alert('[物件詳細]の[保証年数]が適切ではありません\n再確認してください'); + //return false; + $('#Results_Class063Field').css({ + 'background-color': 'red', + 'color': 'white', + 'height': '55px', + }); + + let div = document.createElement('div'); + div.style.marginLeft = '60px'; + div.style.fontSize = '1.2em'; + div.style.fontWeight = 'bold'; + div.innerHTML = '契約コードと保証年数が一致しません'; + $('#Results_Class063Field').append(div); + + } else { + //建物保証の選択内容チェック + if (code2 == '8') { + + } else if (code2 == '0') { + + } else { + let seino_plan = seino[$('#Results_Class087').val()]; + let bvalue = $('#Results_Class062').val(); + if (bvalue == '3' || bvalue == '4') { + console.log('BVあり'); + console.log('性能プラン:' + planCode1[seino_plan]); + console.log('2桁目:' + code2); + if (planCode1[seino_plan] != code2) { + //建物保証プラン + $('#Results_Class062Field').css({ + 'background-color': 'red', + 'color': 'white', + 'height': '55px', + }); + + let div = document.createElement('div'); + div.style.marginLeft = '60px'; + div.style.fontSize = '1.2em'; + div.style.fontWeight = 'bold'; + div.innerHTML = '契約コードと保証プランが一致しません'; + $('#Results_Class062Field').append(div); + + //住宅性能評価 + $('#Results_Class087Field').css({ + 'background-color': 'red', + 'color': 'white', + 'height': '55px', + }); + let div1 = document.createElement('div'); + div1.style.marginLeft = '60px'; + div1.style.fontSize = '1.2em'; + div1.style.fontWeight = 'bold'; + div1.innerHTML = '契約コードと保証プランが一致しません'; + $('#Results_Class087Field').append(div1); + + } + + } else { + console.log('BVなし'); + console.log('性能プラン:' + planCode2[seino_plan]); + console.log('2桁目:' + code2); + if (planCode2[seino_plan] != code2) { + + } + } + } + } + } + } +} +/* +[{ + "SiteId": 61259, + "SearchFormat": "[ClassH] - [ClassJ] - [ClassP]([ClassO])", + "View": { + "ColumnSorterHash": { + "ClassH": "asc" + } + }, + "Lookups": [{ + "From": "ClassH", + "To": "ClassA", + "Type": 0 + }, + { + "From": "ClassT", + "To": "ClassB", + "Type": 0 + }, + { + "From": "Class001", + "To": "ClassO", + "Type": 0 + }, + { + "From": "DateA", + "To": "DateD", + "Type": 0 + }, + ] +}] +*/ \ No newline at end of file diff --git a/pleasanter/develop/★MSS/★マスターシート/sites/scripts/1.マスターシートメインスクリプト.js b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/1.マスターシートメインスクリプト.js new file mode 100644 index 00000000..e3f64c6c --- /dev/null +++ b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/1.マスターシートメインスクリプト.js @@ -0,0 +1,1636 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 1.マスターシートメインスクリプト +@name : +@siteIds : 189112 +@siteTitles : ★マスターシート +@disabled: false +*/ + + +//jexcel next-hd.netサーバ配置 +/* +loadcdn('script', 'https://cdnjs.cloudflare.com/ajax/libs/xlsx-populate/1.21.0/xlsx-populate.min.js'); +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'); +loadcdn('script', 'https://jpostal-1006.appspot.com/jquery.jpostal.js'); +loadcdn('script', 'https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.8/FileSaver.min.js'); +loadcdn('script', 'https://cdnjs.cloudflare.com/ajax/libs/axios/1.3.4/axios.min.js'); +loadcdn('script', 'https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js'); + +loadcdn('script', 'https://cdn.geolonia.com/community-geocoder.js'); +loadcdn('script', 'https://html2canvas.hertzen.com/dist/html2canvas.min.js'); +loadcdn('script', 'https://cdnjs.cloudflare.com/ajax/libs/jquery.qrcode/1.0/jquery.qrcode.min.js'); +*/ + +let apiKey = '6504c8a807677a3a576e10327f3c19876c55736ee45d4a845796b9e7f5e087bfd4bd0d8184863da8cf1733ca635111432ab334aea59102b06a96ee6d2c05190d'; + +let pageLoading = 0; + +let myTable1a; //支払情報 +let myTable2a; //A.建物工事見積書 +let myTable3a; //B.追加変更工事見積書 +let myTable4a; //C.付帯工事見積書 +let myTable5a; //D.値引きなど +let myTable6a; //■総計 +let myTable7a; //■太陽光システム 瑕疵担保計算 + +let editableFlag = 1; +//$('#LockedRecord').val(); + +let onchangeFlag = 0; +let tableLoad = 0; + +let templateFiles = { + +}; + +//let userList = {}; +let userList = $('#userList').length > 0 ? JSON.parse($('#userList').val()) : {}; + +let syukyaku = {}; +let tenpoList = {}; + +let readtime_date = { + keiyaku_date: '', //契約日 Date001 + zukaku_date0: '', //図確日 Date002 + zukaku_date1: '', //実図確日 Date003 + hikitsugi_date1: '', //図確引継日1 Date004 + hikitsugi_date2: '', //図確引継日2 Date005 + jizen_date1: '', //事前提出日 Date006 + jizen_date2: '', //事前決済日 Date007 + kakunin_date1: '', //確認提出日 Date008 + kakunin_date2: '', //確認決裁日 Date009 + fusezu_date: '', //伏せ図チェック日 Date010 + shiyo_kanryo_date: '', //仕様打ち完了日 Date011 + yonsya_date: '', //四者承認図前 Date012 + shonin14_date: '', //承認図14日前 Date013 + kaitai_date1: '', //解体工事着手日 Date014 + kaitai_date2: '', //解体工事完了日 Date015 + chitai_chousa_date: '', //地耐力調査 Date016 + choki_tanso_date1: '', //長期・低炭素申込日 Date017 + seinohyouka_date: '', //性能評価発行日 Date018 + choki_tanso_date2: '', //長期・低炭素決済日 Date019 + hoken_date: '', //保険登録 Date020 + jiban_date: '', //地盤改良着手日 Date021 + chakko_yotei_date: '', //着工予定日 Date022 + maizo_chakko_date: '', //埋蔵有着工日 Date023 + shiyo_kanryo_date2: '' //仕様打ち完了日 +}; + + +window.addEventListener('load', function () { + tableLoad = 0; + if (pageLoading == 0) { + console.log('load Event'); + onLoad(); + } + + //郵便番号から住所 + jpostalSetting(); +}); + +$p.events.on_editor_load = function () { + tableLoad = 0; + if (pageLoading == 1) { + console.log('on Editor Load'); + onLoad(); + } +}; + +function onLoad() { + pageLoading = 1; + + if ($p.action() != 'new') { + getMyData(); + getKeiyakuCodeData(); + getNo9_Files(); + } + + //コメント欄の上にメッセージ表示 + //addCommentsBeforeCommentField(); + + //ステータス項目を操作不能に + //InputReadOnly('Status'); + //InputReadOnly('ClassB'); + + //WF申請関連項目の調整 + InputWfColumn(); + InputReadOnly(); + + //色付 + $('#Results_Num040Field').css('background-color', 'yellow'); + + //タブの色の設定 + setTabColorClass(0); + + if ($('#Results_Status').attr('data-value')) { + console.log(parseFloat($('#Results_Status').attr('data-value'))); + if (parseFloat($('#Results_Status').attr('data-value')) > 200) { + editableFlag = 0; + } + } else { + console.log(parseFloat($('#Results_Status').val())); + if (parseFloat($('#Results_Status').val()) > 200) { + editableFlag = 0; + } + } + console.log(editableFlag); + + houjinCheck2(); + + + //getUserList(0); + flag = 0; + createShiharaiGrid(); + createMitsumoriGrid(); + table2Calc(); + table3Calc(); + table4Calc(); + table5Calc(); + + createReadTimeTable(); + + //添付ファイル一括DLボタン追加 コメント追加 + let attachColumns = $('.control-attachments'); + $.each(attachColumns, function (index, value) { + let attach = value.dataset.name; + attachmentComments(attach); + attachFileCheckbox(attach); + }); + + // + columnsComments('Class007', 'red'); + + if ($p.action() != 'new') { + getTemplateFiles(); + createMapButton(); + jizenKakunin(); + + //お客様データファイルを開くボタン + createOkyakusamFilesButton(); + + //ワークフロー状況ウインドウを開くボタン + createWorkFlowViewButton(); + createWorkFlowViewButton2(); + } + + $p.ex.readonlyColumn(); + + haseiCodeCheck(); + + getSyukyakuTable(); + getTenpoTable(); + + //太陽光計算シート非表示 + $('#myTable7').hide(); + +} + +function getSyukyakuTable() { + $p.apiGet({ + 'id': '211715', + 'data': { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + }, + 'done': function (data) { + $.each(data.Response.Data, function (index, value) { + syukyaku[value.ResultId] = { + 'ResultId': value.ResultId, + 'Group': value.ClassHash.ClassA, + } + }) + + //console.log(syukyaku); + + }, + }); +} + + +//顧客コードが抜けている場合、契約コードテーブルからデータを引っ張ってきて顧客コードを更新する +function getKeiyakuCodeData() { + let keiyakuCodeTable = myData.ClassHash.ClassC; + if (keiyakuCodeTable) { + $p.apiGet({ + 'id': keiyakuCodeTable, + 'data': { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + }, + 'done': function (data) { + //console.log(data); + if (myData.ClassHash.ClassB == "") { + $p.apiUpdate({ + 'id': $p.id(), + 'data': { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + 'ClassHash': { + 'ClassB': data.Response.Data[0].ClassHash.ClassT, + } + }, + done: function (data) { + console.log(data); + }, + fail: function (data) { + console.log(data); + } + }); + } + }, + }); + } +} + +function getTenpoTable() { + $p.apiGet({ + 'id': '96243', + 'data': { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + }, + 'done': function (data) { + $.each(data.Response.Data, function (index, value) { + tenpoList[value.ResultId] = { + 'ResultId': value.ResultId, + 'ShopName': value.ClassHash.ClassT, + } + }) + + //console.log(tenpoList); + + }, + }); +} + +//添付ファイル入力欄にコメントを追加する汎用関数 +function attachmentComments(attach) { + let comments = ''; + + //説明欄にコメントがある場合、追加 + if ($('#Results_' + attach + 'Field>div.field-control').attr('title')) { + comments = $('#Results_' + attach + 'Field>div.field-control').attr('title'); + } + + if (comments) { + let div1 = document.createElement('div'); + div1.innerHTML = comments; + div1.style.marginLeft = '121px'; + div1.style.fontWeight = 'bold'; + div1.style.color = '#00F'; + + //位置調整とコメント追加 + $('#Results_' + attach + 'Field').append(div1); + $('#Results_' + attach + 'Field').css('margin-bottom', '10px'); + } + +} + +function columnsComments(column, color) { + let comments = ''; + + //説明欄にコメントがある場合、追加 + if ($('#Results_' + column + 'Field>div.field-control').attr('title')) { + comments = $('#Results_' + column + 'Field>div.field-control').attr('title'); + } + let div1 = document.createElement('div'); + div1.innerHTML = comments; + div1.style.marginLeft = '121px'; + div1.style.fontWeight = 'bold'; + div1.style.color = color; + + //位置調整とコメント追加 + $('#Results_' + column + 'Field').append(div1); + if ($('#Results_' + column + 'Field').hasClass('field-normal')) { + $('#Results_' + column + 'Field').css('margin-bottom', '15px'); + } + + if ($('#Results_' + column + 'Field').hasClass('field-wide')) { + $('#Results_' + column + 'Field').css('margin-bottom', '0px'); + } +} + +function addCommentsBeforeCommentField() { + let comDiv = document.createElement('div'); + comDiv.innerHTML = '【承認】【差戻】処理時のコメントはボタンを押す前に下記へ記入すること。'; + comDiv.style.margin = '5px'; + comDiv.style.fontSize = '1.2em'; + comDiv.style.fontWeight = 'bold'; + comDiv.style.color = '#00F'; + + $('#CommentField').before(comDiv); +} + +//タブクリック時に色を変更するスクリプト +$(document).on('click', '.ui-tabs-anchor', function (e) { + let hash = e.currentTarget.hash.split('#')[1]; + setTabColorClass(hash); +}); + +function setTabColorClass(hash) { + //タブ色 赤 + let list1 = ['FieldSetTab11', 'FieldSetTab12', 'FieldSetTab14']; + let color1 = 'tabColor1'; + let color2 = 'tabColor2'; + + $.each(list1, function (index, tabName) { + removeTabColorClass(tabName, color2); + addTabColorClass(tabName, color1); + }) + + if (list1.includes(hash)) { + removeTabColorClass(hash, color1); + addTabColorClass(hash, color2); + } + + //タブ色 青 + let list2 = ['FieldSetTab16', 'FieldSetTab17']; + color1 = 'tabColor3'; + color2 = 'tabColor4'; + + $.each(list2, function (index, tabName) { + removeTabColorClass(tabName, color2); + addTabColorClass(tabName, color1); + }) + + if (list2.includes(hash)) { + removeTabColorClass(hash, color1); + addTabColorClass(hash, color2); + } + + //タブ色 赤2 + let list3 = ['FieldSetTab18']; + color1 = 'tabColor5'; + color2 = 'tabColor6'; + + $.each(list3, function (index, tabName) { + removeTabColorClass(tabName, color2); + addTabColorClass(tabName, color1); + }) + + if (list3.includes(hash)) { + removeTabColorClass(hash, color1); + addTabColorClass(hash, color2); + } + +} + +//タブの色を初期化 +function removeTabColorClass(tabName, colorNum) { + $('li[aria-controls="' + tabName + '"]').removeClass(colorNum); +} +function addTabColorClass(tabName, colorNum) { + $('li[aria-controls="' + tabName + '"]').addClass(colorNum); +} + + + +function createMapButton() { + let div = document.createElement('div'); + let button = document.createElement('button'); + button.type = 'button'; + button.id = 'openMapWindow'; + button.innerHTML = '現場案内図'; + button.setAttribute('onclick', 'createMapReport()'); + button.style.margin = '5px'; + div.append(button); + $('#Results_Description050Field').after(div); + $('#openMapWindow').button({ + icon: 'ui-icon-document' + }); +} + +function getUserList(offset) { + let json = { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + 'Offset': offset, + 'View': { + 'ApiGetMailAddresses': true, + }, + }; + let url = 'https://' + location.hostname + '/pleasanter/api/users/get'; + + $.ajax({ + type: 'post', + url: url, + contentType: 'application/json', + data: JSON.stringify(json), + success: function (data) { + //console.log(data); + $.each(data.Response.Data, function (index, value) { + let name = value.Name; + let deptId = value.DeptId; + let userId = value.UserId; + let mailAddress = value.MailAddresses[0]; + + userList[userId] = { + name: name, + userId: userId, + deptId: deptId, + mailAddress: mailAddress, + }; + }); + //console.log(data.Response.Data.length); + if ((offset + data.Response.Data.length) < data.Response.TotalCount) { + let offset2 = offset + 200; + getUserList(offset2); + } + }, + error: function (data) { + console.log(data); + }, + }); +} + +function getTemplateFiles() { + //添付ファイルのGuid取得 + $p.apiGet({ + 'id': '189122', + 'data': { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + 'View': { + 'ColumnFilterHash': { + 'Status': 100, + }, + 'ColumnSorterHash': { + 'NumA': 'asc', + }, + }, + }, + done: function (data) { + //console.log(data); + let div = document.createElement('div'); + div.id = 'reportButtons'; + $('#Guide').after(div); + + let button = document.createElement('button'); + button.type = 'button'; + button.id = 'oboegakiReport'; + button.innerHTML = '覚書閲覧(仮)'; + button.setAttribute('onclick', 'oboegaki()'); + button.style.margin = '5px'; + div.append(button); + $('#oboegakiReport').button({ + icon: 'ui-icon-star' + }); + + $.each(data.Response.Data, function (index, data) { + let fileName = data.Title; + let guid = data.AttachmentsHash.AttachmentsA[0].Guid; + templateFiles[fileName] = guid; + + let button = document.createElement('button'); + button.type = 'button'; + button.id = guid; + button.innerHTML = fileName; + button.setAttribute('onclick', 'getTemplateRecord("' + fileName + '")'); + button.style.margin = '5px'; + div.append(button); + $('#' + guid).button({ + icon: 'ui-icon-document' + }); + }); + + + }, + }); +} + +function createWorkFlowViewButton() { + let div = document.createElement('div'); + div.id = 'wfView'; + div.style.float = "left"; + $('#Guide').after(div); + + let button = document.createElement('button'); + button.type = 'button'; + button.id = 'wfViewButton'; + button.innerHTML = '契約WFステータス'; + button.setAttribute('onclick', '$p.ex.createArrayData()'); + button.style.margin = '5px'; + div.append(button); + $('#wfViewButton').button({ + icon: 'ui-icon-star' + }); +} + +function createWorkFlowViewButton2() { + let div = document.createElement('div'); + div.id = 'wfView2'; + $('#SectionFields40Container').before(div); + + let button = document.createElement('button'); + button.type = 'button'; + button.id = 'wfViewButton2'; + button.innerHTML = '契約WFステータス'; + button.setAttribute('onclick', '$p.ex.createArrayData()'); + button.style.margin = '5px'; + div.append(button); + $('#wfViewButton2').button({ + icon: 'ui-icon-star' + }); +} + +function createShiharaiGrid() { + let shiharai_ary = new Array(); + shiharai_ary.push('設計契約時'); + shiharai_ary.push('契約時'); + shiharai_ary.push('着工時'); + shiharai_ary.push('上棟時'); + shiharai_ary.push('引き渡し時'); + + //契約日 + let keiyaku_date_Str = ''; + if ($p.getControl('DateD').val() != '') { + let keiyaku_date = new Date($p.getControl('DateD').val()); + keiyaku_date_Str = dateToStr(keiyaku_date); + //keiyaku_date.getFullYear() + '/' + ('0' + (keiyaku_date.getMonth() + 1)).slice(-2) + '/' + ('0' + keiyaku_date.getDate()).slice(-2) + ''; + shiharai_ary.push(keiyaku_date_Str); + } + + //設計契約日 + let s_keiyaku_date_Str = ''; + if ($p.getControl('DateE').val() != '') { + let s_keiyaku_date = new Date($p.getControl('DateE').val()); + s_keiyaku_date_Str = dateToStr(s_keiyaku_date); + //s_keiyaku_date.getFullYear() + '/' + ('0' + (s_keiyaku_date.getMonth() + 1)).slice(-2) + '/' + ('0' + s_keiyaku_date.getDate()).slice(-2) + ''; + shiharai_ary.push(s_keiyaku_date_Str); + } + + //着工予定日 + let chakkou_date_Str = ''; + if ($p.getControl('DateH').val() != '') { + let chakkou_date = new Date($p.getControl('DateH').val()); + chakkou_date_Str = dateToStr(chakkou_date); + //chakkou_date.getFullYear() + '/' + ('0' + (chakkou_date.getMonth() + 1)).slice(-2) + '/' + ('0' + chakkou_date.getDate()).slice(-2) + ''; + shiharai_ary.push(chakkou_date_Str); + } + + //上棟日 + let joutou_date_Str = ''; + if ($p.getControl('DateK').val() != '') { + let joutou_date = new Date($p.getControl('DateK').val()); + joutou_date_Str = dateToStr(joutou_date); + //joutou_date.getFullYear() + '年' + ('0' + (joutou_date.getMonth() + 1)).slice(-2) + '月' + ('0' + joutou_date.getDate()).slice(-2) + '日'; + shiharai_ary.push(joutou_date_Str); + } + + //引渡日 + let hikiwatashi_date_Str = ''; + if ($p.getControl('DateI').val() != '') { + let hikiwatashi_date = new Date($p.getControl('DateI').val()); + hikiwatashi_date_Str = dateToStr(hikiwatashi_date); + //hikiwatashi_date.getFullYear() + '年' + ('0' + (hikiwatashi_date.getMonth() + 1)).slice(-2) + '月' + ('0' + hikiwatashi_date.getDate()).slice(-2) + '日'; + shiharai_ary.push(hikiwatashi_date_Str); + } + + //console.log(shiharai_ary); + + let myTable1 = document.createElement('div'); + let myTable1Data = JSON.parse($('#Results_DescriptionA').val()); + myTable1.id = 'myTable1'; + myTable1.style.cssText = 'float: left; clear: both;'; + + $('#Results_DescriptionAField').after(myTable1); + + myTable1a = jspreadsheet(document.getElementById('myTable1'), { + data: myTable1Data, + columns: [{ + type: 'text', + title: '項目', + width: 120, + align: 'left', + readOnly: true, + }, + { + type: 'dropdown', + title: '支払方法', + width: 120, + align: 'left', + source: ['自己資金', 'フラット35S', '銀行ローン', '住宅ローン', '財形', 'その他'], + }, + { + type: 'number', + title: '金額(税込)', + width: 120, + mask: '#,##0;[Red](#,##0)', + align: 'right', + }, + { + type: 'dropdown', + title: '支払予定日', + width: 120, + align: 'left', + source: shiharai_ary, + }, + { + type: 'calendar', + title: '支払予定日(任意)', + width: 120, + align: 'left', + options: { + format: 'YYYY/MM/DD', + months: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], + weekdays: ['日曜日', '月曜日', '木曜日', '水曜日', '木曜日', '金曜日', '土曜日'], + weekdays_short: ['日', '月', '火', '水', '木', '金', '土'] + }, + }, + { + type: 'dropdown', + title: '支払状況', + width: 120, + align: 'left', + source: ['支払済', '支払予定'], + }, + { + type: 'number', + title: '合計', + width: 150, + 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, + onbeforepaste: function (el, cell, x, y, value, oldValue) { + if (x == 1 || x == 3 || x == 5) return false; + //return false; + }, + onbeforechange: function (el, cell, x, y, value, oldValue) { + if (x == 2 && value == "") return 0; + //return true; + }, + onchange: function (el, cell, x, y, value, oldValue) { + if (tableLoad) { + if (x == 2) { + //console.log('onchange0'); + table1CalcA(); + } + + if (x == 3) { + if (onchangeFlag == 0) { + //console.log('onchange1'); + onchangeFlag = 1; + table1CalcB(); + onchangeFlag = 0; + } + } + + if (x == 4) { + if (onchangeFlag == 0) { + //console.log('onchange2'); + onchangeFlag = 1; + table1CalcC(); + onchangeFlag = 0; + } + } + + $p.set($('#Results_DescriptionA'), JSON.stringify(myTable1a.getJson())); + console.log('Set Results_DescriptionA'); + } + }, + }); + + myTable1a.setMerge('A1', 1, 2); + myTable1a.setMerge('A3', 1, 2); + myTable1a.setMerge('A5', 1, 2); + myTable1a.setMerge('A7', 1, 2); + myTable1a.setMerge('G1', 1, 2); + myTable1a.setMerge('G3', 1, 2); + myTable1a.setMerge('G5', 1, 2); + myTable1a.setMerge('G7', 1, 2); + + myTable1a.hideIndex(); +} + +function createMitsumoriGrid() { + //A.建物工事見積書 + let myTable2 = document.createElement('div'); + let myTable2Data = JSON.parse($('#Results_DescriptionB').val()); + myTable2.id = 'myTable2'; + myTable2.style.cssText = 'float: left; clear: both;'; + + $('#Results_DescriptionBField').after(myTable2); + + myTable2a = jspreadsheet(document.getElementById('myTable2'), { + data: myTable2Data, + columns: [{ + type: 'text', + title: '名称', + width: 120, + align: 'left', + }, + { + type: 'text', + title: '仕様', + width: 600, + align: 'left', + }, + { + type: 'number', + title: '工事見積金額', + width: 120, + mask: '#,##0;[Red](#,##0)', + align: 'right', + }, + { + type: 'dropdown', + title: '正式/概算', + width: 120, + align: 'center', + source: ['正式', '概算'], + }, + ], + allowInsertColumn: false, + allowInsertRow: true, + allowManualInsertRow: false, + allowDeleteColumn: false, + allowDeletingAllRows: false, + columnSorting: false, + columnResize: false, + minSpareRows: 1, + editable: editableFlag, + contextMenu: false, + onbeforechange: function (el, cell, x, y, value, oldValue) { + if (x == 2 && value == "") return 0; + //return true; + }, + onchange: function (el, cell, x, y, value, oldValue) { + if (tableLoad) { + //console.log('onChange Table2') + table2Calc(); + } + }, + onblur: function (el, cell, x, y, value, oldValue) { + //console.log(el); + deleteBlankRow(); + }, + }); + myTable2a.hideIndex(); + + //B.追加変更工事見積書 + let myTable3 = document.createElement('div'); + let myTable3Data = JSON.parse($('#Results_DescriptionC').val()); + myTable3.id = 'myTable3'; + myTable3.style.cssText = 'float: left; clear: both;'; + + $('#Results_DescriptionCField').after(myTable3); + + myTable3a = jspreadsheet(document.getElementById('myTable3'), { + data: myTable3Data, + columns: [{ + type: 'text', + title: '項目名', + width: 120, + align: 'left', + }, + { + type: 'dropdown', + title: '区分', + width: 60, + align: 'center', + source: ['追加', '不行'], + }, + { + type: 'text', + title: '仕様', + width: 360, + align: 'left', + }, + { + type: 'number', + title: '数量', + width: 120, + mask: '#,##0;[Red](#,##0)', + align: 'right', + }, + { + type: 'dropdown', + title: '単位', + width: 60, + align: 'center', + source: ['セット', '式', 'kw', '個'], + }, + { + type: 'number', + title: '単価', + width: 120, + mask: '#,##0;[Red](#,##0)', + align: 'right', + }, + { + type: 'number', + title: '合計金額', + width: 120, + mask: '#,##0;[Red](#,##0)', + align: 'right', + }, + ], + allowInsertColumn: false, + allowInsertRow: true, + allowManualInsertRow: false, + allowDeleteColumn: false, + allowDeletingAllRows: false, + columnSorting: false, + columnResize: false, + minSpareRows: 1, + editable: editableFlag, + contextMenu: false, + onbeforechange: function (el, cell, x, y, value, oldValue) { + if ((x == 3 || x == 5) && value == "") return 0; + //return true; + }, + onchange: function (el, cell, x, y, value, oldValue) { + if (tableLoad) { + //console.log('onChange Table3') + if (x <= 5) { + table3Calc(); + } + } + }, + onblur: function (el, cell, x, y, value, oldValue) { + //console.log(el); + deleteBlankRow(); + }, + }); + myTable3a.hideIndex(); + + //C.付帯工事見積書 + let myTable4 = document.createElement('div'); + let myTable4Data = JSON.parse($('#Results_DescriptionD').val()); + myTable4.id = 'myTable4'; + myTable4.style.cssText = 'float: left; clear: both;'; + + $('#Results_DescriptionDField').after(myTable4); + + //console.log(myTable4Data.length); + for (i = myTable4Data.length; i < 33; i++) { + let data = { + "0": "", + "1": "", + "2": 0, + "3": "" + }; + + myTable4Data.push(data); + } + + myTable4a = jspreadsheet(document.getElementById('myTable4'), { + data: myTable4Data, + columns: [{ + type: 'text', + title: '分類', + width: 60, + align: 'left', + readOnly: true, + }, + { + type: 'text', + title: '項目名', + width: 240, + align: 'left', + }, + { + type: 'number', + title: '確定額', + width: 120, + mask: '#,##0;[Red](#,##0)', + align: 'right', + }, + { + type: 'text', + title: '備考', + width: 360, + align: 'left', + }, + ], + allowInsertColumn: false, + allowInsertRow: false, + allowManualInsertRow: false, + allowDeleteColumn: false, + allowDeletingAllRows: false, + columnSorting: false, + columnResize: false, + editable: editableFlag, + contextMenu: false, + onbeforechange: function (el, cell, x, y, value, oldValue) { + if (x == 2 && value == "") return 0; + //return true; + }, + onchange: function (el, cell, x, y, value, oldValue) { + if (tableLoad) { + //console.log('onChange Table4') + table4Calc(); + } + }, + }); + myTable4a.hideIndex(); + + myTable4a.setMerge('A1', 1, 6); + myTable4a.setMerge('A7', 1, 2); + myTable4a.setMerge('A9', 1, 2); + myTable4a.setMerge('A11', 1, 2); + myTable4a.setMerge('A13', 1, 3); + myTable4a.setMerge('A19', 1, 5); + myTable4a.setMerge('A24', 1, myTable4Data.length - 23); + + //D.値引きなど + let myTable5 = document.createElement('div'); + let myTable5Data = JSON.parse($('#Results_DescriptionE').val()); + myTable5.id = 'myTable5'; + myTable5.style.cssText = 'float: left; clear: both;'; + + $('#Results_DescriptionEField').after(myTable5); + + myTable5a = jspreadsheet(document.getElementById('myTable5'), { + data: myTable5Data, + columns: [{ + type: 'text', + title: '項目', + width: 180, + align: 'left', + readOnly: true, + }, + { + type: 'number', + title: '金額', + width: 180, + mask: '#,##0;[Red](#,##0)', + align: 'right', + }, + ], + allowInsertColumn: false, + allowInsertRow: false, + allowManualInsertRow: false, + allowDeleteColumn: false, + allowDeletingAllRows: false, + columnSorting: false, + columnResize: false, + minSpareRows: 0, + editable: editableFlag, + contextMenu: false, + onbeforechange: function (el, cell, x, y, value, oldValue) { + if (x == 1 && value == "") return 0; + //return true; + }, + onchange: function (el, cell, x, y, value, oldValue) { + if (tableLoad) { + //console.log('onChange Table5') + table5Calc(); + } + }, + }); + myTable5a.hideIndex(); + + //総計 + let myTable6 = document.createElement('div'); + let myTable6Data = JSON.parse($('#Results_DescriptionF').val()); + myTable6.id = 'myTable6'; + myTable6.style.cssText = 'float: left; clear: both;'; + + $('#Results_DescriptionFField').after(myTable6); + + myTable6a = jspreadsheet(document.getElementById('myTable6'), { + data: myTable6Data, + columns: [{ + type: 'text', + title: '項目', + width: 180, + align: 'left', + readOnly: true, + }, + { + type: 'number', + title: '金額', + width: 180, + 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, + }); + myTable6a.hideIndex(); + + //太陽光計算 + let myTable7 = document.createElement('div'); + let myTable7Data = JSON.parse($('#Results_DescriptionG').val()); + myTable7.id = 'myTable7'; + myTable7.style.cssText = 'float: left; clear: both;'; + + $('#Results_DescriptionGField').after(myTable7); + + myTable7a = jspreadsheet(document.getElementById('myTable7'), { + data: myTable7Data, + columns: [{ + type: 'text', + title: '項目', + width: 180, + align: 'left', + readOnly: true, + }, + { + type: 'number', + title: '金額', + width: 180, + mask: '#,##0;[Red](#,##0)', + align: 'right', + readOnly: true, + }, + { + type: 'text', + title: '備考', + width: 360, + align: 'left', + readOnly: true, + }, + ], + allowInsertColumn: false, + allowInsertRow: false, + allowManualInsertRow: false, + allowDeleteColumn: false, + allowDeletingAllRows: false, + columnSorting: false, + columnResize: false, + minSpareRows: 0, + editable: editableFlag, + contextMenu: false, + }); + myTable7a.hideIndex(); + + tableLoad = 1; +} + +function table2Calc() { + let myData2 = myTable2a.getData(); + let sumValue = 0; + + $.each(myData2, function (index, value) { + if (value[2].toString() != '') { + let val0 = parseFloat(value[2].toString().replaceAll(/[¥,]/g, '')); + sumValue = sumValue + val0; + } else { + let val0 = 0; + sumValue = sumValue + val0; + } + }); + + if ($('#Results_Num045').val().toString().replaceAll(/[¥,]/g, '') != sumValue) { + $p.set($('#Results_Num045'), sumValue.toLocaleString()); + console.log('Set Results_Num045'); + } + + if ($('#Results_DescriptionB').val() != JSON.stringify(myTable2a.getJson())) { + $p.set($('#Results_DescriptionB'), JSON.stringify(myTable2a.getJson())); + console.log('Set Results_DescriptionB'); + } + + table6Calc(); +} + +function table3Calc() { + let myData3 = myTable3a.getData(); + let sumValue = 0; + + $.each(myData3, function (index, value) { + let i = index + 1; + if (value[3].toString() != '' && value[5].toString() != '') { + let val3 = parseFloat(value[3].toString().replaceAll(/[¥,]/g, '')); + let val5 = parseFloat(value[5].toString().replaceAll(/[¥,]/g, '')); + + if (val3 == '') val3 = 0; + if (val5 == '') val5 = 0; + let val6 = 0; + val6 = val3 * val5; + myTable3a.setValue('G' + i, val6, true); + sumValue = sumValue + val6; + } else { + myTable3a.setValue('G' + i, '', true); + } + }); + + if ($('#Results_Num046').val().toString().replaceAll(/[¥,]/g, '') != sumValue) { + $p.set($('#Results_Num046'), sumValue.toLocaleString()); + console.log('Set Results_Num046'); + } + + if ($('#Results_DescriptionC').val() != JSON.stringify(myTable3a.getJson())) { + $p.set($('#Results_DescriptionC'), JSON.stringify(myTable3a.getJson())); + console.log('Set Results_DescriptionC'); + } + + table6Calc(); +} + +function table4Calc() { + let myData4 = myTable4a.getData(); + let sumValue = 0; + + $.each(myData4, function (index, value) { + if (value[2].toString() != '') { + let val2 = parseFloat(value[2].toString().replaceAll(/[¥,]/g, '')); + sumValue = sumValue + val2; + } else { + let val2 = 0; + sumValue = sumValue + val2; + } + }); + + if ($('#Results_Num047').val().toString().replaceAll(/[¥,]/g, '') != sumValue) { + $p.set($('#Results_Num047'), sumValue.toLocaleString()); + console.log('Set Results_Num047'); + } + + if ($('#Results_DescriptionD').val() != JSON.stringify(myTable4a.getJson())) { + $p.set($('#Results_DescriptionD'), JSON.stringify(myTable4a.getJson())); + console.log('Set Results_DescriptionD'); + } + + table6Calc(); +} + +function table5Calc() { + if ($('#Results_DescriptionE').val() != JSON.stringify(myTable5a.getJson())) { + $p.set($('#Results_DescriptionE'), JSON.stringify(myTable5a.getJson())); + console.log('Set Results_DescriptionE'); + } + table6Calc(); +} + +function table6Calc() { + //console.log('table6Calc'); + let dataA = parseFloat($('#Results_Num045').val().toString().replaceAll(/[¥,]/g, '')); + let dataB = parseFloat($('#Results_Num046').val().toString().replaceAll(/[¥,]/g, '')); + let dataC = parseFloat($('#Results_Num047').val().toString().replaceAll(/[¥,]/g, '')); + let myData5 = myTable5a.getData(); + //D.値引きなど + let dataD = 0; + let dataE = 0; + let dataF = 0; + let dataG = 0; + + if (myData5[0][1].toString() != '') { + dataD = parseFloat(myData5[0][1].toString().replaceAll(/[¥,]/g, '')); + } + if (myData5[1][1].toString() != '') { + dataE = parseFloat(myData5[1][1].toString().replaceAll(/[¥,]/g, '')); + } + if (myData5[2][1].toString() != '') { + dataF = parseFloat(myData5[2][1].toString().replaceAll(/[¥,]/g, '')); + } + if (myData5[3][1].toString() != '') { + dataG = parseFloat(myData5[3][1].toString().replaceAll(/[¥,]/g, '')); + } + + let tsubo1 = 0; + if ($('#Results_Num018').val()) tsubo1 = parseFloat($('#Results_Num018').val().toString().replaceAll(/[¥,]/g, '')); + let sum1 = dataA + dataB + dataC + dataD; + let zei1 = Math.floor(sum1 * 0.1); + let tsubo2 = 0; + if (tsubo1 > 0) tsubo2 = Math.floor(sum1 / tsubo1); + let sum2 = sum1 + zei1; + + let sum3 = sum1 + dataE; + let zei2 = Math.floor(sum3 * 0.1); + let dataX = sum3 + zei2; + + let dataGzei = Math.floor(dataG * 0.1); + let dataY = dataF + dataG + dataGzei; + + let allSum = dataX + dataY; + + myTable6a.setValue('B1', dataA, true); + myTable6a.setValue('B2', dataB, true); + myTable6a.setValue('B3', dataC, true); + myTable6a.setValue('B4', dataD, true); + myTable6a.setValue('B5', sum1, true); + myTable6a.setValue('B6', tsubo1, true); + myTable6a.setValue('B7', tsubo2, true); + myTable6a.setValue('B8', zei2, true); + myTable6a.setValue('B9', sum2, true); + myTable6a.setValue('B10', dataE, true); + myTable6a.setValue('B11', sum3, true); + myTable6a.setValue('B12', zei2, true); + myTable6a.setValue('B13', dataX, true); + myTable6a.setValue('B14', dataF, true); + myTable6a.setValue('B15', dataG, true); + myTable6a.setValue('B16', dataGzei, true); + myTable6a.setValue('B17', dataY, true); + myTable6a.setValue('B18', allSum, true); + + if ($('#Results_Num050').val().toString().replaceAll(/[¥,]/g, '') != sum2) { + $p.set($('#Results_Num050'), sum2.toLocaleString()); + console.log('Set Results_Num050'); + } + + if ($('#Results_DescriptionF').val() != JSON.stringify(myTable6a.getJson())) { + $p.set($('#Results_DescriptionF'), JSON.stringify(myTable6a.getJson())); + console.log('Set Results_DescriptionF'); + } + + table7Calc(); +} + +$p.on('change', 'Num051', function () { + table7Calc(); +}); + +function table7Calc() { + let myData5 = myTable5a.getData(); + let myData7 = myTable7a.getData(); + + let ukeoi = parseFloat($('#Results_Num050').val().toString().replaceAll(/[¥,]/g, '')); //請負金額税込 + let dataA = parseFloat(myData7[1][1].toString().replaceAll(/[¥,]/g, '')); //地盤調査費 + let dataB = 0; + + if (myData5[0][1].toString() != '') { + dataB = parseFloat(myData5[0][1].toString().replaceAll(/[¥,]/g, '')); //値引き + } + + let dataC = parseFloat($('#Results_Num051').val().toString().replaceAll(/[¥,]/g, '')); //太陽光システム請負金額 + let tatemono = parseFloat($('#Results_Num045').val().toString().replaceAll(/[¥,]/g, '')); //太陽光システム請負金額 + + let zeiritsu = parseFloat($('#Results_Num039').val().toString().replaceAll(/[¥,]/g, '')); + + let dataD = (tatemono + dataA + dataB + dataC) * (1 + zeiritsu / 100); + let dataX = Math.floor(dataD / 10000); + let dataY = Math.floor((ukeoi / 10000) * 0.9); + let dataZ = 0; + if (dataX > dataY) { + dataZ = dataY; + } else { + dataZ = dataX; + } + /* + Class063 + 0,10年 + 1,20年 + 2,30年 + 3,60年 + */ + //let class063 = $('#Results_Class063').val(); + /* + let class063; + + if (typeof myData !== 'undefined') { + class063 = myData.ClassHash.Class063; + } else { + class063 = $('#Results_Class063').val(); + } + + let kashi = 0; + + if (class063 != '3') { + kashi = 2000; + if ($('#Results_Class064').val() != 0) { + $p.set($('#Results_Class064'), 0); + console.log('Set Results_Class064 0'); + } + + } else { + if (dataZ < 2000) { + kashi = 2000; + if ($('#Results_Class064').val() != 0) { + $p.set($('#Results_Class064'), 0); + console.log('Set Results_Class064 0'); + } + } else if (dataZ <= 3000) { + kashi = 3000; + if ($('#Results_Class064').val() != 1) { + $p.set($('#Results_Class064'), 1); + console.log('Set Results_Class064 1'); + } + + } else if (dataZ <= 4000) { + kashi = 4000; + if ($('#Results_Class064').val() != 2) { + $p.set($('#Results_Class064'), 2); + console.log('Set Results_Class064 2'); + } + + } else if (dataZ <= 5000) { + kashi = 5000; + if ($('#Results_Class064').val() != 3) { + $p.set($('#Results_Class064'), 3); + console.log('Set Results_Class064 3'); + } + + } else if (dataZ > 5000) { + kashi = 0; + if ($('#Results_Class064').val() != 4) { + $p.set($('#Results_Class064'), 4); + console.log('Set Results_Class064 4'); + } + } + } + */ + kashi = 2000; + + myTable7a.setValue('B1', ukeoi, true); + myTable7a.setValue('B2', dataA, true); + myTable7a.setValue('B3', dataB, true); + myTable7a.setValue('B4', dataC, true); + myTable7a.setValue('B5', dataD, true); + myTable7a.setValue('B6', dataX, true); + myTable7a.setValue('B7', dataY, true); + myTable7a.setValue('B8', dataZ, true); + myTable7a.setValue('B9', kashi, true); + myTable7a.setValue('C9', "既定値:2000万円", true); + + if ($('#Results_DescriptionG').val() != JSON.stringify(myTable7a.getData())) { + $p.set($('#Results_DescriptionG'), JSON.stringify(myTable7a.getJson())); + console.log('Set Results_DescriptionG'); + } + + calcDiffer(); +} + +function calcDiffer() { + let ukeoi = parseFloat($('#Results_Num050').val().toString().replaceAll(/[¥,]/g, '')); //請負金額税込 + let shiharai = parseFloat($('#Results_Num040').val().toString().replaceAll(/[¥,]/g, '')); //支払金額税込 + + let diff = 0; + diff = ukeoi - shiharai; + //console.log("ukeoi : " + ukeoi); + //console.log("shiharai : " + shiharai); + //console.log("diff : " + diff); + + if (diff != 0) { + $('#Results_Num053').css({ + 'font-size': '1.3em', + 'font-weight': 'bold', + color: 'red', + }); + $('#Num053_comments').css('color', 'red'); + $('#Num053_comments').text('差異あり'); + } else { + $('#Results_Num053').css({ + 'font-size': '1em', + 'font-weight': 'normal', + color: 'black', + }); + $('#Num053_comments').css('color', 'blue'); + $('#Num053_comments').text('差異なし'); + } + + if ($('#Results_Num053').val().toString().replaceAll(/[¥,]/g, '') != diff) { + $p.set($('#Results_Num053'), diff.toLocaleString()); + console.log('Set Results_Num053'); + } + +} + +function deleteBlankRow() { + let myData2 = myTable2a.getData(); + $.each(myData2, function (index, value) { + let flag = true; + $.each(value, function (index2, value2) { + if (value2 != '') { + flag = false; + } + }); + + if (index == myData2.length - 1) flag = false; + + if (flag) { + myTable2a.deleteRow(index, 1); + } + }); + + let myData3 = myTable3a.getData(); + $.each(myData3, function (index, value) { + let flag = true; + $.each(value, function (index2, value2) { + if (value2 != '') { + flag = false; + } + }); + + if (index == myData3.length - 1) flag = false; + + if (flag) { + myTable3a.deleteRow(index, 1); + } + }); +} + +function table1CalcA() { + let myData1 = myTable1a.getData(); + //console.log(myTable1data); + + let sumA = [0, 0, 0, 0]; + sumA[0] = parseFloat(myData1[0][2].toString().replaceAll(/[¥,]/g, '')) + parseFloat(myData1[1][2].toString().replaceAll(/[¥,]/g, '')); + sumA[1] = parseFloat(myData1[2][2].toString().replaceAll(/[¥,]/g, '')) + parseFloat(myData1[3][2].toString().replaceAll(/[¥,]/g, '')); + sumA[2] = parseFloat(myData1[4][2].toString().replaceAll(/[¥,]/g, '')) + parseFloat(myData1[5][2].toString().replaceAll(/[¥,]/g, '')); + sumA[3] = parseFloat(myData1[6][2].toString().replaceAll(/[¥,]/g, '')) + parseFloat(myData1[7][2].toString().replaceAll(/[¥,]/g, '')); + + myTable1a.setValue('G1', sumA[0], true); + myTable1a.setValue('G3', sumA[1], true); + myTable1a.setValue('G5', sumA[2], true); + myTable1a.setValue('G7', sumA[3], true); + + if ($('#Results_DescriptionA').val() != JSON.stringify(myTable1a.getData())) { + $p.set($('#Results_DescriptionA'), JSON.stringify(myTable1a.getJson())); + console.log('Set Results_DescriptionA'); + } + + let shouhizei = $p.getControl('Num039').val(); + let sum1 = sumA[0] + sumA[1] + sumA[2] + sumA[3]; + let uchizei = sum1 - Math.ceil(sum1 / (1 + shouhizei / 100)); + let sum2 = sum1 - uchizei; + + if ($('#Results_Num040').val().toString().replaceAll(/[¥,]/g, '') != sum1) { + $p.set($('#Results_Num040'), sum1.toLocaleString()); + console.log('Set Results_Num040'); + } + if ($('#Results_Num041').val().toString().replaceAll(/[¥,]/g, '') != uchizei) { + $p.set($('#Results_Num041'), uchizei.toLocaleString()); + console.log('Set Results_Num041'); + } + if ($('#Results_Num042').val().toString().replaceAll(/[¥,]/g, '') != sum2) { + $p.set($('#Results_Num042'), sum2.toLocaleString()); + console.log('Set Results_Num042'); + } + + calcDiffer(); +} + +function table1CalcB() { + let myData1 = myTable1a.getData(); + let dateList = [4]; + dateList[0] = myData1[0][3].toString(); + dateList[1] = myData1[1][3].toString(); + dateList[2] = myData1[2][3].toString(); + dateList[3] = myData1[3][3].toString(); + + if (dateList[0] != '') { + myTable1a.setValue('E1', ''); + } + if (dateList[1] != '') { + myTable1a.setValue('E2', ''); + } + if (dateList[2] != '') { + myTable1a.setValue('E3', ''); + } + if (dateList[3] != '') { + myTable1a.setValue('E4', ''); + } + + if ($('#Results_DescriptionA').val() != JSON.stringify(myTable1a.getData())) { + $p.set($('#Results_DescriptionA'), JSON.stringify(myTable1a.getJson())); + console.log('Set Results_DescriptionA'); + } + + calcDiffer(); +} + +function table1CalcC() { + let myData1 = myTable1a.getData(); + let dateList = [4]; + dateList[0] = myData1[0][4].toString(); + dateList[1] = myData1[1][4].toString(); + dateList[2] = myData1[2][4].toString(); + dateList[3] = myData1[3][4].toString(); + + if (dateList[0] != '') { + myTable1a.setValue('D1', ''); + } + if (dateList[1] != '') { + myTable1a.setValue('D2', ''); + } + if (dateList[2] != '') { + myTable1a.setValue('D3', ''); + } + if (dateList[3] != '') { + myTable1a.setValue('D4', ''); + } + + if ($('#Results_DescriptionA').val() != JSON.stringify(myTable1a.getData())) { + $p.set($('#Results_DescriptionA'), JSON.stringify(myTable1a.getJson())); + console.log('Set Results_DescriptionA'); + } + + calcDiffer(); +} + +//リードタイム算定表から日付取得 +function createReadTimeTable() { + let readtime_val = $('#Results_DescriptionR').val(); + if (readtime_val != '') { + readtime_date = JSON.parse(readtime_val); + //console.log(readtime_date); + + } + +} + +function InputReadOnly() { + //console.log($('.code-readonly')); + let readOnlyList = $('.code-readonly'); + $('.code-readonly').each(function (index, value) { + //console.log(value.id); + if ($('label[for="' + value.id + '"')) { + //console.log(value.id); + $('label[for="' + value.id + '"').css('pointer-events', 'none'); + } + }); +} + +function InputWfColumn() { + + for (colnum = 124; colnum <= 128; colnum++) { + InputWfColumnReadOnly1('Class' + colnum); + InputWfColumnReadOnly1('Date' + colnum); + InputWfColumnReadOnly3('Description' + colnum); + + } + for (colnum = 130; colnum <= 139; colnum++) { + InputWfColumnReadOnly1('Class' + colnum); + InputWfColumnReadOnly1('Date' + colnum); + } + for (colnum = 150; colnum <= 158; colnum++) { + InputWfColumnReadOnly1('Class' + colnum); + InputWfColumnReadOnly1('Date' + colnum); + } + for (colnum = 169; colnum <= 170; colnum++) { + InputWfColumnReadOnly1('Class' + colnum); + InputWfColumnReadOnly1('Date' + colnum); + } + for (colnum = 195; colnum <= 198; colnum++) { + InputWfColumnReadOnly1('Class' + colnum); + InputWfColumnReadOnly1('Date' + colnum); + InputWfColumnReadOnly3('Description' + colnum); + + } + + for (colnum = 140; colnum <= 147; colnum++) { + InputWfColumnReadOnly2('Class' + colnum); + } + for (colnum = 160; colnum <= 167; colnum++) { + InputWfColumnReadOnly2('Class' + colnum); + } + +} + +//項目の読み取り専用設定1 +function InputWfColumnReadOnly1(col) { + $('#Results_' + col).prop('tabindex', '-1'); + $('#Results_' + col).next().css('display', 'none'); + $('label[for="Results_' + col + '"').css('pointer-events', 'none'); +} + +//項目の読み取り専用設定2 +function InputWfColumnReadOnly2(col) { + $('#Results_' + col).prop('tabindex', '-1'); + $('label[for="Results_' + col + '"').css('pointer-events', 'none'); +} + +//説明項目の読み取り専用設定1 +function InputWfColumnReadOnly3(col) { + $('#Results_' + col).prop('tabindex', '-1'); + $('#Results_' + col + '\\.viewer').prop('ondblclick', '-1'); + $('#Results_' + col + '\\.editor').css('display', 'none'); + //$('#Results_' + col).css('display', 'block'); + $('#Results_' + col).next().css('display', 'none'); + $('#Results_' + col).next().next().css('display', 'none'); +} + +$p.ex.readonlyColumn = function () { + //readonlyクラス Tab移動禁止 + $('.code-readonly').each(function (index, value) { + //console.log(value.id); + $('#' + value.id).attr('tabindex', -1); + $('label[for="' + value.id + '"]').css('pointer-events', 'none'); + }); + + $('.code-readonly2').each(function (index, value) { + //console.log(value.id); + $('#' + value.id).attr('tabindex', -1); + $('label[for="' + value.id + '"]').css('pointer-events', 'none'); + }); +} \ No newline at end of file diff --git a/pleasanter/develop/★MSS/★マスターシート/sites/scripts/10.実績計上.js b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/10.実績計上.js new file mode 100644 index 00000000..95585aea --- /dev/null +++ b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/10.実績計上.js @@ -0,0 +1,96 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 10.実績計上 +@name : +@siteIds : 189112 +@siteTitles : ★マスターシート +@disabled: false +*/ + +$p.events.before_set_Update = function (args) { + getMyData(); + + let status = myData.Status; + + //着工要因承認済み以上 + if (status >= 600) { + jissekiKeijo(); + return true; + } else { + return true; + } +} + +function jissekiKeijo() { + let classQ = myData.ClassHash.ClassQ + let ankenName = myData.ClassHash.ClassA.substr(4, 3) + ":" + classQ.replace(/\s+/g, ""); + let userName = userList[myData.ClassHash.ClassG].name.replace(/\s+/g, ""); + + //if (myData.DateHash.DateE != "1899-12-30T00:00:00") { + // ankenName = "[設]" + ankenName; + //} + //211729 syukyaku[myData.ClassHash.Class061].Group, + + let classHash = { + "ClassA": $p.id(), + "ClassB": myData.ClassHash.ClassA, + "ClassC": ankenName, + "ClassD": myData.ClassHash.Class061 ? syukyaku[myData.ClassHash.Class061].Group : syukyaku["211729"].Group, + "ClassE": tenpoList[myData.ClassHash.ClassF].ShopName, + "ClassF": userName, + "ClassG": myData.ClassHash.ClassN, + "ClassO": myData.ClassHash.ClassO, + } + + let dateHash = { + "DateA": myData.DateHash.DateD, //本契約日 + "DateB": myData.DateHash.DateE, //設計契約日 + "DateC": myData.DateHash.DateP, //実着工日 + "DateD": myData.DateHash.DateQ, //実完成引渡日 + } + + let numHash = { + "NumA": myData.NumHash.Num064, + "NumB": myData.NumHash.Num065, + "NumC": myData.NumHash.Num074, + "NumD": myData.NumHash.Num075, + } + + let json = { + "ApiVersion": 1.1, + "ApiKey": "6504c8a807677a3a576e10327f3c19876c55736ee45d4a845796b9e7f5e087bfd4bd0d8184863da8cf1733ca635111432ab334aea59102b06a96ee6d2c05190d", + "Keys": [ + "ClassA" + ], + "ClassHash": classHash, + "NumHash": numHash, + "DateHash": dateHash, + }; + + //console.log(json); + return upsertRecord(json); +} + + +function upsertRecord(json) { + //実績計上テーブル + let targetTable = '263191'; + + let url = 'https://' + location.hostname + '/pleasanter/api/items/' + targetTable + '/upsert'; + + $.ajax({ + "type": "post", + "async": false, + "url": url, + "contentType": "application/json", + "data": JSON.stringify(json), + "success": function (data) { + console.log(data); + return true; + }, + "error": function (data) { + console.log(data); + } + }) +} \ No newline at end of file diff --git a/pleasanter/develop/★MSS/★マスターシート/sites/scripts/100.一覧画面用スクリプト.js b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/100.一覧画面用スクリプト.js new file mode 100644 index 00000000..316cddf5 --- /dev/null +++ b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/100.一覧画面用スクリプト.js @@ -0,0 +1,814 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 100.一覧画面用スクリプト +@name : +@siteIds : 189112 +@siteTitles : ★マスターシート +@disabled: false +*/ + +let myData; +let apiKey = '6504c8a807677a3a576e10327f3c19876c55736ee45d4a845796b9e7f5e087bfd4bd0d8184863da8cf1733ca635111432ab334aea59102b06a96ee6d2c05190d'; + +//本契約ワークフローステータス一覧 +const statusArray1 = [100, 102, 101, 150, 160, 200, 300, 400, 500, 600, 700, 900]; +const statusList1 = { + 100: { + 'next': 150, + 'columnId': "", + 'flow': "", + 'status': "新規作成", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "", + 'comments': "" + }, + 102: { + 'next': 150, + 'columnId': "158", + 'flow': "", + 'status': "設計契約→本契約", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "", + 'comments': "" + }, + 101: { + 'next': 200, + 'columnId': "137", + 'flow': "", + 'status': "[本契]差戻し", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "", + 'comments': "" + }, + 150: { + 'next': 160, + 'columnId': "138", + 'flow': "", + 'status': "[本契]事前申請", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "", + 'comments': "" + }, + 160: { + 'next': 200, + 'columnId': "139", + 'flow': "", + 'status': "[本契]事前確認", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "", + 'comments': "" + }, + 200: { + 'next': 300, + 'columnId': "130", + 'flow': "", + 'status': "[本契]WF申請", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "", + 'comments': "" + }, + 300: { + 'next': 400, + 'columnId': "131", + 'flow': "", + 'status': "[本契]管理設計承認", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "107", + 'comments': "" + }, + 400: { + 'next': 500, + 'columnId': "132", + 'flow': "", + 'status': "[本契]所属長承認", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "108", + 'comments': "" + }, + 500: { + 'next': 600, + 'columnId': "133", + 'flow': "", + 'status': "[本契]着工要因承認", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "109", + 'comments': "" + }, + 600: { + 'next': 700, + 'columnId': "134", + 'flow': "", + 'status': "[本契]専務承認", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "110", + 'comments': "" + }, + 700: { + 'next': 900, + 'columnId': "135", + 'flow': "", + 'status': "[本契]総務承認", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "111", + 'comments': "" + }, + 900: { + 'next': 0, + 'columnId': "136", + 'flow': "", + 'status': "[本契]最終承認", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "112", + 'comments': "" + } +} + +//設計ワークフローステータス一覧 +const statusArray2 = [110, 111, 151, 161, 210, 310, 410, 510, 710, 910, 102] +const statusList2 = { + 110: { + 'next': 151, + 'columnId': "", + 'flow': "", + 'status': "新規作成", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "", + 'comments': "" + }, + 111: { + 'next': 210, + 'columnId': "157", + 'flow': "", + 'status': "[設契]差戻し", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "", + 'comments': "" + }, + 151: { + 'next': 161, + 'columnId': "169", + 'flow': "", + 'status': "[設契]事前申請", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "", + 'comments': "" + }, + 161: { + 'next': 210, + 'columnId': "170", + 'flow': "", + 'status': "[設契]事前確認", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "", + 'comments': "" + }, + 210: { + 'next': 310, + 'columnId': "150", + 'flow': "", + 'status': "[設契]WF申請", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "", + 'comments': "" + }, + 310: { + 'next': 410, + 'columnId': "151", + 'flow': "", + 'status': "[設契]管理設計承認", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "101", + 'comments': "" + }, + 410: { + 'next': 510, + 'columnId': "152", + 'flow': "", + 'status': "[設契]所属長承認", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "102", + 'comments': "" + }, + 510: { + 'next': 710, + 'columnId': "153", + 'flow': "", + 'status': "[設契]着工要因承認", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "103", + 'comments': "" + }, + 710: { + 'next': 910, + 'columnId': "155", + 'flow': "", + 'status': "[設契]総務承認", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "104", + 'comments': "" + }, + 910: { + 'next': 102, + 'columnId': "156", + 'flow': "", + 'status': "[設契]最終承認", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "105", + 'comments': "" + }, + 102: { + 'next': 150, + 'columnId': "158", + 'flow': "", + 'status': "設計契約→本契約", + 'tanto_user': "", + 'shonin_user': "", + 'shonin_date': "", + 'checkId': "", + 'comments': "" + }, +} + +let statusArray = []; +let statusList = {}; +let flowTitle = 'ワークフロー'; +let userList = $('#userList').length > 0 ? JSON.parse($('#userList').val()) : {}; + +const sumi = '★★★'; +const next = '▶▷▶'; + +let pageLoading = 0; +window.addEventListener('load', function () { + if (pageLoading == 0) { + console.log('load Event'); + onLoad(); + } +}); + +$p.events.on_grid_load = function () { + //処理内容 + if (pageLoading == 0) { + console.log('on Editor Load'); + onLoad(); + } +} + +function onLoad() { + pageLoading = 1; + //getUserList(0); + createStatusButtons(); + pageLoading = 0; +} + +//window.addEventListener("scroll", createStatusButtons(), false); + +window.addEventListener("scroll", function () { + //console.log('scroll events'); + if (pageLoading == 0) { + createStatusButtons() + } +}); + +function createStatusButtons() { + + let recordIdCol = 0; + let statusCol = 0; + let titleCol = 0; + $("#Grid>thead>tr>th").each(function (index, value) { + if (value.getAttribute('data-name') == 'ResultId') { + recordIdCol = index; + } + if (value.getAttribute('data-name') == 'Status') { + statusCol = index; + } + if (value.getAttribute('data-name') == 'Title') { + titleCol = index; + } + }); + + $("#Grid>tbody>tr").each(function (index, value) { + //console.log(value.cells[2]); + let recordId = value.cells[recordIdCol].innerText; + let divId = 'status_' + recordId + let divId2 = 'oboegaki_' + recordId + if (recordId) { + if (document.getElementById(divId) == null) { + let link = document.createElement('a'); + link.innerHTML = ">WFステータス"; + link.href = "javascript:void(0);"; + link.classList.add('statusLink') + link.setAttribute('onclick', '$p.ex.createArrayData("' + recordId + '")'); + + let div = document.createElement('div'); + div.id = divId; + div.classList.add('statusLinkDiv'); + div.append(link); + + value.cells[statusCol].append(div); + + + let link2 = document.createElement('a'); + link2.innerHTML = ">>覚書"; + link2.href = "javascript:void(0);"; + link2.classList.add('statusLink') + link2.setAttribute('onclick', 'openOboegaki("' + recordId + '")'); + + let div2 = document.createElement('div'); + div2.id = divId2; + div2.classList.add('statusLinkDiv'); + div2.append(link2); + + //console.log(value.cells[titleCol]); + value.cells[titleCol].append(div2); + + } + } + }); +} + +$p.ex.createArrayData = function (recordId) { + getMyData(recordId); + + let status = myData.Status; + + //担当者配列生成 + const tanto_userList = { + 100: {//[本契]新規作成 + tanto_user: myData.ClassHash.ClassG ? userList[myData.ClassHash.ClassG].name : '' + }, + 101: {//[本契]差戻し + tanto_user: '*' + }, + 102: {//設計契約→本契約 + tanto_user: myData.ClassHash.ClassG ? userList[myData.ClassHash.ClassG].name : '' + }, + 110: {//[設契]新規作成 + tanto_user: myData.ClassHash.ClassG ? userList[myData.ClassHash.ClassG].name : '' + }, + 111: {//[設契]差戻し + tanto_user: '*' + }, + 150: {//[本契]事前申請 + tanto_user: myData.ClassHash.ClassG ? userList[myData.ClassHash.ClassG].name : '' + }, + 160: {//[本契]事前確認 + //tanto_user: '管理設計\n所属長\n専務\n総務\n担当役員\n▼▽▼\n' + userList[myData.ClassHash.ClassG].name + tanto_user: '管理設計\n所属長\n専務\n総務\n▼▽▼\n' + userList[myData.ClassHash.ClassG].name + }, + 151: {//[設契]事前申請 + tanto_user: myData.ClassHash.ClassG ? userList[myData.ClassHash.ClassG].name : '' + }, + 161: {//[設契]事前確認 + //tanto_user: '管理設計\n所属長\n総務\n担当役員\n▼▽▼\n' + userList[myData.ClassHash.ClassG].name + tanto_user: '管理設計\n所属長\n総務\n▼▽▼\n' + userList[myData.ClassHash.ClassG].name + }, + 200: { + tanto_user: myData.ClassHash.ClassG ? userList[myData.ClassHash.ClassG].name : '' + }, + 210: { + tanto_user: myData.ClassHash.ClassG ? userList[myData.ClassHash.ClassG].name : '' + }, + 300: {//管理設計承認 + tanto_user: myData.ClassHash.ClassL ? userList[myData.ClassHash.ClassL].name : '' + }, + 310: { + tanto_user: myData.ClassHash.ClassL ? userList[myData.ClassHash.ClassL].name : '' + }, + 400: {//所属長承認 + tanto_user: myData.ClassHash.ClassY ? userList[myData.ClassHash.ClassY].name : '' + }, + 410: { + tanto_user: myData.ClassHash.ClassY ? userList[myData.ClassHash.ClassY].name : '' + }, + 500: {//着工要因承認 + tanto_user: '入谷 優子' + }, + 510: { + tanto_user: '入谷 優子' + }, + //専務承認 + 600: { + tanto_user: '川名 真治' + }, + 610: { + tanto_user: '川名 真治' + }, + //専務承認 + 600: { + tanto_user: '川名 真治' + }, + 610: { + tanto_user: '川名 真治' + }, + //専務承認 + 700: { + tanto_user: '豊蔵 恵美\n長谷川 望\n秦野 勇輝\n露﨑 直樹' + }, + 710: { + tanto_user: '豊蔵 恵美\n長谷川 望\n秦野 勇輝\n露﨑 直樹' + }, + //最終承認 + 900: { + //tanto_user: myData.ClassHash.Class122 ? userList[myData.ClassHash.Class122].name : '' + tanto_user: myData.ClassHash.ClassY ? userList[myData.ClassHash.ClassY].name : '' + }, + 910: { + //tanto_user: myData.ClassHash.Class122 ? userList[myData.ClassHash.Class122].name : '' + tanto_user: myData.ClassHash.ClassY ? userList[myData.ClassHash.ClassY].name : '' + }, + } + + //設計契約か本契約かによって配列を切替え + if (statusArray1.includes(status)) { + flowTitle = '本契約ワークフロー'; + //ステータス配列切り替え + statusArray = statusArray1.concat(); + //statusList = statusList1; + statusList = JSON.parse(JSON.stringify(statusList1)); + } else if (statusArray2.includes(status)) { + flowTitle = '設計契約ワークフロー'; + //ステータス配列切り替え + statusArray = statusArray2.concat(); + //statusList = statusList2; + statusList = JSON.parse(JSON.stringify(statusList2)); + } + + let nextStatus = ''; + let jizen = false; + $.each(statusArray, function (index, value) { + //各ステータスの入力値の取得 + let columnId = statusList[value].columnId; + let shonin_user = columnId != '' ? myData.ClassHash["Class" + columnId] != '' ? userList[myData.ClassHash["Class" + columnId]].name : '' : ''; + let shonin_date = columnId != '' ? myData.DateHash["Date" + columnId] != '1899-12-30T00:00:00' ? new Date(myData.DateHash["Date" + columnId]) : '' : ''; + let comments = columnId != '' ? myData.ClassHash["Class" + (parseFloat(columnId) + 10)] : ''; + let checkId = statusList[value].checkId; + let checked = checkId != '' ? myData.CheckHash["Check" + checkId] : true; + + + statusList[value].tanto_user = tanto_userList[value].tanto_user; + + if (value == '100' || value == '110') {//申請作成 + //新規作成 + statusList[value].flow = sumi; + statusList[value].shonin_user = userList[myData.Owner].name; + statusList[value].shonin_date = new Date(myData.CreatedTime); + statusList[value].comments = '新規作成'; + } else if (value == '102') { + //設計契約→本契約移行 + if (shonin_date != '') { + statusList[value].flow = sumi; + statusList[value].shonin_user = shonin_user; + statusList[value].shonin_date = shonin_date; + statusList[value].comments = '本契約移行済み'; + } + } else if (value == '101' || value == '111') { + //差戻し + if (shonin_date != '') { + statusList[value].flow = sumi; + statusList[value].shonin_user = shonin_user; + statusList[value].shonin_date = shonin_date; + let tmp = comments.split(':'); + statusList[value].comments = tmp[tmp.length - 1]; + } + } else if (value == '150' || value == '151') { + //事前申請 + if (shonin_date != '') { + statusList[value].flow = sumi; + statusList[value].shonin_user = shonin_user; + statusList[value].shonin_date = shonin_date; + statusList[value].comments = '事前申請済み'; + jizen = true; + } + } else if (value == '160' || value == '161') { + //事前確認 + if (value == '160' && jizen) { + statusList[value].shonin_user = ''; + let endFlag = true; + + if (myData.CheckHash.Check124) { + statusList[value].shonin_user += myData.ClassHash["Class124"] != '' ? userList[myData.ClassHash["Class124"]].name + '\n' : ''; + } else { + statusList[value].shonin_user += '※未※\n'; + endFlag = false; + } + + if (myData.CheckHash.Check125) { + statusList[value].shonin_user += myData.ClassHash["Class125"] != '' ? userList[myData.ClassHash["Class125"]].name + '\n' : ''; + } else { + statusList[value].shonin_user += '※未※\n'; + endFlag = false; + } + + if (myData.CheckHash.Check126) { + statusList[value].shonin_user += myData.ClassHash["Class126"] != '' ? userList[myData.ClassHash["Class126"]].name + '\n' : ''; + } else { + statusList[value].shonin_user += '※未※\n'; + endFlag = false; + } + + if (myData.CheckHash.Check127) { + statusList[value].shonin_user += myData.ClassHash["Class127"] != '' ? userList[myData.ClassHash["Class127"]].name + '\n' : ''; + } else { + statusList[value].shonin_user += '※未※\n'; + endFlag = false; + } + + /* + if (myData.CheckHash.Check128) { + statusList[value].shonin_user += myData.ClassHash["Class128"] != '' ? userList[myData.ClassHash["Class128"]].name + '\n' : ''; + } else { + statusList[value].shonin_user += '※未※\n'; + endFlag = false; + } + */ + + if (endFlag) { + if (myData.CheckHash.Check131, myData.CheckHash.Check132, myData.CheckHash.Check133, myData.CheckHash.Check134, myData.CheckHash.Check135) { + statusList[value].flow = sumi; + statusList[value].shonin_user += '▼▽▼\n'; + statusList[value].shonin_user += shonin_user; + statusList[value].shonin_date = shonin_date; + statusList[value].comments = '事前確認済み'; + } else { + statusList[value].shonin_user += '▼▽▼\n'; + statusList[value].shonin_user += '※未※\n'; + statusList[value].comments = '担当営業\n未確認'; + statusList[value].next = value; + } + } else { + statusList[value].shonin_user += '▼▽▼\n'; + statusList[value].shonin_user += '※未※\n'; + statusList[value].comments = '各担当者の\n事前確認\n未完了'; + statusList[value].next = value; + } + + } else if (value == '161' && jizen) { + statusList[value].shonin_user = ''; + let endFlag = true; + + if (myData.CheckHash.Check195) { + statusList[value].shonin_user += myData.ClassHash["Class195"] != '' ? userList[myData.ClassHash["Class195"]].name + '\n' : ''; + } else { + statusList[value].shonin_user += '※未※\n'; + endFlag = false; + } + + if (myData.CheckHash.Check196) { + statusList[value].shonin_user += myData.ClassHash["Class196"] != '' ? userList[myData.ClassHash["Class196"]].name + '\n' : ''; + } else { + statusList[value].shonin_user += '※未※\n'; + endFlag = false; + } + + if (myData.CheckHash.Check197) { + statusList[value].shonin_user += myData.ClassHash["Class197"] != '' ? userList[myData.ClassHash["Class197"]].name + '\n' : ''; + } else { + statusList[value].shonin_user += '※未※\n'; + endFlag = false; + } + + /* + if (myData.CheckHash.Check198) { + statusList[value].shonin_user += myData.ClassHash["Class198"] != '' ? userList[myData.ClassHash["Class198"]].name + '\n' : ''; + } else { + statusList[value].shonin_user += '※未※\n'; + endFlag = false; + } + */ + + if (endFlag) { + if (myData.CheckHash.Check141, myData.CheckHash.Check142, myData.CheckHash.Check143, myData.CheckHash.Check144) { + statusList[value].flow = sumi; + statusList[value].shonin_user += '▼▽▼\n'; + statusList[value].shonin_user += shonin_user; + statusList[value].shonin_date = shonin_date; + statusList[value].comments = '事前確認済み'; + } else { + statusList[value].shonin_user += '▼▽▼\n'; + statusList[value].shonin_user += '※未※\n'; + statusList[value].comments = '担当営業\n未確認'; + statusList[value].next = value; + } + } else { + statusList[value].shonin_user += '▼▽▼\n'; + statusList[value].shonin_user += '※未※\n'; + statusList[value].comments = '各担当者の\n事前確認\n未完了'; + statusList[value].next = value; + } + } + } else { + //200以降 + if (shonin_date != '') { + if (status == '101' || status == '111') { + if (checkId) { + if (checked) { + statusList[value].flow = sumi; + statusList[value].shonin_user = shonin_user; + statusList[value].shonin_date = shonin_date; + statusList[value].comments = comments; + } + } + } else { + if (value > status) { + if (checked) { + statusList[value].flow = sumi; + statusList[value].shonin_user = shonin_user; + statusList[value].shonin_date = shonin_date; + statusList[value].comments = comments; + } + } else { + statusList[value].flow = sumi; + statusList[value].shonin_user = shonin_user; + statusList[value].shonin_date = shonin_date; + statusList[value].comments = comments; + } + } + } + } + + }); + + nextStatus = statusList[status].next; + if (nextStatus != '') { + statusList[nextStatus].flow = next; + } + + + $p.ex.createFlowTable(); +} + +$p.ex.createFlowTable = function () { + const req = new XMLHttpRequest(); + let url = '/pleasanter/myScripts/flowTable.html'; + let flowArray = []; + + $.each(statusArray, function (index, value) { + //console.log(statusList[value]); + let dateStr = ''; + let timeStr = ''; + if (statusList[value].shonin_date != '') { + dateStr = statusList[value].shonin_date.getFullYear() + '年' + + (statusList[value].shonin_date.getMonth() + 1).toString().padStart(2, '0') + '月' + + statusList[value].shonin_date.getDate().toString().padStart(2, '0') + '日'; + timeStr = statusList[value].shonin_date.getHours().toString().padStart(2, '0') + '時' + + statusList[value].shonin_date.getMinutes().toString().padStart(2, '0') + '分'; + } + + let data = { + "flow": statusList[value].flow, + "status": statusList[value].status, + "tanto_user": statusList[value].tanto_user, + "shonin_user": statusList[value].shonin_user, + "shonin_date": dateStr, + "shonin_time": timeStr, + "comments": statusList[value].comments + }; + flowArray.push(data); + }) + + //console.log(flowArray); + let sekkeiKeiyaku; + if (myData.ClassHash.ClassN == "0") { + sekkeiKeiyaku = '無し'; + } else if (myData.ClassHash.ClassN == "1") { + sekkeiKeiyaku = '有り'; + } + + req.onreadystatechange = function () { + if (req.readyState == 4) { + if (req.status == 200) { + let templateHTML = req.response; + let template = Hogan.compile(templateHTML); + + let outputHtml = template.render({ + "keiyaku_cd": myData.ClassHash.ClassA, + "kouji_mei": myData.ClassHash.ClassQ, + "sekkei_keiyaku": sekkeiKeiyaku, + "eigyo_tanto_user": userList[myData.ClassHash.ClassG].name, + "flow_title": flowTitle, + "flowArray": flowArray + }); + + let newWin = window.open('', 'マスターシートワークフロー', 'left=10,top=10,width=900,height=900,menubar=no,toolbar=no,location=no,status=no,resizable=yes'); + newWin.document.open(); + newWin.document.write(outputHtml); + newWin.document.close(); + } + } + }; + req.open('GET', url); + req.setRequestHeader('Pragma', 'no-cache'); + req.setRequestHeader('Cache-Control', 'no-cache'); + req.setRequestHeader('If-Modified-Since', 'Thu, 01 Jun 1970 00:00:00 GMT'); + req.send(); +} + +function getMyData(recordId) { + let thisId = recordId; + + $p.apiGet({ + 'id': thisId, + 'data': { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + }, + 'async': false, + 'done': function (data) { + //console.log('マスターシートデータを取得しました'); + myData = data.Response.Data[0]; + //console.log(myData); + }, + 'fail': function (data) { + console.log(data); + } + + }); +} + +function getUserList(offset) { + let json = { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + 'Offset': offset, + 'View': { + 'ApiGetMailAddresses': true, + }, + }; + let url = 'https://' + location.hostname + '/pleasanter/api/users/get'; + + $.ajax({ + type: 'post', + url: url, + contentType: 'application/json', + data: JSON.stringify(json), + success: function (data) { + //console.log(data); + $.each(data.Response.Data, function (index, value) { + let name = value.Name; + let deptId = value.DeptId; + let userId = value.UserId; + let mailAddress = value.MailAddresses[0]; + + userList[userId] = { + name: name, + userId: userId, + deptId: deptId, + mailAddress: mailAddress, + }; + }); + //console.log(data.Response.Data.length); + if ((offset + data.Response.Data.length) < data.Response.TotalCount) { + let offset2 = offset + 200; + getUserList(offset2); + } + }, + error: function (data) { + console.log(data); + }, + }); +} diff --git a/pleasanter/develop/★MSS/★マスターシート/sites/scripts/101.一覧画面覚書スクリプト.js b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/101.一覧画面覚書スクリプト.js new file mode 100644 index 00000000..383acd91 --- /dev/null +++ b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/101.一覧画面覚書スクリプト.js @@ -0,0 +1,397 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 101.一覧画面覚書スクリプト +@name : +@siteIds : 189112 +@siteTitles : ★マスターシート +@disabled: false +*/ + +function openOboegaki(recordId) { + getMyData(recordId); + + if (myData) { + console.log(myData); + oboegaki(); + } +} + +function oboegaki() { + let attract_List = { + '211729': 'その他', + '211728': '自社 資料請求', + '211727': '自社 来場予約', + '211726': '本部 資料請求', + '211725': '本部 来場予約', + '211724': 'IS誘致', + '211723': 'その他紹介', + '211722': '業者紹介', + '211721': 'ユーザー紹介', + '211720': 'おうちの相談窓口', + '211719': 'スーモ', + '211718': 'モデルハウス新規来場' + } + + let shokai_kubun_List = { + '0': 'ユーザー', + '1': 'スーモカウンター', + '2': '社内紹介', + '3': '賢匠会', + '4': '不動産', + '5': '業者', + '99': 'その他', + '1000': '紹介無し' + } + + let warranty_etc_List = { + '0': 'なし', + '1': 'ハウスジーメン', + '2': 'ハウスジーメン、地盤保証', + '3': 'ハウスジーメン、地盤保証、ベストバリューホーム', + '4': 'ハウスジーメン、地盤保証、ベストバリューホーム、省令準耐火' + } + + let warranty_years_List = { + '0': '10年', + '1': '20年', + '2': '30年', + '3': '60年', + } + + let defect_insurance_limit_List = { + '0': '2000万円', + '1': '3000万円', + '2': '4000万円', + '3': '5000万円', + '4': '0万円' + } + + let home_seinou_List = { + '4': '設計住宅性能評価', + '3': '長期優良住宅', + '2': '低炭素住宅', + '1': '建設住宅性能評価', + '0': '無し' + } + + + const req = new XMLHttpRequest(); + let url = '/pleasanter/myScripts/oboegaki.html'; + + + req.onreadystatechange = function () { + if (req.readyState == 4) { + if (req.status == 200) { + + let oboegaki_title = myData.ClassHash.Class200; + oboegaki_title = oboegaki_title + '■覚書'; + + let templateHTML = req.response; + let template = Hogan.compile(templateHTML); + //データ作成 + let data001 = JSON.parse(myData.DescriptionHash.Description001); //契約会社 + let data002 = JSON.parse(myData.DescriptionHash.Description002); //施工会社 + let data003 = JSON.parse(myData.DescriptionHash.Description003); //契約営業所 + let data004 = { + "Title": "未選択", + } + if (myData.DescriptionHash.Description004 != '') { + data004 = JSON.parse(myData.DescriptionHash.Description004); //ブランド + } + + //let shiharai = myTable1a.getJson(); + let shiharai = JSON.parse(myData.DescriptionHash.DescriptionA); + //console.log(shiharai); + + let koujimei = ''; + if (myData.ClassHash.ClassU != '') { + koujimei = myData.ClassHash.ClassU + ' 様邸 ' + myData.ClassHash.Class042 + '工事'; + } else { + koujimei = myData.ClassHash.ClassQ + ' 様邸 ' + myData.ClassHash.Class042 + '工事'; + } + + + let outputHtml = template.render({ + oboegaki_title: oboegaki_title, + //------------- + create_date: myData.DateHash.DateA != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.DateA)) : ' ', + creator: myData.ClassHash.ClassG ? userList[myData.ClassHash.ClassG].name : ' ', + + keiyaku_code: myData.ClassHash.ClassA, + kokyaku_code: myData.ClassHash.ClassB, + keiyaku_brand: data004.Title, + + keiyaku_date: myData.DateHash.DateD != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.DateD)) : ' ', + keiyaku_month: myData.ClassHash.ClassO, + + //集客事由 + attract: myData.ClassHash.Class061 ? attract_List[myData.ClassHash.Class061] : ' ', + + keiyaku_company: data001.ClassHash.ClassA, + sekou_company: data002.ClassHash.ClassA, + contract_office: data003.Title, + furikomisaki: myData.ClassHash.ClassX, + + eigyo1: myData.ClassHash.ClassG ? userList[myData.ClassHash.ClassG].name : ' ', + eigyo2: myData.ClassHash.ClassH ? userList[myData.ClassHash.ClassH].name : ' ', + leader: myData.ClassHash.ClassY ? userList[myData.ClassHash.ClassY].name : ' ', + eigyo_sekkei: myData.ClassHash.ClassI ? userList[myData.ClassHash.ClassI].name : ' ', + tanto_kantoku: myData.ClassHash.ClassJ ? userList[myData.ClassHash.ClassJ].name : ' ', + tanto_ic: myData.ClassHash.ClassK ? userList[myData.ClassHash.ClassK].name : ' ', + kanri_sekkei: myData.ClassHash.ClassL ? userList[myData.ClassHash.ClassL].name : ' ', + area_tanto: myData.ClassHash.Class123 ? userList[myData.ClassHash.Class123].name : ' ', + yakuin: myData.ClassHash.Class122 ? userList[myData.ClassHash.Class122].name : ' ', + cost_checker: myData.ClassHash.ClassZ ? userList[myData.ClassHash.ClassZ].name : ' ', + + sekkei_umu: myData.ClassHash.ClassN == '1' ? '有り' : '無し', + sekkei_keiyaku_date: myData.DateHash.DateE != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.DateE)) : ' ', + + //------------- + client_name: myData.ClassHash.ClassS, + client_name_kana: myData.ClassHash.ClassT, + telephone_number: myData.ClassHash.Class026, + cellphone_number: myData.ClassHash.Class027, + date_of_birth: myData.DateHash.Date001 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date001)) : ' ', + age: myData.NumHash.Num001, + work_office: myData.ClassHash.Class025, + length_of_service: myData.NumHash.Num005 + '年', + current_address_yubin: myData.ClassHash.Class006, + current_address_address: myData.ClassHash.Class007, + building_site_yubin: myData.ClassHash.Class028, + building_site_address: myData.ClassHash.Class031, + + //------------- + rw_lvl: myData.ClassHash.Class036, + brand_type: myData.ClassHash.Class035, + + internal_specifications: myData.ClassHash.Class038, + external_specifications: myData.ClassHash.Class037, + module: myData.ClassHash.Class039, + fire_protection: myData.ClassHash.Class040, + building_type: myData.ClassHash.Class043, + household_type: myData.ClassHash.Class041, + + kouji_name: koujimei, + + //------------- + _1f_floor_area: myData.NumHash.Num011 + '㎡', + _2f_floor_area: myData.NumHash.Num012 + '㎡', + _3f_floor_area: myData.NumHash.Num013 + '㎡', + basement_floor_area: myData.NumHash.Num014 + '㎡', + ph_floor_area: myData.NumHash.Num019 + '㎡', + total_floor_area: myData.NumHash.Num015 + '㎡', + total_floor_area_tsubo: myData.NumHash.Num016 + '坪', + building_area: myData.NumHash.Num017 + '㎡', + building_area_tsubo: myData.NumHash.Num018 + '坪', + + //------------- + s_keiyaku_money_15p: '\\' + myData.NumHash.Num071.toLocaleString(), + s_arari_money_15p: '\\' + myData.NumHash.Num072.toLocaleString(), + s_arari_par_15p: myData.NumHash.Num073 + ' % ', + s_keiyaku_money: '\\' + myData.NumHash.Num074.toLocaleString(), + s_arari_money: '\\' + myData.NumHash.Num075.toLocaleString(), + s_arari_par: myData.NumHash.Num076 + ' % ', + keiyaku_money_15p: '\\' + myData.NumHash.Num061.toLocaleString(), + arari_money_15p: '\\' + myData.NumHash.Num062.toLocaleString(), + arari_par_15p: myData.NumHash.Num063 + ' % ', + keiyaku_money: '\\' + myData.NumHash.Num064.toLocaleString(), + arari_money: '\\' + myData.NumHash.Num065.toLocaleString(), + arari_par: myData.NumHash.Num066 + ' % ', + keiyaku_zeikomi: '\\' + myData.NumHash.Num050.toLocaleString(), + tax: myData.NumHash.Num039 + ' % ', + + keiyaku_notax: '\\' + Math.ceil(parseFloat(myData.NumHash.Num050.toString().replaceAll(/[¥,]/g, '')) / (1 + (parseFloat(myData.NumHash.Num039.toString().replaceAll(/[¥,]/g, ''))) / 100)).toLocaleString(), + + //------------- + contract_money_a1: shiharai[0][1], + contract_money_a2: '\\' + shiharai[0][2].toLocaleString(), + contract_money_a3: shiharai[0][3] == '' ? shiharai[0][4] != '' ? dateToStr(new Date(shiharai[0][4])) : '' : shiharai[0][3], + contract_money_a4: shiharai[0][5], + contrbct_money_b1: shiharai[1][1], + contrbct_money_b2: '\\' + shiharai[1][2].toLocaleString(), + contrbct_money_b3: shiharai[1][3] == '' ? shiharai[1][4] != '' ? dateToStr(new Date(shiharai[1][4])) : '' : shiharai[1][3], + contrbct_money_b4: shiharai[1][5], + construction_start_fee_a1: shiharai[2][1], + construction_start_fee_a2: '\\' + shiharai[2][2].toLocaleString(), + construction_start_fee_a3: shiharai[2][3] == '' ? shiharai[2][4] != '' ? dateToStr(new Date(shiharai[2][4])) : '' : shiharai[2][3], + construction_start_fee_a4: shiharai[2][5], + construction_stbrt_fee_b1: shiharai[3][1], + construction_stbrt_fee_b2: '\\' + shiharai[3][2].toLocaleString(), + construction_stbrt_fee_b3: shiharai[3][3] == '' ? shiharai[3][4] != '' ? dateToStr(new Date(shiharai[3][4])) : '' : shiharai[3][3], + construction_stbrt_fee_b4: shiharai[3][5], + intermediate_money_a1: shiharai[4][1], + intermediate_money_a2: '\\' + shiharai[4][2].toLocaleString(), + intermediate_money_a3: shiharai[4][3] == '' ? shiharai[4][4] != '' ? dateToStr(new Date(shiharai[4][4])) : '' : shiharai[4][3], + intermediate_money_a4: shiharai[4][5], + intermedibte_money_b1: shiharai[5][1], + intermedibte_money_b2: '\\' + shiharai[5][2].toLocaleString(), + intermedibte_money_b3: shiharai[5][3] == '' ? shiharai[5][4] != '' ? dateToStr(new Date(shiharai[5][4])) : '' : shiharai[5][3], + intermedibte_money_b4: shiharai[5][5], + final_money_a1: shiharai[6][1], + final_money_a2: '\\' + shiharai[6][2].toLocaleString(), + final_money_a3: shiharai[6][3] == '' ? shiharai[6][4] != '' ? dateToStr(new Date(shiharai[6][4])) : '' : shiharai[6][3], + final_money_a4: shiharai[6][5], + final_money_b1: shiharai[7][1], + final_money_b2: '\\' + shiharai[7][2].toLocaleString(), + final_money_b3: shiharai[7][3] == '' ? shiharai[7][4] != '' ? dateToStr(new Date(shiharai[7][4])) : '' : shiharai[7][3], + final_money_b4: shiharai[7][5], + + //------------- + sagaku: '\\' + myData.NumHash.Num053.toLocaleString(), + + reasons: myData.DescriptionHash.Description061, + nebiki_reasons: myData.DescriptionHash.Description062, + others: myData.DescriptionHash.Description063, + + warranty_etc: myData.ClassHash.Class062 ? warranty_etc_List[myData.ClassHash.Class062] : ' ', + warranty_years: myData.ClassHash.Class063 ? warranty_years_List[myData.ClassHash.Class063] : ' ', + defect_insurance_limit: myData.ClassHash.Class064 ? defect_insurance_limit_List[myData.ClassHash.Class064] : ' ', + + //------------- + credit_status: myData.ClassHash.Class065, + family_structure: myData.ClassHash.Class066, + promise_with_the_owner: myData.ClassHash.Class067, + owner: myData.ClassHash.Class068, + ground_grain: myData.ClassHash.Class070, + relationship: myData.ClassHash.Class069, + + boundary_resistance: myData.ClassHash.Class071 == '0' ? '無し' : myData.ClassHash.Class071 == '1' ? '有り' : '一部無し', + + intermediary: myData.ClassHash.Class072, + land_balance_date: myData.ClassHash.Class073, + farmland_conversion: myData.ClassHash.Class074 == '1' ? '有り' : '無し', + + other_notes: myData.ClassHash.Class075, + + //------------- + scheduled_construction_start_date1: myData.DateHash.DateH != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.DateH)) : ' ', + scheduled_completion_date1: myData.DateHash.DateL != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.DateL)) : ' ', + scheduled_completion_date2: myData.DateHash.DateJ != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.DateJ)) : ' ', + scheduled_construction_start_date2: myData.DateHash.DateG != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.DateG)) : ' ', + drawing_confirmed1: myData.DateHash.Date061 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date061)) : ' ', + drawing_confirmed2: myData.DateHash.Date010 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date010)) : ' ', + specification_meeting1: myData.DateHash.Date062 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date062)) : ' ', + specification_meeting2: myData.DateHash.Date011 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date011)) : ' ', + approved_drawing1: myData.DateHash.Date063 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date063)) : ' ', + approved_drawing2: myData.DateHash.Date012 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date012)) : ' ', + ground_investigation1: myData.DateHash.Date064 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date064)) : ' ', + ground_investigation2: myData.DateHash.Date013 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date013)) : ' ', + funding_approval: myData.DateHash.Date065 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date065)) : ' ', + groundbreaking_ceremony: myData.DateHash.Date066 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date066)) : ' ', + + //------------- + jizen_date1: myData.DateHash.Date067 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date067)) : ' ', + jizen_date2: myData.DateHash.Date068 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date068)) : ' ', + jizen_date1_s: myData.DateHash.Date014 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date014)) : ' ', + jizen_date2_s: myData.DateHash.Date015 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date015)) : ' ', + jizen_comments: myData.ClassHash.Class077, + + kakunin_date1: myData.DateHash.Date069 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date069)) : ' ', + kakunin_date2: myData.DateHash.Date070 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date070)) : ' ', + kakunin_date1_s: myData.DateHash.Date016 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date016)) : ' ', + kakunin_date2_s: myData.DateHash.Date017 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date017)) : ' ', + kakunin_bikou: myData.ClassHash.Class078, + + sonota_date1: myData.DateHash.Date071 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date071)) : ' ', + sonota_date2: myData.DateHash.Date072 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date072)) : ' ', + sonota_bikou: myData.ClassHash.Class079, + + + //------------- + deep_foundation: myData.ClassHash.Class082 == '1' ? '有り' : '無し', + kiso_high: myData.ClassHash.Class083, + kiso_low: myData.ClassHash.Class084, + + inspection_agency: myData.ClassHash.Class086, + home_seinou: myData.ClassHash.Class087 ? home_seinou_List[myData.ClassHash.Class087] : ' ', + flat_zaikei: myData.ClassHash.Class088 == '1' ? '有り' : '無し', + + kyusui_umu: myData.ClassHash.Class090 == '1' ? '有り' : '無し', + kyusui_date: myData.DateHash.Date090 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date090)) : ' ', + haisui_umu: myData.ClassHash.Class091 == '1' ? '有り' : '無し', + haisui_date: myData.DateHash.Date091 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date091)) : ' ', + joukasou: myData.ClassHash.Class092, + hojokin_umu: myData.ClassHash.Class093 == '1' ? '有り' : '無し', + hojokin_tehai: myData.ClassHash.Class094, + gasu_umu: myData.ClassHash.Class095 == '1' ? '有り' : '無し', + gasu_date: myData.DateHash.Date095 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date095)) : ' ', + propan_umu: myData.ClassHash.Class096 == '1' ? '有り' : '無し', + propan_date: myData.DateHash.Date096 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date096)) : ' ', + + //------------- + kaitai_umu: myData.ClassHash.Class098 == '1' ? '契約内' : '契約外', + kaitai_gyousya: myData.ClassHash.Class099, + kaitai_start_date: myData.DateHash.Date098 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date098)) : ' ', + kaitai_end_date: myData.DateHash.Date099 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date099)) : ' ', + + zousei_umu: myData.ClassHash.Class100 == '1' ? '契約内' : '契約外', + zousei_gyousya: myData.ClassHash.Class101, + zousei_start_date: myData.DateHash.Date100 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date100)) : ' ', + zousei_end_date: myData.DateHash.Date101 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date101)) : ' ', + + + gaikou_umu: myData.ClassHash.Class102 == '1' ? '契約内' : '契約外', + gaikou_gyousya: myData.ClassHash.Class104 == 'その他' ? myData.ClassHash.Class103 : myData.ClassHash.Class104, + + gaikou_start_date: myData.DateHash.Date102 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date102)) : ' ', + gaikou_end_date: myData.DateHash.Date103 != '1899-12-30T00:00:00' ? dateToStr(new Date(myData.DateHash.Date103)) : ' ', + + gaikou_gaisan: myData.ClassHash.Class105 == '1' ? '確定' : '概算', + gaikou_yosan: '\\' + myData.NumHash.Num105.toLocaleString(), + requests: myData.DescriptionHash.Description104, + + //------------- + setback: myData.ClassHash.Class107 == '1' ? '有り' : '無し', + ryokuka: myData.ClassHash.Class108 == '1' ? '有り' : '無し', + road_slope: myData.ClassHash.Class109 == '1' ? '有り' : '無し', + sho_unpan: myData.ClassHash.Class110 == '1' ? '有り' : '無し', + + hikaekabe: myData.DescriptionHash.Description105, + hikitsugi: myData.DescriptionHash.Description110, + + //------------- + _2nd_person_name: myData.ClassHash.Class009 + ' ' + myData.ClassHash.Class010, + _2nd_name_zip_code: myData.ClassHash.Class014, + _2nd_name_address: myData.ClassHash.Class015, + + _3rd_person_name: myData.ClassHash.Class017 + ' ' + myData.ClassHash.Class018, + _3rd_person_zip_code: myData.ClassHash.Class022, + _3rd_person_address: myData.ClassHash.Class023, + + shokai_kubun: myData.ClassHash.Class114 ? shokai_kubun_List[myData.ClassHash.Class114] : ' ', + shokai_name: myData.ClassHash.Class115, + shokai_fee: '\\' + myData.NumHash.Num114.toLocaleString(), + + //------------- + //------------- + //------------- + //------------- + }); + + let newWin = window.open('', '覚書', 'left=10,top=10,width=700,height=900,menubar=no,toolbar=no,location=no,status=no,resizable=yes,scrollbars=yes'); + newWin.document.open(); + newWin.document.write(outputHtml); + newWin.document.close(); + } + } + }; + + req.open('GET', url); + req.setRequestHeader('Pragma', 'no-cache'); + req.setRequestHeader('Cache-Control', 'no-cache'); + req.setRequestHeader('If-Modified-Since', 'Thu, 01 Jun 1970 00:00:00 GMT'); + req.send(); +} + +function dateToStr(orgdate) { + let year = orgdate.getFullYear(); + let month = orgdate.getMonth() + 1; + let date = orgdate.getDate(); + month = month.toString().padStart(2, '0'); + date = date.toString().padStart(2, '0'); + + let str = year + '/' + month + '/' + date; + + return str; +} \ No newline at end of file diff --git a/pleasanter/develop/★MSS/★マスターシート/sites/scripts/11.事前申請処理.js b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/11.事前申請処理.js new file mode 100644 index 00000000..b70ce86b --- /dev/null +++ b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/11.事前申請処理.js @@ -0,0 +1,370 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 11.事前申請処理 +@name : +@siteIds : 189112 +@siteTitles : ★マスターシート +@disabled: false +*/ + +//事前申請確認ウインドウ +//事前申請外部メッセージ、チェックボックスウインドウ + +//管理設計:ClassL +//所属長:ClassY +//WF専務GR:['423'] //川名 真治 +//WF総務GR:['463', '459', '655', '691'] //豊蔵 恵美, 長谷川 望, 秦野 勇輝, 露﨑 直樹 +//担当役員:Class122 +//Class124 [本前]管理設計_確認者 +//Class125 [本前]所属長_確認者 +//Class126 [本前]専務_確認者 +//Class127 [本前]総務_確認者 +//Class128 [本前]役員_確認者 + +let jizenKakuninMode;//データを保管するカラム番号 +let childWindow; + +function jizenKakunin() { + let userId = $p.userId(); + let tantoEigyo = myData.ClassHash.ClassG; + let kanriSekkei = myData.ClassHash.ClassL; + let shozokucho = myData.ClassHash.ClassY; + let senmu = '423';//川名専務のUserId + let soumu = ['463', '459', '655', '691', '460']; + //let yakuin = myData.ClassHash.Class122; + jizenKakuninMode = 0; + + let status = myData.Status; + + switch (status) { + case 150: //本契約 事前申請 + if (userId == kanriSekkei && !(myData.CheckHash['Check124'])) { + //管理設計 + jizenKakuninMode = 124; + } else if (userId == shozokucho && !(myData.CheckHash['Check125'])) { + //所属長確認 + jizenKakuninMode = 125; + } else if (userId == senmu && !(myData.CheckHash['Check126'])) { + //専務確認 + jizenKakuninMode = 126; + } else if (soumu.includes(userId.toString()) && !(myData.CheckHash['Check127'])) { + //総務 + jizenKakuninMode = 127; + } + //else if (userId == yakuin && !(myData.CheckHash['Check128'])) { + // //役員 + // jizenKakuninMode = 128; + //} + break; + case 151: //設計契約 事前申請 + if (userId == kanriSekkei && !(myData.CheckHash['Check195'])) { + //管理設計 + jizenKakuninMode = 195; + } else if (userId == shozokucho && !(myData.CheckHash['Check196'])) { + //所属長確認 + jizenKakuninMode = 196; + } else if (soumu.includes(userId.toString()) && !(myData.CheckHash['Check197'])) { + //総務 + jizenKakuninMode = 197; + } + //else if (userId == yakuin && !(myData.CheckHash['Check198'])) { + // //役員 + // jizenKakuninMode = 198; + //} + break; + case 160: //本契約 事前確認 + //担当営業最終確認 + if (userId == tantoEigyo) { + //最終確認モード + jizenKakuninMode = 139; + } + break; + case 161://設計契約 事前確認 + //担当営業最終確認 + if (userId == tantoEigyo) { + //最終確認モード + jizenKakuninMode = 170; + } + break; + } + + console.log(jizenKakuninMode) + + //すでに完了チェックを入れている場合はボタン無し + //事前確認ウインドウ ボタン表示判定 + if (jizenKakuninMode != 0) { + if (status == 150 || status == 151) { + if (!(myData.CheckHash['Check' + jizenKakuninMode])) { + createJizenKakuninButton1(); + } + } else if (status == 160) { + createJizenKakuninButton2(); + } else if (status == 161) { + createJizenKakuninButton3(); + } + + } +} + +function createJizenKakuninButton1() { + let div = document.createElement('div'); + div.id = 'jizenWindow'; + $('#Guide').after(div); + + let button = document.createElement('button'); + button.type = 'button'; + button.id = 'jizenWindowButton'; + button.innerHTML = '[各部署]事前確認'; + button.setAttribute('onclick', 'jizenKakuninWindowOpen1() '); + button.style.margin = '5px'; + button.style.fontSize = '150%'; + button.style.fontWeight = 'bold'; + button.style.color = '#FF0000'; + div.append(button); + $('#jizenWindowButton').button({ + icon: 'ui-icon-star' + }); +} + +function createJizenKakuninButton2() { + let div = document.createElement('div'); + div.id = 'jizenWindow'; + $('#Guide').after(div); + + let button = document.createElement('button'); + button.type = 'button'; + button.id = 'jizenWindowButton'; + button.innerHTML = '[本契]事前確認'; + button.setAttribute('onclick', 'jizenKakuninWindowOpen2() '); + button.style.margin = '5px'; + button.style.fontSize = '150%'; + button.style.fontWeight = 'bold'; + button.style.color = '#FF0000'; + div.append(button); + $('#jizenWindowButton').button({ + icon: 'ui-icon-star' + }); +} + +function createJizenKakuninButton3() { + let div = document.createElement('div'); + div.id = 'jizenWindow'; + $('#Guide').after(div); + + let button = document.createElement('button'); + button.type = 'button'; + button.id = 'jizenWindowButton'; + button.innerHTML = '[設契]事前確認'; + button.setAttribute('onclick', 'jizenKakuninWindowOpen3() '); + button.style.margin = '5px'; + button.style.fontSize = '150%'; + button.style.fontWeight = 'bold'; + button.style.color = '#FF0000'; + div.append(button); + $('#jizenWindowButton').button({ + icon: 'ui-icon-star' + }); +} + + +function jizenKakuninWindowOpen1() { + let url = '/pleasanter/myScripts/beforeComment.html'; + childWindow = window.open(url, '[各部署]事前確認シート', 'left=10,top=10,width=800,height=600,menubar=no,toolbar=no,location=no,status=no,resizable=yes'); +} + +function jizenKakuninWindowOpen2() { + let url = '/pleasanter/myScripts/beforeCheck1.html'; + childWindow = window.open(url, '[本契約]事前確認 担当営業チェックシート', 'left=10,top=10,width=800,height=800,menubar=no,toolbar=no,location=no,status=no,resizable=yes'); +} +function jizenKakuninWindowOpen3() { + let url = '/pleasanter/myScripts/beforeCheck2.html'; + childWindow = window.open(url, '[設計契約]事前確認 担当営業チェックシート', 'left=10,top=10,width=800,height=800,menubar=no,toolbar=no,location=no,status=no,resizable=yes'); +} + + +function receiveMessageFromChild(message, checkbox) { + console.log('親ウィンドウ:子ウィンドウからメッセージを受信しました!'); + //console.log('メッセージ内容:', message); + //console.log('チェックボックス', checkbox); + console.log(jizenKakuninMode) + + let now = new Date(); + let nowStr = now.getFullYear() + '/' + + (now.getMonth() + 1).toString().padStart(2, '0') + '/' + + now.getDate().toString().padStart(2, '0') + ' ' + + now.getHours().toString().padStart(2, '0') + ':' + + now.getMinutes().toString().padStart(2, '0') + ':' + + now.getSeconds().toString().padStart(2, '0'); + + + //確認完了チェックが入っていたら日付を保存する + if (checkbox) { + $p.set($('#Results_Date' + jizenKakuninMode), nowStr);//完了日 + $p.set($('#Results_Check' + jizenKakuninMode), 'checked');//完了チェックボックス + } else { + $p.set($('#Results_Date' + jizenKakuninMode), ''); + $p.set($('#Results_Check' + jizenKakuninMode), ''); + } + + $p.set($('#Results_Class' + jizenKakuninMode), $p.userId()); //確認者 + $p.set($('#Results_Description' + jizenKakuninMode), message); //コメント + + childWindow.close(); //子ウインドウを閉じる + + //更新処理 + //$('#UpdateCommand').click(); + //ステータスチェック + let status = myData.Status; + + //タブ移動 + switch (status) { + case 150: //本契約 事前申請 + $('a[href="#FieldSetTab17"]').click(); + break; + case 151: //設計契約 事前申請 + $('a[href="#FieldSetTab16"]').click(); + break; + case 160: //本契約 事前確認 + //担当営業最終確認 + $('a[href="#FieldSetTab17"]').click(); + break; + case 161://設計契約 事前確認 + //担当営業最終確認 + $('a[href="#FieldSetTab16"]').click(); + break; + } + + window.alert('チェックとコメントを保存するため、最後に必ず『更新』ボタンを押してください'); +} + +//事前確認ウインドウに入力途中のメッセージを表示 +function getMessageFromParent() { + let message = $('#Results_Description' + jizenKakuninMode).val(); + return message; +} + + +function getjizenKakuninModeFromParent() { + return jizenKakuninMode; +} +//事前確認ウインドウに入力途中のメッセージを表示 +function getChekboxFromParent() { + let checkbox = $('#Results_Check' + jizenKakuninMode).prop("checked"); + //console.log('CheckBox' + jizenKakuninMode + ' is ' + checkbox); + return checkbox; +} + +function getCommentsDataFromParent(idList) { + let ret = {} + + idList.forEach(function (id) { + let checkBox = $('#Results_Check' + id).prop("checked"); + ret[id] = {}; + + if (checkBox) { + //承認者 + ret[id]['shonin_user'] = $('#Results_Class' + id).val() == '' ? '' : userList[$('#Results_Class' + id).val()].name; + + //承認日 + if ($('#Results_Date' + id).val() != '') { + let date = new Date($('#Results_Date' + id).val()); + dateStr = date.getFullYear() + '年' + + (date.getMonth() + 1).toString().padStart(2, '0') + '月' + + date.getDate().toString().padStart(2, '0') + '日'; + timeStr = date.getHours().toString().padStart(2, '0') + '時' + + date.getMinutes().toString().padStart(2, '0') + '分'; + ret[id]['shonin_date'] = dateStr + '
' + timeStr; + } else { + ret[id]['shonin_date'] = ''; + } + + //コメント + ret[id]['comments'] = '
' + $('#Results_Description' + id).val() + '
'; + + } else { + ret[id]['shonin_user'] = ''; + ret[id]['shonin_date'] = ''; + ret[id]['comments'] = ''; + } + }); + + //console.log(ret); + return ret; +} + +//チェック状態を取得して子ウインドウに反映 +function getCheckDataFromParent(checkList) { + let ret = {}; + + checkList.forEach(function (id) { + let check = $('#Results_Check' + id).prop("checked"); + ret[id] = check; + }); + + return ret; +} + +//子ウインドウでチェックボックスを操作したら、メインウインドウのチェックボックスが連動 +function setCheckboxDataFromChild(id, flag) { + $('#Results_Check' + id).prop("checked"); + if (flag) { + $p.set($('#Results_Check' + id), 'checked');//完了チェックボックス オン + } else { + $p.set($('#Results_Check' + id), '');//完了チェックボックス オフ + } +} + +function closeJizenKakuninWindow(checkList) { + let flag = true; + + //現在時刻取得 + let now = new Date(); + let nowStr = now.getFullYear() + '/' + + (now.getMonth() + 1).toString().padStart(2, '0') + '/' + + now.getDate().toString().padStart(2, '0') + ' ' + + now.getHours().toString().padStart(2, '0') + ':' + + now.getMinutes().toString().padStart(2, '0') + ':' + + now.getSeconds().toString().padStart(2, '0'); + + + checkList.forEach(function (id) { + let check = $('#Results_Check' + id).prop("checked"); + if (!check) flag = false; //ひとつでもチェックがないと更新無し + }); + + //担当営業がすべてチェックを入れたら完了処理 + if (flag) { + $p.set($('#Results_Date' + jizenKakuninMode), nowStr);//完了日 + $p.set($('#Results_Class' + jizenKakuninMode), $p.userId()); //確認者 + } + + childWindow.close(); //子ウインドウを閉じる + + //更新処理 + //$('#UpdateCommand').click(); + + //ステータスチェック + let status = myData.Status; + + //タブ移動 + switch (status) { + case 150: //本契約 事前申請 + $('a[href="#FieldSetTab17"]').click(); + break; + case 151: //設計契約 事前申請 + $('a[href="#FieldSetTab16"]').click(); + break; + case 160: //本契約 事前確認 + //担当営業最終確認 + $('a[href="#FieldSetTab17"]').click(); + break; + case 161://設計契約 事前確認 + //担当営業最終確認 + $('a[href="#FieldSetTab16"]').click(); + break; + } + + window.alert('チェックとコメントを保存するため、最後に必ず『更新』ボタンを押してください'); + +} \ No newline at end of file diff --git a/pleasanter/develop/★MSS/★マスターシート/sites/scripts/13.確認申請関連資料格納状況確認処理.js b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/13.確認申請関連資料格納状況確認処理.js new file mode 100644 index 00000000..b4e6b2aa --- /dev/null +++ b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/13.確認申請関連資料格納状況確認処理.js @@ -0,0 +1,149 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 13.確認申請関連資料格納状況確認処理 +@name : +@siteIds : 189112 +@siteTitles : ★マスターシート +@disabled: false +*/ + +/* +営業作成敷地調査報告書 Results_Attachments081 +営業取得資料⼀式 Results_Attachments084 +道路関係 Results_Attachments086 +上下⽔道関係 Results_Attachments087 +災害マップ Results_Attachments096 +申請地資料 Results_Attachments094 +住宅地図 Results_Attachments098 +現況写真 Results_Attachments099 +*/ + +/* +お客様データファイルの該当項目のファイルの格納状況調査する +格納されているファイルの一覧をテーブル化してMSS編集画面に表示する +すべての項目に1つ以上のファイルが格納されていない場合、申請失敗させる + +SectionFields85Container +*/ + + +function getNo9_Files() { + let dataFileId = $("#Results_Class194").val(); + let attachFiles; + + let attachList = [ + "Attachments081", + "Attachments084", + "Attachments086", + "Attachments087", + "Attachments096", + "Attachments094", + "Attachments098", + "Attachments099" + ]; + + let attachListName = { + "Attachments081": { Name: "営業作成敷地調査報告書", Files: [], Guid: [] }, + "Attachments084": { Name: "営業取得資料⼀式", Files: [], Guid: [] }, + "Attachments086": { Name: "道路関係", Files: [], Guid: [] }, + "Attachments087": { Name: "上下⽔道関係", Files: [], Guid: [] }, + "Attachments096": { Name: "災害マップ", Files: [], Guid: [] }, + "Attachments094": { Name: "申請地資料", Files: [], Guid: [] }, + "Attachments098": { Name: "住宅地図", Files: [], Guid: [] }, + "Attachments099": { Name: "現況写真", Files: [], Guid: [] } + }; + + + //お客様データファイルの取得 + if (dataFileId != "" && dataFileId != "212512") { + + $p.apiGet({ + 'id': dataFileId, + 'data': { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + }, + //'async': false, + 'done': function (data) { + attachFiles = data.Response.Data[0]; + //console.log(attachFiles); + if (data.Response.TotalCount >= 1) { + attachList.forEach(function (attachName) { + //console.log(attachFiles.AttachmentsHash[attachName]); + attachFiles.AttachmentsHash[attachName].forEach((file) => { + attachListName[attachName].Files.push(file.Name); + attachListName[attachName].Guid.push(file.Guid); + }); + }); + } + //お客様データファイルが該当データのファイル名一式取得 + //console.log(attachListName); + + $("#fileListTable").remove(); + + //保管数チェック + let checkFlag = 1; + + //格納HTML作成 + let table = document.createElement("table"); + table.classList.add("fileListTable"); + table.id = "fileListTable"; + attachList.forEach(function (attachName) { + let tr = document.createElement("tr"); + let td1 = document.createElement("td"); + td1.classList.add("fileListTable_td1") + td1.innerHTML = attachListName[attachName].Name; + + let td2 = document.createElement("td"); + //let files = attachListName[attachName].Files.join("
"); + + if (attachListName[attachName].Files.length > 0) { + for (i = 0; i < attachListName[attachName].Files.length; i++) { + let fileName = attachListName[attachName].Files[i]; + let guid = attachListName[attachName].Guid[i]; + + let show = document.createElement("a"); + let span = document.createElement("span"); + show.href = "/pleasanter/binaries/" + guid + "/show"; + show.target = "_blank" + span.classList = "ui-icon ui-icon-circle-zoomin"; + + show.append(span); + td2.append(show); + + let link = document.createElement("a"); + link.innerHTML = fileName; + link.href = "/pleasanter/binaries/" + guid + "/download"; + + td2.append(link); + + let br = document.createElement("br"); + td2.append(br); + } + } else { + //1つでもファイル無しのフォルダがあったら0設定 + checkFlag = 0; + } + + td2.classList.add("fileListTable_td2") + //td2.innerHTML = files; + + tr.append(td1); + tr.append(td2); + table.append(tr); + + $p.set($("#Results_Class119"), checkFlag); + }); + + //console.log(table); + $("#SectionFields85").append(table); + + + }, + 'fail': function (data) { + console.log(data); + } + }); + } +} \ No newline at end of file diff --git a/pleasanter/develop/★MSS/★マスターシート/sites/scripts/2.マスターシート帳票.js b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/2.マスターシート帳票.js new file mode 100644 index 00000000..2e73dbb0 --- /dev/null +++ b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/2.マスターシート帳票.js @@ -0,0 +1,808 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 2.マスターシート帳票 +@name : +@siteIds : 189112 +@siteTitles : ★マスターシート +@disabled: false +*/ + +let myData; +let arariData; + +function getTemplateRecord(templateName) { + getMyData(); + getArariData(); + + //現在時刻 + let now = new Date(); + let years = now.getFullYear(); + let monthes = (now.getMonth() + 1).toString().padStart(2, '0'); + let today = now.getDate().toString().padStart(2, '0'); + let youbi = now.getDay(); + let hours = now.getHours(); + let mins = now.getMinutes(); + let secs = now.getSeconds(); + + let keiyakuCd = myData.ClassHash.ClassA; //myData.ClassHash.ClassA; + let customerName = myData.ClassHash.ClassS; //myData.ClassHash.ClassS; + let guid = templateFiles[templateName]; + + let fileName = keiyakuCd + '_' + customerName + '■' + templateName + '■' + years + monthes + today + '-' + hours + mins + secs + '.xlsx'; + + if (templateName === '設計パートナー契約書') { + let err = ''; + if (myData.ClassHash.ClassN == 0) { + err = err + '基本情報の設計契約を「あり」に指定してください\n'; + } + if (parseFloat(myData.NumHash.Num038) <= 0) { + err = err + '設計契約金を入力してください\n'; + } + if (myData.DateHash.Date038 == "1899-12-30T00:00:00") { + err = err + '設計契約金の支払日を入力してください\n'; + } + if (err != '') { + err = err + '上記の箇所を修正し、もう一度帳票出力ボタンを押してください'; + alert(err); + } else { + createReport(guid, fileName, templateName); + } + } else if (templateName === '粗利益確認書') { + let err = ''; + if ($('#Results_Class190').val() == '') { + err = err + '粗利益確認書レコードがありません\n'; + } + + if (err != '') { + //err = err + '上記の箇所を修正し、もう一度帳票出力ボタンを押してください'; + alert(err); + } else { + createReport(guid, fileName, templateName); + } + + } else { + createReport(guid, fileName, templateName); + } +} + +function createReport(guid, fileName, templateName) { + return customizeReport(guid, templateName) + .then(function (blob) { + if (window.navigator && window.navigator.msSaveOrOpenBlob) { + window.navigator.msSaveOrOpenBlob(blob, fileName); + } else { + var url = window.URL.createObjectURL(blob); + var a = document.createElement('a'); + document.body.appendChild(a); + a.href = url; + a.download = fileName; + a.click(); + window.URL.revokeObjectURL(url); + document.body.removeChild(a); + } + }) + .catch(function (err) { + alert(err.message || err); + throw err; + }); +} + +//帳票にデータを書き込み +function customizeReport(guid, templateName) { + return getWorkbook(guid).then(function (workbook) { + let data001 = JSON.parse(myData.DescriptionHash.Description001); //契約会社 + let data002 = JSON.parse(myData.DescriptionHash.Description002); //施工会社 + let data003 = JSON.parse(myData.DescriptionHash.Description003); //契約営業所 + let data004 = { + "Title": "未選択", + } + if (myData.DescriptionHash.Description004 != '') { + data004 = JSON.parse(myData.DescriptionHash.Description004); //ブランド + } + + let data005 = { + "ClassHash": { + "ClassB": "" + } + } + if (myData.DescriptionHash.Description005 != '') { + data005 = JSON.parse(myData.DescriptionHash.Description005); //シリーズ + } + + let dataA = JSON.parse(myData.DescriptionHash.DescriptionA); //支払テーブル + let dataF = JSON.parse(myData.DescriptionHash.DescriptionF); //見積総計 + + //帳票ごとに書き込む処理を分ける + //共通変数 + let customerName = myData.ClassHash.ClassS + ' 様'; + let koujimei1 = myData.ClassHash.ClassQ; + let koujimei2 = myData.ClassHash.ClassU; + let shubetsu = myData.ClassHash.Class042; + + let koujimei = koujimei1 + ' 様邸' + shubetsu + '工事'; + if (koujimei2 != '') { + koujimei = koujimei2 + ' 様邸' + shubetsu + '工事'; + } + + //if (keiyakuDate) { + // keiyakuDateStr = keiyakuDate.getFullYear() + '年' + (keiyakuDate.getMonth() + 1) + '月' + keiyakuDate.getDate() + '日'; + //} + + let keiyakuDateStr = ''; + if (myData.DateHash.DateD != "1899-12-30T00:00:00") { + let keiyakuDate = new Date(myData.DateHash.DateD); + keiyakuDateStr = keiyakuDate.getFullYear() + '年' + (keiyakuDate.getMonth() + 1) + '月' + keiyakuDate.getDate() + '日'; + } + + let SkeiyakuDateStr = ''; + if (myData.DateHash.DateE != "1899-12-30T00:00:00") { + let SkeiyakuDate = new Date(myData.DateHash.DateE); + SkeiyakuDateStr = SkeiyakuDate.getFullYear() + '年' + (SkeiyakuDate.getMonth() + 1) + '月' + SkeiyakuDate.getDate() + '日'; + } + + //担当 + let eigyo1 = ''; + if (myData.ClassHash.ClassG) { + eigyo1 = userList[myData.ClassHash.ClassG].name; + } + let eigyo2 = ''; + if (myData.ClassHash.ClassH) { + eigyo2 = userList[myData.ClassHash.ClassH].name; + } + + let eigyo12 = ''; + if (eigyo1 != '') { + if (eigyo2 != '') { + eigyo12 = eigyo1 + '/' + eigyo2; + } else { + eigyo12 = eigyo1; + } + } else { + if (eigyo2 != '') { + eigyo12 = eigyo2; + } + } + + let sekkei1 = ''; + if (myData.ClassHash.ClassI) { + sekkei1 = userList[myData.ClassHash.ClassI].name; + } + let sekkei2 = ''; + if (myData.ClassHash.ClassL) { + sekkei2 = userList[myData.ClassHash.ClassL].name; + } + let kantoku = ''; + if (myData.ClassHash.ClassJ) { + kantoku = userList[myData.ClassHash.ClassJ].name; + } + let IC = ''; + if (myData.ClassHash.ClassK) { + IC = userList[myData.ClassHash.ClassK].name; + } + + switch (templateName) { + //---------------------------------------------------------------------------------------------------- + case '画像掲載承諾書': + workbook.sheet('param').cell('C1').value(myData.ClassHash.ClassA); + + break; + //---------------------------------------------------------------------------------------------------- + case 'A建物工事見積書': + workbook.sheet('param').cell('C2').value(customerName); + workbook.sheet('param').cell('C3').value(koujimei); + workbook.sheet('param').cell('C40').value(keiyakuDateStr); + + (myData.NumHash.Num045) ? workbook.sheet('param').cell('C4').value(parseFloat(myData.NumHash.Num045.toString().replaceAll(/[¥,]/g, ''))) : 0; + + let dataB = JSON.parse(myData.DescriptionHash.DescriptionB); + $.each(dataB, function (index, value) { + let i = index + 5; + if (index < 15) { + workbook.sheet('param').cell('C' + i).value(value[0]); + workbook.sheet('param').cell('E' + i).value(value[1]); + if (value[2].toString().length > 0) { + workbook.sheet('param').cell('G' + i).value(value[2] == "" ? 0 : parseFloat(value[2].toString().replaceAll(/[¥,]/g, ''))); + } + } + }); + + break; + //---------------------------------------------------------------------------------------------------- + case 'B建物工事見積書': + workbook.sheet('param').cell('C2').value(customerName); + workbook.sheet('param').cell('C3').value(koujimei); + workbook.sheet('param').cell('C40').value(keiyakuDateStr); + + (myData.NumHash.Num046) ? workbook.sheet('param').cell('C4').value(parseFloat(myData.NumHash.Num046.toString().replaceAll(/[¥,]/g, ''))) : 0; + let dataC = JSON.parse(myData.DescriptionHash.DescriptionC); + $.each(dataC, function (index, value) { + let i = index + 5; + if (index < 20) { + workbook.sheet('param').cell('C' + i).value(value[0]); + workbook.sheet('param').cell('E' + i).value(value[1]); + workbook.sheet('param').cell('G' + i).value(value[2]); + if (value[3].toString().length > 0) { + workbook.sheet('param').cell('I' + i).value(value[3] == "" ? 0 : parseFloat(value[3].toString().replaceAll(/[¥,]/g, ''))); + workbook.sheet('param').cell('K' + i).value(value[4] == "" ? "" : value[4]); + workbook.sheet('param').cell('M' + i).value(value[5] == "" ? 0 : parseFloat(value[5].toString().replaceAll(/[¥,]/g, ''))); + } + } + }); + + break; + //---------------------------------------------------------------------------------------------------- + case 'C付帯工事見積書': + workbook.sheet('param').cell('C2').value(customerName); + workbook.sheet('param').cell('C3').value(koujimei); + workbook.sheet('param').cell('C40').value(keiyakuDateStr); + + (myData.NumHash.Num047) ? workbook.sheet('param').cell('C4').value(parseFloat(myData.NumHash.Num047.toString().replaceAll(/[¥,]/g, ''))) : 0; + let dataD = JSON.parse(myData.DescriptionHash.DescriptionD); + $.each(dataD, function (index, value) { + let i = index + 5; + workbook.sheet('param').cell('C' + i).value(value[1]); + workbook.sheet('param').cell('E' + i).value(value[2] == "" ? 0 : parseFloat(value[2].toString().replaceAll(/[¥,]/g, ''))); + workbook.sheet('param').cell('G' + i).value(value[3]); + }); + + break; + //---------------------------------------------------------------------------------------------------- + //1.設計パートナー契約書 + case '設計パートナー契約書': + workbook.sheet('param').cell('C2').value(customerName); + workbook.sheet('param').cell('C3').value(myData.ClassHash.ClassA); + workbook.sheet('param').cell('C4').value(myData.ClassHash.ClassB); + workbook.sheet('param').cell('C5').value(eigyo12); + + workbook.sheet('param').cell('C6').value(data004.Title); + workbook.sheet('param').cell('C7').value(sekkei1); + workbook.sheet('param').cell('C8').value(koujimei); + workbook.sheet('param').cell('C9').value(myData.ClassHash.Class034 + '(' + myData.ClassHash.Class036 + ')'); + workbook.sheet('param').cell('C10').value(data005.ClassHash.ClassB); + + (myData.NumHash.Num011) ? workbook.sheet('param').cell('C11').value(parseFloat(myData.NumHash.Num011.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num012) ? workbook.sheet('param').cell('C12').value(parseFloat(myData.NumHash.Num012.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num013) ? workbook.sheet('param').cell('C13').value(parseFloat(myData.NumHash.Num013.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num014) ? workbook.sheet('param').cell('C14').value(parseFloat(myData.NumHash.Num014.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num015) ? workbook.sheet('param').cell('C15').value(parseFloat(myData.NumHash.Num015.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num016) ? workbook.sheet('param').cell('C16').value(parseFloat(myData.NumHash.Num016.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num019) ? workbook.sheet('param').cell('C27').value(parseFloat(myData.NumHash.Num019.toString().replaceAll(/[¥,]/g, ''))) : 0; + + workbook.sheet('param').cell('C17').value(myData.ClassHash.Class031); + (myData.NumHash.Num038) ? workbook.sheet('param').cell('C18').value(parseFloat(myData.NumHash.Num038.toString().replaceAll(/[¥,]/g, ''))) : 0; + + let date038 = ''; + if (myData.DateHash.Date038 != "1899-12-30T00:00:00") { + let date038a = new Date(myData.DateHash.Date038); + date038 = date038a.getFullYear() + '年' + (date038a.getMonth() + 1) + '月' + date038a.getDate() + '日'; + } + workbook.sheet('param').cell('C19').value(date038); + + workbook.sheet('param').cell('C20').value(data001.ClassHash.ClassB); + workbook.sheet('param').cell('C21').value(data001.ClassHash.ClassC); + workbook.sheet('param').cell('C22').value(data001.ClassHash.ClassA); + workbook.sheet('param').cell('C23').value(data001.ClassHash.ClassG); + workbook.sheet('param').cell('C24').value(myData.ClassHash.ClassX); + workbook.sheet('param').cell('C25').value(data001.ClassHash.ClassA); + + break; + //---------------------------------------------------------------------------------------------------- + //2.建築工事請負契約書 + case '建築工事請負契約書': + workbook.sheet('param').cell('C2').value(customerName); + workbook.sheet('param').cell('C3').value(myData.ClassHash.ClassA); + workbook.sheet('param').cell('C4').value(myData.ClassHash.ClassB); + workbook.sheet('param').cell('C5').value(data003.Title); + //担当営業 + workbook.sheet('param').cell('C6').value(eigyo12); + workbook.sheet('param').cell('C7').value(koujimei); + workbook.sheet('param').cell('C8').value(myData.ClassHash.Class034 + '(' + myData.ClassHash.Class036 + ')'); + workbook.sheet('param').cell('C9').value(data004.Title + ' ' + data005.ClassHash.ClassB); + + (myData.NumHash.Num011) ? workbook.sheet('param').cell('C10').value(parseFloat(myData.NumHash.Num011.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num012) ? workbook.sheet('param').cell('C11').value(parseFloat(myData.NumHash.Num012.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num013) ? workbook.sheet('param').cell('C12').value(parseFloat(myData.NumHash.Num013.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num014) ? workbook.sheet('param').cell('C13').value(parseFloat(myData.NumHash.Num014.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num015) ? workbook.sheet('param').cell('C14').value(parseFloat(myData.NumHash.Num015.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num016) ? workbook.sheet('param').cell('C15').value(parseFloat(myData.NumHash.Num016.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num019) ? workbook.sheet('param').cell('C27').value(parseFloat(myData.NumHash.Num019.toString().replaceAll(/[¥,]/g, ''))) : 0; + + workbook.sheet('param').cell('C16').value(myData.ClassHash.Class031); + + let dateH = ''; //着工予定日 + if (myData.DateHash.DateH != "1899-12-30T00:00:00") { + let dateH0 = new Date(myData.DateHash.DateH); + dateH = dateH0.getFullYear() + '年' + (dateH0.getMonth() + 1) + '月' + dateH0.getDate() + '日'; + } + let dateL = ''; //完成予定日 + if (myData.DateHash.DateL != "1899-12-30T00:00:00") { + let dateL0 = new Date(myData.DateHash.DateL); + dateL = dateL0.getFullYear() + '年' + (dateL0.getMonth() + 1) + '月' + dateL0.getDate() + '日'; + } + let dateM = ''; //追加変更期限 + if (myData.DateHash.DateM != "1899-12-30T00:00:00") { + let dateM0 = new Date(myData.DateHash.DateM); + dateM = dateM0.getFullYear() + '年' + (dateM0.getMonth() + 1) + '月' + dateM0.getDate() + '日'; + } + workbook.sheet('param').cell('C17').value(dateH); + workbook.sheet('param').cell('C18').value(dateL); + workbook.sheet('param').cell('C19').value(dateM); + workbook.sheet('param').cell('C20').value(dataF[8][1]); + workbook.sheet('param').cell('C21').value(dataF[7][1]); + workbook.sheet('param').cell('C22').value(myData.DescriptionHash.DescriptionM); + workbook.sheet('param').cell('C23').value(data001.ClassHash.ClassA); + + $.each(dataA, function (index, value) { + let i = index + 31; + console.log(value); + workbook.sheet('param').cell('C' + i).value(value[1]); + workbook.sheet('param').cell('F' + i).value(parseFloat(value[2].toString().replaceAll(/[¥,]/g, ''))); + workbook.sheet('param').cell('I' + i).value(value[3]); + if (value[4] != '') { + let value4 = new Date(value[4]); + value[4] = value4.getFullYear() + '年' + (value4.getMonth() + 1) + '月' + value4.getDate() + '日'; + } + if (value[5] == 0) { + value[5] = ''; + } + workbook.sheet('param').cell('K' + i).value(value[4]); + workbook.sheet('param').cell('M' + i).value(value[5]); + }); + + break; + //---------------------------------------------------------------------------------------------------- + //3.請負代金内訳書 + case '請負代金内訳書': + workbook.sheet('param').cell('C2').value(customerName); + workbook.sheet('param').cell('C3').value(myData.ClassHash.Class031); + workbook.sheet('param').cell('C4').value(myData.ClassHash.Class007); + workbook.sheet('param').cell('C5').value(myData.ClassHash.Class026); + + workbook.sheet('param').cell('C7').value(dataF[0][1]); + workbook.sheet('param').cell('C8').value(dataF[1][1]); + workbook.sheet('param').cell('C9').value(dataF[2][1]); + workbook.sheet('param').cell('C10').value(dataF[3][1]); + + workbook.sheet('param').cell('C12').value(data001.ClassHash.ClassA); + workbook.sheet('param').cell('C13').value(data004.Title); + workbook.sheet('param').cell('C14').value(data003.ClassHash.ClassB); + workbook.sheet('param').cell('C15').value(data003.ClassHash.ClassC); + workbook.sheet('param').cell('C16').value(data003.ClassHash.ClassD); + workbook.sheet('param').cell('C17').value(data003.ClassHash.ClassE); + workbook.sheet('param').cell('C18').value(data003.ClassHash.ClassF); + workbook.sheet('param').cell('C19').value(eigyo1); + + break; + //---------------------------------------------------------------------------------------------------- + //4.御提案書 + case '御提案書': + workbook.sheet('param').cell('C2').value(customerName); + workbook.sheet('param').cell('C3').value(myData.ClassHash.Class031); + workbook.sheet('param').cell('C4').value(myData.ClassHash.Class007); + workbook.sheet('param').cell('C5').value(myData.ClassHash.Class026); + + workbook.sheet('param').cell('C6').value(data001.ClassHash.ClassA); + workbook.sheet('param').cell('C7').value(data004.Title); + workbook.sheet('param').cell('C8').value(data003.ClassHash.ClassB); + workbook.sheet('param').cell('C9').value(data003.ClassHash.ClassC); + workbook.sheet('param').cell('C10').value(data003.ClassHash.ClassD); + workbook.sheet('param').cell('C11').value(data003.ClassHash.ClassE); + workbook.sheet('param').cell('C12').value(data003.ClassHash.ClassF); + workbook.sheet('param').cell('C13').value(eigyo1); + + workbook.sheet('param').cell('C14').value(dataF[4][1]); + workbook.sheet('param').cell('C15').value(dataF[6][1]); + workbook.sheet('param').cell('C16').value(myData.ClassHash.Class034 + '(' + myData.ClassHash.Class036 + ')'); + workbook.sheet('param').cell('C17').value(data005.ClassHash.ClassB); + + workbook.sheet('param').cell('C18').value(myData.ClassHash.Class037); + workbook.sheet('param').cell('C19').value(myData.ClassHash.Class038); + + (myData.NumHash.Num017) ? workbook.sheet('param').cell('C20').value(parseFloat(myData.NumHash.Num017.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num018) ? workbook.sheet('param').cell('C21').value(parseFloat(myData.NumHash.Num018.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num011) ? workbook.sheet('param').cell('C22').value(parseFloat(myData.NumHash.Num011.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num012) ? workbook.sheet('param').cell('C23').value(parseFloat(myData.NumHash.Num012.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num013) ? workbook.sheet('param').cell('C24').value(parseFloat(myData.NumHash.Num013.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num014) ? workbook.sheet('param').cell('C25').value(parseFloat(myData.NumHash.Num014.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num015) ? workbook.sheet('param').cell('C26').value(parseFloat(myData.NumHash.Num015.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num016) ? workbook.sheet('param').cell('C27').value(parseFloat(myData.NumHash.Num016.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num019) ? workbook.sheet('param').cell('C28').value(parseFloat(myData.NumHash.Num019.toString().replaceAll(/[¥,]/g, ''))) : 0; + + workbook.sheet('param').cell('C29').value(dataF[0][1]); + workbook.sheet('param').cell('C30').value(dataF[1][1]); + workbook.sheet('param').cell('C31').value(dataF[2][1]); + workbook.sheet('param').cell('C32').value(dataF[3][1]); + workbook.sheet('param').cell('C33').value(dataF[9][1]); + + workbook.sheet('param').cell('C38').value(dataF[13][1]); + workbook.sheet('param').cell('C39').value(dataF[14][1]); + workbook.sheet('param').cell('C58').value(myData.DescriptionHash.DescriptionM); + + $.each(dataA, function (index, value) { + let i = index + 64; + console.log(value); + workbook.sheet('param').cell('C' + i).value(value[1]); + workbook.sheet('param').cell('D' + i).value(value[2]); + }); + + break; + //---------------------------------------------------------------------------------------------------- + //5.振込案内 + case '振込案内': + workbook.sheet('param').cell('C2').value(customerName); + workbook.sheet('param').cell('C3').value(data001.ClassHash.ClassA); + workbook.sheet('param').cell('C4').value(data004.Title); + workbook.sheet('param').cell('C5').value(data003.ClassHash.ClassB); + workbook.sheet('param').cell('C6').value(data003.ClassHash.ClassC); + workbook.sheet('param').cell('C7').value(data003.ClassHash.ClassD); + workbook.sheet('param').cell('C8').value(data003.ClassHash.ClassE); + workbook.sheet('param').cell('C9').value(data003.ClassHash.ClassF); + workbook.sheet('param').cell('C10').value(eigyo1); + + workbook.sheet('param').cell('C11').value(myData.ClassHash.ClassX); + workbook.sheet('param').cell('C12').value(data001.ClassHash.ClassA); + + workbook.sheet('param').cell('C13').value(myData.ClassHash.ClassA); + //お客様名1 + workbook.sheet('param').cell('C14').value(myData.ClassHash.Class001); //お客様名1_姓 + workbook.sheet('param').cell('E14').value(myData.ClassHash.Class002); + //お客様名2 + workbook.sheet('param').cell('C15').value(myData.ClassHash.Class009); //お客様名2_姓 + workbook.sheet('param').cell('E15').value(myData.ClassHash.Class010); + console.log(myData.ClassHash.Class009) + if (myData.ClassHash.Class009 == '') { + workbook.sheet('振込案内').column("M").hidden(true); + workbook.sheet('振込案内').column("N").hidden(true); + workbook.sheet('振込案内').column("O").hidden(true); + workbook.sheet('振込案内').column("P").hidden(true); + workbook.sheet('振込案内').column("Q").hidden(true); + workbook.sheet('振込案内').column("R").hidden(true); + workbook.sheet('振込案内').column("S").hidden(true); + workbook.sheet('振込案内').column("T").hidden(true); + workbook.sheet('振込案内').column("U").hidden(true); + workbook.sheet('振込案内').column("V").hidden(true); + workbook.sheet('振込案内').column("W").hidden(true); + workbook.sheet('振込案内').column("X").hidden(true); + } + //お客様名3 + workbook.sheet('param').cell('C16').value(myData.ClassHash.Class017); //お客様名3_姓 + workbook.sheet('param').cell('E16').value(myData.ClassHash.Class018); + console.log(myData.ClassHash.Class0017) + if (myData.ClassHash.Class017 == '') { + workbook.sheet('振込案内').column("Y").hidden(true); + workbook.sheet('振込案内').column("Z").hidden(true); + workbook.sheet('振込案内').column("AA").hidden(true); + workbook.sheet('振込案内').column("AB").hidden(true); + workbook.sheet('振込案内').column("AC").hidden(true); + workbook.sheet('振込案内').column("AD").hidden(true); + workbook.sheet('振込案内').column("AE").hidden(true); + workbook.sheet('振込案内').column("AF").hidden(true); + workbook.sheet('振込案内').column("AG").hidden(true); + workbook.sheet('振込案内').column("AH").hidden(true); + workbook.sheet('振込案内').column("AI").hidden(true); + workbook.sheet('振込案内').column("AJ").hidden(true); + } + + workbook.sheet('param').cell('C17').value(myData.ClassHash.Class003); + workbook.sheet('param').cell('E17').value(myData.ClassHash.Class004); + workbook.sheet('param').cell('C18').value(myData.ClassHash.Class011); + workbook.sheet('param').cell('E18').value(myData.ClassHash.Class012); + workbook.sheet('param').cell('C19').value(myData.ClassHash.Class019); + workbook.sheet('param').cell('E19').value(myData.ClassHash.Class020); + + break; + //---------------------------------------------------------------------------------------------------- + //6.ポイントクラブ初回登録 + case 'ポイントクラブ初回登録': + workbook.sheet('param').cell('C2').value(myData.ClassHash.ClassA); + workbook.sheet('param').cell('C3').value(myData.ClassHash.ClassS); + break; + //---------------------------------------------------------------------------------------------------- + //7.約款口座 + case '約款口座': + let furikomi = myData.ClassHash.ClassX.split(' '); //口座情報をスペースで分割 + workbook.sheet('param').cell('C2').value(furikomi[0] + ' ' + furikomi[1]); //銀行名 + workbook.sheet('param').cell('C3').value(furikomi[2] + ' ' + furikomi[3]); //口座番号 + workbook.sheet('param').cell('C4').value(data001.ClassHash.ClassA); //契約会社 + + break; + //---------------------------------------------------------------------------------------------------- + //19.ハウスジーメン確認シート + case 'ハウスジーメン確認シート': + workbook.sheet('param').cell('C2').value(myData.ClassHash.Class007); + workbook.sheet('param').cell('C3').value(myData.ClassHash.ClassS); + break; + //---------------------------------------------------------------------------------------------------- + //20.契約日スケジュール + case '契約日スケジュール': + workbook.sheet('param').cell('C2').value(myData.ClassHash.ClassS); + workbook.sheet('param').cell('C3').value(keiyakuDateStr); + workbook.sheet('param').cell('C4').value(myData.ClassHash.ClassX); + workbook.sheet('param').cell('C5').value(data001.ClassHash.ClassA); + workbook.sheet('param').cell('C6').value(data003.Title); + break; + //---------------------------------------------------------------------------------------------------- + //21.契約時書類チェックシート + case '契約時書類チェックシート': + workbook.sheet('param').cell('C2').value(data001.ClassHash.ClassA); + workbook.sheet('param').cell('C3').value(data004.Title); + workbook.sheet('param').cell('C4').value(myData.ClassHash.ClassB); + workbook.sheet('param').cell('C5').value(myData.ClassHash.ClassA); + workbook.sheet('param').cell('C6').value(koujimei); + workbook.sheet('param').cell('C7').value(myData.ClassHash.ClassN); + break; + //---------------------------------------------------------------------------------------------------- + //22.プランチェック依頼書 + case 'プランチェック依頼書': + workbook.sheet('param').cell('C2').value(eigyo1); + workbook.sheet('param').cell('C3').value(sekkei1); + workbook.sheet('param').cell('C4').value(myData.ClassHash.ClassT); + workbook.sheet('param').cell('C5').value(myData.ClassHash.ClassS + ' 様'); + workbook.sheet('param').cell('C6').value(myData.ClassHash.ClassA); + workbook.sheet('param').cell('C7').value('〒' + myData.ClassHash.Class028); + workbook.sheet('param').cell('C8').value(myData.ClassHash.Class029); + workbook.sheet('param').cell('C9').value(myData.ClassHash.Class031); + workbook.sheet('param').cell('C10').value(data004.Title); + workbook.sheet('param').cell('C11').value(data005.ClassHash.ClassB + ' ' + myData.ClassHash.Class036); + break; + //---------------------------------------------------------------------------------------------------- + //25.敷地調査報告書 + case '敷地調査報告書': + workbook.sheet('param').cell('C2').value(koujimei); + workbook.sheet('param').cell('C3').value(myData.ClassHash.Class031); + workbook.sheet('param').cell('C4').value(myData.ClassHash.Class029); + break; + //---------------------------------------------------------------------------------------------------- + //27.委任状 + case '委任状': + workbook.sheet('param').cell('C13').value(keiyakuDateStr); + workbook.sheet('param').cell('C14').value(SkeiyakuDateStr); + workbook.sheet('param').cell('C4').value(myData.ClassHash.Class007); + workbook.sheet('param').cell('C5').value(myData.ClassHash.Class001 + ' ' + myData.ClassHash.Class002); + workbook.sheet('param').cell('C6').value(myData.ClassHash.Class015); + workbook.sheet('param').cell('C7').value(myData.ClassHash.Class009 + ' ' + myData.ClassHash.Class010); + workbook.sheet('param').cell('C8').value(myData.ClassHash.Class023); + workbook.sheet('param').cell('C9').value(myData.ClassHash.Class017 + ' ' + myData.ClassHash.Class018); + workbook.sheet('param').cell('C10').value(myData.ClassHash.Class054); //法人名 + workbook.sheet('param').cell('C11').value(myData.ClassHash.Class056); //代表者 + break; + //---------------------------------------------------------------------------------------------------- + case '粗利益確認書': + //粗利益確認書 データ + let DescA = [JSON.parse(arariData.DescriptionHash.DescriptionA), JSON.parse(arariData.DescriptionHash.Description021)]; //本体価格 + let DescB = [JSON.parse(arariData.DescriptionHash.DescriptionB), JSON.parse(arariData.DescriptionHash.Description022)]; //付帯工事 + let DescD = [JSON.parse(arariData.DescriptionHash.DescriptionD), JSON.parse(arariData.DescriptionHash.Description024)]; //本体工事上乗せ + let DescF = [JSON.parse(arariData.DescriptionHash.DescriptionF), JSON.parse(arariData.DescriptionHash.Description026)]; //確定付帯上乗せ + let DescH = [JSON.parse(arariData.DescriptionHash.DescriptionH), JSON.parse(arariData.DescriptionHash.Description028)]; //サービス項目 + let DescI = [JSON.parse(arariData.DescriptionHash.DescriptionI), JSON.parse(arariData.DescriptionHash.Description029)]; //紹介料 + let DescJ = [JSON.parse(arariData.DescriptionHash.DescriptionJ), JSON.parse(arariData.DescriptionHash.Description030)]; //値引き + let DescL = [JSON.parse(arariData.DescriptionHash.DescriptionL), JSON.parse(arariData.DescriptionHash.Description032)]; //その他工事 + let Desc002 = [JSON.parse(arariData.DescriptionHash.Description002), JSON.parse(arariData.DescriptionHash.Description042)]; //中計1 + let Desc008 = [JSON.parse(arariData.DescriptionHash.Description008), JSON.parse(arariData.DescriptionHash.Description048)]; //積算チェック + + //共通項目 + workbook.sheet('param').cell('C1').value(koujimei); + workbook.sheet('param').cell('C2').value(myData.ClassHash.ClassB); + workbook.sheet('param').cell('C3').value(myData.ClassHash.ClassA); + workbook.sheet('param').cell('C4').value(data004.Title); + workbook.sheet('param').cell('C5').value(data005.ClassHash.ClassB); + workbook.sheet('param').cell('C6').value(myData.ClassHash.Class043); + + (myData.NumHash.Num015) ? workbook.sheet('param').cell('C7').value(parseFloat(myData.NumHash.Num015.toString().replaceAll(/[¥,]/g, ''))) : 0; + (myData.NumHash.Num016) ? workbook.sheet('param').cell('C8').value(parseFloat(myData.NumHash.Num016.toString().replaceAll(/[¥,]/g, ''))) : 0; + + workbook.sheet('param').cell('C9').value(myData.ClassHash.Class034 + '(' + myData.ClassHash.Class036 + ')'); + + workbook.sheet('param').cell('C10').value(data003.Title); + workbook.sheet('param').cell('C11').value(eigyo12); + workbook.sheet('param').cell('C12').value(data001.ClassHash.ClassA); + + (myData.NumHash.Num039) ? workbook.sheet('param').cell('C13').value(parseFloat(myData.NumHash.Num039.toString().replaceAll(/[¥,]/g, '')) / 100) : 0; + (myData.NumHash.Num050) ? workbook.sheet('param').cell('C14').value(parseFloat(myData.NumHash.Num050.toString().replaceAll(/[¥,]/g, ''))) : 0; + + workbook.sheet('param').cell('C15').value(myData.ClassHash.ClassN); + + let arariId = myData.ClassHash.Class190; //$('#Results_Class190').val(); + if (arariId == '189113') { + arariId = $('#Results_Source189113 > tbody > tr > td:nth-child(1)')[0].textContent; + $p.set($('#Results_Class190'), arariId); + } + workbook.sheet('param').cell('C24').value(arariId); //粗利レコードのID + + + //粗利益確認書 + let sheets = ['粗利益確認書(本契約)', '粗利益確認書(設計契約)']; + for (i = 0; i <= 1; i++) { + let sheetName = sheets[i]; + let cnt = 11; + //本体金額 + $.each(DescA[i], function (index, value) { + (value[1]) ? workbook.sheet(sheetName).cell('F' + cnt).value(value[1]) : 0; + (value[2]) ? workbook.sheet(sheetName).cell('G' + cnt).value(value[2]) : 0; + }); + //付帯工事 + cnt = 12; + $.each(DescB[i], function (index, value) { + (value[0]) ? workbook.sheet(sheetName).cell('C' + cnt).value(value[0]) : 0; + (value[1]) ? workbook.sheet(sheetName).cell('F' + cnt).value(parseFloat(value[1].toString().replaceAll(/[¥,]/g, ''))) : 0; + (value[2]) ? workbook.sheet(sheetName).cell('G' + cnt).value(parseFloat(value[2].toString().replaceAll(/[¥,]/g, ''))) : 0; + cnt = cnt + 1; + if (index == 9) { + return false; + } + }); + //中計1 + cnt = 24; + $.each(Desc002[i], function (index, value) { + (value[7]) ? workbook.sheet(sheetName).cell('L' + cnt).value(parseFloat(value[7].toString().replaceAll(/[¥,]/g, ''))) : 0; + }); + //本体工事上乗せ + cnt = 25; + $.each(DescD[i], function (index, value) { + (value[0]) ? workbook.sheet(sheetName).cell('C' + cnt).value(value[0]) : 0; + (value[1]) ? workbook.sheet(sheetName).cell('F' + cnt).value(parseFloat(value[1].toString().replaceAll(/[¥,]/g, ''))) : 0; + (value[2]) ? workbook.sheet(sheetName).cell('G' + cnt).value(parseFloat(value[2].toString().replaceAll(/[¥,]/g, ''))) : 0; + (value[3]) ? workbook.sheet(sheetName).cell('H' + cnt).value(parseFloat(value[3].toString().replaceAll(/[¥,]/g, ''))) : 0; + (value[4]) ? workbook.sheet(sheetName).cell('I' + cnt).value(parseFloat(value[4].toString().replaceAll(/[¥,]/g, ''))) : 0; + cnt = cnt + 1; + if (index == 9) { + return false; + } + }); + //確定付帯上乗せ + cnt = 37; + $.each(DescF[i], function (index, value) { + (value[0]) ? workbook.sheet(sheetName).cell('C' + cnt).value(value[0]) : 0; + (value[1]) ? workbook.sheet(sheetName).cell('F' + cnt).value(parseFloat(value[1].toString().replaceAll(/[¥,]/g, ''))) : 0; + (value[2]) ? workbook.sheet(sheetName).cell('G' + cnt).value(parseFloat(value[2].toString().replaceAll(/[¥,]/g, ''))) : 0; + (value[3]) ? workbook.sheet(sheetName).cell('H' + cnt).value(parseFloat(value[3].toString().replaceAll(/[¥,]/g, ''))) : 0; + (value[4]) ? workbook.sheet(sheetName).cell('I' + cnt).value(parseFloat(value[4].toString().replaceAll(/[¥,]/g, ''))) : 0; + cnt = cnt + 1; + if (index == 9) { + return false; + } + }); + //サービス項目 + cnt = 49; + $.each(DescH[i], function (index, value) { + (value[0]) ? workbook.sheet(sheetName).cell('C' + cnt).value(value[0]) : 0; + (value[1]) ? workbook.sheet(sheetName).cell('F' + cnt).value(parseFloat(value[1].toString().replaceAll(/[¥,]/g, ''))) : 0; + (value[2]) ? workbook.sheet(sheetName).cell('G' + cnt).value(parseFloat(value[2].toString().replaceAll(/[¥,]/g, ''))) : 0; + (value[3]) ? workbook.sheet(sheetName).cell('H' + cnt).value(parseFloat(value[3].toString().replaceAll(/[¥,]/g, ''))) : 0; + (value[4]) ? workbook.sheet(sheetName).cell('I' + cnt).value(parseFloat(value[4].toString().replaceAll(/[¥,]/g, ''))) : 0; + cnt = cnt + 1; + if (index == 9) { + return false; + } + }); + //紹介料 + cnt = 59; + $.each(DescI[i], function (index, value) { + (value[2]) ? workbook.sheet(sheetName).cell('G' + cnt).value(value[2]) : 0; + (value[3]) ? workbook.sheet(sheetName).cell('H' + cnt).value(parseFloat(value[3].toString().replaceAll(/[¥,]/g, ''))) : 0; + (value[4]) ? workbook.sheet(sheetName).cell('I' + cnt).value(parseFloat(value[4].toString().replaceAll(/[¥,]/g, ''))) : 0; + }); + //値引き + cnt = 60; + $.each(DescJ[i], function (index, value) { + (value[1]) ? workbook.sheet(sheetName).cell('F' + cnt).value(parseFloat(value[1].toString().replaceAll(/[¥,]/g, ''))) : 0; + (value[2]) ? workbook.sheet(sheetName).cell('G' + cnt).value(parseFloat(value[2].toString().replaceAll(/[¥,]/g, ''))) : 0; + }); + //その他工事 + cnt = 63; + $.each(DescL[i], function (index, value) { + (value[0]) ? workbook.sheet(sheetName).cell('C' + cnt).value(value[0]) : 0; + (value[1]) ? workbook.sheet(sheetName).cell('F' + cnt).value(parseFloat(value[1].toString().replaceAll(/[¥,]/g, ''))) : 0; + (value[2]) ? workbook.sheet(sheetName).cell('G' + cnt).value(parseFloat(value[2].toString().replaceAll(/[¥,]/g, ''))) : 0; + (value[3]) ? workbook.sheet(sheetName).cell('H' + cnt).value(parseFloat(value[3].toString().replaceAll(/[¥,]/g, ''))) : 0; + (value[4]) ? workbook.sheet(sheetName).cell('I' + cnt).value(parseFloat(value[4].toString().replaceAll(/[¥,]/g, ''))) : 0; + cnt = cnt + 1; + if (index == 9) { + return false; + } + }); + //積算チェック + cnt = 80; + $.each(Desc008[i], function (index, value) { + (value[2]) ? workbook.sheet(sheetName).cell('G' + cnt).value(parseFloat(value[2].toString().replaceAll(/[¥,]/g, ''))) : 0; + }); + } + + break; + //---------------------------------------------------------------------------------------------------- + + } + + return workbook.outputAsync(); + }); +} + +function getWorkbook(guid) { + return new Promise(function (resolve, reject) { + let json = { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + }; + let url = 'https://' + location.hostname + '/pleasanter/api/binaries/' + guid + '/get'; + let req = new XMLHttpRequest(); + req.open('post', url, true); + req.responseType = 'json'; + req.onreadystatechange = function () { + if (req.readyState === 4) { + if (req.status === 200) { + let buf = base64ToArrayBuffer(req.response.Response.Base64); + resolve(XlsxPopulate.fromDataAsync(buf)); + } else { + reject('Received a ' + req.status + ' HTTP code.'); + } + } + }; + req.send(JSON.stringify(json)); + }); +} + +function base64ToArrayBuffer(base64) { + var binaryString = atob(base64); + var bytes = new Uint8Array(binaryString.length); + for (var i = 0; i < binaryString.length; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + return bytes.buffer; +} + +function getMyData() { + let thisId = $p.id(); + + $p.apiGet({ + 'id': thisId, + 'data': { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + }, + 'async': false, + 'done': function (data) { + //console.log('マスターシートデータを取得しました'); + myData = data.Response.Data[0]; + //console.log(myData); + }, + 'fail': function (data) { + console.log(data); + } + + }); +} + +//自分のデータを取得 +function getArariData() { + let arariId = myData.ClassHash.Class190; //$('#Results_Class190').val(); + + if (arariId != '') { + if (arariId == '189113') { + if ($('#Results_Source189113 > tbody > tr > td:nth-child(1)').length > 0) { + //arariIdがテーブルデフォ値の場合、再取得 + arariId = $('#Results_Source189113 > tbody > tr > td:nth-child(1)')[0].textContent; + $p.set($('#Results_Class190'), arariId); + } + } + + if (arariId != '189113') { + $p.apiGet({ + 'id': arariId, + 'data': { + 'ApiVersion': 1.1, + 'ApiKey': apiKey, + }, + 'async': false, + 'done': function (data) { + //console.log(myData); + arariData = data.Response.Data[0]; + }, + 'fail': function (data) { + console.log(data); + } + }); + } + } + +} \ No newline at end of file diff --git a/pleasanter/develop/★MSS/★マスターシート/sites/scripts/3.テーブルリンクと情報取得.js b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/3.テーブルリンクと情報取得.js new file mode 100644 index 00000000..332ab681 --- /dev/null +++ b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/3.テーブルリンクと情報取得.js @@ -0,0 +1,329 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 3.テーブルリンクと情報取得 +@name : +@siteIds : 189112 +@siteTitles : ★マスターシート +@disabled: false +*/ + +//Results_DateD 契約日 +//Results_DateJ 追加変更期限 = 契約日の30日後 +$p.on('change', 'DateD', function () { + if ($('#Results_DateD').val() != '') { + let dateD = new Date($('#Results_DateD').val()); + dateD.setDate(dateD.getDate() + 30); + $p.set($('#Results_DateM'), dateToStr(dateD)); + } +}); + +$p.on('change', 'ClassD', function () { + let recordId = $('#Results_ClassD').val(); + $p.apiGet({ + 'id': recordId, + 'done': function (data) { + //console.log(data); + let jsonStr = JSON.stringify(data.Response.Data[0]); + $p.set($('#Results_Description001'), jsonStr); + furikomisaki(); + } + }); +}); + +$p.on('change', 'ClassE', function () { + let recordId = $('#Results_ClassE').val(); + $p.apiGet({ + 'id': recordId, + 'done': function (data) { + //console.log(data); + let jsonStr = JSON.stringify(data.Response.Data[0]); + $p.set($('#Results_Description002'), jsonStr); + furikomisaki(); + } + }); +}); + +$p.on('change', 'Class033', function () { + let recordId = $('#Results_Class033').val(); + $p.apiGet({ + 'id': recordId, + 'done': function (data) { + //console.log(data); + let jsonStr = JSON.stringify(data.Response.Data[0]); + $p.set($('#Results_Description004'), jsonStr); + } + }); +}); + +$p.on('change', 'Class035', function () { + let recordId = $('#Results_Class035').val(); + $p.apiGet({ + 'id': recordId, + 'done': function (data) { + //console.log(data); + let jsonStr = JSON.stringify(data.Response.Data[0]); + $p.set($('#Results_Description005'), jsonStr); + } + }); +}); + +$p.on('change', 'ClassF', function () { + let recordId = $('#Results_ClassF').val(); + $p.apiGet({ + 'id': recordId, + 'done': function (data) { + //console.log(data); + let jsonStr = JSON.stringify(data.Response.Data[0]); + $p.set($('#Results_Description003'), jsonStr); + furikomisaki(); + } + }); +}); + +function furikomisaki() { + //振込先情報の保存 + let data001 = JSON.parse($('#Results_Description001').val()); + let data003 = JSON.parse($('#Results_Description003').val()); + + let furikomisaki = data001.ClassHash.ClassF; + + if (data003.ClassHash.ClassH != 'NG') { + furikomisaki = data003.ClassHash.ClassH; + } + + $p.set($('#Results_ClassX'), furikomisaki); +} + +$p.on('change', 'Num017', function () { + let num1 = parseFloat($('#Results_Num017').val()); + let num2 = Math.floor(num1 * 0.3025 * 100) / 100; + $p.set($('#Results_Num018'), num2); +}); + +$p.on('change', 'Num011', function () { + mensekiCalc(); +}); +$p.on('change', 'Num012', function () { + mensekiCalc(); +}); +$p.on('change', 'Num013', function () { + mensekiCalc(); +}); +$p.on('change', 'Num014', function () { + mensekiCalc(); +}); +$p.on('change', 'Num019', function () { + mensekiCalc(); +}); + +function mensekiCalc() { + let sum1 = 0; + if ($('#Results_Num011').val()) { + sum1 += parseFloat($('#Results_Num011').val()); + } + if ($('#Results_Num012').val()) { + sum1 += parseFloat($('#Results_Num012').val()); + } + if ($('#Results_Num013').val()) { + sum1 += parseFloat($('#Results_Num013').val()); + } + if ($('#Results_Num014').val()) { + sum1 += parseFloat($('#Results_Num014').val()); + } + if ($('#Results_Num019').val()) { + sum1 += parseFloat($('#Results_Num019').val()); + } + + let sum2 = Math.floor(sum1 * 0.3025 * 100) / 100; + + $p.set($('#Results_Num015'), sum1); + $p.set($('#Results_Num016'), sum2); +} + +function dateToStr(orgdate) { + let year = orgdate.getFullYear(); + let month = orgdate.getMonth() + 1; + let date = orgdate.getDate(); + month = month.toString().padStart(2, '0'); + date = date.toString().padStart(2, '0'); + + let str = year + '/' + month + '/' + date; + + return str; +} + +//郵便番号から住所を引き当てて補完するサンプルコード +function jpostalSetting() { + $('#Results_Class028').jpostal({ + postcode: [ + '#Results_Class028' + ], + address: { + '#Results_Class029': '%3%4%5', + '#Results_Class031': '%3%4%5', + '#Results_Class030': '%ASKV8%ASKV9%ASKV10' + } + }); + + $('#Results_Class006').jpostal({ + postcode: [ + '#Results_Class006' + ], + address: { + '#Results_Class007': '%3%4%5', + '#Results_Class008': '%ASKV8%ASKV9%ASKV10' + } + }); + + $('#Results_Class014').jpostal({ + postcode: [ + '#Results_Class014' + ], + address: { + '#Results_Class015': '%3%4%5', + '#Results_Class016': '%ASKV8%ASKV9%ASKV10' + } + }); + + $('#Results_Class022').jpostal({ + postcode: [ + '#Results_Class022' + ], + address: { + '#Results_Class023': '%3%4%5', + '#Results_Class024': '%ASKV8%ASKV9%ASKV10' + } + }); + + +} + +//誕生日から年齢を計算して入力 +$p.on('change', 'Date001', function () { + mensekiCalc(); + if ($('#Results_Date001').val() != '') { + let birthday = new Date($('#Results_Date001').val()); + let age = getAge(birthday); + $p.set($('#Results_Num001'), age); + } +}); + +$p.on('change', 'Date002', function () { + mensekiCalc(); + if ($('#Results_Date002').val() != '') { + let birthday = new Date($('#Results_Date002').val()); + let age = getAge(birthday); + $p.set($('#Results_Num002'), age); + } +}); + +$p.on('change', 'Date003', function () { + mensekiCalc(); + if ($('#Results_Date003').val() != '') { + let birthday = new Date($('#Results_Date003').val()); + let age = getAge(birthday); + $p.set($('#Results_Num003'), age); + } +}); + +function getAge(birthday) { + let today = new Date(); + let thisYearsBirthday = new Date(today.getFullYear(), birthday.getMonth() - 1, birthday.getDate()); + let age = today.getFullYear() - birthday.getFullYear(); + if (today < thisYearsBirthday) { + //今年まだ誕生日が来ていない + age--; + } + return age; +} + +function setKankeisya() { + + let classG = ($('#Results_ClassG').attr('data-readonly') == '1') ? + $('#Results_ClassG').attr("data-value") ? + $('#Results_ClassG').attr("data-value") : '' : $('#Results_ClassG').val(); + let classH = ($('#Results_ClassH').attr('data-readonly') == '1') ? + $('#Results_ClassH').attr("data-value") ? + $('#Results_ClassH').attr("data-value") : '' : $('#Results_ClassH').val(); + let classI = ($('#Results_ClassI').attr('data-readonly') == '1') ? + $('#Results_ClassI').attr("data-value") ? + $('#Results_ClassI').attr("data-value") : '' : $('#Results_ClassI').val(); + let classJ = ($('#Results_ClassJ').attr('data-readonly') == '1') ? + $('#Results_ClassJ').attr("data-value") ? + $('#Results_ClassJ').attr("data-value") : '' : $('#Results_ClassJ').val(); + let classK = ($('#Results_ClassK').attr('data-readonly') == '1') ? + $('#Results_ClassK').attr('data-value') ? + $('#Results_ClassK').attr('data-value') : '' : $('#Results_ClassK').val(); + let classL = ($('#Results_ClassL').attr('data-readonly') == '1') ? + $('#Results_ClassL').attr('data-value') ? + $('#Results_ClassL').attr('data-value') : ' ' : $('#Results_ClassL').val(); + let classY = ($('#Results_ClassY').attr('data-readonly') == '1') ? + $('#Results_ClassY').attr('data-value') ? + $('#Results_ClassY').attr('data-value') : '' : $('#Results_ClassY').val(); + let class122 = ($('#Results_Class122').attr('data-readonly') == '1') ? + $('#Results_Class122').attr('data-value') ? + $('#Results_Class122').attr('data-value') : '' : $('#Results_Class122').val(); + let class123 = ($('#Results_Class123').attr('data-readonly') == '1') ? + $('#Results_Class123').attr('data-value') ? + $('#Results_Class123').attr('data-value') : '' : $('#Results_Class123').val(); + + let kankeisya = []; + if (classG != '') { + kankeisya.push(classG); + } + if (classH != '') { + kankeisya.push(classH); + } + if (classI != '') { + kankeisya.push(classI); + } + if (classJ != '') { + kankeisya.push(classJ); + } + if (classK != '') { + kankeisya.push(classK); + } + if (classL != '') { + kankeisya.push(classL); + } + if (classY != '') { + kankeisya.push(classY); + } + if (class122 != '') { + kankeisya.push(class122); + } + if (class123 != '') { + kankeisya.push(class123); + } + + console.log(JSON.stringify(kankeisya)); + $p.set($('#Results_Class111'), JSON.stringify(kankeisya)); +} + +/* +ClassP +1, 設計契約, 設計契約, status - big - orange +2, 本契約, 本契約, status - big - blue + +ClassN +0, なし, なし, status - blue +1, あり, あり, status - red +*/ +$('input[name="Results_ClassP"]:radio').change(function () { + console.log($(this).val()); + let bunrui = $(this).val(); + //console.log(bunrui); + if (bunrui == 1 && $('#Results_Status').val() == 100) { + //設計契約を選択 + //console.log($('#Results_Status').val()); + $p.set($('#Results_Status'), 110); + $p.set($('#Results_ClassN'), 1); + } else if (bunrui == 2 && $('#Results_Status').val() == 110) { + //本契約を選択 + //console.log($('#Results_Status').val()); + $p.set($('#Results_Status'), 100); + $p.set($('#Results_ClassN'), 0); + } + console.log($('#Results_Status').val()); +}); \ No newline at end of file diff --git a/pleasanter/develop/★MSS/★マスターシート/sites/scripts/3_5現場案内図.js b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/3_5現場案内図.js new file mode 100644 index 00000000..563d8740 --- /dev/null +++ b/pleasanter/develop/★MSS/★マスターシート/sites/scripts/3_5現場案内図.js @@ -0,0 +1,164 @@ +/* +@config : next999.json +@filename : ${psFileBasename} +@title : 3_5現場案内図 +@name : +@siteIds : 189112 +@siteTitles : ★マスターシート +@disabled: false +*/ + +function createMapReport() { + getMyData(); + + console.log('createMapReport'); + let div = document.createElement('div'); + div.id = 'templateHTML'; + div.style.display = 'none'; + $('body').append(div); + + const req = new XMLHttpRequest(); + let url = '/pleasanter/myScripts/templateHTML3.html'; + req.onreadystatechange = function () { + //console.log(req); + if (req.readyState == 4) { + if (req.status == 200) { + //console.log(req); + let templateHTML = req.response; + //let data002 = JSON.parse($('#Results_Description002').val()); //施工会社 + let data002 = JSON.parse(myData.DescriptionHash.Description002); //施工会社 + + //console.log(data002); + //console.log(userList); + + //let koujimei1 = $('#Results_ClassQ').val(); + //let koujimei2 = $('#Results_ClassU').val(); + //let shubetsu = $('#Results_Class042').val(); + + let koujimei1 = myData.ClassHash.ClassQ; + let koujimei2 = myData.ClassHash.ClassU; + let shubetsu = myData.ClassHash.Class042; + + let koujimei = koujimei1 + ' 様邸' + shubetsu + '工事'; + if (koujimei2 != '') { + koujimei = koujimei2 + ' 様邸' + shubetsu + '工事'; + } + let now = new Date(); + let nowStr = now.getFullYear() + '年' + (now.getMonth() + 1) + '月' + now.getDate() + '日'; + + //let sonota = $('#Results_Description050').val().replace(/\n/g, '
'); + let sonota = myData.DescriptionHash.Description050.replace(/\n/g, '
'); + let kouji_tantou = ''; + if (myData.ClassHash.ClassJ) { + kouji_tantou = userList[myData.ClassHash.ClassJ].name; + } + + let template = Hogan.compile(templateHTML); + /* + let outputHtml = template.render({ + kokyaku_code: $('#Results_ClassB').val(), + keiyaku_code: $('#Results_ClassA').val(), + create_date: nowStr, + koujimei_kana: $('#Results_ClassR').val(), + kouji_mei: koujimei, + jusyo_yubin: '〒' + $('#Results_Class028').val(), + jyusho: $('#Results_Class029').val(), + sekou_kaisya: data002.ClassHash.ClassA, + tel: data002.ClassHash.ClassD, + fax: data002.ClassHash.ClassE, + kouji_tantou: kouji_tantou, + hannyu_road: $('#Results_Class050').val(), + chusyajou: $('#Results_Class051').val(), + sho_unpan: $('#Results_Class052').val(), + ResultId: $p.id(), + sonota: sonota, + }); + */ + let outputHtml = template.render({ + kokyaku_code: myData.ClassHash.ClassB, + keiyaku_code: myData.ClassHash.ClassA, + create_date: nowStr, + koujimei_kana: myData.ClassHash.ClassR, + kouji_mei: koujimei, + jusyo_yubin: '〒' + myData.ClassHash.Class028, + jyusho: myData.ClassHash.Class029, + sekou_kaisya: data002.ClassHash.ClassA, + tel: data002.ClassHash.ClassD, + fax: data002.ClassHash.ClassE, + kouji_tantou: kouji_tantou, + hannyu_road: myData.ClassHash.Class051, + chusyajou: myData.ClassHash.Class050, + sho_unpan: myData.ClassHash.Class052, + ResultId: $p.id(), + sonota: sonota, + }); + + let newWin = window.open('', '現場案内図', 'left=10,top=10,width=1100,height=900,menubar=no,toolbar=no,location=no,status=no,resizable=yes,scrollbars=no'); + newWin.document.open(); + newWin.document.write(outputHtml); + newWin.document.close(); + + openYahooMap(newWin); + } + } + }; + + req.open('GET', url); + req.setRequestHeader('Pragma', 'no-cache'); + req.setRequestHeader('Cache-Control', 'no-cache'); + req.setRequestHeader('If-Modified-Since', 'Thu, 01 Jun 1970 00:00:00 GMT'); + req.send(); +} + +function openYahooMap(newWin) { + //let jyusho = $('#Results_Class029').val(); + let jyusho = myData.ClassHash.Class029; + + if (jyusho) { + const req = new XMLHttpRequest(); + let url = 'https://msearch.gsi.go.jp/address-search/AddressSearch?q=' + encodeURI(jyusho); + req.onreadystatechange = function () { + if (req.readyState == 4) { + if (req.status == 200) { + // 受信したデータの処理を記述する + let res = JSON.parse(req.response); + //緯度経度取得 + let lng = res[0].geometry.coordinates[0]; //経度 + let lat = res[0].geometry.coordinates[1]; //緯度 + //GoogleMAPURL作成 + let googleMap = 'https://maps.google.co.jp/maps?ll=' + lat + ',' + lng + '&q=' + lat + ',' + lng + '&z=19'; + //QRコード作成 + $('#googleMapQrCode').qrcode({ + width: 90, + height: 90, + text: googleMap + }); + let canvas1 = document.getElementById('googleMapQrCode').firstChild; + let qrData = canvas1.toDataURL('image/png'); + //console.log(qrData); + //QRコードを案内図に埋め込み + newWin.document.getElementById('mapQr').innerHTML = ''; + newWin.document.getElementById('lng').innerHTML = lng; + newWin.document.getElementById('lat').innerHTML = lat; + + //Yahoo地図取得 + let yahooMap1 = 'https://map.yahoo.co.jp/embedmap/V3/?' + 'lon=' + lng + '&lat=' + lat + '&zoom=16&cond=maptype:twoTones;' + '&width=640&height=400'; + let html1 = '' + '