package WebGUI::Operation::ProductManager; use strict; use WebGUI::SQL; use WebGUI::HTMLForm; use WebGUI::Form; use WebGUI::International; use WebGUI::AdminConsole; use Tie::IxHash; use WebGUI::Product; use WebGUI::HTML; #------------------------------------------------------------------- =head2 _submenu ( $session ) Returns a rendered Admin Console view, with a standard list of five submenu items. =head3 $session The current WebGUI session object. =head3 workarea A scalar of HTML that defines the current workarea. =head3 title The i18n key of the title of this workarea. =head3 help The i18n key of the help link for this workarea. =cut sub _submenu { my $session = shift; my $i18n = WebGUI::International->new($session, "ProductManager"); my $workarea = shift; my $title = shift; $title = $i18n->get($title) if ($title); my $help = shift; my $ac = WebGUI::AdminConsole->new($session,"productManager"); if ($help) { $ac->setHelp($help, 'ProductManager'); } my $productId = $session->form->process("productId") || $session->scratch->get('managingProduct'); undef $productId if ($productId eq 'new'); $ac->addSubmenuItem($session->url->page('op=editProduct;productId=new'), $i18n->get('add product')); $ac->addSubmenuItem($session->url->page('op=listProducts'), $i18n->get('list products')); $ac->addSubmenuItem($session->url->page('op=manageProduct;productId='.$productId), $i18n->get('manage product')) if ($productId); $ac->addSubmenuItem($session->url->page('op=listProductVariants;productId='.$productId), $i18n->get('list variants')) if ($productId); return $ac->render($workarea, $title); } #------------------------------------------------------------------- =head2 www_deleteProductParameterOption ( $session ) Deletes a product parameter option specified by form parameter 'optionId'. =head3 $session The current WebGUI session object. =cut sub www_deleteProductParameterOption { my $session = shift; my $optionId = $session->form->process("optionId"); return $session->privilege->insufficient unless ($session->user->isInGroup(14)); WebGUI::Product->getByOptionId($session,$optionId)->deleteOption($optionId); return WebGUI::Operation::execute($session,'manageProduct'); } #------------------------------------------------------------------- =head2 www_deleteProductParameter ( $session ) Deletes a product parameter specified by form parameter 'parameterId'. =head3 $session The current WebGUI session object. =cut sub www_deleteProductParameter { my $session = shift; my $parameterId = $session->form->process("parameterId"); return $session->privilege->insufficient unless ($session->user->isInGroup(14)); WebGUI::Product->getByParameterId($session,$parameterId)->deleteParameter($parameterId); return WebGUI::Operation::execute($session,'manageProduct'); } #------------------------------------------------------------------- =head2 www_deleteProduct ( $session ) Deletes a product specified by form parameter 'productId'. =head3 $session The current WebGUI session object. =cut sub www_deleteProduct { my $session = shift; my $productId = $session->form->process("productId"); return $session->privilege->insufficient unless ($session->user->isInGroup(14)); WebGUI::Product->new($session,$productId)->delete; return WebGUI::Operation::execute($session,'listProducts'); } #------------------------------------------------------------------- =head2 www_editProduct ( $session ) Returns a form to edit or add a new product. =head3 $session The current WebGUI session object. =cut sub www_editProduct { my $session = shift; my ($productId, $product, $f, $i18n); return $session->privilege->insufficient unless ($session->user->isInGroup(14)); $i18n = WebGUI::International->new($session, 'ProductManager'); $productId = $session->form->process("productId"); unless ($productId eq 'new') { $product = WebGUI::Product->new($session,$productId)->get; } $f = WebGUI::HTMLForm->new($session); $f->submit; $f->hidden( -name => 'op', -value => 'editProductSave' ); $f->hidden( -name => 'productId', -value => $productId ); $f->text( -name => 'title', -label => $i18n->get('title'), -hoverHelp => $i18n->get('title description'), -value => $session->form->process("title") || $product->{title}, -maxlength => 255, ); $f->textarea( -name => 'description', -label => $i18n->get('description'), -hoverHelp => $i18n->get('description description'), -value => $session->form->process("decsription") || $product->{description}, ); $f->float( -name => 'price', -label => $i18n->get('price'), -hoverHelp => $i18n->get('price description'), -value => $session->form->process("price") || $product->{price}, -maxlength => 13, ); $f->float( -name => 'weight', -label => $i18n->get('weight'), -hoverHelp => $i18n->get('weight description'), -value => $session->form->process("weight") || $product->{weight}, -maxlength => 9, ); $f->text( -name => 'sku', -label => $i18n->get('sku'), -hoverHelp => $i18n->get('sku description'), -value => $session->form->process("sku") || $product->{SKU}, -maxlength => 64, ); $f->template( -name => 'templateId', -label => $i18n->get('template'), -hoverHelp => $i18n->get('template description'), -value => $session->form->process("templateId") || $product->{templateId}, -namespace => 'Commerce/Product', ); $f->text( -name => 'skuTemplate', -label => $i18n->get('sku template'), -hoverHelp => $i18n->get('sku template description'), -value => $session->form->process("skuTemplate") || $product->{skuTemplate}, -maxlength => 255, ); $f->submit; return _submenu($session,$f->print, 'edit product', 'edit product', 'ProductManager'); } #------------------------------------------------------------------- =head2 www_editProductSave ( $session ) Saves the properties of a product. =head3 $session The current WebGUI session object. =cut sub www_editProductSave { my $session = shift; my ($self, @error, $productId, $product, $i18n); return $session->privilege->insufficient unless ($session->user->isInGroup(14)); $i18n = WebGUI::International->new($session, 'ProductManager'); push(@error, $i18n->get('edit product title error')) unless $session->form->process("title"); push(@error, $i18n->get('edit product price error')) unless ($session->form->process("price") && $session->form->process("price") =~ /^\d+(\.\d+)?$/); push(@error, $i18n->get('edit product weight error')) unless (defined $session->form->process("weight") && $session->form->process("price") =~ /^\d+(\.\d+)?$/); push(@error, $i18n->get('edit product sku error')) unless ($session->form->process("sku")); return '
'.WebGUI::Operation::execute($session,'editProduct') if (@error); $productId = $session->form->process("productId"); $product = WebGUI::Product->new($session,$productId); $product->set({ title => $session->form->process("title"), description => $session->form->process("description"), price => $session->form->process("price"), weight => $session->form->process("weight"), sku => $session->form->process("sku"), templateId => $session->form->process("templateId"), skuTemplate => $session->form->process("skuTemplate"), }); return www_manageProduct($session, $product->get('productId')); } #------------------------------------------------------------------- =head2 www_editProductParameter ( $session ) Returns a form to edit a product parameter. =head3 $session The current WebGUI session object. =cut sub www_editProductParameter { my $session = shift; my ($parameterId, $product, $productId, $parameter, $f, $i18n); return $session->privilege->insufficient unless ($session->user->isInGroup(14)); $i18n = WebGUI::International->new($session, 'ProductManager'); $parameterId = $session->form->process("parameterId"); $productId = $session->form->process("productId"); unless ($parameterId eq 'new') { $product = WebGUI::Product->getByParameterId($session,$parameterId); $parameter = $product->getParameter($parameterId); $productId = $product->get('productId'); } $f = WebGUI::HTMLForm->new($session); $f->submit; $f->hidden( -name => 'op', -value => 'editProductParameterSave', ); $f->hidden( -name => 'parameterId', -value => $parameterId, ); $f->hidden( -name => 'productId', -value => $productId, ); $f->readOnly( -label => $i18n->get('parameter ID'), -value => $parameterId, ); $f->text( -name => 'name', -label => $i18n->get('edit parameter name'), -hoverHelp => $i18n->get('edit parameter name description'), -value => $session->form->process("name") || $parameter->{name}, -maxlength => 64, ); $f->submit; return _submenu($session,$f->print, 'edit parameter', 'edit parameter', 'ProductManager'); } #------------------------------------------------------------------- =head2 www_editProductParameterSave ( $session ) Saves the properties of a product parameter. =head3 $session The current WebGUI session object. =cut sub www_editProductParameterSave { my $session = shift; my (@error, $parameterId, $product, $i18n, $skuTemplate, $oldName, $newName); return $session->privilege->insufficient unless ($session->user->isInGroup(14)); $i18n = WebGUI::International->new($session, 'ProductManager'); $parameterId = $session->form->process("parameterId"); push (@error, $i18n->get('edit parameter name error')) unless $session->form->process("name"); push (@error, $i18n->get('edit parameter productId error')) unless $session->form->process("productId"); return "".WebGUI::Operation::execute($session,'editProductParameter') if (@error); $product = WebGUI::Product->new($session,$session->form->process("productId")); $skuTemplate = $product->get('skuTemplate'); if ($parameterId eq 'new') { $parameterId = $product->addParameter; } else { ($oldName = $product->getParameter($parameterId)->{name}) =~ s/[ ><]/\./g; ($newName = $session->form->process("name")) =~ s/[ ><]/\./g; $skuTemplate = $product->get('skuTemplate'); $skuTemplate =~ s/< *?tmpl_var *?param\.$oldName *?>//i; $product->set({ skuTemplate => $skuTemplate }); } $product->setParameter($parameterId, { name => $session->form->process("name") }); return WebGUI::Operation::execute($session,'editSkuTemplate') if ($session->form->process("parameterId") eq 'new'); return WebGUI::Operation::execute($session,'manageProduct'); } #------------------------------------------------------------------- =head2 www_editProductParameterOption ( $session ) Edits the options of a product parameter. =head3 $session The current WebGUI session object. =cut sub www_editProductParameterOption { my $session = shift; my ($self, $optionId, $option, $f, $i18n); return $session->privilege->insufficient unless ($session->user->isInGroup(14)); $i18n = WebGUI::International->new($session, 'ProductManager'); $optionId = $session->form->process("optionId"); unless ($optionId eq 'new') { $option = WebGUI::Product->getByOptionId($session,$optionId)->getOption($optionId); } $f = WebGUI::HTMLForm->new($session); $f->submit; $f->hidden( -name => 'op', -value => 'editProductParameterOptionSave', ); $f->hidden( -name => 'optionId', -value => $optionId, ); $f->hidden( -name => 'parameterId', -value => $session->form->process("parameterId"), ); $f->readOnly( -label => $i18n->get('option ID'), -value => $optionId ); $f->text( -name => 'value', -label => $i18n->get('edit option value'), -hoverHelp => $i18n->get('edit option value description'), -value => $session->form->process("value") || $option->{value}, -maxlength => 64, ); $f->float( -name => 'priceModifier', -label => $i18n->get('edit option price modifier'), -hoverHelp => $i18n->get('edit option price modifier description'), -value => $session->form->process("priceModifier") || $option->{priceModifier}, -maxlength => 11, ); $f->float( -name => 'weightModifier', -label => $i18n->get('edit option weight modifier'), -hoverHelp => $i18n->get('edit option weight modifier description'), -value => $session->form->process("weightModifier") || $option->{weightModifier}, -maxlength => 7, ); $f->text( -name => 'skuModifier', -label => $i18n->get('edit option sku modifier'), -hoverHelp => $i18n->get('edit option sku modifier description'), -value => $session->form->process("skuModifier") || $option->{skuModifier}, -maxlength => 64, ); $f->submit; return _submenu($session,$f->print, 'edit option', 'edit option', 'ProductManager'); } #------------------------------------------------------------------- =head2 www_editProductParameterOptionSave ( $session ) Saves the properties of a Product Parameter Option =head3 $session The current WebGUI session object. =cut sub www_editProductParameterOptionSave { my $session = shift; my ($self, @error, $optionId, $product, $i18n); return $session->privilege->insufficient unless ($session->user->isInGroup(14)); $i18n = WebGUI::International->new($session, 'ProductManager'); push (@error, $i18n->get('edit option value error')) unless ($session->form->process("value")); push (@error, $i18n->get('edit option parameterId error')) unless ($session->form->process("parameterId")); return '
'.WebGUI::Operation::execute($session,'editProduct') if (@error); $product = WebGUI::Product->getByParameterId($session,$session->form->process("parameterId")); $optionId = $session->form->process("optionId"); $optionId = $product->addOptionToParameter($session->form->process("parameterId")) if ($optionId eq 'new'); $product->setOption($optionId, { value => $session->form->process("value"), priceModifier => $session->form->process("priceModifier"), weightModifier => $session->form->process("weightModifier"), skuModifier => $session->form->process("skuModifier") }); return WebGUI::Operation::execute($session,'manageProduct'); } #------------------------------------------------------------------- =head2 www_editProductVariant ( $session ) Returns a form to edit a Product Variant. =head3 $session The current WebGUI session object. =cut sub www_editProductVariant { my $session = shift; my ($variantId, $variant, $f, $i18n); return $session->privilege->insufficient unless ($session->user->isInGroup(14)); $i18n = WebGUI::International->new($session, "ProductManager"); $variantId = $session->form->process("variantId"); $variant = WebGUI::Product->getByVariantId($session,$variantId)->getVariant($variantId); $f = WebGUI::HTMLForm->new($session); $f->submit; $f->hidden( -name => 'op', -value => 'editProductVariantSave' ); $f->hidden( -name => 'variantId', -value => $variantId ); $f->readOnly( -label => $i18n->get('variant ID'), -value => $variant->{variantId} ); $f->float( -name => 'price', -label => $i18n->get('price override'), -hoverHelp => $i18n->get('price override description'), -value => $variant->{priceOverride} ? $variant->{price} : '' ); $f->float( -name => 'weight', -label => $i18n->get('weight override'), -hoverHelp => $i18n->get('weight override description'), -value => $variant->{weightOverride} ? $variant->{weight} : '' ); $f->text( -name => 'sku', -label => $i18n->get('sku override'), -hoverHelp => $i18n->get('sku override description'), -value => $variant->{skuOverride} ? $variant->{sku} : '' ); $f->yesNo( -name => 'available', -label => $i18n->get('available'), -hoverHelp => $i18n->get('available description'), -value => $variant->{available} ); $f->submit; return _submenu($session,$f->print, 'edit variant', 'edit variant', 'ProductManager'); } #------------------------------------------------------------------- =head2 www_editProductVariantSave ( $session ) Saves the properties of a Product Variant. =head3 $session The current WebGUI session object. =cut sub www_editProductVariantSave { my $session = shift; my $variantId = $session->form->process("variantId"); return $session->privilege->insufficient unless ($session->user->isInGroup(14)); WebGUI::Product->getByVariantId($session,$variantId)->setVariant($variantId, $session->form->paramsHashRef); return WebGUI::Operation::execute($session,'listProductVariants'); } #------------------------------------------------------------------- =head2 www_editSkuTemplate ( $session ) Returns a form to edit a Sku Template. =head3 $session The current WebGUI session object. =cut sub www_editSkuTemplate { my $session = shift; my ($product, $productId, $output, $f, $name, $i18n); return $session->privilege->insufficient unless ($session->user->isInGroup(14)); $i18n = WebGUI::International->new($session, "ProductManager"); $productId = $session->form->process("productId"); $product = WebGUI::Product->new($session,$productId); $output .= "Available are:
\n"; $output .= "
"; $f = WebGUI::HTMLForm->new($session); $f->submit; $f->hidden( -name => 'op', -value => 'editSkuTemplateSave' ); $f->hidden( -name => 'productId', -value => $productId ); $f->text( -name => 'skuTemplate', -value => $product->get('skuTemplate'), -label => $i18n->get('sku template'), ); $f->submit; $output .= $f->print; return _submenu($session,$output, 'edit sku composition label', 'edit sku template', 'ProductManager'); } #------------------------------------------------------------------- =head2 www_editSkuTemplateSave ( $session ) Saves the properties of a Sku Template. =head3 $session The current WebGUI session object. =cut sub www_editSkuTemplateSave { my $session = shift; my ($productId) = $session->form->process("productId"); return $session->privilege->insufficient unless ($session->user->isInGroup(14)); WebGUI::Product->new($session,$productId)->set({ skuTemplate => $session->form->process("skuTemplate"), }); return WebGUI::Operation::execute($session,'manageProduct'); } #------------------------------------------------------------------- =head2 www_listProducts ( $session ) Returns a list of products with manage and delete buttons. =head3 $session The current WebGUI session object. =cut sub www_listProducts { my $session = shift; my ($self, $sth, $output, $row, $i18n); return $session->privilege->insufficient unless ($session->user->isInGroup(14)); $i18n = WebGUI::International->new($session, 'ProductManager'); $session->scratch->delete('managingProduct'); $sth = $session->db->read('select * from products order by title'); $output .= ''; while ($row = $sth->hashRef) { $output .= ''; $output .= ''; $output .= ''; $output .= ''; } $output .= '
'; $output .= $session->icon->delete('op=deleteProduct;productId='.$row->{productId}); $output .= $session->icon->edit('op=manageProduct;productId='.$row->{productId}); $output .= ''.$row->{title}.'
'; return _submenu($session,$output, 'list products', 'list products', 'ProductManager'); } #------------------------------------------------------------------- =head2 www_listProductVariants ( $session ) Returns a list of Product Variants. =head3 $session The current WebGUI session object. =cut sub www_listProductVariants { my $session = shift; my ($productId, $product, @variants, %parameters, %options, $output, %composition, $i18n); return $session->privilege->insufficient unless ($session->user->isInGroup(14)); $i18n = WebGUI::International->new($session, "ProductManager"); $productId = $session->form->process("productId") || $session->scratch->get('managingProduct'); return WebGUI::Operation::execute($session,'listProducts') if ($productId eq 'new' || !$productId); $product = WebGUI::Product->new($session,$productId); @variants = sort {$a->{composition} cmp $b->{composition}} @{$product->getVariant}; tie %parameters, "Tie::IxHash"; %parameters = map {$_->{parameterId} => $_->{name}} sort {$a->{name} <=> $b->{name}} @{$product->getParameter}; %options = map {$_->{optionId} => $_->{value}} @{$product->getOption}; $output = WebGUI::Form::formHeader($session); $output .= WebGUI::Form::hidden($session,{ name => 'op', value => 'listProductVariantsSave', }); $output .= WebGUI::Form::hidden($session,{ name => 'productId', value => $productId, }); $output .= ''; $output .= "" if (%parameters); $output .= ''. ''. ''. ''; $output .= ""; foreach (@variants) { $output .= ""; %composition = map {split(/\./, $_)} split(/,/, $_->{composition}); foreach (keys(%parameters)) { $output .= ''; } $output .= '"; $output .= ""; $output .= ""; } $output .= "
".join('', values(%parameters))."'.$i18n->get('sku').''.$i18n->get('price').''.$i18n->get('weight').''.$i18n->get('available').'
'.$options{$composition{$_}}.''.$_->{sku}.""; $output .= '*' if ($_->{skuOverride}); $output .= ''.$_->{price}.""; $output .= '*'if ($_->{priceOverride}); $output .= ''.$_->{weight}.""; $output .= '*' if ($_->{weightOverride}); $output .= "".WebGUI::Form::checkbox($session,{ name => 'available', value => $_->{variantId}, checked => $_->{available}, }).$session->icon->edit('op=editProductVariant;variantId='.$_->{variantId})."
"; $output .= WebGUI::Form::submit($session,); $output .= WebGUI::Form::formFooter($session,); return _submenu($session,$output, 'list variants label', 'list variants', 'ProductManager'); } #------------------------------------------------------------------- =head2 www_listProductVariantsSave ( $session ) Saves the properties of some product variants. =head3 $session The current WebGUI session object. =cut sub www_listProductVariantsSave { my $session = shift; return $session->privilege->insufficient unless ($session->user->isInGroup(14)); my %availableVariants = map {$_ => 1} $session->form->selectList('available'); my $product = WebGUI::Product->new($session,$session->form->process("productId")); my @variants = @{$product->getVariant}; foreach (@variants) { $product->setVariant($_->{variantId}, { available => $availableVariants{$_->{variantId}} ? '1' : '0'}); } return WebGUI::Operation::execute($session,'listProductVariants'); } #------------------------------------------------------------------- =head2 www_manageProduct ( $session ) Returns a screen that displays lots of options for editing all aspects of a product. =head3 $session The current WebGUI session object. =cut sub www_manageProduct { my $session = shift; my ($product, $output, $parameter, $option, $optionId, $i18n); return $session->privilege->insufficient unless ($session->user->isInGroup(14)); $i18n = WebGUI::International->new($session, "ProductManager"); my $productId = shift || $session->form->process("productId") || $session->scratch->get('managingProduct'); return WebGUI::Operation::execute($session,'listProducts') if ($productId eq 'new' || !$productId); $session->scratch->set('managingProduct', $productId); $product = WebGUI::Product->new($session,$productId); $output .= "

