This commit is contained in:
2026-04-22 21:09:54 +02:00
parent 99782b5b0e
commit 4458871423
7 changed files with 452 additions and 1 deletions

View File

@@ -280,6 +280,7 @@ def register():
invoice.PurchaseReport,
stock.ShipmentShippingReport,
stock.ShipmentInsuranceReport,
stock.ShipmentCOOReport,
stock.ShipmentPackingListReport,
module='purchase_trade', type_='report')

View File

@@ -25,6 +25,8 @@ class Configuration(ModelSingleton, ModelSQL, ModelView):
'report_shipment_in_shipping', 'Shipping instructions'),
('shipment_insurance_report_label', 'purchase_trade',
'report_shipment_in_insurance', 'Insurance'),
('shipment_coo_report_label', 'purchase_trade',
'report_shipment_in_coo', 'COO'),
('shipment_packing_list_report_label', 'purchase_trade',
'report_shipment_in_packing_list', 'Packing List'),
)
@@ -52,6 +54,8 @@ class Configuration(ModelSingleton, ModelSQL, ModelView):
shipment_shipping_report_label = fields.Char("Shipping Menu Label")
shipment_insurance_report_template = fields.Char("Insurance Template")
shipment_insurance_report_label = fields.Char("Insurance Menu Label")
shipment_coo_report_template = fields.Char("COO Template")
shipment_coo_report_label = fields.Char("COO Menu Label")
shipment_packing_list_report_template = fields.Char("Packing List Template")
shipment_packing_list_report_label = fields.Char(
"Packing List Menu Label")

View File

