diff --git a/docs/upgrades/packages-7.5.11/root_import_product.wgpkg b/docs/upgrades/packages-7.5.11/root_import_product.wgpkg new file mode 100644 index 000000000..f35649a74 Binary files /dev/null and b/docs/upgrades/packages-7.5.11/root_import_product.wgpkg differ diff --git a/docs/upgrades/upgrade_7.5.10-7.5.11.pl b/docs/upgrades/upgrade_7.5.10-7.5.11.pl index a1d2000bf..b1425859d 100644 --- a/docs/upgrades/upgrade_7.5.10-7.5.11.pl +++ b/docs/upgrades/upgrade_7.5.10-7.5.11.pl @@ -636,9 +636,9 @@ sub addShippingDrivers { #------------------------------------------------- sub migrateOldProduct { - my $session = shift; - print "\tMigrate old Product to new SKU based Products.\n" unless ($quiet); - # and here's our code + my $session = shift; + print "\tMigrate old Product to new SKU based Products.\n" unless ($quiet); + # and here's our code ##Grab data from Wobject table, and move it into Sku and Product, as appropriate. ##Have to change the className's in the db, too ## Wobject description -> Sku description @@ -664,12 +664,12 @@ sub migrateOldProduct { $session->db->write(q!update asset set className='WebGUI::Asset::Sku::Product' where className='WebGUI::Asset::Wobject::Product'!); ## Add variants collateral column to Sku/Product - $session->db->write('alter table Product add column accessoryJSON mediumtext'); - $session->db->write('alter table Product add column benefitJSON mediumtext'); - $session->db->write('alter table Product add column featureJSON mediumtext'); - $session->db->write('alter table Product add column relatedJSON mediumtext'); - $session->db->write('alter table Product add column specificationJSON mediumtext'); - $session->db->write('alter table Product add column variantsJSON mediumtext'); + $session->db->write('alter table Product add column accessoryJSON mediumtext'); + $session->db->write('alter table Product add column benefitJSON mediumtext'); + $session->db->write('alter table Product add column featureJSON mediumtext'); + $session->db->write('alter table Product add column relatedJSON mediumtext'); + $session->db->write('alter table Product add column specificationJSON mediumtext'); + $session->db->write('alter table Product add column variantsJSON mediumtext'); ##Build a variant for each Product. my $productQuery = $session->db->read(<db->read('select relatedAssetId from Product_related where assetId=? order by sequenceNumber'); my $specificationSth = $session->db->read('select name, value, units from Product_specification where assetId=? order by sequenceNumber'); my $featureSth = $session->db->read('select feature from Product_feature where assetId=? order by sequenceNumber'); + my $benefitSth = $session->db->read('select benefit from Product_benefit where assetId=? order by sequenceNumber'); while (my ($assetId) = $assetSth->array) { ##For each assetId, get each type of collateral ##Convert the data to JSON and store it in Product with setCollateral (update) @@ -744,20 +745,29 @@ EOSQL1 my $specJson = to_json(\@features); $session->db->write('update Product set featureJSON=? where assetId=?',[$specJson, $assetId]); + ##Benefit + $benefitSth->execute([$assetId]); + my @benefits = (); + while (my $benefit = $benefitSth->hashRef()) { + push @benefits, $benefit; + } + my $beneJson = to_json(\@benefits); + $session->db->write('update Product set benefitJSON=? where assetId=?',[$beneJson, $assetId]); + } $assetSth->finish; ##Drop collateral tables - $session->db->write('drop table Product_accessory'); - #$session->db->write('drop table Product_benefit'); - $session->db->write('drop table Product_feature'); - $session->db->write('drop table Product_related'); - $session->db->write('drop table Product_specification'); + $session->db->write('drop table Product_accessory'); + $session->db->write('drop table Product_benefit'); + $session->db->write('drop table Product_feature'); + $session->db->write('drop table Product_related'); + $session->db->write('drop table Product_specification'); ## Remove productNumber from Product; - $session->db->write('alter table Product drop column productNumber'); + $session->db->write('alter table Product drop column productNumber'); ## Remove price from Product since prices are now stored in variants - $session->db->write('alter table Product drop column price'); + $session->db->write('alter table Product drop column price'); ## Update config file, deleting Wobject::Product and adding Sku::Product $session->config->deleteFromArray('assets', 'WebGUI::Asset::Wobject::Product'); diff --git a/lib/WebGUI/Asset/Sku/Product.pm b/lib/WebGUI/Asset/Sku/Product.pm index 5d8ef2117..d191f113f 100644 --- a/lib/WebGUI/Asset/Sku/Product.pm +++ b/lib/WebGUI/Asset/Sku/Product.pm @@ -310,12 +310,11 @@ sub getIndexedCollateralData { my $tableName = shift; my $table; - if ($self->{_collateral}->{$tableName}) { + if (exists $self->{_collateral}->{$tableName}) { $table = $self->{_collateral}->{$tableName}; } else { my $json = $self->get($tableName); - my $table; if ($json) { $table = from_json($json); } @@ -466,7 +465,6 @@ sub purge { } } $sth->finish; - $self->session->db->write("delete from Product_benefit where assetId=".$self->session->db->quote($self->getId)); $self->SUPER::purge(); } @@ -590,7 +588,7 @@ sub setCollateral { ##Note, since this returns a reference, it is actually updating ##the object cache directly. my $table = $self->getAllCollateral($tableName); - if ($index eq "new") { + if ($index eq 'new' || $index eq '') { push @{ $table }, $properties; $self->setAllCollateral($tableName); return; @@ -738,8 +736,7 @@ sub www_deleteAccessoryConfirm { sub www_deleteBenefitConfirm { my $self = shift; return $self->session->privilege->insufficient() unless ($self->canEdit); - $self->deleteCollateral("Product_benefit","Product_benefitId",$self->session->form->process("bid")); - $self->reorderCollateral("Product_benefit","Product_benefitId"); + $self->deleteCollateral("benefitJSON", $self->session->form->process("bid")); return ""; } @@ -768,8 +765,16 @@ sub www_deleteFileConfirm { sub www_deleteRelatedConfirm { my $self = shift; return $self->session->privilege->insufficient() unless ($self->canEdit); - $self->deleteCollateral("Product_related", $self->session->form->process("rid")); - return ""; + $self->deleteCollateral('Product_related', $self->session->form->process('rid')); + return ''; +} + +#------------------------------------------------------------------- +sub www_deleteVariantConfirm { + my $self = shift; + return $self->session->privilege->insufficient() unless ($self->canEdit); + $self->deleteCollateral('variantsJSON', $self->session->form->process('vid')); + return ''; } #------------------------------------------------------------------- @@ -786,25 +791,22 @@ sub www_editBenefit { my $self = shift; my $bid = shift || $self->session->form->process("bid"); return $self->session->privilege->insufficient() unless ($self->canEdit); - my ($data, $f, $benefits); - $data = $self->getCollateral("Product_benefit","Product_benefitId",$bid); + my $data = $self->getCollateral("benefitJSON", ,$bid); my $i18n = WebGUI::International->new($self->session,'Asset_Product'); - $f = WebGUI::HTMLForm->new($self->session,-action=>$self->getUrl); + my $f = WebGUI::HTMLForm->new($self->session,-action=>$self->getUrl); $f->hidden( -name => "bid", - -value => $data->{Product_benefitId}, + -value => $bid, ); $f->hidden( -name => "func", -value => "editBenefitSave", ); - $benefits = $self->session->db->buildHashRef("select benefit,benefit from Product_benefit order by benefit"); - $f->combo( + $f->text( -name => "benefit", - -options => $benefits, -label => $i18n->get(51), -hoverHelp => $i18n->get('51 description'), - -value => [$data->{benefits}], + -value => $data->{benefits}, ); $f->yesNo( -name => "proceed", @@ -819,12 +821,11 @@ sub www_editBenefit { sub www_editBenefitSave { my $self = shift; return $self->session->privilege->insufficient() unless ($self->canEdit); - $self->setCollateral("Product_benefit", "Product_benefitId", { - Product_benefitId => $self->session->form->process("bid"), - benefit => $self->session->form->process("benefit","combo") + $self->setCollateral('benefitJSON', $self->session->form->process('bid'), { + benefit => $self->session->form->process('benefit','text') }); - return "" unless($self->session->form->process("proceed")); - return $self->www_editBenefit("new"); + return '' unless($self->session->form->process('proceed')); + return $self->www_editBenefit('new'); } #------------------------------------------------------------------- @@ -931,29 +932,33 @@ sub www_editSpecificationSave { #------------------------------------------------------------------- sub www_editVariant { my $self = shift; - my $sku = shift || $self->session->form->process("varSku"); + my $vid = shift || $self->session->form->process("vid"); return $self->session->privilege->insufficient() unless ($self->canEdit); my $i18n = WebGUI::International->new($self->session,'Asset_Product'); - my $data = $self->getCollateral("Product_variants", "varSku", $sku); - my $f = WebGUI::HTMLForm->new($self->session, -action=>$self->getUrl); + my $data = $self->getCollateral("variantsJSON", $vid); + my $f = WebGUI::HTMLForm->new($self->session, -action=>$self->getUrl); $f->hidden( -name => 'func', -value => "editVariantSave", ); + $f->hidden( + -name => 'vid', + -value => $vid, + ); $f->text( -name => 'varSku', -label => $i18n->get('variant sku'), -hoverHelp => $i18n->get('variant sku description'), - -value => $data->{price}, + -value => $data->{varSku}, ); $f->text( -name => 'shortdesc', -size => 30, -label => $i18n->get('shortdesc'), -hoverHelp => $i18n->get('shortdesc description'), - -value => $data->{price}, + -value => $data->{shortdesc}, ); - $f->integer( + $f->float( -name => 'price', -label => $i18n->get(10), -hoverHelp => $i18n->get('10 description'), @@ -971,6 +976,11 @@ sub www_editVariant { -hoverHelp => $i18n->get('quantity description'), -value => $data->{quantity}, ); + $f->yesNo( + -name => "proceed", + -label => $i18n->get('add another variant'), + -hoverHelp => $i18n->get('add another variant description'), + ); $f->submit; return $self->getAdminConsole->render($f->print, 'add variant'); } @@ -980,16 +990,16 @@ sub www_editVariantSave { my $self = shift; return $self->session->privilege->insufficient() unless ($self->canEdit); ##Mandatory variable check - $self->setCollateral('Product_variants', 'varSku', { - varSku => $self->session->form->process('varSku', 'text'), - mastersku => $self->get('sku'), + $self->setCollateral('variantsJSON', $self->session->form->process('vid'), { + varSku => $self->session->form->process('varSku', 'text'), shortdesc => $self->session->form->process('shortdesc', 'text'), - price => $self->session->form->process('name', 'float'), + price => $self->session->form->process('price', 'float'), weight => $self->session->form->process('weight', 'float'), quantity => $self->session->form->process('quantity', 'integer'), }); - return $self->www_editVariant("new"); + return $self->www_view unless($self->session->form->process('proceed')); + return $self->www_editVariant('new'); } #------------------------------------------------------------------- @@ -1012,7 +1022,7 @@ sub www_moveAccessoryUp { sub www_moveBenefitDown { my $self = shift; return $self->session->privilege->insufficient() unless ($self->canEdit); - $self->moveCollateralDown("Product_benefit","Product_benefitId",$self->session->form->process("bid")); + $self->moveCollateralDown("benefitJSON", $self->session->form->process("bid")); return ""; } @@ -1020,7 +1030,7 @@ sub www_moveBenefitDown { sub www_moveBenefitUp { my $self = shift; return $self->session->privilege->insufficient() unless ($self->canEdit); - $self->moveCollateralUp("Product_benefit","Product_benefitId",$self->session->form->process("bid")); + $self->moveCollateralUp("benefitJSON", $self->session->form->process("bid")); return ""; } @@ -1072,6 +1082,22 @@ sub www_moveSpecificationUp { return ""; } +#------------------------------------------------------------------- +sub www_moveVariantDown { + my $self = shift; + return $self->session->privilege->insufficient() unless ($self->canEdit); + $self->moveCollateralDown("variantsJSON", $self->session->form->process("vid")); + return ""; +} + +#------------------------------------------------------------------- +sub www_moveVariantUp { + my $self = shift; + return $self->session->privilege->insufficient() unless ($self->canEdit); + $self->moveCollateralUp("variantsJSON", $self->session->form->process("vid")); + return ""; +} + #------------------------------------------------------------------- sub view { my $self = shift; @@ -1079,7 +1105,7 @@ sub view { my $out = WebGUI::Cache->new($self->session,"view_".$self->getId)->get; return $out if $out; } - my (%data, $sth, $file, $segment, %var, @featureloop, @benefitloop, @specificationloop, @accessoryloop, @relatedloop); + my (%data, $segment, %var, @featureloop, @benefitloop, @specificationloop, @accessoryloop, @relatedloop); tie %data, 'Tie::CPHash'; my $brochure = $self->get("brochure"); my $manual = $self->get("manual"); @@ -1092,40 +1118,40 @@ sub view { #---brochure my $i18n = WebGUI::International->new($self->session,'Asset_Product'); if ($brochure) { - $file = WebGUI::Storage->get($self->session,$brochure); + my $file = WebGUI::Storage->get($self->session,$brochure); $var{"brochure.icon"} = $self->getFileIconUrl($file); $var{"brochure.label"} = $i18n->get(13); $var{"brochure.URL"} = $self->getFileUrl($file); } #---manual if ($manual) { - $file = WebGUI::Storage->get($self->session,$manual); + my $file = WebGUI::Storage->get($self->session,$manual); $var{"manual.icon"} = $self->getFileIconUrl($file); $var{"manual.label"} = $i18n->get(14); $var{"manual.URL"} = $self->getFileUrl($file); } #---warranty if ($warranty) { - $file = WebGUI::Storage->get($self->session,$warranty); + my $file = WebGUI::Storage->get($self->session,$warranty); $var{"warranty.icon"} = $self->getFileIconUrl($file); $var{"warranty.label"} = $i18n->get(15); $var{"warranty.URL"} = $self->getFileUrl($file); } #---image1 if ($image1) { - $file = WebGUI::Storage::Image->get($self->session,$image1); + my $file = WebGUI::Storage::Image->get($self->session,$image1); $var{thumbnail1} = $self->getThumbnailUrl($file); $var{image1} = $self->getFileUrl($file); } #---image2 if ($image2) { - $file = WebGUI::Storage::Image->get($self->session,$image2); + my $file = WebGUI::Storage::Image->get($self->session,$image2); $var{thumbnail2} = $self->getThumbnailUrl($file); $var{image2} = $self->getFileUrl($file); } #---image3 if ($image3) { - $file = WebGUI::Storage::Image->get($self->session,$image3); + my $file = WebGUI::Storage::Image->get($self->session,$image3); $var{thumbnail3} = $self->getThumbnailUrl($file); $var{image3} = $self->getFileUrl($file); } @@ -1146,22 +1172,21 @@ sub view { } $var{feature_loop} = \@featureloop; - #---benefits - $var{"addBenefit.url"} = $self->getUrl('func=editBenefit&fid=new'); - $var{"addBenefit.label"} = $i18n->get(55); - $sth = $self->session->db->read("select benefit,Product_benefitId from Product_benefit where assetId=".$self->session->db->quote($self->getId)." order by sequenceNumber"); - while (%data = $sth->hash) { - $segment = $self->session->icon->delete('func=deleteBenefitConfirm&bid='.$data{Product_benefitId},$self->get("url"),$i18n->get(48)) - .$self->session->icon->edit('func=editBenefit&bid='.$data{Product_benefitId},$self->get("url")) - .$self->session->icon->moveUp('func=moveBenefitUp&bid='.$data{Product_benefitId},$self->get("url")) - .$self->session->icon->moveDown('func=moveBenefitDown&bid='.$data{Product_benefitId},$self->get("url")); - push(@benefitloop,{ - "benefit.benefit"=>$data{benefit}, + #---benefits + $var{"addBenefit.url"} = $self->getUrl('func=editBenefit&fid=new'); + $var{"addBenefit.label"} = $i18n->get(55); + foreach my $collateral ( @{ $self->getIndexedCollateralData('benefitJSON') } ) { + my $id = $collateral->{collateralIndex}; + $segment = $self->session->icon->delete('func=deleteBenefitConfirm&bid='.$id,$self->get("url"),$i18n->get(48)) + . $self->session->icon->edit('func=editBenefit&bid='.$id,$self->get("url")) + . $self->session->icon->moveUp('func=moveBenefitUp&bid='.$id,$self->get("url")) + . $self->session->icon->moveDown('func=moveBenefitDown&bid='.$id,$self->get("url")); + push(@benefitloop,{ + "benefit.benefit"=>$collateral->{benefit}, "benefit.controls"=>$segment - }); - } - $sth->finish; - $var{benefit_loop} = \@benefitloop; + }); + } + $var{benefit_loop} = \@benefitloop; #---specifications $var{'addSpecification.url'} = $self->getUrl('func=editSpecification&sid=new'); @@ -1216,6 +1241,27 @@ sub view { } $var{relatedproduct_loop} = \@relatedloop; + #---variants + $var{'addvariant.url'} = $self->getUrl('func=editVariant'); + $var{'addvariant.label'} = $i18n->get('add a variant'); + my @variantLoop; + foreach my $collateral ( @{ $self->getIndexedCollateralData('variantsJSON')} ) { + my $id = $collateral->{collateralIndex}; + $segment = $self->session->icon->delete('func=deleteVariantConfirm&vid='.$id,$self->get('url'),$i18n->get('delete variant confirm')) + . $self->session->icon->edit('func=editVariant&vid='.$id,$self->get('url')) + . $self->session->icon->moveUp('func=moveVariantUp&vid='.$id,$self->get('url')) + . $self->session->icon->moveDown('func=moveVariantDown&vid='.$id,$self->get('url')); + push(@variantLoop,{ + 'variant.controls' => $segment, + 'variant.sku' => $collateral->{varSku}, + 'variant.title' => $collateral->{shortdesc}, + 'variant.price' => $collateral->{price}, + 'variant.weight' => $collateral->{weight}, + 'variant.quantity' => $collateral->{quantity}, + }); + } + $var{variant_loop} = \@variantLoop; + my $out = $self->processTemplate(\%var,undef,$self->{_viewTemplate}); if (!$self->session->var->isAdminOn && $self->get("cacheTimeout") > 10) { WebGUI::Cache->new($self->session,"view_".$self->getId)->set($out,$self->get("cacheTimeout")); diff --git a/lib/WebGUI/i18n/English/Asset_Product.pm b/lib/WebGUI/i18n/English/Asset_Product.pm index 7e04d3b89..20709e910 100644 --- a/lib/WebGUI/i18n/English/Asset_Product.pm +++ b/lib/WebGUI/i18n/English/Asset_Product.pm @@ -566,7 +566,7 @@ our $I18N = { message => q|Are you certain you wish to delete this specification?|, lastUpdated => 1031514049 }, - + 'deleteImage' => { message => q|Delete Attached File|, lastUpdated => 1031514049 @@ -677,6 +677,31 @@ be useful, others may not.|, lastUpdated => 1209576604, }, + 'add a variant' => { + message => q|Add a variant.|, + lastUpdated => 1210011992, + }, + + 'add another variant' => { + message => q|Add another variant?|, + lastUpdated => 1210011992, + }, + + 'add another variant description' => { + message => q|If you would like to add another variant right now, select "Yes".|, + lastUpdated => 1210011992, + }, + + 'delete variant confirm' => { + message => q|Are you certain you wish to delete this variant?|, + lastUpdated => 1210013857, + }, + + 'variants' => { + message => q|Variants|, + lastUpdated => 1210019655 + }, + }; 1;