Prodotti Refactor: differenze tra le versioni

Da Webmobili Wiki.
 
(75 versioni intermedie di 3 utenti non mostrate)
Riga 1: Riga 1:
Il progetto prevede di cambiare il dataset della tabella <code>Product</code> in modo da diventare simile a quello delle <code>Occasioni</code><br/><br/>
Il progetto prevede di cambiare il dataset della tabella <code>Product</code> in modo da diventare simile a quello delle <code>Occasioni</code><br/><br/>


=== Tabella Product ===
== Tabella Product ==
Di seguito i campi di una situazione ottimale
Di seguito i campi di una situazione ottimale
{| class="wikitable"
{| class="wikitable"
! colspan="3"|Prodotti
! colspan="3"|WM_Product
|-
|-
|style="font-family: monospace;"|ID
|style="font-family: monospace;"|ID<sup>P</sup>
|int
|int
|id del prodotto
|id del prodotto
Riga 13: Riga 13:
|int
|int
|id del suo manufacturer
|id del suo manufacturer
|-
|style="font-family: monospace;"|ManufacturerCustomName
|nvarchar(100) (nullable)
|Manufacturer personalizzato (deriva da old outlet)
|-
|-
|style="font-family: monospace;"|StyleID
|style="font-family: monospace;"|StyleID
Riga 29: Riga 33:
|int (nullable)
|int (nullable)
|id del Designer
|id del Designer
|-
|style="font-family: monospace;"|ListPrice
|int (nullable)
|Prezzo di listino
|-
|style="font-family: monospace;"|DiscountPrice
|int (nullable)
|Prezzo scontato
|-
|-
|style="font-family: monospace;"|ReviewRating
|style="font-family: monospace;"|ReviewRating
Riga 51: Riga 47:
|-
|-
|style="font-family: monospace;"|LastUpdate
|style="font-family: monospace;"|LastUpdate
|datetime
|datetime (nullable)
|Data dell'ultima modifica effettuata
|Data dell'ultima modifica effettuata
|-
|-
Riga 57: Riga 53:
|-
|-
|style="font-family: monospace;"|BackofficeNotes
|style="font-family: monospace;"|BackofficeNotes
|nvarchar(2000)
|nvarchar(2000) (nullable)
|Note dalla redazione
|Note dalla redazione
|-
|style="font-family: monospace;"|DataListino
|datetime
|Data di pubblicazione del listino
|-
|-
|style="font-family: monospace;"|DataAggiornamentoListino
|style="font-family: monospace;"|DataAggiornamentoListino
|datetime
|datetime (nullable)
|Data dell'ultimo aggiornamento del listino
|Data dell'ultimo aggiornamento del listino
|}
|}


=== Tabella ProductCulture ===
=== Problema ===
Importando le '''occasioni''' in questa tabella ci troviamo i casi in cui il '''manufacturer è custom''' (scritto a mano dal rivenditore in un campo di testo).<br/>
Per poterli importare abbiamo fatto il seguente barbatrucco:
* Creazione di un nuovo manufacturer chiamato '''Xtra Catalogo''' (con SEOName = <code>custom_manufacturer</code> )
* Popolamento del campo <code>WM_Product.ManufacturerID</code> con l'ID di questo nuovo manu
* Popolamento del campo <code>WM_Product.ManufacturerCustomName</code> con il nome testuale
L'applicativo dovrà implementare un caso particolare quando un prodotto avrà il manufacturer custom.<br/>
(pseudo codice)
<syntaxhighlight>
IF ManufacturerID == ManuCustom.ID
  Manufacturer = WM_Product.ManufacturerCustomName
</syntaxhighlight>
 
