etl-integrations 0.1.85 → 0.1.86
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/etl-integrations-0.1.79.gem +0 -0
- data/etl-integrations-0.1.85.gem +0 -0
- data/lib/etl/integrations/destination/tally/client.rb +94 -9
- data/lib/etl/integrations/destination/tally/config/catalog.json +4 -1
- data/lib/etl/integrations/rollout.rb +1 -1
- metadata +5 -4
- data/etl-integrations.gemspec +0 -65
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dbf97c13292022f628ee36a0f99fee4712ff9e0c9f649e8ee1424de1984f1357
|
4
|
+
data.tar.gz: d974a3faae1b2e809d176b2bb2d3e2fa9b80b995eb68c1e3f3fb133f433a3a04
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a4fe646da773269cbd1c3207f830fb7343f5ca1a999b45262206aa905ad644648529b9a7a90469cf811eb43d7971bd4bcf2b39b174677c549c2da56ae4c981aa
|
7
|
+
data.tar.gz: aaa7835e8abf225d02f64bdbbc6c0bae1c0750e91f36cd5d8ed05dc0294561bfc365f48cc5baad8736e3c544d74c6ecf211ba70c87b991575faa864a7b031149
|
Binary file
|
Binary file
|
@@ -11,6 +11,7 @@ module Etl
|
|
11
11
|
module Destination
|
12
12
|
module Tally
|
13
13
|
include Etl::Integrations::Core
|
14
|
+
include Etl::Integrations::Core::Utils
|
14
15
|
|
15
16
|
API_VERSION = "1.0"
|
16
17
|
|
@@ -47,6 +48,21 @@ module Etl
|
|
47
48
|
config = config.with_indifferent_access
|
48
49
|
@tally_url = config[:tally_url]
|
49
50
|
@company_name = config[:company_name]
|
51
|
+
|
52
|
+
check_tally_status(@tally_url)
|
53
|
+
end
|
54
|
+
|
55
|
+
def check_tally_status(tally_url)
|
56
|
+
uri = URI.parse(tally_url)
|
57
|
+
response = Net::HTTP.get_response(uri)
|
58
|
+
|
59
|
+
if response.is_a?(Net::HTTPSuccess)
|
60
|
+
puts "Tally is running at #{tally_url}"
|
61
|
+
else
|
62
|
+
raise "Tally is not running or not reachable at #{tally_url}"
|
63
|
+
end
|
64
|
+
rescue StandardError => e
|
65
|
+
raise "Error connecting to Tally: #{e.message}"
|
50
66
|
end
|
51
67
|
|
52
68
|
def process_records(records, stream)
|
@@ -70,7 +86,7 @@ module Etl
|
|
70
86
|
end
|
71
87
|
|
72
88
|
def send_data_to_tally(xml_payload = {})
|
73
|
-
uri = URI.parse("#{@tally_url}
|
89
|
+
uri = URI.parse("#{@tally_url}")
|
74
90
|
request = Net::HTTP::Post.new(uri)
|
75
91
|
request.content_type = 'application/xml' # Tally uses XML format
|
76
92
|
request.body = xml_payload
|
@@ -97,16 +113,47 @@ module Etl
|
|
97
113
|
end
|
98
114
|
xml.REQUESTDATA do
|
99
115
|
xml.TALLYMESSAGE('xmlns:UDF' => 'TallyUDF') do
|
100
|
-
xml.VOUCHER do
|
101
|
-
xml.DATE '
|
116
|
+
xml.VOUCHER('VCHTYPE' => 'Sales', 'ACTION' => 'Create', 'OBJVIEW' => 'Invoice Voucher View') do
|
117
|
+
xml.DATE(record[:date].gsub('-', '')) # Date in YYYYMMDD format
|
118
|
+
xml.PARTYNAME record[:customer_name]
|
119
|
+
xml.PARTYLEDGERNAME record[:customer_name]
|
102
120
|
xml.VOUCHERTYPENAME 'Sales'
|
103
|
-
xml.
|
104
|
-
xml.VOUCHERNUMBER record[:
|
105
|
-
xml.
|
106
|
-
xml.
|
121
|
+
xml.REFERENCE record[:invoice_number]
|
122
|
+
xml.VOUCHERNUMBER record[:invoice_id] # If you want to use invoice_id as VOUCHERNUMBER
|
123
|
+
xml.NARRATION 'Invoice for ' + record[:customer_name]
|
124
|
+
xml.BASICBASEPARTYNAME record[:customer_name]
|
125
|
+
|
126
|
+
# Inventory Allocations
|
127
|
+
xml.ALLINVENTORYENTRIES__LIST do
|
128
|
+
xml.STOCKITEMNAME 'Product A' # This should be replaced with actual product names
|
129
|
+
xml.ISDEEMEDPOSITIVE 'No'
|
130
|
+
xml.AMOUNT record[:total]
|
131
|
+
xml.BILLEDQTY '1' # Adjust quantity as needed
|
132
|
+
xml.RATE record[:total] # Adjust rate as needed
|
133
|
+
xml.ACTUALQTY '1'
|
134
|
+
xml.ACCOUNTINGALLOCATIONS__LIST do
|
135
|
+
xml.LEDGERNAME record[:customer_name]
|
136
|
+
xml.AMOUNT record[:total]
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# Ledger Entries (Tax and Sales Accounts)
|
107
141
|
xml.LEDGERENTRIES__LIST do
|
108
|
-
xml.LEDGERNAME 'Sales
|
109
|
-
xml.
|
142
|
+
xml.LEDGERNAME 'Sales Accounts'
|
143
|
+
xml.ISDEEMEDPOSITIVE 'No'
|
144
|
+
xml.AMOUNT record[:total]
|
145
|
+
end
|
146
|
+
|
147
|
+
xml.LEDGERENTRIES__LIST do
|
148
|
+
xml.LEDGERNAME 'Output GST @ 18%' # Adjust GST ledger name if different
|
149
|
+
xml.ISDEEMEDPOSITIVE 'No'
|
150
|
+
xml.AMOUNT '900' # Replace with calculated GST if available
|
151
|
+
end
|
152
|
+
|
153
|
+
xml.LEDGERENTRIES__LIST do
|
154
|
+
xml.LEDGERNAME 'ABC India Pvt. Ltd.'
|
155
|
+
xml.ISDEEMEDPOSITIVE 'Yes'
|
156
|
+
xml.AMOUNT '-5000' # Adjust based on the payment received or invoice amount
|
110
157
|
end
|
111
158
|
end
|
112
159
|
end
|
@@ -117,6 +164,44 @@ module Etl
|
|
117
164
|
xml.target! # Returns the generated XML string
|
118
165
|
end
|
119
166
|
|
167
|
+
# def convert_to_xml(record)
|
168
|
+
# # Using Builder gem to create XML structure
|
169
|
+
# xml = Builder::XmlMarkup.new
|
170
|
+
# xml.instruct! :xml, version: '1.0', encoding: 'UTF-8'
|
171
|
+
# xml.ENVELOPE do
|
172
|
+
# xml.HEADER do
|
173
|
+
# xml.TALLYREQUEST 'Import Data'
|
174
|
+
# end
|
175
|
+
# xml.BODY do
|
176
|
+
# xml.IMPORTDATA do
|
177
|
+
# xml.REQUESTDESC do
|
178
|
+
# xml.REPORTNAME 'Vouchers'
|
179
|
+
# xml.STATICVARIABLES do
|
180
|
+
# xml.SVCURRENTCOMPANY @company_name
|
181
|
+
# end
|
182
|
+
# end
|
183
|
+
# xml.REQUESTDATA do
|
184
|
+
# xml.TALLYMESSAGE('xmlns:UDF' => 'TallyUDF') do
|
185
|
+
# xml.VOUCHER do
|
186
|
+
# xml.DATE '20240915' # Static or dynamic date
|
187
|
+
# xml.VOUCHERTYPENAME 'Sales'
|
188
|
+
# xml.NARRATION 'Test invoice from ETL Tool'
|
189
|
+
# xml.VOUCHERNUMBER record[:VOUCHERNUMBER] || 'INV-1002'
|
190
|
+
# xml.PARTYNAME record[:PARTYNAME] || 'XYZ Ltd'
|
191
|
+
# xml.AMOUNT record[:AMOUNT] || 10000
|
192
|
+
# xml.LEDGERENTRIES__LIST do
|
193
|
+
# xml.LEDGERNAME 'Sales Account'
|
194
|
+
# xml.AMOUNT record[:AMOUNT] || 10000
|
195
|
+
# end
|
196
|
+
# end
|
197
|
+
# end
|
198
|
+
# end
|
199
|
+
# end
|
200
|
+
# end
|
201
|
+
# end
|
202
|
+
# xml.target! # Returns the generated XML string
|
203
|
+
# end
|
204
|
+
|
120
205
|
def authenticate_client
|
121
206
|
# Tally may not need specific authentication steps like OAuth;
|
122
207
|
# skipping authentication or implementing basic connection validation.
|
@@ -4,7 +4,7 @@
|
|
4
4
|
"request_rate_concurrency": 10,
|
5
5
|
"streams": [
|
6
6
|
{
|
7
|
-
"name": "
|
7
|
+
"name": "Sales Accounts",
|
8
8
|
"action": "create",
|
9
9
|
"json_schema": {
|
10
10
|
"type": "object",
|
@@ -26,6 +26,9 @@
|
|
26
26
|
"Debit Note"
|
27
27
|
]
|
28
28
|
},
|
29
|
+
"Particulars": {
|
30
|
+
"type": ["string", "null"]
|
31
|
+
},
|
29
32
|
"Date": {
|
30
33
|
"type": "string",
|
31
34
|
"format": "date"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: etl-integrations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.86
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anas Ahmed
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-09-
|
11
|
+
date: 2024-09-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -378,7 +378,8 @@ files:
|
|
378
378
|
- README.md
|
379
379
|
- Rakefile
|
380
380
|
- etl-integrations-0.1.68.gem
|
381
|
-
- etl-integrations.
|
381
|
+
- etl-integrations-0.1.79.gem
|
382
|
+
- etl-integrations-0.1.85.gem
|
382
383
|
- lib/etl/integrations.rb
|
383
384
|
- lib/etl/integrations/config.rb
|
384
385
|
- lib/etl/integrations/core/base_connector.rb
|
@@ -509,7 +510,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
509
510
|
- !ruby/object:Gem::Version
|
510
511
|
version: '0'
|
511
512
|
requirements: []
|
512
|
-
rubygems_version: 3.4.
|
513
|
+
rubygems_version: 3.4.1
|
513
514
|
signing_key:
|
514
515
|
specification_version: 4
|
515
516
|
summary: Integration suite for open source reverse ETL platform
|
data/etl-integrations.gemspec
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "lib/etl/integrations/rollout"
|
4
|
-
|
5
|
-
Gem::Specification.new do |spec|
|
6
|
-
spec.name = "etl-integrations"
|
7
|
-
spec.version = Etl::Integrations::VERSION
|
8
|
-
spec.authors = ["Anas Ahmed"]
|
9
|
-
spec.email = ["anas31197@gmail.com"]
|
10
|
-
|
11
|
-
spec.summary = "Integration suite for open source reverse ETL platform"
|
12
|
-
spec.description = "Etl Integrations is a comprehensive Ruby gem designed to facilitate seamless connectivity between various data sources and SaaS platforms."
|
13
|
-
|
14
|
-
spec.homepage = "https://github.com/anasValign/etl-tool"
|
15
|
-
spec.license = "MIT"
|
16
|
-
spec.required_ruby_version = ">= 2.6.0"
|
17
|
-
|
18
|
-
# spec.metadata["allowed_push_host"] = nil
|
19
|
-
spec.metadata["github_repo"] = "https://github.com/anasValign/etl-tool"
|
20
|
-
spec.metadata["homepage_uri"] = spec.homepage
|
21
|
-
spec.metadata["source_code_uri"] = "https://github.com/Etl/multiwoven/tree/main/integrations"
|
22
|
-
spec.metadata["changelog_uri"] = "https://github.com/Etl/multiwoven/blob/main/integrations/CHANGELOG.md"
|
23
|
-
|
24
|
-
# Specify which files should be added to the gem when it is released.
|
25
|
-
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
26
|
-
spec.files = Dir.chdir(__dir__) do
|
27
|
-
`git ls-files -z`.split("\x0").reject do |f|
|
28
|
-
(File.expand_path(f) == __FILE__) ||
|
29
|
-
f.start_with?(*%w[bin/ test/ spec/ features/ .git .circleci appveyor Gemfile])
|
30
|
-
end
|
31
|
-
end
|
32
|
-
spec.bindir = "exe"
|
33
|
-
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
34
|
-
spec.require_paths = ["lib"]
|
35
|
-
|
36
|
-
spec.add_runtime_dependency "activesupport"
|
37
|
-
spec.add_runtime_dependency "async-websocket"
|
38
|
-
spec.add_runtime_dependency "csv"
|
39
|
-
spec.add_runtime_dependency "dry-schema"
|
40
|
-
spec.add_runtime_dependency "dry-struct"
|
41
|
-
spec.add_runtime_dependency "dry-types"
|
42
|
-
spec.add_runtime_dependency "git"
|
43
|
-
spec.add_runtime_dependency "google-apis-sheets_v4"
|
44
|
-
spec.add_runtime_dependency "google-cloud-bigquery"
|
45
|
-
spec.add_runtime_dependency "hubspot-api-client"
|
46
|
-
spec.add_runtime_dependency "net-sftp"
|
47
|
-
spec.add_runtime_dependency "pg"
|
48
|
-
spec.add_runtime_dependency "rake"
|
49
|
-
spec.add_runtime_dependency "restforce"
|
50
|
-
spec.add_runtime_dependency "ruby-limiter"
|
51
|
-
spec.add_runtime_dependency "ruby-odbc"
|
52
|
-
spec.add_runtime_dependency "sequel"
|
53
|
-
spec.add_runtime_dependency "slack-ruby-client"
|
54
|
-
spec.add_runtime_dependency "stripe"
|
55
|
-
|
56
|
-
spec.add_development_dependency "byebug"
|
57
|
-
spec.add_development_dependency "rspec"
|
58
|
-
spec.add_development_dependency "rubocop"
|
59
|
-
spec.add_development_dependency "simplecov"
|
60
|
-
spec.add_development_dependency "simplecov_json_formatter"
|
61
|
-
spec.add_development_dependency "webmock"
|
62
|
-
|
63
|
-
# For more information and examples about making a new gem, check out our
|
64
|
-
# guide at: https://bundler.io/guides/creating_gem.html
|
65
|
-
end
|