Coverage Summary for Class: KppGenerator (ru.eda.plgn.bizgen.core.generator.impl)

Class Method, % Branch, % Line, % Instruction, %
KppGenerator 100% (2/2) 100% (3/3) 100% (13/13)
KppGenerator$Companion 100% (3/3) 50% (2/4) 88.9% (8/9) 85.4% (134/157)
Total 100% (5/5) 50% (2/4) 91.7% (11/12) 86.5% (147/170)


 package ru.eda.plgn.bizgen.core.generator.impl
 
 import ru.eda.plgn.bizgen.core.generator.GeneratorResult
 import ru.eda.plgn.bizgen.core.generator.GeneratorResultWithEscape
 import ru.eda.plgn.bizgen.core.generator.GeneratorStr
 import kotlin.random.Random
 
 /**
  * КПП (Код причины постановки на учет).
  *
  * **See Also:**
  * [Код причины постановки на учёт](https://ru.wikipedia.org/wiki/%D0%98%D0%B4%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80_%D0%BD%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%BF%D0%BB%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%89%D0%B8%D0%BA%D0%B0#%D0%9A%D0%BE%D0%B4_%D0%BF%D1%80%D0%B8%D1%87%D0%B8%D0%BD%D1%8B_%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8_%D0%BD%D0%B0_%D1%83%D1%87%D1%91%D1%82)
  *
  * @author Dmitry_Emelyanenko
  */
 class KppGenerator : GeneratorStr {
   override val uniqueDistance: Int = 130
 
   override fun generate(): GeneratorResult<String> = GeneratorResultWithEscape(randomKpp())
 
   private companion object {
 
     fun randomKpp(): String {
       return generateKpp(null)
     }
 
     /**
      * Генерирует случайный КПП (9 цифр) по правилам ФНС. Формат: XXXXYYZZZ, где:
      * - XXXX (4 цифры) - код налогового органа
      * - YY (2 цифры) - причина постановки (01-50)
      * - ZZZ (3 цифры) - порядковый номер
      */
     private fun generateKpp(regionCode: Int? = null, taxOfficeCode: Int? = null): String {
       // Генерация кода региона и налоговой (первые 4 цифры)
       val taxCode = if (taxOfficeCode != null) {
         "%04d".format(taxOfficeCode)
       } else {
         val rc = regionCode ?: Random.nextInt(1, 100)
         "%02d".format(rc) + "%02d".format(Random.nextInt(1, 100))
       }
 
       // Причина постановки (01-50)
       val reasonCode = "%02d".format(Random.nextInt(1, 51))
 
       // Порядковый номер (000-999)
       val serialNumber = "%03d".format(Random.nextInt(0, 1000))
 
       return taxCode + reasonCode + serialNumber
     }
   }
 }