Designbest Commerce: differenze tra le versioni
| (167 versioni intermedie di 3 utenti non mostrate) | |||
| Riga 1: | Riga 1: | ||
{{InfoProgetto|nome=Designbest Commerce|URL=http://www.designbest.com|testURL=https://commerce2.dbdemo47.com/ ([[Designbest Commerce\Ambiente di test|altri dettagli]])|versioning=SVN|versioning_trunkURL=https://svn.office.webmobili.it/svn/WM4/DesignbestCommerce|versioning_branchesURL=https://svn.office.webmobili.it/svn/WM4/branches/}} | |||
== Nop Commerce == | == Nop Commerce == | ||
Il framework si adatta alle nostre esigenze. | Il framework si adatta alle nostre esigenze. | ||
| Riga 25: | Riga 27: | ||
* [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 <code>EmailAccount</code> inserire da Sql Management Studio la password nel campo giusto | * [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 <code>EmailAccount</code> inserire 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] 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. | ||
* Le email non sono dirette ai singoli ''vendor'' configurati ma arrivano tutte allo Store Principale (root). | * [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 | |||
==== Tutti i bot in errore ==== | |||
Si è verificato che il sito, se navigato da Bot, restituiva la pagina di login (e di conseguenza rendeva non indicizzabili tutte le pagine).<br/> | |||
Dopo varie bestemmie abbiamo capito che l'applicazione internamente si logga con l'utente di sistema come mail = <code>builtin@search_engine_record.com</code> . Per qualche oscuro motivo l'utente esiste ma non è mappato nella tabella <code>Customer_CustomerRole_Mapping</code> come Guest con il comando | |||
<syntaxhighlight lang="sql"> | |||
INSERT INTO Customer_CustomerRole_Mapping VALUES (2,4) | |||
</syntaxhighlight> | |||
Una volta inserito tutto funziona. | |||
==== Flusso degli Ordini ==== | |||
La disponibilità dei pezzi diminuisce solo alla fine del checkout dopo la conferma dell'ordine da parte del cliente (una volta che "ha uscito i soldi").<br/><br/> | |||
Mettere un prodotto nel carrello non fa diminuire la disponibilità di pezzi dello stesso prodotto. | |||
Se un utente aveva un prodotto nel carrello e questo prodotto esaurisce i propri pezzi perché acquistato da un altro acquirente, il carrello segnala che il prodotto non è più disponibile. | |||
==== Nop 4.40.3 ==== | |||
La nuova versione uscita ad aprile 2021 sembra essere molto più performante.<br/> | |||
Per installarla [[Nop4.40.3|seguire le istruzioni qui]] | |||
==== Nop 4.50 ==== | |||
La nuova versione uscita a gennaio 2022 sembra essere molto più performante e bastata su -NET 6 LTS<br/> | |||
Per installarla [[Nop4.50|seguire le istruzioni qui]] | |||
== Azioni Pre-Importazione == | |||
Al fine di garantire una corretta importazione dei dati è necessario effettuare alcune operazioni sul progetto ''vergine'', appena installato. | |||
* '''REDIRECT SSL''' Tabella ''Settings'' mettere a ''true'' il campo con <code>Name = 'securitysettings.forcesslforallpages'</code> | |||
* '''UTENTI AMMINISTRATORI''' configurare gli utenti che possono fare tutto. | |||
* '''TRADUZIONI''' scaricare da [https://www.nopcommerce.com/translations.aspx QUA] le traduzioni per le 4 lingue. | |||
Il sito fa scaricare un XML che va caricato tramite la dashboard sotto <code>Configuration -> languages</code> | |||
Mettere l'italiano come lingua primaria. | |||
* '''SMTP''' inserire la configurazione SMTP via SQL perché la dashboard è buggata | |||
<syntaxhighlight lang="sql"> | |||
UPDATE EmailAccount | |||
SET Email = 'no-reply@webmobili.it', | |||
DisplayName = 'Designbest Outlet', | |||
Host = 'pro.turbo-smtp.com', | |||
[Port] = 25, | |||
[Username] = 's.vincenzi@webmobili.it', | |||
[Password] = 'QjwZPk2!m]UU', | |||
EnableSsl = 0, | |||
UseDefaultCredentials = 0 | |||
WHERE Id = 1 | |||
</syntaxhighlight> | |||
* '''Loopback interno''' aggiungere in <code>C:\Windows\System32\drivers\etc\hosts</code> le righe per il loopback | |||
<code>127.0.0.1 commerce.dbdemo47.com commerce2.dbdemo47.com</code> | |||
* '''Immagini gestite da File System''' di default Nop memorizza le immagini nel database, configurare in modo che utilizzi le immagini da file system come nel paragrafo [[#Importazione_delle_immagini|Importazione delle Immagini]] | |||
* '''Specification Attribute per Designer''' | |||
<syntaxhighlight lang="sql"> | |||
INSERT INTO [Nop_SpecificationAttribute]([Name],[DisplayOrder]) VALUES('Designer',0) | |||
</syntaxhighlight> | |||
* '''VendorAttribute partita IVA''' | |||
<syntaxhighlight lang="sql"> | |||
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') | |||
</syntaxhighlight> | |||
== Interfaccia di Sincronizzazione == | |||
http://testcommerce.dbdemo47.com <br/> | |||
http://testcommerce.designbest.com <br/> | |||
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 | |||
<br/><br/> | |||
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'''. | |||
{| class="wikitable" | |||
|- | |||
! 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 | |||
{| class="wikitable" | |||
|- | |||
! DATO | |||
! TIPO | |||
! DESCRIZIONE | |||
|- | |||
| ID* | |||
| INT | |||
| | |||
|- | |||
| Manufacturer | |||
| NVARCHAR(500) | |||
| Nome del Manufacturer | |||
|- | |||
| WebPage | |||
| NVARCHAR(500) | |||
| Sito internet del produttore | |||
|- | |||
| Email | |||
| NVARCHAR(500) | |||
| Email del produttore | |||
|- | |||
| Visible | |||
| BIT | |||
| Visibilità | |||
|- | |||
|} | |||
=== Designbest - Shops === | |||
Le informazioni relative ai Vendor sono le seguenti | |||
{| class="wikitable" | |||
|- | |||
! DATO | |||
! TIPO | |||
! DESCRIZIONE | |||
|- | |||
| ID* | |||
| INT | |||
| | |||
|- | |||
| ShopName | |||
| NVARCHAR(100) | |||
| Nome del negozio | |||
|- | |||
| WebSite | |||
| NVARCHAR(500) | |||
| Sito web del negozio | |||
|- | |||
| Mail | |||
| 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''' | |||
{| class="wikitable" | |||
|- | |||
! 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...)<br/> | |||
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). | |||
{| class="wikitable" | |||
|- | |||
! 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 | |||
|- | |||
| Email | |||
| 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.<br/> | |||
Per quanto riguarda gli '''utenti NORMALI''' , ci occuperemo più avanti di importare i nostri utenti Designbest (gente registrata per Wishlist) su Nop.<br/><br/> | |||
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 | |||
{| class="wikitable" | |||
|- | |||
! 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''' | |||
{| class="wikitable" | |||
|- | |||
! 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'''.<br/> | |||
Qui sotto l'elenco | |||
{| class="wikitable" | |||
|- | |||
! 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 | |||
* <code>Configuration -> Settings -> Media settings</code> | |||
* Cliccare ''CHANGE'' | |||
* Pictures are stored in '''file system''' | |||
* a questo punto nella cartella <code>/WWW-TEST/Designbest-Commerce02/wwwroot/images</code> cominciano ad apparire delle immagini da 0 byte con i nomi così composti<br/> | |||
<code>0000<picID>_0.jpeg</code> | |||
con un padding di '''7cifre''' e <code>_0.jpeg</code> fisso. | |||
=== Funzioni su DB === | |||
* Clearstring su DB di trova prodotti | |||
<syntaxhighlight lang="sql"> | |||
Create Function [dbo].[RemoveNonAlphaCharacters](@Temp VarChar(1000)) | |||
Returns VarChar(1000) | |||
AS | |||
Begin | |||
Declare @KeepValues as varchar(50) | |||
Set @KeepValues = '%[^1-9a-z]%' | |||
While PatIndex(@KeepValues, @Temp) > 0 | |||
Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '') | |||
Return @Temp | |||
End | |||
Select dbo.RemoveNonAlphaCharacters('abc1234def5678ghi90jkl') | |||
</syntaxhighlight> | |||
=== 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,<br/> | |||
è necessario creare dei '''SYNONYM''' delle tabelle coinvolte al fine di avere lo stesso codice sia in TEST che in PRODUZIONE. | |||
<syntaxhighlight lang="sql"> | |||
USE _Designbest | |||
-- StateProvince | |||
CREATE SYNONYM Nop_StateProvince FOR [_Designbest-Commerce].dbo.StateProvince | |||
-- Address | |||
CREATE SYNONYM Nop_Address FOR [_Designbest-Commerce].dbo.[Address] | |||
-- Vendor | |||
CREATE SYNONYM Nop_Vendor FOR [_Designbest-Commerce].dbo.Vendor | |||
-- VendorAttribute | |||
CREATE SYNONYM Nop_VendorAttribute FOR [_Designbest-Commerce].dbo.VendorAttribute | |||
-- LocalizedProperty | |||
CREATE SYNONYM Nop_LocalizedProperty FOR [_Designbest-Commerce].dbo.LocalizedProperty | |||
-- GenericAttribute | |||
CREATE SYNONYM Nop_GenericAttribute FOR [_Designbest-Commerce].dbo.GenericAttribute | |||
-- UrlRecord | |||
CREATE SYNONYM Nop_UrlRecord FOR [_Designbest-Commerce].dbo.UrlRecord | |||
-- Manufacturer | |||
CREATE SYNONYM Nop_Manufacturer FOR [_Designbest-Commerce].dbo.Manufacturer | |||
-- Category | |||
CREATE SYNONYM Nop_Category FOR [_Designbest-Commerce].dbo.Category | |||
-- Product | |||
CREATE SYNONYM Nop_Product FOR [_Designbest-Commerce].dbo.Product | |||
-- Product_Product_Category_Mapping | |||
CREATE SYNONYM Nop_Product_Category_Mapping FOR [_Designbest-Commerce].dbo.Product_Category_Mapping | |||
-- Product_Manufacturer_Mapping | |||
CREATE SYNONYM Nop_Product_Manufacturer_Mapping FOR [_Designbest-Commerce].dbo.Product_Manufacturer_Mapping | |||
-- Product_SpecificationAttribute_Mapping | |||
CREATE SYNONYM Nop_Product_SpecificationAttribute_Mapping FOR [_Designbest-Commerce].dbo.Product_SpecificationAttribute_Mapping | |||
-- Delivery_Date | |||
CREATE SYNONYM [dbo].[Nop_DeliveryDate] FOR [_Designbest-Commerce].[dbo].[DeliveryDate] | |||
-- Customer | |||
CREATE SYNONYM Nop_Customer FOR [_Designbest-Commerce].dbo.Customer | |||
-- CustomerPassword | |||
CREATE SYNONYM Nop_CustomerPassword FOR [_Designbest-Commerce].dbo.CustomerPassword | |||
-- Customer_CustomerRole_Mapping | |||
CREATE SYNONYM Nop_Customer_CustomerRole_Mapping FOR [_Designbest-Commerce].dbo.Customer_CustomerRole_Mapping | |||
-- Picture | |||
CREATE SYNONYM Nop_Picture FOR [_Designbest-Commerce].dbo.Picture | |||
-- PictureBinary | |||
CREATE SYNONYM Nop_PictureBinary FOR [_Designbest-Commerce].dbo.PictureBinary | |||
-- Product_Picture_Mapping | |||
CREATE SYNONYM Nop_Product_Picture_Mapping FOR [_Designbest-Commerce].dbo.Product_Picture_Mapping | |||
-- SpecificationAttribute | |||
CREATE SYNONYM Nop_SpecificationAttribute FOR [_Designbest-Commerce].dbo.SpecificationAttribute | |||
-- SpecificationAttributeOption | |||
CREATE SYNONYM Nop_SpecificationAttributeOption FOR [_Designbest-Commerce].dbo.SpecificationAttributeOption | |||
-- ProductAttribute | |||
CREATE SYNONYM Nop_ProductAttribute FOR [_Designbest-Commerce].dbo.ProductAttribute | |||
-- ProductAttribute_Mapping | |||
CREATE SYNONYM Nop_Product_ProductAttribute_Mapping FOR [_Designbest-Commerce].dbo.Product_ProductAttribute_Mapping | |||
-- ProductAttributeValue | |||
CREATE SYNONYM Nop_ProductAttributeValue FOR [_Designbest-Commerce].dbo.ProductAttributeValue | |||
-- Warehouse | |||
CREATE SYNONYM Nop_Warehouse FOR [_Designbest-Commerce].dbo.Warehouse | |||
-- USO | |||
CREATE SYNONYM Uso_Users FOR [_USO].[dbo].Users | |||
-- Trovaprodotti | |||
CREATE SYNONYM [dbo].Tp_Rivenditori FOR [_Trovaprodotti].dbo.Rivenditori | |||
CREATE SYNONYM [dbo].Tp_Occasioni FOR [_Trovaprodotti].dbo.Occasioni | |||
CREATE SYNONYM [dbo].[Tp_OccasioniCulture] FOR [Trovaprodotti].[dbo].[OccasioniCulture] | |||
CREATE SYNONYM [dbo].Tp_Produttori FOR [_Trovaprodotti].[dbo].Produttori | |||
CREATE SYNONYM [dbo].Tp_Modelli FOR [_Trovaprodotti].[dbo].Modelli | |||
CREATE SYNONYM [dbo].Tp_ModelliCulture FOR [_Trovaprodotti].[dbo].ModelliCulture | |||
CREATE SYNONYM [dbo].[TP_RemoveNonAlphaCharacters] FOR [_Trovaprodotti].[dbo].[RemoveNonAlphaCharacters] | |||
CREATE SYNONYM [dbo].[Tp_ShopGroup] FOR [_Trovaprodotti].[dbo].[ShopGroup] | |||
CREATE SYNONYM [dbo].[Tp_Mapping_Occasione_PermalinkWP] FOR [_Trovaprodotti].[dbo].Mapping_Occasione_PermalinkWP | |||
-- TROVAPRODOTTI | |||
USE [_Trovaprodotti] | |||
CREATE SYNONYM [dbo].[Db_Manufacturer] FOR [_Designbest].[dbo].[Manufacturer] | |||
CREATE SYNONYM [dbo].[Db_NopMapping_Occasioni] FOR [_Designbest].[dbo].[NopMapping_Occasioni] | |||
CREATE SYNONYM [dbo].[Db_Shop] FOR [_Designbest].[dbo].[Shop] | |||
CREATE SYNONYM [dbo].[Db_Mapping_OutletAmbients] FOR [_Designbest].[dbo].[Mapping_OutletAmbients] | |||
CREATE SYNONYM [dbo].[Db_Mapping_AmbientsOutlet] FOR [_Designbest].[dbo].Mapping_AmbientsOutlet | |||
CREATE SYNONYM [dbo].[Nop_Product] FOR [_Designbest-Commerce-02].[dbo].[Product] | |||
CREATE SYNONYM [dbo].[Nop_UrlRecord] FOR [_Designbest-Commerce-02].[dbo].[UrlRecord] | |||
CREATE SYNONYM [dbo].[Nop_Vendor] FOR [_Designbest-Commerce-02].[dbo].[Vendor] | |||
CREATE SYNONYM [dbo].[Nop_Manufacturer] FOR [_Designbest-Commerce-02].[dbo].[Manufacturer] | |||
CREATE SYNONYM [dbo].[Nop_Product_Manufacturer_Mapping] FOR [_Designbest-Commerce-02].[dbo].[Product_Manufacturer_Mapping] | |||
CREATE SYNONYM [dbo].[Nop_Category] FOR [_Designbest-Commerce-02].[dbo].[Category] | |||
CREATE SYNONYM [dbo].[Tp_ShopGroup] FOR [_Trovaprodotti].[dbo].[ShopGroup] | |||
</syntaxhighlight> | |||
Per vedere un riassunto della situazione relativa ai SYNONYM si può consultare la seguente tabella | |||
<syntaxhighlight lang="sql"> | |||
SELECT * FROM [_Designbest].[sys].[synonyms] | |||
</syntaxhighlight> | |||
=== METODI PUBBLICI dell'Interfaccia === | |||
L'interfaccia denominata '''NopSync''' espone i seguenti metodi pubblici: | |||
<table class="wikitable"> | |||
<tr> | |||
<th>FUNZIONE</th> | |||
<th>LATO APPLICATIVO</th> | |||
<th>LATO SQL</th> | |||
</tr> | |||
<tr> | |||
<td colspan="3" class="center">CATEGORIE</td> | |||
</tr> | |||
<tr> | |||
<th>CategoryAdd</th> | |||
<td></td> | |||
<td><code>Nop_CategoryAdd</code> inserisce valori in ''Nop_Category'', ''NopMapping_Models'', ''Nop_LocalizedProperty'', ''Nop_UrlRecord'', </td> | |||
</tr> | |||
<tr> | |||
<th>CategorySync</th> | |||
<td></td> | |||
<td><code>Nop_CategorySync</code> aggiorna valori in ''Nop_Category'', ''Nop_LocalizedProperty'', ''Nop_UrlRecord'' </td> | |||
</tr> | |||
<tr> | |||
<th>CategoryDelete</th> | |||
<td></td> | |||
<td><code>Nop_CategorySync</code> cancella valori in ''NopMapping_Models'', ''Nop_UrlRecord'', ''Nop_LocalizedProperty'', ''Nop_Category'' </td> | |||
</tr> | |||
<tr> | |||
<td colspan="3" class="center">PRODUTTORI</td> | |||
</tr> | |||
<tr> | |||
<th>ManufacturerAdd</th> | |||
<td>Dopo aver sincronizzato i dati copia l'immagine del produttore nel folder di Nop</td> | |||
<td><code>Nop_ManufacturerAdd</code> inserisce valori in ''Nop_Picture'', ''Nop_PictureBinary'', ''Nop_Manufacturer'', ''NopMapping_Manufs'', ''Nop_UrlRecord'' </td> | |||
</tr> | |||
<tr> | |||
<th>ManufacturerSync</th> | |||
<td>Dopo aver sincronizzato i dati copia l'immagine del produttore nel folder di Nop</td> | |||
<td><code>Nop_ManufacturerSync</code> aggiorna valori in ''Nop_Picture'', ''Nop_Manufacturer'', ''Nop_UrlRecord'', ''Nop_LocalizedProperty'' </td> | |||
</tr> | |||
<tr> | |||
<th>ManufacturerDelete</th> | |||
<td>Cancella fisicamente le immagini dal folder di Nop</td> | |||
<td><code>Nop_ManufacturerDelete</code> cancella valori in ''Nop_PictureBinary'', ''Nop_Picture'', ''Nop_LocalizedProperty'', ''Nop_UrlRecord'', ''NopMapping_Manufs'', ''Nop_Manufacturer'' </td> | |||
</tr> | |||
<tr> | |||
<td colspan="3" class="center">DESIGNER</td> | |||
</tr> | |||
<tr> | |||
<th>DesignerAdd</th> | |||
<td></td> | |||
<td><code>Nop_DesignerAdd</code> inserisce valori in ''Nop_SpecificationAttributeOption'' e ''NopMapping_Designers''</td> | |||
</tr> | |||
<tr> | |||
<td colspan="3" class="center">RIVENDITORI</td> | |||
</tr> | |||
<tr> | |||
<th>VendorAdd</th> | |||
<td>Dopo aver sincronizzato i dati copia l'immagine del rivenditore nel folder di Nop</td> | |||
<td><code>Nop_VendorAdd</code> inserisce valori in ''Nop_Picture'', ''Nop_PictureBinary'', ''Nop_Address'', ''Nop_Vendor'', ''NopMapping_Shops'', ''Nop_GenericAttribute'' </td> | |||
</tr> | |||
<tr> | |||
<th>VendorSync</th> | |||
<td>Dopo aver sincronizzato i dati copia l'immagine del rivenditore nel folder di Nop</td> | |||
<td><code>Nop_VendorSync</code> aggiorna valori in ''Nop_Vendor'', ''Nop_Picture'', ''Nop_PictureBinary'', ''Nop_Address'', ''Nop_UrlRecord'', ''Nop_GenericAttribute'' </td> | |||
</tr> | |||
<tr> | |||
<th>VendorDelete</th> | |||
<td>Cancella fisicamente le immagini dal folder di Nop.</td> | |||
<td><code>Nop_VendorDelete</code> cancella valori in ''Nop_GenericAttribute'', ''Nop_PictureBinary'', ''Picture'', ''Nop_Vendor'', ''Nop_Address'', ''Nop_UrlRecord'', ''NopMapping_Shops'' e per ogni occasione esegue <code>Nop_BargainDelete</code></td> | |||
</tr> | |||
<tr> | |||
<td colspan="3" class="center">OCCASIONI</td> | |||
</tr> | |||
<tr> | |||
<th>BargainAdd</th> | |||
<td>Dopo aver sincronizzato i dati copia le immagini del prodotto nel folder di Nop</td> | |||
<td><code>Nop_BargainAdd</code> inserisce valori in '',Nop_Product'', ''Nop_Product_Category_Mapping'', ''Nop_Product_Manufacturer_Mapping'', ''Nop_Product_SpecificationAttribute_Mapping'', ''NopMapping_Occasioni'', ''Nop_UrlRecord''</td> | |||
</tr> | |||
<tr> | |||
<th>BargainSync</th> | |||
<td>Dopo aver sincronizzato i dati copia le immagini del prodotto nel folder di Nop</td> | |||
<td><code>Nop_BargainSync</code> aggiorna valori in ''Nop_Product'', ''Nop_Product_Category_Mapping'', ''Nop_Product_Manufacturer_Mapping'', ''Nop_Product_SpecificationAttribute_Mapping'', ''Nop_UrlRecord''</td> | |||
</tr> | |||
<tr> | |||
<th>BargainDelete</th> | |||
<td>Cancella fisicamente le immagini dal folder di Nop.</td> | |||
<td><code>Nop_BargainDelete</code> cancella valori in ''Nop_UrlRecord'', ''Nop_Product_SpecificationAttribute_Mapping'', ''Nop_Product_Manufacturer_Mapping'', ''Nop_Product_Category_Mapping'', ''NopMapping_Occasioni'', ''Nop_Product''</td> | |||
</tr> | |||
<tr> | |||
<td colspan="3" class="center">UTENTI RIVENDITORI</td> | |||
</tr> | |||
<tr> | |||
<th>UserVendorAdd</th> | |||
<td>Recupera GUID, Username e Password dello shop dopodiché chiama le procedure</td> | |||
<td><code>Nop_UserVendorAdd</code> inserisce valori in ''Nop_Customer'', ''Nop_CustomerPassword'', ''Nop_Customer_CustomerRole_Mapping''</td> | |||
</tr> | |||
<tr> | |||
<th>UserVendorSync</th> | |||
<td></td> | |||
<td><code>Nop_UserVendorSync</code> aggiorna la sola password in ''Nop_CustomerPassword''</td> | |||
</tr> | |||
<tr> | |||
<th>UserVendorDelete</th> | |||
<td></td> | |||
<td><code>Nop_UserVendorDelete</code> cancella valori in ''Nop_CustomerPassword'', ''Nop_Customer_CustomerRole_Mapping'', ''Nop_Customer''</td> | |||
</tr> | |||
</table> | |||
=== Test dell'interfaccia === | |||
Ecco il link di Test.<br/> | |||
http://testcommerce.dbdemo47.com<br/> | |||
Ci sono i singoli metodi, per effettuare la '''IMPORT COMPLETA''' è necessario | |||
* far partire lo ''script SQL di pulizia completa'' che ho io | |||
* Cancellare tutte le immagini (con stessa radice) sotto <code>DesignbestCommerce\Presentation\Nop.Web\wwwroot\images</code> e sotto <code>DesignbestCommerce\Presentation\Nop.Web\wwwroot\images\thumbs</code>. Importante: non cancellare la cartella <code>thumbs</code> | |||
Per debuggare lato server mettere a '''true''' l'opzione ''stdoutLogEnabled'' | |||
<syntaxhighlight lang="xml"> | |||
<aspNetCore requestTimeout="23:00:00" processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" forwardWindowsAuthToken="false" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" startupTimeLimit="3600"> | |||
<environmentVariables /> | |||
</aspNetCore> | |||
</syntaxhighlight> | |||
=== Login a Nop da Designbest === | |||
Codice funzionante, ecco una action che logga come amministratore: | |||
<syntaxhighlight lang="c#"> | |||
public virtual IActionResult PerformLogin() { | |||
var _customerService = EngineContext.Current.Resolve<ICustomerService>(); | |||
var _authenticationService = EngineContext.Current.Resolve<IAuthenticationService>(); | |||
Customer customer = _customerService.GetCustomerByGuid(new System.Guid("121F0ECA-FDA9-485D-9447-2ED29A84D575")); | |||
_authenticationService.SignIn(customer, true); | |||
return RedirectToAction("Index"); | |||
} | |||
</syntaxhighlight> | |||
== Build/Debug From Source == | |||
Il progetto Visual Studio non si lascia buildare facilmente.<br/> | |||
Innanzitutto non è possibile aggiornare tutti i pacchetti nuGet perché alcuni plugin non sono compatibili con gli aggiornamenti (studio in corso per capire meglio quali pacchetti possono essere aggiornati).<br/> | |||
Dopo aver fatto un '''Clean Solution''' e un '''Rebuild Solution''' si clicca su '''Run'''.<br/> | |||
Nel caso in cui un errore a Runtime dice che | |||
<syntaxhighlight> | |||
Un plugin con il nome <nome> esiste già | |||
</syntaxhighlight> | |||
fermare il run e cancellare tutto il contenuto della cartella <code>P:\DesignbestCommerce\Presentation\Nop.Web\Plugins</code> e runnare nuovamente | |||
Anche durante il '''deploy''' c'è il problema della cartella <code>Plugins</code>, bisogna spostare tutto il suo contenuto dentro a <code>Plugins/bin</code> | |||
=== Debugging con la cache dei css/javascript === | |||
Lavorare in debug con la minificazione e i bundle attivi è deleterio perché le modifiche ai css e ai js non si vedono con un semplice F5, ma si rende necessario stoppare il debug e riavviarlo.<br/> | |||
Per evitare questo, in '''ambiente di TEST''' andare su | |||
<code>Configurazione -> Impostazioni -> Impostazioni generali paragrafo sulla minificazione</code> | |||
e togliere le spunte da ''minificazione html'' , ''minificazione css'' e ''minificazione javascript''. | |||
Lato applicazione, per poter usare le risorse senza bundle in test, ho inserito questo codice all'interno di <code>Themes/Designbest/Views/Shared/Head.cshtml</code> | |||
<syntaxhighlight lang="c#"> | |||
@if (Html.IsProduction()) { | |||
Html.AppendCssFileParts($"~/Themes/{themeName}/Content/css/designbest-theme.min.css"); | |||
Html.AppendScriptParts($"~/Themes/{themeName}/Scripts/site.min.js"); | |||
} | |||
else { | |||
Html.AppendCssFileParts($"~/Themes/{themeName}/Content/css/bootstrap/bootstrap.css"); | |||
Html.AppendCssFileParts($"~/Themes/{themeName}/Content/css/styles.css"); | |||
Html.AppendCssFileParts($"~/Themes/{themeName}/Content/css/designbest.css"); | |||
Html.AppendScriptParts($"~/Themes/{themeName}/Scripts/site.min.js"); | |||
} | |||
</syntaxhighlight> | |||
== Backoffice == | |||
La [[Trovaprodotti_Commerce_Backoffice|backoffice]] che permette di inserire negozi e prodotti all'interno del commerce è quella di Trovaprodotti. | |||
Tramite query e procedure logica (come svuota cache, copia file) si occupa di inserire/aggiornare/cancellare elementi. | |||
Le funzioni, descritte nel dettaglio, sono: | |||
* [[Trovaprodotti_Commerce_Backoffice#Add_Shop|Add Shop]] | |||
* [[Trovaprodotti_Commerce_Backoffice#Add_Bargain|Add Bargain]] | |||
* [[Trovaprodotti_Commerce_Backoffice#Sync_Bargain|Sync Bargain]] | |||
* [[Trovaprodotti_Commerce_Backoffice#Delete_Bargain|Delete Bargain]] | |||
== Trigger == | |||
Abbiamo inserito dei trigger per facilitare la comunicazione dei dati da NOP ai nostri database.<br/> | |||
Per semplificare la comunicazione tra database sono stati creati alcuni Sinonimi | |||
=== Sinonimi === | |||
Sinonimi creati su database di NOP per facilitare la comunicazione con Designbest e Trovaprodotti:<br/> | |||
<syntaxhighlight lang="sql"> | |||
-- Tabella di Mapping delle Occasioni | |||
CREATE SYNONYM [dbo].[Db_NopMapping_Occasioni] FOR [_Designbest].[dbo].[NopMapping_Occasioni] | |||
-- Tabella Occasioni | |||
CREATE SYNONYM [dbo].[TP_Occasioni] FOR [_Trovaprodotti].[dbo].[Occasioni] | |||
</syntaxhighlight> | |||
=== Product - Trigger === | |||
Creato un trigger '''[Product_ChangeQuantity]''' per la tabella '''[Product]''' di NOP, che controlla gli eventi di ''UPDATE'' sul campo '''[StockQuantity]'''.<br/> | |||
Ogni cambiamento di quantità, effettuato da NOP, viene riportata sulla tabella '''[Occasioni]''' di Trovaprodotti nel campo '''[Pezzi]''' | |||
<syntaxhighlight lang="sql"> | |||
CREATE TRIGGER [dbo].[Product_ChangeQuantity] | |||
ON [dbo].[Product] | |||
AFTER UPDATE | |||
AS | |||
BEGIN | |||
SET NOCOUNT ON; | |||
DECLARE @OccID INT = 0, @NumPezziAggiornato INT; | |||
IF UPDATE([StockQuantity]) | |||
BEGIN | |||
SELECT @OccID = Db_NopMapping_Occasioni.OccID FROM Db_NopMapping_Occasioni | |||
WHERE Nop_OccID IN ( | |||
SELECT i.Id FROM inserted i | |||
) | |||
IF @OccID = 0 return; | |||
SELECT @NumPezziAggiornato = i.StockQuantity FROM inserted i; | |||
IF @NumPezziAggiornato = 0 | |||
BEGIN | |||
UPDATE TP_Occasioni | |||
SET TP_Occasioni.[Pezzi] = @NumPezziAggiornato | |||
WHERE TP_Occasioni.[ID] = @OccID | |||
PRINT 'TRIGGER [Product_ChangeQuantity] ESEGUITO e Aggiornato su TP' | |||
END | |||
ELSE | |||
BEGIN | |||
UPDATE TP_Occasioni | |||
SET TP_Occasioni.[Pezzi] = @NumPezziAggiornato | |||
WHERE TP_Occasioni.[ID] = @OccID | |||
PRINT 'TRIGGER [Product_ChangeQuantity] ESEGUITO e Aggiornato su TP' | |||
END | |||
END | |||
ELSE | |||
BEGIN | |||
PRINT 'TRIGGER [Product_ChangeQuantity] ESEGUITO, ma nessuna modifica su TP' | |||
END | |||
END | |||
GO | |||
</syntaxhighlight> | |||
A seguire una porzione di codice che scatena il trigger solo sul prodotto di NOP con ID 408:<br/> | |||
<syntaxhighlight lang="sql"> | |||
UPDATE Product SET StockQuantity = 0 WHERE id = 408 | |||
SELECT id, [Name], sku, StockQuantity FROM Product | |||
where Id IN (408,222) | |||
SELECT ID as OccID, ShopID, Pezzi FROM Occasioni | |||
WHERE ID IN (25702,10994) | |||
order by ID desc | |||
</syntaxhighlight> | |||
== DROPSHIPPING == | |||
Vendita del nuovo e assegnazione ordine ad un rivenditore. | |||
* Creazione catalogo prodotti NUOVI x Rivenditore ''Webmobili Dropshipping'' | |||
* Cliente compra un prodotto nuovo venduto da ''Webmobili Dropshipping'' | |||
* Da Admin filtro ordini dal rivenditore ''Webmobili Dropshipping'' | |||
* Dettaglio Ordine -> Prodotti -> ci sarà un elenco di prodotti | |||
** Per ogni prodotto, '''SOLO''' di ''Webmobili Dropshipping'', aggiungiamo un pulsante '''CLONA - ASSEGNA''' | |||
** al click sul pulsante '''CLONA - ASSEGNA''' si aprirà un modale con l'elenco di tutti i rivenditori | |||
** il prodotto originale dell'ordine viene clonato(pubblico->false | VisibleIndividually->false | SKU-> sku-newProductId), assegnato al rivenditore selezionato | |||
** update tabella OrderItem del nostro OrderId, con il nuovo ProductId appena creato/clonato | |||
* '''Se il cliente ha pagato con carta o paypal''' gli manderemo una email con specificato il Rivenditore che gli spedirà il prodotto | |||
* Se il cliente invece paga tramite bonifico, non spediremo noi email(autogenerata), ma seguirà il flusso normale dopo aver ricevuto il pagamento e impostato l'ordine come pagato. | |||
[[File:Dropshipping-Admin-Preview.jpg]] | |||
== Plugin Locali == | |||
=== Payments.CheckMoneyOrder === | |||
(da Configurazione/Plugins Locali) il ''nome amichevole'' del plugin viene utilizzato in message template delle email, si rende necessario modificare il nome con l'esatta stringa<br/><br/> | |||
<code>Bonifico Bancario</code><br/><br/> | |||
[[File:MoneyCheckPlugin.jpg]] | |||
=== Nop Ajax Filters === | |||
Implementa un ''infinity scroll'' che va in errore in visualizzazione mobile (non scrolla e non vanno i filtri). Per rimediare è necessario disabilitare il plugin da<br/> | |||
''Nop Templates'' => ''Plugins'' => ''Ajax Filters'' => ''Settings'' | |||
=== PayPal Commerce === | |||
Per disattivare i pulsanti che vengono mostrati durante il checkuot con PayPal, ad esempio Sofort e MyBank bisogna andare in: | |||
* Configurazione | |||
* Impostazioni | |||
* Tutte le impostazioni | |||
* cercare la chiave -> <code>paypalcommercesettings.enabledfunding</code> | |||
* settare il valore ai bottoni da disabilitare -> <code>mybank,sofort</code> | |||
Qui la guida SDK con l'elenco dei parametri da utilizzare: | |||
https://developer.paypal.com/sdk/js/configuration/#link-disablefunding | |||
== Disallow SEO == | |||
Il sito è passato in NOINDEX-NOFOLLOW a causa di contenuti duplicati con outlet.<br/><br/> | |||
Inserire in <code>\Presentation\Nop.Web\Themes\<nometema>\Views\Shared\_Root.Head.cshtml</code> l'header html | |||
<syntaxhighlight lang="html"><meta name="robots" content="noindex,nofollow" /></syntaxhighlight><br/> | |||
Poi eliminare la generazione delle sitemaps xml mettendo a ''False'' la configurazione ''sitemapxmlsettings.sitemapxmlenabled'' sotto <code>Configurazione -> Impostazioni -> Tutte le impostazioni</code>.<br/><br/> | |||
Aggiungere al <code>\Presentation\Nop.Web\robots.additions.txt</code> la riga | |||
<syntaxhighlight lang="html">Disallow: /</syntaxhighlight> | |||
Versione attuale delle 16:08, 2 mar 2023
| Designbest Commerce | |
|---|---|
| http://www.designbest.com | |
| Ambiente di test | https://commerce2.dbdemo47.com/ (altri dettagli) |
| Sistema di versionamento | |
| Tipo | SVN |
| URL del trunk | https://svn.office.webmobili.it/svn/WM4/DesignbestCommerce |
| URL base dei branch | https://svn.office.webmobili.it/svn/WM4/branches/ |
Nop Commerce
[modifica]Il framework si adatta alle nostre esigenze.
Ipotesi di integrazione
[modifica]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
[modifica]- 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
[modifica]- Le password sono cifrate nella tabella CustomerPassword mantenendo uno storico di tutte le password dell'utente
Problemi del framework
[modifica]- [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
[modifica]- 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
[modifica]https://www.nopcommerce.com/blog/152-nopcommerce-performance-guide.aspx
Tutti i bot in errore
[modifica]Si è verificato che il sito, se navigato da Bot, restituiva la pagina di login (e di conseguenza rendeva non indicizzabili tutte le pagine).
Dopo varie bestemmie abbiamo capito che l'applicazione internamente si logga con l'utente di sistema come mail = builtin@search_engine_record.com . Per qualche oscuro motivo l'utente esiste ma non è mappato nella tabella Customer_CustomerRole_Mapping come Guest con il comando
INSERT INTO Customer_CustomerRole_Mapping VALUES (2,4)
Una volta inserito tutto funziona.
Flusso degli Ordini
[modifica]La disponibilità dei pezzi diminuisce solo alla fine del checkout dopo la conferma dell'ordine da parte del cliente (una volta che "ha uscito i soldi").
Mettere un prodotto nel carrello non fa diminuire la disponibilità di pezzi dello stesso prodotto. Se un utente aveva un prodotto nel carrello e questo prodotto esaurisce i propri pezzi perché acquistato da un altro acquirente, il carrello segnala che il prodotto non è più disponibile.
Nop 4.40.3
[modifica]La nuova versione uscita ad aprile 2021 sembra essere molto più performante.
Per installarla seguire le istruzioni qui
Nop 4.50
[modifica]La nuova versione uscita a gennaio 2022 sembra essere molto più performante e bastata su -NET 6 LTS
Per installarla seguire le istruzioni qui
Azioni Pre-Importazione
[modifica]Al fine di garantire una corretta importazione dei dati è necessario effettuare alcune operazioni sul progetto vergine, appena installato.
- REDIRECT SSL Tabella Settings mettere a true il campo con
Name = 'securitysettings.forcesslforallpages' - UTENTI AMMINISTRATORI configurare gli utenti che possono fare tutto.
- 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
Mettere l'italiano come lingua primaria.
- 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] = 's.vincenzi@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
- Immagini gestite da File System di default Nop memorizza le immagini nel database, configurare in modo che utilizzi le immagini da file system come nel paragrafo Importazione delle Immagini
- 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
[modifica]http://testcommerce.dbdemo47.com
http://testcommerce.designbest.com
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
[modifica]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
[modifica]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
[modifica]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
[modifica]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
[modifica]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
[modifica]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
[modifica]- 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
[modifica]- 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 = '%[^1-9a-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
[modifica]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].dbo.StateProvince
-- Address
CREATE SYNONYM Nop_Address FOR [_Designbest-Commerce].dbo.[Address]
-- Vendor
CREATE SYNONYM Nop_Vendor FOR [_Designbest-Commerce].dbo.Vendor
-- VendorAttribute
CREATE SYNONYM Nop_VendorAttribute FOR [_Designbest-Commerce].dbo.VendorAttribute
-- LocalizedProperty
CREATE SYNONYM Nop_LocalizedProperty FOR [_Designbest-Commerce].dbo.LocalizedProperty
-- GenericAttribute
CREATE SYNONYM Nop_GenericAttribute FOR [_Designbest-Commerce].dbo.GenericAttribute
-- UrlRecord
CREATE SYNONYM Nop_UrlRecord FOR [_Designbest-Commerce].dbo.UrlRecord
-- Manufacturer
CREATE SYNONYM Nop_Manufacturer FOR [_Designbest-Commerce].dbo.Manufacturer
-- Category
CREATE SYNONYM Nop_Category FOR [_Designbest-Commerce].dbo.Category
-- Product
CREATE SYNONYM Nop_Product FOR [_Designbest-Commerce].dbo.Product
-- Product_Product_Category_Mapping
CREATE SYNONYM Nop_Product_Category_Mapping FOR [_Designbest-Commerce].dbo.Product_Category_Mapping
-- Product_Manufacturer_Mapping
CREATE SYNONYM Nop_Product_Manufacturer_Mapping FOR [_Designbest-Commerce].dbo.Product_Manufacturer_Mapping
-- Product_SpecificationAttribute_Mapping
CREATE SYNONYM Nop_Product_SpecificationAttribute_Mapping FOR [_Designbest-Commerce].dbo.Product_SpecificationAttribute_Mapping
-- Delivery_Date
CREATE SYNONYM [dbo].[Nop_DeliveryDate] FOR [_Designbest-Commerce].[dbo].[DeliveryDate]
-- Customer
CREATE SYNONYM Nop_Customer FOR [_Designbest-Commerce].dbo.Customer
-- CustomerPassword
CREATE SYNONYM Nop_CustomerPassword FOR [_Designbest-Commerce].dbo.CustomerPassword
-- Customer_CustomerRole_Mapping
CREATE SYNONYM Nop_Customer_CustomerRole_Mapping FOR [_Designbest-Commerce].dbo.Customer_CustomerRole_Mapping
-- Picture
CREATE SYNONYM Nop_Picture FOR [_Designbest-Commerce].dbo.Picture
-- PictureBinary
CREATE SYNONYM Nop_PictureBinary FOR [_Designbest-Commerce].dbo.PictureBinary
-- Product_Picture_Mapping
CREATE SYNONYM Nop_Product_Picture_Mapping FOR [_Designbest-Commerce].dbo.Product_Picture_Mapping
-- SpecificationAttribute
CREATE SYNONYM Nop_SpecificationAttribute FOR [_Designbest-Commerce].dbo.SpecificationAttribute
-- SpecificationAttributeOption
CREATE SYNONYM Nop_SpecificationAttributeOption FOR [_Designbest-Commerce].dbo.SpecificationAttributeOption
-- ProductAttribute
CREATE SYNONYM Nop_ProductAttribute FOR [_Designbest-Commerce].dbo.ProductAttribute
-- ProductAttribute_Mapping
CREATE SYNONYM Nop_Product_ProductAttribute_Mapping FOR [_Designbest-Commerce].dbo.Product_ProductAttribute_Mapping
-- ProductAttributeValue
CREATE SYNONYM Nop_ProductAttributeValue FOR [_Designbest-Commerce].dbo.ProductAttributeValue
-- Warehouse
CREATE SYNONYM Nop_Warehouse FOR [_Designbest-Commerce].dbo.Warehouse
-- USO
CREATE SYNONYM Uso_Users FOR [_USO].[dbo].Users
-- Trovaprodotti
CREATE SYNONYM [dbo].Tp_Rivenditori FOR [_Trovaprodotti].dbo.Rivenditori
CREATE SYNONYM [dbo].Tp_Occasioni FOR [_Trovaprodotti].dbo.Occasioni
CREATE SYNONYM [dbo].[Tp_OccasioniCulture] FOR [Trovaprodotti].[dbo].[OccasioniCulture]
CREATE SYNONYM [dbo].Tp_Produttori FOR [_Trovaprodotti].[dbo].Produttori
CREATE SYNONYM [dbo].Tp_Modelli FOR [_Trovaprodotti].[dbo].Modelli
CREATE SYNONYM [dbo].Tp_ModelliCulture FOR [_Trovaprodotti].[dbo].ModelliCulture
CREATE SYNONYM [dbo].[TP_RemoveNonAlphaCharacters] FOR [_Trovaprodotti].[dbo].[RemoveNonAlphaCharacters]
CREATE SYNONYM [dbo].[Tp_ShopGroup] FOR [_Trovaprodotti].[dbo].[ShopGroup]
CREATE SYNONYM [dbo].[Tp_Mapping_Occasione_PermalinkWP] FOR [_Trovaprodotti].[dbo].Mapping_Occasione_PermalinkWP
-- TROVAPRODOTTI
USE [_Trovaprodotti]
CREATE SYNONYM [dbo].[Db_Manufacturer] FOR [_Designbest].[dbo].[Manufacturer]
CREATE SYNONYM [dbo].[Db_NopMapping_Occasioni] FOR [_Designbest].[dbo].[NopMapping_Occasioni]
CREATE SYNONYM [dbo].[Db_Shop] FOR [_Designbest].[dbo].[Shop]
CREATE SYNONYM [dbo].[Db_Mapping_OutletAmbients] FOR [_Designbest].[dbo].[Mapping_OutletAmbients]
CREATE SYNONYM [dbo].[Db_Mapping_AmbientsOutlet] FOR [_Designbest].[dbo].Mapping_AmbientsOutlet
CREATE SYNONYM [dbo].[Nop_Product] FOR [_Designbest-Commerce-02].[dbo].[Product]
CREATE SYNONYM [dbo].[Nop_UrlRecord] FOR [_Designbest-Commerce-02].[dbo].[UrlRecord]
CREATE SYNONYM [dbo].[Nop_Vendor] FOR [_Designbest-Commerce-02].[dbo].[Vendor]
CREATE SYNONYM [dbo].[Nop_Manufacturer] FOR [_Designbest-Commerce-02].[dbo].[Manufacturer]
CREATE SYNONYM [dbo].[Nop_Product_Manufacturer_Mapping] FOR [_Designbest-Commerce-02].[dbo].[Product_Manufacturer_Mapping]
CREATE SYNONYM [dbo].[Nop_Category] FOR [_Designbest-Commerce-02].[dbo].[Category]
CREATE SYNONYM [dbo].[Tp_ShopGroup] FOR [_Trovaprodotti].[dbo].[ShopGroup]
Per vedere un riassunto della situazione relativa ai SYNONYM si può consultare la seguente tabella
SELECT * FROM [_Designbest].[sys].[synonyms]
METODI PUBBLICI dell'Interfaccia
[modifica]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 |
|
Test dell'interfaccia
[modifica]Ecco il link di Test.
http://testcommerce.dbdemo47.com
Ci sono i singoli metodi, per effettuare la IMPORT COMPLETA è necessario
- far partire lo script SQL di pulizia completa che ho io
- Cancellare tutte le immagini (con stessa radice) sotto
DesignbestCommerce\Presentation\Nop.Web\wwwroot\imagese sottoDesignbestCommerce\Presentation\Nop.Web\wwwroot\images\thumbs. Importante: non cancellare la cartellathumbs
Per debuggare lato server mettere a true l'opzione stdoutLogEnabled
<aspNetCore requestTimeout="23:00:00" processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" forwardWindowsAuthToken="false" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" startupTimeLimit="3600">
<environmentVariables />
</aspNetCore>
Login a Nop da Designbest
[modifica]Codice funzionante, ecco una action che logga come amministratore:
public virtual IActionResult PerformLogin() {
var _customerService = EngineContext.Current.Resolve<ICustomerService>();
var _authenticationService = EngineContext.Current.Resolve<IAuthenticationService>();
Customer customer = _customerService.GetCustomerByGuid(new System.Guid("121F0ECA-FDA9-485D-9447-2ED29A84D575"));
_authenticationService.SignIn(customer, true);
return RedirectToAction("Index");
}
Build/Debug From Source
[modifica]Il progetto Visual Studio non si lascia buildare facilmente.
Innanzitutto non è possibile aggiornare tutti i pacchetti nuGet perché alcuni plugin non sono compatibili con gli aggiornamenti (studio in corso per capire meglio quali pacchetti possono essere aggiornati).
Dopo aver fatto un Clean Solution e un Rebuild Solution si clicca su Run.
Nel caso in cui un errore a Runtime dice che
Un plugin con il nome <nome> esiste giàfermare il run e cancellare tutto il contenuto della cartella P:\DesignbestCommerce\Presentation\Nop.Web\Plugins e runnare nuovamente
Anche durante il deploy c'è il problema della cartella Plugins, bisogna spostare tutto il suo contenuto dentro a Plugins/bin
Debugging con la cache dei css/javascript
[modifica]Lavorare in debug con la minificazione e i bundle attivi è deleterio perché le modifiche ai css e ai js non si vedono con un semplice F5, ma si rende necessario stoppare il debug e riavviarlo.
Per evitare questo, in ambiente di TEST andare su
Configurazione -> Impostazioni -> Impostazioni generali paragrafo sulla minificazione
e togliere le spunte da minificazione html , minificazione css e minificazione javascript.
Lato applicazione, per poter usare le risorse senza bundle in test, ho inserito questo codice all'interno di Themes/Designbest/Views/Shared/Head.cshtml
@if (Html.IsProduction()) {
Html.AppendCssFileParts($"~/Themes/{themeName}/Content/css/designbest-theme.min.css");
Html.AppendScriptParts($"~/Themes/{themeName}/Scripts/site.min.js");
}
else {
Html.AppendCssFileParts($"~/Themes/{themeName}/Content/css/bootstrap/bootstrap.css");
Html.AppendCssFileParts($"~/Themes/{themeName}/Content/css/styles.css");
Html.AppendCssFileParts($"~/Themes/{themeName}/Content/css/designbest.css");
Html.AppendScriptParts($"~/Themes/{themeName}/Scripts/site.min.js");
}
Backoffice
[modifica]La backoffice che permette di inserire negozi e prodotti all'interno del commerce è quella di Trovaprodotti. Tramite query e procedure logica (come svuota cache, copia file) si occupa di inserire/aggiornare/cancellare elementi. Le funzioni, descritte nel dettaglio, sono:
Trigger
[modifica]Abbiamo inserito dei trigger per facilitare la comunicazione dei dati da NOP ai nostri database.
Per semplificare la comunicazione tra database sono stati creati alcuni Sinonimi
Sinonimi
[modifica]Sinonimi creati su database di NOP per facilitare la comunicazione con Designbest e Trovaprodotti:
-- Tabella di Mapping delle Occasioni
CREATE SYNONYM [dbo].[Db_NopMapping_Occasioni] FOR [_Designbest].[dbo].[NopMapping_Occasioni]
-- Tabella Occasioni
CREATE SYNONYM [dbo].[TP_Occasioni] FOR [_Trovaprodotti].[dbo].[Occasioni]
Product - Trigger
[modifica]Creato un trigger [Product_ChangeQuantity] per la tabella [Product] di NOP, che controlla gli eventi di UPDATE sul campo [StockQuantity].
Ogni cambiamento di quantità, effettuato da NOP, viene riportata sulla tabella [Occasioni] di Trovaprodotti nel campo [Pezzi]
CREATE TRIGGER [dbo].[Product_ChangeQuantity]
ON [dbo].[Product]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @OccID INT = 0, @NumPezziAggiornato INT;
IF UPDATE([StockQuantity])
BEGIN
SELECT @OccID = Db_NopMapping_Occasioni.OccID FROM Db_NopMapping_Occasioni
WHERE Nop_OccID IN (
SELECT i.Id FROM inserted i
)
IF @OccID = 0 return;
SELECT @NumPezziAggiornato = i.StockQuantity FROM inserted i;
IF @NumPezziAggiornato = 0
BEGIN
UPDATE TP_Occasioni
SET TP_Occasioni.[Pezzi] = @NumPezziAggiornato
WHERE TP_Occasioni.[ID] = @OccID
PRINT 'TRIGGER [Product_ChangeQuantity] ESEGUITO e Aggiornato su TP'
END
ELSE
BEGIN
UPDATE TP_Occasioni
SET TP_Occasioni.[Pezzi] = @NumPezziAggiornato
WHERE TP_Occasioni.[ID] = @OccID
PRINT 'TRIGGER [Product_ChangeQuantity] ESEGUITO e Aggiornato su TP'
END
END
ELSE
BEGIN
PRINT 'TRIGGER [Product_ChangeQuantity] ESEGUITO, ma nessuna modifica su TP'
END
END
GO
A seguire una porzione di codice che scatena il trigger solo sul prodotto di NOP con ID 408:
UPDATE Product SET StockQuantity = 0 WHERE id = 408
SELECT id, [Name], sku, StockQuantity FROM Product
where Id IN (408,222)
SELECT ID as OccID, ShopID, Pezzi FROM Occasioni
WHERE ID IN (25702,10994)
order by ID desc
DROPSHIPPING
[modifica]Vendita del nuovo e assegnazione ordine ad un rivenditore.
- Creazione catalogo prodotti NUOVI x Rivenditore Webmobili Dropshipping
- Cliente compra un prodotto nuovo venduto da Webmobili Dropshipping
- Da Admin filtro ordini dal rivenditore Webmobili Dropshipping
- Dettaglio Ordine -> Prodotti -> ci sarà un elenco di prodotti
- Per ogni prodotto, SOLO di Webmobili Dropshipping, aggiungiamo un pulsante CLONA - ASSEGNA
- al click sul pulsante CLONA - ASSEGNA si aprirà un modale con l'elenco di tutti i rivenditori
- il prodotto originale dell'ordine viene clonato(pubblico->false | VisibleIndividually->false | SKU-> sku-newProductId), assegnato al rivenditore selezionato
- update tabella OrderItem del nostro OrderId, con il nuovo ProductId appena creato/clonato
- Se il cliente ha pagato con carta o paypal gli manderemo una email con specificato il Rivenditore che gli spedirà il prodotto
- Se il cliente invece paga tramite bonifico, non spediremo noi email(autogenerata), ma seguirà il flusso normale dopo aver ricevuto il pagamento e impostato l'ordine come pagato.
Plugin Locali
[modifica]Payments.CheckMoneyOrder
[modifica](da Configurazione/Plugins Locali) il nome amichevole del plugin viene utilizzato in message template delle email, si rende necessario modificare il nome con l'esatta stringa
Bonifico Bancario
Nop Ajax Filters
[modifica]Implementa un infinity scroll che va in errore in visualizzazione mobile (non scrolla e non vanno i filtri). Per rimediare è necessario disabilitare il plugin da
Nop Templates => Plugins => Ajax Filters => Settings
PayPal Commerce
[modifica]Per disattivare i pulsanti che vengono mostrati durante il checkuot con PayPal, ad esempio Sofort e MyBank bisogna andare in:
- Configurazione
- Impostazioni
- Tutte le impostazioni
- cercare la chiave ->
paypalcommercesettings.enabledfunding - settare il valore ai bottoni da disabilitare ->
mybank,sofort
Qui la guida SDK con l'elenco dei parametri da utilizzare: https://developer.paypal.com/sdk/js/configuration/#link-disablefunding
Disallow SEO
[modifica]Il sito è passato in NOINDEX-NOFOLLOW a causa di contenuti duplicati con outlet.
Inserire in \Presentation\Nop.Web\Themes\<nometema>\Views\Shared\_Root.Head.cshtml l'header html
<meta name="robots" content="noindex,nofollow" />
Poi eliminare la generazione delle sitemaps xml mettendo a False la configurazione sitemapxmlsettings.sitemapxmlenabled sotto Configurazione -> Impostazioni -> Tutte le impostazioni.
Aggiungere al \Presentation\Nop.Web\robots.additions.txt la riga
Disallow: /
