Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision e2bbc790

Von Sven Schöling vor etwa 2 Jahren hinzugefügt

  • ID e2bbc7906e782a47d9e323603b5b5614233fda38
  • Vorgänger 1c642e3e
  • Nachfolger 760fe712

CVar + PriceRule: Manager Logik und Tests

Implementiert sind jetzt die CVar typen:
- select
- part
- customer
- vendor
- number
- date

nicht unterstützt sind:
- text
- textfield
- bool

unterstützt werden alle module:
- IC
- CT (customer und vendor, unabhängig ob der Beleg customer oder vendor
hat)
- Projects (am recorditem.project oder record.globalproject als fallback)
- Contacts (nur wenn direkt im record gesetzt)

Unterschiede anzeigen:

t/db/price_rule.t
use SL::Dev::ALL qw(:ALL);
use SL::DB::PriceRule;
use SL::DB::Project;
use SL::DB::CustomVariableConfig;
Support::TestSetup::login();
......
description => "test",
type => "select",
options => "A##B##C##D",
default_value => "D",
flags => "editable=0",
searchable => 0,
includeable => 0,
......
description => "test2",
type => "select",
options => "A##B##C##D",
default_value => "D",
flags => "editable=1",
searchable => 0,
includeable => 0,
......
}
# k, now for a more broad test:
#
# we can have these modules in cvars:
# - CT
# - Contact
# - IC
# - Project
#
# and the cvars themselves can have these types:
# - select
# - customer
# - vendor
# - part
# - integer
# - number
# - date
# - timestamp
#
# ...with the numeric and date ones also having comparison ops
#
#
# to be matched against all different record/record items
#
#
# testing all of that is too much, so this will do some combinations:
# 1. a cvar config
# 2. a price_rule that uses both
# 3. record + record item that either uses that or not
# 4. expected behaviour
{
sub test {
my ($price_rule, $record, $record_item, $comment, $expected_match) = @_;
# needed to clear cvar caches in price rule implementation
$::request->{_cache} = {};
my $matching_rules = SL::DB::Manager::PriceRule->get_all_matching(record => $record, record_item => $record_item);
my @does_match = grep { $_->{name} eq $price_rule->name } @$matching_rules;
if ($expected_match) {
ok(@does_match && $price_rule->name eq $does_match[0]->name, "$comment - expected match, got @does_match");
} else {
ok(!@does_match, "$comment - expected no match, got @does_match");
}
}
{
reset_db();
my $name = "before critical customer date";
my $config = SL::DB::CustomVariableConfig->new(
module => 'CT',
type => 'date',
name => $name,
description => $name,
searchable => 0,
includeable => 0,
included_by_default => 0,
)->save->load;
my $price_rule = SL::DB::PriceRule->new(
name => $name,
price => 1,
type => "customer",
items => [
SL::DB::PriceRuleItem->new(
custom_variable_configs => $config,
value_date => DateTime->new(year => 2022, month => 12, day => 9),
op => "lt",
type => "cvar",
),
],
)->save;
my $order = create_sales_order()->save->load;
my $item = $order->items_sorted->[0];
test($price_rule, $order, $item, $name, 0);
$order->customer->cvar_by_name($name)->value(DateTime->new(year => 2022, month => 12, day => 12));
$order->customer->cvar_by_name($name)->save;
test($price_rule, $order, $item, "$name -- too late", 0);
$order->customer->cvar_by_name($name)->value(DateTime->new(year => 2022, month => 12, day => 5));
$order->customer->cvar_by_name($name)->save;
test($price_rule, $order, $item, "$name -- early", 1);
}
{
reset_db();
my $name = "contact number equals 1234";
my $config = SL::DB::CustomVariableConfig->new(
module => 'Contacts',
type => 'number',
name => $name,
description => $name,
searchable => 0,
includeable => 0,
included_by_default => 0,
)->save->load;
my $price_rule = SL::DB::PriceRule->new(
name => $name,
price => 1,
type => "customer",
items => [
SL::DB::PriceRuleItem->new(
custom_variable_configs => $config,
value_num => 1234,
op => "eq",
type => "cvar",
),
],
)->save;
my $order = create_sales_order()->save->load;
my $item = $order->items_sorted->[0];
test($price_rule, $order, $item, "$name -- no contact", 0);
$order->contact(SL::DB::Contact->new)->save;
test($price_rule, $order, $item, "$name -- null", 0);
$order->contact->cvar_by_name($name)->value(45);
$order->contact->cvar_by_name($name)->save;
test($price_rule, $order, $item, "$name -- not matching", 0);
$order->contact->cvar_by_name($name)->value(1234);
$order->contact->cvar_by_name($name)->save;
test($price_rule, $order, $item, "$name -- matching", 1);
}
{
reset_db();
my $name = "project part matches";
my $config = SL::DB::CustomVariableConfig->new(
module => 'Projects',
type => 'part',
name => $name,
description => $name,
searchable => 0,
includeable => 0,
included_by_default => 0,
)->save->load;
my $part = new_part()->save;
my $price_rule = SL::DB::PriceRule->new(
name => $name,
price => 1,
type => "customer",
items => [
SL::DB::PriceRuleItem->new(
custom_variable_configs => $config,
value_int => $part->id,
type => "cvar",
),
],
)->save;
my $project1 = SL::DB::Project->new(
project_type => SL::DB::Manager::ProjectType->find_by(description => 'Standard'),
project_status => SL::DB::Manager::ProjectStatus->find_by(name => 'running'),
)->save->load;
my $order = create_sales_order()->save->load;
my $item = $order->items_sorted->[0];
test($price_rule, $order, $item, "$name -- no project", 0);
$order->globalproject($project1)->save;
test($price_rule, $order, $item, "$name -- global project, but no value", 0);
$order->globalproject->cvar_by_name($name)->value($item->part);
$order->globalproject->cvar_by_name($name)->save;
test($price_rule, $order, $item, "$name -- global project, not matching", 0);
$order->globalproject->cvar_by_name($name)->value($part);
$order->globalproject->cvar_by_name($name)->save;
test($price_rule, $order, $item, "$name -- global project, matching", 1);
my $project2 = SL::DB::Project->new(
project_type => SL::DB::Manager::ProjectType->find_by(description => 'Standard'),
project_status => SL::DB::Manager::ProjectStatus->find_by(name => 'running'),
)->save->load;
$item->project($project2)->save;
test($price_rule, $order, $item, "$name -- item project, but no value", 0);
$item->project->cvar_by_name($name)->value($item->part);
$item->project->cvar_by_name($name)->save;
test($price_rule, $order, $item, "$name -- item project, not matching", 0);
$item->project->cvar_by_name($name)->value($part);
$item->project->cvar_by_name($name)->save;
test($price_rule, $order, $item, "$name -- item project, matching", 1);
}
{
reset_db();
my $name = "part customer matches";
my $config = SL::DB::CustomVariableConfig->new(
module => 'IC',
type => 'customer',
name => $name,
description => $name,
searchable => 0,
includeable => 0,
included_by_default => 0,
)->save->load;
my $customer = new_customer()->save->load;
my $price_rule = SL::DB::PriceRule->new(
name => $name,
price => 1,
type => "vendor",
items => [
SL::DB::PriceRuleItem->new(
custom_variable_configs => $config,