== Tabella ProductCulture ==
{| class="wikitable"
{| class="wikitable"
! colspan="3"|ProdottiCulture
! colspan="3"|WM_ProductCulture
|-
|-
|style="font-family: monospace;"|ID
|style="font-family: monospace;"|ID<sup>P</sup>
|int
|int
|ID autoincrementale del record
|ID autoincrementale del record
|-
|-
|style="font-family: monospace;"|ProductID
|style="font-family: monospace;"|ProductID<sup>U</sup>
|int
|int
|ID del prodotto
|ID del prodotto
|-
|-
|style="font-family: monospace;"|Culture
|style="font-family: monospace;"|Culture<sup>U</sup>
|varchar(5)
|varchar(5)
|Cultura del record
|Cultura del record
Riga 90: Riga 95:
|-
|-
|style="font-family: monospace;"|Description
|style="font-family: monospace;"|Description
|nvarchar(3000)
|nvarchar(4000)
|Descrizione del prodotto
|Descrizione del prodotto
|-
|-
|style="font-family: monospace;"|Material
|style="font-family: monospace;"|Material
|nvarchar(300) (nullable)
|nvarchar(4000) (nullable)
|Materiali del prodotto
|Materiali del prodotto
|-
|-
|style="font-family: monospace;"|Measures
|style="font-family: monospace;"|Measures
|nvarchar(300) (nullable)
|nvarchar(4000) (nullable)
|Misure del prodotto
|Misure del prodotto
|-
|-
Riga 113: Riga 118:
|Indica se il prodotto è visibile nella cultura selezionata
|Indica se il prodotto è visibile nella cultura selezionata
|}
|}
== Tabella ProductBargain ==
Tabella che estende i prodotti con i campi necessari ai soli prodotti che sono occasioni (nell'outlet e nel Trovaprodotti)
{| class="wikitable"
! colspan="3"|WM_ProductBargain
|-
|style="font-family: monospace;"|BargainID<sup>P</sup>
|int
|Vecchio OccasioneID, lo teniamo ancora per mantenere i vecchi url con l'altra numerazione
|-
|style="font-family: monospace;"|ProductID<sup>U</sup>
|int
|id prodotto corrispondente nella tabella Product
|-
|style="font-family: monospace;"|ShopPointID
|int
|id della sede del rivenditore (se associato a fittizio è da sistemare in una sede vera)
|-
|style="font-family: monospace;"|ListPrice
|decimal(18, 2)
|Prezzo di listino
|-
|style="font-family: monospace;"|DiscountPrice
|decimal(18, 2)
|Prezzo scontato
|-
|style="font-family: monospace;"|InStock
|bit
|Indica se il prodotto è già imballato per la pronta consegna oppure se si trova in esposizione (0)
|-
|style="font-family: monospace;"|OutletApproved
|bit
|Indica se è abilitata per l'outlet
|-
|style="font-family: monospace;"|CommerceApproved
|bit
|Indica se è abilitata per il Commerce
|-
|style="font-family: monospace;"|ToModerate
|datetime (nullable)
|Se valorizzato indica il momento dal quale è in fase di moderazione per la pubblicazione su Commerce
|-
|style="font-family: monospace;"|Pieces
|int
|Numero di pezzi a disposizione
|-
|style="font-family: monospace;"|Sort
|int
|L'ordinamento rispetto alle altre occasioni dello stesso rivenditore
|}
== Tabella ProductBargainCulture ==
{| class="wikitable"
! colspan="3"|WM_ProductBargainCulture
|-
|style="font-family: monospace;"|BargainID<sup>P</sup>
|int
|ID nella tabella WM_ProductBargain
|-
|style="font-family: monospace;"|Culture<sup>P</sup>
|varchar(5)
|Cultura del record
|-
|style="font-family: monospace;"|TransportAssembly
|nvarchar(300) (nullable)
|Trasporto e montaggio
|-
|style="font-family: monospace;"|IsFreeShipping
|bit
|Indica se la spedizione è gratuita
|-
|style="font-family: monospace;"|AdditionalShippingCharge
|decimal(18,2)
|Costi di spedizione
|-
|style="font-family: monospace;"|DeliveryDateId
|int (nullable)
|Indica su commerce il delivery date id (???)
|-
|style="font-family: monospace;"|ShippingCostIncluded
|bit (nullable)
|Indica se il costo di spedizione è incluso. Se null significa che non è CommerceApproved.
|-
|style="font-family: monospace;"|ShippingQuotation
|bit
|Indica se la spedizione è a preventivo
|-
|style="font-family: monospace;"|InHouseDelivery
|bit (nullable)
|Indica se consegna in-house
|-
|style="font-family: monospace;"|AllInclusiveDelivery
|bit (nullable)
|Indica se consegna all-inclusive
|}
== Tabella ProductPicture==
{| class="wikitable"
! colspan="3"|WM_ProductPicture
|-
|style="font-family: monospace;"|ID<sup>P</sup>
|int
|ID della picture
|-
|style="font-family: monospace;"|ProductID
|int
|ID del prodotto
|-
|style="font-family: monospace;"|Master
|bit
|Picture master
|-
|style="font-family: monospace;"|SquarePicture
|nvarchar(255)
|Nome dell'immagine quadrata che potrebbe essere <code>product-<ProductID>-q-<m/a>-<Sort>.jpg</code>
|-
|style="font-family: monospace;"|Picture
|nvarchar(255)
|Nome dell'immagine normale che potrebbe essere <code>product-<ProductID>-n-<m/a>-<Sort>.jpg</code>
|-
|style="font-family: monospace;"|Sort
|int
|Ordinamento
|}
POSSIBILE SVILUPPO:<br/>
Solo 2 immagini per prodotto: '''quadrata e normale'''. Basterà uploadare le più grandi possedute. Ai ridimensionamenti ci penserà ImageKit.io.<br/>
Creare un '''unico folder di immagini''' con la seguente convenzione di nomi:<br/>
<syntaxhighlight>
product-<ProductID>-<q|n>-<m|a>-<Sort>.jpg
es.
  product-86234-q-m-0.jpg // prima master quadrata
  product-86234-n-m-0.jpg // prima master normale
  product-86234-n-a-3.jpg // quarta alternativa normale
</syntaxhighlight>
dove
* <code>q</code> sta per quadrata
* <code>n</code> sta per normale
* <code>m</code> sta per master
* <code>a</code> sta per alternativa<br/><br/>
ALTERNATIVA FORSE PIU' FURBA:<br/>
Tutto uguale, ma la convenzione dei nomi come la seguente:
<syntaxhighlight>
product-<ProductID>-<Sort>.jpg
bargain-<ProductID>-<Sort>.jpg
</syntaxhighlight>
Questa soluzione è meno leggibile dall'umano ma molto più elastica nel caso in cui ci siano diversi cambiamenti di ordine, master/alternative (evita di dover rinominare l'immagine su disco).
SISTEMAZIONE VALORI di SORT
<syntaxhighlight lang="sql">
SELECT ProductID, Sort,
CAST(ROW_NUMBER() OVER(PARTITION BY ProductID ORDER BY ProductID, Sort) AS INT) *10 AS Riga
FROM Picture
ORDER BY ProductID, Sort
</syntaxhighlight>
== Tabelle obsolete ==
Elenco di tabelle che non usiamo/useremo più
* <code>L_Advertising_Product</code> roba vecchia inutile
* <code>L_Product_MeasureRange</code> vuota
* <code>L_Product_ProductPart</code> vuota
* <code>L_Product_Selection</code> non utilizzata nel progetto
* <code>L_Product_Variant</code> vuota
* <code>L_Product_VariantCulture</code> vuota
* <code>ProductMeasureVariant</code> che è??
* <code>ProductMeasureVariantCulture</code> che è??
* <code>L_ProductMeasureVariant_Measure</code> che è??
* <code>Window</code> vuota
<br/>
Nel database del Trovaprodotti
* <code>Occasioni.LastUpdate</code> -> aggiunto un trigger sull'update dell'occasione che aggiorna il campo LastUpdate

