Skip to content

Commit 93efd58

Browse files
committed
fixup!
1 parent d8e2588 commit 93efd58

7 files changed

Lines changed: 85 additions & 46 deletions

File tree

stock_outgoing_shipment_report/README.rst

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,14 @@ Stock Outgoing Shipment Report
2222

2323
|badge1| |badge2| |badge3|
2424

25-
This module does the following:
26-
27-
- Adds stock.outgoing.shipment.report model to export shipment data.
25+
Generates outgoing shipment reports from stock pickings for export to
26+
external systems.
27+
28+
- Creates report lines from delivery order moves with partner, carrier,
29+
and product details
30+
- Formats dates (dispatch, delivery, expiry) and truncates fields to
31+
required lengths
32+
- Validates warehouse lot numbers to ASCII characters only
2833

2934
**Table of contents**
3035

stock_outgoing_shipment_report/models/res_partner.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,14 @@ def _get_shipping_address(self):
1616
self.street or "",
1717
self.street2 or "",
1818
)
19+
20+
def _get_shipment_report_vals(self):
21+
partner_address = self._get_shipping_address()
22+
return {
23+
"partner_ref": self.ref[:10] if self.ref else False,
24+
"partner_zip": self.zip[:8] if self.zip else False,
25+
"partner_name": self.display_name,
26+
"partner_address": partner_address[:80] if partner_address else False,
27+
"partner_phone": self.phone[:12] if self.phone else False,
28+
"customer_delivery_note": self.delivery_time,
29+
}

stock_outgoing_shipment_report/models/stock_outgoing_shipment_report.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,22 +43,18 @@ class StockOutgoingShipmentReport(models.Model):
4343
store=True,
4444
)
4545

46-
@api.depends(
47-
"move_id.date_deadline",
48-
"move_id.picking_id.date_deadline",
49-
"expiry_date_edit",
50-
)
46+
@api.depends("move_id.date", "move_id.date_deadline", "expiry_date_edit")
5147
def _compute_date_fields(self):
5248
date_format = "%Y/%m/%d"
5349
for line in self:
5450
move = line.move_id
55-
if move.date_deadline:
51+
if move.date:
5652
line.dispatch_date = fields.Datetime.context_timestamp(
57-
self, move.date_deadline
53+
self, move.date
5854
).strftime(date_format)
59-
if move.picking_id.date_deadline:
55+
if move.date_deadline:
6056
line.delivery_date = fields.Datetime.context_timestamp(
61-
self, move.picking_id.date_deadline
57+
self, move.date_deadline
6258
).strftime(date_format)
6359
if line.expiry_date_edit:
6460
line.expiry_date = line.expiry_date_edit.strftime(date_format)
@@ -68,5 +64,5 @@ def _check_lot_num(self):
6864
for rec in self:
6965
if rec.lot_num and not rec.lot_num.isascii():
7066
raise ValidationError(
71-
_("Please enter the warehouse lot using ASCII " "characters only.")
67+
_("Please key in the warehouse lot in ASCII characters.")
7268
)

stock_outgoing_shipment_report/models/stock_picking.py

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,45 +7,32 @@
77
class StockPicking(models.Model):
88
_inherit = "stock.picking"
99

