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