Versione attuale delle 10:07, 14 mar 2022

Il progetto prevede di cambiare il dataset della tabella Product in modo da diventare simile a quello delle Occasioni

Tabella Product

[modifica]

Di seguito i campi di una situazione ottimale

WM_Product
IDP int id del prodotto
ManufacturerID int id del suo manufacturer
ManufacturerCustomName nvarchar(100) (nullable) Manufacturer personalizzato (deriva da old outlet)
StyleID int id dello Style
AmbientID int id dell'Ambient (forse non necessario qua)
TypeID int id del Type
DesignerID int (nullable) id del Designer
ReviewRating tinyint Sono le stelline presenti nel prodotto trovato in SERP (valori possibili: 4 ; 4.5 ;5 )
Visible bit Indica se il prodotto è visibile
InsertDate datetime Data di inserimento del prodotto nel database
LastUpdate datetime (nullable) Data dell'ultima modifica effettuata
Campi per uso interno
BackofficeNotes nvarchar(2000) (nullable) Note dalla redazione
DataAggiornamentoListino datetime (nullable) Data dell'ultimo aggiornamento del listino

Problema

[modifica]

Importando le occasioni in questa tabella ci troviamo i casi in cui il manufacturer è custom (scritto a mano dal rivenditore in un campo di testo).
Per poterli importare abbiamo fatto il seguente barbatrucco:

  • Creazione di un nuovo manufacturer chiamato Xtra Catalogo (con SEOName = custom_manufacturer )
  • Popolamento del campo WM_Product.ManufacturerID con l'ID di questo nuovo manu
  • Popolamento del campo WM_Product.ManufacturerCustomName con il nome testuale

L'applicativo dovrà implementare un caso particolare quando un prodotto avrà il manufacturer custom.
(pseudo codice)

IF ManufacturerID == ManuCustom.ID
  Manufacturer = WM_Product.ManufacturerCustomName

Tabella ProductCulture

[modifica]
WM_ProductCulture
IDP int ID autoincrementale del record
ProductIDU int ID del prodotto
CultureU varchar(5) Cultura del record
Name nvarchar(500) Nome del prodotto
Description nvarchar(4000) Descrizione del prodotto
Material nvarchar(4000) (nullable) Materiali del prodotto
Measures nvarchar(4000) (nullable) Misure del prodotto
NewProduct bit Indica se il prodotto è novità nella cultura selezionata
ShowInSearch bit Indica se il prodotto dev'essere visibile nelle ricerche per ambiente/tipologia
Visible bit Indica se il prodotto è visibile nella cultura selezionata

