1 /*  HomeBank -- Free, easy, personal accounting for everyone.
2  *  Copyright (C) 1995-2021 Maxime DOYEN
3  *
4  *  This file is part of HomeBank.
5  *
6  *  HomeBank is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  HomeBank is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #ifndef __HB_FILTER_H__
21 #define __HB_FILTER_H__
22 
23 
24 /*
25 ** filter options
26 */
27 enum
28 {
29 	FLT_GRP_DATE,
30 	FLT_GRP_CATEGORY,
31 	FLT_GRP_PAYEE,
32 	FLT_GRP_ACCOUNT,
33 	FLT_GRP_TEXT,
34 	FLT_GRP_AMOUNT,
35 	FLT_GRP_PAYMODE,
36 	FLT_GRP_STATUS,
37 	FLT_GRP_TYPE,
38 	FLT_GRP_MAX
39 };
40 
41 
42 enum
43 {
44 	FLT_RANGE_THISMONTH = 0,
45 	FLT_RANGE_LASTMONTH = 1,
46 	FLT_RANGE_THISQUARTER = 2,
47 	FLT_RANGE_LASTQUARTER = 3,
48 	FLT_RANGE_THISYEAR = 4,
49 	FLT_RANGE_LASTYEAR = 5,	 //was not existing on 4.5
50 	// 6 separator
51 	FLT_RANGE_LAST30DAYS = 7,
52 	FLT_RANGE_LAST60DAYS = 8,
53 	FLT_RANGE_LAST90DAYS = 9,
54 	FLT_RANGE_LAST12MONTHS = 10,
55 	// 11 separator
56 	FLT_RANGE_OTHER = 12,
57 	// 13 separator
58 	FLT_RANGE_ALLDATE = 14
59 };
60 
61 
62 enum
63 {
64 	FLT_TYPE_ALL = 0,
65 	// 1 separator
66 	FLT_TYPE_EXPENSE = 2,
67 	FLT_TYPE_INCOME = 3,
68 	FLT_TYPE_INTXFER = 4,
69 };
70 
71 
72 enum
73 {
74 	FLT_STATUS_ALL = 0,
75 	// 1 separator
76 	FLT_STATUS_CLEARED = 2,
77 	FLT_STATUS_UNCLEARED = 3,
78 	FLT_STATUS_RECONCILED = 4,
79 	FLT_STATUS_UNRECONCILED = 5,
80 	// 6 separator
81 	FLT_STATUS_UNCATEGORIZED = 7,
82 };
83 
84 
85 enum
86 {
87 	FLT_QSEARCH_MEMO     = 1<<0,
88 	FLT_QSEARCH_INFO     = 1<<1,
89 	FLT_QSEARCH_PAYEE    = 1<<2,
90 	FLT_QSEARCH_CATEGORY = 1<<3,
91 	FLT_QSEARCH_TAGS     = 1<<4,
92 	FLT_QSEARCH_AMOUNT   = 1<<5
93 };
94 
95 
96 typedef struct _filter	Filter;
97 
98 struct _filter
99 {
100 
101 	gshort		option[FLT_GRP_MAX];
102 	gint		range;
103 	guint32		mindate, maxdate;
104 	//gint		rawtype, rawstatus;
105 
106 	gint		type, status;
107 
108 	gboolean	paymode[NUM_PAYMODE_MAX];
109 
110 	gdouble		minamount, maxamount;
111 
112 	gboolean	exact;
113 
114 	gchar		*info;
115 	gchar		*memo;
116 	gchar		*tag;
117 
118 	/* unsaved datas */
119 	gint		nbdaysfuture;
120 	gboolean	forceadd;
121 	gboolean	forcechg;
122 	gboolean	forceremind;
123 	gboolean	forcevoid;
124 	gchar		last_tab[8];	/* keep last active tab */
125 };
126 
127 
128 Filter *da_flt_malloc(void);
129 void da_flt_free(Filter *flt);
130 
131 void da_flt_destroy(void);
132 void da_flt_new(void);
133 
134 void da_flt_status_acc_set(Filter *flt, guint32 kacc, gboolean status);
135 void da_flt_status_pay_set(Filter *flt, guint32 kpay, gboolean status);
136 void da_flt_status_cat_set(Filter *flt, guint32 kcat, gboolean status);
137 gboolean da_flt_status_acc_get(Filter *flt, guint32 kacc);
138 gboolean da_flt_status_pay_get(Filter *flt, guint32 kpay);
139 gboolean da_flt_status_cat_get(Filter *flt, guint32 kcat);
140 
141 void filter_status_acc_clear_except(Filter *flt, guint32 selkey);
142 void filter_status_pay_clear_except(Filter *flt, guint32 selkey);
143 void filter_status_cat_clear_except(Filter *flt, guint32 selkey);
144 
145 void filter_reset(Filter *flt);
146 void filter_preset_daterange_set(Filter *flt, gint range, guint32 kacc);
147 void filter_preset_type_set(Filter *flt, gint value);
148 gboolean filter_preset_daterange_future_enable(gint range);
149 void filter_preset_daterange_add_futuregap(Filter *filter, gint nbdays);
150 
151 void filter_set_tag_by_id(Filter *flt, guint32 key);
152 void filter_preset_status_set(Filter *flt, gint value);
153 
154 gchar *filter_daterange_text_get(Filter *flt);
155 gboolean filter_txn_search_match(gchar *needle, Transaction *txn, gint flags);
156 gboolean filter_tpl_search_match(gchar *needle, Archive *arc);
157 
158 gint filter_txn_match(Filter *flt, Transaction *ope);
159 
160 #endif
161