Un programa Java / Scala de 50 líneas que le ahorrará $ 50K. al presentar una declaración 3-NDFL

Versión de video:





Probablemente sepa que tiene que pagar impuestos sobre cualquier ingreso, incl. por ingresos por negociación de valores y derivados (es decir, por negociación en bolsa). Es muy conveniente que el corredor haga los cálculos por usted, antes de que retire dinero de la cuenta, actuando como agente fiscal.





- Interactive Brokers (, ), . , , ; ( 30.04) , , .





, . , . , (. ludo — + .-. μανία — , ), , . , FINRA .. Pattern day trader rule, $25K .





, 50 . , ( " -: "). , , .





El programa oficial para ingresar las cantidades de ingresos en la declaración.

, -, , . , xml, , , . , , :





...< ="13"> < ="840" ="BFT WS" ="840" ="32" ="09.12.2020" ="73.6618" ="219.81" ="16191.70" ="893"/>...





</> < ="01" ="0.00" ="41.15" ="41.15" ="0"/>





< ="06" ="500.15" ="42.52" ="42.52" ="0"/> </3></></>





- " /" , . , , , ; - , . , , , .





, - xml , - , . , , ( ). IB csv :





xml , , - :





import com.typesafe.scalalogging.Logger
import org.slf4j.LoggerFactory

import java.io.PrintWriter
import java.nio.charset.Charset
import java.text.DecimalFormatSymbols
import java.util.Locale
import scala.io.Source

object Tax   {
  def main(args: Array[String]): Unit = {
    implicit val logger = Logger(LoggerFactory.getLogger(this.getClass))
    import java.text.DecimalFormat
    val df = new DecimalFormat("0.00")
    val dfRate = new DecimalFormat("0.0000")
    df.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ENGLISH))
    dfRate.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ENGLISH))
    val str = (Source.fromFile("d:\\tax\\1.csv","UTF-8").getLines().toSeq ++ Source.fromFile("d:\\tax\\2.csv","UTF-8").getLines().toSeq)
      .map(_.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1).toList)
    val rates = Source.fromFile("d:\\tax\\r.csv","windows-1252").getLines().map(_.split(';')).toSeq
      .map(e1=>e1.updated(1,e1(1).split('.').reverse.mkString("-")))
    def rate(d:String)={
      rates.sortBy(_(1)).findLast(e=>e(1)<=d).map{x=>
        if (x(1)!=d) logger.debug(s"    $d,  ${x(1)}")
        BigDecimal(x(2).replaceAll(",","."))
      }.get
    }
    val str1 = str.filter(_.length > 15).filter(e => e(0) == "" && e(1) == "Data").filter{e=> e(13)!=""}
      .map(e=>(e,{
        val date = e(6).replaceAll("\"","" ).split(',')(0)
        val rt = rate(date)
        val sumR = (rt * BigDecimal(e(13)))
        val codes = e(3).trim match {
          case "   (CFD)" => ("893","06")//1532
          case "    " => ("893","06")//1532
          case "" => ("893","06")//1532
          case "" => ("79","01")//1530
        }
        val xml = s"""< ="840" ="${e(5)}" ="840" ="32" ="${
          date.split('-').reverse.mkString(".")
        }" ="${dfRate.format(rt)}" ="${df.format(BigDecimal(e(13)))}" ="${df.format(sumR)}" ="${codes._1}"/>"""
        (xml,sumR,codes)
      }))
    val txt = str1.filter(_._2._2>0).map(_._2._1).mkString("") +
      str1.groupBy(_._2._3).map(e=>(e._1,{
        val x = e._2.map(_._2._2)
        (x.filter(_ >0).sum,-x.filter(_ <0).sum)
      })).map(e=>
        s"""< ="${e._1._2}" ="${df.format(e._2._1)}" ="${df.format(e._2._2)}" ="${df.format(e._2._2)}" ="0"/>"""
      ).mkString("\n") match {
      case e=> new PrintWriter("d:\\tax\\tax_xml.txt", Charset.forName("UTF-8")) { write(e); close }
    }
    logger.debug(s"=${str1.map(e=>e._2._2).filter(_ >0 ).sum} " +
      s"=${str1.map(e=>e._2._2).filter(_ <0 ).sum}" +
      s"=${str1.map(e=>e._2._2).sum}")
  }
}
      
      



:





  1. , CFD , , .





  2. "2020-12-24" ( . ), .





  3. split(','), regexp.





, (design pattern, all rights reserved) , ? -, , . , , .





Y en segundo lugar, todos alguna vez soñamos que lanzaríamos cohetes a Marte, o escribiríamos juegos de la categoría triple-A, pero en realidad las tareas de producción son una cosa mucho más aburrida, esto es principalmente contabilidad, 1C, SAP, o con estuche. bancos, java / scala, hojas de cálculo Excel, consultas SQL, generación xml y json. Cuanto antes el programador novato disipe las ilusiones dañinas, mejor.





Por lo tanto, creo que, incluso si no comercia con corredores extranjeros y no necesita tomar 3-NDFL, esta nota también puede ser interesante para usted.








All Articles