02.04.26
This commit is contained in:
@@ -3930,15 +3930,15 @@
|
|||||||
<text:p text:style-name="P25">Goods description</text:p>
|
<text:p text:style-name="P25">Goods description</text:p>
|
||||||
</table:table-cell>
|
</table:table-cell>
|
||||||
<table:table-cell table:style-name="Tableau5.A1" office:value-type="string">
|
<table:table-cell table:style-name="Tableau5.A1" office:value-type="string">
|
||||||
<text:p text:style-name="P26">QUANTITY: <text:placeholder text:placeholder-type="text"><format_number(invoice.report_lbs, invoice.party.lang) if invoice.report_lbs != '' else ''></text:placeholder><text:s/>LBS (<text:placeholder text:placeholder-type="text"><format_number(invoice.report_net, invoice.party.lang) if invoice.report_net != '' else ''></text:placeholder> MTS)</text:p>
|
<text:p text:style-name="P26">QUANTITY: <text:placeholder text:placeholder-type="text"><format_number(invoice.report_lbs, invoice.party.lang) if invoice.report_lbs != '' else ''></text:placeholder><text:s/>LBS (<text:placeholder text:placeholder-type="text"><format_number(invoice.report_net, invoice.party.lang) if invoice.report_net != '' else ''></text:placeholder> <text:placeholder text:placeholder-type="text"><invoice.report_weight_unit_upper></text:placeholder>)</text:p>
|
||||||
<text:p text:style-name="P26"><text:placeholder text:placeholder-type="text"><for each="line in invoice.report_quantity_lines.splitlines()"></text:placeholder></text:p>
|
<text:p text:style-name="P26"/>
|
||||||
<text:p text:style-name="P26"><text:placeholder text:placeholder-type="text"><line></text:placeholder></text:p>
|
|
||||||
<text:p text:style-name="P26"><text:placeholder text:placeholder-type="text"></for></text:placeholder></text:p>
|
|
||||||
<text:p text:style-name="P21"><text:placeholder text:placeholder-type="text"><invoice.report_description_upper or invoice.report_product_description></text:placeholder><text:s/>CROP <text:placeholder text:placeholder-type="text"><invoice.report_crop_name></text:placeholder></text:p>
|
<text:p text:style-name="P21"><text:placeholder text:placeholder-type="text"><invoice.report_description_upper or invoice.report_product_description></text:placeholder><text:s/>CROP <text:placeholder text:placeholder-type="text"><invoice.report_crop_name></text:placeholder></text:p>
|
||||||
<text:p text:style-name="P21"><text:placeholder text:placeholder-type="text"><invoice.report_attributes_name></text:placeholder></text:p>
|
<text:p text:style-name="P21"><text:placeholder text:placeholder-type="text"><invoice.report_attributes_name></text:placeholder></text:p>
|
||||||
<text:p text:style-name="P18"><text:placeholder text:placeholder-type="text"><for each="line in invoice.report_rate_lines.splitlines()"></text:placeholder></text:p>
|
<text:p text:style-name="P26"><text:placeholder text:placeholder-type="text"><for each="block in invoice.report_trade_blocks"></text:placeholder></text:p>
|
||||||
<text:p text:style-name="P18">At <text:placeholder text:placeholder-type="text"><line></text:placeholder></text:p>
|
<text:p text:style-name="P26"><text:placeholder text:placeholder-type="text"><block[0]></text:placeholder></text:p>
|
||||||
<text:p text:style-name="P18"><text:placeholder text:placeholder-type="text"></for></text:placeholder></text:p>
|
<text:p text:style-name="P18">At <text:placeholder text:placeholder-type="text"><block[1]></text:placeholder></text:p>
|
||||||
|
<text:p text:style-name="P18"/>
|
||||||
|
<text:p text:style-name="P26"><text:placeholder text:placeholder-type="text"></for></text:placeholder></text:p>
|
||||||
<text:p text:style-name="P18"/>
|
<text:p text:style-name="P18"/>
|
||||||
<text:p text:style-name="P18"/>
|
<text:p text:style-name="P18"/>
|
||||||
<text:p text:style-name="P32"><text:placeholder text:placeholder-type="text"><invoice.report_incoterm></text:placeholder></text:p>
|
<text:p text:style-name="P32"><text:placeholder text:placeholder-type="text"><invoice.report_incoterm></text:placeholder></text:p>
|
||||||
@@ -3957,10 +3957,10 @@
|
|||||||
<text:p text:style-name="P15"><text:s text:c="19"/>BALES</text:p>
|
<text:p text:style-name="P15"><text:s text:c="19"/>BALES</text:p>
|
||||||
</table:table-cell>
|
</table:table-cell>
|
||||||
<table:table-cell table:style-name="Tableau6.A1" office:value-type="string">
|
<table:table-cell table:style-name="Tableau6.A1" office:value-type="string">
|
||||||
<text:p text:style-name="P41"><text:s text:c="13"/>Gross KGS</text:p>
|
<text:p text:style-name="P41"><text:s text:c="13"/>Gross <text:placeholder text:placeholder-type="text"><invoice.report_weight_unit_upper></text:placeholder></text:p>
|
||||||
</table:table-cell>
|
</table:table-cell>
|
||||||
<table:table-cell table:style-name="Tableau6.A1" office:value-type="string">
|
<table:table-cell table:style-name="Tableau6.A1" office:value-type="string">
|
||||||
<text:p text:style-name="P15"><text:s text:c="13"/>NET KGS</text:p>
|
<text:p text:style-name="P15"><text:s text:c="13"/>NET <text:placeholder text:placeholder-type="text"><invoice.report_weight_unit_upper></text:placeholder></text:p>
|
||||||
</table:table-cell>
|
</table:table-cell>
|
||||||
<table:table-cell table:style-name="Tableau6.A1" office:value-type="string">
|
<table:table-cell table:style-name="Tableau6.A1" office:value-type="string">
|
||||||
<text:p text:style-name="P41"><text:s text:c="10"/></text:p>
|
<text:p text:style-name="P41"><text:s text:c="10"/></text:p>
|
||||||
|
|||||||
@@ -191,6 +191,19 @@ class Invoice(metaclass=PoolMeta):
|
|||||||
details.append(detail)
|
details.append(detail)
|
||||||
return '\n'.join(details)
|
return '\n'.join(details)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def report_trade_blocks(self):
|
||||||
|
sale = self._get_report_sale()
|
||||||
|
if sale and getattr(sale, 'report_trade_blocks', None):
|
||||||
|
return sale.report_trade_blocks
|
||||||
|
blocks = []
|
||||||
|
quantity_lines = self.report_quantity_lines.splitlines()
|
||||||
|
rate_lines = self.report_rate_lines.splitlines()
|
||||||
|
for index, quantity_line in enumerate(quantity_lines):
|
||||||
|
price_line = rate_lines[index] if index < len(rate_lines) else ''
|
||||||
|
blocks.append((quantity_line, price_line))
|
||||||
|
return blocks
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def report_rate_currency_upper(self):
|
def report_rate_currency_upper(self):
|
||||||
line = self._get_report_invoice_line()
|
line = self._get_report_invoice_line()
|
||||||
@@ -337,6 +350,17 @@ class Invoice(metaclass=PoolMeta):
|
|||||||
return ''
|
return ''
|
||||||
return round(Decimal(net) * Decimal('2204.62'),2)
|
return round(Decimal(net) * Decimal('2204.62'),2)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def report_weight_unit_upper(self):
|
||||||
|
sale = self._get_report_sale()
|
||||||
|
if sale and getattr(sale, 'report_quantity_unit_upper', None):
|
||||||
|
return sale.report_quantity_unit_upper
|
||||||
|
line = self._get_report_trade_line() or self._get_report_invoice_line()
|
||||||
|
unit = getattr(line, 'unit', None) if line else None
|
||||||
|
if unit and unit.rec_name:
|
||||||
|
return unit.rec_name.upper()
|
||||||
|
return 'KGS'
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def report_bl_date(self):
|
def report_bl_date(self):
|
||||||
shipment = self._get_report_shipment()
|
shipment = self._get_report_shipment()
|
||||||
|
|||||||
@@ -440,12 +440,19 @@ class Sale(metaclass=PoolMeta):
|
|||||||
if line and line.unit:
|
if line and line.unit:
|
||||||
return line.unit.rec_name.upper()
|
return line.unit.rec_name.upper()
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
|
def _get_report_line_quantity(self, line):
|
||||||
|
phys_lots = [l for l in line.lots if l.lot_type == 'physic']
|
||||||
|
if phys_lots:
|
||||||
|
return sum(Decimal(str(l.get_current_quantity() or 0))
|
||||||
|
for l in phys_lots)
|
||||||
|
return Decimal(str(line.quantity or 0))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def report_qt(self):
|
def report_qt(self):
|
||||||
lines = self._get_report_lines()
|
lines = self._get_report_lines()
|
||||||
if lines:
|
if lines:
|
||||||
total = sum(Decimal(str(line.quantity or 0)) for line in lines)
|
total = sum(self._get_report_line_quantity(line) for line in lines)
|
||||||
return quantity_to_words(total)
|
return quantity_to_words(total)
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
@@ -456,10 +463,11 @@ class Sale(metaclass=PoolMeta):
|
|||||||
return ''
|
return ''
|
||||||
details = []
|
details = []
|
||||||
for line in lines:
|
for line in lines:
|
||||||
|
current_quantity = self._get_report_line_quantity(line)
|
||||||
quantity = self._format_report_number(
|
quantity = self._format_report_number(
|
||||||
line.quantity, keep_trailing_decimal=True)
|
current_quantity, keep_trailing_decimal=True)
|
||||||
unit = line.unit.rec_name.upper() if line.unit and line.unit.rec_name else ''
|
unit = line.unit.rec_name.upper() if line.unit and line.unit.rec_name else ''
|
||||||
words = quantity_to_words(Decimal(str(line.quantity or 0)))
|
words = quantity_to_words(current_quantity)
|
||||||
period = line.del_period.description if getattr(line, 'del_period', None) else ''
|
period = line.del_period.description if getattr(line, 'del_period', None) else ''
|
||||||
detail = ' '.join(
|
detail = ' '.join(
|
||||||
part for part in [
|
part for part in [
|
||||||
@@ -523,6 +531,28 @@ class Sale(metaclass=PoolMeta):
|
|||||||
if lines:
|
if lines:
|
||||||
return '\n'.join(self._format_report_price_line(line) for line in lines)
|
return '\n'.join(self._format_report_price_line(line) for line in lines)
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
|
@property
|
||||||
|
def report_trade_blocks(self):
|
||||||
|
lines = self._get_report_lines()
|
||||||
|
blocks = []
|
||||||
|
for line in lines:
|
||||||
|
current_quantity = self._get_report_line_quantity(line)
|
||||||
|
quantity = self._format_report_number(
|
||||||
|
current_quantity, keep_trailing_decimal=True)
|
||||||
|
unit = line.unit.rec_name.upper() if line.unit and line.unit.rec_name else ''
|
||||||
|
words = quantity_to_words(current_quantity)
|
||||||
|
period = line.del_period.description if getattr(line, 'del_period', None) else ''
|
||||||
|
quantity_line = ' '.join(
|
||||||
|
part for part in [
|
||||||
|
quantity,
|
||||||
|
unit,
|
||||||
|
f"({words})",
|
||||||
|
f"- {period}" if period else '',
|
||||||
|
] if part)
|
||||||
|
price_line = self._format_report_price_line(line)
|
||||||
|
blocks.append((quantity_line, price_line))
|
||||||
|
return blocks
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def report_delivery(self):
|
def report_delivery(self):
|
||||||
|
|||||||
@@ -279,5 +279,36 @@ class PurchaseTradeTestCase(ModuleTestCase):
|
|||||||
self.assertEqual(sale.report_net, Decimal('2000'))
|
self.assertEqual(sale.report_net, Decimal('2000'))
|
||||||
self.assertEqual(sale.report_gross, Decimal('2000'))
|
self.assertEqual(sale.report_gross, Decimal('2000'))
|
||||||
|
|
||||||
|
def test_sale_report_trade_blocks_use_lot_current_quantity(self):
|
||||||
|
'sale trade blocks use current lot quantity for quantity display'
|
||||||
|
Sale = Pool().get('sale.sale')
|
||||||
|
|
||||||
|
lot = Mock()
|
||||||
|
lot.lot_type = 'physic'
|
||||||
|
lot.get_current_quantity.return_value = Decimal('950')
|
||||||
|
line = Mock()
|
||||||
|
line.type = 'line'
|
||||||
|
line.lots = [lot]
|
||||||
|
line.quantity = Decimal('1000')
|
||||||
|
line.unit = Mock(rec_name='MT')
|
||||||
|
line.del_period = Mock(description='MARCH 2026')
|
||||||
|
line.price_type = 'priced'
|
||||||
|
line.linked_currency = Mock(rec_name='USC')
|
||||||
|
line.linked_unit = Mock(rec_name='POUND')
|
||||||
|
line.linked_price = Decimal('8.3000')
|
||||||
|
line.unit_price = Decimal('0')
|
||||||
|
line.get_pricing_text = 'ON ICE Cotton #2 MARCH 2026'
|
||||||
|
|
||||||
|
sale = Sale()
|
||||||
|
sale.currency = Mock(rec_name='USD')
|
||||||
|
sale.lines = [line]
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
sale.report_trade_blocks,
|
||||||
|
[(
|
||||||
|
'950.0 MT (NINE HUNDRED AND FIFTY METRIC TONS) - MARCH 2026',
|
||||||
|
'USC 8.3000 PER POUND (EIGHT USC AND THIRTY CENTS) ON ICE Cotton #2 MARCH 2026',
|
||||||
|
)])
|
||||||
|
|
||||||
|
|
||||||
del ModuleTestCase
|
del ModuleTestCase
|
||||||
|
|||||||
Reference in New Issue
Block a user