オンラインのみでの法人の確定申告と納付の概要

2017/07/14になんとなくで設立した会社(参考:設立時の手順メモ)について「個人の確定申告と同じくらいの時期にまとめて確定申告した方が楽そう」「暦の節目と事業年度の節目をあえてずらす意味が分からない」という、やはりなんとなくの理由で事業年度を1/1〜12/31としたため、年が明けてから速やかに決算整理、株主総会、確定申告、納付を実施した。

ちなみに1/4から個人用の確定申告書作成コーナーが使えるので2/15を待たずして個人としての確定申告も提出済。早く提出すると還付の場合は1月中に実施されることもある。

MFクラウド会計を使っているうえに単純な仕訳しかない事業なので決算整理自体はサクッと終わって、申告書の作成も「まあ書式通りに書けばいいんでしょ」「財務諸表とかもPDFに電子署名つけて送れるんでしょ」的なノリでいたところ、これがなかなか強敵であった。

最終的には電子証明書入り個人番号カード/カードリーダーおよびe-Taxソフト、eLTAX(PCdesk)、ネットバンキングで対面や郵送なしに申告と納付ができたが、苦労したところは以下。はじめの2つまでは想定内だったが、別表以下は想定外であった。

  • 納める税金の種類が結構ある。
  • 各税金は国税地方税に分かれ、さらに地方税都道府県と市区町村に分かれ、それぞれ申告/納付先が違う。
  • 申告書に「別表」なるものが膨大にあり、その中から適切な「別表」を選んで記し、適切な資料を添付しなければならない。
  • 別表をまたいだ各項目に相関があるが、e-TaxやeLTAXでは自動で相関を埋めてくれない。
  • 財務諸表はPDF(e-Taxでいうところの「イメージデータ」)での提出は不可。
  • MFクラウド会計では財務諸表を直接電子申告で使える形で出力してくれない。
  • 財務諸表を元に作成した別表で法人税を正しく算出した後でそれを改めて財務諸表に反映し、その財務諸表を元に再度別表を更新する必要がある。
  • 財務諸表以外にも別表5(1)/別表5(2)などは一旦ざっくり書いて別の別表に反映しそこで算出したものを再度持ってきたりして何段階かに分けて記入する必要がある。

ここで世の会計ソフトや会計サービスがあまり申告書の作成には対応していないことを知るなど。
一部対応しているものや専用のソフトもあるはあるもののお金が掛かるし癪に障るので自分でやることにした。
税理士さんが決算のところだけ結構高い金額を設定してるのは決算整理だけじゃなくて申告書作成の分も入れてるからかな。

申告した税金

今回は千代田区にある法人なので以下のようなものを申告した。
なお、本来は消費税も納める必要があるが、免税事業者なので今回は対象外であった。
また、東京23区の法人は地方税について都税事務所にのみ申告/納付すればよいが(市町村民税相当が都民税の税率に加味されている)、それ以外の場合だと市役所に市町村民税の申告が必要。

税金 種別 申告ツール 損金 提出先 自分の提出先 自分の納付先 備考
法人税 国税 e-Tax × 税務署 麹町税務署 麹町税務所
地方法人税 国税 e-Tax × 税務署 麹町税務署 麹町税務所 地方って名前ついてるけど国税
法人事業税 地方税 eLTAX 都道府県税事務所 千代田都税事務所 東京主税局
地方法人特別税 地方税 eLTAX 都道府県税事務所 千代田都税事務所 東京主税局 地方法人税とは違う人
法人県民税(法人税割) 地方税 eLTAX × 都道府県税事務所 千代田都税事務所 東京主税局
法人県民税(均等割) 地方税 eLTAX × 都道府県税事務所 千代田都税事務所 東京主税局

提出した書類

最終的に提出した書類は以下のようなもの。
こちらも本来は消費税関連が入ってくるはずだが免税事業者なので今回は対象外。
別表はほぼ最低限のセットなのでどの法人もこのあたりは書くはず。
勘定科目内訳明細書は自分の法人で扱っている勘定科目を見繕った。こちらも多くの法人で使う品揃えのはず。
法人事業概況説明書は独自の書式などもあるっぽいがe-Taxにあるものを使うのが楽だと思う。「電子計算機の利用状況」の欄に面食らったが文脈的に「会計や在庫管理などにどのソフト使ってる?」の意図と捉えて記入。
財務諸表は本来であればMFクラウドで生成したデータを使いたかったが対応していないっぽいしうちの法人は項目数が少なかったのでPDFを目視しつつe-Taxの「財務諸表(XBRL2.1)」を開いて出てきた書類に転記していった。「XBRL2.1」と書いてあるものの対象形式のファイルがないまっさらな状態からe-Taxで作成可能。複雑な場合は郵送も検討した方がよいが、簡単なら目視転記で頑張れ。
会計上の財務諸表としては「個別注記表」が存在しておりe-Taxでも作成できるが、法人税法施行規則 第三十五条には確定申告で提出するものとして記載されていないというのと、結構目視転記がつらい書式であったので今回は省いた。

