spree_br_common 3.0.0

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.
Files changed (111) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +1 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +14 -0
  7. data/Gemfile +20 -0
  8. data/LICENSE +26 -0
  9. data/README.md +55 -0
  10. data/Rakefile +21 -0
  11. data/app/assets/javascripts/spree/backend/spree_br_common.js +2 -0
  12. data/app/assets/javascripts/spree/frontend/address.js +119 -0
  13. data/app/assets/javascripts/spree/frontend/mask.js +21 -0
  14. data/app/assets/javascripts/spree/frontend/plugins/jquery.mask.extension.js +4 -0
  15. data/app/assets/javascripts/spree/frontend/plugins/jquery.mask.js +395 -0
  16. data/app/assets/javascripts/spree/frontend/routes.js.erb +4 -0
  17. data/app/assets/javascripts/spree/frontend/spree_br_common.js +1 -0
  18. data/app/assets/stylesheets/spree/backend/spree_br_common.css +4 -0
  19. data/app/assets/stylesheets/spree/frontend/spree_br_common.css +4 -0
  20. data/app/controllers/spree/addresses_controller.rb +24 -0
  21. data/app/controllers/spree/api/cities_controller.rb +38 -0
  22. data/app/controllers/spree/user_registrations_controller_decorator.rb +13 -0
  23. data/app/helpers/spree/api/api_helpers_decorator.rb +13 -0
  24. data/app/helpers/spree/base_helper_decorator.rb +5 -0
  25. data/app/models/spree/ability_decorator.rb +21 -0
  26. data/app/models/spree/address_decorator.rb +6 -0
  27. data/app/models/spree/city.rb +7 -0
  28. data/app/models/spree/permitted_attributes_decorator.rb +8 -0
  29. data/app/models/spree/state_decorator.rb +3 -0
  30. data/app/models/spree/user_decorator.rb +52 -0
  31. data/app/overrides/spree/address/_form/add_district.html.erb.deface +5 -0
  32. data/app/overrides/spree/address/_form/add_number.html.erb.deface +5 -0
  33. data/app/overrides/spree/address/_form/hide_country.html.erb.deface +4 -0
  34. data/app/overrides/spree/address/_form/move_city_to_after_state.deface +2 -0
  35. data/app/overrides/spree/address/_form/move_zipcode_after_last_name.deface +2 -0
  36. data/app/overrides/spree/address/_form/replace_city_input_text_by_select.html.erb.deface +18 -0
  37. data/app/overrides/spree/address/_form/set_data_uf_to_state.html.erb.deface +15 -0
  38. data/app/overrides/spree/admin/users/_form/add_extras_fields.html.erb.deface +39 -0
  39. data/app/overrides/spree/shared/_user_form/add_extra_fields.html.erb.deface +19 -0
  40. data/app/overrides/spree/users/show/add_details.html.erb.deface +13 -0
  41. data/app/views/spree/api/cities/index.v1.rabl +11 -0
  42. data/app/views/spree/api/cities/show.v1.rabl +2 -0
  43. data/bin/rails +7 -0
  44. data/config/locales/en.yml +11 -0
  45. data/config/locales/pt-BR.yml +14 -0
  46. data/config/routes.rb +7 -0
  47. data/db/default/country.rb +3 -0
  48. data/db/default/shipping_categories.rb +1 -0
  49. data/db/default/shipping_zones.rb +3 -0
  50. data/db/default/states.rb +31 -0
  51. data/db/default/states_cities_of_acre.rb +26 -0
  52. data/db/default/states_cities_of_alagoas.rb +107 -0
  53. data/db/default/states_cities_of_amapa.rb +20 -0
  54. data/db/default/states_cities_of_amazonas.rb +67 -0
  55. data/db/default/states_cities_of_bahia.rb +421 -0
  56. data/db/default/states_cities_of_ceara.rb +188 -0
  57. data/db/default/states_cities_of_distrito_federal.rb +5 -0
  58. data/db/default/states_cities_of_espirito_santo.rb +82 -0
  59. data/db/default/states_cities_of_goias.rb +250 -0
  60. data/db/default/states_cities_of_maranhao.rb +221 -0
  61. data/db/default/states_cities_of_mato_grosso.rb +145 -0
  62. data/db/default/states_cities_of_mato_grosso_do_sul.rb +82 -0
  63. data/db/default/states_cities_of_minas_gerais.rb +857 -0
  64. data/db/default/states_cities_of_para.rb +147 -0
  65. data/db/default/states_cities_of_paraiba.rb +227 -0
  66. data/db/default/states_cities_of_parana.rb +403 -0
  67. data/db/default/states_cities_of_pernambuco.rb +189 -0
  68. data/db/default/states_cities_of_piaui.rb +227 -0
  69. data/db/default/states_cities_of_rio_de_janeiro.rb +96 -0
  70. data/db/default/states_cities_of_rio_grande_do_norte.rb +171 -0
  71. data/db/default/states_cities_of_rio_grande_do_sul.rb +500 -0
  72. data/db/default/states_cities_of_rondonia.rb +56 -0
  73. data/db/default/states_cities_of_roraima.rb +19 -0
  74. data/db/default/states_cities_of_santa_catarina.rb +297 -0
  75. data/db/default/states_cities_of_sao_paulo.rb +649 -0
  76. data/db/default/states_cities_of_sergipe.rb +79 -0
  77. data/db/default/states_cities_of_tocantins.rb +144 -0
  78. data/db/default/stock.rb +1 -0
  79. data/db/default/tax_categories.rb +1 -0
  80. data/db/default/user.rb +100 -0
  81. data/db/migrate/20150503011715_create_spree_cities.rb +13 -0
  82. data/db/migrate/20150504004509_remove_city_from_spree_address.rb +5 -0
  83. data/db/migrate/20150504004648_add_city_to_spree_address.rb +5 -0
  84. data/db/migrate/20150505020218_add_number_and_district_to_spree_address.rb +6 -0
  85. data/db/migrate/20150505031019_add_details_to_spree_user.rb +10 -0
  86. data/db/seeds.rb +5 -0
  87. data/lib/generators/spree_br_common/install/install_generator.rb +31 -0
  88. data/lib/spree_br_common/engine.rb +20 -0
  89. data/lib/spree_br_common/factories/address_factory.rb +7 -0
  90. data/lib/spree_br_common/factories/city_factory.rb +8 -0
  91. data/lib/spree_br_common/factories/user_factory.rb +12 -0
  92. data/lib/spree_br_common/factories.rb +3 -0
  93. data/lib/spree_br_common.rb +2 -0
  94. data/spec/controllers/features/address_checkout_spec.rb +89 -0
  95. data/spec/controllers/features/user_account_spec.rb +46 -0
  96. data/spec/controllers/features/user_signup_spec.rb +24 -0
  97. data/spec/controllers/spree/addresses_controller_spec.rb +27 -0
  98. data/spec/controllers/spree/api/cities_controller_spec.rb +86 -0
  99. data/spec/fixtures/vcr_cassettes/Checkout/visitor_makes_checkout_as_guest_without_registration/full_checkout/does_not_break_the_per-item_shipping_method_calculator.yml +49 -0
  100. data/spec/fixtures/vcr_cassettes/Checkout/visitor_makes_checkout_as_guest_without_registration/full_checkout/in_Brazil/should_autocomplete_zipcode.yml +46 -0
  101. data/spec/fixtures/vcr_cassettes/Spree_AddressesController/_show/does_not_find_an_incorrect_cep.yml +38 -0
  102. data/spec/fixtures/vcr_cassettes/Spree_AddressesController/_show/shows_the_correct_address.yml +46 -0
  103. data/spec/models/spree/address_spec.rb +32 -0
  104. data/spec/models/spree/city_spec.rb +7 -0
  105. data/spec/models/spree/user_spec.rb +88 -0
  106. data/spec/spec_helper.rb +94 -0
  107. data/spec/support/controller_hacks.rb +33 -0
  108. data/spec/support/shared_context/checkout_setup.rb +9 -0
  109. data/spec/support/vcr.rb +8 -0
  110. data/spree_br_common.gemspec +33 -0
  111. metadata +351 -0
