Fixed many minor bugs, new ones as well as debtor_trans related.
[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 function edit_allocations_for_transaction($type, $trans_no)
176 {
177         global $table_style;
178
179     display_heading(sprintf(_("Allocation of %s # %d"), systypes::name($_SESSION['alloc']->type),$_SESSION['alloc']->trans_no));
180
181     display_heading($_SESSION['alloc']->person_name);
182
183     display_heading2(_("Date:") . " <b>" . $_SESSION['alloc']->date_ . "</b>");
184     display_heading2(_("Total:") . " <b>" . price_format($_SESSION['alloc']->amount) . "</b>");
185
186     echo "<br>";
187
188         start_form(false, true);
189
190     if (count($_SESSION['alloc']->allocs) > 0)
191     {
192                 start_table($table_style);
193
194                 $th = array(_("Transaction Type"), _("#"), _("Date"), _("Due Date"), _("Amount"),
195                         _("Other Allocations"), _("This Allocation"), _("Left to Allocate"), "", "");
196
197                 table_header($th);
198
199         $k = $counter = $total_allocated = 0;
200
201         foreach ($_SESSION['alloc']->allocs as $allocn_item)
202         {
203                 alt_table_row_color($k);
204
205             label_cell(systypes::name($allocn_item->type));
206                 label_cell(get_trans_view_str($allocn_item->type, $allocn_item->type_no));
207                 label_cell($allocn_item->date_, "align=right");
208                 label_cell($allocn_item->due_date, "align=right");
209                 amount_cell($allocn_item->amount);
210                         amount_cell($allocn_item->amount_allocated);
211
212             if (!check_num('amount' . $counter))
213                 $_POST['amount' . $counter] = price_format($allocn_item->current_allocated);
214             amount_cells(null, 'amount' . $counter, $_POST['amount' . $counter]);
215
216                 $un_allocated = round($allocn_item->amount - $allocn_item->amount_allocated, 6);
217                 //hidden("un_allocated" . $counter, $un_allocated);
218                 amount_cell($un_allocated);
219
220                         label_cell("<a href='#' name='Alloc$counter' onclick='allocate_all(this.name.substr(5));return true;'>"
221                                          . _("All") . "</a>");
222                         //label_cell("<a href='#' name='DeAll$counter' onclick='allocate_none(this.name.substr(5));return true;'>"
223                         //               . _("None") . "</a>");
224                         label_cell("<a href='#' name='DeAll$counter' onclick='allocate_none(this.name.substr(5));return true;'>"
225                                          . _("None") . "</a>".hidden("un_allocated" . $counter, $un_allocated, false));
226                         end_row();
227
228             $total_allocated += input_num('amount' . $counter);
229             $counter++;
230         }
231
232         label_row(_("Total Allocated"), price_format($total_allocated),
233                 "colspan=6 align=right", "nowrap align=right id='total_allocated'");
234         if ($_SESSION['alloc']->amount - $total_allocated < 0)
235         {
236                 $font1 = "<font color=red>";
237                 $font2 = "</font>";
238         }
239         else
240                 $font1 = $font2 = "";
241                 $left_to_allocate = $_SESSION['alloc']->amount - $total_allocated;
242                 $left_to_allocate = price_format($left_to_allocate);
243         label_row(_("Left to Allocate"), $font1 . $left_to_allocate . $font2,
244                 "colspan=6 align=right ", "nowrap align=right id='left_to_allocate'");
245         end_table(1);
246
247         hidden('TotalNumberOfAllocs', $counter);
248 //              hidden('left_to_allocate', $left_to_allocate);
249         submit_center_first('UpdateDisplay', _("Update"));
250         submit('Process', _("Process"));
251                 submit_center_last('Cancel', _("Back to Allocations"));
252         }
253         else
254         {
255         display_note(_("There are no unsettled transactions to allocate."), 0, 1);
256                 submit_center('Cancel', _("Back to Allocations"));
257     }
258
259         end_form();
260 }
261
262 //--------------------------------------------------------------------------------
263
264 if (isset($_GET['trans_no']) && isset($_GET['trans_type']))
265 {
266         get_allocations_for_transaction($_GET['trans_type'], $_GET['trans_no']);
267 }
268
269 if (isset($_SESSION['alloc']))
270 {
271         edit_allocations_for_transaction($_SESSION['alloc']->type, $_SESSION['alloc']->trans_no);
272 }
273
274 //--------------------------------------------------------------------------------
275
276 end_page();
277
278 ?>