Skip to content

Instantly share code, notes, and snippets.

@vsanjuan
Last active August 29, 2015 14:06
Show Gist options
  • Select an option

  • Save vsanjuan/ae162a2c91213651109b to your computer and use it in GitHub Desktop.

Select an option

Save vsanjuan/ae162a2c91213651109b to your computer and use it in GitHub Desktop.

Revisions

  1. vsanjuan revised this gist Sep 11, 2014. 1 changed file with 3 additions and 3 deletions.
    6 changes: 3 additions & 3 deletions costactivitytool.py
    Original file line number Diff line number Diff line change
    @@ -90,8 +90,6 @@ def CalculateCost(self, productcode):
    for materialcode, material_usage in self.billofmaterials:
    material_cost += materialtrax[material_code].cost_per_product(material_usage.consumption)

    for activity_code, activity_usage in self.billofactivities:
    activity_cost += activitytrax[activity_code].cost_per_product(activity_usage.consumption)

    return material_cost, activity_cost

    @@ -289,4 +287,6 @@ def addActivity(self, code, name, description, cost_per_unit, activity_unit):
    productB.addMaterial(1, 10,"Kg.", 1, "Unit", 5)
    productB.addMaterial(2, 20,"Kg.", 1, "Unit", 10)

    print "Bill of materials \n", productB.billofmaterials
    print "Bill of materials \n", productB.billofmaterials

    print productB.CalculateCost()
  2. vsanjuan renamed this gist Sep 11, 2014. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  3. vsanjuan created this gist Sep 11, 2014.
    292 changes: 292 additions & 0 deletions costactivitytool
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,292 @@
    from persistent import Persistent
    import transaction
    import ZODB
    import ZODB.FileStorage

    class Product(Persistent):
    """Models a product composition by listing the materials and activities
    needed to produce it.

    Attributes:

    Code: A key that uniquely identifies the product.
    Name: Name of the product.
    Materials: List of materials, and amounts needed to make the product.
    Activities: List of activities and its consumption needed to make the product.
    """

    def __init__(self, code, name, description, base_unit):
    """Creates a new product"""
    self.code = code
    self.name = name
    self.description = description
    self.billofmaterials = {}
    self.billofactivities = {}

    def addMaterial(self, material_code, consumption, consumption_unit,
    production_ratio, production_unit, waste, cost_per_unit= 0 ):
    ''' Adds a new material to the product list and the information related
    to the consumption to the F.P. production the parameters are the following:
    material_code : Code of the material to be consumed.
    consumption: Amount of material consumed.
    consumption_unit: Unit in which the consumption amount is expressed.
    production_ratio: Units of F.P. to which the consumption is referred.
    production_unit : Unit of production to which the production ratio is related.
    waste: % of the material thrown to the waste.
    '''
    self.billofmaterials[material_code] = {'material_code': material_code,
    'consumption': consumption,
    'consumption_unit' : consumption_unit,
    'production_unit': production_unit,
    'production_ratio': production_ratio,
    'waste' : waste,
    'cost_per_unit': cost_per_unit}
    # self.billofmaterials._p_changed = True
    self._p_changed = True

    def addActivity(self, activity_code, consumption, activity_unit,
    production_ratio, production_unit, cost_per_unit = 0):
    """Adds a new activity in the product list needed to make the product and
    the information related with the consumption for each unit on F.P.
    Parameters:
    consumption: Amount of activity consumed.
    activiy_unit: Unit in which the consumption amount is expressed.
    production_ratio: Units of F.P. to which the consumption is referred.
    production_unit : Unit of production to which the production ratio is related.
    """
    self.activities[activity_code] = { 'activity_code': activity_code,
    'consumption': consumption,
    'activity_unit': activity_unit,
    'production_ratio': production_ratio,
    'production_unit': production_unit,
    'cost_per_unit' : cost_per_unit }
    self.billofactivities._p_changed = True
    self._p_changed = True


    def CalculateCost(self, productcode):
    """Calculates the direct product cost based on materials and activities consumption.
    This function doesn't check yet:
    A. Consumption units and price units for the activities are homogeneous.
    B. production ratios per unit of output are homogeneous among the activities.
    Parameters:
    Product code
    Returns two values:
    1. Total material cost.
    2. Total activity cost.
    """

    # Recovers the information about activities and materials needed to calculate the cost
    # Maybe it would be better to filter the activities and materials in the bill of materials
    # and bill of activities. I will implement this later if too many materials or activities
    # are loaded in memory.

    activitytrax = ActivityTrax().activities
    materialtrax = MaterialTrax().materials

    material_cost = 0
    activity_cost = 0

    for materialcode, material_usage in self.billofmaterials:
    material_cost += materialtrax[material_code].cost_per_product(material_usage.consumption)

    for activity_code, activity_usage in self.billofactivities:
    activity_cost += activitytrax[activity_code].cost_per_product(activity_usage.consumption)

    return material_cost, activity_cost

    def __str__(self):

    pass



    class Activity(Persistent):

    def __init__(self, code, name, description, cost_per_unit, activity_unit):
    self.code = code
    self.name = name
    self.description = description
    self.cost_per_unit = cost_per_unit
    self.activity_unit = activity_unit

    def cost_per_product(self, product, consumption):

    return consumption * self.cost_per_unit

    def __str__(self):

    return ("Activity Code: %s, Name: %s,\n Description: %s,\n Cost per unit: %s\n Base unit: %s"
    % (self.code, self.name, self.description, self.cost_per_unit, self.activity_unit))




    class Material(Persistent):

    def __init__(self, code, name, description, cost_per_unit, base_unit):
    self.code = code
    self.name = name
    self.description = description
    self.cost_per_unit = cost_per_unit
    self.base_unit = base_unit

    def cost_per_product(self, consumption):

    return consumption * self.cost_per_unit

    def __str__(self):

    return ("Material Code: %s, Name: %s,\n Description: %s,\n Cost per unit: %s\n Base unit: %s"
    % (self.code, self.name, self.description, self.cost_per_unit, self.base_unit))

    class Trax(object):

    db = ZODB.DB(ZODB.FileStorage.FileStorage("products.fs"))
    connection = db.open()
    root = connection.root()

    def __init__(self, intro = "Product trax product tracking helper",
    db_path="products.fs"):

    self.intro = intro


    class ProductTrax(Trax):

    def __init__(self, intro = "Product trax tracking helper",
    db_path="products.fs"):

    Trax.__init__(self)

    if 'products' in self.root:
    self.products = self.root['products']
    else:
    self.products = self.root['products'] = {}


    def addProduct(self, code, name, description, base_unit):

    product = Product( code, name, description, base_unit)
    self.products[code] = product
    transaction.commit()

    def addActivity(self, product_code, activity_code, consumption, activity_unit,
    production_ratio, production_unit, cost_per_unit = 0):

    self.products[product_code].addActivity( activity_code, consumption, activity_unit,
    production_ratio, production_unit, cost_per_unit = 0)

    def addMaterial(self, product_code, material_code, consumption, consumption_unit,
    production_ratio, production_unit, waste, cost_per_unit= 0 ):

    print "From ProductTrax addMaterial product name: exit"
    print self.products[product_code].name

    self.products[product_code].addMaterial( material_code, consumption, consumption_unit,
    production_ratio, production_unit, waste, cost_per_unit= 0 )

    def list_products(self):
    print "Product Title"
    print "======= ====="
    for name, product in self.products.items():
    print "%-20s%s" % (name, product.description)

    def list_materials(self, productcode):
    print "Product: %s" % productcode
    print
    print " Material"
    print "========="
    for productcode, product in self.products[productcode].materials.items():
    print product.name


    class MaterialTrax(Trax):

    def __init__(self, intro = "Material trax tracking helper",
    db_path="products.fs"):

    Trax.__init__(self)
    if 'materials' in self.root:
    self.materials = self.root['materials']
    else:
    self.materials = self.root['materials'] = {}


    def addMaterial(self, code, name, description, base_unit):

    material = Material( code, name, description, base_unit)
    print self.materials.items()
    self.materials[code] = material
    transaction.commit()

    class ActivitiyTrax(Trax):

    def __init__(self, intro = "Material trax tracking helper",
    db_path="products.fs"):

    Trax.__init__(self)
    if 'activities' in self.root:
    self.activities = self.root['activities']
    else:
    self.activities = self.root['activities'] = {}


    def addActivity(self, code, name, description, cost_per_unit, activity_unit):

    activity = Activity( code, name, description, cost_per_unit, activity_unit)
    self.activities[code] = activity
    transaction.commit()




    if __name__ == '__main__':


    # materials = MaterialTrax()

    # materials.addMaterial(1, "PPC 5mm 1000 gm2", "Polipropileno celular 5 mm 1000 grs / m2", "box")
    # materials.addMaterial(2, "PPC 5mm 1200 gm2", "Polipropileno celular 5 mm 1200 grs / m2", "box")


    # print materials.materials[1]

    # products = ProductTrax()

    # activities = ActivitiyTrax()

    # activities.addActivity(1, "Coser", "Coser", 100, "ML")
    # activities.addActivity(2, "Cortar", "Cortar", 50, "Cortes")

    # print activities.activities[1]
    # print activities.activities[2]

    # products.addProduct(1, "Caja A", "Caja PPC", "caja")

    # print products.products[1].name

    products = ProductTrax()

    print products
    # print products.products[1].__dict__
    # print products.products[1].__methods__
    print products.products[1].code
    print products.products[1].name

    print '*' * 80

    #products.addMaterial(1,1, 10,"Kg.", 1, "Unit", 5)
    # products.products[2].addMaterial(1, 10,"Kg.", 1, "Unit", 5)

    # print products.products[1].billofmaterials

    print '*' * 80

    productA = Product(1, "Caja A", "Caja PPC", "caja")
    productB = Product(1, "Caja A", "Caja PPC", "caja")

    productB.addMaterial(1, 10,"Kg.", 1, "Unit", 5)
    productB.addMaterial(2, 20,"Kg.", 1, "Unit", 10)

    print "Bill of materials \n", productB.billofmaterials