Skip to content

Commit

Permalink
[ADD] New delivery wizard & link with put_in_pack - stock_delivery
Browse files Browse the repository at this point in the history
  • Loading branch information
lasley committed May 28, 2016
1 parent 7f0568a commit 19f8e72
Show file tree
Hide file tree
Showing 14 changed files with 301 additions and 13 deletions.
17 changes: 12 additions & 5 deletions stock_delivery/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,30 @@ This module provides extended stock functionality associated with deliveries, su
* Concept of tracking information
* Concept of tracking stages & locations


Installation
============

@TODO:

Configuration
=============

@TODO:

* Enable package tracking in Warehouse settings

Usage
=====

@TODO:
Most of this module revolves around data modules, however a few actions do exist

---------------
Delivery Wizard
---------------

The Delivery Wizard is accessed when `Put In Pack` is utilized in a stock picking.

Creates a Stock Quant Package & associates to Delivery Group + Delivery Package.

This would be the first stage in triggering a shipment, and subsequent label quote if utilizing
an external system.

Credits
=======
Expand Down
1 change: 1 addition & 0 deletions stock_delivery/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from . import models
from . import wizards
1 change: 1 addition & 0 deletions stock_delivery/__openerp__.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
"views/stock_delivery_pack_template_view.xml",
"views/stock_menu.xml",
"views/stock_picking_view.xml",
'wizards/stock_delivery_new_view.xml',
"data/decimal_precision_data.xml",
],
}
5 changes: 5 additions & 0 deletions stock_delivery/models/stock_delivery_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ class StockDeliveryGroup(models.Model):
comodel_name='stock.delivery.pack',
required=True,
)
pack_operation_ids = fields.Many2many(
string='Pack Operations',
comodel_name='stock.pack.operation',
related='pack_id.pack_operation_ids',
)
rate_ids = fields.One2many(
string='Delivery Rates',
comodel_name='stock.delivery.rate',
Expand Down
21 changes: 19 additions & 2 deletions stock_delivery/models/stock_delivery_pack.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,28 @@ class StockDeliveryPack(models.Model):
quant_pack_id = fields.Many2one(
name='Quant Pack',
comodel_name='stock.quant.package',
ondelete='cascade',
ondelete='restrict',
required=True,
)
pack_operation_ids = fields.Many2many(
string='Pack Operations',
comodel_name='stock.pack.operation',
readonly=True,
)

@api.onchange('pack_template_id')
def _onchange_pack_template_id(self):
for key, val in self.read()[0].iteritems():
if not self.pack_template_id:
return None
for key, val in self.pack_template_id.read()[0].iteritems():
if key == 'id':
continue
setattr(self, key, val)

@api.model
def create(self, vals):
""" Hard code usage of quant pack name, instead of delivery pack """
vals['name'] = self.env['stock.quant.package'].browse(
vals['quant_pack_id']
).name
return super(StockDeliveryPack, self).create(vals)
62 changes: 62 additions & 0 deletions stock_delivery/models/stock_pack_operation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# -*- coding: utf-8 -*-
# © 2016-TODAY LasLabs Inc.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from openerp import models, fields
import openerp.addons.decimal_precision as dp


class StockDeliveryRate(models.Model):
_name = 'stock.delivery.rate'
_description = 'Stock Delivery Rate'

group_id = fields.Many2one(
string='Delivery Group',
comodel_name='stock.delivery.group',
required=True,
)
partner_id = fields.Many2one(
string='Carrier Company',
comodel_name='res.partner',
related='service_id.partner_id',
)
service_id = fields.Many2one(
string='Carrier Service',
comodel_name='delivery.carrier',
required=True,
)
date_generated = fields.Datetime(
required=True,
default=lambda s: fields.Datetime.now(),
)
rate_currency_id = fields.Many2one(
string='Rate Currency',
comodel_name='res.currency',
required=True,
)
rate = fields.Float(
digits=dp.get_precision('Product Price'),
required=True,
)
retail_rate = fields.Float(
digits=dp.get_precision('Product Price'),
)
retail_rate_currency_id = fields.Many2one(
string='Retail Rate Currency',
comodel_name='res.currency',
)
list_rate = fields.Float(
digits=dp.get_precision('Product Price'),
)
list_rate_currency_id = fields.Many2one(
string='List Rate Currency',
comodel_name='res.currency',
)
delivery_days = fields.Integer(required=True)
date_delivery = fields.Datetime(
string='Est Delivery Date',
required=True,
)
is_guaranteed = fields.Boolean(
string='Date is Guaranteed?',
)
14 changes: 14 additions & 0 deletions stock_delivery/models/stock_picking.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,17 @@ def _compute_delivery_packages(self):
g.pack_id.id for g in rec_id.delivery_group_ids
]
rec_id.number_of_packages = len(rec_id.delivery_pack_ids)

