def complete_values(line_data): """ Complete Order Line values with computed Information - Detect Product ID based on Line Name :param line_data: dict :rtype: dict """ from odoo.addons.splashsync.helpers import M2OHelper # ====================================================================# # Detect Wrong or Empty Product ID # ====================================================================# try: if not M2OHelper.verify_id( ObjectsHelper.id(line_data["product_id"]), 'product.product'): raise Exception("Invalid Product ID") except Exception: # ====================================================================# # Try detection based on Line Description try: product_id = M2OHelper.verify_name(line_data["name"], 'default_code', 'product.product') if int(product_id) > 0: line_data["product_id"] = ObjectsHelper.encode( "Product", str(product_id)) except Exception: pass return line_data
def buildOrderCoreFields(self): # ==================================================================== # # Order Final Customer FieldFactory.create( ObjectsHelper.encode("ThirdParty", const.__SPL_T_ID__), "partner_id", "Customer") FieldFactory.microData("http://schema.org/Organization", "ID") FieldFactory.group("General") FieldFactory.isRequired() # ==================================================================== # # Order Billing Address FieldFactory.create( ObjectsHelper.encode("Address", const.__SPL_T_ID__), "partner_invoice_id", "Invoice Address") FieldFactory.microData("http://schema.org/Order", "billingAddress") FieldFactory.group("General") FieldFactory.isRequired() # ==================================================================== # # Order Shipping Address FieldFactory.create( ObjectsHelper.encode("Address", const.__SPL_T_ID__), "partner_shipping_id", "Shipping Address") FieldFactory.microData("http://schema.org/Order", "orderDelivery") FieldFactory.group("General") FieldFactory.isRequired() # ==================================================================== # # Order Date FieldFactory.create(const.__SPL_T_DATE__, "date_order", "Order Date") FieldFactory.microData("http://schema.org/Order", "orderDate") FieldFactory.group("General") FieldFactory.isRequired()
def __set_raw_value(line, field_id, field_data): """ Set simple value of Order Line :param line: sale.order.line :param field_id: str :param field_data: mixed """ from odoo.addons.splashsync.helpers import TaxHelper, SettingsManager, M2MHelper tax_field_id = "tax_id" if OrderLinesHelper.is_order_line( line) else "invoice_line_tax_ids" # ==================================================================== # # [CORE] Order Line Fields # ==================================================================== # # ==================================================================== # # Linked Product ID if field_id == "product_id" and isinstance( ObjectsHelper.id(field_data), (int, str)): line.product_id = int(ObjectsHelper.id(field_data)) # ==================================================================== # # Description # Qty Ordered | Qty Shipped/Delivered | Qty Invoiced # Delivery Lead Time | Line Status # Line Unit Price Reduction (Percent) if field_id in OrderLinesHelper.__generic_fields: setattr(line, field_id, field_data) # ==================================================================== # # Line Unit Price (HT) if field_id == "price_unit": line.price_unit = PricesHelper.extract(field_data, "ht") if not SettingsManager.is_sales_adv_taxes(): setattr( line, tax_field_id, TaxHelper.find_by_rate( PricesHelper.extract(field_data, "vat"), 'sale')) # ==================================================================== # # Sales Taxes if field_id == "tax_name" and SettingsManager.is_sales_adv_taxes(): field_data = '["' + field_data + '"]' if isinstance( field_data, str) else "[]" M2MHelper.set_names(line, tax_field_id, field_data, domain=TaxHelper.tax_domain, filters=[("type_tax_use", "=", 'sale')]) if field_id == "tax_names" and SettingsManager.is_sales_adv_taxes(): M2MHelper.set_names(line, tax_field_id, field_data, domain=TaxHelper.tax_domain, filters=[("type_tax_use", "=", 'sale')]) # ==================================================================== # # [EXTRA] Order Line Fields # ==================================================================== # return True
def buildParentFields(self): FieldFactory.create( ObjectsHelper.encode("ThirdParty", const.__SPL_T_ID__), "parent_id", "Parent") FieldFactory.microData("http://schema.org/Organization", "ID") if self.name is "Address": FieldFactory.isRequired()
def getVariantsFields(self, index, field_id): # ==================================================================== # # Check if this Variant Field... base_field_id = ListHelper.initOutput(self._out, "variants", field_id) if base_field_id is None: return # ==================================================================== # # Check if Product has Variants if not AttributesHelper.has_attr(self.object): self._in.__delitem__(index) return # ==================================================================== # # List Product Variants Ids for variant in self.object.with_context( active_test=False).product_variant_ids: # ==================================================================== # # Debug Mode => Filter Current Product From List if Framework.isDebugMode() and variant.id == self.object.id: continue # ==================================================================== # # Read Variant Data if base_field_id == "id": value = ObjectsHelper.encode("Product", str(variant.id)) elif base_field_id == "sku": value = str(variant.code) ListHelper.insert(self._out, "variants", field_id, "var-" + str(variant.id), value) self._in.__delitem__(index)
def buildVariantsFields(self): # ==================================================================== # # Product Variation Parent Link FieldFactory.create(const.__SPL_T_VARCHAR__, "variant_template", "Template ID") FieldFactory.name("Template ID") FieldFactory.group("Meta") FieldFactory.microData("http://schema.org/Product", "isVariationOf") FieldFactory.isReadOnly() # ==================================================================== # # CHILD PRODUCTS INFORMATION # ==================================================================== # # ==================================================================== # # Product Variation List - Product Link FieldFactory.create( ObjectsHelper.encode("Product", const.__SPL_T_ID__), "id") FieldFactory.name("Variant ID") FieldFactory.inlist("variants") FieldFactory.microData("http://schema.org/Product", "Variants") FieldFactory.isNotTested() FieldFactory.create(const.__SPL_T_VARCHAR__, "sku") FieldFactory.name("Variant SKU") FieldFactory.inlist("variants") FieldFactory.isReadOnly()
def detect_variant_template(self): """ Detect if Product Template for New Product :return: None|int """ # ====================================================================# # Check if Inputs Contains Variants Ids if "variants" not in self._in.keys() or not isinstance( self._in["variants"], dict): return None # ====================================================================# # Walk on Variants Items for key, variant in self._in["variants"].items(): # Variant Object Splash Id is Here if "id" not in variant.keys() or not isinstance( variant["id"], str): continue # Variant Object Splash Id is Valid product_id = ObjectsHelper.id(variant["id"]) if not isinstance(product_id, str) or int(product_id) <= 0: continue # Load Variant Product product = self.load(int(product_id)) if product is False or not isinstance( product.product_tmpl_id[0].id, int): continue # Return product Template Id return product.product_tmpl_id[0].id return None
def add_invoice_line(invoice, line_data): """ Add a New Line to an Invoice :param invoice: account.invoice :param line_data: dict :return: account.invoice.line """ # ====================================================================# # Load Account Id from Configuration account_id = OrderLinesHelper.detect_sales_account_id(invoice) # ====================================================================# # Safety Check if account_id is None or int(account_id) <= 0: Framework.log().error( "Unable to detect Account Id, Add Invoice Line skipped.") Framework.log().error("Please check your configuration.") return None # ====================================================================# # Prepare Minimal Order Line Data req_fields = { "invoice_id": invoice.id, "account_id": account_id, "sequence": 10 + len(invoice.invoice_line_ids), } # ====================================================================# # Link to Product try: req_fields["product_id"] = int( ObjectsHelper.id(line_data["product_id"])) except: pass # ==================================================================== # # Description # Qty Invoiced for field_id in OrderLinesHelper.__generic_fields: try: req_fields[field_id] = line_data[field_id] except: pass # ====================================================================# # Unit Price try: req_fields["price_unit"] = PricesHelper.extract( line_data["price_unit"], "ht") except: pass # ====================================================================# # Create Order Line try: return http.request.env["account.invoice.line"].create(req_fields) except Exception as exception: Framework.log().error( "Unable to create Invoice Line, please check inputs.") Framework.log().fromException(exception, False) Framework.log().dump(req_fields, "New Invoice Line") return None
def add_order_line(order, line_data): """ Add a New Line to an Order :param order: sale.order :return: sale.order.line """ # ====================================================================# # Prepare Minimal Order Line Data req_fields = { "order_id": order.id, "sequence": 10 + len(order.order_line), "qty_delivered_method": 'manual', } # ====================================================================# # Link to Product try: req_fields["product_id"] = int( ObjectsHelper.id(line_data["product_id"])) except: Framework.log().error( "Unable to create Order Line, Product Id is Missing") return None # ==================================================================== # # Description # Qty Ordered | Qty Shipped/Delivered | Qty Invoiced # Delivery Lead Time | Line Status for field_id in OrderLinesHelper.__generic_fields: try: req_fields[field_id] = line_data[field_id] except: pass # ====================================================================# # Unit Price try: req_fields["price_unit"] = PricesHelper.extract( line_data["price_unit"], "ht") except: pass # ====================================================================# # Create Order Line try: return http.request.env["sale.order.line"].create(req_fields) except Exception as exception: Framework.log().error( "Unable to create Order Line, please check inputs.") Framework.log().fromException(exception, False) Framework.log().dump(req_fields, "New Order Line") return None
def collectRequiredFields(self): """ Collect All Required Fields from Inputs :return: False|hash """ from splashpy import Framework # ====================================================================# # Safety Check - All required fields are there if self.is_ready_for_create() is not True: return Framework.log().error(self.is_ready_for_create()) # ====================================================================# # Safety Check - Tracking Policy is Required if "picking_policy" not in self._in: self._in["picking_policy"] = "one" # ====================================================================# # Collect Basic Core Fields req_fields = self.collectRequiredCoreFields() self._in.__delitem__("picking_policy") if req_fields is False or req_fields.__len__() < 1: return False # ====================================================================# # Collect Order Core Fields for field_id in OrderCore.__core_fields_ids: # ====================================================================# # Setup Order Date if field_id == "date_order": req_fields[field_id] = self._in[field_id] continue # ====================================================================# # Setup Order Relations req_fields[field_id] = int(ObjectsHelper.id(self._in[field_id])) object_filters = PartnersHelper.thirdparty_filter( ) if field_id is "partner_id" else PartnersHelper.address_filter() if not M2OHelper.verify_id(req_fields[field_id], "res.partner", object_filters): return Framework.log().error( "Unable to Identify Pointed Object: " + str(self._in[field_id])) # ====================================================================# # Safety Check return req_fields
def collectRequiredFields(self): """ Collect All Required Fields from Inputs :return: False|hash """ from splashpy import Framework # ====================================================================# # Safety Check - All required fields are there if self.is_ready_for_create() is not True: return Framework.log().error(self.is_ready_for_create()) # ====================================================================# # Collect Basic Core Fields req_fields = self.collectRequiredCoreFields() if req_fields is False: return False # ====================================================================# # Collect Order Core Fields for field_id in InvoiceCore.__core_fields_ids: # ====================================================================# # Setup Order Date if field_id in ['date_invoice']: req_fields[field_id] = self._in[field_id] continue # ====================================================================# # Setup Order Relations req_fields[field_id] = int(ObjectsHelper.id(self._in[field_id])) object_filters = PartnersHelper.thirdparty_filter( ) if field_id is "partner_id" else PartnersHelper.address_filter() if not M2OHelper.verify_id(req_fields[field_id], "res.partner", object_filters): return Framework.log().error( "Unable to Identify Pointed Object: " + str(self._in[field_id])) # ====================================================================# # Safety Check return req_fields
def buildLinesFields(self): """Build Order Lines Fields""" from odoo.addons.splashsync.helpers import SettingsManager, TaxHelper # ==================================================================== # # [CORE] Order Line Fields # ==================================================================== # # ==================================================================== # # Linked Product ID FieldFactory.create( ObjectsHelper.encode("Product", const.__SPL_T_ID__), "product_id", "Product ID") FieldFactory.inlist("lines") FieldFactory.microData("http://schema.org/Product", "productID") FieldFactory.association("product_uom_qty@lines", "price_unit@lines") # ==================================================================== # # Description FieldFactory.create(const.__SPL_T_VARCHAR__, "name", "Product Desc.") FieldFactory.inlist("lines") FieldFactory.microData("http://schema.org/partOfInvoice", "description") FieldFactory.association("product_id@lines", "product_uom_qty@lines", "price_unit@lines") # ==================================================================== # # Qty Ordered FieldFactory.create(const.__SPL_T_INT__, "product_uom_qty", "Ordered Qty") FieldFactory.inlist("lines") FieldFactory.microData("http://schema.org/QuantitativeValue", "value") FieldFactory.association("product_id@lines", "product_uom_qty@lines", "price_unit@lines") # ==================================================================== # # Qty Shipped/Delivered FieldFactory.create(const.__SPL_T_INT__, "qty_delivered_manual", "Delivered Qty") FieldFactory.inlist("lines") FieldFactory.microData("http://schema.org/OrderItem", "orderDelivery") FieldFactory.association("product_id@lines", "product_uom_qty@lines", "price_unit@lines") FieldFactory.isReadOnly() # ==================================================================== # # Qty Invoiced FieldFactory.create(const.__SPL_T_INT__, "qty_invoiced", "Invoiced Qty") FieldFactory.inlist("lines") FieldFactory.microData("http://schema.org/OrderItem", "orderQuantity") FieldFactory.association("product_id@lines", "product_uom_qty@lines", "price_unit@lines") FieldFactory.isReadOnly() # ==================================================================== # # Line Unit Price (HT) FieldFactory.create(const.__SPL_T_PRICE__, "price_unit", "Unit Price") FieldFactory.inlist("lines") FieldFactory.microData("http://schema.org/PriceSpecification", "price") FieldFactory.association("product_id@lines", "product_uom_qty@lines", "price_unit@lines") # ==================================================================== # # Line Unit Price Reduction (Percent) FieldFactory.create(const.__SPL_T_DOUBLE__, "discount", "Discount") FieldFactory.inlist("lines") FieldFactory.microData("http://schema.org/Order", "discount") FieldFactory.association("product_id@lines", "product_uom_qty@lines", "price_unit@lines") # ==================================================================== # # Sales Taxes (One) FieldFactory.create(const.__SPL_T_VARCHAR__, "tax_name", "Tax Name") FieldFactory.inlist("lines") FieldFactory.microData("http://schema.org/PriceSpecification", "valueAddedTaxName") FieldFactory.addChoices(TaxHelper.get_name_values("sale")) FieldFactory.isReadOnly(not SettingsManager.is_sales_adv_taxes()) FieldFactory.isNotTested() # ==================================================================== # # Sales Taxes (Multi) FieldFactory.create(const.__SPL_T_INLINE__, "tax_names", "Taxes") FieldFactory.inlist("lines") FieldFactory.microData("http://schema.org/PriceSpecification", "valueAddedTaxNames") FieldFactory.addChoices(TaxHelper.get_name_values("sale")) FieldFactory.isReadOnly(not SettingsManager.is_sales_adv_taxes()) FieldFactory.isNotTested() # ==================================================================== # # [EXTRA] Order Line Fields # ==================================================================== # # ==================================================================== # # Product reference FieldFactory.create(const.__SPL_T_VARCHAR__, "product_ref", "Product Ref.") FieldFactory.inlist("lines") FieldFactory.microData("http://schema.org/Product", "ref") FieldFactory.isReadOnly().isNotTested() # ==================================================================== # # Delivery Lead Time FieldFactory.create(const.__SPL_T_DOUBLE__, "lead_time", "Customer LeadTime") FieldFactory.inlist("lines") FieldFactory.microData("http://schema.org/Offer", "deliveryLeadTime") FieldFactory.isNotTested() # ==================================================================== # # Line Status FieldFactory.create(const.__SPL_T_VARCHAR__, "state", "Line Status") FieldFactory.inlist("lines") FieldFactory.microData("http://schema.org/OrderItem", "LineStatus") FieldFactory.isReadOnly().isNotTested()
def __get_raw_values(line, field_id): """ Line Single Value for given Field :param line: sale.order.line :param field_id: str :return: dict """ from odoo.addons.splashsync.helpers import CurrencyHelper, TaxHelper, SettingsManager, M2MHelper # ==================================================================== # # [CORE] Order Line Fields # ==================================================================== # # ==================================================================== # # Linked Product ID if field_id == "product_id": try: return ObjectsHelper.encode("Product", str(line.product_id[0].id)) except: return None # ==================================================================== # # Description # Qty Ordered | Qty Shipped/Delivered | Qty Invoiced # Delivery Lead Time | Line Status # Line Unit Price Reduction (Percent) if field_id in OrderLinesHelper.__generic_fields: if field_id in OrderLinesHelper.__qty_fields: return int(getattr(line, field_id)) return getattr(line, field_id) # ==================================================================== # # Line Unit Price (HT) if field_id == "price_unit": return PricesHelper.encode( float(line.price_unit), TaxHelper.get_tax_rate( line.tax_id if OrderLinesHelper.is_order_line(line) else line.invoice_line_tax_ids, 'sale'), None, CurrencyHelper.get_main_currency_code()) # ==================================================================== # # Sales Taxes if field_id == "tax_name": try: tax_ids = line.tax_id if OrderLinesHelper.is_order_line( line) else line.invoice_line_tax_ids return tax_ids[0].name except: return None if field_id == "tax_names": return M2MHelper.get_names( line, "tax_id" if OrderLinesHelper.is_order_line(line) else "invoice_line_tax_ids") # ==================================================================== # # [EXTRA] Order Line Fields # ==================================================================== # # ==================================================================== # # Product reference if field_id == "product_ref": try: return str(line.product_id[0].default_code) except: return None return None