Moving 2.0 development version to main trunk.
[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, 0))
42                 {
43                         display_error(_("The entry for one or more amounts is invalid or negative."));
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 if (isset($_POST['Process']))
115 {
116         if (check_data())
117         {
118                 handle_process();
119                 $_POST['Cancel'] = 1;
120         }
121 }
122 //--------------------------------------------------------------------------------
123
124 if (isset($_POST['Cancel']))
125 {
126         clear_allocations();
127         meta_forward($path_to_root . "/sales/allocations/customer_allocation_main.php");
128 }
129 //--------------------------------------------------------------------------------
130
131 function get_allocations_for_transaction($type, $trans_no)
132 {
133         clear_allocations();
134
135         $debtor = get_customer_trans($trans_no, $type);
136
137         $_SESSION['alloc'] = new allocation($trans_no, $type, $debtor["debtor_no"],
138                 $debtor["DebtorName"], $debtor["Total"], sql2date($debtor["tran_date"]));
139
140         /* Now populate the array of possible (and previous actual) allocations for this customer */
141         /*First get the transactions that have outstanding balances ie Total-alloc >0 */
142
143         $trans_items = get_allocatable_to_cust_transactions($_SESSION['alloc']->person_id);
144
145         while ($myrow = db_fetch($trans_items))
146         {
147                 $_SESSION['alloc']->add_item($myrow["type"], $myrow["trans_no"],
148                         sql2date($myrow["tran_date"]), sql2date($myrow["due_date"]),
149                         $myrow["Total"], // trans total
150                         $myrow["alloc"], // trans total allocated
151                         0); // this allocation
152         }
153
154         /* Now get trans that might have previously been allocated to by this trans
155         NB existing entries where still some of the trans outstanding entered from
156         above logic will be overwritten with the prev alloc detail below */
157
158         $trans_items = get_allocatable_to_cust_transactions($_SESSION['alloc']->person_id, $trans_no, $type);
159
160         while ($myrow = db_fetch($trans_items))
161         {
162                 $_SESSION['alloc']->add_or_update_item ($myrow["type"], $myrow["trans_no"],
163                         sql2date($myrow["tran_date"]), sql2date($myrow["due_date"]),
164                         $myrow["Total"], $myrow["alloc"] - $myrow["amt"], $myrow["amt"]);
165         }
166 }
167 //--------------------------------------------------------------------------------
168
169 function edit_allocations_for_transaction($type, $trans_no)
170 {
171         global $table_style;
172
173     display_heading(sprintf(_("Allocation of %s # %d"), systypes::name($_SESSION['alloc']->type),$_SESSION['alloc']->trans_no));
174
175     display_heading($_SESSION['alloc']->person_name);
176
177     display_heading2(_("Date:") . " <b>" . $_SESSION['alloc']->date_ . "</b>");
178     display_heading2(_("Total:") . " <b>" . price_format($_SESSION['alloc']->amount) . "</b>");
179
180     echo "<br>";
181
182         start_form(false, true);
183         div_start('alloc_tbl');
184     if (count($_SESSION['alloc']->allocs) > 0)
185     {
186                 start_table($table_style);
187
188                 $th = array(_("Transaction Type"), _("#"), _("Date"), _("Due Date"), _("Amount"),
189                         _("Other Allocations"), _("This Allocation"), _("Left to Allocate"), "", "");
190
191                 table_header($th);
192
193         $k = $counter = $total_allocated = 0;
194
195         foreach ($_SESSION['alloc']->allocs as $allocn_item)
196         {
197                         alt_table_row_color($k);
198
199             label_cell(systypes::name($allocn_item->type));
200                 label_cell(get_trans_view_str($allocn_item->type, $allocn_item->type_no));
201                 label_cell($allocn_item->date_, "align=right");
202                 label_cell($allocn_item->due_date, "align=right");
203                 amount_cell($allocn_item->amount);
204                         amount_cell($allocn_item->amount_allocated);
205
206             $_POST['amount' . $counter] = price_format($allocn_item->current_allocated);
207             amount_cells(null, 'amount' . $counter, price_format('amount' . $counter));
208
209                 $un_allocated = round($allocn_item->amount - $allocn_item->amount_allocated, 6);
210                 amount_cell($un_allocated);
211
212                         label_cell("<a href='#' name='Alloc$counter' onclick='allocate_all(this.name.substr(5));return true;'>"
213                                          . _("All") . "</a>");
214                         label_cell("<a href='#' name='DeAll$counter' onclick='allocate_none(this.name.substr(5));return true;'>"
215                                          . _("None") . "</a>".hidden("un_allocated" . $counter, $un_allocated, false));
216                         end_row();
217
218             $total_allocated += input_num('amount' . $counter);
219             $counter++;
220         }
221
222         label_row(_("Total Allocated"), price_format($total_allocated),
223                 "colspan=6 align=right", "nowrap align=right id='total_allocated'");
224         if ($_SESSION['alloc']->amount - $total_allocated < 0)
225         {
226                 $font1 = "<font color=red>";
227                 $font2 = "</font>";
228         }
229         else
230                 $font1 = $font2 = "";
231                 $left_to_allocate = $_SESSION['alloc']->amount - $total_allocated;
232                 $left_to_allocate = price_format($left_to_allocate);
233         label_row(_("Left to Allocate"), $font1 . $left_to_allocate . $font2,
234                 "colspan=6 align=right ", "nowrap align=right id='left_to_allocate'");
235         end_table(1);
236
237         hidden('TotalNumberOfAllocs', $counter);
238         submit_center_first('UpdateDisplay', _("Refresh"), _('Start again allocation of selected amount'), true);
239         submit('Process', _("Process"), true, _('Process allocations'), true);
240                 submit_center_last('Cancel', _("Back to Allocations"),_('Abandon allocations and return to selection of allocatable amounts'), true);
241         }
242         else
243         {
244         display_note(_("There are no unsettled transactions to allocate."), 0, 1);
245                 
246                 submit_center('Cancel', _("Back to Allocations"), true,
247                         _('Abandon allocations and return to selection of allocatable amounts'), true);
248     }
249         div_end();
250         end_form();
251 }
252
253 //--------------------------------------------------------------------------------
254
255 if (isset($_GET['trans_no']) && isset($_GET['trans_type']))
256 {
257         get_allocations_for_transaction($_GET['trans_type'], $_GET['trans_no']);
258 }
259 if(get_post('UpdateDisplay'))
260 {
261         $trans_no = $_SESSION['alloc']->trans_no;
262         $type = $_SESSION['alloc']->type;
263         clear_allocations();
264         get_allocations_for_transaction($type, $trans_no);
265         $Ajax->activate('alloc_tbl');
266 }
267
268 if (isset($_SESSION['alloc']))
269 {
270         edit_allocations_for_transaction($_SESSION['alloc']->type, $_SESSION['alloc']->trans_no);
271 }
272
273 //--------------------------------------------------------------------------------
274
275 end_page();
276
277 ?>