10-
def _get_partner_vals(self, partner):
11-
partner_address = partner._get_shipping_address()
12-
return {
13-
"partner_ref": partner.ref[:10] if partner.ref else False,
14-
"partner_zip": partner.zip[:8] if partner.zip else False,
15-
"partner_name": partner.display_name,
16-
"partner_address": partner_address[:80] if partner_address else False,
17-
"partner_phone": partner.phone[:12] if partner.phone else False,
18-
"customer_delivery_note": partner.delivery_time,
19-
}
20-
2110
def generate_stock_outgoing_shipment_report(self):
2211
report_obj = self.env["stock.outgoing.shipment.report"]
2312
moves = self.mapped("move_ids")
2413
for move in moves:
25-
order = move.group_id.sale_id
14+
carrier = move.picking_id.carrier_id
2615
partner = move.picking_id.partner_id
2716
product = move.product_id
2817
sale_line = move.sale_line_id
2918
vals = {
3019
"move_id": move.id,
31-
"shipping_mode": order.carrier_id.shipping_mode,
32-
"carrier_id": order.carrier_id.id if order else False,
33-
"carrier_name": order.carrier_id.name[:20]
34-
if order and order.carrier_id
35-
else False,
20+
"shipping_mode": carrier.shipping_mode,
21+
"carrier_id": carrier.id,
22+
"carrier_name": carrier and carrier.name[:20] or False,
3623
"product_code": product.default_code[:7]
3724
if product.default_code
3825
else False,
3926
"product_name": product.name[:32],
40-
"client_order_ref": sale_line and sale_line.client_order_ref,
27+
"client_order_ref": sale_line.client_order_ref,
4128
"memo": sale_line.note[:9] if sale_line.note else False,
4229
}
4330
secondary_uom = move.product_id.stock_secondary_uom_id
4431
if secondary_uom:
4532
factor = secondary_uom.factor * move.product_uom.factor
4633
vals.update({"case_qty": int(move.quantity / (factor or 1.0))})
4734
if partner:
48-
partner_vals = self._get_partner_vals(partner)
35+
partner_vals = partner._get_shipment_report_vals()
4936
vals.update(partner_vals)
5037
move_rec = report_obj.search([("move_id", "=", move.id)])
5138
move_rec.write(vals) if move_rec else report_obj.create(vals)
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
This module does the following:
1+
Generates outgoing shipment reports from stock pickings for export to external systems.
22

3-
- Adds stock.outgoing.shipment.report model to export shipment data.
3+
- Creates report lines from delivery order moves with partner, carrier, and product details
4+
- Formats dates (dispatch, delivery, expiry) and truncates fields to required lengths
5+
- Validates warehouse lot numbers to ASCII characters only

stock_outgoing_shipment_report/static/description/index.html

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,10 @@
88

