def search_product(self, cr, uid, ids, product_name = None, start_modified = None, end_modified = None, context=None): """ 1) 按商品名称,商品修改时间搜索店铺商品 2) start_modified、end_modified 都是UTC时间,需要加上8小时传给电商平台 """ shop_id = self.browse(cr, uid, ids[0], context= context) setDefaultAppInfo(shop_id.appkey, shop_id.appsecret) req = ItemsOnsaleGetRequest(shop_id.apiurl, 80) req.fields="approve_status,num_iid,title,nick, outer_id, modified" if product_name: req.q = product_name if start_modified: start_modified = (datetime.strptime(str(start_modified),'%Y-%m-%d %H:%M:%S',) + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') req.start_modified = start_modified if end_modified: end_modified = (datetime.strptime(str(end_modified),'%Y-%m-%d %H:%M:%S',) + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') req.end_modified = end_modified req.page_no = 1 req.page_size = 100 total_get = 0 total_results = 100 res = [] while total_get < total_results: resp= req.getResponse(shop_id.sessionkey) total_results = resp.get('items_onsale_get_response').get('total_results') if total_results > 0: res += resp.get('items_onsale_get_response').get('items').get('item') total_get += req.page_size req.page_no = req.page_no + 1 # # 时间需要减去8小时 for r in res: r['modified'] = (datetime.strptime(r['modified'],'%Y-%m-%d %H:%M:%S',) - timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') return res
def sync_stock_qty(self, cr, uid, ids, context=None): """ 同步本条记录的库存数量到 电商店铺 """ port = 80 res = self.read_group(cr, uid, [('sync_check', '=', True ), ('id', 'in', ids )], ['shop_id',], ['shop_id' ], context = context) for r in res: shop = self.pool.get('ebiz.shop').browse(cr, uid, r['shop_id'][0], context=context) location_id = shop.warehouse_id.lot_stock_id.id setDefaultAppInfo(shop.appkey, shop.appsecret) line_ids = self.search(cr, uid, r['__domain'], context = context) prts = self.read(cr, uid, line_ids, ['product_id'], context = context) product_ids = [x['product_id'][0] for x in prts] context.update({'location': location_id}) ss = self.pool.get('product.product')._product_available(cr, uid, product_ids, context=context) for product in self.pool.get('product.product').browse(cr, uid, product_ids, context=context): req = ItemQuantityUpdateRequest(shop.apiurl, port) req.num_iid= product.num_iid if product.default_code: req.outer_id = product.default_code else: req.sku_id = product.sku_id qty = product.virtual_available if qty < 0: qty = 0 req.quantity = int(qty) req.type=1 try: resp = req.getResponse(shop.sessionkey) ids = self.search(cr, uid, [('shop_id', '=', shop_id), ('product_id', '=', product.id)], context = context ) self.write(cr, uid, ids, {'sync_date': time.strftime('%Y-%m-%d %H:%M:%S'), 'sync_check': False, 'sync_qty': qty }, context=context) except Exception,e: #写入 同步异常日志 syncerr = u"店铺【%s】商品【[%s]%s】库存数量同步错误: %s" % (shop.name, product.default_code, product.name, e) self.pool.get('ebiz.syncerr').create(cr, uid, {'name':syncerr, 'shop_id': shop.id, 'type': 'stock' }, context = context )
def pull_order(self, cr, uid, ids, tid, context=None): """ 1) 取得交易tid信息 2) ERP中创建交易对应的SO订单 3) 如果ERP无此买家、发货地址,自动创建对应的Partner对象及联系人 4) 如果ERP中无此商品,则报同步异常,不同步此tid """ port = 80 shop = self.browse(cr,uid,ids[0], context = context) setDefaultAppInfo(shop.appkey, shop.appsecret) try: #req = TradeFullinfoGetRequest(shop.apiurl, port) req = TradeGetRequest(shop.apiurl, port) req.fields="seller_nick,buyer_nick,created,sid,tid,status,buyer_memo,seller_memo,payment,discount_fee,adjust_fee,post_fee,total_fee,pay_time,end_time,modified,received_payment,price,alipay_id,receiver_name,receiver_state,receiver_city,receiver_district,receiver_address,receiver_zip,receiver_mobile,receiver_phone,orders.price,orders.num,orders.iid,orders.num_iid,orders.sku_id,orders.refund_status,orders.status,orders.oid,orders.total_fee,orders.payment,orders.discount_fee,orders.adjust_fee,orders.sku_properties_name,orders.outer_iid,orders.outer_sku_id" req.tid = long(tid) resp = req.getResponse(shop.sessionkey) trade = resp.get('trade_get_response') and resp.get('trade_get_response').get('trade') if not trade: return False trade['created'] = (datetime.strptime(trade['created'], '%Y-%m-%d %H:%M:%S',) - timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') trade['pay_time'] = (datetime.strptime(trade['pay_time'], '%Y-%m-%d %H:%M:%S',) - timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') #创建Partner partner_id, address_id = self.create_partner_address(cr, uid, shop.code, trade, context = context ) #创建订单及明细行 order_id = self.create_order(cr, uid, shop, partner_id, address_id, trade, context = context ) return order_id except Exception,e: #写入 同步异常日志 syncerr = u"店铺【%s】订单【%s】同步错误: %s" % (shop.name, tid, e) self.pool.get('ebiz.syncerr').create(cr, uid, {'name':syncerr, 'shop_id': shop.id, 'type': 'order' }, context = context ) return False
def search_invoices(self, cr, uid, ids, date_start = None, date_end = None, context=None): """ 从电商店铺搜索一定时间区间创建的、指定交易状态的支付宝对账记录。 支付类型: PAYMENT:在线支付,TRANSFER:转账,DEPOSIT:充值,WITHDRAW:提现, CHARGE:收费,PREAUTH:预授权,OTHER:其它。 """ port = 80 shop = self.browse(cr, uid, ids[0], context = context) setDefaultAppInfo(shop.appkey, shop.appsecret) req = AlipayUserAccountreportGetRequest(shop.apiurl,port) req.fields=" balance,memo,alipay_order_no,opt_user_id,merchant_order_no,create_time,self_user_id,business_type,out_amount,type,in_amount" if date_start: date_start = (datetime.strptime(str(date_start),'%Y-%m-%d %H:%M:%S',) + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') req.start_time = date_start if date_end: date_end = (datetime.strptime(str(date_end),'%Y-%m-%d %H:%M:%S',) + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') req.end_time = date_end res = [] req.page_no = 1 req.page_size = 100 total_get = 0 total_results = 100 while total_get < total_results: resp= req.getResponse(shop.sessionkey) trades = resp.get('alipay_user_accountreport_get_response').get('alipay_records', False) total_results = resp.get('alipay_user_accountreport_get_response').get('total_results') if total_results > 0: res += trades.get('alipay_record') total_get += req.page_size req.page_no = req.page_no + 1 # 时间需要减去8小时 for r in res: r['create_time'] = (datetime.strptime(r['create_time'],'%Y-%m-%d %H:%M:%S',) - timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') #测试数据 # res = [ # { # "balance":"100.00", # "memo":"hello world", # "alipay_order_no":"2014081021001001540010396144", # "opt_user_id":"20880063000888880133", # "merchant_order_no":"T200P765216671818695", # "create_time":"2014-08-20 20:40:03", # "self_user_id":"20880063000888880122", # "business_type":"PAYMENT", # "out_amount":"50.00", # "type":"PAYMENT", # "in_amount":"50.00" # } # ] return res
def _order_offline_send(self, cr, uid, shop, tid, logistics_company, logistics_id, context=None): setDefaultAppInfo(shop.appkey, shop.appsecret) req = LogisticsOfflineSendRequest(shop.apiurl, 80) req.tid = tid req.out_sid = logistics_id req.company_code = logistics_company try: resp = req.getResponse(shop.sessionkey) except Exception,e: #写入 同步异常日志 syncerr = u"店铺【%s】订单【%s】物流发货同步错误: %s" % (shop.name, tid, e) self.pool.get('ebiz.syncerr').create(cr, uid, {'name':syncerr, 'shop_id': shop.id, 'type': 'delivery' }, context = context ) return False
def _order_signed(self, cr, uid, shop, order): #tid 格式为 店铺前缀_电商订单编号,如果是合并订单,则格式为 店铺前缀mg_流水号 signed = True setDefaultAppInfo(shop.appkey, shop.appsecret) req = TradeGetRequest(shop.apiurl) req.fields="tid, modified, consign_time, status" i = order.name.find('_') if i <= 0: signed = False tid = order.name[i+1:] if order.name[:i].endswith('mg'): #处理合并订单 if not order.origin: syncerr = u"店铺【%s】订单【%s】买家签收同步错误: 合并订单的源单据中没有原始订单号!" % (shop.name, order.name) self.pool.get('ebiz.syncerr').create(cr, uid, {'name':syncerr, 'shop_id': shop.id, 'type': 'invoice' }, context = context ) signed = False tids = order.origin.split(',') for t in tids: i = t.find('_') if i <= 0: signed = False continue tid = t[i+1:] req.tid = long(tid) resp = req.getResponse(shop.sessionkey) trade = resp.get('trade_get_response') and resp.get('trade_get_response').get('trade') if not trade or trade['status'] != 'TRADE_FINISHED': signed = False continue else: req.tid = long(tid) resp = req.getResponse(shop.sessionkey) trade = resp.get('trade_get_response') and resp.get('trade_get_response').get('trade') if not trade or trade['status'] != 'TRADE_FINISHED': signed = False return signed
def import_product(self, cr, uid, ids, product_ids, context=None): """ 1) 按商品数字编码,取得商品SKU编码、属性和属性值 2) 如果该商品没有SKU,且ERP中没有该商品,ERP中直接创建product.product 3) 如果该商品有SKU,则ERP中创建product.template,且在product.template 上添加 属性和属性值,并且创建该SKU 4) 电商店铺商品/SKU和ERP产品的对应关系:依次用电商商品/SKU的商家外部编码、商品数字编码、sku_id 匹配ERP产品的default_code, num_iid, sku_id 5) 返回匹配的产品ids """ port = 80 shop = self.browse(cr, uid, ids[0], context = context) setDefaultAppInfo(shop.appkey, shop.appsecret) req = ItemSkusGetRequest(shop.apiurl,port) req.fields="sku_id, num_iid, properties, price, status, memo, properties_name, outer_id" res = [] for product in product_ids: try: req.num_iids = product.num_code resp= req.getResponse(shop.sessionkey) skus = resp.get('item_skus_get_response').get('skus', False) product_vals = { 'name': product.name, 'num_iid': long(product.num_code), 'type': 'product', 'categ_id': shop.categ_id.id, 'default_code': product.out_code or product.num_code, } if skus and skus.get('sku', False): product_vals.update({'sku': skus.get('sku', False) }) ids = self.create_product(cr, uid, product_vals, context = context) res += ids #一个商品的导入异常不中断其他商品的继续导入 except Exception, e: #写入 同步异常日志 syncerr = u"店铺【%s】商品【num_iid=%s】导入错误: %s" % (shop.name, product.num_code, e) self.pool.get('ebiz.syncerr').create(cr, uid, {'name':syncerr, 'shop_id': shop.id, 'type': 'product' }, context = context )
def search_import_orders(self, cr, uid, ids, status = 'WAIT_SELLER_SEND_GOODS', date_start = None, date_end = None, context=None): """ 搜索订单,批量导入 """ port = 80 shop = self.browse(cr, uid, ids[0], context = context) setDefaultAppInfo(shop.appkey, shop.appsecret) req = TradesSoldIncrementGetRequest(shop.apiurl,port) req.fields="seller_nick,buyer_nick,created,sid,tid,status,buyer_memo,seller_memo,payment,discount_fee,adjust_fee,post_fee,total_fee,pay_time,end_time,modified,received_payment,price,alipay_id,receiver_name,receiver_state,receiver_city,receiver_district,receiver_address,receiver_zip,receiver_mobile,receiver_phone,orders.price,orders.num,orders.iid,orders.num_iid,orders.sku_id,orders.refund_status,orders.status,orders.oid,orders.total_fee,orders.payment,orders.discount_fee,orders.adjust_fee,orders.sku_properties_name,orders.outer_iid,orders.outer_sku_id" req.status = status if date_start: date_start = (datetime.strptime(str(date_start), '%Y-%m-%d %H:%M:%S',) + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') req.start_modified = date_start if date_end: date_end = (datetime.strptime(str(date_end), '%Y-%m-%d %H:%M:%S',) + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') req.end_modified = date_end res = [] req.page_no = 1 req.page_size = 100 # 淘宝沙箱环境不支持use_has_next 参数 # req.use_has_next = True # has_next = True # while has_next: # resp= req.getResponse(shop.sessionkey) # trades = resp.get('trades_sold_get_response').get('trades', False) # if trades: # res += trades.get('trade') # req.page_no += 1 # has_next = resp.get('trades_sold_get_response').get('has_next', False) total_get = 0 total_results = 100 while total_get < total_results: resp= req.getResponse(shop.sessionkey) trades = resp.get('trades_sold_increment_get_response').get('trades', False) total_results = resp.get('trades_sold_increment_get_response').get('total_results') if total_results > 0: res += trades.get('trade') total_get += req.page_size req.page_no = req.page_no + 1 # 时间需要减去8小时 # 单号加上店铺前缀 order_ids = [] for trade in res: trade['created'] = (datetime.strptime(trade['created'], '%Y-%m-%d %H:%M:%S',) - timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') trade['pay_time'] = (datetime.strptime(trade['pay_time'], '%Y-%m-%d %H:%M:%S',) - timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') trade['sale_code'] = '%s_%s' % (shop.code, trade['tid']) try: #创建Partner partner_id, address_id = self.create_partner_address(cr, uid, shop.code, trade, context = context ) #创建订单及明细行 order_id = self.create_order(cr, uid, shop, partner_id, address_id, trade, context = context ) order_ids.append(order_id) except Exception, e: #写入 同步异常日志 syncerr = u"店铺【%s】订单【%s】同步错误: %s" % (shop.name, trade['tid'], e) self.pool.get('ebiz.syncerr').create(cr, uid, {'name':syncerr, 'shop_id': shop.id, 'type': 'order' }, context = context ) continue
def search_orders(self, cr, uid, ids, status = 'WAIT_SELLER_SEND_GOODS', date_start = None, date_end = None, context=None): """ 从电商店铺搜索一定时间区间创建的、指定交易状态的订单 本方法支持的交易状态有: WAIT_SELLER_SEND_GOODS (默认) WAIT_BUYER_CONFIRM_GOODS TRADE_FINISHED TRADE_CLOSED 淘宝订单交易状态 WAIT_BUYER_PAY:等待买家付款 WAIT_SELLER_SEND_GOODS:等待卖家发货 SELLER_CONSIGNED_PART:卖家部分发货 WAIT_BUYER_CONFIRM_GOODS:等待买家确认收货 TRADE_BUYER_SIGNED:买家已签收(货到付款专用) TRADE_FINISHED:交易成功 TRADE_CLOSED:交易关闭 TRADE_CLOSED_BY_TAOBAO:交易被淘宝关闭 TRADE_NO_CREATE_PAY:没有创建外部交易(支付宝交易) WAIT_PRE_AUTH_CONFIRM:余额宝0元购合约中 PAY_PENDING:外卡支付付款确认中 ALL_WAIT_PAY:所有买家未付款的交易(包含:WAIT_BUYER_PAY、TRADE_NO_CREATE_PAY) ALL_CLOSED:所有关闭的交易(包含:TRADE_CLOSED、TRADE_CLOSED_BY_TAOBAO) """ port = 80 shop = self.browse(cr, uid, ids[0], context = context) setDefaultAppInfo(shop.appkey, shop.appsecret) req = TradesSoldIncrementGetRequest(shop.apiurl,port) req.fields="tid, buyer_nick, created, discount_fee, adjust_fee, post_fee, total_fee, pay_time, end_time, modified, consign_time, receiver_name" req.status = status if date_start: date_start = (datetime.strptime(str(date_start), '%Y-%m-%d %H:%M:%S',) + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') req.start_modified = date_start if date_end: date_end = (datetime.strptime(str(date_end), '%Y-%m-%d %H:%M:%S',) + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') req.end_modified = date_end res = [] req.page_no = 1 req.page_size = 100 # 淘宝沙箱环境不支持use_has_next 参数 # req.use_has_next = True # has_next = True # while has_next: # resp= req.getResponse(shop.sessionkey) # trades = resp.get('trades_sold_get_response').get('trades', False) # if trades: # res += trades.get('trade') # req.page_no += 1 # has_next = resp.get('trades_sold_get_response').get('has_next', False) total_get = 0 total_results = 100 while total_get < total_results: resp= req.getResponse(shop.sessionkey) trades = resp.get('trades_sold_increment_get_response').get('trades', False) total_results = resp.get('trades_sold_increment_get_response').get('total_results') if total_results > 0: res += trades.get('trade') total_get += req.page_size req.page_no = req.page_no + 1 # 时间需要减去8小时 # 单号加上店铺前缀 for r in res: r['created'] = (datetime.strptime(r['created'],'%Y-%m-%d %H:%M:%S',) - timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') r['modified'] = (datetime.strptime(r['modified'],'%Y-%m-%d %H:%M:%S',) - timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') r['sale_code'] = '%s_%s' % (shop.code, r['tid']) return res