package ledes

  1. Overview
  2. Docs

Source file ledes1998b.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
open Angstrom
open Common

type input = string
type err = string

let header_validator = validate_ledes1998b_header_greedy
let column_validator = validate_ledes1998b_data_columns_greedy

let data_line_parser_greedy =
  let* f1 = data_field_parser in
  let* f2 = data_field_parser in
  let* f3 = data_field_parser in
  let* f4 = data_field_parser in
  let* f5 = data_field_parser in
  let* f6 = data_field_parser in
  let* f7 = data_field_parser in
  let* f8 = data_field_parser in
  let* f9 = data_field_parser in
  let* f10 = data_field_parser in
  let* f11 = data_field_parser in
  let* f12 = data_field_parser in
  let* f13 = data_field_parser in
  let* f14 = data_field_parser in
  let* f15 = data_field_parser in
  let* f16 = data_field_parser in
  let* f17 = data_field_parser in
  let* f18 = data_field_parser in
  let* f19 = data_field_parser in
  let* f20 = data_field_parser in
  let* f21 = data_field_parser in
  let* f22 = data_field_parser in
  let* f23 = data_field_parser in
  let* f24 = last_data_field_parser in
  return
    [
      f1;
      f2;
      f3;
      f4;
      f5;
      f6;
      f7;
      f8;
      f9;
      f10;
      f11;
      f12;
      f13;
      f14;
      f15;
      f16;
      f17;
      f18;
      f19;
      f20;
      f21;
      f22;
      f23;
      f24;
    ]