99
/*
1010
:Author: David Goodger ([email protected])
11-
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
11+
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
1212
:Copyright: This stylesheet has been placed in the public domain.
1313
1414
Default cascading style sheet for the HTML output of Docutils.
15-
Despite the name, some widely supported CSS2 features are used.
1615
1716
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
1817
customize this style sheet.
@@ -275,7 +274,7 @@
275274
margin-left: 2em ;
276275
margin-right: 2em }
277276

278-
pre.code .ln { color: gray; } /* line numbers */
277+
pre.code .ln { color: grey; } /* line numbers */
279278
pre.code, code { background-color: #eeeeee }
280279
pre.code .comment, code .comment { color: #5C6576 }
281280
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
@@ -301,7 +300,7 @@
301300
span.pre {
302301
white-space: pre }
303302

304-
span.problematic, pre.problematic {
303+
span.problematic {
305304
color: red }
306305

307306
span.section-subtitle {
@@ -370,9 +369,14 @@ <h1 class="title">Stock Outgoing Shipment Report</h1>
370369
!! source digest: sha256:41fd6e5731b88042a9e51e5af1dc2d38587a90bc7a364f4026910893de890bf3
371370
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
372371
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/qrtl/hls-custom/tree/18.0/stock_outgoing_shipment_report"><img alt="qrtl/hls-custom" src="https://img.shields.io/badge/github-qrtl%2Fhls--custom-lightgray.png?logo=github" /></a></p>
373-
<p>This module does the following:</p>
372+
<p>Generates outgoing shipment reports from stock pickings for export to
373+
external systems.</p>
374374
<ul class="simple">
375-
<li>Adds stock.outgoing.shipment.report model to export shipment data.</li>
375+
<li>Creates report lines from delivery order moves with partner, carrier,
376+
and product details</li>
377+
<li>Formats dates (dispatch, delivery, expiry) and truncates fields to
378+
required lengths</li>
379+
<li>Validates warehouse lot numbers to ASCII characters only</li>
376380
</ul>
377381
<p><strong>Table of contents</strong></p>
378382
<div class="contents local topic" id="contents">

stock_outgoing_shipment_report/tests/test_stock_outgoing_shipment_report.py

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
# Copyright 2020 Quartile (https://www.quartile.co)
22
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
33

4+
from datetime import date, datetime
5+
6+
from odoo.exceptions import ValidationError
47
from odoo.tests import TransactionCase, tagged
58

69

@@ -12,11 +15,15 @@ def setUpClass(cls):
1215
cls.partner = cls.env["res.partner"].create(
1316
{
1417
"name": "Test Partner",
18+
"zip": "123-4567",
1519
"state_id": cls.env.ref("base.state_jp_jp-02").id,
1620
"city": "City",
1721
"street": "Street",
1822
"street2": "Street2",
23+
# 16 characters to test truncation to 12
24+
"phone": "03-1234-5678-999",
1925
"delivery_time": "test",
26+
"ref": "CUST001",
2027
}
2128
)
2229
cls.env.ref("delivery.free_delivery_carrier").write({"shipping_mode": "10"})
@@ -51,17 +58,20 @@ def setUpClass(cls):
5158
cls.sale_order.action_confirm()
5259
cls.pickings = cls.sale_order.picking_ids
5360

54-
def test_01_get_shipping_address(self):
55-
self.assertEqual(
56-
self.partner._get_shipping_address(), "AomoriCityStreetStreet2"
57-
)
61+
def test_partner_get_shipment_report_vals(self):
62+
vals = self.partner._get_shipment_report_vals()
63+
self.assertEqual(vals["partner_ref"], "CUST001")
64+
self.assertEqual(vals["partner_zip"], "123-4567")
65+
self.assertEqual(vals["partner_address"], "AomoriCityStreetStreet2")
66+
# Truncated to 12 characters
67+
self.assertEqual(vals["partner_phone"], "03-1234-5678")
68+
self.assertEqual(vals["customer_delivery_note"], "test")
5869

59-
def test_02_generate_stock_outgoing_shipment_report(self):
70+
def test_generate_stock_outgoing_shipment_report(self):
6071
self.pickings.generate_stock_outgoing_shipment_report()
6172
report_lines = self.env["stock.outgoing.shipment.report"].search([])
6273
self.assertEqual(len(report_lines), 2)
6374
test_line = report_lines[0]
64-
6575
self.assertEqual(test_line.shipping_mode, "10")
6676
self.assertEqual(
6777
test_line.carrier_name,
@@ -71,3 +81,27 @@ def test_02_generate_stock_outgoing_shipment_report(self):
7181
self.assertEqual(test_line.product_name, self.product.name)
7282
self.assertEqual(test_line.client_order_ref, "ref0001")
7383
self.assertEqual(test_line.memo, "Test Note")
84+
85+
def test_lot_num_constraint(self):
86+
report = self.env["stock.outgoing.shipment.report"].create({})
87+
report.lot_num = "ABC123" # ASCII - should pass
88+
with self.assertRaises(ValidationError):
89+
report.lot_num = "あ123" # Non-ASCII - should fail
90+
91+
def test_compute_date_fields(self):
92+
move = self.pickings.move_ids[0]
93+
move.write(
94+
{
95+
"date": datetime(2025, 1, 15, 10, 0, 0),
96+
"date_deadline": datetime(2025, 1, 20, 10, 0, 0),
97+
}
98+
)
99+
report = self.env["stock.outgoing.shipment.report"].create(
100+
{
101+
"move_id": move.id,
102+
"expiry_date_edit": date(2025, 2, 28),
103+
}
104+
)
105+
self.assertEqual(report.dispatch_date, "2025/01/15")
106+
self.assertEqual(report.delivery_date, "2025/01/20")
107+
self.assertEqual(report.expiry_date, "2025/02/28")

0 commit comments

Comments
 (0)