Designbest Commerce
Nop Commerce
Il framework si adatta alle nostre esigenze.
Ipotesi di integrazione
Su Designbest navigazione tra i prodotti (occasioni) fino all' aggiunta al carrello .
Implementazione su Designbest di un quasi carrello in alto a destra che mostra il numero di prodotti.
Al click si apre la pagina carrello di NopCommerce.
A questo punto si continua col checkout da NopCommerce.
Problemi correlati
- Sincronizzazione di utenti tra NopCommerce e Designbest
- Profili presenti su Designbest e non su Nop
- Viceversa
- Utenti che creano il profilo su Nop
- Cambio password da Designbest o da NopCommerce
- Assenza province italiane durante checkout, aggiornabile tramite inserimento province in tabella
StateProvince
Per affrontare i problemi di sincronizzazione di utenti si potrebbe procedere eliminando totalmente la possibilità di loggarsi su Nop. Designbest si occuperebbe di creare l'utente su Nop e popolare i suoi ordini in modo che la pagina carrello abbia tutto il necessario per procedere.
Note su Nop
- Le password sono cifrate nella tabella CustomerPassword mantenendo uno storico di tutte le password dell'utente
Problemi del framework
- [SOLVED] Le e-mail, dopo le configurazioni, non partono perché a causa di un bug la password nel Database arriva sbagliata. SOLUZIONE Accedendo al database manualmente nella tabella
EmailAccountinserire da Sql Management Studio la password nel campo giusto - [SOLVED] I task schedulati funzionano solo se avviati manualmente, purtroppo l'applicativo sembra non considerarli. Le email ai clienti vengono messe in una coda messaggi dovrebbero essere controllate ogni 60 secondi, ma non partono mai finché non si avvia manualmente il task. SOLUZIONE il problema era legato alla presenza di Basic Authentication di IIS. A quanto pare i task avviano un webservice. Disattivandola tutto torna a funzionare.
- [SOLVED] Le email non sono dirette ai singoli vendor configurati ma arrivano tutte allo Store Principale (root). SOLUZIONE da Root sotto Clienti->Venditori e dentro al venditore ha modificato il campo email
- I Vendor e i Manufacturer di Nop non hanno alcun riferimento al Website. Dobbiamo capire se è possibile impostarlo tramite qualche generico attributo o se è necessario intervenire dentro al codice.
Prodotto
- Nella tabella Product di Nop i campi relativi a: peso, lunghezza, larghezza e altezza non vengono visualizzati in front-end, ma servono per la spedizione.
Link per performance
https://www.nopcommerce.com/blog/152-nopcommerce-performance-guide.aspx
Azioni Pre-Importazione
Al fine di garantire una corretta importazione dei dati è necessario effettuare alcune operazioni sul progetto vergine, appena installato.
- TRADUZIONI scaricare da QUA le traduzioni per le 4 lingue.
Il sito fa scaricare un XML che va caricato tramite la dashboard sotto Configuration -> languages
- SMTP inserire la configurazione SMTP via SQL perché la dashboard è buggata
UPDATE EmailAccount
SET Email = 'no-reply@webmobili.it',
DisplayName = 'Designbest Outlet',
Host = 'pro.turbo-smtp.com',
[Port] = 25,
[Username] = 'v.valtorta@webmobili.it',
[Password] = 'QjwZPk2!m]UU',
EnableSsl = 0,
UseDefaultCredentials = 0
WHERE Id = 1
- Loopback interno aggiungere in
C:\Windows\System32\drivers\etc\hostsle righe per il loopback
127.0.0.1 commerce.dbdemo47.com commerce2.dbdemo47.com
- Specification Attribute per Designer
INSERT INTO [Nop_SpecificationAttribute]([Name],[DisplayOrder]) VALUES('Designer',0)
- VendorAttribute partita IVA
DECLARE @VendorAttributeID INT
INSERT INTO Nop_VendorAttribute VALUES('Partita IVA', 1, 0, 4)
SELECT @VendorAttributeID = SCOPE_IDENTITY()
INSERT INTO Nop_LocalizedProperty VALUES(@VendorAttributeID, 2, 'VendorAttribute', 'Name', 'Partita IVA')
INSERT INTO Nop_LocalizedProperty VALUES(@VendorAttributeID, 1, 'VendorAttribute', 'Name', 'VAT')
INSERT INTO Nop_LocalizedProperty VALUES(@VendorAttributeID, 3, 'VendorAttribute', 'Name', 'VAT')
INSERT INTO Nop_LocalizedProperty VALUES(@VendorAttributeID, 4, 'VendorAttribute', 'Name', 'VAT')
Interfaccia di Sincronizzazione
Si rende necessaria la creazione di una interfaccia comune alle applicazioni che sia in grado di
- Inserire/modificare/cancellare prodotti in modo sincrono da Designbest e da NopCommerce
- Inserire/modificare/cancellare categorie di prodotti
- Inserire/modificare/cancellare vendor
Questa interfaccia potrà essere utilizzata negli scambi di informazione tra le diverse applicazioni quali Designbest, NopCommerce e EasyStoreWeb.
Potrà essere implementata come una libreria interna condivisa dalle applicazioni (con accesso al Database), oppure come RESTService.
Designbest - Modelli
Le nostre occasioni sono filtrate tramite il campo Modello.
| DATO | TIPO | DESCRIZIONE |
|---|---|---|
| ID* | INT | |
| DisplayName | NVARCHAR(100) | Nome del modello/categoria |
Ovviamente da culturizzare.
Designbest - Manufacturers
Le informazioni sul nostro database compatibili con quelle di Nop sui Manufacturer sono
| DATO | TIPO | DESCRIZIONE |
|---|---|---|
| ID* | INT | |
| Manufacturer | NVARCHAR(500) | Nome del Manufacturer |
| WebPage | NVARCHAR(500) | Sito internet del produttore |
| NVARCHAR(500) | Email del produttore | |
| Visible | BIT | Visibilità |
Designbest - Shops
Le informazioni relative ai Vendor sono le seguenti
| DATO | TIPO | DESCRIZIONE |
|---|---|---|
| ID* | INT | |
| ShopName | NVARCHAR(100) | Nome del negozio |
| WebSite | NVARCHAR(500) | Sito web del negozio |
| NVARCHAR(500) | Mail del negozio | |
| Phone | NVARCHAR(500) | Telefono del negozio |
| Fax | NVARCHAR(500) | Fax del negozio |
| ZipCode | NVARCHAR(20) | CAP del negozio |
| Address | NVARCHAR(500) | Indirizzo |
| CountryID | INT | Id della nazione |
| ProvinceID | INT | ID province |
| Visible | BIT |
Queste le informazioni da culturizzare
| DATO | TIPO | DESCRIZIONE |
|---|---|---|
| ID* | INT | |
| Description | NVARCHAR(4000) | Descrizione del negozio |
Questi dati probabilmente non sono sufficienti in ottica di e-commerce (partita I.V.A. ecc...)
Il concetto di negozio per Designbest è la ShopNet cioè la somma di tutta la rete negozi. Per la migrazione una ShopNet dovrà corrispondere ad un singolo Shop/Vendor. Ricordarsi di trasferire su Nop la partita IVA.
Designbest - Utenti Rivenditori/Utenti
Gli utenti rivenditori di Designbest identificano una ShopNet (rete di più negozi).
| DATO | TIPO | DESCRIZIONE |
|---|---|---|
| GUID | VARCHAR(36) | Guid univoco dell'utente/ShopNet |
| Username | NVARCHAR(255) | Username dell'utente |
| Password | NVARCHAR(60) | Password (per il momento in chiaro) dell'utente |
| DisplayName | NVARCHAR(255) | Nome visualizzato dell'utente |
| NVARCHAR(255) | E-Mail dell'utente | |
| Role | INT | Ruolo (rivenditore/utente) |
Inizialmente importeremo solo gli utenti RIVENDITORI perché dovranno avere accesso alla backoffice di Nop per vedere le spedizioni e lo storico degli ordini.
Per quanto riguarda gli utenti NORMALI , ci occuperemo più avanti di importare i nostri utenti Designbest (gente registrata per Wishlist) su Nop.
REMEMBER: Un Customer DEVE essere inserito nella Customer_CustomerRole_Mapping 2 volte: la prima col ruolo 3 (Registered) e la seconda col ruolo 5 (Vendor)
Designbest - Occasioni
Le informazioni salvate sul nostro database, relative alle occasioni, sono le seguenti
| DATO | TIPO | DESCRIZIONE |
|---|---|---|
| ID* | INT | |
| ShopID | INT | Negozi di appartenenza |
| ModelloID | INT | Tipologia del prodotto, categoria per Nop |
| ListPrice | DECIMAL | Prezzo di listino |
| DiscountPrice | DECIMAL | Prezzo scontato |
| Abilitata | BIT | |
| OrderBy | INT | Ordinamento nel listing |
| InsertDate | DATETIME | Data di creazione |
| ManufacturerID | INT | Produttore del prodotto |
| DesignerID | INT | Designer del prodotto, potrebbe essere un campo aggiuntivo in Nop |
| Pezzi | INT | Pezzi rimasti |
| IvaInclusa | BIT |
Queste le informazioni da culturizzare
| DATO | TIPO | DESCRIZIONE |
|---|---|---|
| ID* | INT | |
| Nome | NVARCHAR(600) | |
| Descrizione | NVARCHAR(4000) | |
| Materiali | NVARCHAR(200) | Campo testuale, bisogna capire se è necessario strutturarlo diversamente per poter dialogare con le tabelle di Nop |
| Misure | NVARCHAR(200) | Campo testuale, bisogna capire se è necessario strutturarlo diversamente per poter dialogare con le tabelle di Nop |
| TrasportoMontaggio | NVARCHAR(300) | Campo testuale, bisogna capire se è necessario strutturarlo diversamente per poter dialogare con le tabelle di Nop |
Per quanto riguarda il discorso immagini dei prodotti il solo SQL non basta per l'importazione, l'interfaccia dovrà prevedere la copia fisica dei file.
Mapping ID Designbest <-> Nop
Il progetto dovrà avere un mapping degli ID di Designbest corrispondenti a quelli di Nop.
Qui sotto l'elenco
| DESIGNBEST | NOP |
|---|---|
| Occasioni ID | Nop ID prodotto (o Sku) |
| Occasione modello ID | Nop ID Categoria |
| Negozio ID | Nop Vendor ID |
| Occasione manufacturer ID | Nop Manufacturer ID |
| Occasione Designer ID | Nop Designer (come campo aggiuntivo) |
| Country ID e ProvinceID | Nop Country e StateProvince ID |
Importazione delle immagini
- Andare nelle impostazioni
- configuration->settings->media settings
- Cliccare CHANGE
- Pictures are stored in file system
- a questo punto nella cartella
/WWW-TEST/Designbest-Commerce02/wwwroot/imagescominciano ad apparire delle immagini da 0 byte con i nomi così composti
0000<picID>_0.jpeg
con un padding di 7cifre e _0.jpeg fisso.
Funzioni su DB
- Clearstring su DB di trova prodotti
Create Function [dbo].[RemoveNonAlphaCharacters](@Temp VarChar(1000))
Returns VarChar(1000)
AS
Begin
Declare @KeepValues as varchar(50)
Set @KeepValues = '%[^a-z]%'
While PatIndex(@KeepValues, @Temp) > 0
Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')
Return @Temp
End
Select dbo.RemoveNonAlphaCharacters('abc1234def5678ghi90jkl')
SYNONYM per i nomi delle tabelle cross database
Siccome il progetto è basato su stored procedure cross-database e siccome i nostri DB hanno nomi diversi tra TEST e PRODUZIONE,
è necessario creare dei SYNONYM delle tabelle coinvolte al fine di avere lo stesso codice sia in TEST che in PRODUZIONE.
USE _Designbest
-- StateProvince
CREATE SYNONYM Nop_StateProvince FOR [_Designbest-Commerce-02].dbo.StateProvince
-- Address
CREATE SYNONYM Nop_Address FOR [_Designbest-Commerce-02].dbo.[Address]
-- Vendor
CREATE SYNONYM Nop_Vendor FOR [_Designbest-Commerce-02].dbo.Vendor
-- VendorAttribute
CREATE SYNONYM Nop_VendorAttribute FOR [_Designbest-Commerce-02].dbo.VendorAttribute
-- LocalizedProperty
CREATE SYNONYM Nop_LocalizedProperty FOR [_Designbest-Commerce-02].dbo.LocalizedProperty
-- GenericAttribute
CREATE SYNONYM Nop_GenericAttribute FOR [_Designbest-Commerce-02].dbo.GenericAttribute
-- UrlRecord
CREATE SYNONYM Nop_UrlRecord FOR [_Designbest-Commerce-02].dbo.UrlRecord
-- Manufacturer
CREATE SYNONYM Nop_Manufacturer FOR [_Designbest-Commerce-02].dbo.Manufacturer
-- Category
CREATE SYNONYM Nop_Category FOR [_Designbest-Commerce-02].dbo.Category
-- Product
CREATE SYNONYM Nop_Product FOR [_Designbest-Commerce-02].dbo.Product
-- Product_Product_Category_Mapping
CREATE SYNONYM Nop_VendorAttribute FOR [_Designbest-Commerce-02].dbo.Product_Category_Mapping
-- Product_Manufacturer_Mapping
CREATE SYNONYM Nop_Product_Manufacturer_Mapping FOR [_Designbest-Commerce-02].dbo.Product_Manufacturer_Mapping
-- Product_SpecificationAttribute_Mapping
CREATE SYNONYM Nop_Product_SpecificationAttribute_Mapping FOR [_Designbest-Commerce-02].dbo.Product_SpecificationAttribute_Mapping
-- Customer
CREATE SYNONYM Nop_Customer FOR [_Designbest-Commerce-02].dbo.Customer
-- CustomerPassword
CREATE SYNONYM Nop_CustomerPassword FOR [_Designbest-Commerce-02].dbo.CustomerPassword
-- Customer_CustomerRole_Mapping
CREATE SYNONYM Nop_Customer_CustomerRole_Mapping FOR [_Designbest-Commerce-02].dbo.Customer_CustomerRole_Mapping
-- Picture
CREATE SYNONYM Nop_Picture FOR [_Designbest-Commerce-02].dbo.Picture
-- PictureBinary
CREATE SYNONYM Nop_PictureBinary FOR [_Designbest-Commerce-02].dbo.PictureBinary
-- Product_Picture_Mapping
CREATE SYNONYM Nop_Product_Picture_Mapping FOR [_Designbest-Commerce-02].dbo.Product_Picture_Mapping
-- Trovaprodotti
CREATE SYNONYM Tp_Produttori FOR [_Trovaprodotti].[dbo].Produttori
CREATE SYNONYM Tp_Modelli FOR [_Trovaprodotti].[dbo].Modelli
CREATE SYNONYM Tp_ModelliCulture FOR [_Trovaprodotti].[dbo].ModelliCulture
-- SpecificationAttribute
CREATE SYNONYM Nop_SpecificationAttribute FOR [_Designbest-Commerce-02].dbo.SpecificationAttribute
-- SpecificationAttributeOption
CREATE SYNONYM Nop_SpecificationAttributeOption FOR [_Designbest-Commerce-02].dbo.SpecificationAttributeOption
-- USO
CREATE SYNONYM Uso_Users FOR [_USO].[dbo].Users
Per vedere un riassunto della situazione relativa ai SYNONYM si può consultare la seguente tabella
SELECT * FROM [_Designbest].[sys].[synonyms]
METODI PUBBLICI dell'Interfaccia
L'interfaccia denominata NopSync espone i seguenti metodi pubblici:
| FUNZIONE | LATO APPLICATIVO | LATO SQL |
|---|---|---|
| CATEGORIE | ||
| CategoryAdd | Nop_CategoryAdd inserisce valori in Nop_Category, NopMapping_Models, Nop_LocalizedProperty, Nop_UrlRecord, |
|
| CategorySync | Nop_CategorySync aggiorna valori in Nop_Category, Nop_LocalizedProperty, Nop_UrlRecord |
|
| CategoryDelete | Nop_CategorySync cancella valori in NopMapping_Models, Nop_UrlRecord, Nop_LocalizedProperty, Nop_Category |
|
| PRODUTTORI | ||
| ManufacturerAdd | Dopo aver sincronizzato i dati copia l'immagine del produttore nel folder di Nop | Nop_ManufacturerAdd inserisce valori in Nop_Picture, Nop_PictureBinary, Nop_Manufacturer, NopMapping_Manufs, Nop_UrlRecord |
| ManufacturerSync | Dopo aver sincronizzato i dati copia l'immagine del produttore nel folder di Nop | Nop_ManufacturerSync aggiorna valori in Nop_Picture, Nop_Manufacturer, Nop_UrlRecord, Nop_LocalizedProperty |
| ManufacturerDelete | Cancella fisicamente le immagini dal folder di Nop | Nop_ManufacturerDelete cancella valori in Nop_PictureBinary, Nop_Picture, Nop_LocalizedProperty, Nop_UrlRecord, NopMapping_Manufs, Nop_Manufacturer |
| DESIGNER | ||
| DesignerAdd | Nop_DesignerAdd inserisce valori in Nop_SpecificationAttributeOption e NopMapping_Designers |
|
| RIVENDITORI | ||
| VendorAdd | Dopo aver sincronizzato i dati copia l'immagine del rivenditore nel folder di Nop | Nop_VendorAdd inserisce valori in Nop_Picture, Nop_PictureBinary, Nop_Address, Nop_Vendor, NopMapping_Shops, Nop_GenericAttribute |
| VendorSync | Dopo aver sincronizzato i dati copia l'immagine del rivenditore nel folder di Nop | Nop_VendorSync aggiorna valori in Nop_Vendor, Nop_Picture, Nop_PictureBinary, Nop_Address, Nop_UrlRecord, Nop_GenericAttribute |
| VendorDelete | Cancella fisicamente le immagini dal folder di Nop. | Nop_VendorDelete cancella valori in Nop_GenericAttribute, Nop_PictureBinary, Picture, Nop_Vendor, Nop_Address, Nop_UrlRecord, NopMapping_Shops e per ogni occasione esegue Nop_BargainDelete |
| OCCASIONI | ||
| BargainAdd | Dopo aver sincronizzato i dati copia le immagini del prodotto nel folder di Nop | Nop_BargainAdd inserisce valori in ,Nop_Product, Nop_Product_Category_Mapping, Nop_Product_Manufacturer_Mapping, Nop_Product_SpecificationAttribute_Mapping, NopMapping_Occasioni, Nop_UrlRecord |
| BargainSync | Dopo aver sincronizzato i dati copia le immagini del prodotto nel folder di Nop | Nop_BargainSync aggiorna valori in Nop_Product, Nop_Product_Category_Mapping, Nop_Product_Manufacturer_Mapping, Nop_Product_SpecificationAttribute_Mapping, Nop_UrlRecord |
| BargainDelete | Cancella fisicamente le immagini dal folder di Nop. | Nop_BargainDelete cancella valori in Nop_UrlRecord, Nop_Product_SpecificationAttribute_Mapping, Nop_Product_Manufacturer_Mapping, Nop_Product_Category_Mapping, NopMapping_Occasioni, Nop_Product |
| UTENTI RIVENDITORI | ||
| UserVendorAdd | Recupera GUID, Username e Password dello shop dopodiché chiama le procedure | Nop_UserVendorAdd inserisce valori in Nop_Customer, Nop_CustomerPassword, Nop_Customer_CustomerRole_Mapping |
| UserVendorSync | Nop_UserVendorSync aggiorna la sola password in Nop_CustomerPassword |
|
| UserVendorDelete | Nop_UserVendorDelete cancella valori in Nop_CustomerPassword, Nop_Customer_CustomerRole_Mapping, Nop_Customer |
|