@@ -792,6 +792,86 @@ class ShipmentIn(metaclass=PoolMeta):
def report_packing_net_weight(self):
net, _ = self._get_report_weight_totals()
return self._format_report_quantity(net)
@property
def report_coo_exporter(self):
company = getattr(self, 'company', None)
party = getattr(company, 'party', None) if company else None
if not party:
return ''
address = party.address_get() if hasattr(party, 'address_get') else None
lines = [getattr(party, 'rec_name', None) or getattr(party, 'name', None) or '']
if address and getattr(address, 'full_address', None):
lines.append(address.full_address)
return '\n'.join(filter(None, lines))
@property
def report_coo_consignee(self):
trade = self._get_report_trade()
party = getattr(trade, 'party', None) if trade else None
if not party:
return ''
address = party.address_get() if hasattr(party, 'address_get') else None
lines = [getattr(party, 'rec_name', None) or getattr(party, 'name', None) or '']
if address and getattr(address, 'full_address', None):
lines.append(address.full_address)
return '\n'.join(filter(None, lines))
@property
def report_coo_number(self):
return getattr(self, 'reference', None) or self.number or ''
@property
def report_coo_transport(self):
parts = []
if self.bl_number:
parts.append(f"B/L {self.bl_number}")
ship_name = self.report_packing_ship_name
if ship_name:
parts.append(ship_name)
if self.booking:
parts.append(f"Booking {self.booking}")
return ' - '.join(parts)
@property
def report_coo_origin_country(self):
return self.report_packing_origin or ''
@property
def report_coo_observations(self):
parts = []
contract = self.report_packing_contract_number
if contract:
parts.append(f"Contract: {contract}")
if self.note:
parts.append(self.note)
return '\n'.join(filter(None, parts))
@property
def report_coo_goods_description(self):
parts = [self.report_product_name, self.report_product_description]
if self.container:
container_numbers = ', '.join(
filter(None, (getattr(c, 'container_no', None) or '' for c in self.container)))
if container_numbers:
parts.append(f"Container(s): {container_numbers}")
return '\n'.join(filter(None, parts))
@property
def report_coo_net_weight(self):
return self.report_packing_net_weight
@property
def report_coo_gross_weight(self):
return self.report_packing_gross_weight
@property
def report_coo_issue_date(self):
Date = Pool().get('ir.date')
today = Date.today()
if not today:
return ''
return today.strftime('%d-%m-%Y')
def get_rec_name(self, name=None):
if self.number:
@@ -2310,3 +2390,12 @@ class ShipmentPackingListReport(ShipmentTemplateReportMixin, BaseSupplierShippin
def _resolve_configured_report_path(cls, action):
return cls._resolve_template_path(
'shipment_packing_list_report_template', 'stock')
class ShipmentCOOReport(ShipmentTemplateReportMixin, BaseSupplierShipping):
__name__ = 'stock.shipment.in.coo'
@classmethod
def _resolve_configured_report_path(cls, action):
return cls._resolve_template_path(
'shipment_coo_report_template', 'stock')

View File

@@ -78,6 +78,18 @@ this repository contains the full copyright notices and license terms. -->
<field name="action" ref="report_shipment_in_insurance"/>
</record>
<record model="ir.action.report" id="report_shipment_in_coo">
<field name="name">COO</field>
<field name="model">stock.shipment.in</field>
<field name="report_name">stock.shipment.in.coo</field>
<field name="report">stock/coo.fodt</field>
</record>
<record model="ir.action.keyword" id="report_shipment_in_coo_keyword">
<field name="keyword">form_print</field>
<field name="model">stock.shipment.in,-1</field>
<field name="action" ref="report_shipment_in_coo"/>
</record>
<record model="ir.action.report" id="report_shipment_in_packing_list">
<field name="name">Packing List</field>
<field name="model">stock.shipment.in</field>

View File

@@ -1077,12 +1077,14 @@ class PurchaseTradeTestCase(ModuleTestCase):
'shipment report paths are resolved from purchase_trade configuration'
shipping_report = Pool().get('stock.shipment.in.shipping', type='report')
insurance_report = Pool().get('stock.shipment.in.insurance', type='report')
coo_report = Pool().get('stock.shipment.in.coo', type='report')
packing_report = Pool().get('stock.shipment.in.packing_list', type='report')
config_model = Mock()
config_model.search.return_value = [
Mock(
shipment_shipping_report_template='si_custom.fodt',
shipment_insurance_report_template='insurance_custom.fodt',
shipment_coo_report_template='coo_custom.fodt',
shipment_packing_list_report_template='packing_list_custom.fodt',
)
]
@@ -1104,6 +1106,12 @@ class PurchaseTradeTestCase(ModuleTestCase):
'report': 'stock/insurance.fodt',
}),
'stock/insurance_custom.fodt')
self.assertEqual(
coo_report._resolve_configured_report_path({
'name': 'COO',
'report': 'stock/coo.fodt',
}),
'stock/coo_custom.fodt')
self.assertEqual(
packing_report._resolve_configured_report_path({
'name': 'Packing List',
@@ -1125,6 +1133,7 @@ class PurchaseTradeTestCase(ModuleTestCase):
purchase_report_label='',
shipment_shipping_report_label='',
shipment_insurance_report_label='',
shipment_coo_report_label='Certificate of Origin',
shipment_packing_list_report_label='',
)
action_sale = Mock(spec=['name'])
@@ -1147,6 +1156,8 @@ class PurchaseTradeTestCase(ModuleTestCase):
action_shipping.name = 'Shipping instructions'
action_insurance = Mock(spec=['name'])
action_insurance.name = 'Insurance'
action_coo = Mock(spec=['name'])
action_coo.name = 'COO'
action_packing = Mock(spec=['name'])
action_packing.name = 'Packing List'
actions = {
@@ -1160,7 +1171,8 @@ class PurchaseTradeTestCase(ModuleTestCase):
8: action_purchase,
9: action_shipping,
10: action_insurance,
11: action_packing,
11: action_coo,
12: action_packing,
}
model_data = Mock()
@@ -1188,6 +1200,7 @@ class PurchaseTradeTestCase(ModuleTestCase):
[actions[2]], {'name': 'Draft'},
[actions[7]], {'name': 'Packing Slip'},
[actions[6]], {'name': 'Wire Order'},
[actions[11]], {'name': 'Certificate of Origin'},
))
def test_shipment_insurance_helpers_use_fee_and_controller(self):

View File

@@ -51,6 +51,10 @@
<field name="shipment_insurance_report_template" colspan="3"/>
<label name="shipment_insurance_report_label"/>
<field name="shipment_insurance_report_label" colspan="3"/>
<label name="shipment_coo_report_template"/>
<field name="shipment_coo_report_template" colspan="3"/>
<label name="shipment_coo_report_label"/>
<field name="shipment_coo_report_label" colspan="3"/>
<label name="shipment_packing_list_report_template"/>
<field name="shipment_packing_list_report_template" colspan="3"/>
<label name="shipment_packing_list_report_label"/>

