package webshop::Discount; use strict; use warnings 'all'; use Contenido::Globals; use base "Contenido::Document"; use Data::Dumper; sub extra_properties { return ( { 'attr' => 'code', 'hidden' => 1, 'column' => undef }, { 'attr' => 'class', 'column' => undef }, { 'attr' => 'dtime', 'rusname' => 'Начало действия скидки' }, { 'attr' => 'etime', 'rusname' => 'Окончание действия скидки' }, { 'attr' => 'status', 'type' => 'status', 'rusname' => 'Статус', 'cases' => [ [0, 'Скидка не активна'], [1, 'Скидка активна'], ], }, { 'attr' => 'uid', 'type' => 'status', 'rusname' => 'Доступность для пользователей', 'cases' => [ [0, 'Скидка доступна всем пользователям'], [1, 'Скидка доступна только зарегистрированным пользователям'], ], }, { 'attr' => 'groups', 'rusname' => 'Группы товаров', lookup_opts => { class => $state->{webshop}->{item_section_class}, }, allow_null => 1, rem => 'Список разделов, на содержимое которых распространяется скидка по купону', }, { 'attr' => 'min_sum', 'type' => 'string', 'rusname' => 'Порог суммы, с которого действует скидка', default => 0, column => 2, shortname => 'Сумма заказа' }, { 'attr' => 'discount', 'type' => 'string', 'rusname' => 'Размер скидки (число или процент)', shortname => 'Скидка', default => 0, column => 3 }, ) } sub class_name { return 'Webshop: скидка'; } sub class_description { return 'Webshop: скидка'; } sub class_table { return 'webshop::SQL::CouponsTable'; } sub contenido_status_style { my $self = shift; if ( $self->status == 3 ) { return 'color:black;'; } elsif ( $self->status == 2 ) { return 'color:red;'; } elsif ( $self->status == 4 ) { return 'color:olive;'; } } sub table_links { return [ # { name => 'Купоны', class => 'webshop::Coupon', filter => 'pid', field => 'pid' }, ]; } sub get_discount { my $self = shift; my (%opts) = @_; my $basket = delete $opts{basket}; return 0 unless exists $opts{uid} && $opts{uid} || exists $opts{session} && $opts{session}; return 0 unless $self->discount; $basket ||= $keeper->{webshop}->get_basket ( %opts ); return 0 unless ref $basket eq 'ARRAY' && @$basket; my ($number, $sum_total) = (0, 0); map { $number += $_->number; $sum_total += $_->number * $_->price } @$basket; warn "BASKET: $number Items of $sum_total Value\n"; my $discount_counted = 0; my $items; if ( $self->groups ) { $items = $self->keeper->get_documents ( s => [$self->groups], class => $state->{webshop}->{item_document_class}, light => 1, return_mode => 'array_ref', ); } else { $items = $self->keeper->get_documents ( class => $state->{webshop}->{item_document_class}, lclass => 'webshop::DiscountItemLink', lsource => $self->id, light => 1, return_mode => 'array_ref', ); } if ( ref $items eq 'ARRAY' && @$items ) { my $found_sum = 0; foreach my $bi ( @$basket ) { warn "BASKET: Item id [".$bi->item_id."]\n" if $DEBUG; next if $bi->special_price; foreach my $item ( @$items) { if ( $bi->item_id == $item->id ) { warn "BASKET: Item [".$item->name."] id [".$item->id."]\n" if $DEBUG; $found_sum += $bi->number * $bi->price; last; } } } warn "Sum found: [$found_sum]\n" if $DEBUG; return $self->can_discount( $found_sum ); } elsif ( $self->groups ) { return 0; } else { my $found_sum = 0; foreach my $bi ( @$basket ) { warn "BASKET: Item id [".$bi->item_id."]\n" if $DEBUG; next if $bi->special_price; $found_sum += $bi->number * $bi->price; } warn "Sum found: [$found_sum]\n" if $DEBUG; return $self->can_discount( $found_sum ); } return 0; } sub can_discount { my $self = shift; my $sum = shift; return 0 unless $sum; my $discount = $self->discount; my $min_sum = $self->min_sum || 0; my $count = 0; if ( $discount =~ /([\d\.]+)%/ ) { my $proc = $1; return 0 unless $proc; $count = $sum / 100 * $proc; } else { $count = $discount; } my $rest = $sum - $count; $count = 0 if $rest < $min_sum || $rest == 0; return $count; } sub pre_store { my $self = shift; my $default_section = $project->s_alias->{webshop_discounts} if ref $project->s_alias eq 'HASH'; if ( $default_section && !$self->sections ) { $self->sections($default_section); } return 1; } sub post_delete { my $self = shift; my $sql = $self->keeper->SQL->prepare('DELETE FROM webshop_coupon_links where source_id = ?'); $sql->execute( $self->id ); 1; } 1;