".$product->get('title')."

"; $output .= "

".$i18n->get('properties').$session->icon->edit('op=editProduct;productId='.$productId)."

"; $output .= ""; $output .= ""; $output .= ""; $output .= ""; $output .= ""; $output .= ""; $output .= "
".$i18n->get('price')."".$product->get('price')."
".$i18n->get('weight')."".$product->get('weight')."
".$i18n->get('sku')."".$product->get('sku')."
".$i18n->get('description')."".$product->get('description')."
".$i18n->get('sku template')."".WebGUI::HTML::format($product->get('skuTemplate'), 'text')."
"; $output .= "

Parameters

"; $output .= ''. $i18n->get('add parameter').'
'; foreach $parameter (@{$product->getParameter}) { $output .= $session->icon->delete('op=deleteProductParameter;parameterId='.$parameter->{parameterId}). $session->icon->edit('op=editProductParameter;parameterId='.$parameter->{parameterId}); $output .= ''.$parameter->{name}.'
'; $output .= ''. $i18n->get('add option').'
'; foreach $optionId (@{$parameter->{options}}) { $option = $product->getOption($optionId); $output .= ''. $session->icon->delete('op=deleteProductParameterOption;optionId='.$option->{optionId}). $session->icon->edit('op=editProductParameterOption;parameterId='.$parameter->{parameterId}.';optionId='.$option->{optionId}).$option->{value}.'
'; } $output .= '
'; } return _submenu($session,$output, 'manage product', 'manage product', 'ProductManager'); } 1;