Line # Revision Author
1 198 ahitrov package webshop::Delivery;
2
3 use base "Contenido::Document";
4 205 ahitrov use JSON::XS;
5 our $json = JSON::XS->new->utf8;
6
7 198 ahitrov sub extra_properties
8 {
9 return (
10 { 'attr' => 'status', 'type' => 'status', 'rusname' => 'Статус',
11 'cases' => [
12 [0, 'Не активна'],
13 [1, 'Действует'],
14 ],
15 259 ahitrov },
16 726 ahitrov { 'attr' => 'alias', 'type' => 'string', 'rusname' => 'Код (alias) поставщика' },
17 413 ahitrov { 'attr' => 'dtime', 'hidden' => 1, column => undef },
18 { 'attr' => 'price', 'type' => 'string', 'rusname' => 'Стоимость доставки (число)', default => 0, column => 4 },
19 205 ahitrov { 'attr' => 'price_modify', 'type' => 'cost_level', 'rusname' => 'Стоимость доставки с учетом стоимости заказа' },
20 259 ahitrov { 'attr' => 'price_region', 'type' => 'cost_region', 'rusname' => 'Стоимость доставки с учетом региона' },
21 198 ahitrov { 'attr' => 'abstr', 'type' => 'text', 'rusname' => 'Краткое описание' },
22 { 'attr' => 'fields', 'type' => 'status_multi', 'rusname' => 'Поля, необходимые к заполнению',
23 'cases' => [
24 ['timeline','Время заказа'],
25 ['zipcode','Почтовый индекс'],
26 259 ahitrov ['country','Страна'],
27 ['area','Регион из списка'],
28 ['town_id','Город из списка'],
29 198 ahitrov ['town','Город'],
30 ['address','Адрес'],
31 ['metro','Ближайшее метро'],
32 543 ahitrov ['carrier','Название логистической компании'],
33 726 ahitrov ['axiomus','Аксиомус Виджет'],
34 198 ahitrov ],
35 },
36 )
37 }
38
39 205 ahitrov sub price_actual
40 {
41 my $self = shift;
42 259 ahitrov my (%opts) = @_;
43
44 my $sum = delete $opts{sum};
45 my $region_id = exists $opts{region} && ref $opts{region} ? $opts{region}->id : exists $opts{region_id} ? $opts{region_id} : undef;
46 205 ahitrov my $price = $self->price;
47 259 ahitrov $price = defined $price && $price =~ /^\d+$/ ? $price : 'не определена';
48 205 ahitrov
49 259 ahitrov if ( $region_id ) {
50 if ( $self->price_region ) {
51 my $region_price = $json->decode( $self->price_region );
52 if ( ref $region_price eq 'HASH' && exists $region_price->{$region_id} ) {
53 $price = $region_price->{$region_id};
54 }
55 }
56 } elsif ( $sum ) {
57 205 ahitrov if ( $self->price_modify ) {
58 259 ahitrov my $price_modify = $json->decode( $self->price_modify );
59 if ( ref $price_modify eq 'ARRAY' && @$price_modify ) {
60 foreach my $mod ( @$price_modify ) {
61 205 ahitrov if ( $mod->{level} <= $sum ) {
62 262 ahitrov if ( $mod->{cost} =~ /(\d+)%/ ) {
63 my $mod = $1;
64 $price = sprintf("%.2f", ($self->price * $mod) / 100);
65 } else {
66 $price = $mod->{cost};
67 }
68 205 ahitrov }
69 }
70 }
71 }
72 }
73 259 ahitrov return $price;
74 205 ahitrov }
75
76 259 ahitrov sub get_fields
77 {
78 my $self = shift;
79 my $fields = $self->fields;
80 my @fields = @$fields if $fields && ref $fields eq 'ARRAY';
81
82 return @fields;
83 }
84
85 sub check_field
86 {
87 my $self = shift;
88 my $field = shift;
89 return unless $field;
90 my $fields = $self->fields;
91 my %fields = map { $_ => 1 } @$fields if ref $fields eq 'ARRAY' && @$fields;
92
93 return exists $fields{$field} ? 1 : 0;
94 }
95
96 198 ahitrov sub class_name
97 {
98 return 'Способ доставки';
99 }
100
101 sub class_description
102 {
103 return 'Способ доставки';
104 }
105
106 727 ahitrov sub class_table
107 {
108 return 'webshop::SQL::DeliveryTable';
109 }
110
111 198 ahitrov sub pre_store
112 {
113 my $self = shift;
114
115 my $default_section = $project->s_alias->{delivery} if ref $project->s_alias eq 'HASH';
116 my $sections = $self->{sections};
117 if ( $default_section ) {
118 if ( ref $sections eq 'ARRAY' && scalar @$sections ) {
119 my @new_sects = grep { $_ != $default_section } @$sections;
120 push @new_sects, $default_section;
121 $self->sections(@new_sects);
122 } elsif ( $sections && !ref $sections && $sections != $default_section ) {
123 my @new_sects = ($default_section, $sections);
124 $self->sections(@new_sects);
125 } else {
126 $self->sections($default_section);
127 }
128 }
129
130 return 1;
131 }
132
133 1;