def create_using_magento_data(cls, order_data): """ Create a sale from magento data. If you wish to override the creation process, it is recommended to subclass and manipulate the returned unsaved active record from the `get_sale_using_magento_data` method. :param order_data: Order data from magento :return: Active record of record created """ MagentoException = Pool().get('magento.exception') MagentoOrderState = Pool().get('magento.order_state') sale = cls.get_sale_using_magento_data(order_data) sale.add_lines_using_magento_data(order_data) sale.save() # Process sale now tryton_state = MagentoOrderState.get_tryton_state(order_data['state']) try: sale.process_sale_using_magento_state(order_data['state']) except UserError, e: # Expecting UserError will only come when sale order has # magento exception. # Just ignore the error and leave this order in draft state # and let the user fix this manually. MagentoException.create([{ 'origin': '%s,%s' % (sale.__name__, sale.id), 'log': "Error occurred on transitioning to state %s.\nError " "Message: %s" % (tryton_state['tryton_state'], e.message), }])
def get_sale_using_magento_data(cls, order_data): """ Return an active record of the sale from magento data """ Sale = Pool().get('sale.sale') Party = Pool().get('party.party') Address = Pool().get('party.address') StoreView = Pool().get('magento.store.store_view') Currency = Pool().get('currency.currency') Uom = Pool().get('product.uom') MagentoOrderState = Pool().get('magento.order_state') store_view = StoreView(Transaction().context.get('magento_store_view')) instance = store_view.instance currency = Currency.search_using_magento_code( order_data['order_currency_code'] ) if order_data['customer_id']: party = Party.find_or_create_using_magento_id( order_data['customer_id'] ) else: party = Party.create_using_magento_data({ 'firstname': order_data['customer_firstname'], 'lastname': order_data['customer_lastname'], 'email': order_data['customer_email'], 'customer_id': 0 }) party_invoice_address = None if order_data['billing_address']: party_invoice_address = \ Address.find_or_create_for_party_using_magento_data( party, order_data['billing_address'] ) party_shipping_address = None if order_data['shipping_address']: party_shipping_address = \ Address.find_or_create_for_party_using_magento_data( party, order_data['shipping_address'] ) unit, = Uom.search([('name', '=', 'Unit')]) tryton_state = MagentoOrderState.get_tryton_state(order_data['state']) if not party_shipping_address: # if there is no shipment address, this could be a digital # delivery which won't need a shipment. No shipment_address is # hence assumed as no shipment needed. So set the method as # manual shipment_method = 'manual' else: shipment_method = tryton_state['shipment_method'] return Sale(**{ 'reference': instance.order_prefix + order_data['increment_id'], 'sale_date': order_data['created_at'].split()[0], 'party': party.id, 'currency': currency.id, 'invoice_address': party_invoice_address, 'shipment_address': party_shipping_address or party_invoice_address, 'magento_id': int(order_data['order_id']), 'magento_instance': instance.id, 'magento_store_view': store_view.id, 'invoice_method': tryton_state['invoice_method'], 'shipment_method': shipment_method, 'lines': [], })