Rushabh Mehta | 3d2622c | 2016-04-25 17:53:42 +0530 | [diff] [blame] | 1 | frappe.provide('erpnext.stock'); |
| 2 | |
| 3 | erpnext.stock.ItemDashboard = Class.extend({ |
| 4 | init: function(opts) { |
| 5 | $.extend(this, opts); |
| 6 | this.make(); |
| 7 | }, |
| 8 | make: function() { |
| 9 | var me = this; |
| 10 | this.start = 0; |
| 11 | if(!this.sort_by) { |
| 12 | this.sort_by = 'projected_qty'; |
| 13 | this.sort_order = 'asc'; |
| 14 | } |
| 15 | |
| 16 | this.content = $(frappe.render_template('item_dashboard')).appendTo(this.parent); |
| 17 | this.result = this.content.find('.result'); |
| 18 | |
| 19 | // move |
| 20 | this.content.on('click', '.btn-move', function() { |
| 21 | erpnext.stock.move_item($(this).attr('data-item'), $(this).attr('data-warehouse'), |
| 22 | null, $(this).attr('data-actual_qty'), null, function() { me.refresh(); }); |
| 23 | }); |
| 24 | |
| 25 | this.content.on('click', '.btn-add', function() { |
| 26 | erpnext.stock.move_item($(this).attr('data-item'), null, $(this).attr('data-warehouse'), |
| 27 | $(this).attr('data-actual_qty'), $(this).attr('data-rate'), |
| 28 | function() { me.refresh(); }); |
| 29 | }); |
| 30 | |
| 31 | // more |
| 32 | this.content.find('.btn-more').on('click', function() { |
| 33 | me.start += 20; |
| 34 | me.refresh(); |
| 35 | }); |
| 36 | |
| 37 | }, |
| 38 | refresh: function() { |
| 39 | if(this.before_refresh) { |
| 40 | this.before_refresh(); |
| 41 | } |
| 42 | |
| 43 | var me = this; |
| 44 | frappe.call({ |
| 45 | method: 'erpnext.stock.dashboard.item_dashboard.get_data', |
| 46 | args: { |
| 47 | item_code: this.item_code, |
| 48 | warehouse: this.warehouse, |
Rushabh Mehta | 057db06 | 2016-11-08 12:40:04 +0530 | [diff] [blame] | 49 | item_group: this.item_group, |
Rushabh Mehta | 3d2622c | 2016-04-25 17:53:42 +0530 | [diff] [blame] | 50 | start: this.start, |
| 51 | sort_by: this.sort_by, |
| 52 | sort_order: this.sort_order, |
| 53 | }, |
| 54 | callback: function(r) { |
| 55 | me.render(r.message); |
| 56 | } |
| 57 | }); |
| 58 | }, |
| 59 | render: function(data) { |
| 60 | if(this.start===0) { |
| 61 | this.max_count = 0; |
| 62 | this.result.empty(); |
| 63 | } |
| 64 | |
| 65 | var context = this.get_item_dashboard_data(data, this.max_count, true); |
| 66 | this.max_count = this.max_count; |
| 67 | |
| 68 | // show more button |
Rushabh Mehta | aed79e9 | 2016-06-02 17:49:16 +0530 | [diff] [blame] | 69 | if(data && data.length===21) { |
Rushabh Mehta | 3d2622c | 2016-04-25 17:53:42 +0530 | [diff] [blame] | 70 | this.content.find('.more').removeClass('hidden'); |
| 71 | |
| 72 | // remove the last element |
| 73 | data.splice(-1); |
| 74 | } else { |
| 75 | this.content.find('.more').addClass('hidden'); |
| 76 | } |
| 77 | |
Stavros Anastasiadis | 58b5878 | 2017-10-05 16:14:50 +0300 | [diff] [blame] | 78 | // If not any stock in any warehouses provide a message to end user |
| 79 | if (context.data.length > 0) { |
| 80 | $(frappe.render_template('item_dashboard_list', context)).appendTo(this.result); |
| 81 | } else { |
| 82 | var message = __(" Currently no stock available in any warehouse") |
| 83 | $("<span class='small'> <i class='fa fa-exclamation-triangle' aria-hidden='true'></i>"+message+"</span>").appendTo(this.result); |
| 84 | } |
Rushabh Mehta | 3d2622c | 2016-04-25 17:53:42 +0530 | [diff] [blame] | 85 | }, |
| 86 | get_item_dashboard_data: function(data, max_count, show_item) { |
| 87 | if(!max_count) max_count = 0; |
Rushabh Mehta | 0dcb861 | 2016-05-31 07:22:37 +0530 | [diff] [blame] | 88 | if(!data) data = []; |
Rushabh Mehta | 3d2622c | 2016-04-25 17:53:42 +0530 | [diff] [blame] | 89 | data.forEach(function(d) { |
| 90 | d.actual_or_pending = d.projected_qty + d.reserved_qty + d.reserved_qty_for_production; |
| 91 | d.pending_qty = 0; |
| 92 | d.total_reserved = d.reserved_qty + d.reserved_qty_for_production; |
| 93 | if(d.actual_or_pending > d.actual_qty) { |
| 94 | d.pending_qty = d.actual_or_pending - d.actual_qty; |
| 95 | } |
| 96 | |
| 97 | max_count = Math.max(d.actual_or_pending, d.actual_qty, |
| 98 | d.total_reserved, max_count); |
| 99 | }); |
| 100 | return { |
| 101 | data: data, |
| 102 | max_count: max_count, |
| 103 | show_item: show_item || false |
| 104 | } |
| 105 | } |
| 106 | }) |
| 107 | |
| 108 | erpnext.stock.move_item = function(item, source, target, actual_qty, rate, callback) { |
| 109 | var dialog = new frappe.ui.Dialog({ |
| 110 | title: target ? __('Add Item') : __('Move Item'), |
| 111 | fields: [ |
| 112 | {fieldname: 'item_code', label: __('Item'), |
| 113 | fieldtype: 'Link', options: 'Item', read_only: 1}, |
| 114 | {fieldname: 'source', label: __('Source Warehouse'), |
| 115 | fieldtype: 'Link', options: 'Warehouse', read_only: 1}, |
| 116 | {fieldname: 'target', label: __('Target Warehouse'), |
| 117 | fieldtype: 'Link', options: 'Warehouse', reqd: 1}, |
| 118 | {fieldname: 'qty', label: __('Quantity'), reqd: 1, |
| 119 | fieldtype: 'Float', description: __('Available {0}', [actual_qty]) }, |
| 120 | {fieldname: 'rate', label: __('Rate'), fieldtype: 'Currency', hidden: 1 }, |
| 121 | ], |
| 122 | }) |
| 123 | dialog.show(); |
| 124 | dialog.get_field('item_code').set_input(item); |
| 125 | |
| 126 | if(source) { |
| 127 | dialog.get_field('source').set_input(source); |
| 128 | } else { |
| 129 | dialog.get_field('source').df.hidden = 1; |
| 130 | dialog.get_field('source').refresh(); |
| 131 | } |
| 132 | |
| 133 | if(rate) { |
Rushabh Mehta | 5dfe20c | 2016-04-26 12:59:08 +0530 | [diff] [blame] | 134 | dialog.get_field('rate').set_value(rate); |
Rushabh Mehta | 3d2622c | 2016-04-25 17:53:42 +0530 | [diff] [blame] | 135 | dialog.get_field('rate').df.hidden = 0; |
| 136 | dialog.get_field('rate').refresh(); |
| 137 | } |
| 138 | |
| 139 | if(target) { |
| 140 | dialog.get_field('target').df.read_only = 1; |
| 141 | dialog.get_field('target').value = target; |
| 142 | dialog.get_field('target').refresh(); |
| 143 | } |
| 144 | |
| 145 | dialog.set_primary_action(__('Submit'), function() { |
Rushabh Mehta | 5dfe20c | 2016-04-26 12:59:08 +0530 | [diff] [blame] | 146 | var values = dialog.get_values(); |
Rushabh Mehta | 3d2622c | 2016-04-25 17:53:42 +0530 | [diff] [blame] | 147 | if(!values) { |
| 148 | return; |
| 149 | } |
| 150 | if(source && values.qty > actual_qty) { |
| 151 | frappe.msgprint(__('Quantity must be less than or equal to {0}', [actual_qty])); |
| 152 | return; |
| 153 | } |
| 154 | if(values.source === values.target) { |
| 155 | frappe.msgprint(__('Source and target warehouse must be different')); |
| 156 | } |
| 157 | |
| 158 | frappe.call({ |
| 159 | method: 'erpnext.stock.doctype.stock_entry.stock_entry_utils.make_stock_entry', |
| 160 | args: values, |
| 161 | callback: function(r) { |
| 162 | frappe.show_alert(__('Stock Entry {0} created', |
| 163 | ['<a href="#Form/Stock Entry/'+r.message.name+'">' + r.message.name+ '</a>'])); |
| 164 | dialog.hide(); |
| 165 | callback(r); |
| 166 | }, |
| 167 | }); |
| 168 | }); |
Rushabh Mehta | 5dfe20c | 2016-04-26 12:59:08 +0530 | [diff] [blame] | 169 | |
Rushabh Mehta | 1aa1c8a | 2016-04-29 12:19:59 +0530 | [diff] [blame] | 170 | $('<p style="margin-left: 10px;"><a class="link-open text-muted small">' |
| 171 | + __("Add more items or open full form") + '</a></p>') |
Rushabh Mehta | 5dfe20c | 2016-04-26 12:59:08 +0530 | [diff] [blame] | 172 | .appendTo(dialog.body) |
| 173 | .find('.link-open') |
| 174 | .on('click', function() { |
Rushabh Mehta | 1aa1c8a | 2016-04-29 12:19:59 +0530 | [diff] [blame] | 175 | frappe.model.with_doctype('Stock Entry', function() { |
| 176 | var doc = frappe.model.get_new_doc('Stock Entry'); |
| 177 | doc.from_warehouse = dialog.get_value('source'); |
| 178 | doc.to_warehouse = dialog.get_value('target'); |
Faris Ansari | ab74ca7 | 2017-05-30 12:54:42 +0530 | [diff] [blame] | 179 | var row = frappe.model.add_child(doc, 'items'); |
Rushabh Mehta | 1aa1c8a | 2016-04-29 12:19:59 +0530 | [diff] [blame] | 180 | row.item_code = dialog.get_value('item_code'); |
| 181 | row.f_warehouse = dialog.get_value('target'); |
| 182 | row.t_warehouse = dialog.get_value('target'); |
| 183 | row.qty = dialog.get_value('qty'); |
Nabin Hait | e68f32c | 2017-03-03 15:00:41 +0530 | [diff] [blame] | 184 | row.conversion_factor = 1; |
| 185 | row.transfer_qty = dialog.get_value('qty'); |
Rushabh Mehta | 1aa1c8a | 2016-04-29 12:19:59 +0530 | [diff] [blame] | 186 | row.basic_rate = dialog.get_value('rate'); |
| 187 | frappe.set_route('Form', doc.doctype, doc.name); |
| 188 | }) |
Rushabh Mehta | 5dfe20c | 2016-04-26 12:59:08 +0530 | [diff] [blame] | 189 | }); |
Stavros Anastasiadis | 58b5878 | 2017-10-05 16:14:50 +0300 | [diff] [blame] | 190 | } |