def GetIdDomicilio(id_cliente): cliente = Modelo() filtro = [['id', '=', id_cliente]] fields = ['x_iddomicilio'] ret = cliente.search('res.partner', filtro, fields) if ret and ret[0]: return ret[0]['x_iddomicilio'] else: return False
def ProductosUpdate(adapter, fi, ff, idvendedor, token, debug=False): ret = False logger.info('>>> Chequeando si hay productos con updates ...') productos = Modelo() filtro = [['write_date', '>=', fi], ['write_date', '<=', ff], ['active', '=', True]] fields = [ 'id', 'default_code', 'list_price', 'categ_id', 'name', 'tag_ids', 'seller_id', 'product_variant_ids' ] retorno = productos.search('product.template', filtro, fields, None) if len(retorno) > 0: if debug: logger.info('respuesta odoo: %s', str(retorno)) logger.info('cantidad de productos: %s', str(len(retorno))) tupla = [] for item in retorno: id_producto = item['product_variant_ids'] codigo_interno = str(item['default_code']) name_producto = str(item['name']).strip() name_productor = item['seller_id'][1] name_categoria = str(item['categ_id'][1]).strip() importe = item['list_price'] param_tupla = {} param_tupla['nombreProducto'] = str( GetNameProducto(id_producto)[0]['name_template']).strip() param_tupla['codigoInterno'] = codigo_interno param_tupla['nombreProductor'] = name_productor sellos = [] for sello in item['tag_ids']: sellos.append(GetSelloProductos(sello)) param_tupla['sellos'] = sellos param_tupla['categoria'] = name_categoria param_tupla['precio'] = importe tupla.append(param_tupla) param = {} param['idVendedor'] = idvendedor param['token'] = token param['variantes'] = tupla respuesta = adapter.actualizarProductos(param) if respuesta.status_code == 200: ret = True else: ret = False return ret
def ActualizarDomicilio(adapter, id_domicilio, id_cliente_odoo, token, debug=False): param = {} param['id'] = id_domicilio param['token'] = token if debug: logger.info('>>> Parametros enviados: %s', str(param)) resp = adapter.datosDireccion(param) if debug: logger.info('>>> Codigo respuesta servidor: %s', str(resp.status_code)) if (resp) and (resp.status_code == 200): #llegaron los datos bien datos = resp.json() if debug: logger.info('>>> Datos Recibidos: %s', datos) calle = datos['calle'] altura = datos['altura'] localidad = datos['localidad'] codigopostal = datos['codigoPostal'] id_domicilio = datos['id_Domicilio'] if debug: logger.info('calle: %s', calle) logger.info('altura: %s', altura) logger.info('localidad: %s', localidad) logger.info('codigo Postal: %s', codigopostal) logger.info('id_domicilio: %s', str(id_domicilio)) #editamos el cliente en la tabla res_partner #agregar al modelo res_partner el campo personalizado # x_iddomicilio de tipo integer que lo usamos para gurdar el id vals = {} vals['street'] = calle + ' ' + str(altura) vals['zip'] = codigopostal vals['city'] = localidad vals['x_iddomicilio'] = int(id_domicilio) clientedomicilio = Modelo() retorno = clientedomicilio.update('res.partner', id_cliente_odoo, vals) if debug: logger.info('ID cliente: %s', str(retorno)) return retorno else: #si hay error retorna -1 return -1
def Productores(adapter, fi, ff, idvendedor, token, debug=False): ret = False logger.info('>>> Chequeando si hay productores nuevos o updates ...') productores = Modelo() filtro = [['write_date', '>=', fi], ['write_date', '<=', ff], ['supplier', '=', True]] fields = ['id', 'name', 'comment', 'ref', 'category_id'] retorno = productores.search('res.partner', filtro, fields, None) if len(retorno) > 0: if debug: logger.info('respuesta odoo: %s', str(retorno)) logger.info('cantidad de productores: %s', str(len(retorno))) tupla = [] for item in retorno: if item['comment']: comentario = str(item['comment']).strip() else: comentario = ' ' if item['ref']: referencia = str(item['ref']).strip() else: referencia = ' ' sellos = [] for cate in item['category_id']: sellos.append(GetSelloProductor(cate)) param_tupla = {} param_tupla['nombre'] = str(item['name']).strip() param_tupla['descripcionLarga'] = referencia param_tupla['descripcionCorta'] = comentario param_tupla['idSellos'] = sellos tupla.append(param_tupla) param = {} param['idVendedor'] = idvendedor param['token'] = token param['productores'] = tupla respuesta = adapter.actualizarProductores(param) if respuesta.status_code == 200: ret = True else: ret = False return ret
def GetSelloProductor(category_id): categoria = Modelo() filtro = [['id', '=', category_id]] fields = ['name'] retorno = categoria.search('res.partner.category', filtro, fields) ret = None if retorno: categ = str(retorno[0]['name']).lower().strip() if categ == 'cooperativas': ret = 1 elif categ == 'recuperadas': ret = 2 elif categ == 'agricultura familiar': ret = 3 elif categ == 'empresa social': ret = 4 else: ret = None return ret
def StockComprometido(adapter, fi, ff, idvendedor, token, debug=False): param_tupla = {} logger.info('>>> Chequeando stock comprometido sin entregar ...') ordenes = Modelo() filtro = [ ['state', 'in', ['progress', 'draft']], ['x_origen', '=', 'chasqui'], ] fields = ['order_line'] ordenes_ids = ordenes.search('sale.order', filtro, fields, None) lineas = [] if ordenes_ids: for i in ordenes_ids: lineas += i['order_line'] ordenes_lines = Modelo() filtro = [['id', 'in', lineas]] fields = ['product_uos_qty', 'product_id'] lineas_ids = ordenes_lines.search('sale.order.line', filtro, fields, None) for item in lineas_ids: codigo_interno = GetDefaultCode( item['product_id'][0])[0]['default_code'] cantidad = item['product_uos_qty'] * -1 if param_tupla.has_key(codigo_interno): cant = param_tupla[codigo_interno] param_tupla[codigo_interno] = cantidad + cant else: param_tupla[codigo_interno] = cantidad return param_tupla
def GetSelloProductos(etiqueta_id): etiqueta = Modelo() filtro = [['id', '=', etiqueta_id]] fields = ['name'] retorno = etiqueta.search('product.tag', filtro, fields) ret = None if retorno: etiq = str(retorno[0]['name']).lower().strip() if etiq == 'agroecologico': ret = 1 elif etiq == 'organico': ret = 2 elif etiq == 'reciclado': ret = 3 elif etiq == 'artesanal': ret = 5 elif etiq == 'en red': ret = 7 elif etiq == 'kilometro cero': ret = 8 else: ret = None return ret
def GetIdPuntoDeRetiro(puntoderetiro): titulo = Modelo() filtro = [['shortcut', '=', 'puntoderetiro']] fields = ['id'] ret = titulo.search('res.partner.title', filtro, fields) if not ret and ret[0]: return False title_id = ret[0]['id'] cliente = Modelo() filtro = [['name', '=', puntoderetiro], ['title', '=', title_id]] fields = ['id'] ret = cliente.search('res.partner', filtro, fields) if ret and ret[0]: return ret[0]['id'] else: return False
def GetProductCateg(id_categoria): productcat = Modelo() filtro = [['id', '=', id_categoria]] fields = ['name'] retorno = productcat.search('product.category', filtro, fields) return retorno
def CrearPedidos(adapter, fi, ff, idvendedor, token, debug=False): logger.info('>>> Chequeando si hay pedidos ...') param = {} param['idVendedor'] = idvendedor param['fechaInicial'] = fi param['fechaFinal'] = ff param['token'] = token error = False retorno = 0 if debug: logger.info('>>> Parametros Enviados: %s', str(param)) resp = adapter.nuevosPedidosIndividuales(param) if debug: logger.info('Codigo respuesta servidor: %s', str(resp.status_code)) if (resp) and (resp.status_code == 200): #llegaron los datos bien datos = resp.json() print datos if debug: logger.info('>>> Datos Recibidos: %s', datos) pedidoRX = datos['pedidoClienteDomicilio'] cantidadpedidos = len(pedidoRX) if debug: logger.info('>>> Cantidad de Pedido Recibidos: %s', str(cantidadpedidos)) if cantidadpedidos > 0: #hay pedidos nuevos for pedido in pedidoRX: id_pedido = pedido['id_Pedido'] id_cliente = pedido['id_Cliente'] alias_puntoderetiro = pedido['alias_PuntoDeRetiro'] id_domicilio = pedido['id_Domicilio'] productosRX = pedido['cantidadesProductoResponse'] #chequeamos si existe el cliente existecliente = GetIdCliente(id_cliente) if not existecliente: #si no existe lo creamos agregarcliente = AgregarCliente(adapter, id_cliente, token, debug) if agregarcliente != -1: odoo_clienteid = agregarcliente if debug: logger.info( '>>> El cliente se creo correctamente: %s', id_cliente) else: if debug: logger.warning('>>> Error al crear el cliente: %s', id_cliente) error = True else: odoo_clienteid = int(existecliente[0]['id']) #el cliente lo retira en un punto de retiro if alias_puntoderetiro == None: partner_shipping_id = odoo_clienteid else: punto_r = str(alias_puntoderetiro).strip() partner_shipping_id = GetIdPuntoDeRetiro(punto_r) #chequeamos la direccion del cliente y si es distinta la editamos ret = GetIdDomicilio(odoo_clienteid) if ret != id_domicilio: ActualizarDomicilio(adapter, id_domicilio, odoo_clienteid, token, debug) if debug: logger.info( '>>> Actualizando el domicilio del cliente: %s', id_cliente) #chequeamos si el pedido ya existe if not GetIdPedido(id_pedido): logger.info('>>> Agregando pedidos nuevos ...') vals = { 'origin': str(id_pedido), 'x_origen': 'chasqui', 'partner_id': odoo_clienteid, 'pricelist_id': 1, 'partner_invoice_id': odoo_clienteid, 'partner_shipping_id': partner_shipping_id, 'state': 'draft', } items_prod = [] for producto in productosRX: odoo_productoid = GetIdProducto( producto['cod_Producto'])[0]['id'] id_producto = producto['id_Producto'] precio = producto['precio'] cantidadpedida = producto['cantidadPedida'] items_prod.append((0, 0, { 'product_id': odoo_productoid, 'product_uom_qty': cantidadpedida, 'qty_delivered': cantidadpedida, 'price_unit': precio })) vals['order_line'] = items_prod saleorder = Modelo() retorno = saleorder.create('sale.order', vals) if debug: logger.info('id_pedido: %s', str(id_pedido)) logger.info('id_cliente: %s', str(id_cliente)) logger.info('alias_puntoderetiro: %s', str(alias_puntoderetiro)) logger.info('id_domicilio: %s', str(id_domicilio)) logger.info('items: %s', str(items_prod)) else: if debug: logger.warning('>>> error el pedido ya existe') error = True else: return 0 else: error = True if error: return -1 else: return retorno
def CrearPedidosColectivos(adapter, fi, ff, idVendedor, token, debug=False): logger.info('>>> Chequeando si hay pedidos Colectivos ...') param = {} param['idVendedor'] = idVendedor param['fechaInicial'] = fi param['fechaFinal'] = ff param['token'] = token error = False retorno = 0 if debug: logger.info('>>> Parametros enviados: %s', str(param)) resp = adapter.nuevosPedidosColectivos(param) if debug: logger.info('>>> Codigo respuesta servidor: %s', str(resp.status_code)) if (resp) and (resp.status_code == 200): #llegaron los datos bien datos = resp.json() if debug: logger.info('>>> Datos Recibidos: %s', datos) pedidosRX = datos['pedidosColectivos'] cantidadpedidos = len(pedidosRX) if debug: logger.info('>>> Cantidad de Pedido Recibidos: %s', str(cantidadpedidos)) if cantidadpedidos > 0: #hay pedidos nuevos for pedido in pedidosRX: logger.info('>>> Agregando Pedidos Colectivos ...') aliasPuntoDeRetiro = pedido['aliasPuntoDeRetiro'] aliasNodo = pedido['aliasNodo'] id_domicilio = pedido['id_Domicilio'] emailCoordinador = pedido['emailCoordinador'] pedidosIndividuales = pedido['pedidosIndividuales'] #chequeamos si existe el cliente coordinador a recibir el pedido #si no existe lo creamos cliente_coodinador = GetIdCliente(emailCoordinador) if not cliente_coodinador: #si no existe lo creamos agregarcliente = AgregarCliente(adapter, emailCoordinador, token, debug) if agregarcliente != -1: odoo_clienteid_coordinador = agregarcliente if debug: logger.info( '>>> El cliente coordinador se creo correctamente: %s', emailCoordinador) else: if debug: logger.warning( '>>> Error al crear el cliente coordinador: %s', emailCoordinador) error = True else: odoo_clienteid_coordinador = int( cliente_coodinador[0]['id']) #chequeamos la direccion del cliente coordinador y si es distinta la editamos ret = GetIdDomicilio(odoo_clienteid_coordinador) if ret != id_domicilio: ActualizarDomicilio(adapter, id_domicilio, odoo_clienteid_coordinador, token, debug) if debug: logger.info( '>>> Actualizando el domicilio del cliente coordinador: %s', emailCoordinador) if debug: logger.info('aliasPuntoDeRetiro: %s', aliasPuntoDeRetiro) logger.info('aliasNodo: %s', aliasNodo) logger.info('id_Domicilio: %s', id_domicilio) logger.info('emailCoordinador: %s', emailCoordinador) if len(pedidosIndividuales) > 0: items_pedidos = [] for item in pedidosIndividuales: clientes = item['pedidos'].keys() for i in clientes: if debug: logger.info('Cliente: %s', i) #chequeamos si existe el cliente #si no existe lo creamos cliente_id = GetIdCliente(i) if not cliente_id: #si no existe lo creamos agregarcliente = AgregarCliente( adapter, i, token, debug) if agregarcliente != -1: odoo_clienteid = agregarcliente if debug: logger.info( '>>> El cliente se creo correctamente: %s', i) else: if debug: logger.warning( '>>> Error al crear el cliente: %s', i) error = True else: odoo_clienteid = int(cliente_id[0]['id']) #creamos la orden de venta logger.info( '>>> Agregando pedidos colectivos nuevos ...') vals = { 'origin': 'Pedido Colectivo', 'x_origen': 'chasqui', 'partner_id': odoo_clienteid, 'pricelist_id': 1, 'partner_invoice_id': odoo_clienteid, 'partner_shipping_id': odoo_clienteid_coordinador, 'state': 'draft', } items_prod = [] for producto in item['pedidos'][i]: odoo_productoid = GetIdProducto( producto['cod_Producto'])[0]['id'] id_producto = producto['id_Producto'] precio = producto['precio'] cantidadpedida = producto['cantidadPedida'] items_prod.append((0, 0, { 'product_id': odoo_productoid, 'product_uom_qty': cantidadpedida, 'qty_delivered': cantidadpedida, 'price_unit': precio })) vals['order_line'] = items_prod saleorder = Modelo() retorno = saleorder.create('sale.order', vals) if debug: logger.info('Productos: %s', str(items_prod)) else: return 0 else: error = True if error: return -1 else: return retorno
def GetIdPedido(id_pedido): pedido = Modelo() filtro = [['origin', '=', id_pedido]] fields = ['id'] return pedido.search('sale.order', filtro, fields)
def GetIdProducto(cod_Producto): producto = Modelo() filtro = [['default_code', '=', cod_Producto]] fields = ['id'] return producto.search('product.product', filtro, fields)
def AgregarCliente(adapter, email, token, debug=False): param = {} param['id'] = email param['token'] = token if debug: logger.info('>>> Parametros enviados: %s', str(param)) resp = adapter.datosCliente(param) if debug: logger.info('>>> Codigo respuesta servidor: %s', str(resp.status_code)) if (resp) and (resp.status_code == 200): #llegaron los datos bien datos = resp.json() if debug: logger.info('>>> Datos Recibidos: %s', datos) apellido = datos['apellido'] nombre = datos['nombre'] email = datos['email'] telefonoMovil = datos['telefonoMovil'] telefonoFijo = datos['telefonoFijo'] id_cliente = datos['id'] direcciones = datos['direcciones'] if direcciones and direcciones[0]: calle = direcciones[0]['calle'] else: calle = 's/d' if direcciones and direcciones[0]: localidad = direcciones[0]['localidad'] else: localidad = 's/d' if direcciones and direcciones[0]: codigoPostal = direcciones[0]['codigoPostal'] else: codigoPostal = 's/d' if direcciones and direcciones[0]: altura = direcciones[0]['altura'] else: altura = 's/d' if direcciones and direcciones[0]: id_domicilio = direcciones[0]['id_Domicilio'] else: id_domicilio = 0 if debug: logger.info('apellido: %s', apellido) logger.info('nombre: %s', nombre) logger.info('email: %s', email) logger.info('telefonoMovil: %s', telefonoMovil) logger.info('telefonoFijo: %s', telefonoFijo) logger.info('id_Cliente: %s', id_cliente) logger.info('id_Domicilio: %s', id_domicilio) logger.info('direcciones: %s', direcciones) #agregamos el cliente a la tabla res_partner #agregar al modelo res_partner el campo # x_iddomicilio de tipo integer vals = {} vals['name'] = apellido + ', ' + nombre vals['company_id'] = 1 vals['street'] = calle + ' ' + str(altura) vals['zip'] = codigoPostal vals['city'] = localidad vals['email'] = email vals['phone'] = telefonoFijo vals['mobile'] = telefonoMovil vals['x_iddomicilio'] = int(id_domicilio) #este campo es personalizado clientenew = Modelo() retorno = clientenew.create('res.partner', vals) if debug: logger.info('ID cliente: %s', str(retorno)) return retorno else: #si hay error retorna -1 return -1
def GetIdCliente(email): cliente = Modelo() filtro = [['email', '=', email]] fields = ['id'] return cliente.search('res.partner', filtro, fields)
def GetProductor(id_productor): productor = Modelo() filtro = [['product_tmpl_id', '=', id_productor]] fields = ['name'] retorno = productor.search('product.supplierinfo', filtro, fields) return retorno
def GetStockLocation(id_location): location = Modelo() filtro = [['name', '=', id_location]] fields = ['id', 'name', 'complete_name'] retorno = location.search('stock.location', filtro, fields, None) return retorno
def GetTemplate(id_template): template = Modelo() filtro = [['id', '=', id_template]] fields = ['name', 'list_price', 'categ_id', 'tag_id'] retorno = template.search('product.template', filtro, fields) return retorno
def CheckStock(adapter, fi, ff, idvendedor, token, debug=False): ret = False logger.info('>>> Chequeando stock ...') location = GetStockLocation('Chasqui') if location: productos = Modelo() filtro = [['location_id', '=', location[0]['id']]] fields = ['quantity', 'product_id'] retorno = productos.search('stock.history', filtro, fields, None) if debug: logger.info('respuesta odoo stock en deposito chasqui: %s', str(retorno)) #consulta si hay stock pendiente de entregar en ordenes de ventas sin confirmar param_tupla = StockComprometido(adapter, fi, ff, idvendedor, token, debug=False) if debug: logger.info('respuesta odoo stock comprometido chasqui: %s', str(param_tupla)) for item in retorno: codigo_interno = GetDefaultCode( item['product_id'][0])[0]['default_code'] cantidad = item['quantity'] if param_tupla.has_key(codigo_interno): cant = param_tupla[codigo_interno] param_tupla[codigo_interno] = cantidad + cant else: param_tupla[codigo_interno] = cantidad if debug: logger.info('respuesta odoo stock real chasqui: %s', str(param_tupla)) tupla = [] for item in param_tupla: dict_prod = {} dict_prod['codigoInterno'] = item dict_prod['stock'] = param_tupla[item] tupla.append(dict_prod) if len(tupla) > 0: logger.info('>>> Actualizando stock ...') param = {} param['idVendedor'] = idvendedor param['token'] = token param['productos'] = tupla respuesta = adapter.agregarStockDeProductos(param) if respuesta.status_code == 200: ret = True else: ret = False return ret
def GetNameProducto(id_product): producto = Modelo() filtro = [['id', '=', id_product]] fields = ['name_template'] retorno = producto.search('product.product', filtro, fields) return retorno
def GetDefaultCode(id_product): producto = Modelo() filtro = [['id', '=', id_product]] fields = ['default_code'] retorno = producto.search('product.product', filtro, fields) return retorno