let data_fields_validator_greedy errors fields line_num =
  let f1 = get_index fields 1 in
  let f2 = get_index fields 2 in
  let f3 = get_index fields 3 in
  let f4 = get_index fields 4 in
  let f5 = get_index fields 5 in
  let f6 = get_index fields 6 in
  let f7 = get_index fields 7 in
  let f8 = get_index fields 8 in
  let f9 = get_index fields 9 in
  let f10 = get_index fields 10 in
  let f11 = get_index fields 11 in
  let f12 = get_index fields 12 in
  let f13 = get_index fields 13 in
  let f14 = get_index fields 14 in
  let f15 = get_index fields 15 in
  let f16 = get_index fields 16 in
  let f17 = get_index fields 17 in
  let f18 = get_index fields 18 in
  let f19 = get_index fields 19 in
  let f20 = get_index fields 20 in
  let f21 = get_index fields 21 in
  let f22 = get_index fields 22 in
  let f23 = get_index fields 23 in
  let f24 = get_index fields 24 in
  let errors =
    data_field_validate_greedy f1 errors ~line_num ~field_num:"1"
      ~field_name:"INVOICE_DATE" ~pred:is_valid_date ~required:true
  in
  let errors =
    data_field_validate_greedy f2 errors ~line_num ~field_num:"2"
      ~field_name:"INVOICE_NUMBER" ~pred:(is_valid_alphanumeric 20)
      ~required:true
  in
  let errors =
    data_field_validate_greedy f3 errors ~line_num ~field_num:"3"
      ~field_name:"CLIENT_ID" ~pred:(is_valid_char_field 20) ~required:true
  in
  let errors =
    data_field_validate_greedy f4 errors ~line_num ~field_num:"4"
      ~field_name:"LAW_FIRM_MATTER_ID" ~pred:(is_valid_char_field 20)
      ~required:true
  in
  let errors =
    data_field_validate_greedy f5 errors ~line_num ~field_num:"5"
      ~field_name:"INVOICE_TOTAL" ~pred:(is_valid_currency 12 4) ~required:true
  in
  let errors =
    data_field_validate_greedy f6 errors ~line_num ~field_num:"6"
      ~field_name:"BILLING_START_DATE" ~pred:is_valid_date ~required:true
  in
  let errors =
    data_field_validate_greedy f7 errors ~line_num ~field_num:"7"
      ~field_name:"BILLING_END_DATE" ~pred:is_valid_date ~required:true
  in
  let errors =
    data_field_validate_greedy f8 errors ~line_num ~field_num:"8"
      ~field_name:"INVOICE_DESCRIPTION" ~pred:(is_valid_kb_size 15)
      ~required:false
  in
  let errors =
    data_field_validate_greedy f9 errors ~line_num ~field_num:"9"
      ~field_name:"LINE_ITEM_NUMBER" ~pred:(is_valid_char_field 20)
      ~required:true
  in
  let errors =
    data_field_validate_greedy f10 errors ~line_num ~field_num:"10"
      ~field_name:"EXP/FEE/INV_ADJ_TYPE"
      ~pred:(flip List.mem valid_exp_fee_inv_adi_type)
      ~required:true
  in
  let errors =
    data_field_validate_with_dep_greedy f11 errors ~line_num ~field_num:"11"
      ~field_name:"LINE_ITEM_NUMBER_OF_UNITS"
      ~pred:(is_valid_line_item_cost f10)
  in
  let errors =
    data_field_validate_greedy f12 errors ~line_num ~field_num:"12"
      ~field_name:"LINE_ITEM_ADJUSTMENT_AMOUNT" ~pred:(is_valid_currency 10 4)
      ~required:false
  in
  let errors =
    data_field_validate_greedy f13 errors ~line_num ~field_num:"13"
      ~field_name:"LINE_ITEM_TOTAL" ~pred:(is_valid_currency 10 4)
      ~required:true
  in
  let errors =
    data_field_validate_greedy f14 errors ~line_num ~field_num:"14"
      ~field_name:"LINE_ITEM_DATE" ~pred:is_valid_date ~required:true
  in
  let errors =
    data_field_validate_greedy f15 errors ~line_num ~field_num:"15"
      ~field_name:"LINE_ITEM_TASK_CODE" ~pred:(is_valid_char_field 20)
      ~required:false
  in
  let errors =
    data_field_validate_greedy f16 errors ~line_num ~field_num:"16"
      ~field_name:"LINE_ITEM_EXPENSE_CODE" ~pred:(is_valid_char_field 20)
      ~required:false
  in
  let errors =
    data_field_validate_greedy f17 errors ~line_num ~field_num:"17"
      ~field_name:"LINE_ITEM_ACTIVITY_CODE" ~pred:(is_valid_char_field 20)
      ~required:false
  in
  let errors =
    data_field_validate_greedy f18 errors ~line_num ~field_num:"18"
      ~field_name:"TIMEKEEPER_ID" ~pred:(is_valid_char_field 20) ~required:false
  in
  let errors =
    data_field_validate_greedy f19 errors ~line_num ~field_num:"19"
      ~field_name:"LINE_ITEM_DESCRIPTION" ~pred:(is_valid_kb_size 15)
      ~required:false
  in
  let errors =
    data_field_validate_greedy f20 errors ~line_num ~field_num:"20"
      ~field_name:"LAW_FIRM_ID" ~pred:(is_valid_char_field 20) ~required:true
  in
  let errors =
    data_field_validate_with_dep_greedy f21 errors ~line_num ~field_num:"21"
      ~field_name:"LINE_ITEM_UNIT_COST"
      ~pred:(is_valid_line_item_cost f10)
  in
  let errors =
    data_field_validate_greedy f22 errors ~line_num ~field_num:"22"
      ~field_name:"TIMEKEEPER_NAME" ~pred:(is_valid_char_field 30)
      ~required:false
  in
  let errors =
    data_field_validate_greedy f23 errors ~line_num ~field_num:"23"
      ~field_name:"TIMEKEEPER_CLASSIFICATION"
      ~pred:is_valid_timekeeper_classification ~required:false
  in
  let errors =
    data_field_validate_greedy f24 errors ~line_num ~field_num:"24"
      ~field_name:"CLIENT_MATTER_ID" ~pred:(is_valid_char_field 20)
      ~required:false
  in
  List.rev errors

let parse_and_validate_greedy =
  parse_and_validate_greedy_inner ~header_validator ~column_validator
    ~data_line_parser_greedy ~data_fields_validator_greedy