Tabella ProductBargain

[modifica]

Tabella che estende i prodotti con i campi necessari ai soli prodotti che sono occasioni (nell'outlet e nel Trovaprodotti)

WM_ProductBargain
BargainIDP int Vecchio OccasioneID, lo teniamo ancora per mantenere i vecchi url con l'altra numerazione
ProductIDU int id prodotto corrispondente nella tabella Product
ShopPointID int id della sede del rivenditore (se associato a fittizio è da sistemare in una sede vera)
ListPrice decimal(18, 2) Prezzo di listino
DiscountPrice decimal(18, 2) Prezzo scontato
InStock bit Indica se il prodotto è già imballato per la pronta consegna oppure se si trova in esposizione (0)
OutletApproved bit Indica se è abilitata per l'outlet
CommerceApproved bit Indica se è abilitata per il Commerce
ToModerate datetime (nullable) Se valorizzato indica il momento dal quale è in fase di moderazione per la pubblicazione su Commerce
Pieces int Numero di pezzi a disposizione
Sort int L'ordinamento rispetto alle altre occasioni dello stesso rivenditore

Tabella ProductBargainCulture

[modifica]
WM_ProductBargainCulture
BargainIDP int ID nella tabella WM_ProductBargain
CultureP varchar(5) Cultura del record
TransportAssembly nvarchar(300) (nullable) Trasporto e montaggio
IsFreeShipping bit Indica se la spedizione è gratuita
AdditionalShippingCharge decimal(18,2) Costi di spedizione
DeliveryDateId int (nullable) Indica su commerce il delivery date id (???)
ShippingCostIncluded bit (nullable) Indica se il costo di spedizione è incluso. Se null significa che non è CommerceApproved.
ShippingQuotation bit Indica se la spedizione è a preventivo
InHouseDelivery bit (nullable) Indica se consegna in-house
AllInclusiveDelivery bit (nullable) Indica se consegna all-inclusive

Tabella ProductPicture

[modifica]
WM_ProductPicture
IDP int ID della picture
ProductID int ID del prodotto
Master bit Picture master
SquarePicture nvarchar(255) Nome dell'immagine quadrata che potrebbe essere product-<ProductID>-q-<m/a>-<Sort>.jpg
Picture nvarchar(255) Nome dell'immagine normale che potrebbe essere product-<ProductID>-n-<m/a>-<Sort>.jpg
Sort int Ordinamento

POSSIBILE SVILUPPO:
Solo 2 immagini per prodotto: quadrata e normale. Basterà uploadare le più grandi possedute. Ai ridimensionamenti ci penserà ImageKit.io.
Creare un unico folder di immagini con la seguente convenzione di nomi:

product-<ProductID>-<q|n>-<m|a>-<Sort>.jpg

es.
  product-86234-q-m-0.jpg // prima master quadrata
  product-86234-n-m-0.jpg // prima master normale
  product-86234-n-a-3.jpg // quarta alternativa normale

dove

  • q sta per quadrata
  • n sta per normale
  • m sta per master
  • a sta per alternativa

ALTERNATIVA FORSE PIU' FURBA:
Tutto uguale, ma la convenzione dei nomi come la seguente:

product-<ProductID>-<Sort>.jpg
bargain-<ProductID>-<Sort>.jpg

Questa soluzione è meno leggibile dall'umano ma molto più elastica nel caso in cui ci siano diversi cambiamenti di ordine, master/alternative (evita di dover rinominare l'immagine su disco).

SISTEMAZIONE VALORI di SORT

SELECT ProductID, Sort,
	CAST(ROW_NUMBER() OVER(PARTITION BY ProductID ORDER BY ProductID, Sort) AS INT) *10 AS Riga
FROM Picture
ORDER BY ProductID, Sort

Tabelle obsolete

[modifica]

Elenco di tabelle che non usiamo/useremo più

  • L_Advertising_Product roba vecchia inutile
  • L_Product_MeasureRange vuota
  • L_Product_ProductPart vuota
  • L_Product_Selection non utilizzata nel progetto
  • L_Product_Variant vuota
  • L_Product_VariantCulture vuota
  • ProductMeasureVariant che è??
  • ProductMeasureVariantCulture che è??
  • L_ProductMeasureVariant_Measure che è??
  • Window vuota


Nel database del Trovaprodotti

  • Occasioni.LastUpdate -> aggiunto un trigger sull'update dell'occasione che aggiorna il campo LastUpdate