solidus_tiny 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.circleci/config.yml +53 -0
- data/.gem_release.yml +5 -0
- data/.github/stale.yml +1 -0
- data/.github_changelog_generator +2 -0
- data/.gitignore +21 -0
- data/.rspec +2 -0
- data/.rubocop.yml +5 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +48 -0
- data/LICENSE +26 -0
- data/README.md +73 -0
- data/Rakefile +7 -0
- data/app/controllers/spree/admin/orders/solidus_tiny/sellers_controller.rb +38 -0
- data/app/controllers/spree/admin/solidus_tiny/accounts_controller.rb +82 -0
- data/app/controllers/spree/admin/solidus_tiny/orders_controller.rb +20 -0
- data/app/jobs/solidus_tiny/application_job.rb +9 -0
- data/app/jobs/solidus_tiny/order_job.rb +10 -0
- data/app/jobs/solidus_tiny/upsert_sellers_job.rb +9 -0
- data/app/models/solidus_tiny/account.rb +8 -0
- data/app/models/solidus_tiny/event.rb +4 -0
- data/app/models/solidus_tiny/order.rb +129 -0
- data/app/models/solidus_tiny/payment_method.rb +4 -0
- data/app/models/solidus_tiny/seller.rb +44 -0
- data/app/models/solidus_tiny/shipping_method.rb +10 -0
- data/app/models/spree/permission_sets/tiny_seller_update.rb +9 -0
- data/app/subscribers/solidus_tiny/subscriber.rb +12 -0
- data/app/views/spree/admin/orders/solidus_tiny/sellers/edit.html.erb +19 -0
- data/app/views/spree/admin/shared/_order_submenu.html.erb +67 -0
- data/app/views/spree/admin/shared/_order_summary.html.erb +75 -0
- data/app/views/spree/admin/solidus_tiny/accounts/_form.html.erb +110 -0
- data/app/views/spree/admin/solidus_tiny/accounts/edit.html.erb +3 -0
- data/app/views/spree/admin/solidus_tiny/accounts/index.html.erb +54 -0
- data/app/views/spree/admin/solidus_tiny/accounts/new.html.erb +3 -0
- data/bin/console +17 -0
- data/bin/rails +7 -0
- data/bin/rails-engine +13 -0
- data/bin/rails-sandbox +16 -0
- data/bin/rake +7 -0
- data/bin/sandbox +76 -0
- data/bin/setup +8 -0
- data/config/locales/en.yml +5 -0
- data/config/locales/pt-BR.yml +5 -0
- data/config/routes.rb +17 -0
- data/db/migrate/20240506185512_create_solidus_tiny_accounts.rb +11 -0
- data/db/migrate/20240507111938_create_solidus_tiny_sellers.rb +15 -0
- data/db/migrate/20240507112822_add_solidus_tiny_seller_id_to_orders.rb +5 -0
- data/db/migrate/20240507114823_create_solidus_tiny_shipping_methods.rb +15 -0
- data/db/migrate/20240507121424_create_solidus_tiny_payment_methods.rb +13 -0
- data/db/migrate/20240507181649_add_tiny_order_id_to_spree_orders.rb +5 -0
- data/db/migrate/20240507190528_create_solidus_tiny_events.rb +13 -0
- data/lib/generators/solidus_tiny/install/install_generator.rb +31 -0
- data/lib/generators/solidus_tiny/install/templates/initializer.rb +4 -0
- data/lib/solidus_tiny/configuration.rb +18 -0
- data/lib/solidus_tiny/engine.rb +38 -0
- data/lib/solidus_tiny/testing_support/factories.rb +4 -0
- data/lib/solidus_tiny/version.rb +5 -0
- data/lib/solidus_tiny.rb +7 -0
- data/solidus_tiny.gemspec +36 -0
- metadata +182 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 95bdd85245ceb9a48ae2b693ee328c70d4cdb468c01a037878d55d7c5f05bf86
|
4
|
+
data.tar.gz: a1fe9fee1a6b7da3a8630680eda1bf7d91dde4689c195b99228d3c4295be626d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e6806b1e721f7ff3dc66bac5309f9ab07405082a373080f2e2971a63e84ee0f84306f32ca17798cd8a0cfe018f6ca58eea81aae0aad48c510eaf99060916a5c0
|
7
|
+
data.tar.gz: 631a622ab9b62c5c1aa04093369f609c755ad06531ce5895a767b0ab515faa59324d64adf4a5af4b974a681417a1be124340eb8ae442b5d70a9dd861c6ee1932
|
@@ -0,0 +1,53 @@
|
|
1
|
+
version: 2.1
|
2
|
+
|
3
|
+
orbs:
|
4
|
+
# Required for feature specs.
|
5
|
+
browser-tools: circleci/browser-tools@1.1
|
6
|
+
|
7
|
+
# Always take the latest version of the orb, this allows us to
|
8
|
+
# run specs against Solidus supported versions only without the need
|
9
|
+
# to change this configuration every time a Solidus version is released
|
10
|
+
# or goes EOL.
|
11
|
+
solidusio_extensions: solidusio/extensions@volatile
|
12
|
+
|
13
|
+
jobs:
|
14
|
+
run-specs-with-sqlite:
|
15
|
+
executor: solidusio_extensions/sqlite
|
16
|
+
steps:
|
17
|
+
- browser-tools/install-chrome
|
18
|
+
- solidusio_extensions/run-tests
|
19
|
+
run-specs-with-postgres:
|
20
|
+
executor: solidusio_extensions/postgres
|
21
|
+
steps:
|
22
|
+
- browser-tools/install-chrome
|
23
|
+
- solidusio_extensions/run-tests
|
24
|
+
run-specs-with-mysql:
|
25
|
+
executor: solidusio_extensions/mysql
|
26
|
+
steps:
|
27
|
+
- browser-tools/install-chrome
|
28
|
+
- solidusio_extensions/run-tests
|
29
|
+
lint-code:
|
30
|
+
executor: solidusio_extensions/sqlite-memory
|
31
|
+
steps:
|
32
|
+
- solidusio_extensions/lint-code
|
33
|
+
|
34
|
+
workflows:
|
35
|
+
"Run specs on supported Solidus versions":
|
36
|
+
jobs:
|
37
|
+
- run-specs-with-sqlite
|
38
|
+
- run-specs-with-postgres
|
39
|
+
- run-specs-with-mysql
|
40
|
+
- lint-code
|
41
|
+
|
42
|
+
"Weekly run specs against main":
|
43
|
+
triggers:
|
44
|
+
- schedule:
|
45
|
+
cron: "0 0 * * 4" # every Thursday
|
46
|
+
filters:
|
47
|
+
branches:
|
48
|
+
only:
|
49
|
+
- main
|
50
|
+
jobs:
|
51
|
+
- run-specs-with-sqlite
|
52
|
+
- run-specs-with-postgres
|
53
|
+
- run-specs-with-mysql
|
data/.gem_release.yml
ADDED
data/.github/stale.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
_extends: .github
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
source 'https://rubygems.org'
|
4
|
+
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
|
5
|
+
|
6
|
+
branch = ENV.fetch('SOLIDUS_BRANCH', 'main')
|
7
|
+
gem 'solidus', github: 'solidusio/solidus', branch: branch
|
8
|
+
|
9
|
+
# The solidus_frontend gem has been pulled out since v3.2
|
10
|
+
if branch >= 'v3.2'
|
11
|
+
gem 'solidus_frontend'
|
12
|
+
elsif branch == 'main'
|
13
|
+
gem 'solidus_frontend', github: 'solidusio/solidus_frontend'
|
14
|
+
else
|
15
|
+
gem 'solidus_frontend', github: 'solidusio/solidus', branch: branch
|
16
|
+
end
|
17
|
+
|
18
|
+
# Needed to help Bundler figure out how to resolve dependencies,
|
19
|
+
# otherwise it takes forever to resolve them.
|
20
|
+
# See https://github.com/bundler/bundler/issues/6677
|
21
|
+
gem 'rails', '>0.a'
|
22
|
+
|
23
|
+
|
24
|
+
# Provides basic authentication functionality for testing parts of your engine
|
25
|
+
gem 'solidus_auth_devise'
|
26
|
+
|
27
|
+
case ENV.fetch('DB', nil)
|
28
|
+
when 'mysql'
|
29
|
+
gem 'mysql2'
|
30
|
+
when 'postgresql'
|
31
|
+
gem 'pg'
|
32
|
+
else
|
33
|
+
gem 'sqlite3'
|
34
|
+
end
|
35
|
+
|
36
|
+
# While we still support Ruby < 3 we need to workaround a limitation in
|
37
|
+
# the 'async' gem that relies on the latest ruby, since RubyGems doesn't
|
38
|
+
# resolve gems based on the required ruby version.
|
39
|
+
gem 'async', '< 3' if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3')
|
40
|
+
|
41
|
+
gemspec
|
42
|
+
|
43
|
+
# Use a local Gemfile to include development dependencies that might not be
|
44
|
+
# relevant for the project or for other contributors, e.g. pry-byebug.
|
45
|
+
#
|
46
|
+
# We use `send` instead of calling `eval_gemfile` to work around an issue with
|
47
|
+
# how Dependabot parses projects: https://github.com/dependabot/dependabot-core/issues/1658.
|
48
|
+
send(:eval_gemfile, 'Gemfile-local') if File.exist? 'Gemfile-local'
|
data/LICENSE
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
Copyright (c) 2024 ulysses
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without modification,
|
5
|
+
are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
* Redistributions of source code must retain the above copyright notice,
|
8
|
+
this list of conditions and the following disclaimer.
|
9
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
this list of conditions and the following disclaimer in the documentation
|
11
|
+
and/or other materials provided with the distribution.
|
12
|
+
* Neither the name Solidus nor the names of its contributors may be used to
|
13
|
+
endorse or promote products derived from this software without specific
|
14
|
+
prior written permission.
|
15
|
+
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
17
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
18
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
19
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
20
|
+
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
21
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
22
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
23
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
24
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
25
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
26
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
# Solidus Tiny
|
2
|
+
|
3
|
+
[![CircleCI](https://circleci.com/gh/solidusio-contrib/solidus_tiny.svg?style=shield)](https://circleci.com/gh/solidusio-contrib/solidus_tiny)
|
4
|
+
[![codecov](https://codecov.io/gh/solidusio-contrib/solidus_tiny/branch/main/graph/badge.svg)](https://codecov.io/gh/solidusio-contrib/solidus_tiny)
|
5
|
+
|
6
|
+
<!-- Explain what your extension does. -->
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
Add solidus_tiny to your Gemfile:
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
gem 'solidus_tiny'
|
14
|
+
```
|
15
|
+
|
16
|
+
Bundle your dependencies and run the installation generator:
|
17
|
+
|
18
|
+
```shell
|
19
|
+
bin/rails generate solidus_tiny:install
|
20
|
+
```
|
21
|
+
|
22
|
+
## Usage
|
23
|
+
|
24
|
+
<!-- Explain how to use your extension once it's been installed. -->
|
25
|
+
|
26
|
+
## Development
|
27
|
+
|
28
|
+
### Testing the extension
|
29
|
+
|
30
|
+
First bundle your dependencies, then run `bin/rake`. `bin/rake` will default to building the dummy
|
31
|
+
app if it does not exist, then it will run specs. The dummy app can be regenerated by using
|
32
|
+
`bin/rake extension:test_app`.
|
33
|
+
|
34
|
+
```shell
|
35
|
+
bin/rake
|
36
|
+
```
|
37
|
+
|
38
|
+
To run [Rubocop](https://github.com/bbatsov/rubocop) static code analysis run
|
39
|
+
|
40
|
+
```shell
|
41
|
+
bundle exec rubocop
|
42
|
+
```
|
43
|
+
|
44
|
+
When testing your application's integration with this extension you may use its factories.
|
45
|
+
You can load Solidus core factories along with this extension's factories using this statement:
|
46
|
+
|
47
|
+
```ruby
|
48
|
+
SolidusDevSupport::TestingSupport::Factories.load_for(SolidusTiny::Engine)
|
49
|
+
```
|
50
|
+
|
51
|
+
### Running the sandbox
|
52
|
+
|
53
|
+
To run this extension in a sandboxed Solidus application, you can run `bin/sandbox`. The path for
|
54
|
+
the sandbox app is `./sandbox` and `bin/rails` will forward any Rails commands to
|
55
|
+
`sandbox/bin/rails`.
|
56
|
+
|
57
|
+
Here's an example:
|
58
|
+
|
59
|
+
```
|
60
|
+
$ bin/rails server
|
61
|
+
=> Booting Puma
|
62
|
+
=> Rails 6.0.2.1 application starting in development
|
63
|
+
* Listening on tcp://127.0.0.1:3000
|
64
|
+
Use Ctrl-C to stop
|
65
|
+
```
|
66
|
+
|
67
|
+
### Releasing new versions
|
68
|
+
|
69
|
+
Please refer to the [dedicated page](https://github.com/solidusio/solidus/wiki/How-to-release-extensions) in the Solidus wiki.
|
70
|
+
|
71
|
+
## License
|
72
|
+
|
73
|
+
Copyright (c) 2024 ulysses, released under the New BSD License.
|
data/Rakefile
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
module Spree
|
2
|
+
module Admin
|
3
|
+
module Orders
|
4
|
+
module SolidusTiny
|
5
|
+
class SellersController < BaseController
|
6
|
+
before_action :set_order, only: [:edit, :update]
|
7
|
+
|
8
|
+
def edit
|
9
|
+
@sellers = ::SolidusTiny::Seller.actives.order(:name)
|
10
|
+
end
|
11
|
+
|
12
|
+
def update
|
13
|
+
if @order.update(solidus_tiny_seller_id: params[:order][:seller_id])
|
14
|
+
flash[:success] = "Vendedor atualizado com sucesso."
|
15
|
+
else
|
16
|
+
flash[:error] = "Erro ao atualizar vendedor."
|
17
|
+
end
|
18
|
+
redirect_to admin_orders_solidus_tiny_seller_path(@order)
|
19
|
+
end
|
20
|
+
|
21
|
+
def model_class
|
22
|
+
::SolidusTiny::Seller
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def order_params
|
28
|
+
params.require(:order).permit(:seller_id)
|
29
|
+
end
|
30
|
+
|
31
|
+
def set_order
|
32
|
+
@order = Spree::Order.find_by!(number: params[:order_number])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module Spree
|
2
|
+
module Admin
|
3
|
+
module SolidusTiny
|
4
|
+
class AccountsController < BaseController
|
5
|
+
before_action :set_account, only: [:show, :edit, :update, :destroy]
|
6
|
+
|
7
|
+
def index
|
8
|
+
@accounts = ::SolidusTiny::Account.all
|
9
|
+
end
|
10
|
+
|
11
|
+
def show
|
12
|
+
redirect_to edit_admin_solidus_tiny_account_path(@tiny_account.id)
|
13
|
+
end
|
14
|
+
|
15
|
+
def new
|
16
|
+
if ::SolidusTiny::Account.any?
|
17
|
+
flash[:error] = "Você só pode ter uma conta Tiny cadastrada"
|
18
|
+
redirect_to admin_solidus_tiny_accounts_path
|
19
|
+
end
|
20
|
+
@tiny_account = ::SolidusTiny::Account.new
|
21
|
+
@payment_methods = ::Spree::PaymentMethod.all.pluck(:name, :id)
|
22
|
+
@shipping_methods = ::Spree::ShippingMethod.all.pluck(:name, :id)
|
23
|
+
@tiny_account.payment_methods.build
|
24
|
+
@tiny_account.shipping_methods.build
|
25
|
+
@tiny_account.sellers.build
|
26
|
+
end
|
27
|
+
|
28
|
+
def create
|
29
|
+
tiny_account = ::SolidusTiny::Account.new account_params
|
30
|
+
if tiny_account.save
|
31
|
+
flash[:success] = "Conta criada com sucesso"
|
32
|
+
redirect_to admin_solidus_tiny_accounts_path
|
33
|
+
else
|
34
|
+
flash[:error] = tiny_account.errors.full_messages.join("\n")
|
35
|
+
redirect_to new_admin_solidus_tiny_account_path
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def edit
|
40
|
+
@payment_methods = ::Spree::PaymentMethod.all.pluck(:name, :id)
|
41
|
+
@shipping_methods = ::Spree::ShippingMethod.all.pluck(:name, :id)
|
42
|
+
@sellers = @tiny_account.sellers.pluck(:name, :id)
|
43
|
+
end
|
44
|
+
|
45
|
+
def update
|
46
|
+
@tiny_account.sellers.find_by(seller_params[:default_seller]).update(default: true)
|
47
|
+
@tiny_account.update account_params
|
48
|
+
redirect_to edit_admin_solidus_tiny_account_path(@tiny_account.id)
|
49
|
+
end
|
50
|
+
|
51
|
+
def destroy
|
52
|
+
@tiny_account.delete
|
53
|
+
redirect_to admin_solidus_tiny_accounts_path
|
54
|
+
end
|
55
|
+
|
56
|
+
def upsert_sellers
|
57
|
+
::SolidusTiny::UpsertSellersJob.perform_later
|
58
|
+
flash[:success] = "Vendedores atualizados"
|
59
|
+
redirect_to admin_solidus_tiny_accounts_path
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def set_account
|
65
|
+
@tiny_account = ::SolidusTiny::Account.find(params[:id])
|
66
|
+
end
|
67
|
+
|
68
|
+
def account_params
|
69
|
+
params.require(:account).permit(
|
70
|
+
:api_key, :operation_id, :stock_location,
|
71
|
+
payment_methods_attributes: [:id, :spree_payment_method_id, :alias],
|
72
|
+
shipping_methods_attributes: [:id, :spree_shipping_method_id, :company, :name, :service]
|
73
|
+
)
|
74
|
+
end
|
75
|
+
|
76
|
+
def seller_params
|
77
|
+
params.require(:account).permit(default_seller: [:id])
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Spree
|
2
|
+
module Admin
|
3
|
+
module SolidusTiny
|
4
|
+
class OrdersController < BaseController
|
5
|
+
|
6
|
+
def update
|
7
|
+
order = Spree::Order.find(params[:id])
|
8
|
+
if order.tiny_order_id
|
9
|
+
flash[:error] = "Pedido já enviado"
|
10
|
+
else
|
11
|
+
::SolidusTiny::OrderJob.perform_later(event: { order: order })
|
12
|
+
flash[:success] = "O pedido está sendo enviado"
|
13
|
+
end
|
14
|
+
redirect_to edit_admin_order_customer_path(order)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module SolidusTiny
|
2
|
+
class ApplicationJob < ActiveJob::Base
|
3
|
+
# Automatically retry jobs that encountered a deadlock
|
4
|
+
# retry_on ActiveRecord::Deadlocked
|
5
|
+
|
6
|
+
# Most jobs are safe to ignore if the underlying records are no longer available
|
7
|
+
# discard_on ActiveJob::DeserializationError
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module SolidusTiny
|
2
|
+
class Account < ApplicationRecord
|
3
|
+
has_many :payment_methods, dependent: :destroy
|
4
|
+
has_many :shipping_methods, dependent: :destroy
|
5
|
+
has_many :sellers, dependent: :destroy
|
6
|
+
accepts_nested_attributes_for :payment_methods, :shipping_methods, :sellers
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
module SolidusTiny
|
2
|
+
class Order
|
3
|
+
def initialize spree_order, account=SolidusTiny::Account.first
|
4
|
+
@order = spree_order
|
5
|
+
@account = account
|
6
|
+
end
|
7
|
+
|
8
|
+
def send
|
9
|
+
tiny_event = SolidusTiny::Event.new(internal_id: @order.id)
|
10
|
+
begin
|
11
|
+
TinyErpApi.configure { |config| config.access_token = @account.api_key }
|
12
|
+
tiny_shipping_method = transportador
|
13
|
+
order_body = {
|
14
|
+
data_pedido: @order.completed_at.strftime("%d/%m/%Y"),
|
15
|
+
transportador: tiny_shipping_method.company,
|
16
|
+
forma_pagamento: forma_pagamento,
|
17
|
+
valor_frete: @order.shipment_total,
|
18
|
+
valor_desconto: @order.adjustment_total.abs,
|
19
|
+
numero_pedido: @order.number,
|
20
|
+
observacoes: "Número do pedido loja: #{@order.number}",
|
21
|
+
parcelas: parcelas,
|
22
|
+
observacoes_internas: observacoes_internas,
|
23
|
+
forma_envio: tiny_shipping_method.name,
|
24
|
+
forma_frete: tiny_shipping_method.service,
|
25
|
+
cliente: customer,
|
26
|
+
itens: products,
|
27
|
+
id_vendedor: seller_external_id,
|
28
|
+
deposito: @account.stock_location,
|
29
|
+
id_natureza_operacao: @account.operation_id
|
30
|
+
}
|
31
|
+
tiny_event.body = order_body
|
32
|
+
|
33
|
+
tiny_order = TinyErpApi::Order.new(**order_body).create
|
34
|
+
|
35
|
+
if tiny_order
|
36
|
+
@order.update(tiny_order_id: tiny_order.id)
|
37
|
+
tiny_event.status = "success"
|
38
|
+
tiny_event.message = "Pedido enviado"
|
39
|
+
end
|
40
|
+
rescue => e
|
41
|
+
tiny_event.status = "error"
|
42
|
+
tiny_event.message = e.to_json
|
43
|
+
ensure
|
44
|
+
tiny_event.save!
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def customer
|
49
|
+
ship_address = @order.ship_address
|
50
|
+
{
|
51
|
+
nome: ship_address.name,
|
52
|
+
tipo_pessoa: @order.tax_id.length > 14 ? "J" : "F",
|
53
|
+
cpf_cnpj: @order.tax_id,
|
54
|
+
endereco: ship_address.address1,
|
55
|
+
numero: ship_address.number,
|
56
|
+
complemento: ship_address.address2,
|
57
|
+
bairro: ship_address.district,
|
58
|
+
cep: ship_address.zipcode,
|
59
|
+
cidade: ship_address.city,
|
60
|
+
uf: ship_address.state.abbr,
|
61
|
+
fone: ship_address.phone,
|
62
|
+
email: @order.email
|
63
|
+
}
|
64
|
+
end
|
65
|
+
|
66
|
+
def products
|
67
|
+
@order.line_items.map do |item|
|
68
|
+
{
|
69
|
+
item: {
|
70
|
+
codigo: item.sku,
|
71
|
+
quantidade: item.quantity,
|
72
|
+
valor_unitario: item.price
|
73
|
+
}
|
74
|
+
}
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def seller_external_id
|
79
|
+
@order.solidus_tiny_seller_id ? @account.sellers.find(@order.solidus_tiny_seller_id).external_id : SolidusTiny::Seller.default.external_id
|
80
|
+
end
|
81
|
+
|
82
|
+
def transportador
|
83
|
+
@account.shipping_methods.find_by(spree_shipping_method_id: @order.shipments.last.shipping_method.id)
|
84
|
+
end
|
85
|
+
|
86
|
+
def forma_pagamento
|
87
|
+
spree_payment = @order.payments.valid.last
|
88
|
+
payment_method = @account.payment_methods.find_by(spree_payment_method_id: spree_payment.payment_method_id).alias
|
89
|
+
end
|
90
|
+
|
91
|
+
def parcelas
|
92
|
+
parcelas = @order.payments.last.source.try(:installments) || 1
|
93
|
+
valor_parcela = @order.total.to_f / parcelas
|
94
|
+
1.upto(parcelas).map do |parcela|
|
95
|
+
{
|
96
|
+
parcela: {
|
97
|
+
data: (@order.completed_at + parcela.months).strftime("%d/%m/%Y"),
|
98
|
+
valor: valor_parcela,
|
99
|
+
forma_pagamento: forma_pagamento
|
100
|
+
}
|
101
|
+
}
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def observacoes_internas
|
106
|
+
parcelas = @order.payments.last.source.try(:installments) || 1
|
107
|
+
"Pagamento: #{parcelas}x R$ #{(@order.total.to_f / parcelas).round(2)}" \
|
108
|
+
"\n" \
|
109
|
+
"Forma de envio: #{@order.shipments.last.selected_shipping_rate.name}" \
|
110
|
+
"\n" +
|
111
|
+
build_cupons(@order.adjustments.where(source_type: "Spree::PromotionAction", eligible: true)).to_s +
|
112
|
+
"\n" +
|
113
|
+
build_order_url.to_s
|
114
|
+
end
|
115
|
+
|
116
|
+
def build_cupons cupons
|
117
|
+
string_cupons = ""
|
118
|
+
if !cupons.empty?
|
119
|
+
string_cupons = "Cupons utilizados: #{cupons.pluck(:label).join(", ")}"
|
120
|
+
end
|
121
|
+
string_cupons
|
122
|
+
end
|
123
|
+
|
124
|
+
def build_order_url
|
125
|
+
"Link para o pedido: #{@order.store.url}/pedidos/#{@order.number}"
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module SolidusTiny
|
2
|
+
class Seller < ApplicationRecord
|
3
|
+
validates :name, presence: true
|
4
|
+
validates :external_id, presence: true
|
5
|
+
|
6
|
+
belongs_to :account
|
7
|
+
|
8
|
+
after_save :falsify_all_others
|
9
|
+
|
10
|
+
def self.upsert_sellers account
|
11
|
+
TinyErpApi.configure { |config| config.access_token = account.api_key }
|
12
|
+
sellers = TinyErpApi::Seller.get_all
|
13
|
+
upsert_sellers = sellers.map do |seller|
|
14
|
+
situacao = seller[:situacao] == "Ativo" ? true : false
|
15
|
+
{
|
16
|
+
name: seller[:nome],
|
17
|
+
external_id: seller[:id],
|
18
|
+
account_id: account.id,
|
19
|
+
active: situacao
|
20
|
+
}
|
21
|
+
end
|
22
|
+
SolidusTiny::Seller.upsert_all(upsert_sellers, unique_by: :external_id)
|
23
|
+
inactivate_sellers(sellers)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.default
|
27
|
+
find_by(default: true)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.actives
|
31
|
+
where(active: true)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.inactivate_sellers sellers_tiny
|
35
|
+
where.not(external_id: sellers_tiny.pluck(:id)).update_all(active: false)
|
36
|
+
end
|
37
|
+
|
38
|
+
def falsify_all_others
|
39
|
+
if default
|
40
|
+
self.class.where('id != ?', self.id).update_all(default: false)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module SolidusTiny
|
2
|
+
class ShippingMethod < ApplicationRecord
|
3
|
+
validates :service, presence: true
|
4
|
+
validates :name, presence: true
|
5
|
+
validates :company, presence: true
|
6
|
+
|
7
|
+
belongs_to :account
|
8
|
+
belongs_to :spree_shipping_method, class_name: "Spree::ShippingMethod"
|
9
|
+
end
|
10
|
+
end
|