"
+ }
+
+ bodyString = bodyString.replace("[[ORDER_DETAILS]]", orderDetails)
+
+ def adminEmail = applicationService.getAdminEmailAddress()
+ def allEmails = customerToAddress
+ if(adminEmail){
+ allEmails += ",${adminEmail}"
+ }
+
+ emailService.send(allEmails, fromAddress, customerSubject, bodyString)
+
+ }
+
}
diff --git a/grails-app/controllers/greenfield/UrlMappings.groovy b/grails-app/controllers/greenfield/UrlMappings.groovy
index 897f4552..8cc09d68 100644
--- a/grails-app/controllers/greenfield/UrlMappings.groovy
+++ b/grails-app/controllers/greenfield/UrlMappings.groovy
@@ -10,14 +10,19 @@ class UrlMappings {
}
"/"{
- controller = "store"
- action = "index"
+ controller = "page"
+ action = "home"
}
"/shopping_cart"{
controller = "shoppingCart"
}
+ "/store/index"{
+ controller = "page"
+ action = "home"
+ }
+
"500"(view:'/error')
"404"(view:'/notFound')
diff --git a/grails-app/controllers/greenfield/common/BaseController.groovy b/grails-app/controllers/greenfield/common/BaseController.groovy
index 19b19fe9..7a48397a 100644
--- a/grails-app/controllers/greenfield/common/BaseController.groovy
+++ b/grails-app/controllers/greenfield/common/BaseController.groovy
@@ -17,6 +17,7 @@ import org.greenfield.Specification
import org.greenfield.Variant
import org.greenfield.Page
import org.greenfield.State
+import org.greenfield.Layout
import org.greenfield.log.ProductViewLog
import org.greenfield.log.PageViewLog
diff --git a/grails-app/domain/org/greenfield/Account.groovy b/grails-app/domain/org/greenfield/Account.groovy
index 63eb14dd..b36b4d02 100644
--- a/grails-app/domain/org/greenfield/Account.groovy
+++ b/grails-app/domain/org/greenfield/Account.groovy
@@ -30,17 +30,18 @@ class Account {
boolean hasAdminRole
//TODO: Replace with Address
- //TODO: Develop scheme for international
String address1
String address2
String city
State state
+ Country country
String zip
String phone
boolean addressVerified
+ boolean emailOptIn
Date dateCreated
Date lastUpdated
@@ -122,11 +123,13 @@ class Account {
address1(nullable:true)
address2(nullable:true)
city(nullable:true)
+ country(nullable:true)
state(nullable:true)
zip(nullable:true)
phone(nullable:true)
hasAdminRole(nullabe:true)
addressVerified(nullable:true, default:true)
+ emailOptIn(nullable:true, default:true)
ipAddress(blank:true, nullable:true)
resetUUID(nullable:true)
catalogViews(nullable:true, default:0)
@@ -134,6 +137,10 @@ class Account {
pageViews(nullable:true, default:0)
searches(nullable:true, default:0)
orders(nullable:true, default:0)
+ enabled(nullable:true, default:true)
+ accountExpired(nullable:true)
+ accountLocked(nullable:true)
+ passwordExpired(nullable:true)
id generator: 'sequence', params:[sequence:'ID_ACCOUNT_PK_SEQ']
}
diff --git a/grails-app/domain/org/greenfield/Catalog.groovy b/grails-app/domain/org/greenfield/Catalog.groovy
index f4148943..848c41f2 100644
--- a/grails-app/domain/org/greenfield/Catalog.groovy
+++ b/grails-app/domain/org/greenfield/Catalog.groovy
@@ -10,6 +10,7 @@ class Catalog {
String name
String description
+ Layout layout
Date dateCreated
Date lastUpdated
diff --git a/grails-app/domain/org/greenfield/Layout.groovy b/grails-app/domain/org/greenfield/Layout.groovy
index 612194fc..81349674 100644
--- a/grails-app/domain/org/greenfield/Layout.groovy
+++ b/grails-app/domain/org/greenfield/Layout.groovy
@@ -10,6 +10,9 @@ class Layout {
String name
String content
+ String css
+ String javascript
+ boolean defaultLayout
Date dateCreated
Date lastUpdated
@@ -20,8 +23,11 @@ class Layout {
static constraints = {
uuid(nullable:true)
- name(unique:true)
- content(size:0..65535)
+ name(nullable:false, unique:true)
+ content(blank:false, nullable:false, size:0..65535)
+ css(blank:true, nullable:true, size:0..65535)
+ javascript(blank:true, nullable:true, size:0..65535)
+ defaultLayout(nullable:false, default:false)
id generator: 'sequence', params:[sequence:'ID_LAYOUT_PK_SEQ']
}
diff --git a/grails-app/domain/org/greenfield/Page.groovy b/grails-app/domain/org/greenfield/Page.groovy
index 409c507b..8d0e4cf1 100644
--- a/grails-app/domain/org/greenfield/Page.groovy
+++ b/grails-app/domain/org/greenfield/Page.groovy
@@ -10,6 +10,7 @@ class Page {
String title
String content
+ Layout layout
Date dateCreated
Date lastUpdated
@@ -22,6 +23,7 @@ class Page {
uuid(nullable:true)
title(nullable:false, unique:true)
content(size:0..65535)
+ layout(nullable:false)
id generator: 'sequence', params:[sequence:'ID_PAGE_PK_SEQ']
}
diff --git a/grails-app/domain/org/greenfield/Product.groovy b/grails-app/domain/org/greenfield/Product.groovy
index 115291d1..7bbe7772 100644
--- a/grails-app/domain/org/greenfield/Product.groovy
+++ b/grails-app/domain/org/greenfield/Product.groovy
@@ -4,6 +4,7 @@ class Product {
Product(){
this.uuid = UUID.randomUUID().toString()
+ this.purchaseable = true
}
String uuid
@@ -22,6 +23,7 @@ class Product {
Date lastUpdated
boolean disabled
+ boolean purchaseable
double length
double width
@@ -30,6 +32,10 @@ class Product {
String productNo
+ String harmonizedCode
+
+ Layout layout
+
static hasMany = [ catalogs: Catalog, additionalPhotos: AdditionalPhoto, productOptions: ProductOption, productSpecifications: ProductSpecification ]
@@ -48,13 +54,15 @@ class Product {
price(nullable:false)
salesPrice(nullable:true)
imageUrl(nullable:true)
- disabled(nullable:true)
+ disabled(nullable:true, default:false)
+ purchaseable(nullable:true, default:true)
detailsImageUrl(nullable:true)
length(nullable:true)
width(nullable:true)
height(nullable:true)
weight(nullable:false)
productNo(nullable:true)
+ harmonizedCode(nullable:true)
id generator: 'sequence', params:[sequence:'ID_PRODUCT_PK_SEQ']
}
}
diff --git a/grails-app/domain/org/greenfield/ShoppingCart.groovy b/grails-app/domain/org/greenfield/ShoppingCart.groovy
index 1d3e288a..2a6688fd 100644
--- a/grails-app/domain/org/greenfield/ShoppingCart.groovy
+++ b/grails-app/domain/org/greenfield/ShoppingCart.groovy
@@ -25,6 +25,8 @@ class ShoppingCart {
String shipmentCarrier
String shipmentService
String shipmentRateId
+ String shipmentCurrency
+
static hasMany = [ shoppingCartItems : ShoppingCartItem ]
@@ -41,6 +43,7 @@ class ShoppingCart {
shipmentCarrier(nullable:true)
shipmentService(nullable:true)
shipmentRateId(nullable:true)
+ shipmentCurrency(nullable:true)
id generator: 'sequence', params:[sequence:'ID_SHOPPING_CART_SEQ']
}
diff --git a/grails-app/domain/org/greenfield/Transaction.groovy b/grails-app/domain/org/greenfield/Transaction.groovy
index 4fee9182..1111bd6a 100644
--- a/grails-app/domain/org/greenfield/Transaction.groovy
+++ b/grails-app/domain/org/greenfield/Transaction.groovy
@@ -16,11 +16,9 @@ class Transaction {
String status
Date orderDate
- String chargeId
String postageId
String postageUrl
-
Date dateCreated
Date lastUpdated
@@ -29,6 +27,7 @@ class Transaction {
String shipAddress2
String shipCity
State shipState
+ Country shipCountry
String shipZip
/** TODO : CONSIDER REMOVING **/
@@ -39,6 +38,9 @@ class Transaction {
State billState
String billZip
+ String chargeId
+ String gateway
+ String refundChargeId
Account account
ShoppingCart shoppingCart
@@ -66,6 +68,7 @@ class Transaction {
shipAddress2(nullable:true)
shipCity(nullable:true)
shipState(nullable:true)
+ shipCountry(nullable:true)
shipZip(nullable:false)
billName(nullable:true)
billAddress1(nullable:true)
@@ -73,6 +76,8 @@ class Transaction {
billCity(nullable:true)
billState(nullable:true)
billZip(nullable:true)
+ gateway(nullable:true)
+ refundChargeId(nullable:true)
id generator: 'sequence', params:[sequence:'ID_TRANSACTION_PK_SEQ']
}
diff --git a/grails-app/i18n/messages.properties b/grails-app/i18n/messages.properties
index b0451362..44ef5998 100644
--- a/grails-app/i18n/messages.properties
+++ b/grails-app/i18n/messages.properties
@@ -1,3 +1,138 @@
+administration=Administration
+dashboard=Dashboard
+products=Products
+catalogs=Catalogs
+orders=Orders
+pages=Pages
+accounts=Accounts
+import.export=Import/Export
+store.layouts=Store Layouts
+settings=Settings
+welcome.back=Welcome back
+store.front=Store Front
+logout=Logout
+close=Close
+out.of.stock=Out of Stock
+customers=Customers
+abandoned.carts=Abandoned Carts
+date.range=Date Range
+to=to
+all.data=All Data
+store.overview=Store Overview
+sales=Sales
+total.sales=Total Sales
+total.orders=Total Orders
+average.order=Average Order
+checkout.rate=Checkout Rate
+
+top.viewed.products=TOP VIEWED PRODUCTS
+top.viewed.pages=TOP VIEWED PAGES
+top.search.terms=TOP SEARCH TERMS
+top.viewed.catalogs=TOP VIEWED CATALOGS
+no.data.available=No Data Available
+
+view.all=View All
+
+greenfield.google.analytics=Greenfield leverages Google Analytics for detailed website statistics.
+visit.google.analytics=Visit Google Analytics
+
+calculating.please.wait=Calculating Please Wait
+
+interested.contributing=Interested in contributing or need help? Contact croteau.mike@gmail.com. I could use your help improving this project. Thank you.
+
+
+##Products List Page
+development.mode=Development Mode...
+new.product=New Product
+search.by.name=search by name and description
+search=Search
+id=Id
+name=Name
+quantity=Quantity
+price=Price
+sales.price=Sales Price
+no.products.found=No products found...
+no.catalogs.products=There are no catalogs yet
+create.catalog.products=You need to create a catalog before creating products.
+create.catalog=Create Catalog
+
+
+##Create Product Screen
+create.product=Create Product
+product.catalogs=Product Catalogs
+selecting.subcatalog=Selecting a Subcatalog will automatically select all parent Catalogs up to the top level Catalog.
+accept.close=Accept & Close
+name.unique=Name must be unique
+add.remove.catalogs=Add/Remove Catalogs
+leave.blank=Leave blank or enter same price for no sale price
+quantity.zero=Quantity of 0 will categorize product as “out of stock”
+main.image=Main Image
+weight=Weight
+weight.ounces=Important : Weight is in ounces.
+weight.calculations=Weight is in ounces & is required at a minimum to calculate shipping realtime using
+length=Length
+width=Width
+height=Height
+length.width.height=Length, Width & Height are optional for rate calculation (Inches)
+description=Description
+accepts.html=Accepts HTML as well as plain text
+product.item=Product/Item
+product.optional=Optional identifier used else where
+harmonized.code=Harmonized Code
+product.optional.harmonized=Optional, only used when customs information is needed when generating a shipping label
+layout=Layout
+no.catalogs.selected=No Catalogs selected. Please select a Catalog to continue
+add.catalogs=Add Catalogs
+
+
+
+
+
+##Edit Product Screen
+edit.product=Edit Product
+warning=Warning
+changing.catalogs.remove=Changing catalogs will remove any product specifications for this product
+product.disabled=Product is currently disabled
+url=Url
+test=Test
+additional.photos=Additional Photos
+manage.additional.photos=Manage Additional Photos
+add.additional.photos=Add Additional Photo
+product.options=Product Options
+manage.product.options=Manage Product Options
+add.product.options=Add Product Options
+product.specficications=Product Specifications
+manage.product.specifications=Manage Product Specifications
+disabled=Disabled
+are.you.sure=Are you sure?
+update.product=Update Product
+purchaseable=Purchaseable
+
+
+##Show Product Screen
+show.product=Show Product
+
+
+
+
+
+
+
+
+
+save=Save
+edit=Edit
+update=Update
+delete=Delete
+cancel=Cancel
+back=Back
+back.to.list=Back to List
+
+
+
+
+
+
default.doesnt.match.message=Property [{0}] of class [{1}] with value [{2}] does not match the required pattern [{3}]
default.invalid.url.message=Property [{0}] of class [{1}] with value [{2}] is not a valid URL
default.invalid.creditCard.message=Property [{0}] of class [{1}] with value [{2}] is not a valid credit card number
diff --git a/grails-app/i18n/messages_fr.properties b/grails-app/i18n/messages_fr.properties
index 55721641..f8783611 100644
--- a/grails-app/i18n/messages_fr.properties
+++ b/grails-app/i18n/messages_fr.properties
@@ -1,3 +1,47 @@
+dashboard=Tableau de bord
+products=Des produits
+catalogs=Des catalogues
+orders=Ordres
+pages=Des pages
+accounts=Comptes
+import.export=Import/Export
+store.layouts=Layouts
+settings=Réglages
+welcome.back=Nous saluons le retour
+store.front=Vitrine
+logout=Connectez - Out
+close=Fermer
+out.of.stock=En rupture de stock
+customers=Les clients
+abandoned.carts=Chariots abandonnés
+date.range=Plage de dates
+to=à
+all.data=Toutes les données
+store.overview=Aperçu du magasin
+sales=Ventes
+total.sales=Ventes totales
+total.orders=Total des commandes
+average.order=Ordre moyen
+checkout.rate=Taux de règlement
+
+top.viewed.products=LES PRODUITS LES PLUS VUS
+top.viewed.pages=LES PAGES LES PLUS VUES
+top.search.terms=TOP TERMES DE RECHERCHE
+top.viewed.catalogs=catalogues les plus consultés
+no.data.available=Pas de données disponibles
+
+view.all=Voir tout
+
+greenfield.google.analytics=Greenfield exploite Google Analytics pour obtenir des statistiques détaillées sur son site Web.
+visit.google.analytics=Visitez Google Analytics
+
+calculating.please.wait=Calculer s'il vous plaît attendre
+
+interested.contributing=Intéressé à contribuer ou besoin d'aide? Contactez croteau.mike@gmail.com. Je pourrais utiliser votre aide pour améliorer ce projet. Je vous remercie.
+
+
+
+##
default.doesnt.match.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne correspond pas au pattern [{3}]
default.invalid.url.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une URL valide
default.invalid.creditCard.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas un numéro de carte de crédit valide
diff --git a/grails-app/i18n/messages_pt_BR.properties b/grails-app/i18n/messages_pt_BR.properties
index b5044e23..2469f171 100644
--- a/grails-app/i18n/messages_pt_BR.properties
+++ b/grails-app/i18n/messages_pt_BR.properties
@@ -1,3 +1,122 @@
+dashboard=Painel de Controle
+products=Produtos
+catalogs=Catálogos
+orders=Encomendas
+pages=Páginas
+accounts=Contas
+import.export=Importação / Exportação
+store.layouts=Armazenar layouts
+settings=Definições
+welcome.back=Bem vindo de volta
+store.front=Montra
+logout=Sair
+close=Perto
+out.of.stock=Fora de estoque
+customers=Clientes
+abandoned.carts=Carrinhos Abandonados
+date.range=Intervalo de datas
+to=para
+all.data=Todos os dados
+store.overview=Visão geral da loja
+sales=Vendas
+total.sales=Vendas totais
+total.orders=Total de pedidos
+average.order=Ordem Média
+checkout.rate=Taxa de check-out
+
+top.viewed.products=Principais produtos visualizados
+top.viewed.pages=Principais Páginas Visualizadas
+top.search.terms=Principais palavras de pesquisa
+top.viewed.catalogs=Catálogos mais vistos
+no.data.available=Nenhum dado disponível
+
+view.all=Ver tudo
+
+greenfield.google.analytics=O Greenfield aproveita o Google Analytics para obter estatísticas detalhadas do site
+calculating.please.wait=Calculando por favor, aguarde
+
+interested.contributing=Interessado em contribuir ou precisar de ajuda? Entre em contato com croteau.mike@gmail.com. Eu poderia usar sua ajuda para melhorar este projeto. Obrigado.
+
+
+##Products List Page
+development.mode=Modo de desenvolvimento ...
+new.product=Novo produto
+search.by.name=pesquisar por nome e descrição
+search=Procurar
+id=Identidade
+name=Nome
+quantity=Quantidade
+price=Preço
+sales.price=Preços de venda
+no.products.found=Nenhum produto encontrado ...
+no.catalogs.products=Ainda não existem catálogos
+create.catalog.products=Você precisa criar um catálogo antes de criar produtos.
+create.catalog=Criar catálogo
+
+
+##Create Product Screen
+create.product=Criar Produto
+product.catalogs=Catálogos de produtos
+selecting.subcatalog=Selecionar um Sub-Catálogo selecionará automaticamente todos os Catálogos-pais até o Catálogo de nível superior.
+accept.close=Aceitar e fechar
+name.unique=O nome deve ser único
+add.remove.catalogs=Adicionar / Remover Catálogos
+leave.blank=Deixe em branco ou insira o mesmo preço por nenhum preço de venda
+quantity.zero=A quantidade de 0 categorizará o produto como "esgotado"
+main.image=Imagem principal
+weight=Peso
+weight.ounces=Importante: O peso está em onças.
+weight.calculations=O peso é em onças e é necessário no mínimo para calcular o tempo real de envio usando
+length=Comprimento
+width=Largura
+height=Altura
+length.width.height=Comprimento, Largura e Altura são opcionais para o cálculo da taxa (polegadas)
+description=Descrição
+accepts.html=Aceita HTML, bem como texto simples
+product.item=Produto / Item
+product.optional=Identificador opcional usado em outro lugar
+harmonized.code=Código Harmonizado
+product.optional.harmonized=Opcional, usado somente quando as informações da alfândega são necessárias ao gerar uma etiqueta de remessa
+layout=Layout
+no.catalogs.selected=Nenhum catálogo selecionado. Por favor selecione um Catálogo para continuar
+add.catalogs=Adicionar catálogos
+
+
+##Edit Product Screen
+edit.product=Editar produto
+warning=Aviso
+changing.catalogs.remove=A alteração de catálogos removerá as especificações do produto deste produto
+product.disabled=Produto está atualmente desativado
+url=URL
+test=Teste
+additional.photos=Fotos Adicionais
+manage.additional.photos=Gerenciar fotos adicionais
+add.additional.photos=Adicionar foto adicional
+product.options=Opções do produto
+manage.product.options=Gerenciar opções de produtos
+add.product.options=Adicionar opções de produto
+product.specficications=Especificações do produto
+manage.product.specifications=Gerenciar especificações do produto
+disabled=Desativado
+are.you.sure=Você tem certeza
+update.product=Atualizar produto
+purchaseable=Purchaseable
+
+
+##Show Product Screen
+show.product=Mostrar produto
+
+
+save=Salve
+edit=Editar
+update=Atualizar
+delete=Excluir
+cancel=Cancelar
+back=De volta
+
+
+
+
#
# Translated by Lucas Teixeira - lucastex@gmail.com
#
diff --git a/grails-app/init/greenfield/BootStrap.groovy b/grails-app/init/greenfield/BootStrap.groovy
index 5d17e40d..26f0568a 100644
--- a/grails-app/init/greenfield/BootStrap.groovy
+++ b/grails-app/init/greenfield/BootStrap.groovy
@@ -33,6 +33,7 @@ import org.greenfield.log.SearchLog
import java.util.Random
import groovy.io.FileType
+import org.greenfield.CountryStateHelper
class BootStrap {
@@ -47,14 +48,21 @@ class BootStrap {
def springSecurityService
def missingUuidHelperService
+ def applicationService
+
+ //TODO:move these constants to reusable, check ConfigurationController, LayoutController and ApplicationService
+ private final String SETTINGS_FILE = "settings.properties"
+ private final String CHECKOUT_PREVIEW = "checkout.preview.layout"
+ private final String CHECKOUT_SCREEN = "checkout.screen.layout"
+ private final String CHECKOUT_SUCCESS = "checkout.success.layout"
+ private final String REGISTRATION_SCREEN = "registration.screen.layout"
def init = { servletContext ->
println "***********************************************"
println "******* Bootstrap *******"
println "***********************************************"
- createCountries()
- createStates()
+ createCountriesAndStates()
createLayout()
createPages()
createRoles()
@@ -63,12 +71,14 @@ class BootStrap {
println 'Accounts : ' + Account.count()
//Development Data
- //createDevelopmentData()//TODO:refactor
- //createDevelopmentDataSimple()//TODO:refactor
+ if(Environment.current == Environment.DEVELOPMENT) {
+ createDevelopmentData()
+ }
missingUuidHelperService.correctMissingUuids()
//calculateResolveCountData()
+ n()
}
//TODO:refactor
@@ -127,368 +137,151 @@ class BootStrap {
def createLayout(){
-
- if(Layout.count() == 0){
-
+
+ def existingLayout = Layout.findByName("Store Layout: Preset")
+ if(!existingLayout){
File layoutFile = grailsApplication.mainContext.getResource("templates/storefront/layout.html").file
String layoutContent = layoutFile.text
+ File cssFile = grailsApplication.mainContext.getResource("css/store.css").file
+ String css = cssFile.text
+
def layout = new Layout()
layout.content = layoutContent
- layout.name = "STORE_LAYOUT"
- layout.save(flush:true)
+ layout.name = "Store Layout: Preset"
+ layout.css = css
+ layout.defaultLayout = true
+ layout.save(flush:true)
+ setDefaultScreensLayouts(layout.id.toString())
}
println "Layouts : ${Layout.count()}"
}
+
+
+ def setDefaultScreensLayouts(layoutId){
+
+ Properties prop = new Properties();
+ try{
+ File propertiesFile = grailsApplication.mainContext.getResource("settings/${SETTINGS_FILE}").file
+ FileInputStream inputStream = new FileInputStream(propertiesFile)
+
+ prop.load(inputStream);
+ prop.setProperty(CHECKOUT_PREVIEW, layoutId);
+ prop.setProperty(CHECKOUT_SCREEN, layoutId);
+ prop.setProperty(CHECKOUT_SUCCESS, layoutId);
+ prop.setProperty(REGISTRATION_SCREEN, layoutId)
+ def absolutePath = grailsApplication.mainContext.servletContext.getRealPath('settings')
+ absolutePath = absolutePath.endsWith("/") ? absolutePath : absolutePath + "/"
+ def filePath = absolutePath + SETTINGS_FILE
+
+ prop.store(new FileOutputStream(filePath), null);
+
+
+ }catch(Exception e){
+ e.printStackTrace()
+ }
+
+ }
def createPages(){
- createHomepage()
- createAboutUs()
- createContactUs()
- createPrivacyPolicy()
+ def layout = Layout.findByDefaultLayout(true)
+ createHomepage(layout)
+ createAboutUs(layout)
+ createContactUs(layout)
+ createPrivacyPolicy(layout)
println "Pages : ${Page.count()}"
}
- def createHomepage(){
+ def createHomepage(layout){
def homepage = Page.findByTitle("Home")
if(!homepage){
def home = new Page()
home.title = "Home"
home.content = "Put your home page content here..."
+ home.layout = layout
home.save(flush:true)
}
}
- def createAboutUs(){
+ def createAboutUs(layout){
def aboutUs = Page.findByTitle("About Us")
if(!aboutUs){
def page = new Page()
page.title = "About Us"
page.content = "
Located downtown, we are a small boutique gift shop specializing in casino products. Let us help you choose the perfect set of poker chips or porcelain dice.
Our knowledgeable and friendly staff is ready to assist you. We will gift wrap, pack and ship any purchase.
Your privacy is important to us. Any information, both personal and financial, given to Suites Spade's Gift Shop will not be sold or shared with any third parties.
In order for Greenfield to work, you need to have a payment gateway account with either Stripe or Braintree. These services allow you to quickly setup Merchant accounts to
+ start accepting payments (recommended : Stripe).
+ Return to Payment Settings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
${flash.message}
+
+
+ Return to Payment Settings
+
+
+
+
+
+ Return to Payment Settings
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/grails-app/views/configuration/settings.gsp b/grails-app/views/configuration/settings.gsp
index 05b69538..22fd28af 100644
--- a/grails-app/views/configuration/settings.gsp
+++ b/grails-app/views/configuration/settings.gsp
@@ -5,15 +5,18 @@
Greenfield : Settings
+
+
+
+
-
-
-
-
+
+
+
@@ -27,25 +30,51 @@