From 69f3453134438a3b1ee408053454aa15a7deedc0 Mon Sep 17 00:00:00 2001 From: guanhuan Date: Fri, 25 Oct 2024 09:48:57 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=8A=A0=E5=B7=A5=E7=B2=BE=E5=BA=A6?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/product_template.py | 13 +++++++------ sf_sale/models/quick_easy_order_old.py | 13 +++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index 6c6b1bf8..a73cd904 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -16,6 +16,12 @@ from OCC.Extend.DataExchange import write_stl_file class ResProductMo(models.Model): _inherit = 'product.template' + def _get_machining_precision(self): + machinings = self.env['sf.machining.accuracy'].sudo().search([]) + + list = [(m.sync_id, m.name) for m in machinings] + return list + model_file = fields.Binary('模型文件') categ_type = fields.Selection(string='产品的类别', related='categ_id.type', store=True) model_name = fields.Char('模型名称') @@ -23,12 +29,7 @@ class ResProductMo(models.Model): model_width = fields.Float('模型宽(mm)', digits=(16, 3)) model_height = fields.Float('模型高(mm)', digits=(16, 3)) model_volume = fields.Float('模型体积(m³)') - model_machining_precision = fields.Selection([ - ('0.10', '±0.10mm'), - ('0.05', '±0.05mm'), - ('0.03', '±0.03mm'), - ('0.02', '±0.02mm'), - ('0.01', '±0.01mm')], string='加工精度') + model_machining_precision = fields.Selection(selection=_get_machining_precision, string='加工精度') model_processing_panel = fields.Char('模型加工面板') model_remark = fields.Char('模型备注说明') length = fields.Float('长(mm)', digits=(16, 3)) diff --git a/sf_sale/models/quick_easy_order_old.py b/sf_sale/models/quick_easy_order_old.py index 4756a2c5..1c62b782 100644 --- a/sf_sale/models/quick_easy_order_old.py +++ b/sf_sale/models/quick_easy_order_old.py @@ -20,6 +20,12 @@ class QuickEasyOrder(models.Model): _description = '简易下单' _order = 'id desc' + def _get_machining_precision(self): + machinings = self.env['sf.machining.accuracy'].sudo().search([]) + + list = [(m.sync_id, m.name) for m in machinings] + return list + name = fields.Char('订单编号', default=lambda self: self.env['ir.sequence'].next_by_code('quick.easy.order')) model_length = fields.Float('长(mm)', digits=(16, 3)) model_width = fields.Float('宽(mm)', digits=(16, 3)) @@ -27,12 +33,7 @@ class QuickEasyOrder(models.Model): model_volume = fields.Float('体积(mm³)', digits=(16, 3)) model_processing_side = fields.Char('加工面', default='A') model_feature = fields.Char('特征') - machining_precision = fields.Selection([ - ('0.10', '±0.10mm'), - ('0.05', '±0.05mm'), - ('0.03', '±0.03mm'), - ('0.02', '±0.02mm'), - ('0.01', '±0.01mm')], string='加工精度', default='0.10') + machining_precision = fields.Selection(selection=_get_machining_precision, string='加工精度') material_id = fields.Many2one('sf.production.materials', '材料', tracking=True) material_model_id = fields.Many2one('sf.materials.model', '型号', domain="[('materials_id', '=', material_id)]", tracking=True) From 2fe8e0e356f4f45dac79c3c6be80bbf6bf2e021e Mon Sep 17 00:00:00 2001 From: guanhuan Date: Fri, 25 Oct 2024 11:11:24 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=B7=A5=E5=8D=95=E4=B8=8B=E5=8F=91?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_message/models/sf_message_workorder.py | 5 ++-- sf_message/views/mrp_workorder_views.xml | 31 +++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/sf_message/models/sf_message_workorder.py b/sf_message/models/sf_message_workorder.py index c531e013..e02f4bdd 100644 --- a/sf_message/models/sf_message_workorder.py +++ b/sf_message/models/sf_message_workorder.py @@ -85,11 +85,12 @@ class SFMessageWork(models.Model): def request_url(self): url = self.env['ir.config_parameter'].get_param('web.base.url') - action_id = self.env.ref('sf_message.mrp_workorder_action_notify').id + action_id = self.env.ref('sf_message.mrp_workorder_issued_action').id menu_id = self.env['ir.model.data'].search([('name', '=', 'module_stock_dropshipping')]).id + active_id = self.env['mrp.workcenter'].search([('name', '=', '工件装夹中心')]).id # 查询参数 params = {'menu_id': menu_id, 'action': action_id, 'model': 'mrp.workorder', - 'view_type': 'list', 'active_id': 1} + 'view_type': 'list', 'active_id': active_id} # 拼接查询参数 query_string = urlencode(params) # 拼接URL diff --git a/sf_message/views/mrp_workorder_views.xml b/sf_message/views/mrp_workorder_views.xml index 1e31fc6d..ab0a76a9 100644 --- a/sf_message/views/mrp_workorder_views.xml +++ b/sf_message/views/mrp_workorder_views.xml @@ -30,5 +30,36 @@

