예제 #1
0
    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
예제 #2
0
파일: core.py 프로젝트: SplashSync/Odoo
 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()
예제 #3
0
    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
예제 #4
0
파일: parent.py 프로젝트: SplashSync/Odoo
 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()
예제 #5
0
파일: variants.py 프로젝트: SplashSync/Odoo
    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)
예제 #6
0
파일: variants.py 프로젝트: SplashSync/Odoo
    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()
예제 #7
0
파일: variants.py 프로젝트: SplashSync/Odoo
    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
예제 #8
0
    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
예제 #9
0
 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
예제 #10
0
파일: core.py 프로젝트: SplashSync/Odoo
    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
예제 #11
0
    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
예제 #12
0
    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()
예제 #13
0
    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