Rewritten sales shipping cost taxation, improved shipping cost handling in sales...
[fa-stable.git] / inventory / includes / db / items_db.inc
1 <?php
2 /**********************************************************************
3     Copyright (C) FrontAccounting, LLC.
4         Released under the terms of the GNU General Public License, GPL, 
5         as published by the Free Software Foundation, either version 3 
6         of the License, or (at your option) any later version.
7     This program is distributed in the hope that it will be useful,
8     but WITHOUT ANY WARRANTY; without even the implied warranty of
9     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
10     See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
11 ***********************************************************************/
12 function update_item($stock_id, $description, $long_description, $category_id, 
13         $tax_type_id, $units='', $mb_flag='', $sales_account, $inventory_account, 
14         $cogs_account,  $adjustment_account, $wip_account, $dimension_id, 
15         $dimension2_id, $no_sale, $editable, $no_purchase,
16         $depreciation_method = 'D', $depreciation_rate=100, $depreciation_factor=1,
17         $depreciation_start=null, $fa_class_id=null, $vat_category='', $shipper_id=0)
18 {
19         $sql = "UPDATE ".TB_PREF."stock_master SET long_description=".db_escape($long_description).",
20                 description=".db_escape($description).",
21                 category_id=".db_escape($category_id).",
22                 sales_account=".db_escape($sales_account).",
23                 inventory_account=".db_escape($inventory_account).",
24                 cogs_account=".db_escape($cogs_account).",
25                 adjustment_account=".db_escape($adjustment_account).",
26                 wip_account=".db_escape($wip_account).",
27                 dimension_id=".db_escape($dimension_id).",
28                 dimension2_id=".db_escape($dimension2_id).",
29                 tax_type_id=".db_escape($tax_type_id).",
30                 no_sale=".db_escape($no_sale).",
31                 no_purchase=".db_escape($no_purchase).",
32                 editable=".db_escape($editable).",
33                 depreciation_method=".db_escape($depreciation_method).",
34                 depreciation_rate=".db_escape($depreciation_rate).",
35                 depreciation_factor=".db_escape($depreciation_factor).",
36                 fa_class_id=".db_escape($fa_class_id).",
37                 shipper_id=".db_escape($shipper_id);
38
39         if ($units != '')
40                 $sql .= ", units=".db_escape($units);
41
42         if ($mb_flag != '')
43                 $sql .= ", mb_flag=".db_escape($mb_flag);
44
45         if ($vat_category != '')
46                 $sql .= ", vat_category=".db_escape($vat_category);
47
48         if (isset($depreciation_start)) {
49                 $sql .= ", depreciation_start='".date2sql($depreciation_start)."'"
50                         .", depreciation_date='".date2sql($depreciation_start)."'";
51         }
52
53         $sql .= " WHERE stock_id=".db_escape($stock_id);
54
55         db_query($sql, "The item could not be updated");
56
57         update_item_code(-1, $stock_id, $stock_id, $description, $category_id, 1, 0);
58 }
59
60 function add_item($stock_id, $description, $long_description, $category_id, 
61         $tax_type_id, $units, $mb_flag, $sales_account, $inventory_account, 
62         $cogs_account, $adjustment_account,     $wip_account, $dimension_id, 
63         $dimension2_id, $no_sale, $editable, $no_purchase,
64         $depreciation_method='D', $depreciation_rate=100,  $depreciation_factor=1, $depreciation_start=null,
65         $fa_class_id=null, $vat_category=0, $shipper_id=0)
66 {
67         $sql = "INSERT INTO ".TB_PREF."stock_master (stock_id, description, long_description, category_id,
68                 tax_type_id, units, mb_flag, sales_account, inventory_account, cogs_account,
69                 adjustment_account, wip_account, dimension_id, dimension2_id, no_sale, no_purchase, editable, vat_category,
70                 depreciation_method, depreciation_rate, depreciation_factor"
71                 .(isset($depreciation_start) ? ", depreciation_start, depreciation_date, fa_class_id" : "")
72                 .",shipper_id) VALUES (".db_escape($stock_id).", ".db_escape($description).", ".db_escape($long_description).",
73                 ".db_escape($category_id).", ".db_escape($tax_type_id).", "
74                 .db_escape($units).", ".db_escape($mb_flag).",
75                 ".db_escape($sales_account).", ".db_escape($inventory_account)
76                 .", ".db_escape($cogs_account).",".db_escape($adjustment_account)
77                 .", ".db_escape($wip_account).", "
78                 .db_escape($dimension_id).", ".db_escape($dimension2_id).","
79                 .db_escape($no_sale).","
80                 .db_escape($no_purchase).","
81                 .db_escape($editable).",".db_escape($vat_category).","
82                 .db_escape($depreciation_method).",".db_escape($depreciation_rate).",".db_escape($depreciation_factor)
83                 .(isset($depreciation_start) ? ",'".date2sql($depreciation_start)."','".date2sql($depreciation_start)."',".db_escape($fa_class_id) : "")
84                 .",".db_escape($shipper_id).")";
85
86         db_query($sql, "The item could not be added");
87
88         $sql = "INSERT INTO ".TB_PREF."loc_stock (loc_code, stock_id)
89                 SELECT loc_code, ".db_escape($stock_id)
90                 ." FROM ".TB_PREF."locations";
91
92         db_query($sql, "The item locstock could not be added");
93
94         add_item_code($stock_id, $stock_id, $description, $category_id, 1, 0);
95 }
96
97 function delete_item($stock_id)
98 {
99         $sql="DELETE FROM ".TB_PREF."stock_master WHERE stock_id=".db_escape($stock_id);
100         db_query($sql, "could not delete stock item");
101
102         /*and cascade deletes in loc_stock */
103         $sql ="DELETE FROM ".TB_PREF."loc_stock WHERE stock_id=".db_escape($stock_id);
104         db_query($sql, "could not delete stock item loc stock");
105
106         /*and cascade deletes in purch_data */
107         $sql ="DELETE FROM ".TB_PREF."purch_data WHERE stock_id=".db_escape($stock_id);
108         db_query($sql, "could not delete stock item purch data");
109
110         /*and cascade deletes in prices */
111         $sql ="DELETE FROM ".TB_PREF."prices WHERE stock_id=".db_escape($stock_id);
112         db_query($sql, "could not delete stock item prices");
113
114         /*and cascade delete the bill of material if any */
115         $sql = "DELETE FROM ".TB_PREF."bom WHERE parent=".db_escape($stock_id);
116         db_query($sql, "could not delete stock item bom");
117
118         delete_item_kit($stock_id);
119 }
120
121 function get_item($stock_id)
122 {
123         $sql = "SELECT item.*, taxtype.name AS tax_type_name
124                 FROM ".TB_PREF."stock_master item,"
125                         .TB_PREF."item_tax_types taxtype
126                 WHERE taxtype.id=item.tax_type_id
127                 AND stock_id=".db_escape($stock_id);
128         $result = db_query($sql,"an item could not be retreived");
129
130         return db_fetch_assoc($result);
131 }
132
133 function get_items($fixed_asset = 0)
134 {
135         $sql = "SELECT * FROM ".TB_PREF."stock_master WHERE fixed_asset=".db_escape($fixed_asset);
136         return db_query($sql,"items could not be retreived");
137 }
138
139 function item_in_foreign_codes($stock_id)
140 {
141         $sqls=  array(
142         "SELECT COUNT(*) FROM "
143                 .TB_PREF."stock_moves WHERE stock_id=".db_escape($stock_id) =>
144          _('Cannot delete this item because there are stock movements that refer to this item.'),
145         "SELECT COUNT(*) FROM "
146                 .TB_PREF."bom WHERE component=".db_escape($stock_id)=>
147          _('Cannot delete this item record because there are bills of material that require this part as a component.'),
148         "SELECT COUNT(*) FROM "
149                 .TB_PREF."sales_order_details WHERE stk_code=".db_escape($stock_id) =>
150          _('Cannot delete this item because there are existing sales order items for it.'),
151         "SELECT COUNT(*) FROM "
152                 .TB_PREF."purch_order_details WHERE item_code=".db_escape($stock_id)=>
153          _('Cannot delete this item because there are existing purchase order items for it.'),
154         "SELECT COUNT(*) FROM "
155                 .TB_PREF."sales_orders WHERE ship_via=".db_escape($stock_id)=>
156          _('Cannot delete this item because there are existing sales transactions for it.'),
157         );
158
159         $msg = '';
160
161         foreach($sqls as $sql=>$err) {
162                 $result = db_query($sql, "could not query stock usage");
163                 $myrow = db_fetch_row($result);
164                 if ($myrow[0] > 0) 
165                 {
166                         $msg = $err; break;
167                 }
168         }
169         if ($msg == '') {
170
171                 $kits = get_where_used($stock_id);
172                 $num_kits = db_num_rows($kits);
173                 if ($num_kits) {
174                         $msg = _("This item cannot be deleted because some code aliases 
175                                 or foreign codes was entered for it, or there are kits defined 
176                                 using this item as component")
177                                 .':<br>';
178
179                         while($num_kits--) {
180                                 $kit = db_fetch($kits);
181                                 $msg .= "'".$kit[0]."'";
182                                 if ($num_kits) $msg .= ',';
183                         }
184
185                 }
186         }
187         return $msg;
188 }
189
190 function get_items_search($description, $type)
191 {
192         global $SysPrefs;
193
194         $sql = "SELECT COUNT(i.item_code) AS kit, i.item_code, i.description, c.description category
195                 FROM ".TB_PREF."stock_master s, ".TB_PREF."item_codes i
196                         LEFT JOIN ".TB_PREF."stock_category c ON i.category_id=c.category_id
197                 WHERE i.stock_id=s.stock_id
198                         AND !i.inactive AND !s.inactive
199                         AND (  i.item_code LIKE " . db_escape("%" . $description. "%") . " OR 
200                                 i.description LIKE " . db_escape("%" . get_post("description"). "%") . " OR 
201                                 c.description LIKE " . db_escape("%" . get_post("description"). "%") . ") ";
202
203         switch ($type) {
204                 case "sales":
205                         $sql .= " AND !s.no_sale AND mb_flag <> 'F'";
206                         break;
207                 case "manufactured":
208                         $sql .= " AND mb_flag = 'M'";
209                         break;
210         case "purchasable":
211                 $sql .= " AND NOT no_purchase AND mb_flag <> 'F' AND i.item_code=i.stock_id";
212                 break;
213                 case "costable":
214                         $sql .= " AND mb_flag <> 'D' AND mb_flag <> 'F' AND  i.item_code=i.stock_id";
215                         break;
216                 case "component":
217                         $parent = $_GET['parent'];
218                         $sql .= " AND  i.item_code=i.stock_id AND i.stock_id <> '$parent' AND mb_flag <> 'F' ";
219                         break;
220                 case "kits":
221                         $sql .= " AND !i.is_foreign AND i.item_code!=i.stock_id AND mb_flag <> 'F'";
222                         break;
223                 case "all":
224                         $sql .= " AND mb_flag <> 'F' AND i.item_code=i.stock_id";
225                         break;
226         }
227
228         if (isset($SysPrefs->max_rows_in_search))
229                 $limit = $SysPrefs->max_rows_in_search;
230         else
231                 $limit = 10;
232
233         $sql .= " GROUP BY i.item_code ORDER BY i.description LIMIT 0,".(int)($limit);
234
235         return db_query($sql, "Failed in retreiving item list.");
236 }