Prodotti Refactor: differenze tra le versioni
| (56 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 == | |||
Di seguito i campi di una situazione ottimale | Di seguito i campi di una situazione ottimale | ||
{| class="wikitable" | {| class="wikitable" | ||
! colspan="3"| | ! 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 43: | 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 49: | 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;"|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"| | ! 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 78: | Riga 95: | ||
|- | |- | ||
|style="font-family: monospace;"|Description | |style="font-family: monospace;"|Description | ||
|nvarchar( | |nvarchar(4000) | ||
|Descrizione del prodotto | |Descrizione del prodotto | ||
|- | |- | ||
|style="font-family: monospace;"|Material | |style="font-family: monospace;"|Material | ||
|nvarchar( | |nvarchar(4000) (nullable) | ||
|Materiali del prodotto | |Materiali del prodotto | ||
|- | |- | ||
|style="font-family: monospace;"|Measures | |style="font-family: monospace;"|Measures | ||
|nvarchar( | |nvarchar(4000) (nullable) | ||
|Misure del prodotto | |Misure del prodotto | ||
|- | |- | ||
| Riga 102: | Riga 119: | ||
|} | |} | ||
== Tabella ProductBargain == | |||
Tabella che estende i prodotti con i campi necessari ai soli prodotti che sono nell'outlet | Tabella che estende i prodotti con i campi necessari ai soli prodotti che sono occasioni (nell'outlet e nel Trovaprodotti) | ||
{| class="wikitable" | {| class="wikitable" | ||
! colspan="3"| | ! colspan="3"|WM_ProductBargain | ||
|- | |- | ||
|style="font-family: monospace;"| | |style="font-family: monospace;"|BargainID<sup>P</sup> | ||
|int | |int | ||
| | |Vecchio OccasioneID, lo teniamo ancora per mantenere i vecchi url con l'altra numerazione | ||
|- | |- | ||
|style="font-family: monospace;"|ProductID | |style="font-family: monospace;"|ProductID<sup>U</sup> | ||
|int | |int | ||
|id | |id prodotto corrispondente nella tabella Product | ||
|- | |- | ||
|style="font-family: monospace;"| | |style="font-family: monospace;"|ShopPointID | ||
|int | |int | ||
|id del rivenditore | |id della sede del rivenditore (se associato a fittizio è da sistemare in una sede vera) | ||
|- | |- | ||
|style="font-family: monospace;"|ListPrice | |style="font-family: monospace;"|ListPrice | ||
| | |decimal(18, 2) | ||
|Prezzo di listino | |Prezzo di listino | ||
|- | |- | ||
|style="font-family: monospace;"|DiscountPrice | |style="font-family: monospace;"|DiscountPrice | ||
| | |decimal(18, 2) | ||
|Prezzo scontato | |Prezzo scontato | ||
|- | |- | ||
| Riga 153: | Riga 170: | ||
|} | |} | ||
== Tabella ProductBargainCulture == | |||
{| class="wikitable" | {| class="wikitable" | ||
! colspan="3"| | ! colspan="3"|WM_ProductBargainCulture | ||
|- | |- | ||
|style="font-family: monospace;"| | |style="font-family: monospace;"|BargainID<sup>P</sup> | ||
|int | |int | ||
|ID | |ID nella tabella WM_ProductBargain | ||
|- | |- | ||
|style="font-family: monospace;"|Culture<sup>P</sup> | |||
|style="font-family: monospace;"|Culture | |||
|varchar(5) | |varchar(5) | ||
|Cultura del record | |Cultura del record | ||
| Riga 186: | Riga 199: | ||
|- | |- | ||
|style="font-family: monospace;"|ShippingCostIncluded | |style="font-family: monospace;"|ShippingCostIncluded | ||
|bit | |bit (nullable) | ||
|Indica se il costo di spedizione è incluso | |Indica se il costo di spedizione è incluso. Se null significa che non è CommerceApproved. | ||
|- | |- | ||
|style="font-family: monospace;"|ShippingQuotation | |style="font-family: monospace;"|ShippingQuotation | ||
| Riga 194: | Riga 207: | ||
|- | |- | ||
|style="font-family: monospace;"|InHouseDelivery | |style="font-family: monospace;"|InHouseDelivery | ||
|bit | |bit (nullable) | ||
|Indica se consegna in-house | |Indica se consegna in-house | ||
|- | |- | ||
|style="font-family: monospace;"|AllInclusiveDelivery | |style="font-family: monospace;"|AllInclusiveDelivery | ||
|bit | |bit (nullable) | ||
|Indica se consegna all-inclusive | |Indica se consegna all-inclusive | ||
|} | |} | ||
== Tabella ProductPicture== | |||
{| class="wikitable" | {| class="wikitable" | ||
! colspan="3"| | ! colspan="3"|WM_ProductPicture | ||
|- | |- | ||
|style="font-family: monospace;"|ID | |style="font-family: monospace;"|ID<sup>P</sup> | ||
|int | |int | ||
|ID della picture | |ID della picture | ||
| Riga 220: | Riga 233: | ||
|style="font-family: monospace;"|SquarePicture | |style="font-family: monospace;"|SquarePicture | ||
|nvarchar(255) | |nvarchar(255) | ||
|Nome dell'immagine quadrata che potrebbe essere <ProductID>-q-<m/a>-<Sort>.jpg | |Nome dell'immagine quadrata che potrebbe essere <code>product-<ProductID>-q-<m/a>-<Sort>.jpg</code> | ||
|- | |- | ||
|style="font-family: monospace;"|Picture | |style="font-family: monospace;"|Picture | ||
|nvarchar(255) | |nvarchar(255) | ||
|Nome dell'immagine normale che potrebbe essere <ProductID>-n-<m/a>-<Sort>.jpg | |Nome dell'immagine normale che potrebbe essere <code>product-<ProductID>-n-<m/a>-<Sort>.jpg</code> | ||
|- | |- | ||
|style="font-family: monospace;"|Sort | |style="font-family: monospace;"|Sort | ||
| Riga 235: | Riga 248: | ||
Creare un '''unico folder di immagini''' con la seguente convenzione di nomi:<br/> | Creare un '''unico folder di immagini''' con la seguente convenzione di nomi:<br/> | ||
<syntaxhighlight> | <syntaxhighlight> | ||
<ProductID>-<q|n>-<m|a>-<Sort>.jpg | product-<ProductID>-<q|n>-<m|a>-<Sort>.jpg | ||
es. | es. | ||
86234-q-m-0.jpg // prima master quadrata | product-86234-q-m-0.jpg // prima master quadrata | ||
86234-n-m-0.jpg // prima master normale | product-86234-n-m-0.jpg // prima master normale | ||
86234-n-a-3.jpg // quarta alternativa normale | product-86234-n-a-3.jpg // quarta alternativa normale | ||
</syntaxhighlight> | </syntaxhighlight> | ||
dove | dove | ||
| Riga 246: | Riga 259: | ||
* <code>n</code> sta per normale | * <code>n</code> sta per normale | ||
* <code>m</code> sta per master | * <code>m</code> sta per master | ||
* <code>a</code> sta per alternativa | * <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.ManufacturerIDcon l'ID di questo nuovo manu - Popolamento del campo
WM_Product.ManufacturerCustomNamecon 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.ManufacturerCustomNameTabella 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 normaledove
qsta per quadratansta per normalemsta per masterasta per alternativa
ALTERNATIVA FORSE PIU' FURBA:
Tutto uguale, ma la convenzione dei nomi come la seguente:
product-<ProductID>-<Sort>.jpg
bargain-<ProductID>-<Sort>.jpgQuesta 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_Productroba vecchia inutileL_Product_MeasureRangevuotaL_Product_ProductPartvuotaL_Product_Selectionnon utilizzata nel progettoL_Product_VariantvuotaL_Product_VariantCulturevuotaProductMeasureVariantche è??ProductMeasureVariantCultureche è??L_ProductMeasureVariant_Measureche è??Windowvuota
Nel database del Trovaprodotti
Occasioni.LastUpdate-> aggiunto un trigger sull'update dell'occasione che aggiorna il campo LastUpdate