Last active
January 21, 2020 16:04
-
-
Save madaarya/495d08edee519da15511a3f5abf0065b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Report < ApplicationRecord | |
has_ancestry | |
serialize :account_type_data, Array | |
serialize :total_calculation, Array | |
serialize :meta_data, JSON | |
serialize :outputs, JSON | |
serialize :items, Array | |
mount_uploader :attachment, PaymentReportUploader | |
validates :attachment, presence: true | |
before_create :set_default_value | |
has_many :results, dependent: :destroy | |
has_many :report_activities, dependent: :destroy | |
has_many :expenses, dependent: :destroy | |
has_many :decisions, dependent: :destroy | |
has_many :report_documents, dependent: :destroy | |
has_one :decision, dependent: :destroy | |
has_many :receive_notifications, class_name: 'Notification', foreign_key: :notification_object_id | |
belongs_to :user | |
belongs_to :budget_ceiling, optional: true | |
accepts_nested_attributes_for :report_documents, reject_if: :all_blank, allow_destroy: true | |
scope :approved, -> { joins(:decision).where('decisions.status = (?)', true) } | |
scope :find_by_satker, -> (code) { where("(?) IN (SELECT value FROM OPENJSON(meta_data, '$.kdsatker'))", code.to_s) } | |
validate :report_documents_existence | |
# after_save :process_extract | |
def generate_old_items | |
file_info = Report.get_file_info_location(self.attachment.current_path) | |
extract_target_dir = file_info[:extract_target_dir] | |
number_xmlfilename = file_info[:number_xmlfilename] | |
user = self.user | |
group = user.group | |
subdit = group.groupable_type.eql?("Admin") ? Subdit.find_by_name("Program dan Evaluasi") : group.groupable | |
ditem_data = Report.load_data_expense(extract_target_dir, number_xmlfilename, 'd') | |
if subdit.class.name != 'Province' | |
if !user.has_role?(:admin) and !user.admin_proe? | |
output_codes_only = subdit.subdit_outputs.map { |subdit_output| [subdit_output.output, subdit_output.sub_output] } | |
else | |
output_codes_only = [] | |
end | |
if output_codes_only.present? | |
ditem_data = ditem_data.select { |data| output_codes_only.include?([data[:kdoutput], data[:kdsoutput]]) } | |
end | |
end | |
self.items = ditem_data | |
self.save(validate: false) | |
end | |
def self.count_by_status | |
unapproved = Report.joins(:decisions).where("decisions.status = (?) AND decisions.user_id IS NOT NULL", false).count | |
approved = Report.joins(:decisions).where("decisions.status = (?) AND decisions.user_id IS NOT NULL", true).count | |
pending = Decision.where(user_id: nil).count | |
total = Report.count | |
status_collection = [ | |
{status: 'pending', total: pending}, | |
{status: 'total', total: total}, | |
{status: 'unapproved', total: unapproved}, | |
{status: 'approved', total: approved} | |
] | |
status_collection | |
end | |
def self.collect_meta(data) | |
kdsatker, kddept, kdunit, kdprogram, kdgiat = [], [], [], [], [] | |
data.each do |item| | |
kdsatker << item[:kdsatker] | |
kddept << item[:kddept] | |
kdunit << item[:kdunit] | |
kdprogram << item[:kdprogram] | |
kdgiat << item[:kdgiat] | |
end | |
{kdsatker: kdsatker.uniq, kddept: kddept.uniq, kdunit: kdunit.uniq, kdprogram: kdprogram.uniq, kdgiat: kdgiat.uniq} | |
end | |
def self.find_by_account(collection, account) | |
collection.select { |data| data[:kdakun].eql?(account) }.map{ |item| item[:jumlah].to_i }.sum | |
end | |
def self.reports_by_group(obj, columns) | |
begin | |
class_name = obj.class.name | |
class_id = obj.id | |
Report.select(columns).joins(:user => :group).where("groups.groupable_type = (?) AND groups.groupable_id = (?)", class_name, class_id).by_year | |
rescue | |
Report.none | |
end | |
end | |
def set_default_value | |
self.budget_ceiling_id = BudgetCeiling.last.try(:id) | |
self.status = "unapproved" | |
end | |
def total_became | |
ExpenseBecame.where(report_id: self.id).sum(:total) | |
end | |
def generate_from_database | |
result_data = Result.where(report_id: self.id) | |
result_data.group_by{ |data| data.output.parent }.sort_by{ |k,v| k.code.to_i } | |
end | |
def generate_from_xml(page) | |
user = self.user | |
group = user.group | |
if !user.has_role?(:admin) and !user.admin_proe? | |
subdit = group.groupable | |
if subdit.class.name.eql?('Province') | |
output_codes_only = [] | |
else | |
output_codes_only = subdit.subdit_outputs.map { |subdit_output| [subdit_output.output, subdit_output.sub_output] } | |
end | |
end | |
file_info = Report.get_file_info_location(self.attachment.current_path) | |
extract_target_dir = file_info[:extract_target_dir] | |
number_xmlfilename = file_info[:number_xmlfilename] | |
## Case SEMULA | |
## Load suboutput file | |
msoutput_data = Report.load_data_output(extract_target_dir, number_xmlfilename, 'm') | |
## Load item file | |
mitem_data = Report.load_data_expense(extract_target_dir, number_xmlfilename, 'm') | |
## Case MENJADI | |
## Load suboutput file | |
dsoutput_data = Report.load_data_output(extract_target_dir, number_xmlfilename, 'd') | |
## Load item file | |
ditem_data = Report.load_data_expense(extract_target_dir, number_xmlfilename, 'd') | |
dsoutput_data_ids = dsoutput_data.map { |data| [data[:kdoutput], data[:kdsoutput]] } | |
msoutput_data_ids = msoutput_data.map { |data| [data[:kdoutput], data[:kdsoutput]] } | |
new_items = dsoutput_data_ids - msoutput_data_ids | |
if new_items.present? | |
new_items.each do |item| | |
msoutput_data << dsoutput_data.select { |data| (data[:kdoutput] == item[0]) and (data[:kdsoutput] == item[1]) }.first | |
end | |
end | |
if output_codes_only.present? | |
msoutput_data = msoutput_data.select { |data| output_codes_only.include?([data[:kdoutput], data[:kdsoutput]]) } | |
output_codes_only = subdit.subdit_outputs.map { |subdit_output| [subdit_output.output, subdit_output.sub_output, (subdit_output.components.split(",") rescue nil)] } | |
end | |
moutputs = msoutput_data.group_by { |k| k[:kdoutput] } | |
moutputs.each do |output_code, sub_outputs| | |
sub_outputs.uniq! { |sb| sb[:kdsoutput] } | |
sub_outputs.each do |sub_output| | |
sub_output[:became_obj] = dsoutput_data.detect { |data| (data[:kdoutput] == sub_output[:kdoutput]) and (data[:kdsoutput] == sub_output[:kdsoutput]) } | |
dexpenses_data_arr = [] | |
ditem_data.each do |item| | |
if output_codes_only.present? | |
selected_output = output_codes_only.detect { |code| ((code[0] == item[:kdoutput]) and (item[:kdoutput] == sub_output[:kdoutput])) and ((code[1] == item[:kdsoutput]) and (item[:kdsoutput] == sub_output[:kdsoutput]) ) } | |
if selected_output | |
if selected_output[2].present? | |
if selected_output[2].include? item[:kdkmpnen] | |
selected = true | |
else | |
selected = false | |
end | |
else | |
selected = true | |
end | |
else | |
selected = false | |
end | |
if selected | |
dexpenses_data_arr << item | |
end | |
else | |
if(item[:kdoutput] == sub_output[:kdoutput]) and (item[:kdsoutput] == sub_output[:kdsoutput]) | |
dexpenses_data_arr << item | |
end | |
end | |
end | |
dexpenses_data = dexpenses_data_arr | |
mexpenses_data_arr = [] | |
mitem_data.each do |item| | |
if output_codes_only.present? | |
selected_output = output_codes_only.detect { |code| ((code[0] == item[:kdoutput]) and (item[:kdoutput] == sub_output[:kdoutput])) and ((code[1] == item[:kdsoutput]) and (item[:kdsoutput] == sub_output[:kdsoutput]) ) } | |
if selected_output | |
if selected_output[2].present? | |
if selected_output[2].include? item[:kdkmpnen] | |
selected = true | |
else | |
selected = false | |
end | |
else | |
selected = true | |
end | |
else | |
selected = false | |
end | |
if selected | |
mexpenses_data_arr << item | |
end | |
else | |
if(item[:kdoutput] == sub_output[:kdoutput]) and (item[:kdsoutput] == sub_output[:kdsoutput]) | |
mexpenses_data_arr << item | |
end | |
end | |
end | |
mexpenses_data = mexpenses_data_arr | |
sub_output[:expenses_previous] = mexpenses_data.map { |expense| expense[:jumlah].to_i }.sum | |
sub_output[:expenses_became] = dexpenses_data.map { |expense| expense[:jumlah].to_i }.sum | |
end | |
end | |
data_by_account = if page.to_i < 2 | |
self.account_type_data | |
else | |
[] | |
end | |
{report: moutputs.sort_by{ |k,v| k.to_i }, by_account: data_by_account} | |
end | |
def generate_report_by_account_type | |
file_info = Report.get_file_info_location(self.attachment.current_path) | |
extract_target_dir = file_info[:extract_target_dir] | |
number_xmlfilename = file_info[:number_xmlfilename] | |
msoutput_data = Report.load_data_output(extract_target_dir, number_xmlfilename, 'm') | |
dsoutput_data = Report.load_data_output(extract_target_dir, number_xmlfilename, 'd') | |
ditem_data = Report.load_data_expense(extract_target_dir, number_xmlfilename, 'd') | |
mitem_data = Report.load_data_expense(extract_target_dir, number_xmlfilename, 'm') | |
dsoutput_data_ids = dsoutput_data.map { |data| [data[:kdoutput], data[:kdsoutput]] } | |
msoutput_data_ids = msoutput_data.map { |data| [data[:kdoutput], data[:kdsoutput]] } | |
new_items = dsoutput_data_ids - msoutput_data_ids | |
if new_items.present? | |
new_items.each do |item| | |
msoutput_data << dsoutput_data.select { |data| (data[:kdoutput] == item[0]) and (data[:kdsoutput] == item[1]) }.first | |
end | |
end | |
collection = Report.show_report_by_account_type(mitem_data, ditem_data, msoutput_data, false) | |
data_accounts = [] | |
collection.each_with_index do |account_type, i| | |
total_became = 0 | |
account_type_name = account_type.keys.first | |
account_type.values.each do |account_type_item| | |
account_type_item.each do |code| | |
value_item = code.values.first | |
became_value = value_item[:became]; | |
total_became += became_value if became_value > 0 | |
end | |
end | |
unless total_became.zero? | |
data_accounts << {name: account_type_name, value: total_became} | |
end | |
end | |
data_accounts | |
end | |
def self.account_type_lastest_by_subdit(collection) | |
group_by_subdit = collection.group_by { |data| data.user.group.groupable } | |
data_by_subdit = group_by_subdit.map { |subdit, reports| [subdit.name, reports] } | |
data_by_month = data_by_subdit.map { |arr| [arr[0], Report.report_per_account_type_by_month(arr[1].group_by_month { |u| u.created_at })] } | |
end | |
def self.report_per_account_type_by_month(collection) | |
# puts collection | |
collection.map { |k, v| [k.month, v.sort_by { |data| data.created_at }.last.generate_report_by_account_type] } | |
end | |
def self.show_report_by_account_type(mitem_data, ditem_data, msoutput_data, validation_mode = false) | |
total = ditem_data.map { |item| item[:jumlah].to_i }.sum | |
msoutput_data_outputs = msoutput_data.map { |data| [data[:kdoutput], data[:kdsoutput]] } | |
category_total = [] | |
main_collection = AccountType.get_report_by_account_column.dup | |
main_collection.each do |account_types_item| | |
account_types_item.each do |account_type, codes| | |
total_became = 0 | |
codes.each do |code| | |
key_name = code.keys.first | |
ditem_selected = ditem_data.select { |data| (data[:kdakun] == key_name) and msoutput_data_outputs.include?([data[:kdoutput], data[:kdsoutput]]) } | |
code[key_name][:became] = ditem_selected.map { |item| item[:jumlah].to_i }.sum | |
total_became += code[key_name][:became] | |
unless validation_mode | |
mitem_selected = mitem_data.select { |data| data[:kdakun] == key_name and msoutput_data_outputs.include?([data[:kdoutput], data[:kdsoutput]]) } | |
code[key_name][:previous] = mitem_selected.map { |item| item[:jumlah].to_i }.sum | |
end | |
end | |
category_total << {name: account_types_item.keys.first, total_became: total_became} | |
end | |
end | |
{total: category_total, collection: main_collection, grand_total: total, msoutput_data_outputs: msoutput_data_outputs} | |
end | |
def self.load_components_db(resultid) | |
result_components = ResultComponent.where(result_id: resultid, ancestry: nil) | |
result_components.sort_by { |rk| rk.component.code.to_i } | |
end | |
def self.load_sub_components_db(result_component) | |
result_components = result_component.children | |
result_components.sort_by { |rk| rk.component.code.to_i } | |
end | |
def load_all_components(output_codes_only = []) | |
file_info = Report.get_file_info_location(self.attachment.current_path) | |
extract_target_dir = file_info[:extract_target_dir] | |
number_xmlfilename = file_info[:number_xmlfilename] | |
## Case SEMULA | |
## Load component file | |
mkmpnen_data = Report.load_data_component(extract_target_dir, number_xmlfilename, 'm') | |
## Case MENJADI | |
## Load component file | |
dkmpnen_data = Report.load_data_component(extract_target_dir, number_xmlfilename, 'd') | |
mkmpnen_data_ids = mkmpnen_data.map { |data| [data[:kdoutput], data[:kdsoutput], data[:kdkmpnen]] } | |
dkmpnen_data_ids = dkmpnen_data.map { |data| [data[:kdoutput], data[:kdsoutput], data[:kdkmpnen]] } | |
new_items = dkmpnen_data_ids - mkmpnen_data_ids | |
if new_items.present? | |
new_items.each do |item| | |
mkmpnen_data << dkmpnen_data.select { |data| (data[:kdoutput] == item[0]) and (data[:kdsoutput] == item[1]) and (item[2] == data[:kdkmpnen]) }.first | |
end | |
end | |
# if output_codes_only.present? | |
# mkmpnen_data = mkmpnen_data.select { |data| output_codes_only.include?([data[:kdoutput], data[:kdsoutput]]) } | |
# end | |
if output_codes_only.present? | |
new_arr = [] | |
mkmpnen_data.each do |data| | |
selected_output = output_codes_only.detect { |code| code[0] == data[:kdoutput] and code[1] == data[:kdsoutput] } | |
if selected_output | |
if selected_output[2].present? | |
if selected_output[2].include? data[:kdkmpnen] | |
selected = true | |
else | |
selected = false | |
end | |
else | |
selected = true | |
end | |
else | |
selected = false | |
end | |
if selected | |
new_arr << data | |
end | |
end | |
mkmpnen_data = new_arr | |
end | |
{mkmpnen_data: mkmpnen_data} | |
end | |
def load_components(kdoutput, kdsoutput) | |
file_info = Report.get_file_info_location(self.attachment.current_path) | |
extract_target_dir = file_info[:extract_target_dir] | |
number_xmlfilename = file_info[:number_xmlfilename] | |
## Case SEMULA | |
## Load component file | |
mkmpnen_data = Report.load_data_component(extract_target_dir, number_xmlfilename, 'm') | |
## Load item file | |
mitem_data = Report.load_data_expense(extract_target_dir, number_xmlfilename, 'm') | |
## Case MENJADI | |
## Load component file | |
dkmpnen_data = Report.load_data_component(extract_target_dir, number_xmlfilename, 'd') | |
## Load item file | |
ditem_data = Report.load_data_expense(extract_target_dir, number_xmlfilename, 'd') | |
mkmpnen_data_ids = mkmpnen_data.map { |data| [data[:kdoutput], data[:kdsoutput], data[:kdkmpnen]] } | |
dkmpnen_data_ids = dkmpnen_data.map { |data| [data[:kdoutput], data[:kdsoutput], data[:kdkmpnen]] } | |
new_items = dkmpnen_data_ids - mkmpnen_data_ids | |
if new_items.present? | |
new_items.each do |item| | |
mkmpnen_data << dkmpnen_data.select { |data| (data[:kdoutput] == item[0]) and (data[:kdsoutput] == item[1]) and (item[2] == data[:kdkmpnen]) }.first | |
end | |
end | |
components = mkmpnen_data.select { |kmpnen| (kmpnen[:kdoutput] == kdoutput) and (kmpnen[:kdsoutput] == kdsoutput) } | |
components.each do |component| | |
component[:expenses_previous] = mitem_data.select { |item| (item[:kdoutput] == kdoutput) and (item[:kdsoutput] == kdsoutput) and (item[:kdkmpnen] == component[:kdkmpnen]) }.map { |expense| expense[:jumlah].to_i }.sum | |
component[:expenses_became] = ditem_data.select { |item| (item[:kdoutput] == kdoutput) and (item[:kdsoutput] == kdsoutput) and (item[:kdkmpnen] == component[:kdkmpnen]) }.map { |expense| expense[:jumlah].to_i }.sum | |
end | |
components.sort_by { |component| component[:kdkmpnen].to_i } | |
end | |
def load_all_sub_component(output_codes_only = []) | |
file_info = Report.get_file_info_location(self.attachment.current_path) | |
extract_target_dir = file_info[:extract_target_dir] | |
number_xmlfilename = file_info[:number_xmlfilename] | |
## Case SEMULA | |
## Load sub component file | |
mskmpnen_data = Report.load_data_sub_component(extract_target_dir, number_xmlfilename, 'm') | |
## Case MENJADI | |
## Load sub component file | |
dskmpnen_data = Report.load_data_sub_component(extract_target_dir, number_xmlfilename, 'd') | |
mskmpnen_data_ids = mskmpnen_data.map { |data| [data[:kdoutput], data[:kdsoutput], data[:kdkmpnen], data[:kdskmpnen]] } | |
dskmpnen_data_ids = dskmpnen_data.map { |data| [data[:kdoutput], data[:kdsoutput], data[:kdkmpnen], data[:kdskmpnen]] } | |
new_items = dskmpnen_data_ids - mskmpnen_data_ids | |
if new_items.present? | |
new_items.each do |item| | |
mskmpnen_data << dskmpnen_data.select { |data| (data[:kdoutput] == item[0]) and (data[:kdsoutput] == item[1]) and (item[2] == data[:kdkmpnen]) and (item[3] == data[:kdskmpnen]) }.first | |
end | |
end | |
if output_codes_only.present? | |
# mskmpnen_data = mskmpnen_data.select { |data| output_codes_only.include?([data[:kdoutput], data[:kdsoutput]]) } | |
new_mskmpnen_data = [] | |
mskmpnen_data.each do |data| | |
selected_output = output_codes_only.detect { |code| code[0] == data[:kdoutput] and code[1] == data[:kdsoutput] } | |
if selected_output | |
if selected_output[2].present? | |
if selected_output[2].include? data[:kdkmpnen] | |
selected = true | |
else | |
selected = false | |
end | |
else | |
selected = true | |
end | |
else | |
selected = false | |
end | |
if selected | |
new_mskmpnen_data << data | |
end | |
end | |
mskmpnen_data = new_mskmpnen_data | |
end | |
{mskmpnen_data: mskmpnen_data} | |
end | |
def load_all_expenses(output_codes_only = []) | |
file_info = Report.get_file_info_location(self.attachment.current_path) | |
extract_target_dir = file_info[:extract_target_dir] | |
number_xmlfilename = file_info[:number_xmlfilename] | |
mitem_data = Report.load_data_expense(extract_target_dir, number_xmlfilename, 'm') | |
## Load item file | |
ditem_data = Report.load_data_expense(extract_target_dir, number_xmlfilename, 'd') | |
if output_codes_only.present? | |
new_mitem_data = [] | |
new_ditem_data = [] | |
# mitem_data = mitem_data.select { |data| output_codes_only.include?([data[:kdoutput], data[:kdsoutput]]) } | |
mitem_data.each do |data| | |
selected_output = output_codes_only.detect { |code| code[0] == data[:kdoutput] and code[1] == data[:kdsoutput] } | |
if selected_output | |
if selected_output[2].present? | |
if selected_output[2].include? data[:kdkmpnen] | |
selected = true | |
else | |
selected = false | |
end | |
else | |
selected = true | |
end | |
else | |
selected = false | |
end | |
if selected | |
new_mitem_data << data | |
end | |
end | |
mitem_data = new_mitem_data | |
ditem_data.each do |data| | |
selected_output = output_codes_only.detect { |code| code[0] == data[:kdoutput] and code[1] == data[:kdsoutput] } | |
if selected_output | |
if selected_output[2].present? | |
if selected_output[2].include? data[:kdkmpnen] | |
selected = true | |
else | |
selected = false | |
end | |
else | |
selected = true | |
end | |
else | |
selected = false | |
end | |
if selected | |
new_ditem_data << data | |
end | |
end | |
ditem_data = new_ditem_data | |
# ditem_data = ditem_data.select { |data| output_codes_only.include?([data[:kdoutput], data[:kdsoutput]]) } | |
end | |
{mitem_data: mitem_data, ditem_data: ditem_data} | |
end | |
def load_sub_component(kdoutput, kdsoutput, kdkmpnen) | |
file_info = Report.get_file_info_location(self.attachment.current_path) | |
extract_target_dir = file_info[:extract_target_dir] | |
number_xmlfilename = file_info[:number_xmlfilename] | |
## Case SEMULA | |
## Load sub component file | |
mskmpnen_data = Report.load_data_sub_component(extract_target_dir, number_xmlfilename, 'm') | |
## Load item file | |
mitem_data = Report.load_data_expense(extract_target_dir, number_xmlfilename, 'm') | |
## Case MENJADI | |
## Load sub component file | |
dskmpnen_data = Report.load_data_sub_component(extract_target_dir, number_xmlfilename, 'd') | |
## Load item file | |
ditem_data = Report.load_data_expense(extract_target_dir, number_xmlfilename, 'd') | |
mskmpnen_data_ids = mskmpnen_data.map { |data| [data[:kdoutput], data[:kdsoutput], data[:kdkmpnen], data[:kdskmpnen]] } | |
dskmpnen_data_ids = dskmpnen_data.map { |data| [data[:kdoutput], data[:kdsoutput], data[:kdkmpnen], data[:kdskmpnen]] } | |
new_items = dskmpnen_data_ids - mskmpnen_data_ids | |
if new_items.present? | |
new_items.each do |item| | |
mskmpnen_data << dskmpnen_data.select { |data| (data[:kdoutput] == item[0]) and (data[:kdsoutput] == item[1]) and (item[2] == data[:kdkmpnen]) and (item[3] == data[:kdskmpnen]) }.first | |
end | |
end | |
sub_components = mskmpnen_data.select { |sub_kmpnen| (sub_kmpnen[:kdoutput] == kdoutput) and (sub_kmpnen[:kdsoutput] == kdsoutput) and (sub_kmpnen[:kdkmpnen] == kdkmpnen) } | |
sub_components.each do |sub_component| | |
sub_component[:expenses] = mitem_data.select { |item| (item[:kdoutput] == kdoutput) and (item[:kdsoutput] == kdsoutput) and (item[:kdkmpnen] == kdkmpnen) and (item[:kdskmpnen] == sub_component[:kdskmpnen]) } | |
sub_component[:expenses].each do |expense| | |
expense[:expenses_became] = ditem_data.detect { |item| (item[:noitem] == expense[:noitem]) and (item[:kdoutput] == expense[:kdoutput]) and (item[:kdsoutput] == expense[:kdsoutput]) and (item[:kdkmpnen] == expense[:kdkmpnen]) and (item[:kdskmpnen] == expense[:kdskmpnen]) } | |
end | |
end | |
sub_components.sort_by { |sub_component| sub_component[:kdskmpnen] } | |
end | |
def get_all_account_code | |
expenses.map(&:account_code).uniq | |
end | |
def grand_total | |
self.total_calculation.map { |item| item['total_became'] }.sum | |
end | |
def compare_with_report_prev | |
unless self.root? | |
report_prev = self.parent | |
file_info_current = Report.get_file_info_location(self.attachment.current_path) | |
extract_target_dir_current = file_info_current[:extract_target_dir] | |
number_xmlfilename_current = file_info_current[:number_xmlfilename] | |
ditem_data_current = Report.load_data_expense(extract_target_dir_current, number_xmlfilename_current, 'd') | |
file_info_prev = Report.get_file_info_location(report_prev.attachment.current_path) | |
extract_target_dir_prev = file_info_prev[:extract_target_dir] | |
number_xmlfilename_prev = file_info_prev[:number_xmlfilename] | |
ditem_data_prev = Report.load_data_expense(extract_target_dir_prev, number_xmlfilename_prev, 'd') | |
ditem_data_current_ids = ditem_data_current.map { |data| [data[:kdoutput], data[:kdsoutput], data[:kdkmpnen], data[:kdskmpnen], data[:kdakun], data[:nmitem] ] } | |
ditem_data_prev_ids = ditem_data_prev.map { |data| [data[:kdoutput], data[:kdsoutput], data[:kdkmpnen], data[:kdskmpnen], data[:kdakun], data[:nmitem] ] } | |
new_items = ditem_data_current_ids - ditem_data_prev_ids | |
collection = ditem_data_prev | |
collection_updates = [] | |
if new_items.present? | |
new_items.each do |item| | |
collection << ditem_data_current.detect { |data| (data[:kdoutput] == item[0]) and | |
(data[:kdsoutput] == item[1]) and | |
(item[2] == data[:kdkmpnen]) and | |
(item[3] == data[:kdskmpnen]) and | |
(item[4] == data[:kdakun]) and | |
(item[5] == data[:nmitem]) } | |
end | |
end | |
collection.each do |item| | |
item[:prev] = ditem_data_prev.detect { |data| (data[:kdoutput] == item[:kdoutput]) and | |
(data[:kdsoutput] == item[:kdsoutput]) and | |
(item[:kdkmpnen] == data[:kdkmpnen]) and | |
(item[:kdskmpnen] == data[:kdskmpnen]) and | |
(item[:kdakun] == data[:kdakun]) and | |
(item[:nmitem] == data[:nmitem]) } | |
item[:became] = ditem_data_current.detect { |data| (data[:kdoutput] == item[:kdoutput]) and | |
(data[:kdsoutput] == item[:kdsoutput]) and | |
(item[:kdkmpnen] == data[:kdkmpnen]) and | |
(item[:kdskmpnen] == data[:kdskmpnen]) and | |
(item[:kdakun] == data[:kdakun]) and | |
(item[:nmitem] == data[:nmitem]) } | |
end | |
collection.each do |item| | |
begin | |
if item[:became][:jumlah] != item[:prev][:jumlah] | |
collection_updates << item | |
end | |
rescue Exception => e | |
collection_updates << item | |
puts item | |
end | |
end | |
puts "collection_updates size : #{collection_updates.size}" | |
# puts collection_updates | |
end | |
end | |
def self.load_file_to_xml(file) | |
data_xml = File.open(file) | |
Ox.load(data_xml.read, mode: :hash) | |
end | |
def self.load_data_output(extract_target_dir, number_xmlfilename, type) | |
dsoutput_file = extract_target_dir + "/#{type}_soutput#{number_xmlfilename}.XML" | |
dsoutput_data = Report.load_file_to_xml(dsoutput_file) | |
dsoutput_data[:VFPData].delete_if { |k| !k[:c_soutput].present? }.map{ |k| k.values }.flatten.delete_if { |k| k[:kdgiat] != '5628' } | |
end | |
def self.load_data_component(extract_target_dir, number_xmlfilename, type) | |
dkmpnen_file = extract_target_dir + "/#{type}_kmpnen#{number_xmlfilename}.XML" | |
dkmpnen_data = Report.load_file_to_xml(dkmpnen_file) | |
dkmpnen_data[:VFPData].delete_if { |k| !k[:c_kmpnen].present? }.map{ |k| k.values }.flatten.delete_if { |k| k[:kdgiat] != '5628' } | |
end | |
def self.load_data_sub_component(extract_target_dir, number_xmlfilename, type) | |
dskmpnen_file = extract_target_dir + "/#{type}_skmpnen#{number_xmlfilename}.XML" | |
dskmpnen_data = Report.load_file_to_xml(dskmpnen_file) | |
dskmpnen_data[:VFPData].delete_if { |k| !k[:c_skmpnen].present? }.map{ |k| k.values }.flatten.delete_if { |k| k[:kdgiat] != '5628' } | |
end | |
def self.load_data_expense(extract_target_dir, number_xmlfilename, type) | |
ditem_file = extract_target_dir + "/#{type}_item#{number_xmlfilename}.XML" | |
ditem_data = Report.load_file_to_xml(ditem_file) | |
ditem_data[:VFPData].delete_if { |k| !k[:c_item].present? }.map{ |k| k.values }.flatten.delete_if { |k| k[:kdgiat] != '5628' } | |
end | |
def self.get_file_info_location(file_path) | |
filename = File.basename(file_path, File.extname(file_path)) | |
number_xmlfilename = filename.split('_')[1..-1].join("") | |
extract_target_dir = File.dirname(file_path) + "/#{filename}" | |
return {extract_target_dir: extract_target_dir, number_xmlfilename: number_xmlfilename} | |
end | |
private | |
def report_documents_existence | |
unless user.group.groupable_type.eql?("Admin") | |
report_document_types = ReportDocumentType.where(required: true) | |
report_document_types.each do |report_document_type| | |
report_documents.select {|report_document| report_document.report_document_type_id.eql?(report_document_type.id) }.each do |report_document| | |
errors.add(report_document_type.name.to_sym, "tidak boleh kosong") unless report_document.attachment.present? | |
end | |
end | |
end | |
end | |
def process_extract | |
response = ExtractDataFile.process_file(attachment.current_path, id) | |
unless response[:stderr_str].blank? | |
errors.add(:attachment, "format file tidak sesuai") | |
raise ActiveRecord::RecordInvalid.new(self) | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment