var cfg_products = new Object() function products_default_config(){ webix.ajax().get('/config', {'fields': 'main_products'}, { error: function(text, data, xhr) { msg = 'Error al consultar' msg_error(msg) }, success: function(text, data, xhr) { var values = data.json() cfg_products['inventario'] = values.chk_llevar_inventario cfg_products['predial'] = values.chk_config_cuenta_predial cfg_products['codigo_barras'] = values.chk_config_codigo_barras cfg_products['con_impuestos'] = values.chk_config_precio_con_impuestos cfg_products['default_unit'] = values.default_unidad cfg_products['default_tax'] = values.default_tax if(cfg_products['inventario']){ $$('grid_products').showColumn('existencia') } show('cant_by_packing', values.chk_use_packing) } }) } var products_controllers = { init: function(){ $$('cmd_new_product').attachEvent('onItemClick', cmd_new_product_click) $$("cmd_edit_product").attachEvent("onItemClick", cmd_edit_product_click) $$("cmd_delete_product").attachEvent("onItemClick", cmd_delete_product_click) $$("cmd_save_product").attachEvent("onItemClick", cmd_save_product_click) $$("cmd_cancel_product").attachEvent("onItemClick", cmd_cancel_product_click) $$("cmd_import_products").attachEvent("onItemClick", cmd_import_products_click) $$("cmd_products_add").attachEvent("onItemClick", cmd_products_add_click) $$('cmd_add_products_from_xml').attachEvent('onItemClick', cmd_add_products_from_xml_click) $$('cmd_save_products_add').attachEvent('onItemClick', cmd_save_products_add_click) $$('cmd_close_products_add').attachEvent('onItemClick', cmd_close_products_add_click) $$("chk_automatica").attachEvent("onChange", chk_automatica_change) $$("valor_unitario").attachEvent("onChange", valor_unitario_change) $$('precio_con_impuestos').attachEvent('onChange', precio_con_impuestos_change) $$('precio_con_impuestos').attachEvent('onTimedKeyPress', precio_con_impuestos_key_up); $$("chk_inventario").attachEvent("onChange", chk_inventario_change) $$('grid_products').attachEvent('onItemDblClick', cmd_edit_product_click) products_default_config() } } function configurar_producto(){ show('cuenta_predial', cfg_products['predial']) show('codigo_barras', cfg_products['codigo_barras']) show('precio_con_impuestos', cfg_products['con_impuestos']) show('chk_inventario', cfg_products['inventario']) show('txt_existencia', cfg_products['inventario']) show('txt_minimo', cfg_products['inventario']) } function get_categorias(){ webix.ajax().sync().get('/values/categorias', function(text, data){ var values = data.json() $$('categoria').getList().parse(values, 'plainjs') }) } function get_products(){ var grid = $$('grid_products') webix.ajax().get('/products', {}, { error: function(text, data, xhr) { msg_error('Error al consultar') }, success: function(text, data, xhr) { var values = data.json(); grid.clearAll(); if (values.ok){ grid.parse(values.rows, 'json'); grid.refresh() }; } }); } function cmd_new_product_click(id, e, node){ get_taxes() $$('unidad').getList().load('/values/unidades') configurar_producto() $$('form_product').setValues({ id: 0, es_activo_producto: true}) add_config({'key': 'id_product', 'value': ''}) get_new_key() get_categorias() $$('unidad').setValue(cfg_products['default_unit']) $$('grid_product_taxes').select(cfg_products['default_tax']) $$('grid_products').clearSelection() $$("multi_products").setValue("product_new") } function cmd_edit_product_click(){ get_taxes() $$('unidad').getList().load('/values/unidades') configurar_producto() var grid = $$('grid_products') var row = grid.getSelectedItem() if(row == undefined){ msg_error('Selecciona un Producto') return } $$('categoria').getList().load('/values/categorias') webix.ajax().get('/products', {id:row['id']}, { error: function(text, data, xhr) { msg_error() }, success: function(text, data, xhr){ var values = data.json() $$('form_product').setValues(values.row) add_config({'key': 'id_product', 'value': values.row.id}) for(i = 0; i < values.taxes.length; i++){ $$('grid_product_taxes').select(values.taxes[i], true) } } }) $$('multi_products').setValue('product_new') }; function delete_product(id){ webix.ajax().del('/products', {id:id}, function(text, xml, xhr){ var msg = 'Producto eliminado correctamente' if(xhr.status == 200){ $$('grid_products').remove(id) msg_ok(msg) }else{ msg = 'No se pudo eliminar' msg_error(msg) } }) } function cmd_delete_product_click(id, e, node){ var row = $$('grid_products').getSelectedItem() if (row == undefined){ msg_error('Selecciona un Producto') return } var msg = '¿Estás seguro de eliminar el Producto?

' msg += '(' + row['clave'] + ') ' + row['descripcion'] msg += '

ESTA ACCIÓN NO SE PUEDE DESHACER

Se recomienda ' msg += 'solo desactivar el producto en vez de eliminar' webix.confirm({ title: 'Eliminar Producto', ok: 'Si', cancel: 'No', type: 'confirm-error', text: msg, callback:function(result){ if (result){ delete_product(row['id']) } } }) } function validate_sat_key_product(key, text){ var result = false webix.ajax().sync().get('/values/satkey', {key:key}, function(text, data){ result = data.json() }) if(text){ if(result.ok){ return '' + result.text + '' }else{ return '' + result.text + '' } } return result.ok } function update_grid_products(values){ var msg = 'Producto agregado correctamente' if(values.new){ $$('form_product').clear() $$('grid_products').add(values.row) }else{ msg = 'Producto actualizado correctamente' $$("grid_products").updateItem(values.row['id'], values.row) } $$('grid_products').refresh() $$('multi_products').setValue('products_home') msg_ok(msg) } function cmd_save_product_click(id, e, node){ var msg = '' var form = this.getFormView() if(!form.validate()){ msg_error('Valores inválidos') return } var rows = $$('grid_product_taxes').getSelectedId(true, true) if (rows.length == 0){ msg_error('Selecciona un impuesto') return } var values = form.getValues(); if(!isFinite(values.cant_by_packing)){ msg_error('La cantidad por empaque debe ser un número') return } if(!validate_sat_key_product(values.clave_sat, false)){ msg_error('La clave SAT no existe') return } if(values.descripcion.length > 1000){ msg_error('Descripción con ' + values.descripcion.length + 'caracteres, captura solo 1000 caracteres') return } values['taxes'] = JSON.stringify(rows) webix.ajax().sync().post('products', values, { error:function(text, data, XmlHttpRequest){ msg = 'Ocurrio un error, consulta a soporte técnico' msg_error(msg) }, success:function(text, data, XmlHttpRequest){ var values = data.json(); if (values.ok) { update_grid_products(values) }else{ msg_error(values.msg) } } }) } function cmd_cancel_product_click(id, e, node){ $$("multi_products").setValue("products_home") }; function chk_automatica_change(new_value, old_value){ var value = Boolean(new_value) if (value){ var value = get_config('id_product') if(value){ $$("clave").setValue(value) $$("clave").refresh() }else{ get_new_key() } $$("clave").config.readonly = true $$('form_product').focus('clave_sat') } else { $$("clave").setValue('') $$("clave").config.readonly = false $$('form_product').focus('clave') } $$("clave").refresh() } function chk_inventario_change(new_value, old_value){ var value = Boolean(new_value) if(value){ $$('txt_existencia').enable() $$('txt_minimo').enable() }else{ $$('txt_existencia').disable() $$('txt_minimo').disable() $$('txt_existencia').setValue(0) $$('txt_minimo').setValue(0) } } function get_new_key(){ webix.ajax().get('/values/newkey', { error: function(text, data, xhr) { msg_error(text) }, success: function(text, data, xhr) { var values = data.json(); $$("clave").setValue(values.value) $$("clave").refresh() } }) } function valor_unitario_change(new_value, old_value){ if(!isFinite(new_value)){ this.config.value = old_value this.refresh() } } function precio_con_impuestos_change(new_value, old_value){ if(!isFinite(new_value)){ this.config.value = old_value this.refresh() } } function calcular_sin_impuestos(value, taxes){ var vu = $$('valor_unitario') var precio = value taxes.forEach(function(tax){ var tasa = 1.00 + tax.tasa.to_float() if(tax.tipo == 'T' && tax.name == 'IVA'){ precio = (value / tasa).round(DECIMALES) } }) vu.setValue(precio) } function precio_con_impuestos_key_up(){ var value = this.getValue() if(!value){ return } var taxes = $$('grid_product_taxes').getSelectedItem(true) if (taxes.length == 0){ msg = 'Selecciona al menos un impuesto' msg_error(msg) return } if(!isFinite(value)){ msg = 'Captura un valor válido' msg_error(msg) return } calcular_sin_impuestos(parseFloat(value), taxes) } function cmd_import_products_click(){ win_import_products.init() $$('win_import_products').show() } function cmd_upload_products_click(){ var form = $$('form_upload_products') var values = form.getValues() if(!$$('lst_upload_products').count()){ $$('win_import_products').close() return } if($$('lst_upload_products').count() > 1){ msg = 'Selecciona solo un archivo' msg_error(msg) return } var template = $$('up_products').files.getItem($$('up_products').files.getFirstId()) if(template.type.toLowerCase() != 'ods'){ msg = 'Archivo inválido.\n\nSe requiere un archivo ODS' msg_error(msg) return } msg = '¿Estás seguro de importar este archivo?' webix.confirm({ title: 'Importar Productos', ok: 'Si', cancel: 'No', type: 'confirm-error', text: msg, callback:function(result){ if(result){ $$('up_products').send() } } }) } function up_products_upload_complete(response){ if(response.status != 'server'){ msg = 'Ocurrio un error al subir el archivo' msg_error(msg) return } msg = 'Archivo subido correctamente.\n\nComenzando importación.' msg_ok(msg) $$('win_import_products').close() webix.ajax().post('/products', {opt: 'import'}, { error: function(text, data, xhr) { msg = 'Error al importar' msg_error(msg) }, success: function(text, data, xhr) { var values = data.json(); if (values.ok){ get_products() webix.alert({ title: 'Importación terminada', text: values.msg, }) }else{ msg_error(values.msg) } } }) } //~ Add products function cmd_products_add_click(id, e, node){ $$("multi_products").setValue("product_add") cfg_products['partner_id'] = 0 cfg_products['partner_rfc'] = '' } //~ Close add products function cmd_close_products_add_click(id, e, node){ var grid = $$('grid_partner_products') $$('multi_invoices').setValue('products_home') $$('lbl_partner').setValue('') grid.clearAll() } function _add_entries_inventory(data){ var grid = $$('grid_partner_products') var values = { opt: 'create', values: data, } webix.ajax().sync().post('inventoryentries', values, { error:function(text, data, XmlHttpRequest){ msg = 'Ocurrio un error, consulta a soporte técnico' msg_error(msg) }, success:function(text, data, XmlHttpRequest){ var values = data.json(); if (values.ok) { get_products() $$('multi_invoices').setValue('products_home') $$('lbl_partner').setValue('') grid.clearAll() }else{ msg_error(values.msg) } } }) } //~ Save add products function cmd_save_products_add_click(id, e, node){ var grid = $$('grid_partner_products') var count = 0 var products = [] var validate_import = false var validate_cant = false grid.eachRow(function(row){ var r = grid.getItem(row) if(r.select){ var p = {} count += 1 p.id_product = r.id_product p.key = r.key p.key_sat = r.key_sat1 p.description = r.description1 p.unit = r.unit p.unit_value = r.unit_value1 p.cant = r.cant1 products.push(p) if(p.unit_value < parseFloat(r.unit_value)){ validate_import = true } if(p.cant > r.cant){ validate_cant = true } } }) if(!count){ msg = 'Selecciona al menos un registro' msg_error(msg) return } if(validate_import){ msg = 'El Valor Unitario no puede ser menor al Valor Unitario del proveedor' msg_error(msg) return } if(validate_cant){ msg = 'La Cantidad no puede ser mayor a la Cantidad del proveedor' msg_error(msg) return } var data = { partner: cfg_products['partner'], products: products, } msg = '¿Estás seguro de ingresar estos productos?

\ Esta acción no se puede deshacer.' webix.confirm({ title: 'Agregar entrada', ok: 'Si', cancel: 'No', type: 'confirm-error', text: msg, callback:function(result){ if(result){ _add_entries_inventory(data) } } }) } //~ Import from xml function cmd_add_products_from_xml_click(){ win_add_products_from_xml.init() $$('win_add_products_from_xml').show() } //~ Upload XML function cmd_upload_products_from_xml_click(){ var form = $$('form_upload_products_from_xml') var values = form.getValues() var list = $$('lst_up_products_from_xml') var upload = $$('up_products_from_xml') if(!list.count()){ $$('win_add_products_from_xml').close() return } if(list.count() > 1){ msg = 'Selecciona solo un archivo' msg_error(msg) return } var template = upload.files.getItem(upload.files.getFirstId()) if(template.type.toLowerCase() != 'xml'){ msg = 'Archivo inválido.\n\nSe requiere un archivo XML' msg_error(msg) return } msg = '¿Estás seguro de importar este archivo?

\ Si hay datos previos seran reemplazados.' webix.confirm({ title: 'Importar Productos', ok: 'Si', cancel: 'No', type: 'confirm-error', text: msg, callback:function(result){ if(result){ upload.send() } } }) } function up_products_from_xml_upload_complete(response){ if(response.status != 'server'){ msg = 'Ocurrio un error al subir el archivo' msg_error(msg) return } $$('win_add_products_from_xml').close() if(response.error){ msg_error(response.error) return } var grid = $$('grid_partner_products') var data = response.data cfg_products['partner'] = data.emisor //~ cfg_products['xml'] = data.xml var html = '' html += data.emisor.nombre + ' (' + data.emisor.rfc + ')' $$('lbl_partner').setValue(html) grid.clearAll() grid.parse(data.conceptos, 'json') grid.refresh() } function get_partner_product(grid, row){ grid.refresh(row.id) var partner_id = cfg_products['partner'].id var filters = { opt: 'product', partner: cfg_products['partner'], product_key: row.key, } if(!partner_id){ msg = 'El Proveedor no esta dado de alta' msg_ok(msg) return } webix.ajax().get('/partnerproducts', filters, { error: function(text, data, xhr) { msg_error('Ocurrio un error, consulta a soporte técnico.') }, success: function(text, data, xhr){ var values = data.json() if(values.ok){ row['id_product'] = values.row.id_product row['key_sat1'] = values.row.key_sat1 row['description1'] = values.row.description1 grid.refresh(row.id) }else{ msg_error(values.msg) } } }) } function grid_partner_products_select(row_id, state){ var grid = $$('grid_partner_products') var row = grid.getItem(row_id) if(state){ row['key_sat1'] = row.key_sat row['description1'] = row.description row['cant1'] = row.cant row['unit_value1'] = 0.0 get_partner_product(grid, row) }else{ row['key_sat1'] = '' row['description1'] = '' row['cant1'] = '' grid.refresh(row_id) } }