Add counter to controller
This commit is contained in:
@@ -7,17 +7,71 @@ from decimal import getcontext, Decimal, ROUND_HALF_UP
|
||||
from sql import Table
|
||||
from trytond.pyson import Bool, Eval, Id, If
|
||||
|
||||
class PartyExecution(ModelSQL,ModelView):
|
||||
"Party Execution"
|
||||
__name__ = 'party.execution'
|
||||
class PartyExecution(ModelSQL,ModelView):
|
||||
"Party Execution"
|
||||
__name__ = 'party.execution'
|
||||
|
||||
party = fields.Many2One('party.party',"Party")
|
||||
area = fields.Many2One('country.region',"Area")
|
||||
percent = fields.Numeric("% targeted")
|
||||
achieved_percent = fields.Function(fields.Numeric("% achieved"),'get_percent')
|
||||
|
||||
def get_percent(self,name):
|
||||
return 2
|
||||
area = fields.Many2One('country.region',"Area")
|
||||
percent = fields.Numeric("% targeted")
|
||||
achieved_percent = fields.Function(fields.Numeric("% achieved"),'get_percent')
|
||||
|
||||
@staticmethod
|
||||
def _to_decimal(value):
|
||||
if value is None:
|
||||
return Decimal('0')
|
||||
if isinstance(value, Decimal):
|
||||
return value
|
||||
return Decimal(str(value))
|
||||
|
||||
@classmethod
|
||||
def _round_percent(cls, value):
|
||||
return cls._to_decimal(value).quantize(
|
||||
Decimal('0.01'), rounding=ROUND_HALF_UP)
|
||||
|
||||
def matches_country(self, country):
|
||||
if not self.area or not country or not getattr(country, 'region', None):
|
||||
return False
|
||||
region = country.region
|
||||
while region:
|
||||
if region.id == self.area.id:
|
||||
return True
|
||||
region = getattr(region, 'parent', None)
|
||||
return False
|
||||
|
||||
def matches_shipment(self, shipment):
|
||||
location = getattr(shipment, 'to_location', None)
|
||||
country = getattr(location, 'country', None)
|
||||
return self.matches_country(country)
|
||||
|
||||
@classmethod
|
||||
def compute_achieved_percent_for(cls, party, area):
|
||||
if not party or not area:
|
||||
return Decimal('0')
|
||||
Shipment = Pool().get('stock.shipment.in')
|
||||
shipments = Shipment.search([
|
||||
('controller', '!=', None),
|
||||
('to_location.country', '!=', None),
|
||||
('to_location.country.region', 'child_of', [area.id]),
|
||||
])
|
||||
total = len(shipments)
|
||||
if not total:
|
||||
return Decimal('0')
|
||||
achieved = sum(
|
||||
1 for shipment in shipments
|
||||
if shipment.controller and shipment.controller.id == party.id)
|
||||
return cls._round_percent(
|
||||
(Decimal(achieved) * Decimal('100')) / Decimal(total))
|
||||
|
||||
def compute_achieved_percent(self):
|
||||
return self.__class__.compute_achieved_percent_for(
|
||||
self.party, self.area)
|
||||
|
||||
def get_target_gap(self):
|
||||
return self._to_decimal(self.percent) - self.compute_achieved_percent()
|
||||
|
||||
def get_percent(self,name):
|
||||
return self.compute_achieved_percent()
|
||||
|
||||
class PartyExecutionSla(ModelSQL,ModelView):
|
||||
"Party Execution Sla"
|
||||
@@ -55,8 +109,8 @@ class PartyExecutionPlace(ModelSQL,ModelView):
|
||||
'readonly': Eval('mode') != 'ppack',
|
||||
})
|
||||
|
||||
class Party(metaclass=PoolMeta):
|
||||
__name__ = 'party.party'
|
||||
class Party(metaclass=PoolMeta):
|
||||
__name__ = 'party.party'
|
||||
|
||||
tol_min = fields.Numeric("Tol - in %")
|
||||
tol_max = fields.Numeric("Tol + in %")
|
||||
@@ -65,13 +119,25 @@ class Party(metaclass=PoolMeta):
|
||||
origin =fields.Char("Origin")
|
||||
execution = fields.One2Many('party.execution','party',"")
|
||||
sla = fields.One2Many('party.execution.sla','party', "Sla")
|
||||
initial = fields.Char("Initials")
|
||||
|
||||
def IsAvailableForControl(self,sh):
|
||||
return True
|
||||
|
||||
def get_sla_cost(self,location):
|
||||
if self.sla:
|
||||
initial = fields.Char("Initials")
|
||||
|
||||
def IsAvailableForControl(self,sh):
|
||||
return True
|
||||
|
||||
def get_controller_execution_priority(self, shipment):
|
||||
best_rule = None
|
||||
best_gap = None
|
||||
for execution in self.execution or []:
|
||||
if not execution.matches_shipment(shipment):
|
||||
continue
|
||||
gap = execution.get_target_gap()
|
||||
if best_gap is None or gap > best_gap:
|
||||
best_gap = gap
|
||||
best_rule = execution
|
||||
return best_gap, best_rule
|
||||
|
||||
def get_sla_cost(self,location):
|
||||
if self.sla:
|
||||
for sla in self.sla:
|
||||
SlaPlace = Pool().get('party.execution.place')
|
||||
sp = SlaPlace.search([('pes','=', sla.id),('location','=',location)])
|
||||
@@ -111,4 +177,4 @@ class Party(metaclass=PoolMeta):
|
||||
pc.category = cat[0].id
|
||||
PartyCategory.save([pc])
|
||||
return p
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user