sp-duh 2.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +661 -0
- data/README.md +2 -0
- data/Rakefile +32 -0
- data/config/i18n/i18n.xlsx +0 -0
- data/config/initializers/active_record/connection_adapters_postgre_sql_adapter.rb +165 -0
- data/config/initializers/active_record/migration_without_transaction.rb +4 -0
- data/config/initializers/active_record/migrator.rb +34 -0
- data/config/initializers/rails/generators.rb +13 -0
- data/config/jsonapi/settings.yml +14 -0
- data/config/locales/pt.yml +15 -0
- data/lib/generators/accounting_migration/accounting_migration_generator.rb +10 -0
- data/lib/generators/accounting_migration/templates/migration.rb +42 -0
- data/lib/generators/accounting_payroll_migration/accounting_payroll_migration_generator.rb +10 -0
- data/lib/generators/accounting_payroll_migration/templates/migration.rb +73 -0
- data/lib/generators/sharded_migration/sharded_migration_generator.rb +10 -0
- data/lib/generators/sharded_migration/templates/migration.rb +45 -0
- data/lib/sp-duh.rb +32 -0
- data/lib/sp/duh.rb +180 -0
- data/lib/sp/duh/adapters/pg/text_decoder/json.rb +15 -0
- data/lib/sp/duh/adapters/pg/text_encoder/json.rb +15 -0
- data/lib/sp/duh/db/transfer/backup.rb +71 -0
- data/lib/sp/duh/db/transfer/restore.rb +89 -0
- data/lib/sp/duh/engine.rb +35 -0
- data/lib/sp/duh/exceptions.rb +70 -0
- data/lib/sp/duh/i18n/excel_loader.rb +26 -0
- data/lib/sp/duh/jsonapi/adapters/base.rb +168 -0
- data/lib/sp/duh/jsonapi/adapters/db.rb +36 -0
- data/lib/sp/duh/jsonapi/adapters/raw_db.rb +77 -0
- data/lib/sp/duh/jsonapi/configuration.rb +167 -0
- data/lib/sp/duh/jsonapi/doc/apidoc_documentation_format_generator.rb +286 -0
- data/lib/sp/duh/jsonapi/doc/generator.rb +32 -0
- data/lib/sp/duh/jsonapi/doc/schema_catalog_helper.rb +97 -0
- data/lib/sp/duh/jsonapi/doc/victor_pinus_metadata_format_parser.rb +374 -0
- data/lib/sp/duh/jsonapi/exceptions.rb +56 -0
- data/lib/sp/duh/jsonapi/model/base.rb +25 -0
- data/lib/sp/duh/jsonapi/model/concerns/attributes.rb +94 -0
- data/lib/sp/duh/jsonapi/model/concerns/model.rb +42 -0
- data/lib/sp/duh/jsonapi/model/concerns/persistence.rb +221 -0
- data/lib/sp/duh/jsonapi/model/concerns/serialization.rb +59 -0
- data/lib/sp/duh/jsonapi/parameters.rb +44 -0
- data/lib/sp/duh/jsonapi/resource_publisher.rb +28 -0
- data/lib/sp/duh/jsonapi/service.rb +110 -0
- data/lib/sp/duh/migrations.rb +47 -0
- data/lib/sp/duh/migrations/migrator.rb +41 -0
- data/lib/sp/duh/repl.rb +193 -0
- data/lib/sp/duh/version.rb +25 -0
- data/lib/tasks/db_utils.rake +98 -0
- data/lib/tasks/doc.rake +27 -0
- data/lib/tasks/i18n.rake +23 -0
- data/lib/tasks/oauth.rake +29 -0
- data/lib/tasks/transfer.rake +48 -0
- data/lib/tasks/xls2jrxml.rake +15 -0
- data/test/jsonapi/server.rb +67 -0
- data/test/tasks/test.rake +10 -0
- metadata +170 -0
data/README.md
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
#
|
3
|
+
# Copyright (c) 2011-2017 Cloudware S.A. All rights reserved.
|
4
|
+
#
|
5
|
+
# This file is part of sp-duh.
|
6
|
+
#
|
7
|
+
# sp-duh is free software: you can redistribute it and/or modify
|
8
|
+
# it under the terms of the GNU Affero General Public License as published by
|
9
|
+
# the Free Software Foundation, either version 3 of the License, or
|
10
|
+
# (at your option) any later version.
|
11
|
+
#
|
12
|
+
# sp-duh is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
+
# GNU General Public License for more details.
|
16
|
+
#
|
17
|
+
# You should have received a copy of the GNU Affero General Public License
|
18
|
+
# along with sp-duh. If not, see <http://www.gnu.org/licenses/>.
|
19
|
+
#
|
20
|
+
# encoding: utf-8
|
21
|
+
#
|
22
|
+
require "bundler/gem_tasks"
|
23
|
+
require 'sp-duh'
|
24
|
+
|
25
|
+
load 'lib/tasks/db_utils.rake'
|
26
|
+
load 'lib/tasks/i18n.rake'
|
27
|
+
load 'lib/tasks/xls2jrxml.rake'
|
28
|
+
|
29
|
+
# Allow calling common tasks either from the app (using its environment) or locally from the gem
|
30
|
+
# In this case, open the connection to the database
|
31
|
+
task :environment => :pg_connect do
|
32
|
+
end
|
Binary file
|
@@ -0,0 +1,165 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module ConnectionAdapters
|
3
|
+
class PostgreSQLAdapter
|
4
|
+
def active?
|
5
|
+
true
|
6
|
+
end
|
7
|
+
|
8
|
+
def initialize_with_redis_connection(connection, logger, connection_parameters, config)
|
9
|
+
@redis_connection = Rails.application.redis.optimizations.instance_variable_get(:@data)
|
10
|
+
initialize_without_redis_connection(connection, logger, connection_parameters, config)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def configure_connection_with_mappings
|
16
|
+
# Build Ruby <-> PostgreSQL type mappings
|
17
|
+
results_map = PG::BasicTypeMapForResults.new(@connection, @redis_connection)
|
18
|
+
queries_map = PG::BasicTypeMapForQueries.new(@connection, @redis_connection)
|
19
|
+
|
20
|
+
# Add a decoder for the NUMERIC PostgreSQL data type
|
21
|
+
results_map.add_coder PG::TextDecoder::Float.new(oid: 1700, name: 'float8')
|
22
|
+
# Fix: Warning: no type cast defined for type "name" with oid 19. Please cast this type explicitly to TEXT to be safe for future changes.
|
23
|
+
results_map.add_coder PG::TextDecoder::String.new(oid: 19, name: 'text')
|
24
|
+
# Fix: Warning: no type cast defined for type "regproc" with oid 24. Please cast this type explicitly to TEXT to be safe for future changes.
|
25
|
+
results_map.add_coder PG::TextDecoder::String.new(oid: 24, name: 'text')
|
26
|
+
|
27
|
+
# Add decoders for the JSON and JSONB data types (using our custom decoder class)
|
28
|
+
results_map.add_coder SP::Duh::Adapters::PG::TextDecoder::Json.new(oid: 114, name: 'json')
|
29
|
+
results_map.add_coder SP::Duh::Adapters::PG::TextDecoder::Json.new(oid: 199, name: '_json')
|
30
|
+
results_map.add_coder SP::Duh::Adapters::PG::TextDecoder::Json.new(oid: 3802, name: 'jsonb')
|
31
|
+
results_map.add_coder SP::Duh::Adapters::PG::TextDecoder::Json.new(oid: 3807, name: '_jsonb')
|
32
|
+
|
33
|
+
# Fix: Remove decoder for Date and Timestamp
|
34
|
+
#<PG::TextDecoder::Date:0x0000000857dcf0 "date" oid=1082>,
|
35
|
+
results_map.rm_coder(0, 1082)
|
36
|
+
|
37
|
+
#<PG::TextDecoder::TimestampWithoutTimeZone:0x0000000857db38 "timestamp" oid=1114>,
|
38
|
+
results_map.rm_coder(0, 1114)
|
39
|
+
|
40
|
+
#<PG::TextDecoder::TimestampWithTimeZone:0x0000000857d958 "timestamptz" oid=1184>,
|
41
|
+
results_map.rm_coder(0, 1184)
|
42
|
+
|
43
|
+
#<PG::TextDecoder::Array:0x0000000868cdf8 "_timestamp" oid=1115>,
|
44
|
+
results_map.rm_coder(0, 1115)
|
45
|
+
|
46
|
+
#<PG::TextDecoder::Array:0x0000000868cd30 "_date" oid=1182>,
|
47
|
+
results_map.rm_coder(0, 1182)
|
48
|
+
|
49
|
+
#<PG::TextDecoder::Array:0x0000000868cc40 "_timestamptz" oid=1185>,
|
50
|
+
results_map.rm_coder(0, 1185)
|
51
|
+
|
52
|
+
# <PG::TextDecoder::Bytea:0x007f96afcc1aa8 "bytea" oid=17>,
|
53
|
+
results_map.rm_coder(0, 17)
|
54
|
+
|
55
|
+
# Set PostgreSQL type mappings
|
56
|
+
@connection.type_map_for_results = results_map
|
57
|
+
@connection.type_map_for_queries = queries_map
|
58
|
+
|
59
|
+
configure_connection_without_mappings
|
60
|
+
end
|
61
|
+
|
62
|
+
# Override methods to store catalog data in Redis
|
63
|
+
%w(column_definitions primary_key table_exists?).each do |method|
|
64
|
+
method_name, punctuation = method.to_s.sub(/([?!=])$/, ''), $1
|
65
|
+
|
66
|
+
class_eval <<-METHOD, __FILE__, __LINE__ + 1
|
67
|
+
def #{method_name}_with_redis_cache#{punctuation}(table_name)
|
68
|
+
if !!@redis_connection
|
69
|
+
@redis_connection.get("postgresql:#{method_name}:\#{table_name}") || begin
|
70
|
+
@redis_connection.set("postgresql:#{method_name}:\#{table_name}", d = #{method_name}_without_redis_cache#{punctuation}(table_name)) ; d
|
71
|
+
end
|
72
|
+
else
|
73
|
+
#{method_name}_without_redis_cache#{punctuation}(table_name)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
alias_method_chain :#{method}, :redis_cache
|
78
|
+
METHOD
|
79
|
+
end
|
80
|
+
|
81
|
+
def disable_referential_integrity_with_foreign_keys(&block)
|
82
|
+
if Rails.env.test?
|
83
|
+
transaction do
|
84
|
+
begin
|
85
|
+
execute "SET CONSTRAINTS ALL DEFERRED"
|
86
|
+
yield
|
87
|
+
ensure
|
88
|
+
execute "SET CONSTRAINTS ALL IMMEDIATE"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
else
|
92
|
+
disable_referential_integrity_without_foreign_keys &block
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
alias_method_chain :configure_connection, :mappings
|
97
|
+
alias_method_chain :disable_referential_integrity, :foreign_keys
|
98
|
+
alias_method_chain :initialize, :redis_connection
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# This module MUST be loaded before the #configure_connection_with_mappings method is called
|
104
|
+
module PG
|
105
|
+
class BasicTypeMapForResults
|
106
|
+
def initialize_with_redis_connection(connection, redis_connection = nil)
|
107
|
+
@redis_connection = redis_connection
|
108
|
+
initialize_without_redis_connection connection
|
109
|
+
end
|
110
|
+
|
111
|
+
alias_method_chain :initialize, :redis_connection
|
112
|
+
end
|
113
|
+
|
114
|
+
class BasicTypeMapForQueries
|
115
|
+
def initialize_with_redis_connection(connection, redis_connection = nil)
|
116
|
+
@redis_connection = redis_connection
|
117
|
+
initialize_without_redis_connection connection
|
118
|
+
end
|
119
|
+
|
120
|
+
alias_method_chain :initialize, :redis_connection
|
121
|
+
end
|
122
|
+
|
123
|
+
module BasicTypeRegistry
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
def build_coder_maps(connection)
|
128
|
+
if !!@redis_connection
|
129
|
+
@redis_connection.get('postgresql:coder-maps') || begin
|
130
|
+
@redis_connection.set('postgresql:coder-maps', m = get_coder_maps_from_database(connection)) ; m
|
131
|
+
end
|
132
|
+
else
|
133
|
+
get_coder_maps_from_database(connection)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def get_coder_maps_from_database(connection)
|
138
|
+
result = connection.exec(if supports_ranges?(connection)
|
139
|
+
<<-SQL
|
140
|
+
SELECT n.nspname, t.oid, t.typname, t.typelem, t.typdelim, t.typinput, r.rngsubtype
|
141
|
+
FROM pg_type as t
|
142
|
+
LEFT JOIN pg_range as r ON oid = rngtypid
|
143
|
+
LEFT JOIN pg_namespace n ON n.oid = t.typnamespace
|
144
|
+
WHERE n.nspname IN ('pg_catalog', 'public')
|
145
|
+
SQL
|
146
|
+
else
|
147
|
+
<<-SQL
|
148
|
+
SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput
|
149
|
+
FROM pg_type as t
|
150
|
+
SQL
|
151
|
+
end)
|
152
|
+
|
153
|
+
[
|
154
|
+
[0, :encoder, PG::TextEncoder::Array],
|
155
|
+
[0, :decoder, PG::TextDecoder::Array],
|
156
|
+
[1, :encoder, nil],
|
157
|
+
[1, :decoder, nil],
|
158
|
+
].inject([]) do |h, (format, direction, arraycoder)|
|
159
|
+
h[format] ||= {}
|
160
|
+
h[format][direction] = CoderMap.new result, CODERS_BY_NAME[format][direction], format, arraycoder
|
161
|
+
h
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
class Migrator
|
3
|
+
cattr_accessor :current_migration_for_transaction_test
|
4
|
+
|
5
|
+
ActiveRecord::Base.connection.instance_eval do
|
6
|
+
alias :old_supports_ddl_transactions? :supports_ddl_transactions?
|
7
|
+
|
8
|
+
def supports_ddl_transactions?
|
9
|
+
begin
|
10
|
+
require File.expand_path(ActiveRecord::Migrator.current_migration_for_transaction_test.filename)
|
11
|
+
|
12
|
+
if MigrationWithoutTransaction.in?(ActiveRecord::Migrator.current_migration_for_transaction_test.name.constantize.ancestors)
|
13
|
+
false
|
14
|
+
else
|
15
|
+
old_supports_ddl_transactions?
|
16
|
+
end
|
17
|
+
rescue
|
18
|
+
old_supports_ddl_transactions?
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
alias_method :old_migrate, :migrate
|
24
|
+
|
25
|
+
def migrate(&block)
|
26
|
+
ActiveRecord::Base.connection.raw_connection.type_map_for_results = PG::TypeMapAllStrings.new
|
27
|
+
ActiveRecord::Base.connection.raw_connection.type_map_for_queries = PG::TypeMapAllStrings.new
|
28
|
+
|
29
|
+
old_migrate do |migration|
|
30
|
+
(block.nil? ? true : block.call) && !(ActiveRecord::Migrator.current_migration_for_transaction_test = migration).nil?
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
|
3
|
+
module Rails
|
4
|
+
module Generators
|
5
|
+
class <<self
|
6
|
+
alias_method :original_invoke, :invoke
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.invoke(namespace, args=ARGV, config={})
|
10
|
+
original_invoke namespace.tr('-', '_'), args, config
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
version: false
|
2
|
+
compound: false
|
3
|
+
show-links: false
|
4
|
+
show-null: true
|
5
|
+
type-restriction: true
|
6
|
+
attribute-restriction: false
|
7
|
+
empty-is-null: true
|
8
|
+
page-size: 0
|
9
|
+
request-company-schema: false
|
10
|
+
request-sharded-schema: false
|
11
|
+
request-accounting-schema: false
|
12
|
+
request-accounting-prefix: false
|
13
|
+
pg-order-by: "created_at"
|
14
|
+
pg-search_path: '"$user", request-sharded-schema, public'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
pt:
|
2
|
+
sp-duh:
|
3
|
+
exceptions:
|
4
|
+
jsonapi:
|
5
|
+
service_setup_error: 'O serviço JSONAPI não se encontra disponível porque os recursos não estão devidamente instalados.'
|
6
|
+
service_protocol_error: 'O protocolo definido para acesso ao serviço JSONAPI (%{protocol}) não é suportado. Os protocolos suportados são: %{protocols}.'
|
7
|
+
invalid_resource_configuration_error: 'A configuração de recursos definida no ficheiro %{file} é inválida.'
|
8
|
+
duplicate_resource_error: 'Tentativa de redefinção do recurso %{name}. O recurso já foi definido anteriormente.'
|
9
|
+
save_configuration_error: 'Erro ao gravar a configuração da JSONAPI na base de dados.'
|
10
|
+
invalid_resource_publisher_error: 'O módulo ou classe %{publisher} não é uma fonte de recursos JSONAPI válida.'
|
11
|
+
invalid_jsonapi_key_error: 'A chave %{key} não é válida para configurar a JSONAPI.'
|
12
|
+
sharding:
|
13
|
+
invalid_sharder_type_error: 'Erro de definição do particionamento para a partição %{namespace}: o tipo de partição pretendido, %{sharder_type}, não se encontra instalado.'
|
14
|
+
invalid_sharding_definition_error: 'Erro de definição do particionamento para a partição %{namespace}: não é possível aceder à estrutura de particionamento definida (%{shard_value_field} na estrutura %{shard_table} pelo id %{shard_id_field}).'
|
15
|
+
shard_not_found_error: 'Não existe a partição com o identificador %{shard_id} na estrutura %{shard_table} da partição %{namespace}.'
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'rails/generators/active_record/migration/migration_generator'
|
2
|
+
|
3
|
+
class AccountingMigrationGenerator < ActiveRecord::Generators::MigrationGenerator
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
5
|
+
|
6
|
+
# def create_migration_file
|
7
|
+
# set_local_assigns!
|
8
|
+
# migration_template "migration.rb", "db/migrate/#{file_name}.rb"
|
9
|
+
# end
|
10
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
class <%= migration_class_name %> < ActiveRecord::MigrationWithoutTransaction
|
2
|
+
def up
|
3
|
+
schema = 'accounting'
|
4
|
+
['base_', 'small_', 'micro_', 'independent_', 'nonprofit_'].each do |table_prefix|
|
5
|
+
# Code to run on "accounting" schema
|
6
|
+
|
7
|
+
end
|
8
|
+
|
9
|
+
migrate_user_templates do |schema, table_prefix, ut|
|
10
|
+
# Code to run on user templates' schemas
|
11
|
+
|
12
|
+
# IF CHANGING TABLE we need to keep low cpu usage on DB
|
13
|
+
sleep 0.050
|
14
|
+
end
|
15
|
+
|
16
|
+
migrate_fiscal_years do |schema, table_prefix, fy|
|
17
|
+
# Code to run on fiscal years' schemas
|
18
|
+
|
19
|
+
# IF CHANGING TABLE we need to keep low cpu usage on DB
|
20
|
+
sleep 0.050
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def down
|
25
|
+
schema = 'accounting'
|
26
|
+
['base_', 'small_', 'micro_', 'independent_', 'nonprofit_'].each do |table_prefix|
|
27
|
+
# Code to run on "accounting" schema
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
rollback_user_templates do |schema, table_prefix, ut|
|
32
|
+
# Code to run on user templates' schemas
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
rollback_fiscal_years do |schema, table_prefix, fy|
|
37
|
+
# Code to run on fiscal years' schemas
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'rails/generators/active_record/migration/migration_generator'
|
2
|
+
|
3
|
+
class AccountingPayrollMigrationGenerator < ActiveRecord::Generators::MigrationGenerator
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
5
|
+
|
6
|
+
# def create_migration_file
|
7
|
+
# set_local_assigns!
|
8
|
+
# migration_template "migration.rb", "db/migrate/#{file_name}.rb"
|
9
|
+
# end
|
10
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
class <%= migration_class_name %> < ActiveRecord::MigrationWithoutTransaction
|
2
|
+
def up
|
3
|
+
migrate_fiscal_years do |schema, table_prefix, fy, company_id|
|
4
|
+
result = execute %Q[ SELECT sharded_schema FROM sharding.get_sharded_schema_name(#{company_id}); ]
|
5
|
+
sharded_schema = result.first["sharded_schema"]
|
6
|
+
execute <<-SQL
|
7
|
+
DO $BODY$
|
8
|
+
DECLARE
|
9
|
+
BEGIN
|
10
|
+
|
11
|
+
WITH _needs_update AS (
|
12
|
+
SELECT tcda.id,
|
13
|
+
accounting.get_account_best_match('#{schema}','#{table_prefix}',COALESCE(tcda.social_organ_account::text,po.social_organ_account,pi.social_organ_account)) AS social_organ_account,
|
14
|
+
accounting.get_account_best_match('#{schema}','#{table_prefix}',COALESCE(tcda.employee_account::text,po.employee_account,pi.employee_account)) AS employee_account
|
15
|
+
FROM accounting.transaction_suggestions_categories tc
|
16
|
+
JOIN public.payroll_items pi ON pi.type = tc.id
|
17
|
+
LEFT JOIN public.payroll_item_overrides po ON (po.company_id = #{company_id} AND po.payroll_item_id = pi.id)
|
18
|
+
JOIN #{schema}.#{table_prefix}transaction_suggestions_default_accounts tcda ON (tcda.category_id = pi.type AND tcda.item_id = pi.id)
|
19
|
+
WHERE ( pi.company_id = #{company_id} OR pi.company_id IS NULL )
|
20
|
+
AND (tcda.social_organ_account IS NULL OR tcda.employee_account IS NULL)
|
21
|
+
)
|
22
|
+
UPDATE #{schema}.#{table_prefix}transaction_suggestions_default_accounts
|
23
|
+
SET social_organ_account = _needs_update.social_organ_account,
|
24
|
+
employee_account = _needs_update.employee_account
|
25
|
+
FROM _needs_update
|
26
|
+
WHERE #{schema}.#{table_prefix}transaction_suggestions_default_accounts.id = _needs_update.id
|
27
|
+
AND (_needs_update.social_organ_account IS NOT NULL OR _needs_update.employee_account IS NOT NULL);
|
28
|
+
|
29
|
+
INSERT INTO #{schema}.#{table_prefix}transaction_suggestions_default_accounts
|
30
|
+
(category_id, item_id, social_organ_account, employee_account, use_employee_account)
|
31
|
+
SELECT pi.type AS category_id,
|
32
|
+
pi.id AS item_id,
|
33
|
+
accounting.get_account_best_match('#{schema}','#{table_prefix}',COALESCE(po.social_organ_account,pi.social_organ_account)) AS social_organ_account,
|
34
|
+
accounting.get_account_best_match('#{schema}','#{table_prefix}',COALESCE(po.employee_account,pi.employee_account)) AS employee_account,
|
35
|
+
COALESCE(po.use_employee_account,pi.use_employee_account) AS use_employee_account
|
36
|
+
FROM accounting.transaction_suggestions_categories tc
|
37
|
+
JOIN public.payroll_items pi ON pi.type = tc.id
|
38
|
+
LEFT JOIN public.payroll_item_overrides po ON (po.company_id = #{company_id} AND po.payroll_item_id = pi.id)
|
39
|
+
LEFT JOIN #{schema}.#{table_prefix}transaction_suggestions_default_accounts tcda ON (tcda.category_id = pi.type AND tcda.item_id = pi.id)
|
40
|
+
WHERE ( pi.company_id = #{company_id} OR pi.company_id IS NULL )
|
41
|
+
AND tcda IS NULL
|
42
|
+
ORDER BY pi.id;
|
43
|
+
|
44
|
+
INSERT INTO #{schema}.#{table_prefix}transaction_suggestions_default_accounts
|
45
|
+
(category_id, item_id, social_organ_account, employee_account, use_employee_account)
|
46
|
+
SELECT CASE
|
47
|
+
WHEN paa.category = 'Taxes' THEN 'Payroll::Tax'
|
48
|
+
WHEN paa.category = 'Third parties' THEN 'Payroll::ThirdParty'
|
49
|
+
END AS category_id,
|
50
|
+
paa.id AS item_id,
|
51
|
+
accounting.get_account_best_match('#{schema}','#{table_prefix}',paa.social_organ_account) AS social_organ_account,
|
52
|
+
accounting.get_account_best_match('#{schema}','#{table_prefix}',paa.employee_account) AS employee_account,
|
53
|
+
paa.use_employee_account
|
54
|
+
FROM #{sharded_schema}.payroll_accounting_accounts paa
|
55
|
+
LEFT JOIN #{schema}.#{table_prefix}transaction_suggestions_default_accounts tcda ON (tcda.category_id IN ('Payroll::Tax','Payroll::ThirdParty') AND tcda.item_id = paa.id)
|
56
|
+
WHERE paa.company_id = #{company_id}
|
57
|
+
AND paa.category IN ('Taxes', 'Third parties')
|
58
|
+
AND paa.code NOT IN ('BBNK','BCSH')
|
59
|
+
AND tcda IS NULL
|
60
|
+
ORDER BY paa.id;
|
61
|
+
END;
|
62
|
+
$BODY$ LANGUAGE 'plpgsql';
|
63
|
+
SQL
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def down
|
68
|
+
puts "Not reverting"
|
69
|
+
rollback_fiscal_years {}
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'rails/generators/active_record/migration/migration_generator'
|
2
|
+
|
3
|
+
class ShardedMigrationGenerator < ActiveRecord::Generators::MigrationGenerator
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
5
|
+
|
6
|
+
# def create_migration_file
|
7
|
+
# set_local_assigns!
|
8
|
+
# migration_template "migration.rb", "db/migrate/#{file_name}.rb"
|
9
|
+
# end
|
10
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
class <%= migration_class_name %> < ActiveRecord::MigrationWithoutTransaction
|
2
|
+
def up
|
3
|
+
migrate_companies do |schema_name, company_id|
|
4
|
+
case schema_name
|
5
|
+
when 'public'
|
6
|
+
# Code to run on "public" schema
|
7
|
+
|
8
|
+
when 'sharded'
|
9
|
+
# Code to run on "sharded" schema
|
10
|
+
# STUCTURE CHANGES TO TABLES IN THIS SCHEMA MUST ONLY RUN IF ADDING OR REMOVING COLUMNS, NOTHING ELSE!
|
11
|
+
|
12
|
+
else
|
13
|
+
# Code to run on sharded companies' schemas
|
14
|
+
|
15
|
+
end
|
16
|
+
# IF CHANGING TABLE we need to keep low cpu usage on DB
|
17
|
+
sleep 0.100
|
18
|
+
end
|
19
|
+
|
20
|
+
# If migration add structural changes on public objects and want run migration
|
21
|
+
# withou a full deploy, please uncomment the next line
|
22
|
+
# invalidate_postgresql_redis_cache!
|
23
|
+
end
|
24
|
+
|
25
|
+
def down
|
26
|
+
rollback_companies do |schema_name, company_id|
|
27
|
+
case schema_name
|
28
|
+
when 'public'
|
29
|
+
# Code to run on "public" schema
|
30
|
+
|
31
|
+
when 'sharded'
|
32
|
+
# Code to run on "sharded" schema
|
33
|
+
# STUCTURE CHANGES TO TABLES IN THIS SCHEMA MUST ONLY RUN IF ADDING OR REMOVING COLUMNS, NOTHING ELSE!
|
34
|
+
|
35
|
+
else
|
36
|
+
# Code to run on sharded companies' schemas
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# If migration add structural changes on public objects and want run migration
|
42
|
+
# withou a full deploy, please uncomment the next line
|
43
|
+
# invalidate_postgresql_redis_cache!
|
44
|
+
end
|
45
|
+
end
|