書類 省令・規則番号/種類 申告ツール 自分の提出先 備考
各事業年度の所得に係る申告書-普通法人 別表1(1) e-Tax 麹町税務所
各事業年度の所得に係る申告書-普通法人 別表1(1)(次葉) e-Tax 麹町税務所
同族会社等の判定に関する明細書 別表2 e-Tax 麹町税務所
所得の金額の計算に関する明細書(簡易様式) 別表4(簡易様式) e-Tax 麹町税務所
利益積立金額及び資本金等の額の計算に関する明細書 別表5(1) e-Tax 麹町税務所
租税公課の納付状況等に関する明細書 別表5(2) e-Tax 麹町税務所
預貯金等の内訳書 勘定科目内訳明細書 e-Tax 麹町税務所
売掛金(未収入金)の内訳書 勘定科目内訳明細書 e-Tax 麹町税務所
売上高等の事業所別の内訳書 勘定科目内訳明細書 e-Tax 麹町税務所
役員報酬手当等及び人件費の内訳書 勘定科目内訳明細書 e-Tax 麹町税務所
法人事業概況説明書 事業概況説明書 e-Tax 麹町税務所
貸借対照表 財務諸表(XBRL2.1) e-Tax 麹町税務所 決算書を見ながらe-Taxに転記した
損益計算書 財務諸表(XBRL2.1) e-Tax 麹町税務所 決算書を見ながらe-Taxに転記した
株主資本等変動計算書 財務諸表(XBRL2.1) e-Tax 麹町税務所 決算書を見ながらe-Taxに転記した
中間・確定申告書 第6号様式 eLTAX 千代田都税事務所
均等割額の計算に関する明細書 第6号様式別表4の3 eLTAX 千代田都税事務所 初年度で12ヶ月に満たないので均等割を月割にする明細

AmazonLinuxでselenium + chromedriver + headlessするメモ

※2018/09/04追記:今はもっと簡単に導入できるので当記事みたいな苦労は不要。

※ここではselenium-server-standaloneを使ってるけど直近のselenium-webdriverで非remoteの場合はselenium-server-standaloneなしで動かした方がよさそう。

これまでAmazonLinuxでseleniumをheadlessモード(Xvfbを使った昔ながらのやり方ではなくchromefirefoxに機能として備わったheadlessモード)で動かす際、chromefirefoxも導入がややこしかったが、AmazonLinux2はCentOS7チックになったためgoogle-chromeリポジトリを設定してyumするだけで入るようになった。

とりあえず備忘録として無印AmazonLinuxとAmazonLinux2での導入手順のメモを残しておく。
以下注記。

  • Dockerfileで記す。
  • dockerでのみ必要でAMIから生成した場合は不要な記述もある。
  • Amazon Linux 2のタイムゾーン設定は未調査なのでこのままだとダメかも。
  • 無印Amazon Linuxで使っていたintoli提供のchromeRPMは2017/12/29現在なくなってるかも。
  • PHP7でアプリを作ってる想定。
  • MITM ProxyはPython2.7で動かす想定。

無印Amazon Linux (2017.09以前)の場合

FROM amazonlinux:2017.09

# タイムゾーン
RUN echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock && \
    echo 'UTC=false' >> /etc/sysconfig/clock && \
    ln -snf /usr/share/zoneinfo/Japan /etc/localtime

# remi
RUN yum -y install http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

# 日本語の画面キャプチャをするためにIPAフォント、AWS CLIのレスポンス加工したいときのためにjq
RUN yum -y install jq ipa-gothic-fonts ipa-mincho-fonts

# アプリケーション用のユーザとグループとログ出力場所
RUN yum -y install shadow-utils && \
    groupadd -g 800 appuser && \
    useradd -u 800 -g appuser -s /sbin/nologin appuser && \
    mkdir /var/log/appuser && \
    chown appuser:appuser /var/log/appuser

# PHP7
RUN yum -y install https://mirror.webtatic.com/yum/el6/latest.rpm && \
    yum -y install php70w php70w-cli php70w-common php70w-devel php70w-fpm php70w-gd php70w-mbstring php70w-mcrypt php70w-mysqlnd php70w-opcache php70w-pdo php70w-pear php70w-xml php70w-pecl-redis php70w-pecl-imagick php70w-intl && \
    yum -y install re2c gcc gcc-c++ libuuid-devel

# composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# selenium-server-standalone用Java
RUN yum -y install java-1.8.0-openjdk

# selenium系
# docker imageにunzipなかったので入れておく
RUN yum -y install unzip
# chrome driver
RUN curl -o /tmp/chromedriver.zip https://chromedriver.storage.googleapis.com/2.33/chromedriver_linux64.zip && unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/
# chrome(intoli提供のRPM。2017/12/29現在なくなってる?)
RUN yum -y install https://intoli.com/blog/installing-google-chrome-on-centos/google-chrome-stable-60.0.3112.113-1.x86_64.rpm
# selenium server
RUN curl -o /usr/local/lib/selenium-server-standalone-3.6.0.jar http://selenium-release.storage.googleapis.com/3.6/selenium-server-standalone-3.6.0.jar
# chrome libs (ConsoleKitとpolkitは相互依存してるので単一コマンドで入れる必要あり)
RUN yum -y install http://ftp.riken.jp/Linux/centos/6/os/x86_64/Packages/ORBit2-2.14.17-6.el6_8.x86_64.rpm && \
    yum -y install http://ftp.riken.jp/Linux/centos/6/os/x86_64/Packages/ConsoleKit-libs-0.4.1-6.el6.x86_64.rpm && \
    yum -y install http://ftp.riken.jp/Linux/centos/6/os/x86_64/Packages/eggdbus-0.6-3.el6.x86_64.rpm && \
    yum -y install http://ftp.riken.jp/Linux/centos/6/os/x86_64/Packages/ConsoleKit-0.4.1-6.el6.x86_64.rpm http://ftp.riken.jp/Linux/centos/6/os/x86_64/Packages/polkit-0.96-11.el6.x86_64.rpm && \
    yum -y install http://ftp.riken.jp/Linux/centos/6/os/x86_64/Packages/GConf2-2.28.0-7.el6.x86_64.rpm

# MITM Proxy
# chromedriverのバグで相手サーバのオレオレ証明書の検証をスキップできないのでMITM Proxyを相手サーバの検証をスキップするモードで動かし、chromedriverにはMITM Proxyの証明書を信頼させる形で回避。
# Chrome M65で新オプション導入されるのでそれまでMITM Proxyでしのぐ。
# https://bugs.chromium.org/p/chromium/issues/detail?id=721739
# 最新のMITM Proxyはpython3用なので2.7系なら0.18.2を明示して導入。
# docker imageにpipなかったので入れておく
RUN yum -y install python27-devel python27-pip
RUN yum -y install libxml2-devel libxslt-devel openssl-devel && \
    pip install "mitmproxy==0.18.2"

# php.iniや自分のアプリの起動、MITM Proxyの起動スクリプトはここでコピー
COPY etc/php.d/php.ini /etc/php.d/
COPY etc/init.d/selenium /etc/init.d/
COPY etc/init.d/mitmproxy /etc/init.d/
RUN chmod 755 /etc/init.d/selenium && \
    chmod 755 /etc/init.d/mitmproxy

# サービスの定期実行
RUN echo '*/10 * * * * /usr/bin/php -c /etc/php.ini /opt/apps/myapp/start.php >> /var/log/appuser/output.log 2>&1' >> /var/spool/cron/appuser && \
    chkconfig crond on && \
    chkconfig selenium on && \
    chkconfig mitmproxy on

Amazon Linux 2 (2017.12以降)の場合

FROM amazonlinux:2017.12

# タイムゾーン(無印からコピーしてきて未検証のままなので効いてないかも)
RUN echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock && \
    echo 'UTC=false' >> /etc/sysconfig/clock && \
    ln -snf /usr/share/zoneinfo/Japan /etc/localtime

# remi(無印だとepelが入ってたが2だと入ってないっぽい)
RUN yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
RUN yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

# 日本語の画面キャプチャをするためにIPAフォント、AWS CLIのレスポンス加工したいときのためにjq
RUN yum -y install jq ipa-gothic-fonts ipa-mincho-fonts

