<commit_before>module Dtaus
  
  # Vollständiger DTA-Datensatz mit Header (A), Body (C) und Footer (E)
  class Datensatz

    attr_reader :auftraggeber, :buchungen, :datum, :positiv
    alias :positiv? :positiv

    # Vollständigen DTA-Datensatz erstellen
    #
    # Parameter:
    # * autraggeber, das Dtaus::Konto des Auftraggebers
    # * datum, gewünschtes Datum des Datensatzes,
    #   optional, Default-Wert ist die aktuelle Zeit
    #
    def initialize(_auftraggeber, _datum = Time.now)
      raise DtausException.new("Konto expected, got #{auftraggeber.class}") unless _auftraggeber.is_a?(Konto)
      raise DtausException.new("Date or Time expected, got #{datum.class}") unless _datum.is_a?(Date) or datum.is_a?(Time)

      @datum        = _datum
      @auftraggeber = _auftraggeber
      @buchungen    = []
    end

    # Art der Transaktionen (2 Zeichen)
    #
    # Zum Beispiel:
    # * "LB" für Lastschriften Bankseitig
    # * "LK" für Lastschriften Kundenseitig
    # * "GB" für Gutschriften Bankseitig
    # * "GK" für Gutschriften Kundenseitig
    #
    def typ
     'LK'
    end

    # Eine Buchung zum Datensatz hinzufügen.
    #
    # Es wird geprüft, ob das Vorzeichen identisch mit den bisherigen Vorzeichen ist.
    #
    def add(_buchung)
      raise DtausException.new("Buchung expected, got #{_buchung.class}") unless _buchung.is_a?(Buchung)
      
      # Die erste Buchung bestimmt, ob alle Beträge positiv oder negativ sind.
      @positiv = _buchung.positiv? if @buchungen.empty?
      
      # Wirf Exception wenn Vorzeichen gemischt werden
      unless @positiv == _buchung.positiv?
        raise DtausException.new("Nicht erlaubter Vorzeichenwechsel! "+
                                 "Buchung muss wie die vorherigen Buchungen #{positiv? ? 'positiv' : 'negativ'} sein!")
      end
      
      @buchungen << _buchung
    end

    # DTA-Repräsentation dieses Datensatzes
    #
    # Header (A), Buchungen (C) und Footer (E) werden zusammengefügt
    #
    def to_dta
      raise DtausException.new("Keine Buchungen vorhanden") unless buchungen.size > 0
      temp  = dataA
      temp += buchungen.inject(''){|temp, buchung| temp += buchung.to_dta}
      temp += dataE
      raise IncorrectSizeException.new("Datensatzlänge ist nicht durch 128 teilbar: #{temp.size}") if temp.size % 128 != 0
      temp
    end
    alias :to_s :to_dta

    # Schreibt die DTAUS-Datei
    #
    # Parameter:
    # * filename, Name der zu schreibenden Datei, Standarddateiname ist <tt>DTAUS0.TXT</tt>
    #
    def to_file(filename = 'DTAUS0.TXT')
      File.open(filename, 'w') do |file|
        file << to_dta
      end
    end

  private

    # Checksumme der Kontonummern
    #
    def checksum_konto
      @buchungen.inject(0) {|sum, buchung| sum += buchung.konto.nummer}
    end

    # Checksumme der Bankleitzahlen
    #
    def checksum_blz
      @buchungen.inject(0) {|sum, buchung| sum += buchung.konto.blz}
    end

    # Checksumme der Beträge
    #
    def checksum_betrag
      @buchungen.inject(0) {|sum, buchung| sum += buchung.betrag}
    end

    # Erstellt A-Segment der DTAUS-Datei
    # HEADER<commit_msg>fixed bug: argument refactoring not complete, code does not compile<commit_after>module Dtaus
  
  # Vollständiger DTA-Datensatz mit Header (A), Body (C) und Footer (E)
  class Datensatz

    attr_reader :auftraggeber, :buchungen, :datum, :positiv
    alias :positiv? :positiv

    # Vollständigen DTA-Datensatz erstellen
    #
    # Parameter:
    # * autraggeber, das Dtaus::Konto des Auftraggebers
    # * datum, gewünschtes Datum des Datensatzes,
    #   optional, Default-Wert ist die aktuelle Zeit
    #
    def initialize(_auftraggeber, _datum = Time.now)
      raise DtausException.new("Konto expected, got #{_auftraggeber.class}") unless _auftraggeber.is_a?(Konto)
      raise DtausException.new("Date or Time expected, got #{_datum.class}") unless _datum.is_a?(Date) or _datum.is_a?(Time)

      @datum        = _datum
      @auftraggeber = _auftraggeber
      @buchungen    = []
    end

    # Art der Transaktionen (2 Zeichen)
    #
    # Zum Beispiel:
    # * "LB" für Lastschriften Bankseitig
    # * "LK" für Lastschriften Kundenseitig
    # * "GB" für Gutschriften Bankseitig
    # * "GK" für Gutschriften Kundenseitig
    #
    def typ
     'LK'
    end

    # Eine Buchung zum Datensatz hinzufügen.
    #
    # Es wird geprüft, ob das Vorzeichen identisch mit den bisherigen Vorzeichen ist.
    #
    def add(_buchung)
      raise DtausException.new("Buchung expected, got #{_buchung.class}") unless _buchung.is_a?(Buchung)
      
      # Die erste Buchung bestimmt, ob alle Beträge positiv oder negativ sind.
      @positiv = _buchung.positiv? if @buchungen.empty?
      
      # Wirf Exception wenn Vorzeichen gemischt werden
      unless @positiv == _buchung.positiv?
        raise DtausException.new("Nicht erlaubter Vorzeichenwechsel! "+
                                 "Buchung muss wie die vorherigen Buchungen #{positiv? ? 'positiv' : 'negativ'} sein!")
      end
      
      @buchungen << _buchung
    end

    # DTA-Repräsentation dieses Datensatzes
    #
    # Header (A), Buchungen (C) und Footer (E) werden zusammengefügt
    #
    def to_dta
      raise DtausException.new("Keine Buchungen vorhanden") unless buchungen.size > 0
      
      temp  = dataA
      temp += buchungen.inject(''){|temp, buchung| temp += buchung.to_dta}
      temp += dataE
      
      raise IncorrectSizeException.new("Datensatzlänge ist nicht durch 128 teilbar: #{temp.size}") if temp.size % 128 != 0
      
      temp
    end
    alias :to_s :to_dta

    # Schreibt die DTAUS-Datei
    #
    # Parameter:
    # * filename, Name der zu schreibenden Datei, Default-Wert ist <tt>DTAUS0.TXT</tt>
    #
    def to_file(filename = 'DTAUS0.TXT')
      File.open(filename, 'w') do |file|
        file << to_dta
      end
    end

  private

    # Checksumme der Kontonummern
    #
    def checksum_konto
      @buchungen.inject(0) {|sum, buchung| sum += buchung.konto.nummer}
    end

    # Checksumme der Bankleitzahlen
    #
    def checksum_blz
      @buchungen.inject(0) {|sum, buchung| sum += buchung.konto.blz}
    end

    # Checksumme der Beträge
    #
    def checksum_betrag
      @buchungen.inject(0) {|sum, buchung| sum += buchung.betrag}
    end

    # Erstellt A-Segment der DTAUS-Datei
    # HEADER
{'fraction_non_alphanumeric': 0.09630793401413983, 'fraction_numerical': 0.004399057344854674, 'mean_word_length': 2.6586206896551725, 'pattern_counts': {'":': 0, '<': 15, '<?xml version=': 0, '>': 9, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6575232', 'n_tokens_mistral': 2305, 'n_tokens_neox': 2354, 'n_words': 558}