Line # Revision Author
1 296 ahitrov package promosuite::SQL::Events;
2
3 use base 'SQL::ProtoTable';
4
5 sub db_table
6 {
7 return 'events';
8 }
9
10 sub available_filters {
11 my @available_filters = qw(
12 _class_filter
13 _status_filter
14 _in_id_filter
15 _id_filter
16 _class_excludes_filter
17
18 _s_filter
19 _date_start_filter
20 _excludes_filter
21 );
22 return \@available_filters;
23 }
24
25 # ----------------------------------------------------------------------------
26 # Свойства храним в массивах, потому что порядок важен!
27 # Это общие свойства - одинаковые для всех документов.
28 #
29 # attr - обязательный параметр, название атрибута;
30 # type - тип аттрибута, требуется для отображдения;
31 # rusname - русское название, опять же требуется для отображения;
32 # hidden - равен 1, когда
33 # readonly - инициализации при записи только без изменения в дальнейшем
34 # db_field - поле в таблице
35 # default - значение по умолчанию (поле всегда имеет это значение)
36 # ----------------------------------------------------------------------------
37 sub required_properties
38 {
39 return (
40 { # Идентификатор документа, сквозной по всем типам...
41 'attr' => 'id',
42 'type' => 'integer',
43 'rusname' => 'Идентификатор документа',
44 'hidden' => 1,
45 'auto' => 1,
46 'readonly' => 1,
47 'db_field' => 'id',
48 'db_type' => 'integer',
49 'db_opts' => "not null default nextval('public.documents_id_seq'::text)",
50 },
51 { # Класс документа...
52 'attr' => 'class',
53 'type' => 'string',
54 'rusname' => 'Класс документа',
55 'hidden' => 1,
56 'readonly' => 1,
57 'db_field' => 'class',
58 'db_type' => 'varchar(48)',
59 'db_opts' => 'not null',
60 },
61 { # Название
62 'attr' => 'name',
63 'type' => 'string',
64 'rusname' => 'Название',
65 'column' => 3,
66 'db_field' => 'name',
67 'db_type' => 'varchar(255)',
68 },
69 { # Начало
70 'attr' => 'start',
71 'type' => 'datetime',
72 'rusname' => 'Дата/время начала',
73 'column' => 1,
74 'db_field' => 'start',
75 'db_type' => 'timestamp',
76 'db_opts' => 'not null',
77 },
78 { # Окончание
79 'attr' => 'finish',
80 'type' => 'datetime',
81 'rusname' => 'Дата/время окончания',
82 'column' => 2,
83 'db_field' => 'finish',
84 'db_type' => 'timestamp',
85 'db_opts' => 'not null',
86 },
87 { # Массив секций
88 'attr' => 'sections',
89 'type' => 'sections_list',
90 'rusname' => 'Секции',
91 'hidden' => 1,
92 'db_field' => 'sections',
93 'db_type' => 'integer[]',
94 },
95 { # Поле статуса
96 'attr' => 'status',
97 'type' => 'status',
98 'rusname' => 'Статус',
99 'db_field' => 'status',
100 'db_type' => 'integer',
101 },
102 );
103 }
104
105
106 ########### FILTERS DESCRIPTION ####################################################################################
107 sub _excludes_filter {
108 my ($self,%opts)=@_;
109 if (exists $opts{excludes}) {
110 # - исключение из отбора
111 my @eids = ();
112 if (ref($opts{excludes}) eq 'ARRAY') {
113 @eids = @{ $opts{excludes} };
114 } elsif ($opts{excludes} =~ /[^\d\,]/) {
115 warn "Contenido Warning: В списке идентификаторов для исключения встречаются нечисловые элементы. Параметр excludes игнорируется (".$opts{excludes}.").\n";
116 } else {
117 @eids = split(',', $opts{excludes});
118 }
119
120 my $excludes = join(',', @eids);
121
122 # Меняется логика запроса, если это join-запрос.
123 # Потому что в этом случае гораздо лучше ограничить выборку по таблице links,
124 # чем производить полную склейку таблиц.
125 if (@eids) {
126 if (exists($opts{ldest}) || exists($opts{lsource})) {
127 if (exists($opts{ldest})) {
128 return " (l.source_id not in ($excludes)) ";
129 } elsif (exists($opts{lsource})) {
130 return " (l.dest_id not in ($excludes)) ";
131 }
132 } else {
133 return " (d.id not in ($excludes)) ";
134 }
135 }
136 }
137 return undef;
138 }
139
140 sub _date_start_filter {
141 my ($self,%opts)=@_;
142 return undef unless ( exists($opts{start}) && $opts{start} );
143 return &SQL::Common::_generic_date_filter('d.start', $opts{start});
144 }
145
146 sub _get_orders {
147 my ($self, %opts) = @_;
148
149 if ($opts{order_by}) {
150 return ' order by '.$opts{order_by};
151 } else {
152 return ' order by start desc,finish desc';
153 }
154 return undef;
155 }
156
157 1;