@@ -0,0 +1,79 @@
1
+ sergipe = Spree::State.find_by! abbr: 'SE'
2
+
3
+ Spree::City.create!([
4
+ {state: sergipe, ibge_code: 2801306, name: "Capela"},
5
+ {state: sergipe, ibge_code: 2802007, name: "Divina Pastora"},
6
+ {state: sergipe, ibge_code: 2806503, name: "Santa Rosa de Lima"},
7
+ {state: sergipe, ibge_code: 2803302, name: "Japaratuba"},
8
+ {state: sergipe, ibge_code: 2803401, name: "Japoatã"},
9
+ {state: sergipe, ibge_code: 2804904, name: "Pacatuba"},
10
+ {state: sergipe, ibge_code: 2805307, name: "Pirambu"},
11
+ {state: sergipe, ibge_code: 2806909, name: "São Francisco"},
12
+ {state: sergipe, ibge_code: 2803609, name: "Laranjeiras"},
13
+ {state: sergipe, ibge_code: 2804003, name: "Maruim"},
14
+ {state: sergipe, ibge_code: 2805901, name: "Riachuelo"},
15
+ {state: sergipe, ibge_code: 2804300, name: "Muribeca"},
16
+ {state: sergipe, ibge_code: 2807204, name: "Siriri"},
17
+ {state: sergipe, ibge_code: 2802601, name: "Gracho Cardoso"},
18
+ {state: sergipe, ibge_code: 2804607, name: "Nossa Senhora das Dores"},
19
+ {state: sergipe, ibge_code: 2805703, name: "Propriá"},
20
+ {state: sergipe, ibge_code: 2802502, name: "General Maynard"},
21
+ {state: sergipe, ibge_code: 2806305, name: "Santa Luzia do Itanhy"},
22
+ {state: sergipe, ibge_code: 2801504, name: "Carmópolis"},
23
+ {state: sergipe, ibge_code: 2806107, name: "Rosário do Catete"},
24
+ {state: sergipe, ibge_code: 2806701, name: "São Cristóvão"},
25
+ {state: sergipe, ibge_code: 2805109, name: "Pedrinhas"},
26
+ {state: sergipe, ibge_code: 2802106, name: "Estância"},
27
+ {state: sergipe, ibge_code: 2806602, name: "Santo Amaro das Brotas"},
28
+ {state: sergipe, ibge_code: 2800308, name: "Aracaju"},
29
+ {state: sergipe, ibge_code: 2800605, name: "Barra dos Coqueiros"},
30
+ {state: sergipe, ibge_code: 2804805, name: "Nossa Senhora do Socorro"},
31
+ {state: sergipe, ibge_code: 2800407, name: "Arauá"},
32
+ {state: sergipe, ibge_code: 2800670, name: "Boquim"},
33
+ {state: sergipe, ibge_code: 2801702, name: "Cristinápolis"},
34
+ {state: sergipe, ibge_code: 2803005, name: "Itabaianinha"},
35
+ {state: sergipe, ibge_code: 2806206, name: "Salgado"},
36
+ {state: sergipe, ibge_code: 2807501, name: "Tomar do Geru"},
37
+ {state: sergipe, ibge_code: 2807600, name: "Umbaúba"},
38
+ {state: sergipe, ibge_code: 2802809, name: "Indiaroba"},
39
+ {state: sergipe, ibge_code: 2803203, name: "Itaporanga d'Ajuda"},
40
+ {state: sergipe, ibge_code: 2801207, name: "Canindé de São Francisco"},
41
+ {state: sergipe, ibge_code: 2802205, name: "Feira Nova"},
42
+ {state: sergipe, ibge_code: 2802403, name: "Gararu"},
43
+ {state: sergipe, ibge_code: 2803104, name: "Itabi"},
44
+ {state: sergipe, ibge_code: 2804201, name: "Monte Alegre de Sergipe"},
45
+ {state: sergipe, ibge_code: 2804508, name: "Nossa Senhora da Glória"},
46
+ {state: sergipe, ibge_code: 2805406, name: "Poço Redondo"},
47
+ {state: sergipe, ibge_code: 2805604, name: "Porto da Folha"},
48
+ {state: sergipe, ibge_code: 2801405, name: "Carira"},
49
+ {state: sergipe, ibge_code: 2802304, name: "Frei Paulo"},
50
+ {state: sergipe, ibge_code: 2804458, name: "Nossa Senhora Aparecida"},
51
+ {state: sergipe, ibge_code: 2805000, name: "Pedra Mole"},
52
+ {state: sergipe, ibge_code: 2805208, name: "Pinhão"},
53
+ {state: sergipe, ibge_code: 2806008, name: "Ribeirópolis"},
54
+ {state: sergipe, ibge_code: 2800209, name: "Aquidabã"},
55
+ {state: sergipe, ibge_code: 2801900, name: "Cumbe"},
56
+ {state: sergipe, ibge_code: 2803807, name: "Malhada dos Bois"},
57
+ {state: sergipe, ibge_code: 2807006, name: "São Miguel do Aleixo"},
58
+ {state: sergipe, ibge_code: 2800506, name: "Areia Branca"},
59
+ {state: sergipe, ibge_code: 2801009, name: "Campo do Brito"},
60
+ {state: sergipe, ibge_code: 2802908, name: "Itabaiana"},
61
+ {state: sergipe, ibge_code: 2803708, name: "Macambira"},
62
+ {state: sergipe, ibge_code: 2803906, name: "Malhador"},
63
+ {state: sergipe, ibge_code: 2804102, name: "Moita Bonita"},
64
+ {state: sergipe, ibge_code: 2806800, name: "São Domingos"},
65
+ {state: sergipe, ibge_code: 2805505, name: "Poço Verde"},
66
+ {state: sergipe, ibge_code: 2807105, name: "Simão Dias"},
67
+ {state: sergipe, ibge_code: 2807402, name: "Tobias Barreto"},
68
+ {state: sergipe, ibge_code: 2803500, name: "Lagarto"},
69
+ {state: sergipe, ibge_code: 2805802, name: "Riachão do Dantas"},
70
+ {state: sergipe, ibge_code: 2800100, name: "Amparo de São Francisco"},
71
+ {state: sergipe, ibge_code: 2800704, name: "Brejo Grande"},
72
+ {state: sergipe, ibge_code: 2801108, name: "Canhoba"},
73
+ {state: sergipe, ibge_code: 2801603, name: "Cedro de São João"},
74
+ {state: sergipe, ibge_code: 2802700, name: "Ilha das Flores"},
75
+ {state: sergipe, ibge_code: 2804409, name: "Neópolis"},
76
+ {state: sergipe, ibge_code: 2804706, name: "Nossa Senhora de Lourdes"},
77
+ {state: sergipe, ibge_code: 2806404, name: "Santana do São Francisco"},
78
+ {state: sergipe, ibge_code: 2807303, name: "Telha"}
79
+ ])
@@ -0,0 +1,144 @@
1
+ tocantins = Spree::State.find_by! abbr: 'TO'
2
+
3
+ Spree::City.create!([
4
+ {state: tocantins, ibge_code: 1713957, name: "Muricilândia"},
5
+ {state: tocantins, ibge_code: 1715507, name: "Oliveira de Fátima"},
6
+ {state: tocantins, ibge_code: 1707009, name: "Dianópolis"},
7
+ {state: tocantins, ibge_code: 1706506, name: "Darcinópolis"},
8
+ {state: tocantins, ibge_code: 1721208, name: "Tocantinópolis"},
9
+ {state: tocantins, ibge_code: 1722081, name: "Wanderlândia"},
10
+ {state: tocantins, ibge_code: 1713700, name: "Monte Santo do Tocantins"},
11
+ {state: tocantins, ibge_code: 1707652, name: "Figueirópolis"},
12
+ {state: tocantins, ibge_code: 1721109, name: "Tocantínia"},
13
+ {state: tocantins, ibge_code: 1702703, name: "Aurora do Tocantins"},
14
+ {state: tocantins, ibge_code: 1718451, name: "Pugmil"},
15
+ {state: tocantins, ibge_code: 1700350, name: "Aliança do Tocantins"},
16
+ {state: tocantins, ibge_code: 1700707, name: "Alvorada"},
17
+ {state: tocantins, ibge_code: 1703701, name: "Brejinho de Nazaré"},
18
+ {state: tocantins, ibge_code: 1703867, name: "Cariri do Tocantins"},
19
+ {state: tocantins, ibge_code: 1709500, name: "Gurupi"},
20
+ {state: tocantins, ibge_code: 1711506, name: "Jaú do Tocantins"},
21
+ {state: tocantins, ibge_code: 1715754, name: "Palmeirópolis"},
22
+ {state: tocantins, ibge_code: 1716604, name: "Peixe"},
23
+ {state: tocantins, ibge_code: 1720259, name: "São Salvador do Tocantins"},
24
+ {state: tocantins, ibge_code: 1720853, name: "Sucupira"},
25
+ {state: tocantins, ibge_code: 1720978, name: "Talismã"},
26
+ {state: tocantins, ibge_code: 1701101, name: "Aparecida do Rio Negro"},
27
+ {state: tocantins, ibge_code: 1703305, name: "Bom Jesus do Tocantins"},
28
+ {state: tocantins, ibge_code: 1712009, name: "Lajeado"},
29
+ {state: tocantins, ibge_code: 1713601, name: "Monte do Carmo"},
30
+ {state: tocantins, ibge_code: 1716505, name: "Pedro Afonso"},
31
+ {state: tocantins, ibge_code: 1718881, name: "Santa Maria do Tocantins"},
32
+ {state: tocantins, ibge_code: 1720655, name: "Silvanópolis"},
33
+ {state: tocantins, ibge_code: 1721000, name: "Palmas"},
34
+ {state: tocantins, ibge_code: 1703842, name: "Campos Lindos"},
35
+ {state: tocantins, ibge_code: 1704105, name: "Centenário"},
36
+ {state: tocantins, ibge_code: 1709005, name: "Goiatins"},
37
+ {state: tocantins, ibge_code: 1710508, name: "Itacajá"},
38
+ {state: tocantins, ibge_code: 1711951, name: "Lagoa do Tocantins"},
39
+ {state: tocantins, ibge_code: 1712405, name: "Lizarda"},
40
+ {state: tocantins, ibge_code: 1712702, name: "Mateiros"},
41
+ {state: tocantins, ibge_code: 1715101, name: "Novo Acordo"},
42
+ {state: tocantins, ibge_code: 1718501, name: "Recursolândia"},
43
+ {state: tocantins, ibge_code: 1718758, name: "Rio Sono"},
44
+ {state: tocantins, ibge_code: 1719004, name: "Santa Tereza do Tocantins"},
45
+ {state: tocantins, ibge_code: 1720150, name: "São Félix do Tocantins"},
46
+ {state: tocantins, ibge_code: 1700400, name: "Almas"},
47
+ {state: tocantins, ibge_code: 1705102, name: "Chapada da Natividade"},
48
+ {state: tocantins, ibge_code: 1705557, name: "Combinado"},
49
+ {state: tocantins, ibge_code: 1712157, name: "Lavandeira"},
50
+ {state: tocantins, ibge_code: 1714203, name: "Natividade"},
51
+ {state: tocantins, ibge_code: 1715150, name: "Novo Alegre"},
52
+ {state: tocantins, ibge_code: 1715259, name: "Novo Jardim"},
53
+ {state: tocantins, ibge_code: 1717008, name: "Pindorama do Tocantins"},
54
+ {state: tocantins, ibge_code: 1717800, name: "Ponte Alta do Bom Jesus"},
55
+ {state: tocantins, ibge_code: 1718006, name: "Porto Alegre do Tocantins"},
56
+ {state: tocantins, ibge_code: 1718907, name: "Santa Rosa do Tocantins"},
57
+ {state: tocantins, ibge_code: 1720499, name: "São Valério da Natividade"},
58
+ {state: tocantins, ibge_code: 1720903, name: "Taguatinga"},
59
+ {state: tocantins, ibge_code: 1720937, name: "Taipas do Tocantins"},
60
+ {state: tocantins, ibge_code: 1700251, name: "Abreulândia"},
61
+ {state: tocantins, ibge_code: 1703602, name: "Brasilândia do Tocantins"},
62
+ {state: tocantins, ibge_code: 1709302, name: "Guaraí"},
63
+ {state: tocantins, ibge_code: 1713205, name: "Miracema do Tocantins"},
64
+ {state: tocantins, ibge_code: 1718709, name: "Rio dos Bois"},
65
+ {state: tocantins, ibge_code: 1706100, name: "Cristalândia"},
66
+ {state: tocantins, ibge_code: 1715002, name: "Nova Rosalândia"},
67
+ {state: tocantins, ibge_code: 1718840, name: "Sandolândia"},
68
+ {state: tocantins, ibge_code: 1706258, name: "Crixás do Tocantins"},
69
+ {state: tocantins, ibge_code: 1718659, name: "Rio da Conceição"},
70
+ {state: tocantins, ibge_code: 1718899, name: "Santa Rita do Tocantins"},
71
+ {state: tocantins, ibge_code: 1709807, name: "Ipueiras"},
72
+ {state: tocantins, ibge_code: 1718204, name: "Porto Nacional"},
73
+ {state: tocantins, ibge_code: 1703073, name: "Barra do Ouro"},
74
+ {state: tocantins, ibge_code: 1710904, name: "Itapiratins"},
75
+ {state: tocantins, ibge_code: 1717909, name: "Ponte Alta do Tocantins"},
76
+ {state: tocantins, ibge_code: 1702406, name: "Arraias"},
77
+ {state: tocantins, ibge_code: 1705607, name: "Conceição do Tocantins"},
78
+ {state: tocantins, ibge_code: 1716208, name: "Paranã"},
79
+ {state: tocantins, ibge_code: 1700301, name: "Aguiarnópolis"},
80
+ {state: tocantins, ibge_code: 1701002, name: "Ananás"},
81
+ {state: tocantins, ibge_code: 1701051, name: "Angico"},
82
+ {state: tocantins, ibge_code: 1702208, name: "Araguatins"},
83
+ {state: tocantins, ibge_code: 1702554, name: "Augustinópolis"},
84
+ {state: tocantins, ibge_code: 1702901, name: "Axixá do Tocantins"},
85
+ {state: tocantins, ibge_code: 1703800, name: "Buriti do Tocantins"},
86
+ {state: tocantins, ibge_code: 1703826, name: "Cachoeirinha"},
87
+ {state: tocantins, ibge_code: 1703891, name: "Carrasco Bonito"},
88
+ {state: tocantins, ibge_code: 1707405, name: "Esperantina"},
89
+ {state: tocantins, ibge_code: 1710706, name: "Itaguatins"},
90
+ {state: tocantins, ibge_code: 1712454, name: "Luzinópolis"},
91
+ {state: tocantins, ibge_code: 1712801, name: "Maurilândia do Tocantins"},
92
+ {state: tocantins, ibge_code: 1713809, name: "Palmeiras do Tocantins"},
93
+ {state: tocantins, ibge_code: 1714302, name: "Nazaré"},
94
+ {state: tocantins, ibge_code: 1718303, name: "Praia Norte"},
95
+ {state: tocantins, ibge_code: 1718550, name: "Riachinho"},
96
+ {state: tocantins, ibge_code: 1718808, name: "Sampaio"},
97
+ {state: tocantins, ibge_code: 1720002, name: "Santa Terezinha do Tocantins"},
98
+ {state: tocantins, ibge_code: 1720101, name: "São Bento do Tocantins"},
99
+ {state: tocantins, ibge_code: 1720200, name: "São Miguel do Tocantins"},
100
+ {state: tocantins, ibge_code: 1720309, name: "São Sebastião do Tocantins"},
101
+ {state: tocantins, ibge_code: 1720804, name: "Sítio Novo do Tocantins"},
102
+ {state: tocantins, ibge_code: 1701309, name: "Aragominas"},
103
+ {state: tocantins, ibge_code: 1702109, name: "Araguaína"},
104
+ {state: tocantins, ibge_code: 1702158, name: "Araguanã"},
105
+ {state: tocantins, ibge_code: 1702307, name: "Arapoema"},
106
+ {state: tocantins, ibge_code: 1703008, name: "Babaçulândia"},
107
+ {state: tocantins, ibge_code: 1703057, name: "Bandeirantes do Tocantins"},
108
+ {state: tocantins, ibge_code: 1703883, name: "Carmolândia"},
109
+ {state: tocantins, ibge_code: 1705508, name: "Colinas do Tocantins"},
110
+ {state: tocantins, ibge_code: 1707702, name: "Filadélfia"},
111
+ {state: tocantins, ibge_code: 1714880, name: "Nova Olinda"},
112
+ {state: tocantins, ibge_code: 1715705, name: "Palmeirante"},
113
+ {state: tocantins, ibge_code: 1716307, name: "Pau D'Arco"},
114
+ {state: tocantins, ibge_code: 1717206, name: "Piraquê"},
115
+ {state: tocantins, ibge_code: 1718865, name: "Santa Fé do Araguaia"},
116
+ {state: tocantins, ibge_code: 1722107, name: "Xambioá"},
117
+ {state: tocantins, ibge_code: 1701903, name: "Araguacema"},
118
+ {state: tocantins, ibge_code: 1703107, name: "Barrolândia"},
119
+ {state: tocantins, ibge_code: 1703206, name: "Bernardo Sayão"},
120
+ {state: tocantins, ibge_code: 1703909, name: "Caseara"},
121
+ {state: tocantins, ibge_code: 1706001, name: "Couto de Magalhães"},
122
+ {state: tocantins, ibge_code: 1707108, name: "Divinópolis do Tocantins"},
123
+ {state: tocantins, ibge_code: 1707207, name: "Dois Irmãos do Tocantins"},
124
+ {state: tocantins, ibge_code: 1708254, name: "Fortaleza do Tabocão"},
125
+ {state: tocantins, ibge_code: 1708304, name: "Goianorte"},
126
+ {state: tocantins, ibge_code: 1711100, name: "Itaporã do Tocantins"},
127
+ {state: tocantins, ibge_code: 1711803, name: "Juarina"},
128
+ {state: tocantins, ibge_code: 1712504, name: "Marianópolis do Tocantins"},
129
+ {state: tocantins, ibge_code: 1713304, name: "Miranorte"},
130
+ {state: tocantins, ibge_code: 1716653, name: "Pequizeiro"},
131
+ {state: tocantins, ibge_code: 1716703, name: "Colméia"},
132
+ {state: tocantins, ibge_code: 1718402, name: "Presidente Kennedy"},
133
+ {state: tocantins, ibge_code: 1721257, name: "Tupirama"},
134
+ {state: tocantins, ibge_code: 1721307, name: "Tupiratins"},
135
+ {state: tocantins, ibge_code: 1702000, name: "Araguaçu"},
136
+ {state: tocantins, ibge_code: 1704600, name: "Chapada de Areia"},
137
+ {state: tocantins, ibge_code: 1707306, name: "Dueré"},
138
+ {state: tocantins, ibge_code: 1707553, name: "Fátima"},
139
+ {state: tocantins, ibge_code: 1708205, name: "Formoso do Araguaia"},
140
+ {state: tocantins, ibge_code: 1711902, name: "Lagoa da Confusão"},
141
+ {state: tocantins, ibge_code: 1716109, name: "Paraíso do Tocantins"},
142
+ {state: tocantins, ibge_code: 1717503, name: "Pium"}
143
+ ])
144
+
@@ -0,0 +1 @@
1
+ Spree::StockLocation.create! name: 'Padrão', country: Spree::Country.first!
@@ -0,0 +1 @@
1
+ Spree::TaxCategory.create!(:name => 'Padrão', :description => 'Padrão', :is_default => true)
@@ -0,0 +1,100 @@
1
+ require 'highline/import'
2
+
3
+ # see last line where we create an admin if there is none, asking for email and password
4
+ def prompt_for_admin_password
5
+ if ENV['ADMIN_PASSWORD']
6
+ password = ENV['ADMIN_PASSWORD'].dup
7
+ say "Admin Password #{password}"
8
+ else
9
+ password = ask('Password [spree123]: ') do |q|
10
+ q.echo = false
11
+ q.validate = /^(|.{5,40})$/
12
+ q.responses[:not_valid] = 'Invalid password. Must be at least 5 characters long.'
13
+ q.whitespace = :strip
14
+ end
15
+ password = 'spree123' if password.blank?
16
+ end
17
+
18
+ password
19
+ end
20
+
21
+ def prompt_for_admin_field(field_description, var_env, default_value)
22
+
23
+ if ENV[var_env]
24
+ field = ENV[var_env].dup
25
+ say "Admin #{field_description} #{field}"
26
+ else
27
+ field = ask("#{field_description} [#{default_value}]: ") do |q|
28
+ q.echo = true
29
+ q.whitespace = :strip
30
+ end
31
+ field = default_value if field.blank?
32
+ end
33
+
34
+ field
35
+
36
+ end
37
+
38
+ def create_admin_user
39
+ attributes = {
40
+ :password => 'fulano',
41
+ :email => 'admin@bluesoft.com.br',
42
+ :first_name => 'admin',
43
+ :last_name => 'admin',
44
+ :phone => '11 12212122',
45
+ :date_of_birth => 22.years.ago,
46
+ :cpf => CPF.generate,
47
+ :password_confirmation => nil,
48
+ :login => nil
49
+ }
50
+
51
+ if ENV['AUTO_ACCEPT']
52
+ puts 'User will be created with the properties:'
53
+ puts attributes
54
+ else
55
+ puts 'Create the admin user (press enter for defaults).'
56
+ attributes = {
57
+ :email => prompt_for_admin_field('Email', 'ADMIN_EMAIL', 'spree@example.com'),
58
+ :password => prompt_for_admin_password,
59
+ :first_name => prompt_for_admin_field('First Name', 'ADMIN_FIRST_NAME', 'admin'),
60
+ :last_name => prompt_for_admin_field('Last Name', 'ADMIN_LAST_NAME', 'admin'),
61
+ :phone => prompt_for_admin_field('Phone', 'ADMIN_PHONE', '11 12212122'),
62
+ :date_of_birth => prompt_for_admin_field('Date Of Birth', 'ADMIN_DATE_OF_BIRTH', 22.years.ago),
63
+ :cpf => prompt_for_admin_field('CPF', 'ADMIN_CPF', CPF.generate)
64
+ }
65
+ end
66
+
67
+ attributes[:password_confirmation] = attributes[:password]
68
+ attributes[:login] = attributes[:email]
69
+
70
+ load 'spree/user.rb'
71
+
72
+ if Spree::User.find_by_email(attributes[:email])
73
+ say "\nWARNING: There is already a user with the email: #{attributes[:email]}, so no account changes were made. If you wish to create an additional admin user, please run rake spree_auth:admin:create again with a different email.\n\n"
74
+ else
75
+ admin = Spree::User.new(attributes)
76
+ if admin.save
77
+ role = Spree::Role.find_or_create_by(name: 'admin')
78
+ admin.spree_roles << role
79
+ admin.save
80
+ admin.generate_spree_api_key!
81
+ say "Done!"
82
+ else
83
+ say "There was some problems with persisting new admin user:"
84
+ admin.errors.full_messages.each do |error|
85
+ say error
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ if Spree::User.admin.empty?
92
+ create_admin_user
93
+ else
94
+ puts 'Admin user has already been previously created.'
95
+ if agree('Would you like to create a new admin user? (yes/no)')
96
+ create_admin_user
97
+ else
98
+ puts 'No admin user created.'
99
+ end
100
+ end
@@ -0,0 +1,13 @@
1
+ class CreateSpreeCities < ActiveRecord::Migration
2
+ def change
3
+ create_table :spree_cities do |t|
4
+ t.references :state
5
+ t.string :name
6
+ t.integer :ibge_code
7
+
8
+ t.timestamps
9
+ end
10
+
11
+ add_index :spree_cities, :state_id
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ class RemoveCityFromSpreeAddress < ActiveRecord::Migration
2
+ def change
3
+ remove_column :spree_addresses, :city
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddCityToSpreeAddress < ActiveRecord::Migration
2
+ def change
3
+ add_reference :spree_addresses, :city, index: true
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ class AddNumberAndDistrictToSpreeAddress < ActiveRecord::Migration
2
+ def change
3
+ add_column :spree_addresses, :number, :integer
4
+ add_column :spree_addresses, :district, :string
5
+ end
6
+ end
@@ -0,0 +1,10 @@
1
+ class AddDetailsToSpreeUser < ActiveRecord::Migration
2
+ def change
3
+ unless defined?(User)
4
+ change_table :spree_users do |t|
5
+ t.string :first_name, :last_name, :cpf, :phone, :alternative_phone
6
+ t.datetime :date_of_birth
7
+ end
8
+ end
9
+ end
10
+ end
data/db/seeds.rb ADDED
@@ -0,0 +1,5 @@
1
+ # Loads seed data out of default dir
2
+ default_path = File.join(File.dirname(__FILE__), 'default')
3
+
4
+ Rake::Task['db:load_dir'].reenable
5
+ Rake::Task['db:load_dir'].invoke(default_path)
@@ -0,0 +1,31 @@
1
+ module SpreeBrCommon
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+
5
+ class_option :auto_run_migrations, :type => :boolean, :default => false
6
+
7
+ def add_javascripts
8
+ append_file 'vendor/assets/javascripts/spree/frontend/all.js', "//= require spree/frontend/spree_br_common\n"
9
+ append_file 'vendor/assets/javascripts/spree/backend/all.js', "//= require spree/backend/spree_br_common\n"
10
+ end
11
+
12
+ def add_stylesheets
13
+ inject_into_file 'vendor/assets/stylesheets/spree/frontend/all.css', " *= require spree/frontend/spree_br_common\n", :before => /\*\//, :verbose => true
14
+ inject_into_file 'vendor/assets/stylesheets/spree/backend/all.css', " *= require spree/backend/spree_br_common\n", :before => /\*\//, :verbose => true
15
+ end
16
+
17
+ def add_migrations
18
+ run 'bundle exec rake railties:install:migrations FROM=spree_br_common'
19
+ end
20
+
21
+ def run_migrations
22
+ run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask 'Would you like to run the migrations now? [Y/n]')
23
+ if run_migrations
24
+ run 'bundle exec rake db:migrate'
25
+ else
26
+ puts 'Skipping rake db:migrate, don\'t forget to run it!'
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,20 @@
1
+ module SpreeBrCommon
2
+ class Engine < Rails::Engine
3
+ require 'spree/core'
4
+ isolate_namespace Spree
5
+ engine_name 'spree_br_common'
6
+
7
+ # use rspec for tests
8
+ config.generators do |g|
9
+ g.test_framework :rspec
10
+ end
11
+
12
+ def self.activate
13
+ Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
14
+ Rails.configuration.cache_classes ? require(c) : load(c)
15
+ end
16
+ end
17
+
18
+ config.to_prepare &method(:activate).to_proc
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ FactoryGirl.modify do
2
+ factory :address do
3
+ number 122
4
+ district 'Carville'
5
+ city {|address| address.association(:city)}
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ FactoryGirl.define do
2
+ factory :city, class: Spree::City do
3
+ name 'Ashville'
4
+ ibge_code 32323
5
+
6
+ state { |city| city.association(:state) }
7
+ end
8
+ end
@@ -0,0 +1,12 @@
1
+ require "cpf_cnpj"
2
+
3
+ FactoryGirl.modify do
4
+ factory :user do
5
+ first_name 'Diego'
6
+ last_name 'Domingues'
7
+ date_of_birth { 18.years.ago }
8
+ cpf CPF.generate.to_s
9
+ phone '11-12211221'
10
+ alternative_phone '11-12211221'
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ Dir["#{File.dirname(__FILE__)}/factories/**"].each do |f|
2
+ require File.expand_path(f)
3
+ end
@@ -0,0 +1,2 @@
1
+ require 'spree_core'
2
+ require 'spree_br_common/engine'
@@ -0,0 +1,89 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Checkout', type: :feature, inaccessible: true do
4
+ include_context 'checkout setup'
5
+
6
+ let!(:city) { create(:city, state: Spree::State.first!) }
7
+
8
+ context 'visitor makes checkout as guest without registration' do
9
+ before(:each) do
10
+ stock_location.stock_items.update_all(count_on_hand: 1)
11
+ end
12
+
13
+ context 'full checkout', :vcr do
14
+ before do
15
+ shipping_method.calculator.update!(preferred_amount: 10)
16
+ mug.shipping_category = shipping_method.shipping_categories.first
17
+ mug.save!
18
+ end
19
+
20
+ it 'does not break the per-item shipping method calculator', :js => true do
21
+ add_mug_to_cart
22
+ click_button 'Checkout'
23
+
24
+ fill_in 'order_email', :with => 'test@example.com'
25
+ click_button 'Continue'
26
+
27
+ fill_in_address
28
+ click_button 'Save and Continue'
29
+
30
+ expect(page).not_to have_content("undefined method `promotion'")
31
+ click_button 'Save and Continue'
32
+ expect(page).to have_content('Shipping total: $10.00')
33
+ end
34
+
35
+ context 'in Brazil' do
36
+ before do
37
+ brazil = create(:country, name: 'Brasil')
38
+ minas_gerais_state = create(:state, abbr: 'MG', name: 'Minas Gerais', country: brazil)
39
+ minas_gerais_city = create(:city, name: 'Minas Gerais', state: minas_gerais_state)
40
+ @sao_paulo_state = create(:state, abbr: 'SP', name: 'São Paulo', country: brazil)
41
+ @sao_paulo_city = create(:city, name: 'São Paulo', state: @sao_paulo_state)
42
+
43
+ Spree::Config[:default_country_id] = brazil.id
44
+ end
45
+
46
+ it 'should autocomplete zipcode', :js => true do
47
+ add_mug_to_cart
48
+ click_button 'Checkout'
49
+
50
+ fill_in 'order_email', :with => 'test@example.com'
51
+ click_button 'Continue'
52
+
53
+ address = 'order_bill_address_attributes'
54
+ fill_in "#{address}_zipcode", with: '04089000'
55
+
56
+ wait_for_ajax
57
+
58
+ expect(find_by_id("#{address}_address1").value).to eq('Alameda dos Maracatins')
59
+ expect(find_by_id("#{address}_district").value).to eq('Indianópolis')
60
+ expect(find_by_id("#{address}_state_id").value).to eq(@sao_paulo_state.id.to_s)
61
+ expect(find_by_id("#{address}_city_id").value).to eq(@sao_paulo_city.id.to_s)
62
+ end
63
+
64
+ after do
65
+ Spree::Config[:default_country_id] = nil
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ def fill_in_address
72
+ address = 'order_bill_address_attributes'
73
+ fill_in "#{address}_firstname", with: 'Ryan'
74
+ fill_in "#{address}_lastname", with: 'Bigg'
75
+ fill_in "#{address}_address1", with: 'Swan Street'
76
+ fill_in "#{address}_number", with: '143'
77
+ fill_in "#{address}_district", with: 'Carville'
78
+ select 'Alabama', from: "#{address}_state_id"
79
+ select city.name, from: "#{address}_city_id"
80
+ fill_in "#{address}_zipcode", with: '12345'
81
+ fill_in "#{address}_phone", with: '(555) 555-5555'
82
+ end
83
+
84
+ def add_mug_to_cart
85
+ visit spree.root_path
86
+ click_link mug.name
87
+ click_button 'add-to-cart-button'
88
+ end
89
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Accounts', type: :feature, inaccessible: true, js: true do
4
+ def login_as(user)
5
+ visit spree.login_path
6
+ fill_in 'Email', with: user.email
7
+ fill_in 'Password', with: user.password
8
+ click_button 'Login'
9
+ end
10
+
11
+ let(:user) { create(:user) }
12
+
13
+ before do
14
+ login_as(user)
15
+ end
16
+
17
+ context 'editing' do
18
+ scenario 'should rename user with success' do
19
+ Spree::Auth::Config.set(signout_after_password_change: false)
20
+ click_link 'My Account'
21
+
22
+ expect(page).to have_text user.email
23
+ click_link 'Edit'
24
+ fill_in 'First Name', with: 'Diego'
25
+ fill_in 'Last Name', with: 'Domingues'
26
+ fill_in Spree.t(:date_of_birth), with: 19.years.ago.strftime(Spree.t('date_picker.format', default: '%Y/%m/%d'))
27
+ click_button 'Update'
28
+
29
+ expect(page).to have_text 'Diego Domingues'
30
+ expect(page).to have_text 'Account updated'
31
+ end
32
+ end
33
+
34
+ context 'showing' do
35
+ scenario 'should show details of user' do
36
+ click_link 'My Account'
37
+
38
+ expect(page).to have_text user.full_name
39
+ expect(page).to have_text user.cpf_formatted
40
+ expect(page).to have_text user.phone
41
+ expect(page).to have_text user.alternative_phone if user.alternative_phone.present?
42
+ expect(page).to have_text user.date_of_birth.to_date
43
+ expect(page).to have_text user.email
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Sign Up', type: :feature, inaccessible: true do
4
+ context 'with valid data' do
5
+ scenario 'create a user with success', js: true do
6
+ visit spree.signup_path
7
+
8
+ fill_in Spree.t(:first_name), with: 'Carlos'
9
+ fill_in Spree.t(:last_name), with: 'Andrade'
10
+ fill_in Spree.t(:cpf), with: '53229124367'
11
+ fill_in Spree.t(:date_of_birth), with: 18.years.ago.strftime(Spree.t('date_picker.format', default: '%Y/%m/%d'))
12
+ fill_in Spree.t(:email), with: 'email@person.com'
13
+ fill_in Spree.t(:phone), with: '11 12211221'
14
+ fill_in Spree.t(:alternative_phone), with: '11 12211221'
15
+ fill_in Spree.t(:password), with: 'password'
16
+ fill_in 'Password Confirmation', with: 'password'
17
+
18
+ click_button 'Create'
19
+
20
+ expect(page).to have_text 'You have signed up successfully.'
21
+ expect(Spree::User.count).to eq(1)
22
+ end
23
+ end
24
+ end