# アプリケーション用のユーザとグループとログ出力場所
RUN yum -y install shadow-utils && \
    groupadd -g 800 appuser && \
    useradd -u 800 -g appuser -s /sbin/nologin appuser && \
    mkdir /var/log/appuser && \
    chown appuser:appuser /var/log/appuser

# PHP7
RUN yum -y install php70 php70-php-cli php70-php-common php70-php-devel php70-php-fpm php70-php-gd php70-php-mbstring php70-php-mcrypt php70-php-mysqlnd php70-php-opcache php70-php-pdo php70-php-pear php70-php-xml php70-php-pecl-redis php70-php-pecl-imagick php70-php-intl && \
    yum -y install re2c gcc gcc-c++ libuuid-devel

# composer
# デフォルトでphp70にパスが通ってないためenableスクリプトを実行してphpへのパスを通す
RUN source /opt/remi/php70/enable && \
    curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# selenium-server-standalone用Java
RUN yum -y install java-1.8.0-openjdk

# selenium系
# docker imageにunzipなかったので入れておく
RUN yum -y install unzip
# chrome driver
RUN curl -o /tmp/chromedriver.zip https://chromedriver.storage.googleapis.com/2.34/chromedriver_linux64.zip && unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/
# chrome(本当はファイルコピーがよいが手抜きでそのまま書いてしまった)
RUN echo '[google-chrome]' > /etc/yum.repos.d/google-chrome.repo && \
    echo 'name=google-chrome' >> /etc/yum.repos.d/google-chrome.repo && \
    echo 'baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch' >> /etc/yum.repos.d/google-chrome.repo && \
    echo 'enabled=1' >> /etc/yum.repos.d/google-chrome.repo && \
    echo 'gpgcheck=1' >> /etc/yum.repos.d/google-chrome.repo && \
    echo 'gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub' >> /etc/yum.repos.d/google-chrome.repo
RUN yum -y install google-chrome-stable
# selenium server
RUN curl -o /usr/local/lib/selenium-server-standalone-3.6.0.jar http://selenium-release.storage.googleapis.com/3.6/selenium-server-standalone-3.6.0.jar


# MITM Proxy
# chromedriverのバグで相手サーバのオレオレ証明書の検証をスキップできないのでMITM Proxyを相手サーバの検証をスキップするモードで動かし、chromedriverにはMITM Proxyの証明書を信頼させる形で回避。
# Chrome M65で新オプション導入されるのでそれまでMITM Proxyでしのぐ。
# https://bugs.chromium.org/p/chromium/issues/detail?id=721739
# 最新のMITM Proxyはpython3用なので2.7系なら0.18.2を明示して導入。
# docker imageにpipなかったので入れておく
RUN yum -y install python-devel python2-pip
RUN yum -y install libxml2-devel libxslt-devel openssl-devel && \
    pip install "mitmproxy==0.18.2"

# php.iniや自分のアプリの起動、MITM Proxyの起動スクリプトはここでコピー
# Amazon Linux 2はCentOS7同様systemdだが手抜きで無印と同じinit.dでやってる
COPY etc/php.d/php.ini /etc/opt/remi/php70/php.ini
COPY etc/init.d/selenium /etc/init.d/
COPY etc/init.d/mitmproxy /etc/init.d/
RUN chmod 755 /etc/init.d/selenium && \
    chmod 755 /etc/init.d/mitmproxy

# サービスの定期実行
# デフォルトでphp70にパスが通ってないためenableスクリプトを実行してphpへのパスを通す
# Amazon Linux 2はCentOS7同様systemdだが手抜きで無印と同じchkconfigでやってる
RUN echo '*/10 * * * * source /opt/remi/php70/enable && php /opt/apps/myapp/start.php >> /var/log/appuser/output.log 2>&1' >> /var/spool/cron/appuser && \
    chkconfig crond on && \
    chkconfig selenium on && \
    chkconfig mitmproxy on

MITM Proxyのスクリプト

MITM Proxyは起動時に自身のキーペアを生成し公開鍵は「mitmproxy-ca-cert.pem」として出力する。
これを「/usr/share/pki/ca-trust-source/anchors」に格納して「update-ca-trust」コマンドを実行することでOS内で「mitmproxy-ca-cert.pem」が信頼できる証明書として登録される。
なお、MITM Proxyのキーペアは起動時に異なる内容で生成されるため、MITM Proxyのインストール時に「/usr/share/pki/ca-trust-source/anchors」にコピーしてもダメ。必ず起動の度にOSにそれを信頼させる必要がある。

start_mitmproxy.sh
#!/bin/bash

# mitmproxy only for chromedriver bug.

