FORCIA CUBEフォルシアの情報を多面的に発信するブログ

ややこしいソフトウェア開発契約書 法務チームの私がゆるっとプログラミングしてみた

2018.12.07

アドベントカレンダー2018

業務部の片野です。私は業務部法務チームに所属しており、フォルシアが開発を受託しているお客様との業務委託契約を中心に、業務上で発生する各契約が適切な条件・タイミングで締結されるよう条文のチェックなどを主に行っています。

アドベントカレンダー7日目ということで、珍しくバックオフィス業務のお話ですが、単に契約書の説明をしてもつまらないので契約書をプログラミングしてみました!...なんて、急にどうした(笑)という感じですが、実は契約書とプログラムは似ているところが多いのです。プログラムはあらゆるケースを想定して条件を分岐させたり、エラーにならないように例外をキャッチしたりしますが、これは契約書も同様です。契約締結においても、ただ受託する業務内容や期間・対価を定めるだけでなく、将来起こりうる様々なケース(途中で解約されたら?成果物に瑕疵があったら?など)を想定して条件を定めます。契約書をそのままフローチャートに落とし込むこともできますし、論理的な構造になっている点は共通しています。前職でかじったVBの記憶を頼りに書いてみたので少しでも法務のお仕事に興味を持っていただけたら嬉しいです。

今回例で使用している条文はあくまでサンプルで、コードも少し無理がありますが、ご容赦ください。

ソフトウェア開発契約書をプログラミングしてみた

検収

まずは検収時の取り決めで、お客様に開発の成果物について問題ないかご確認いただくための条文です。
「甲」というのがお客様で、「乙」というのがフォルシアのことを指しています。

第4条(本件ソフトウェアの検収)
  1. 納入物のうち本件ソフトウェアについては、甲は、システム仕様書と本件ソフトウェアが合致するか否かを検査しなければならない。
  2. 甲は、本件ソフトウェアが前項の検査に適合する場合、検査合格書に記名押印の上、乙に交付するものとする。
  3. 甲は、本件ソフトウェアが第1項の検査に合格しない場合、乙に対し不合格として修正又は追完を求めるものとし、乙は、本件ソフトウェアを無償で修正して甲に納入し、甲は必要となる範囲で、第1項所定の検査を再度行うものとする。
  4. 本条所定の検査合格をもって、本件ソフトウェアの検収完了とする。
コード
If 乙がソフトウェアを納入
  If ソフトウェアがシステム仕様書と合致 Then
    甲は検査合格書に記名押印して、乙に交付する
  Else
    甲はソフトウェアを不合格として修正又は追完を求める
    While  ソフトウェアがシステム仕様書と合致しない
      乙はソフトウェアを無償で修正して甲に納品する
      甲は再度検査を行う
    End While
    甲は検査合格書に記名押印して、乙に交付する
  End if
End if

フォルシアではお客様の依頼を受けて開発を行う受託開発を行っています。開発できたら納品して終わり、ではなく、成果物の挙動に仕様と異なる点がないかお客様に確認いただき、相違があれば修正して再納品するため、While文で表現してみました。

損害賠償

次に、フォルシアがお客様に損害を与えてしまった際の条文です。
損害を与えないようにするのは大前提ですが、契約書では万が一のケースも想定してどのような場合にいくらまで賠償するかを取り決めています。

第8条(損害賠償額)
  1. 甲は、本契約の履行に関し、乙の故意または過失により損害を被った場合には、乙に対し、損害の賠償を請求することができる。
  2. 前項の損害賠償の額は、本契約の委託報酬の額を上限とする。
  3. 甲が損害賠償請求より前に乙に対し本契約に基づく別の損害賠償を請求していた場合には、甲が乙に対し請求できる損害賠償の額は、前項の上限額から当該別の損害賠償の額を控除した額を上限とする。
  4. 乙が甲に与えた損害が、乙の故意または重過失に基づく場合には、前二項に定める損害賠償額の上限は適用されないものとする。
