Trovaprodotti Core: differenze tra le versioni

Da Webmobili Wiki.
 
(36 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Il negozio dalla sua backoffice ClientAdmin avrà la possibilità di creare un '''prodotto a Catalogo''' valido solo per il suo Trovaprodotti oppure un '''prodotto Occasione''' che potrà essere visibile su ''DesignbestOutlet'', ''Commerce'' e ''Trovaprodotti''.<br/>
Il negozio dalla sua backoffice ClientAdmin avrà la possibilità di creare un '''prodotto a Catalogo''' valido solo per il suo Trovaprodotti oppure un '''prodotto Occasione''' che potrà essere visibile su ''DesignbestOutlet'', ''Commerce'' e ''Trovaprodotti''.<br/>
Il negozio potrà aggiungere suoi ''Manufacturer'' e proprie ''Tipologie''.
Il negozio potrà  
* aggiungere propri ''Manufacturer''
* aggiungere propri ''Ambienti''
* aggiungere proprie ''Tipologie'' nei nuovi ambienti o in ambienti già esistenti




== Manufacturer Custom ==
== Manufacturer Custom ==
Il negozio potrà inserire i propri Marchi specificando: ''Nome'', ''Immagine/Logo'' e se sarà in ''evidenza'' nella pagine di elenco dei Marchi.
Il negozio potrà inserire i propri Marchi specificando: ''Nome'', ''Immagine/Logo'' e se sarà in ''evidenza'' nella pagine di elenco dei Marchi.<br/>
L'immagine non sarà obbligatoria se il manufacturer nuovo verrà assegnato solo ad occasioni. Se invece verrà assegnato a prodotti a catalogo custom, il suo logo apparirà nel listing dei brand.


== Category Custom ==
Il negozio potrà inserire '''tipologie proprie''' specificando: ''Nome tipo'' e ''Ambiente'' di appartenenza (che può essere a sua volta custom o esistente).


Tabelle coinvolte:
* <code>TP_Manufacturer</code>
* <code>TP_Map_TPProduct_TPManufacturer</code>
* <code>TP_Map_Product_TPManufacturer</code>
* <code>TP_Manufacturer_InEvidence</code>


=== TP_Manufacturer ===
== Strategia di Estensione Contestuale ==
Manufacturer Custom relativi al Trovaprodotti del negozio.
Per evitare di creare delle logiche circostanziali, poco elastiche e di elevata manutenzione abbiamo deciso di adottare un '''paradigma simile all'estensione delle classi''' nella programmazione ad oggetti.<br/><br/>


In pratica ''estendiamo le tabelle'' esistenti, cioè ne creiamo una copia che abbia un campo <code>Context</code> che identifichi il contesto di appartenenza (es. un Trovaprodotti specifico).<br/>
Il '''contesto''' rappresenta l'unione delle due tabelle (<code>normale + nomale_ext</code>) come se fossero un'unica tabella integrata nelle logiche Core.<br/>
Questa ''unione'' viene implementata tramite una '''scalar function''' che prende in input il ''contesto''.<br/><br/>


=== TP_Map_TPProduct_TPManufacturer ===
=== Esempio Pratico ===
Mapping tra Prodotti Custom e Manufacturer Custom del negozio.
volendo aggiungere nuovi Manufacturer solo per il Trovaprodotti di <code>PincoPallino (id 1111)</code>,<br/>
basterà utilizzare una funzione <code>ManufacturerExt(1111) AS Manufacturer</code> e fare le query come se ci trovassimo nel pool di Designbest.<br/><br/>


=== TP_Map_Product_TPManufacturer ===
In questo caso <code>ManufacturerExt(1111)</code> rappresenta la somma di tutti i '''manufacturer di Designbest + quelli custom''' che sono stati aggiunti dal '''contesto n° 1111'''
Mapping tra Prodotti Occasione e Manufacturer Custom del negozio.
<syntaxhighlight lang="sql">
ManufacturerExt(1111)  =


=== TP_Manufacturer_InEvidence ===
SELECT Campo1, Campo2, Campo3, 1 AS Core FROM Manufacturer
Manufacturer Designbest che il negozio vuole mettere in evidenza nella pagina Marchi.
UNION
SELECT Campo1, Campo2, Campo3, 0 AS Core FROM Manufacturer_Ext WHERE Context = 1111
</syntaxhighlight>


== Category Custom ==
<code>ManufacturerExt(1111)</code> , tramite il campo <code>@Core</code> è in grado di sapere se si trova nel contesto specifico oppure nel core Designbest.
Il negozio potrà inserire '''tipologie proprie''' specificando: ''Nome tipo'' e ''Ambiente'' di appartenenza (che può essere a sua volta custom o esistente).<br/><br/>


Tabelle coinvolte:
==== Ambiguità degli ID ====
* <code>TP_Category</code>
A causa dell''''ambiguità degli ID''' (i nuovi possono collidere con quelli del core, non c'è univocità),<br/>
* <code>TP_Map_TPProduct_TPCategory</code>
ad ogni <code>JOIN</code> con le tabelle ''Ext'' è necessario specificare il parametro <code>@Core</code> per specificare se si tratta di record custom del contesto oppure di record di Designbest.<br/><br/>
* <code>TP_CategoryRename</code>
* <code>TP_CategoryHide</code>
* <code>TP_CategorySort</code>


== Prodotti a Catalogo ==
Nel caso di una '''GET dei Manufacturer''', i recordset avranno sempre il campo <code>@Core</code> che indica se il manu in questione è di Designbest o un custom manu del contesto corrente.<br/>
Prodotto nuovo creato dal negozio e visibile tra i prodotti a catalogo solamente sul suo Trovaprodotti.<br/>
In questo modo il frontend sarà in grado di mostrare la scheda prodotto con la coppia <code>@ID INT, @Core BIT</code>.
Il Nuovo prodotto potrà essere aggiunto ad un ''catalogo'' ed ad una ''tipologia'' esistenti su Designbest oppure associato ad un ''custom Manu'' e/o una ''custom tipologia''.
<syntaxhighlight lang="sql">
SELECT Nome, SeoNome, Descrizione, Core
FROM ManufacturerExt(1111) AS Manufacturer
</syntaxhighlight>
Per ogni riga di risultato, l'applicativo sa se il prodotto è del contesto (<code>Core = 0</code>) o di Designbest (<code>Core = 1</code>)
<br/>


Tabelle coinvolte:
Nel caso di un '''FILTRO dei Manufacturer''', nella <code>WHERE</code> è sempre necessario specificare se stiamo cercando tra i custom record del contesto o in Designbest specificando il parametro <code>Core</code>
* <code>TP_Product</code>
<syntaxhighlight lang="sql">
* <code>TP_ProductCulture</code>
SELECT Nome, SeoNome, Descrizione, Core
* <code>TP_CustomPrice_Product</code>
FROM ManufacturerExt(1111) AS Manufacturer
WHERE Manufacturer.ID = 275 AND Manufacturer.Core = @FromCore
</syntaxhighlight>
Necessario il parametro booleano <code>@FromCore</code> per suggerire di cercare dentro i custom record del contesto o dentro al core Designbest<br/><br/>


=== TP_Product ===
=== Tabelle estese ===
Il campo ''ManufacturerId'' corrisponde al Manu su Designbest.<br/>
Al momento, per '''Trovaprodotti''' abbiamo esteso le seguenti tabelle
Nel caso di '''Manu Custom''' questo valore deve essere uguale al '''ManuId 4212''' che corrisponde al display name '''Xtra Catalogo''' e SEO '''custom_manufacturer''' e bisognerà settare il mapping nella tabella <code>TP_Map_TPProduct_TPManufacturer</code>.<br/><br/>
Il campo ''CategoryId'' corrisponde alla Category su Designbest.<br/>
Nel caso di Tipologia Custom bisogna creare anche un Ambiente Custom nella tabella <code>TP_Category</code> e mapparla al prodotto in <code>TP_Map_TPProduct_TPCategory</code>.


Note:
<table class="wikitable sortable">
* le 2 tabelle sopra sono pronte per il ''multi-culture'', ma la UI permette solo di inserire IT;
  <tr>
* possibilità di inserimento ''Prezzo'' oppure una ''Price Notes'' ad esempio ''"A partire da ..."'';
    <th>Tabella estesa</th>
* associando al prodotto una Tipologia Custom sarà necessario anche associare una Tipologia Designbest (il prodotto si vedrà in entrambe le tipologie);
    <th>Funzione di unione</th>
* possibilità di nascondere ambienti e tipologie;
  </tr>
* possibilità di ordinare ambienti e tipologie;
  <tr>
* possibilità di rinominare ambienti e tipologie;
    <td><code>Product_Ext</code></td>
    <td rowspan="2"><code>ProductExt(@ContextID INT, @LanguageID INT = 1)</code></td>
  </tr>
  <tr>
    <td><code>ProductCulture_Ext</code></td>
   
  </tr>
  <tr>
    <td><code>ProductThumbs_Ext</code></td>
    <td><code>ProductThumbsExt(@ContextID INT, @LanguageID INT = 1)</code></td>
  </tr>
  <tr>
    <td><code>Manufacturer_Ext</code></td>
    <td><code>ManufacturerExt(@ContextID INT)</code></td>
  </tr>
  <tr>
    <td><code>Mapping_ShopPoint_Manufacturer_Ext</code></td>
    <td><code>Mapping_ShopPoint_ManufacturerExt(@ContextID INT)</code></td>
  </tr>
  <tr>
    <td><code>Category_Ext</code></td>
    <td><code>CategoryExt(@ContextID INT)</code></td>
  </tr>
  <tr>
    <td><code>LocalizedProperty_Ext</code></td>
    <td><code>LocalizedPropertyExt(@ContextID INT, @LocaleKeyGroup NVARCHAR(100), @LocaleKey NVARCHAR(100), @LanguageID INT = 1)</code></td>
  </tr>
  <tr>
    <td><code>Picture_Ext</code></td>
    <td><code>PictureExt(@ContextID INT, @LocaleKeyGroup NVARCHAR(100), @LocaleKey NVARCHAR(100))</code></td>
  </tr>
  <tr>
    <td><code>FT_Products_IT_Ext</code></td>
    <td><code>FT_Products_ItExt(@ContextID INT)</code></td>
  </tr>
  <tr>
    <td><code>FT_Products_EN_Ext</code></td>
    <td><code>FT_Products_EnExt(@ContextID INT)</code></td>
  </tr>
  <tr>
    <td><code>FT_Products_FR_Ext</code></td>
    <td><code>FT_Products_FrExt(@ContextID INT)</code></td>
  </tr>
  <tr>
    <td><code>FT_Products_DE_Ext</code></td>
    <td><code>FT_Products_DeExt(@ContextID INT)</code></td>
  </tr>
</table>


== Prodotti Occasione ==


=== Estensione delle picture ===
La tabella <code>Picture_Ext</code> permette di estendere le immagini, ma il folder del file system è unico per tutte (core e non),<br/>
perciò non possiamo mantenere lo stesso schema di generazione dei nomi.<br/>
Quando creiamo una nuova picture per
* Prodotto custom
* Category custom
* Manufacturer custom
è necessario ricordarsi che nel campo <code>Picture.EntityValue</code> bisogna mettere
* <code>productext-<contextid></code>
* <code>categoryext-<contextid></code>
* <code>manufacturerext-<contextid></code>


== Prodotti Custom ==
== Struttura delle url ==
Il progetto permette ai rivenditori di
Ecco una ipotesi<br/>
* Creare '''manufacturer custom'''
HOMEPAGE
* Creare '''ambienti e tipologie custom''', con possibilità di creare una ''tipologia custom sotto un ambiente già esistente''
* <code>/it/44334</code> - ''hp''
* Creare '''prodotti custom''' che possono avere ambiente/tipologia/manufacturer standard oppure tra quelli custom appena creati.


=== Listing Prodotti ===
LISTING DA AMBIENTE
Il listing dei prodotti che fanno parte del core Designbest è gestito a basso livello dalla Stored Procedure <code>TP_ProductList</code> e gestisce i '''caso standard''' nei quali i parametri ''ambiente'', ''tipologia'' e ''manufacturer'' sono tutti del core Designbest.<br/><br/>
* <code>/it/44334/catalog/ambient-16_1</code> - ''ambiente'' obbligatorio
* <code>/it/44334/catalog/ambient-16_1/type-48_1</code> - ''ambiente/tipo''
* <code>/it/44334/catalog/ambient-16_1/brand-275_1</code> - ''ambiente/manu''
* <code>/it/44334/catalog/ambient-16_1/type-48_1/brand-275_1</code> - ''ambiente/tipo/manu''


Per quanto riguarda i '''prodotti custom''', devono essere recuperati a parte e integrati dentro al listing standard.<br/>
LISTING DA MANU
La Stored Procedure che se ne occupa è <code>TP_CustomProductList</code><br/>
* <code>/it/44334/brands</code>
Si distinguono ''5 casi'':
* <code>/it/44334/brand-275_1</code> - ''manu''
# <code>(ambiente, tipologia, manu)Designbest</code>
* <code>/it/44334/brand-275_1/ambient-16_1</code> - ''manu/ambiente''
# <code>(ambiente, manu)Designbest + (tipologia)Custom</code>
* <code>/it/44334/brand-275_1/ambient-16_1/type-48_1</code> - ''manu/ambiente/tipo (duplicata)''
# <code>(ambiente)Designbest + (tipologia, manu)Custom</code>
# <code>(manu)Designbest + (ambiente, tipologia)Custom</code>
# <code>(ambiente, tipologia, manu)Custom</code>


<table class="wikitable">
LISTING NEWS
  <tr>
* <code>/it/44334/news</code>
    <th>1</th>
* <code>/it/44334/news/ambient-16_1</code>
    <th>2</th>
* <code>/it/44334/news/brand-275_1</code>
    <th>3</th>
* <code>/it/44334/news/ambient-16_1/brand-275_1</code>
    <th>4</th>
    <th>5</th>
  </tr>


  <tr>
LISTING SEARCH
    <td>
* <code>/it/44334/search</code>
<pre>
AMB  Db
TYPE Db
MANU Db
</pre>
    </td>
    <td>
<pre>
AMB  Db
TYPE Cus
MANU Db
</pre>
    </td>
    <td>
<pre>
AMB  Db
TYPE Cus
MANU Cus
</pre>
    </td>
    <td>
<pre>
AMB  Cus
TYPE Cus
MANU Db
</pre>
    </td>
    <td>
<pre>
AMB  Cus
TYPE Cus
MANU Cus
</pre>
    </td>
  </tr>
</table>


L'applicazione, per ogni parametro filtro (ambient, type, manu) dovrà sapere se si tratta di un contesto Designbest o Custom.<br/>
LISTING OCCASIONI
Per un singolo listing potrebbero essere necessarie più chiamate al fine di popolare la lista completa.<br/>
* <code>/it/44334/offers</code> - ''tutte''
es.
* <code>/it/44334/offers/ambient-16_1</code> - ''ambiente''
<pre>
* <code>/it/44334/offers/ambient-16_1/type-48_1</code> - ''ambiente/tipo''
Viene richiesto un filtro per AMBIENTE DESIGNBEST.
* <code>/it/44334/offers/ambient-16_1/brand-275_1</code> - ''ambiente/manu''
Viene interpellata la SP TP_CustomProductList 3 volte (in quanto i casi in cui appare il filtro AMB Db sono 3)
* <code>/it/44334/offers/ambient-16_1/type-48_1/brand-275_1</code> - ''ambiente/tipo/manu''
- Caso 1 - Tutti i custom-prod delle categorie standard
- Caso 2 - Tutti i custom-prod con ambiente e manu standard e tipologia custom
- Caso 3 - Tutti i custom-prod con ambiente standard e manufaturer e tipologia custom
Le tre liste vanno unite a quella principale standard TP_ProductList
</pre>

Versione attuale delle 08:06, 28 giu 2023

Il negozio dalla sua backoffice ClientAdmin avrà la possibilità di creare un prodotto a Catalogo valido solo per il suo Trovaprodotti oppure un prodotto Occasione che potrà essere visibile su DesignbestOutlet, Commerce e Trovaprodotti.
Il negozio potrà

  • aggiungere propri Manufacturer
  • aggiungere propri Ambienti
  • aggiungere proprie Tipologie nei nuovi ambienti o in ambienti già esistenti


Manufacturer Custom

[modifica]

Il negozio potrà inserire i propri Marchi specificando: Nome, Immagine/Logo e se sarà in evidenza nella pagine di elenco dei Marchi.
L'immagine non sarà obbligatoria se il manufacturer nuovo verrà assegnato solo ad occasioni. Se invece verrà assegnato a prodotti a catalogo custom, il suo logo apparirà nel listing dei brand.

Category Custom

[modifica]

Il negozio potrà inserire tipologie proprie specificando: Nome tipo e Ambiente di appartenenza (che può essere a sua volta custom o esistente).


Strategia di Estensione Contestuale

[modifica]

Per evitare di creare delle logiche circostanziali, poco elastiche e di elevata manutenzione abbiamo deciso di adottare un paradigma simile all'estensione delle classi nella programmazione ad oggetti.

In pratica estendiamo le tabelle esistenti, cioè ne creiamo una copia che abbia un campo Context che identifichi il contesto di appartenenza (es. un Trovaprodotti specifico).
Il contesto rappresenta l'unione delle due tabelle (normale + nomale_ext) come se fossero un'unica tabella integrata nelle logiche Core.
Questa unione viene implementata tramite una scalar function che prende in input il contesto.

Esempio Pratico

[modifica]

volendo aggiungere nuovi Manufacturer solo per il Trovaprodotti di PincoPallino (id 1111),
basterà utilizzare una funzione ManufacturerExt(1111) AS Manufacturer e fare le query come se ci trovassimo nel pool di Designbest.

In questo caso ManufacturerExt(1111) rappresenta la somma di tutti i manufacturer di Designbest + quelli custom che sono stati aggiunti dal contesto n° 1111

ManufacturerExt(1111)   =

SELECT Campo1, Campo2, Campo3, 1 AS Core FROM Manufacturer
UNION
SELECT Campo1, Campo2, Campo3, 0 AS Core FROM Manufacturer_Ext WHERE Context = 1111

ManufacturerExt(1111) , tramite il campo @Core è in grado di sapere se si trova nel contesto specifico oppure nel core Designbest.

Ambiguità degli ID

[modifica]

A causa dell'ambiguità degli ID (i nuovi possono collidere con quelli del core, non c'è univocità),
ad ogni JOIN con le tabelle Ext è necessario specificare il parametro @Core per specificare se si tratta di record custom del contesto oppure di record di Designbest.

Nel caso di una GET dei Manufacturer, i recordset avranno sempre il campo @Core che indica se il manu in questione è di Designbest o un custom manu del contesto corrente.
In questo modo il frontend sarà in grado di mostrare la scheda prodotto con la coppia @ID INT, @Core BIT.

SELECT Nome, SeoNome, Descrizione, Core
FROM ManufacturerExt(1111) AS Manufacturer

Per ogni riga di risultato, l'applicativo sa se il prodotto è del contesto (Core = 0) o di Designbest (Core = 1)

Nel caso di un FILTRO dei Manufacturer, nella WHERE è sempre necessario specificare se stiamo cercando tra i custom record del contesto o in Designbest specificando il parametro Core

SELECT Nome, SeoNome, Descrizione, Core
FROM ManufacturerExt(1111) AS Manufacturer
WHERE Manufacturer.ID = 275 AND Manufacturer.Core = @FromCore

Necessario il parametro booleano @FromCore per suggerire di cercare dentro i custom record del contesto o dentro al core Designbest

Tabelle estese

[modifica]

Al momento, per Trovaprodotti abbiamo esteso le seguenti tabelle

Tabella estesa Funzione di unione
Product_Ext ProductExt(@ContextID INT, @LanguageID INT = 1)
ProductCulture_Ext
ProductThumbs_Ext ProductThumbsExt(@ContextID INT, @LanguageID INT = 1)
Manufacturer_Ext ManufacturerExt(@ContextID INT)
Mapping_ShopPoint_Manufacturer_Ext Mapping_ShopPoint_ManufacturerExt(@ContextID INT)
Category_Ext CategoryExt(@ContextID INT)
LocalizedProperty_Ext LocalizedPropertyExt(@ContextID INT, @LocaleKeyGroup NVARCHAR(100), @LocaleKey NVARCHAR(100), @LanguageID INT = 1)
Picture_Ext PictureExt(@ContextID INT, @LocaleKeyGroup NVARCHAR(100), @LocaleKey NVARCHAR(100))
FT_Products_IT_Ext FT_Products_ItExt(@ContextID INT)
FT_Products_EN_Ext FT_Products_EnExt(@ContextID INT)
FT_Products_FR_Ext FT_Products_FrExt(@ContextID INT)
FT_Products_DE_Ext FT_Products_DeExt(@ContextID INT)


Estensione delle picture

[modifica]

La tabella Picture_Ext permette di estendere le immagini, ma il folder del file system è unico per tutte (core e non),
perciò non possiamo mantenere lo stesso schema di generazione dei nomi.
Quando creiamo una nuova picture per

  • Prodotto custom
  • Category custom
  • Manufacturer custom

è necessario ricordarsi che nel campo Picture.EntityValue bisogna mettere

  • productext-<contextid>
  • categoryext-<contextid>
  • manufacturerext-<contextid>

Struttura delle url

[modifica]

Ecco una ipotesi
HOMEPAGE

  • /it/44334 - hp

LISTING DA AMBIENTE

  • /it/44334/catalog/ambient-16_1 - ambiente obbligatorio
  • /it/44334/catalog/ambient-16_1/type-48_1 - ambiente/tipo
  • /it/44334/catalog/ambient-16_1/brand-275_1 - ambiente/manu
  • /it/44334/catalog/ambient-16_1/type-48_1/brand-275_1 - ambiente/tipo/manu

LISTING DA MANU

  • /it/44334/brands
  • /it/44334/brand-275_1 - manu
  • /it/44334/brand-275_1/ambient-16_1 - manu/ambiente
  • /it/44334/brand-275_1/ambient-16_1/type-48_1 - manu/ambiente/tipo (duplicata)

LISTING NEWS

  • /it/44334/news
  • /it/44334/news/ambient-16_1
  • /it/44334/news/brand-275_1
  • /it/44334/news/ambient-16_1/brand-275_1

LISTING SEARCH

  • /it/44334/search

LISTING OCCASIONI

  • /it/44334/offers - tutte
  • /it/44334/offers/ambient-16_1 - ambiente
  • /it/44334/offers/ambient-16_1/type-48_1 - ambiente/tipo
  • /it/44334/offers/ambient-16_1/brand-275_1 - ambiente/manu
  • /it/44334/offers/ambient-16_1/type-48_1/brand-275_1 - ambiente/tipo/manu