Fee sheet enhancements
[openemr.git] / interface / forms / fee_sheet / review / fee_sheet_review_view_model.js
blob20c5de404472f1e07b905e74f99133acff60261e
1 /**
2  * knockout.js view model for review of previous fee sheets
3  * 
4  * Copyright (C) 2013 Kevin Yeh <kevin.y@integralemr.com> and OEMR <www.oemr.org>
5  *
6  * LICENSE: This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 3
9  * of the License, or (at your option) any later version.
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  * You should have received a copy of the GNU General Public License
15  * along with this program. If not, see <http://opensource.org/licenses/gpl-license.php>;.
16  *
17  * @package OpenEMR
18  * @author  Kevin Yeh <kevin.y@integralemr.com>
19  * @link    http://www.open-emr.org
20  */
21 function code_entry(json_source)
23     this.code=ko.observable(json_source.code);
24     this.code_type=ko.observable(json_source.code_type);
25     this.description=ko.observable(json_source.description);
26     this.selected=ko.observable(json_source.selected);
27     this.priority=ko.observable(99999);
28     this.jsonify=function()
29     {
30         var retval={};
31         retval.code=this.code();
32         retval.code_type=this.code_type();
33         retval.description=this.description();
34         return retval;
35     }
36     this.key=function()
37     {
38         return this.code_type()+"|"+ this.code();
39     }
40     return this;
43 function procedure(json_source)
45     var retval=new code_entry(json_source);
46     retval.fee=ko.observable(json_source.fee);
47     retval.modifiers=ko.observable(json_source.modifiers);
48     retval.units=ko.observable(json_source.units);
49     retval.mod_size=ko.observable(json_source.mod_size);
50     retval.justify=ko.observableArray();
51     var justify_codes=json_source.justify.split(":");
52     for(var idx=0;idx<justify_codes.length;idx++)
53         {
54             var justify_parse=justify_codes[idx].split("|");
55             if(justify_parse.length==2)
56                 {
57                     var new_code={};
58                     new_code.code_type=justify_parse[0];
59                     new_code.code=justify_parse[1];
60                     new_code.descriptions="";
61                     new_code.selected=true;
62                     var ko_code=new code_entry(new_code)
63                     ko_code.priority=idx+1;
64                     retval.justify.push(ko_code);                  
65                 }
66         }
67     retval.genJustify=function()
68     {
69         var justify_string="";
70         for(var idx=0;idx<this.justify().length;idx++)
71         {
72             var cur_justify=this.justify()[idx];
73             if(cur_justify.selected())
74             {
75                 justify_string+=cur_justify.code_type() +"|"+cur_justify.code()+":";
76             }
77         }
78         return justify_string;
79     }
81     retval.procedure_choices=ko.observableArray();
82     retval.procedure_choices.push(new fee_sheet_option(retval.code(), retval.code_type(),retval.description(),retval.fee()));
83     for(idx=0;idx<fee_sheet_options.length;idx++)
84     {
85         retval.procedure_choices.push(fee_sheet_options[idx]);
86     }
87     retval.procedure_choice=ko.observable(retval.procedure_choices[0]);
88     retval.change_procedure=function(data,event)
89     {
90         data.description(data.procedure_choice().description);
91         data.code(data.procedure_choice().code);
92         data.code_type(data.procedure_choice().code_type);
93         data.fee(data.procedure_choice().fee);
94         
95     }
96     retval.jsonify=function()
97     {
98         var json_return={};
99         json_return.code=this.code();
100         json_return.code_type=this.code_type();
101         json_return.description=this.description();
102         json_return.fee=this.fee();
103         json_return.modifiers=this.modifiers();
104         json_return.units=this.units();
105         json_return.justify=this.genJustify();
106         return json_return;
107     }
108     return retval;
110 // This function takes json objects for procedures and maps them to the knockoutjs model with observables
111 function map_procedures(json_objects)
113     var retval=[];
114     for(var idx=0;idx<json_objects.length;idx++)
115     {
116         retval.push(procedure(json_objects[idx]));
117     }
118     return retval;
123 // This function takes json objects and maps them to the knockoutjs model with observables
124 function map_code_entries(json_objects)
126     var retval=[];
127     for(idx=0;idx<json_objects.length;idx++)
128     {
129         retval.push(new code_entry(json_objects[idx]));
130     }
131     return retval;
134 function request_encounter_data(model_data,mode,prev_encounter)
136     var request={
137             pid: pid,
138             encounter: enc,
139             mode: mode,
140             task: "retrieve"
141             };
142     if(prev_encounter!=null)
143     {
144         request.prev_encounter=prev_encounter;
145     }
146     $.post(review_ajax,request,function(result){
148                 model_data.prev_encounter(null)
149                 if(typeof result.encounters!='undefined')
150                     {
151                         model_data.encounters(result.encounters);                
152                         for(idx=0;idx<model_data.encounters().length;idx++)
153                         {
154                             if(model_data.encounters()[idx].id==result.prev_encounter)
155                                 {
156                                     model_data.selectedEncounter(model_data.encounters()[idx]);                
157                                 }
158                         }
159                     }
160                     else
161                         {
162                             model_data.encounters([]);
163                         }
164                 model_data.prev_encounter(result.prev_encounter)
165                 if(typeof result.procedures!='undefined')
166                     {
167                         model_data.procedures(map_procedures(result.procedures));                
168                     }
169                     else
170                         {
171                             model_data.procedures([]);
172                         }
173                 
174                 model_data.issues(map_code_entries(result.issues));
175                 model_data.show(true);
176             },"json");
179 function review_event(data,event)
181     event.preventDefault();
182     $(".cancel_dialog").click();
183     request_encounter_data(data.review,data.review.mode,null);
186 function cancel_review(data,event)
188     event.preventDefault();
189     data.show(false);
190     
193 function choose_encounter(data,event)
195     if(data.prev_encounter()!=null)
196         {
197             if(data.selectedEncounter().id!=data.prev_encounter())
198             {
199                 request_encounter_data(data,"encounters",data.selectedEncounter().id)
200             }
201         }
203 function fee_sheet_review_view_model()
205     this.review= {name: 'Hello' 
206                   ,mode: "encounters"
207                   ,show: ko.observable(false)
208                   ,prev_encounter: ko.observable()
209                   ,encounters: ko.observableArray()
210                   ,procedures: ko.observableArray()
211                   ,issues: ko.observableArray()
212                   ,selectedEncounter: ko.observable()
213                  };
214     this.justify= {};
215     this.procedure_options={
216         current_procedure: ko.observable()
217         ,fee_sheet_options: ko.observableArray()
218     }
219     
220     this.cancel_review= cancel_review;
221     this.review_event= review_event;
222     this.choose_encounter = choose_encounter;
224 function add_review(data,event)
226     var diag_list=[];
227     for(var idx=0;idx<data.issues().length;idx++)
228     {
229         var cur_diag=data.issues()[idx];
230         if(cur_diag.selected())
231         {
232             diag_list.push(cur_diag.jsonify());
233         }
234     }
235     
236     var proc_list=[];
237     for(idx=0;idx<data.procedures().length;idx++)
238     {
239         var cur_proc=data.procedures()[idx];
240         if(cur_proc.selected())
241         {
242             proc_list.push(cur_proc.jsonify());
243         }
244     }
245     top.restoreSession();
246     $.post(review_ajax,{
247         pid: pid,
248         encounter: enc,
249         task: 'add_diags',
250         diags: JSON.stringify(diag_list),
251         procs: JSON.stringify(proc_list)
252     },
253     function(data)
254         {
255             refresh_codes();
256         }
258     );
260     data.show(false);