328
modules/stock/coo.fodt Normal file
View File

@@ -0,0 +1,328 @@
<?xml version="1.0" encoding="UTF-8"?>
<office:document
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
xmlns:math="http://www.w3.org/1998/Math/MathML"
xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
xmlns:ooo="http://openoffice.org/2004/office"
xmlns:ooow="http://openoffice.org/2004/writer"
xmlns:oooc="http://openoffice.org/2004/calc"
xmlns:dom="http://www.w3.org/2001/xml-events"
xmlns:xforms="http://www.w3.org/2002/xforms"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0"
office:version="1.3"
office:mimetype="application/vnd.oasis.opendocument.text">
<!-- ═══════════════════════════════ STYLES ═══════════════════════════════ -->
<office:styles>
<!-- Default paragraph style -->
<style:default-style style:family="paragraph">
<style:paragraph-properties fo:hyphenation-ladder-count="no-limit"
style:text-autospace="ideograph-alpha"
style:punctuation-wrap="hanging"
style:line-break="strict"
style:writing-mode="lr-tb"/>
<style:text-properties fo:font-size="8pt"
fo:font-family="Arial, Helvetica, sans-serif"
style:font-size-asian="8pt"
style:font-size-complex="8pt"/>
</style:default-style>
<!-- Standard paragraph -->
<style:style style:name="Standard" style:family="paragraph" style:class="text">
<style:text-properties fo:font-size="8pt" fo:font-family="Arial"/>
</style:style>
<!-- Cell label style (small, bold, multilingual) -->
<style:style style:name="CellLabel" style:family="paragraph" style:parent-style-name="Standard">
<style:text-properties fo:font-size="7pt" fo:font-weight="bold" fo:font-family="Arial"/>
</style:style>
<!-- Cell sublabel style (small italic, secondary languages) -->
<style:style style:name="CellSubLabel" style:family="paragraph" style:parent-style-name="Standard">
<style:text-properties fo:font-size="6.5pt" fo:font-style="italic" fo:font-family="Arial"/>
</style:style>
<!-- Title style (big, bold) -->
<style:style style:name="DocTitle" style:family="paragraph" style:parent-style-name="Standard">
<style:paragraph-properties fo:text-align="left"/>
<style:text-properties fo:font-size="12pt" fo:font-weight="bold" fo:font-family="Arial"/>
</style:style>
<!-- Confederation title style -->
<style:style style:name="ConfTitle" style:family="paragraph" style:parent-style-name="Standard">
<style:paragraph-properties fo:text-align="left"/>
<style:text-properties fo:font-size="9pt" fo:font-weight="bold" fo:font-family="Arial"/>
</style:style>
<!-- Footer text style -->
<style:style style:name="FooterText" style:family="paragraph" style:parent-style-name="Standard">
<style:paragraph-properties fo:text-align="center"/>
<style:text-properties fo:font-size="7.5pt" fo:font-family="Arial"/>
</style:style>
<!-- Page layout -->
<style:page-layout style:name="PageLayout">
<style:page-layout-properties fo:page-width="21.001cm" fo:page-height="29.7cm"
style:print-orientation="portrait"
fo:margin-top="1.0cm" fo:margin-bottom="1.0cm"
fo:margin-left="1.2cm" fo:margin-right="1.2cm"
style:writing-mode="lr-tb"/>
</style:page-layout>
<!-- Master page -->
<style:master-page style:name="Standard" style:page-layout-name="PageLayout"/>
<!-- Table styles -->
<style:style style:name="MainTable" style:family="table">
<style:table-properties style:width="18.601cm" fo:margin-left="0cm"/>
</style:style>
<style:style style:name="ColLeft" style:family="table-column">
<style:table-column-properties style:column-width="9.3cm"/>
</style:style>
<style:style style:name="ColRight" style:family="table-column">
<style:table-column-properties style:column-width="9.3cm"/>
</style:style>
<style:style style:name="ColNarrow" style:family="table-column">
<style:table-column-properties style:column-width="3.5cm"/>
</style:style>
<style:style style:name="ColWide" style:family="table-column">
<style:table-column-properties style:column-width="11.6cm"/>
</style:style>
<style:style style:name="ColNoNum" style:family="table-column">
<style:table-column-properties style:column-width="2.1cm"/>
</style:style>
<!-- Cell styles -->
<style:style style:name="CellBorder" style:family="table-cell">
<style:table-cell-properties fo:padding="0.15cm"
fo:border="0.05cm solid #000000"
style:vertical-align="top"/>
</style:style>
<style:style style:name="CellBorderCenter" style:family="table-cell">
<style:table-cell-properties fo:padding="0.15cm"
fo:border="0.05cm solid #000000"
style:vertical-align="middle"/>
</style:style>
<style:style style:name="CellNoBorderTop" style:family="table-cell">
<style:table-cell-properties fo:padding="0.15cm"
fo:border-left="0.05cm solid #000000"
fo:border-right="0.05cm solid #000000"
fo:border-bottom="0.05cm solid #000000"
fo:border-top="none"
style:vertical-align="top"/>
</style:style>
<style:style style:name="CellTall" style:family="table-cell">
<style:table-cell-properties fo:padding="0.15cm"
fo:border="0.05cm solid #000000"
style:vertical-align="top"
style:min-row-height="6cm"/>
</style:style>
<style:style style:name="CellTallRight" style:family="table-cell">
<style:table-cell-properties fo:padding="0.15cm"
fo:border="0.05cm solid #000000"
style:vertical-align="bottom"
style:min-row-height="6cm"/>
</style:style>
<style:style style:name="CellSignature" style:family="table-cell">
<style:table-cell-properties fo:padding="0.15cm"
fo:border="0.05cm solid #000000"
style:vertical-align="bottom"
style:min-row-height="3.5cm"/>
</style:style>
</office:styles>
<!-- ═══════════════════════════════ AUTOMATIC STYLES ═══════════════════════════════ -->
<office:automatic-styles>
<style:style style:name="P1" style:family="paragraph" style:parent-style-name="Standard">
<style:paragraph-properties fo:text-align="right"/>
</style:style>
<style:style style:name="P2" style:family="paragraph" style:parent-style-name="Standard">
<style:paragraph-properties fo:text-align="center"/>
</style:style>
<style:style style:name="P3" style:family="paragraph" style:parent-style-name="Standard">
<style:paragraph-properties fo:text-align="center"/>
<style:text-properties fo:font-size="7pt" fo:font-style="italic"/>
</style:style>
</office:automatic-styles>
<!-- ═══════════════════════════════ BODY ═══════════════════════════════ -->
<office:body>
<office:text>
<!-- ══════════════════════════════════════════════════════════════
MAIN TABLE — mirrors the official Swiss CoO layout
══════════════════════════════════════════════════════════════ -->
<table:table table:name="COO" table:style-name="MainTable">
<!-- Column definitions -->
<table:table-column table:style-name="ColLeft"/>
<table:table-column table:style-name="ColRight"/>
<!-- ─── ROW 1 : Exporter (left) | Title + No. (right) ─── -->
<table:table-row>
<!-- Exporter -->
<table:table-cell table:style-name="CellBorder" office:value-type="string">
<text:p text:style-name="CellLabel">Exportateur</text:p>
<text:p text:style-name="CellSubLabel">Exporteur / Esportatore / Exporter</text:p>
<text:p text:style-name="Standard"><text:placeholder text:placeholder-type="text">&lt;records[0].report_coo_exporter or &apos;&apos;&gt;</text:placeholder></text:p>
<text:p text:style-name="Standard"> </text:p>
<text:p text:style-name="Standard"> </text:p>
</table:table-cell>
<!-- Title block + No. -->
<table:table-cell table:style-name="CellBorderCenter" office:value-type="string">
<!-- No. line at top right -->
<text:p text:style-name="P1"><text:span>No. / Nr. : <text:placeholder text:placeholder-type="text">&lt;records[0].report_coo_number or &apos;&apos;&gt;</text:placeholder></text:span></text:p>
<text:p text:style-name="DocTitle">CERTIFICAT D'ORIGINE</text:p>
<text:p text:style-name="DocTitle">URSPRUNGSZEUGNIS</text:p>
<text:p text:style-name="DocTitle">CERTIFICATO D'ORIGINE</text:p>
<text:p text:style-name="DocTitle">CERTIFICATE OF ORIGIN</text:p>
</table:table-cell>
</table:table-row>
<!-- ─── ROW 2 : Consignee (left) | Swiss Confederation (right) ─── -->
<table:table-row>
<table:table-cell table:style-name="CellBorder" office:value-type="string">
<text:p text:style-name="CellLabel">Destinataire</text:p>
<text:p text:style-name="CellSubLabel">Empfänger / Destinatario / Consignee</text:p>
<text:p text:style-name="Standard"><text:placeholder text:placeholder-type="text">&lt;records[0].report_coo_consignee or &apos;&apos;&gt;</text:placeholder></text:p>
<text:p text:style-name="Standard"> </text:p>
<text:p text:style-name="Standard"> </text:p>
</table:table-cell>
<table:table-cell table:style-name="CellBorderCenter" office:value-type="string">
<text:p text:style-name="ConfTitle">CONFÉDÉRATION SUISSE</text:p>
<text:p text:style-name="ConfTitle">SCHWEIZERISCHE EIDGENOSSENSCHAFT</text:p>
<text:p text:style-name="ConfTitle">CONFEDERAZIONE SVIZZERA</text:p>
<text:p text:style-name="ConfTitle">SWISS CONFEDERATION</text:p>
</table:table-cell>
</table:table-row>
<!-- ─── ROW 3 : Transport info (left) | Country of origin + Observations (right, split) ─── -->
<table:table-row>
<table:table-cell table:style-name="CellBorder" office:value-type="string">
<text:p text:style-name="CellLabel">Informations relatives au transport (mention facultative)</text:p>
<text:p text:style-name="CellSubLabel">Angaben über die Beförderung (Ausfüllung freigestellt)</text:p>
<text:p text:style-name="CellSubLabel">Informazioni riguardanti il trasporto (indicazione facoltativa)</text:p>
<text:p text:style-name="CellSubLabel">Particulars of transport (optional declaration)</text:p>
<text:p text:style-name="Standard"><text:placeholder text:placeholder-type="text">&lt;records[0].report_coo_transport or &apos;&apos;&gt;</text:placeholder></text:p>
<text:p text:style-name="Standard"> </text:p>
</table:table-cell>
<table:table-cell table:style-name="CellBorder" office:value-type="string">
<text:p text:style-name="CellLabel">Pays d'origine</text:p>
<text:p text:style-name="CellSubLabel">Ursprungsland / Paese d'origine / Country of origin</text:p>
<text:p text:style-name="Standard"><text:placeholder text:placeholder-type="text">&lt;records[0].report_coo_origin_country or &apos;&apos;&gt;</text:placeholder></text:p>
<text:p text:style-name="Standard"> </text:p>
<text:p text:style-name="CellLabel">Observations</text:p>
<text:p text:style-name="CellSubLabel">Bemerkungen / Osservazioni / Observations</text:p>
<text:p text:style-name="Standard"><text:placeholder text:placeholder-type="text">&lt;records[0].report_coo_observations or &apos;&apos;&gt;</text:placeholder></text:p>
<text:p text:style-name="Standard"> </text:p>
<text:p text:style-name="Standard"> </text:p>
</table:table-cell>
</table:table-row>
</table:table>
<!-- ══════════════════════════════════════════════════════════════
GOODS TABLE — 3 columns: Marks/goods | Net weight | Gross weight
══════════════════════════════════════════════════════════════ -->
<table:table table:name="Goods" table:style-name="MainTable">
<table:table-column table:style-name="ColWide"/>
<table:table-column table:style-name="ColNarrow"/>
<!-- Header row -->
<table:table-row>
<table:table-cell table:style-name="CellBorder" office:value-type="string">
<text:p text:style-name="CellLabel">Marques, numéros, nombre et nature des colis ; désignation des marchandises</text:p>
<text:p text:style-name="CellSubLabel">Zeichen, Nummern, Anzahl und Art der Packstücke; Warenbezeichnung</text:p>
<text:p text:style-name="CellSubLabel">Marche, numeri, numero e natura dei colli; designazione delle merci</text:p>
<text:p text:style-name="CellSubLabel">Marks, numbers, number and kind of packages; description of the goods</text:p>
</table:table-cell>
<table:table-cell table:style-name="CellBorder" office:value-type="string">
<text:p text:style-name="CellLabel">Poids net</text:p>
<text:p text:style-name="CellSubLabel">Nettogewicht</text:p>
<text:p text:style-name="CellSubLabel">Peso netto</text:p>
<text:p text:style-name="CellSubLabel">Net weight</text:p>
<text:p text:style-name="CellSubLabel">kg, l, m², etc.</text:p>
</table:table-cell>
</table:table-row>
<!-- Goods description rows — tall empty cells -->
<table:table-row table:style-name="ro1">
<table:table-cell table:style-name="CellTall" office:value-type="string">
<text:p text:style-name="Standard"><text:placeholder text:placeholder-type="text">&lt;records[0].report_coo_goods_description or &apos;&apos;&gt;</text:placeholder></text:p>
</table:table-cell>
<table:table-cell table:style-name="CellTall" office:value-type="string">
<!-- Poids brut at bottom of net weight column -->
<text:p text:style-name="Standard"><text:placeholder text:placeholder-type="text">&lt;records[0].report_coo_net_weight or &apos;&apos;&gt;</text:placeholder></text:p>
<text:p text:style-name="Standard"><text:placeholder text:placeholder-type="text">&lt;records[0].report_coo_gross_weight or &apos;&apos;&gt;</text:placeholder></text:p>
<text:p text:style-name="Standard"> </text:p>
<text:p text:style-name="Standard"> </text:p>
<text:p text:style-name="Standard"> </text:p>
<text:p text:style-name="Standard"> </text:p>
<text:p text:style-name="CellLabel">Poids brut</text:p>
<text:p text:style-name="CellSubLabel">Bruttogewicht</text:p>
<text:p text:style-name="CellSubLabel">Peso lordo</text:p>
<text:p text:style-name="CellSubLabel">Gross weight</text:p>
</table:table-cell>
</table:table-row>
</table:table>
<!-- ══════════════════════════════════════════════════════════════
CERTIFICATION BLOCK
══════════════════════════════════════════════════════════════ -->
<table:table table:name="Cert" table:style-name="MainTable">
<table:table-column table:style-name="ColLeft"/>
<table:table-column table:style-name="ColRight"/>
<!-- Certification statement -->
<table:table-row>
<table:table-cell table:number-columns-spanned="2" table:style-name="CellBorder" office:value-type="string">
<text:p text:style-name="CellLabel">La Chambre de commerce soussignée certifie l'origine des marchandises désignées ci-dessus</text:p>
<text:p text:style-name="CellSubLabel">Die unterzeichnete Handelskammer bescheinigt den Ursprung oben bezeichneter Ware</text:p>
<text:p text:style-name="CellSubLabel">La sottoscritta Camera di commercio certifica l'origine delle merci summenzionate</text:p>
<text:p text:style-name="CellSubLabel">The undersigned Chamber of commerce certifies the origin of the above mentioned goods</text:p>
</table:table-cell>
</table:table-row>
<!-- Signature row: date left | Chamber seal + signature right -->
<table:table-row>
<table:table-cell table:style-name="CellSignature" office:value-type="string">
<text:p text:style-name="Standard"> </text:p>
<text:p text:style-name="Standard"> </text:p>
<text:p text:style-name="Standard"> </text:p>
<text:p text:style-name="CellLabel">Genève, le <text:placeholder text:placeholder-type="text">&lt;records[0].report_coo_issue_date or &apos;&apos;&gt;</text:placeholder></text:p>
</table:table-cell>
<table:table-cell table:style-name="CellSignature" office:value-type="string">
<text:p text:style-name="FooterText">Chambre de commerce, d'industrie et des services de Genève</text:p>
<text:p text:style-name="FooterText">Genfer Industrie-, Dienstleistungs- und Handelskammer</text:p>
<text:p text:style-name="FooterText">Camera di commercio, dell'industria e dei servizi di Ginevra</text:p>
<text:p text:style-name="FooterText">Chamber of commerce, industry and services of Geneva</text:p>
<text:p text:style-name="Standard"> </text:p>
<text:p text:style-name="Standard"> </text:p>
<text:p text:style-name="Standard"> </text:p>
</table:table-cell>
</table:table-row>
</table:table>
</office:text>
</office:body>
</office:document>