kagamihogeの日記

kagamihogeの日記です。

火災後のセントリーの耐火金庫の新品交換

マスターロック・セントリー日本株式会社が販売している耐火金庫は、火災の被害が発生した場合、以下のサポートQ&Aにあるように所定の手続きを踏めば新品と交換できる。

www.sentryjp.com

ライフタイムワランティーとは何ですか? 万一火災で金庫が燃えてしまった場合、中身を除き金庫を新品とお取替え致します。 最初のご購入者が使用される限り、このサービスが受けられます。(キャッシュボックスとパーソナル セキュリティセーフ シリーズは除く) https://www.sentryjp.com/support/faq_q.php?scode=CW

必要書類

サポートによると以下の書類を郵送してください、とのこと。耐火金庫の写真は火災現場での撮影が必要なので、もしサポートを受けたい場合は片付け前にあらかじめ撮影の必要がある。

必要書類 説明
写真1・製品の外観 火災の被害を確認可能な耐火金庫の外観写真
写真2・製造番号 フタ内側に製造番号などが記載されている。それが確認可能な写真。後述
罹災証明書のコピー 消防署が発行する公的書類。原本ではなくコピーで良い。火災保険の申請時に原本を作成しているはずなので、その時にコピーを何通か用意しておくのが良い
本人確認書類のコピー マイナンバーカード、運転免許証、などのコピー
受取住所 新品の配送先住所

写真例

念のためモザイクをかけているがフタの裏側に製造番号などが記載されているのは分かると思う。

ちなみに、写真から分かるとおり中身の通帳などは無事だった。一般的な火災に備えるだけなら同社のポータブルシリーズで十分だろう。もちろん、盗難やより強力な火災、水害に備えるのであれば上位モデルが適する。

感想

新しい耐火金庫を買いなおした後に新品交換サービスの存在を知ってしまったのであった。なので、必要書類は実際に交換手続きをしたわけではない。

住宅火災における川崎市の市税減免の審査基準と手続

川崎市には天災および人為的災害で家屋や家財に損害が発生した場合に市税の減免を受けられる場合がある。ただ、減免額が「被災の状況に応じて8分の1から全額まで」とあるのみで、どういう基準なのかは記載が無い。

なお、以下の記述は賃貸住宅の罹災経験に基づく記述である。賃貸住宅は家財のみが対象で、住宅は所有物では無いので無関係である。戸建ての場合はまた変わってくるので、本文書を参考にする場合はその点を注意して欲しい

www.city.kawasaki.jp

減免の審査基準

ざっくり言うと、火災保険のカバー率が家財の70%未満な場合に減免の資格が発生するようだ。詳細は後述する。たとえば、以下図のように、消失家財の評価額が仮に100万だったとする。火災保険の支払額が70万だったとすると、最終的な損害の金額は30万となる。消失家財の10分の3が30万なので、これが最低ラインとなる。この場合だと、火災保険が60万とか50万の場合に減免基準を満たすようだ。

川崎市のwebサイトには見つからなかったが、窓口で受けた説明と同様な基準の自治体があるのでそちらから引用する。

減免が受けられるのは、住宅又は家財に被害を受け、損害の金額(保険金、損害賠償金その他これに類するものにより補填される部分の金額を除く。)が、所有する住宅又は家財の価格の10分の3以上で、前年の合計所得金額が1,000万円以下である方です。 https://city.hashima.lg.jp/1246.html 羽島市 - 火災にあわれた方へ(市税) より抜粋

上の図ではざっくり「存在の金額」は家財評価額から火災保険の支払額を引いた金額としたが、正確な「損害の金額」は「(保険金、損害賠償金その他これに類するものにより補填される部分の金額を除く。)」である。とはいえ多くのケースにおいて補填金額とはほぼ火災保険の支払額と同義であろう。

狛江市にも同様な記述があり、かつ、こちらには所得基準も併せて掲載されている。おそらく川崎市も似たようなものだろう。

所有に係る住宅や家財に損害の金額(補填されるべき金額除く)が住宅や家財の価格の 10 分の3以上であり、かつ合計所得金額が1,000 万 円 以 下である者のうち右に掲げる事由に該当する者 https://www.city.komae.tokyo.jp/index.cfm/41,66927,c,html/66927/20150915-164452.pdf