let data_parser_eager =
  let* _ =
    data_field_parser_eager ~field_num:"1" ~field_name:"INVOICE_DATE"
      ~pred:is_valid_date ~required:true
  in
  let* _ =
    data_field_parser_eager ~field_num:"2" ~field_name:"INVOICE_NUMBER"
      ~pred:(is_valid_alphanumeric 20) ~required:true
  in
  let* _ =
    data_field_parser_eager ~field_num:"3" ~field_name:"CLIENT_ID"
      ~pred:(is_valid_char_field 20) ~required:true
  in
  let* _ =
    data_field_parser_eager ~field_num:"4" ~field_name:"LAW_FIRM_MATTER_ID"
      ~pred:(is_valid_char_field 20) ~required:true
  in
  let* _ =
    data_field_parser_eager ~field_num:"5" ~field_name:"INVOICE_TOTAL"
      ~pred:(is_valid_currency 12 4) ~required:true
  in
  let* _ =
    data_field_parser_eager ~field_num:"6" ~field_name:"BILLING_START_DATE"
      ~pred:is_valid_date ~required:true
  in
  let* _ =
    data_field_parser_eager ~field_num:"7" ~field_name:"BILLING_END_DATE"
      ~pred:is_valid_date ~required:true
  in
  let* _ =
    data_field_parser_eager ~field_num:"8" ~field_name:"INVOICE_DESCRIPTION"
      ~pred:(is_valid_kb_size 15) ~required:false
  in
  let* _ =
    data_field_parser_eager ~field_num:"9" ~field_name:"LINE_ITEM_NUMBER"
      ~pred:(is_valid_char_field 20) ~required:true
  in
  let* f10 =
    data_field_parser_eager ~field_num:"10" ~field_name:"EXP/FEE/INV_ADJ_TYPE"
      ~pred:(flip List.mem valid_exp_fee_inv_adi_type)
      ~required:true
  in
  let* _ =
    data_field_parser_with_dep_eager ~field_num:"11"
      ~field_name:"LINE_ITEM_NUMBER_OF_UNITS"
      ~pred:(is_valid_line_item_cost f10)
  in
  let* _ =
    data_field_parser_eager ~field_num:"12"
      ~field_name:"LINE_ITEM_ADJUSTMENT_AMOUNT" ~pred:(is_valid_currency 10 4)
      ~required:false
  in
  let* _ =
    data_field_parser_eager ~field_num:"13" ~field_name:"LINE_ITEM_TOTAL"
      ~pred:(is_valid_currency 10 4) ~required:true
  in
  let* _ =
    data_field_parser_eager ~field_num:"14" ~field_name:"LINE_ITEM_DATE"
      ~pred:is_valid_date ~required:true
  in
  let* _ =
    data_field_parser_eager ~field_num:"15" ~field_name:"LINE_ITEM_TASK_CODE"
      ~pred:(is_valid_char_field 20) ~required:false
  in
  let* _ =
    data_field_parser_eager ~field_num:"16" ~field_name:"LINE_ITEM_EXPENSE_CODE"
      ~pred:(is_valid_char_field 20) ~required:false
  in
  let* _ =
    data_field_parser_eager ~field_num:"17"
      ~field_name:"LINE_ITEM_ACTIVITY_CODE" ~pred:(is_valid_char_field 20)
      ~required:false
  in
  let* _ =
    data_field_parser_eager ~field_num:"18" ~field_name:"TIMEKEEPER_ID"
      ~pred:(is_valid_char_field 20) ~required:false
  in
  let* _ =
    data_field_parser_eager ~field_num:"19" ~field_name:"LINE_ITEM_DESCRIPTION"
      ~pred:(is_valid_kb_size 15) ~required:false
  in
  let* _ =
    data_field_parser_eager ~field_num:"20" ~field_name:"LAW_FIRM_ID"
      ~pred:(is_valid_char_field 20) ~required:true
  in
  let* _ =
    data_field_parser_with_dep_eager ~field_num:"21"
      ~field_name:"LINE_ITEM_UNIT_COST"
      ~pred:(is_valid_line_item_cost f10)
  in
  let* _ =
    data_field_parser_eager ~field_num:"22" ~field_name:"TIMEKEEPER_NAME"
      ~pred:(is_valid_char_field 30) ~required:false
  in
  let* _ =
    data_field_parser_eager ~field_num:"23"
      ~field_name:"TIMEKEEPER_CLASSIFICATION"
      ~pred:is_valid_timekeeper_classification ~required:false
  in
  last_data_field_parser_eager ~field_num:"24" ~field_name:"CLIENT_MATTER_ID"
    ~pred:(is_valid_char_field 20) ~required:false

let parse_and_validate_eager lines =
  parse_and_validate_eager_inner lines
    ~header_parser_eager:ledes1998b_header_parser
    ~column_parser_eager:ledes1998b_column_parser ~data_parser:data_parser_eager