@api.multi
def put_in_pack(self):
package_id_int = super(StockPicking, self).put_in_pack()
if package_id_int:
pack_op_ids = self.env['stock.pack.operation'].search([
('result_package_id', '=', package_id_int),
])
rec_id = self.env['stock.delivery.new'].create({
'quant_pack_id': package_id_int,
'pack_operation_ids': [(6, 0, [o.id for o in pack_op_ids])],
'picking_ids': [(6, 0, [p.id for p in self])],
})
return rec_id.action_show_wizard()
5 changes: 4 additions & 1 deletion stock_delivery/tests/test_stock_delivery_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,10 @@ def new_record(self):
self.pack_tpl_id = self.env['stock.delivery.pack.template'].create(
self.pack_vals,
)
pack_vals = {'pack_template_id': self.pack_tpl_id.id}
quant_pack_id = self.env['stock.quant.package'].create({})
pack_vals = {'pack_template_id': self.pack_tpl_id.id,
'quant_pack_id': quant_pack_id.id,
}
pack_vals.update(self.pack_vals)
self.pack_id = self.env['stock.delivery.pack'].create(pack_vals)
return self.env['stock.delivery.group'].create({
Expand Down
5 changes: 4 additions & 1 deletion stock_delivery/tests/test_stock_delivery_operation.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,10 @@ def new_record(self):
self.pack_tpl_id = self.env['stock.delivery.pack.template'].create(
self.pack_vals
)
pack_vals = {'pack_template_id': self.pack_tpl_id.id}
quant_pack_id = self.env['stock.quant.package'].create({})
pack_vals = {'pack_template_id': self.pack_tpl_id.id,
'quant_pack_id': quant_pack_id.id,
}
pack_vals.update(self.pack_vals)
self.pack_id = self.env['stock.delivery.pack'].create(pack_vals)
self.group_id = self.env['stock.delivery.group'].create({
Expand Down
8 changes: 5 additions & 3 deletions stock_delivery/views/stock_delivery_pack_template_view.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,24 @@
<field name="name">stock.delivery.pack.template.view.form</field>
<field name="model">stock.delivery.pack.template</field>
<field name="arch" type="xml">
<form string="Delivery Package">
<form string="Delivery Package Template">
<sheet>
<group>
<field name="name" />
<field name="active" />
</group>
<group string="Dimensions">
<group string="Physical">
<group>
<field name="length" />
<field name="width" />
<field name="height" />
<field name="weight" />
</group>
<group>
<field name="length_uom_id" />
<field name="width_uom_id" />
<field name="height_uom_id" />
<field name="weight_uom_id" />
</group>
</group>
</sheet>
Expand All @@ -38,7 +40,7 @@
<field name="name">stock.delivery.pack.template.view.tree</field>
<field name="model">stock.delivery.pack.template</field>
<field name="arch" type="xml">
<tree string="Delivery Packages">
<tree string="Delivery Package Templates">
<field name="name"/>
<field name="length" />
<field name="length_uom_id" />
Expand Down
2 changes: 1 addition & 1 deletion stock_delivery/views/stock_picking_view.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@
<xpath expr="//page[@name='extra']" position="inside">
<separator string="Delivery Information" />
<group>
<field name="delivery_pack_ids" />
<field name="delivery_group_ids"
context="{'default_picking_id': id,
'default_service_id': carrier_id,
}">
<tree>
<field name="pack_id" />
<field name="carrier_tracking_ref" />
<field name="date_delivery_est" widget="date" />
<field name="service_id" />
Expand Down
5 changes: 5 additions & 0 deletions stock_delivery/wizards/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
# © 2016-TODAY LasLabs Inc.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from . import stock_delivery_new
92 changes: 92 additions & 0 deletions stock_delivery/wizards/stock_delivery_new.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# -*- coding: utf-8 -*-
# © 2016-TODAY LasLabs Inc.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from openerp import api, models, fields, _
from openerp.exceptions import ValidationError


import logging
_logger = logging.getLogger(__name__)


class StockDeliveryNew(models.TransientModel):
""" Create a new stock delivery """
_name = "stock.delivery.new"
_description = 'Stock Delivery New'

picking_ids = fields.Many2many(
string='Picking',
comodel_name='stock.picking',
compute='_compute_picking_ids',
)
pack_operation_ids = fields.Many2many(
string='Pack Operations',
comodel_name='stock.pack.operation',
readonly=True,
default=lambda s: s._default_pack_operation_ids(),
)
quant_pack_id = fields.Many2one(
string='Quant Pack',
comodel_name='stock.quant.package',
required=True,
)
delivery_pack_id = fields.Many2one(
string='Delivery Pack',
comodel_name='stock.delivery.pack',
)

@api.multi
def _compute_picking_ids(self):
for rec_id in self:
rec_id.picking_ids = [(6, 0, [
op.picking_id.id for op in rec_id.pack_operation_ids
])]

@api.model
def _default_pack_operation_ids(self):
return [(6, 0, self.env.context.get('active_ids'))]

@api.multi
def action_create_delivery(self):
""" Create a new delivery """
self.ensure_one()
if not self.delivery_pack_id:
raise ValidationError(_(
'Must assign or create a delivery pack in order to continue.',
))
# @TODO: Support for multiple pickings
self.env['stock.delivery.group'].create({
'picking_id': self.picking_ids[0].id,
'pack_id': self.delivery_pack_id.id,
})
return True

@api.multi
def action_show_wizard(self):
""" Utility method to show the wizard
Returns:
Wizard action for completion of delivery packing
"""
self.ensure_one()
model_obj = self.env['ir.model.data']
form_id = model_obj.xmlid_to_object(
'stock_delivery.stock_delivery_new_view_form',
)
action_id = model_obj.xmlid_to_object(
'stock_delivery.stock_delivery_new_action',
)
return {
'name': action_id.name,
'help': action_id.help,
'type': action_id.type,
'view_mode': 'form',
'view_id': form_id.id,
'views': [
(form_id.id, 'form'),
],
'target': 'new',
'context': self.env.context,
'res_model': action_id.res_model,
'res_id': self.id,
}
Loading

0 comments on commit 19f8e72

Please sign in to comment.