ただし、これはあくまでも公開されているおおむねの基準である。減免を受けられるかどうかは審査があるので、実際に減免されるかどうかは審査を受けないと分からない。

減免申請の相談

まず担当窓口に審査基準を満たすかどうかを電話相談する。必要書類を揃えるのはそのあとで良いが、面倒なものもあるので申請するつもりがあるなら事前に準備しておいた方がよい。

川崎市の相談先一覧は下記のとおり。区ごとに管轄事務所が異なるので、現住所の担当事務所に電話相談する。

https://www.city.kawasaki.jp/kurashi/category/16-5-5-0-0-0-0-0-0-0.html

減免申請に必要な書類

書類 説明
罹災証明書(原本) 消防署で発行する。おそらく火災保険の申請で一度発行しているはずなので、要領はそれと同じ。消防署に罹災証明書(原本)の発行依頼をし、面会予約をし、現地で受け取る。
火災保険の契約状況が分かるもの 契約書でも何でも良い。保険会社に連絡すればPDF等で火災保険契約照会を出力してくれる。
火災保険の金額が分かるもの メールなりハガキなりで支払明細が来るはずなのでそれでOK
マイナンバーカード 身分証明書
損害品明細書 火災保険申請時に消失家財の明細を作成していると思うが、それと同様な書類が必要。川崎市指定フォーマット必須なのか、保険会社に提出したのと同じ書類が流用できるのか、は不明。なお、消失家財だけでなく、消失を免れた残存家財も記述の必要がある。おそらく、保険会社とは審査基準が微妙に異なるのだろう。

減免の感想

最終的には私は減免申請はしなかった。どう考えても損害金額が30%以上にはならないと思われたし、損害品明細書を再度作成する手間に見合うとは思えなかった。メチャクチャ面倒な手間をかけて、どう見ても通らない審査を申請する気にはならなかった。窓口担当者の意見としても、私のケースは一般的で十分な火災保険支払いがあるのでまず審査は通らないだろう、との事だった。

おそらくだが、住宅火災に対する市税の減免とは生活困窮者に対する緊急措置なのだろう。損額の金額が50%とか60%とかだとまぁまぁきついし、100%近くなれば税金を払っているレベルでは無くなる可能性が高い。というか、そういう状況は火災保険が何らかの事情で降りないとか、そもそも未加入とかだろう。そういうケースに対する最低限度のセーフティネットかな? という感触がある。

火災保険でおおむね生活復旧出来てるなら税金免除するには当たらない、という事なのだろう。感情的には納得しづらいが、ロジックには妥当性があるように思える。

Testcontainers + Spring Boot 3.1 + Oracle XE

従来 Testcontainers とspring-bootを組み合わせる場合は @DynamicPropertySource で接続URLプロパティなどを置き換える処理がやや煩雑だった。しかし https://spring.io/blog/2023/06/23/improved-testcontainers-support-in-spring-boot-3-1 によると有名どころのdockerコンテナであればその必要性が無くなった、とある。今回はそれを試す。

ソースコード

まずは検証用の適当なアプリケーションを作成する。適当なテーブルから一行を返すだけのREST APIを作成する。

build.gradle

plugins {
  id 'java'
  id 'org.springframework.boot' version '3.1.5'
  id 'io.spring.dependency-management' version '1.1.3'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
  sourceCompatibility = '17'
}

configurations {
  compileOnly {
    extendsFrom annotationProcessor
  }
}

repositories {
  mavenCentral()
}

dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-web'
  implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  
  compileOnly 'org.projectlombok:lombok'
  annotationProcessor 'org.projectlombok:lombok'
  
  runtimeOnly 'com.oracle.database.jdbc:ojdbc8'
  
  developmentOnly 'org.springframework.boot:spring-boot-devtools'
  
  testImplementation 'org.springframework.boot:spring-boot-starter-test'
  testImplementation 'org.springframework.boot:spring-boot-starter-webflux'
  testImplementation 'org.springframework.boot:spring-boot-testcontainers'
  testImplementation 'org.testcontainers:junit-jupiter'
  testImplementation 'org.testcontainers:oracle-xe'
  
  // https://stackoverflow.com/questions/77241793/nosuchmethoderror-java-util-set-org-junit-platform-engine-testdescriptor-getan
  testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
  useJUnitPlatform()
}

