Fixed numeric fields to accept user native number format.
[fa-stable.git] / sales / allocations / customer_allocate.php
1 <?php
2
3 $path_to_root="../..";
4 $page_security = 3;
5
6 include($path_to_root . "/includes/ui/allocation_cart.inc");
7 include_once($path_to_root . "/includes/session.inc");
8 include_once($path_to_root . "/sales/includes/sales_ui.inc");
9 include_once($path_to_root . "/sales/includes/sales_db.inc");
10
11 $js = "";
12 if ($use_popup_windows)
13         $js .= get_js_open_window(900, 500);
14
15 $js .= get_js_allocate();
16
17 page(_("Allocate Customer Payment or Credit Note"), false, false, "", $js);
18
19 //--------------------------------------------------------------------------------
20
21 function clear_allocations()
22 {
23         if (isset($_SESSION['alloc']))
24         {
25                 unset($_SESSION['alloc']->allocs);
26                 unset($_SESSION['alloc']);
27         }
28         session_register('alloc');
29 }
30
31 //--------------------------------------------------------------------------------
32
33 function check_data()
34 {
35         $total_allocated = 0;
36
37         for ($counter = 0; $counter < $_POST["TotalNumberOfAllocs"]; $counter++)
38         {
39
40                 if (!check_num('amount' . $counter))
41                 {
42                         display_error(_("The entry for one or more amounts is invalid."));
43                         return false;
44                 }
45
46                 if (!check_num('amount' . $counter,0))
47                 {
48                         display_error(_("The entry for an amount to allocate was negative. A positive allocation amount is expected."));
49                         return false;
50                 }
51
52                   /*Now check to see that the AllocAmt is no greater than the
53                 amount left to be allocated against the transaction under review */
54                 if (input_num('amount' . $counter) > $_POST['un_allocated' . $counter])
55                 {
56                     //$_POST['amount' . $counter] = $_POST['un_allocated' . $counter];
57                 }
58
59                 $_SESSION['alloc']->allocs[$counter]->current_allocated = input_num('amount' . $counter);
60
61                 $total_allocated += input_num('amount' . $counter);
62         }
63
64         if ($total_allocated - $_SESSION['alloc']->amount > sys_prefs::allocation_settled_allowance())
65         {
66                 display_error(_("These allocations cannot be processed because the amount allocated is more than the total amount left to allocate."));
67                 //echo  _("Total allocated:") . " " . $total_allocated ;
68                 //echo "  " . _("Total amount that can be allocated:") . " " . -$_SESSION['alloc']->TransAmt . "<BR>";
69                 return false;
70         }
71
72         return true;
73 }
74
75 //-----------------------------------------------------------------------------------
76
77 function handle_process()
78 {
79         begin_transaction();
80
81         // clear all the allocations for this payment/credit
82         clear_cust_alloctions($_SESSION['alloc']->type, $_SESSION['alloc']->trans_no);
83
84         // now add the new allocations
85         $total_allocated = 0;
86         foreach ($_SESSION['alloc']->allocs as $allocn_item)
87         {
88                 if ($allocn_item->current_allocated > 0)
89                 {
90                         add_cust_allocation($allocn_item->current_allocated,
91                                 $_SESSION['alloc']->type, $_SESSION['alloc']->trans_no,
92                         $allocn_item->type, $allocn_item->type_no, $_SESSION['alloc']->date_);
93
94                         update_debtor_trans_allocation($allocn_item->type, $allocn_item->type_no,
95                                 $allocn_item->current_allocated);
96                         $total_allocated += $allocn_item->current_allocated;
97
98                 }
99
100         }  /*end of the loop through the array of allocations made */
101
102         update_debtor_trans_allocation($_SESSION['alloc']->type,
103                 $_SESSION['alloc']->trans_no, $total_allocated);
104
105         commit_transaction();
106
107         clear_allocations();
108 }
109
110 //--------------------------------------------------------------------------------
111
112 if (isset($_POST['Process']))
113 {
114         if (check_data())
115         {
116                 handle_process();
117                 $_POST['Cancel'] = 1;
118         }
119 }
120
121 //--------------------------------------------------------------------------------
122
123 if (isset($_POST['Cancel']))
124 {
125         clear_allocations();
126         meta_forward($path_to_root . "/sales/allocations/customer_allocation_main.php");
127         exit;
128 }
129
130 //--------------------------------------------------------------------------------
131
132 function get_allocations_for_transaction($type, $trans_no)
133 {
134         clear_allocations();
135
136         $debtor = get_customer_trans($trans_no, $type);
137
138         $_SESSION['alloc'] = new allocation($trans_no, $type, $debtor["debtor_no"],
139                 $debtor["DebtorName"], $debtor["Total"], sql2date($debtor["tran_date"]));
140
141         /* Now populate the array of possible (and previous actual) allocations for this customer */
142         /*First get the transactions that have outstanding balances ie Total-alloc >0 */
143
144         $trans_items = get_allocatable_to_cust_transactions($_SESSION['alloc']->person_id);
145
146         while ($myrow = db_fetch($trans_items))
147         {
148                 $_SESSION['alloc']->add_item($myrow["type"], $myrow["trans_no"],
149                         sql2date($myrow["tran_date"]), sql2date($myrow["due_date"]),
150                         $myrow["Total"], // trans total
151                         $myrow["alloc"], // trans total allocated
152                         0); // this allocation
153         }
154
155
156         /* Now get trans that might have previously been allocated to by this trans
157         NB existing entries where still some of the trans outstanding entered from
158         above logic will be overwritten with the prev alloc detail below */
159
160         $trans_items = get_allocatable_to_cust_transactions($_SESSION['alloc']->person_id, $trans_no, $type);
161
162         while ($myrow = db_fetch($trans_items))
163         {
164                 $_SESSION['alloc']->add_or_update_item ($myrow["type"], $myrow["trans_no"],
165                         sql2date($myrow["tran_date"]), sql2date($myrow["due_date"]),
166                         $myrow["Total"], $myrow["alloc"] - $myrow["amt"], $myrow["amt"]);
167         }
168 }
169
170 //--------------------------------------------------------------------------------
171
172 function edit_allocations_for_transaction($type, $trans_no)
173 {
174         global $table_style;
175
176         start_form(false, true);
177
178     display_heading(sprintf(_("Allocation of %s # %d"), systypes::name($_SESSION['alloc']->type),$_SESSION['alloc']->trans_no));
179
180     display_heading($_SESSION['alloc']->person_name);
181
182     display_heading2(_("Date:") . " <b>" . $_SESSION['alloc']->date_ . "</b>");
183     display_heading2(_("Total:") . " <b>" . price_format($_SESSION['alloc']->amount) . "</b>");
184
185     echo "<br>";
186
187     if (count($_SESSION['alloc']->allocs) > 0)
188     {
189                 start_table($table_style);
190
191                 $th = array(_("Transaction Type"), _("#"), _("Date"), _("Due Date"), _("Amount"),
192                         _("Other Allocations"), _("This Allocation"), _("Left to Allocate"), "", "");
193
194                 table_header($th);
195
196         $k = $counter = $total_allocated = 0;
197
198         foreach ($_SESSION['alloc']->allocs as $allocn_item)
199         {
200                 alt_table_row_color($k);
201
202             label_cell(systypes::name($allocn_item->type));
203                 label_cell(get_trans_view_str($allocn_item->type, $allocn_item->type_no));
204                 label_cell($allocn_item->date_, "align=right");
205                 label_cell($allocn_item->due_date, "align=right");
206                 amount_cell($allocn_item->amount);
207                         amount_cell($allocn_item->amount_allocated);
208
209             if (!check_num('amount' . $counter))
210                 $_POST['amount' . $counter] = price_format($allocn_item->current_allocated);
211             amount_cells(null, 'amount' . $counter, $_POST['amount' . $counter]);
212
213                 $un_allocated = round($allocn_item->amount - $allocn_item->amount_allocated, 6);
214                 hidden("un_allocated" . $counter, $un_allocated);
215                 amount_cell($un_allocated);
216
217                         label_cell("<a href='#' name=Alloc$counter onclick='allocate_all(this.name.substr(5));return true;'>"
218                                          . _("All") . "</a>");
219                         label_cell("<a href='#' name=DeAll$counter onclick='allocate_none(this.name.substr(5));return true;'>"
220                                          . _("None") . "</a>");
221                         end_row();
222
223             $total_allocated += input_num('amount' . $counter);
224             $counter++;
225         }
226
227         label_row(_("Total Allocated"), price_format($total_allocated),
228                 "colspan=6 align=right", "nowrap align=right");
229         if ($_SESSION['alloc']->amount - $total_allocated < 0)
230         {
231                 $font1 = "<font color=red>";
232                 $font2 = "</font>";
233         }
234         else
235                 $font1 = $font2 = "";
236                 $left_to_allocate = $_SESSION['alloc']->amount - $total_allocated;
237                 $left_to_allocate = price_format($left_to_allocate);
238         label_row(_("Left to Allocate"), $font1 . $left_to_allocate . $font2,
239                 "colspan=6 align=right ", "nowrap align=right");
240         end_table(1);
241
242         hidden('TotalNumberOfAllocs', $counter);
243                 hidden('left_to_allocate', $left_to_allocate);
244         submit_center_first('UpdateDisplay', _("Update"));
245         submit('Process', _("Process"));
246         }
247         else
248         {
249         display_note(_("There are no unsettled transactions to allocate."), 0, 1);
250     }
251
252         submit_center_last('Cancel', _("Back to Allocations"));
253
254         end_form();
255 }
256
257 //--------------------------------------------------------------------------------
258
259 if (isset($_GET['trans_no']) && isset($_GET['trans_type']))
260 {
261         get_allocations_for_transaction($_GET['trans_type'], $_GET['trans_no']);
262 }
263
264 if (isset($_SESSION['alloc']))
265 {
266         edit_allocations_for_transaction($_SESSION['alloc']->type, $_SESSION['alloc']->trans_no);
267 }
268
269 //--------------------------------------------------------------------------------
270
271 end_page();
272
273 ?>