コード
  1. Dim Baisyokin As Integer
  2. Dim Songaikin As Integer
  3. Dim Keiyakukin As Integer
  4. Dim Prebaisyo As Integer
  5. Dim Jogengaku As Integer
  6.  
  7. Songaikin = 甲が被った損害額(円)
  8. Keiyakukin = 本契約の委託報酬の額(円)
  9.  
  10. If 甲が乙の故意又は過失により損害を被った Then
  11. If 故意又は重過失に基づく Then
  12. Baisyokin = Songaikin
  13. Else
  14. ' 乙に過失があったものの重過失ではない場合(軽過失)
  15. If 甲が損害賠償請求より前に乙に対し本契約に基づく別の損害賠償を請求している Then
  16. Prebaisyo = 甲が乙にすでに賠償請求した額(円)
  17. Jogengaku = Keiyakukin - Prebaisyo
  18. Else
  19. Jogengaku = Keiyakukin
  20. End If
  21. If Jogengaku >= Songaikin Then
  22. Baisyokin = Songaikin
  23. Else
  24. Baisyokin = Jogengaku
  25. End If
  26. End If
  27. 乙は甲にBaisyokinを支払う
  28. Else
  29. 甲は乙に損害の賠償を請求できない
  30. End If

パッと見ただけでもややこしい取り決めになっていますが、備えあれば憂いなし。万が一の際でもスムーズに対応できるよう、契約締結の段階からしっかりと考えておきます。普段の業務でも理解するのに時間がかかる箇所なのですが、間違って理解してしまうと元も子もないので、複雑な定めの際には図解してみるなど工夫をしています。

契約解除

最後は契約を解除するための条文です。
契約違反などの問題が発生した場合、契約に従ってビジネスを進められるよう問題を解決できるのが一番です。
ただ、契約に従おうとするとどうしても不都合がある場合も想定されるので、契約を解除できるための条件を事前に取り決めておきます。

第13条(契約の解除)
  1. 甲又は乙は、相手方に次の各号に定める事由のいずれかが発生したときは、催告なく直ちに本契約を解除することができる。
    (1)本契約に基づく債務を履行せず、その履行を催告された後15日以内にその債務を履行しないとき
    (2)その振出し又は引受けにかかる手形又は小切手が不渡りとなる等、支払停止状態に陥った場合
    (3)差押、仮差押、滞納処分等を受け、又は民事再生、会社更生手続開始も若しくは破産申立をした場合
    (4)会社解散(合併による解散を除く)の決議をした場合
    (5)財産状態が悪化し、又はその恐れがあると認められる相当の事由がある場合
    (6)相当期間継続して業務を行わない場合
    (7)反社会的勢力との関係があると認められたとき、及び、反社会的勢力と関係がある可能性が合理的な理由に基づいて認められたとき。
  2. 甲又は乙が、前項の第1号から4号及び第7号に定める事由の一に該当するときは、何らの通知催告を要せず、相手方に対して負担する一切の債務につき期限の利益を失う。
コード
  1. Dim Kaijo As String
  2. Kaijo = "解除理由"
  3. ' サンプルなので解除理由を仮置きします
  4.  
  5. Select Case Kaijo
  6. Case "(1)" , "(2)" , "(3)" , "(4)" , "(7)"
  7. ' すべてテキストで記載すると長いため上記の号で表しています
  8. 催告なく直ちに本契約を解除することができる
  9. 何らの通知催告を要せず、相手方に対して負担する一切の債務につき期限の利益を失う
  10. Case "(5)" , "(6)"
  11. 催告なく直ちに本契約を解除することができる
  12. End Select

さいごに

このテーマで書き始めようと思ったものの、本当にできるのか?と不安でしたが、やってみると意外とそれらしくなりました。冒頭でお話した通り、契約書は論理的に作られており、将来起こりうる様々なケースを想定して条件を定めている点では、プログラミングと共通しています。
ただ、プログラムとは異なり、契約書は自然言語で表されており、文法も人(会社)によってゆらぎがあります。構文のサジェストもないので、契約書特有の言い回しや語彙は業務を行う上で慣れたり覚えたりする必要がありますし、リリース前にテスト環境で実行してみるなんてこともできないので、本番リリース即障害も起こりえます。
そのような難しさはありますが、フォルシアの営業と技術を裏から支えられる法務の仕事に私は日々やりがいを感じています。

この記事を書いた人

片野光咲

新卒で保険会社に入社後、システム部門でアプリ開発の経験を積み、2018年にフォルシア入社。
業務部にて法務を担当。