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