+ + + + 工单 + ir.actions.act_window + mrp.workorder + tree,form + + + + current + [('state', '!=', 'cancel'),('schedule_state', '=', '已排')] + {'search_default_product': 1, 'search_default_workcenter_id': + active_id,'search_default_ready': 1, 'search_default_progress': 1} + + +

+ 没有工单要做! +

+

+ 工作订单是作为制造订单的一部分执行的操作。 + 工序在物料清单中定义或直接添加到制造订单中。 +

+

+ 使用工作台工作中心控制面板直接登记车间中的操作. + 平板电脑为您的工人提供工作表,并允许他们报废产品,跟踪时间, + 发起维护请求,执行质量测试等. +

+
+
\ No newline at end of file From b9039ef46606748c32cb33fb16e2d943fe0da61b Mon Sep 17 00:00:00 2001 From: liaodanlong Date: Fri, 25 Oct 2024 14:01:38 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=88=80=E5=85=B7=E6=A0=87=E5=87=86?= =?UTF-8?q?=E5=BA=93page=E6=A0=B7=E5=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_base/static/js/customTable.js | 125 ++++++++++++++++++++++ sf_base/static/js/setTableWidth.js | 47 ++++++++ sf_base/static/js/updateTable.js | 159 ++++++++++++++++++++++++++++ sf_base/static/src/scss/change.scss | 52 +++++++++ sf_base/views/tool_views.xml | 6 ++ 5 files changed, 389 insertions(+) create mode 100644 sf_base/static/js/customTable.js create mode 100644 sf_base/static/js/setTableWidth.js create mode 100644 sf_base/static/js/updateTable.js create mode 100644 sf_base/static/src/scss/change.scss diff --git a/sf_base/static/js/customTable.js b/sf_base/static/js/customTable.js new file mode 100644 index 00000000..a3da6f4f --- /dev/null +++ b/sf_base/static/js/customTable.js @@ -0,0 +1,125 @@ +// 获取表格数据 +function getDomData() { + const dom = $('div[name=cutting_speed_ids]') + if (!dom.length) return + const table = dom.find('.o_list_table') + const thead = table.children('thead') + const tbody = table.children('tbody') + const tbody_child = tbody.children() + const hideTheadDom = thead.find('[data-name=process_capability]') + hideTheadDom.hide().next().hide() + hideTheadDom.before('精加工粗加工') + tbody_child.each(function () { + const dom = $(this).children('[name=process_capability]') + if(!dom.length) return + dom.css('cssText', 'display: none!important').next().css('cssText', 'display: none!important') + const isCu = dom.text() == '粗加工' // 是否粗加工 + const v = dom.next().text() // 切削速度 + dom.after(`${!isCu ? v : ''}${isCu ? v : ''}`) + setListenClick() + }) +return; + handleTbody(tbody, newTableData, ΦList, table) +} + +// 监听点击 +function setListenClick() { + $(document).click(function (e) { + if ($(e.target).attr('customSpeed')) { + const orginV = $('[customInput=1]').children('input').val() + $('[customInput=1]').parent().html(orginV) + const v = $(e.target).attr('val') + const is = $(e.target).attr('is') + $(e.target).html('') + const input = $('
') + input.children('input').val(v) + $(e.target).append(input) + input.children('input').focus() + input.children('input').select() + } else if ($(e.target).attr('customInput')) { + + } else { + const orginV = $('[customInput=1]').children('input').val() + $('[customInput=1]').parent().html(orginV) + const v = $(e.target).attr('val') + } + }) + $(document).off('change') // 防止重复绑定 + $(document).on('change', '[customInput] input', async function () { + $(this).parents('td').attr('val', $(this).val()) + $(this).parents('td').siblings('[customspeed]').attr('val', $(this).val()) + var eve1 = new Event('change') + var eve2 = new Event('input') + var eve3 = new Event('click') + let patchSpeedDom = $(this).parents('td').siblings('[name=cutting_speed]') + let patchProcessDom = $(this).parents('td').siblings('[name=process_capability]') + $(this).parents('td').siblings('[customspeed]').text('') // 清空其他加工类型的数据 + await timeOut(500) + patchProcessDom[0].dispatchEvent(eve3) + await timeOut(200) + const processVal = $(this).parent().attr('is') + patchProcessDom.find('select').val(`"${processVal}"`) // 设置源select的val为“加工类型 is”、 + patchProcessDom.attr("data-tooltip", `${processVal}`) + patchProcessDom.find('select')[0].dispatchEvent(eve1) + + patchSpeedDom[0].dispatchEvent(eve3) + await timeOut(200) + patchSpeedDom.find('input').val($(this).val()) + await timeOut(50) + patchSpeedDom.find('input')[0].dispatchEvent(eve2) + patchSpeedDom.find('input')[0].dispatchEvent(eve1) + }) + $(document).off('blur') // 防止重复绑定 + $(document).on('blur', '[customInput] input', async function () { + if(!$(this).length) return + + $(this).parents('td').siblings('[customspeed]').text('') // 清空其他加工类型的数据 + let patchProcessDom = $(this).parents('td').siblings('[name=process_capability]') + try { + patchProcessDom[0].dispatchEvent(new Event('click')) + const processVal = $(this).parent().attr('is') + patchProcessDom.find('select').val(`"${processVal}"`) // 设置源select的val为“加工类型 is”、 + patchProcessDom.attr("data-tooltip", `${processVal}`) + patchProcessDom.find('select')[0].dispatchEvent(new Event('change')) + } catch { + + } + + }) +} +function timeOut(time) { + return new Promise(resolve => { + setTimeout(() => { + resolve() + }, time) + }) +} + +function listenAdd() { + $('td.o_field_x2many_list_row_add a').click(async function () { + await timeOut(500) + const tr = $('.o_list_table').children('tbody').children('tr').eq(-2) + if(tr.children('td').eq(2).text() == '') { + const dom = tr.children('[name=process_capability]') + if(!dom.length) return + dom.css('cssText', 'display: none!important').next().css('cssText', 'display: none!important') + const isCu = dom.text() == '粗加工' // 是否粗加工 + const v = dom.next().text() // 切削速度 + dom.after(`${!isCu ? v : ''}${isCu ? v : ''}`) + } + }) +} + +function listenSave() { + $('.o_form_button_save').click( async function () { + await timeOut(1000) + if($(this).parent().next().length) return + $('th[customTh],td[cusomSpeed]').remove() + getDomData() + + }) +} + +listenAdd() +listenSave() +getDomData() diff --git a/sf_base/static/js/setTableWidth.js b/sf_base/static/js/setTableWidth.js new file mode 100644 index 00000000..571d46cf --- /dev/null +++ b/sf_base/static/js/setTableWidth.js @@ -0,0 +1,47 @@ +// 因为表格可以拖动设置宽度,所以需要用js设置初始宽度 +function setBasicParamTableWidth() { + // const _100px = 'th[data-name="cutting_blade_length"],th[data-name="cutting_blade_length"],th[data-name="name"],th[data-name="tip_handling_size"],th[data-name="cutting_depth_max"],th[data-name="diameter_inner_circle"],th[data-name="diameter_mounting_hole" ],th[data-name="radius_tip_re" ],th[data-name="is_chip_breaker"],th[data-name="chip_breaker_type_code"],th[data-name="blade_profile"]' + // const _65px = 'th[data-name="edge_angle"],th[data-name="relief_angle"],[data-name="total_length"],th[data-name="length"],th[data-name="thickness"],th[data-name="blade_number"]' + // const _80px = 'th[data-name="arbor_diameter"],th[data-name="head_height"],th[data-name="head_width"],th[data-name="head_length"],th[data-name="blade_diameter"],th[data-name="blade_length"] ,th[data-name="neck_length"] ,th[data-name="neck_diameter"] ,th[data-name="shank_diameter"],th[data-name="shank_length"],th[data-name="tip_diameter"],th[data-name="knife_tip_taper"],th[data-name="blade_helix_angle"] ,th[data-name="blade_width"],th[data-name="blade_depth"]' + // const _50px = 'th[data-name="pitch"],th[data-name="width"],th[data-name="height"]' + + const basicParamDom = $('.fixTableCss') + // const basicParamDom_100px = basicParamDom.find(_100px) // 四字以上 + // const basicParamDom_65px = basicParamDom.find(_65px) // 大概三个字加单位 + // const basicParamDom_80px = basicParamDom.find(_80px) // 大概四个字加单位 + // const basicParamDom_50px= basicParamDom.find(_50px) // 大概两个字加单位 + // + // basicParamDom_100px.css({'width': '100px', 'max-width': 'auto', ',min-width': 'auto'}) + // basicParamDom_65px.css({'width': '65px', 'max-width': 'auto', ',min-width': 'auto'}) + // basicParamDom_80px.css({'width': '80px', 'max-width': 'auto', ',min-width': 'auto'}) + // basicParamDom_50px.css({'width': '50px', 'max-width': 'auto', ',min-width': 'auto'}) + let dom = [] + try { + dom = basicParamDom.find('table').find('thead').children().children() + + } catch { + dom = [] + } + if (!dom) return + dom.each(function () { + if ($(this).hasClass('row_no') >= 0) { // 序号列 + // 不设置 通过css设置 + } + const text = $(this).text().split('(') + if ($(this).attr('data-name') == 'name' || text[0].length > 4) { + $(this).width('100px') + } else if(text[0].length == 4){ + $(this).width('80px') + } else if(text[0].length == 3){ + $(this).width('65px') + } else if(text[0].length == 2){ + $(this).width('50px') + } + + }) +} + +setBasicParamTableWidth() +$('.o_field_many2one_selection').on('click', $('#cutting_tool_material_id + ul'), function () { + setTimeout(setBasicParamTableWidth, 500) +}) diff --git a/sf_base/static/js/updateTable.js b/sf_base/static/js/updateTable.js new file mode 100644 index 00000000..beec2c94 --- /dev/null +++ b/sf_base/static/js/updateTable.js @@ -0,0 +1,159 @@ +// 获取表格数据 +function getDomData() { + const dom = $('#updateTable').prev() + if (!dom.length) return + const table = $('#updateTable').prev().find('.o_list_table') + const customTable = table.clone() + customTable.addClass('customTable') + table.parent().append(customTable) + table.hide() + const thead = customTable.children('thead') + const tbody = customTable.children('tbody') + const tableData = [] + const tbody_child = tbody.children() + + const tbody_child_len = tbody_child.length + + for (let v = 0; v < tbody_child_len; v++) { // 将数据取出来到tableData里面 + const data = tbody_child[v].innerText.split('\t') + // console.log('dom data',data) + const [index, deep, name, Φ, value] = data + tableData.push({index, deep, name, Φ, value}) + } + const ΦList = [...new Set(tableData.map(_ => _.name))] // ΦList去重 + const newTableData = {} + tableData.forEach(_ => { + const key = _.deep + '|' + _.Φ + !newTableData[key] ? newTableData[key] = {i: _.index} : ''; + if (_.Φ) { // 去除没有Φ的脏数据 + newTableData[key]['Φ' + _.Φ] = _.value + newTableData[key]['Φ' + _.Φ + 'i'] = _.index + } + }) + // console.log('qwdh',tableData, ΦList, newTableData); + + if (ΦList.filter(_ => _).length == 0) return; + handleThead(thead, ΦList) + + handleTbody(tbody, newTableData, ΦList, table) +} + +// 重新设置表头、 +function handleThead(thead, ΦList) { + const dom = thead.children().eq(0).children() + const len = dom.length + dom.eq(0).attr('rowspan', 2) + dom.eq(1).attr('rowspan', 2) + len == 5 ? dom.eq(2).attr('rowspan', 2) : '' + dom.eq(-2).attr('colspan', ΦList.length) + dom.eq(-1).remove() + + const tr = document.createElement('tr') + for (let v = 0; v < ΦList.length; v++) { + const th = document.createElement('th') + th.innerText = 'Φ' + ΦList[v] + tr.append(th) + } + thead.append(tr) +} + +// 重新设置表格 +function handleTbody(tbody, newTableData, ΦList, table) { + console.log(newTableData) + tbody.html('') + let i = 0 + const data = Object.keys(newTableData) + // data.sort((a, b) => { + // a = a.split('=')[1].split('%')[0] + // b = b.split('=')[1].split('%')[0] + // return a - b + // }) + // console.log('wqoqw ',ΦList) + data.forEach(_ => { + i++ + const tr = $('') + const td0 = $('') + td0.text(i) + tr.append(td0) + const lit = _.split('|') + // + const td1 = $('') + const td2 = $('') + td1.text(lit[0]) + td2.text(lit[1] || '') + tr.append(td1) + tr.append(td2) + ΦList.forEach(Φ => { + const td = $('') + td.text(newTableData[_]['Φ' + Φ]) + td.attr('col', newTableData[_]['Φ' + Φ + 'i']) + td.attr('val', newTableData[_]['Φ' + Φ]) + td.attr('coustomTd', 1) + tr.append(td) + }) + // // for (let j = 0; j < ΦList.length; j++) { + // // const td = document.createElement('td') + // // td.innerText = newTableData[data[v]][_] + // // th.append(td) + // // } + tbody.append(tr) + }) + // $(document).click(function (e) { + // if ($(e.target).attr('coustomTd')) { + // const orginV = $('[coustomInput=1]').children('input').val() + // $('[coustomInput=1]').parent().html(orginV) + // const v = $(e.target).attr('val') + // console.log($(e.target)); + // $(e.target).html('') + // const input = $('
') + // input.children('input').val(v) + // $(e.target).append(input) + // input.children('input').focus() + // input.children('input').select() + // } else if ($(e.target).attr('coustomInput')) { + // + // } else { + // const orginV = $('[coustomInput=1]').children('input').val() + // $('[coustomInput=1]').parent().html(orginV) + // const v = $(e.target).attr('val') + // } + // }) + // $(document).off('change') // 防止重复绑定 +// $(document).on('change', '[coustomInput] input', function () { +// $(this).parents('td').attr('val', $(this).val()); +// var eve1 = new Event('change'); +// var eve2 = new Event('input'); +// var eve3 = new Event('click'); +// const i = $(this).parents('td').attr('col'); +// let patchDom = table.find('tbody').children('tr').eq(i - 1); +// +// if (patchDom.length === 0) { +// console.error('No such row found'); +// return; +// } +// +// patchDom = patchDom.children().eq(-1); +// +// setTimeout(() => { +// if (patchDom.length === 0) { +// console.error('No such cell found'); +// return; +// } +// patchDom[0].dispatchEvent(eve3); // Simulate click event +// +// setTimeout(() => { +// patchDom = patchDom.find('input'); +// if (patchDom.length === 0) { +// console.error('No input found in the target cell'); +// return; +// } +// patchDom.val($(this).val()); +// patchDom[0].dispatchEvent(eve2); +// patchDom[0].dispatchEvent(eve1); +// }, 200); +// }, 500); +// }); + +} + +getDomData() \ No newline at end of file diff --git a/sf_base/static/src/scss/change.scss b/sf_base/static/src/scss/change.scss new file mode 100644 index 00000000..6102b815 --- /dev/null +++ b/sf_base/static/src/scss/change.scss @@ -0,0 +1,52 @@ +.o_list_renderer .o_list_table tbody > tr > td:not(.o_list_record_selector):not(.o_handle_cell):not(.o_list_button):not(.o_list_record_remove) { + white-space: nowrap !important; +} + +.text-truncate { + overflow: unset !important; + text-overflow: unset !important; + white-space: unset !important; +} + + +// 设置表格不超出页面宽度 +.o_form_view .o_field_widget .o_list_renderer { + width: calc(100% - 64px) !important; + margin:0 auto; + overflow: auto; +} + +// 表格针对处理 +.fixTableCss { + text-align: center; + .o_list_number_th,.o_list_number { + text-align: center!important; + } + .ui-sortable { + tr > td:first-child { + padding: 0!important; + } + } + .row_no { + padding: 0!important;; + width: 35px!important; + } + + th[data-name="total_length"],th[data-name="length"],th[data-name="thickness"] { + .flex-row-reverse { + span { + text-align: center; + } + } + } +} + +// 其他不能用js处理的表格 +.otherTableFix { + th[data-name="cutting_tool_material_id"] { + width: 100px!important; + } + th[data-name="ramping_angle_max"],th[data-name="ramping_angle_min"] { + width: 200px!important; + } +} \ No newline at end of file diff --git a/sf_base/views/tool_views.xml b/sf_base/views/tool_views.xml index 6b97f0ec..b2d53392 100644 --- a/sf_base/views/tool_views.xml +++ b/sf_base/views/tool_views.xml @@ -360,6 +360,7 @@ + @@ -380,6 +381,9 @@ + + + @@ -392,6 +396,8 @@ +
+ From 06eaebd0982f2b833faefdcd5caebee6068f3957 Mon Sep 17 00:00:00 2001 From: liaodanlong Date: Fri, 25 Oct 2024 14:02:37 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BA=A7=E5=93=81=E7=B1=BB=E5=88=AB?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E7=BC=BA=E9=99=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- quality_control/models/product_category.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/quality_control/models/product_category.py b/quality_control/models/product_category.py index 9b5535d4..17f26006 100644 --- a/quality_control/models/product_category.py +++ b/quality_control/models/product_category.py @@ -21,4 +21,12 @@ class ProductCategory(models.Model): args += [('name', 'not in', ['Saleable', 'Expenses', 'Deliveries'])] # 调用父类的 name_search 方法 - return super(ProductCategory, self).name_search(name, args=args, operator=operator, limit=limit) \ No newline at end of file + return super(ProductCategory, self).name_search(name, args=args, operator=operator, limit=limit) + + @api.model + def search(self, args, limit=100, offset=0, order=None, count=False): + # 添加过滤条件,确保只返回名称不在指定列表中的记录 + args += [('name', 'not in', ['Saleable', 'Expenses', 'Deliveries'])] + + # 调用父类的 search 方法 + return super(ProductCategory, self).search(args, limit=limit, offset=offset, order=order, count=count) \ No newline at end of file From 906a0ea7678c71a547222d3e1f24984ed18d54d9 Mon Sep 17 00:00:00 2001 From: liaodanlong Date: Fri, 25 Oct 2024 14:25:47 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E9=87=87=E8=B4=AD=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_sale/views/purchase_order_view.xml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/sf_sale/views/purchase_order_view.xml b/sf_sale/views/purchase_order_view.xml index 7a9836c5..f721d515 100644 --- a/sf_sale/views/purchase_order_view.xml +++ b/sf_sale/views/purchase_order_view.xml @@ -6,14 +6,20 @@ purchase.order - + + 1 +