<commit_before># frozen_string_literal: true

namespace :bp1step do
  desc 'Create Letters from Portal CB RF'
  # создание новых писем из файлов, принятых и расшифрованных с Портала Банка России
  task letters_from_portal_cb: :environment do
    PublicActivity.enabled = false # отключить протоколирование изменений
    logger = Logger.new('log/bp1step.log') # протокол работы
    logger.info '===== ' + Time.current.strftime('%d.%m.%Y %H:%M:%S') + ' :letters_from_portal_cb'

    pathfrom =  Rails.root.join(Rails.configuration.x.letters.path_to_portal, 'in') # папка, куда выгружает информацию наш загрузчик с Портала Банка России
    logger.info pathfrom.to_s

    # .select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
    dirs = 0
    Dir.entries(pathfrom).each do |entry|
      next if ['..', '.'].include? entry
      next unless File.directory? pathfrom.join(entry) # process only directories

      check_directory pathfrom.join(entry)
      dirs += 1
    end
    logger.info "      #{dirs} directories processed"
  end

  def check_directory(name)
    return unless File.file? name.join('flag.txt')

    message_id = File.basename name
    create_letter_from_json name, message_id unless ['.', '..'].include? message_id
  end

  def create_letter_from_json(name, id)
    json_file_name = name.join(id + '.json')
    return unless File.file? json_file_name # отсутствует сообщение
    return if File.file? name.join(id + '.bp1step') # папка уже обработана BP1Step

    json_file = File.read(json_file_name)
    json = JSON.parse json_file
    letter = Letter.new(status: 0, number: json['RegNumber'], sender: get_sender(name), subject: json['Text'], source: 'Портал БР')
    letter.date = Date.parse json['CreationDate'] || Time.current
    letter.duedate = (Time.current + 10.days).strftime('%d.%m.%Y') # срок исполнения - даем 10 дней по умолчанию
    letter_files = json['Files']
    letter.body = ''
    letter_files.each do |file|
      letter.body += file['Name'] + "\n" unless file_exclude? file['Name']
    end
    return unless letter.save! # письмо создали, теперь присоедним файлы

    letter_files.each do |file|
      add_file_to_letter(letter.id, file, id) unless file_exclude? file['Name']
    end
    File.open(name.join(id + '.bp1step'), 'w') { |file| file.write(letter.id.to_s) } # признак обработки данного письма с портала
  end

  def add_file_to_letter(letter_id, file, message_id)
    file_name = file['Name']
    return if file_name.downcase.start_with? 'список рассылки'

    path_from = Rails.root.join(ails.configuration.x.letters.path_to_portal, 'in', message_id)
    letter_appendix = LetterAppendix.new(letter_id: letter_id)
    File.open path_from.join(file_name) do |f|
      letter_appendix.appendix = f
      letter_appendix.save!<commit_msg>fix: fixed Subject - cut 200 ru symbols and Sender - Портал5 БР<commit_after># frozen_string_literal: true

namespace :bp1step do
  desc 'Create Letters from Portal CB RF'
  # создание новых писем из файлов, принятых и расшифрованных с Портала Банка России
  task letters_from_portal_cb: :environment do
    PublicActivity.enabled = false # отключить протоколирование изменений
    logger = Logger.new('log/bp1step.log') # протокол работы
    logger.info '===== ' + Time.current.strftime('%d.%m.%Y %H:%M:%S') + ' :letters_from_portal_cb'

    pathfrom =  Rails.root.join(Rails.configuration.x.letters.path_to_portal, 'in') # папка, куда выгружает информацию наш загрузчик с Портала Банка России
    logger.info pathfrom.to_s

    # .select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
    dirs = 0
    Dir.entries(pathfrom).each do |entry|
      next if ['..', '.'].include? entry
      next unless File.directory? pathfrom.join(entry) # process only directories

      check_directory pathfrom.join(entry)
      dirs += 1
    end
    logger.info "      #{dirs} directories processed"
  end

  def check_directory(name)
    return unless File.file? name.join('flag.txt')

    message_id = File.basename name
    create_letter_from_json name, message_id unless ['.', '..'].include? message_id
  end

  def create_letter_from_json(name, id)
    json_file_name = name.join(id + '.json')
    return unless File.file? json_file_name # отсутствует сообщение
    return if File.file? name.join(id + '.bp1step') # папка уже обработана BP1Step

    json_file = File.read(json_file_name)
    json = JSON.parse json_file
    letter = Letter.new(status: 0, number: json['RegNumber'], sender: get_sender(name), subject: json['Text'][0..199], source: 'Портал5 БР')
    letter.date = Date.parse json['CreationDate'] || Time.current
    letter.duedate = (Time.current + 10.days).strftime('%d.%m.%Y') # срок исполнения - даем 10 дней по умолчанию
    letter_files = json['Files']
    letter.body = ''
    letter_files.each do |file|
      letter.body += file['Name'] + "\n" unless file_exclude? file['Name']
    end
    return unless letter.save! # письмо создали, теперь присоедним файлы

    letter_files.each do |file|
      add_file_to_letter(letter.id, file, id) unless file_exclude? file['Name']
    end
    File.open(name.join(id + '.bp1step'), 'w') { |file| file.write(letter.id.to_s) } # признак обработки данного письма с портала
  end

  def add_file_to_letter(letter_id, file, message_id)
    file_name = file['Name']
    return if file_name.downcase.start_with? 'список рассылки'

    path_from = Rails.root.join(ails.configuration.x.letters.path_to_portal, 'in', message_id)
    letter_appendix = LetterAppendix.new(letter_id: letter_id)
    File.open path_from.join(file_name) do |f|
      letter_appendix.appendix = f
      letter_appendix.save!
{'fraction_non_alphanumeric': 0.1252839419884676, 'fraction_numerical': 0.005766206535034073, 'mean_word_length': 3.830379746835443, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2735843', 'n_tokens_mistral': 2049, 'n_tokens_neox': 2061, 'n_words': 461}