検証用アプリケーション

package springtestsample;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringTestSampleApplication {
  public static void main(String[] args) {
    SpringApplication.run(SpringTestSampleApplication.class, args);
  }
}
package springtestsample.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import lombok.RequiredArgsConstructor;
import springtestsample.entity.Users;
import springtestsample.repository.UsersRepository;

@RestController
@RequiredArgsConstructor
public class UserController {
  final UsersRepository users;

  @GetMapping("/user/{id}")
  public Users user(@PathVariable("id") String id) {
    return users.findById(id).orElse(new Users());
  }
}
package springtestsample.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import springtestsample.entity.Users;

public interface UsersRepository extends JpaRepository<Users, String> {
}
package springtestsample.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import lombok.Data;

@Entity
@Data
public class Users {
  @Id
  String id;
  String name;
}

テスト時には使わないが src/main/resources/application.properties も一応載せておく。

spring.datasource.url jdbc:oracle:thin:@localhost:11521/FREEPDB
spring.datasource.username system
spring.datasource.password a

テストコード

package springtestsample.integration;

import java.sql.SQLException;
import javax.sql.DataSource;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.web.server.LocalServerPort;
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
import org.springframework.http.MediaType;
import org.springframework.test.context.jdbc.Sql;
import org.springframework.test.web.reactive.server.WebTestClient;
import org.testcontainers.containers.OracleContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import springtestsample.SpringTestSampleApplication;

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = SpringTestSampleApplication.class)
@Testcontainers
@Sql(scripts = {"classpath:schema-test.sql", "classpath:data-test.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)
class IntegrationTest {
   @LocalServerPort
  int port;
  
  @Container
  @ServiceConnection
  static OracleContainer oracle = new OracleContainer("gvenzl/oracle-xe:21.3.0-slim"); 

  @Autowired
  WebTestClient client;
  
  @Test
  @DisplayName("ユーザ取得の正常系")
  void test() {
    client.get().uri("http://localhost:" + port + "/user/{id}", "kagami")
      .accept(MediaType.APPLICATION_JSON)
      .exchange()
      .expectStatus().isOk()
      .expectBody().json("""
        {
          "id":"kagami"
          , "name":"hoge"
        }
        """);
  }
}

テスト開始時に実行されるSQL src/test/resources/schema-test.sql, src/test/resources/data-test.sql は以下。

create table users( 
    id varchar (50) not null primary key
    , name varchar (500) not null
);
insert into users(id, name) values ('kagami', 'hoge');

説明など

大まかには以下と同じ。

kagamihoge.hatenablog.com

https://spring.io/blog/2023/06/23/improved-testcontainers-support-in-spring-boot-3-1 によると、@ServiceConnection の付与と対応クラスであれば、この一行だけでdockerコンテナ開始・終了をやってくれる。

手元の環境だとOracleのコンテナは20秒弱で起動する。integration testでは十分な速度であろう。

他イメージは使用できない?

@ServiceConnection の使用には Testcontainers 用のイメージを使う必要がある(と思う)。他に使用可能なイメージは https://hub.docker.com/r/gvenzl/oracle-xe にある。

Oracle公式のイメージ container-registry.oracle.com/database/free:23.2.0.0 も使用可能とは思うが@ServiceConnectionとしては使用できなかった。ただ、エラーを見るに接続URLが無くてエラーが出てるだけっぽいので、こちらは従来通り @DynamicPropertySource を使うやり方になるのだと思われる。

Oracle 23cは使用できない?

23c用のイメージ自体は https://hub.docker.com/r/gvenzl/oracle-free にあるが対応するtestcontainersの依存性が2023/11/08時点ではまだ無いっぽい。21までは Testcontainers :: JDBC :: Oracle XE を使い、23c以降用の依存性はまだ無いがソースコード https://github.com/testcontainers/testcontainers-java/blob/main/modules/oracle-free/src/main/java/org/testcontainers/oracle/OracleContainer.java はあるように見える。なので、そのうちアップロードされるのではないか、と思われる。

spring.datasource.urlは使わない?

テスト内で @Value("${spring.datasource.url}") を取得すると src/main/resources/application.properties の値になる。なので、プロパティの動的置換で DataSource を設定してるわけでは無いらしい。