export PATH=$PATH:/usr/local/bin

count=`ps -ef | grep [m]itmdump | wc -l`
if [ $count -ne 0 ]; then
  echo "mitmproxy (mitmdump) is already started. Nothing to do."
  exit 0
fi

nohup mitmdump -p 28080 --insecure > /dev/null 2>&1 &

# mitmproxy generate mitmproxy-ca-cert.pem in FIRST START TIME (not a time of installed).
sleep 3
cp ~/.mitmproxy/mitmproxy-ca-cert.pem /usr/share/pki/ca-trust-source/anchors
update-ca-trust enable
update-ca-trust extract
stop_mitmproxy.sh
#!/bin/bash

# mitmproxy only for chromedriver bug.

ps -ef | grep [m]itmdump |  awk '{ print "kill -9", $2 }' | sh

Selenium Serverのスクリプト

PHPの任意のアプリmyappはユーザappuserのcronで定期実行される想定(複数の並行実行あり)。
selenium-server-standaloneとMITM Proxyは立ち上げっぱなし。
selenium-server-standaloneを落とす際にmyappがひとつも動いていないことを確認する処理と落ちている間はmyapp起動cronを止める処理を入れている(myapp自身の中にも/tmp/stop-selenium-server有無のチェックあり)。

start_selenium_server.sh
#!/bin/bash

export PATH=$PATH:/usr/local/bin

# it is heavy logs
# -Dwebdriver.chrome.logfile=${CHROME_LOG}
# -Dwebdriver.chrome.verboseLogging=true
CHROME_LOG=/var/log/appuser/chromedriver.log-wor

SELENIUM_LOG=/var/log/appuser/selenium.log-wor
SELENIUM_SERVER_JAR=/usr/local/lib/selenium-server-standalone-3.6.0.jar

count=`ps -ef | grep ${SELENIUM_SERVER_JAR} | grep -v grep | wc -l`
if [ $count -ne 0 ]; then
  echo "Selenium Server is already started. Nothing to do."
  exit 0
fi

nohup java -Dwebdriver.chrome.logfile=${CHROME_LOG} -Dselenium.LOGGER=${SELENIUM_LOG} -Dselenium.LOGGER.level=WARNING -jar ${SELENIUM_SERVER_JAR} -enablePassThrough false > /dev/null 2>&1 &

echo "Remove the stop Selenium Server flag file."
rm -rf /tmp/stop-selenium-server

if [ -e /var/spool/cron/appuser ]; then
  echo "There is new appuser cron file. Remove old it."
  rm -rf /var/spool/cron/.appuser
else
  echo "Enable appuser cron."
  mv -i /var/spool/cron/{.,}appuser
fi
stop_selenium_server.sh
#!/bin/bash

echo "Disable appuser cron."
if [ -e /var/spool/cron/appuser ]; then
  mv -i /var/spool/cron/{,.}appuser
fi

echo "Create the stop Selenium Server flag file."
touch /tmp/stop-selenium-server

sleep 2

while :
do
  count=`ps -ef | grep php | grep [M]yapp | grep -v "/bin/sh -c " | wc -l`
  if [ $count = 0 ]; then
    break
  fi
  echo "There are processes of myapp count[${count}]. Wait..."
  sleep 5
done
echo "There is no process of myapp. OK."

ps -ef | grep [s]elenium-server-standalone |  awk '{ print "kill -9", $2 }' | sh

AWS上のWordPress常時SSL化に関するメモ

WordPress常時SSL化するにあたってELBやプロキシの裏にいてSSLの終端がWebサーバ本体でない場合は「X-Forwarded-Proto」が「https」か否かを見ましょうという話がある。まあ実際の所はWordPress関係ない話なのだけれど。

ただ、クライアント→(https)→CloudFront→(http)→ELB→(http)→Webサーバという構成でCloudFrontがSSLを終端しているときに同じ事をやると、CloudFrontとhttpでお話ししてるELBは「X-Forwarded-Proto」を「http」にしてしまう。

と、いうことでそういうときのためにあるのが「CloudFront-Forwarded-Proto」であり、これは当然無関係のELBが干渉してくるものではないので、CloudFrontを最前面にたててその後ろが多段になっているケースでもクライアントとやりとりしているプロトコルが取れますよと。

CloudFrontの仕様にも書いてあることなのだけれどWordPress常時SSL化に絡めた作業でうまくこの情報に辿り着かないケースがあるようなのでWordPressという単語を交えてメモしておくなど。

http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html#request-custom-headers-behavior