Compare commits
23 Commits
5cbb57c657
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 8906f00d36 | |||
| 29a719c117 | |||
| d71257720e | |||
| aee9c3277e | |||
| b68f475e22 | |||
| 90eab73430 | |||
| 472806ef06 | |||
| 0def187750 | |||
| 229b6037fb | |||
| 8a90216357 | |||
| 4bbd7a5e76 | |||
| 9c8d7f11ae | |||
| b39607d987 | |||
| 65482b4a8b | |||
| 8b9787d4c0 | |||
| a1ab7dec82 | |||
| 5ae8af84fb | |||
| c90b14fcc1 | |||
| e9ff9c76ab | |||
| 63d8266a9c | |||
| add4cdc137 | |||
| 4d94aa78ed | |||
| da01249f66 |
29
AGENTS.md
29
AGENTS.md
@@ -52,6 +52,20 @@ Guide rapide pour les agents qui codent dans ce repository.
|
||||
- Pour les templates shipment, ne pas supposer qu'une variable locale comme `shipment` sera definie partout dans Genshi, surtout dans les headers/footers; preferer `records[0]....` ou des placeholders alignes sur le scope reel du report.
|
||||
- Dans `purchase_trade`, pour remonter d'une facture vers shipment, pro forma, freight ou autres donnees logistiques, privilegier le lot physique comme pont entre `purchase.line`, `sale.line` et shipment.
|
||||
- Pour `FREIGHT VALUE`, ne pas lire un champ direct sur la facture: retrouver le fee de shipment (`shipment_in`) dont le produit est `Maritime freight`, puis utiliser `fee.get_amount()`.
|
||||
- Rappels session templates (2026-04-08):
|
||||
- `insurance.fodt`: le texte "insured for account of" doit afficher la compagnie courante (shipment.company.party), pas le client.
|
||||
- `insurance.fodt`: exposer des proprietes Python `report_*` sur `stock.shipment.in` pour les montants (incoming moves) et les zones client-specifiques.
|
||||
- `insurance.fodt`: "Amount insured" suit la regle metier 110% du montant incoming (base calculee via lot -> purchase.line.unit_price * quantite courante convertie).
|
||||
- `insurance.fodt`: zone "Contact the following surveyor" alimentee par une propriete dediee, avec champ `surveyor` (party.party) cote shipment.
|
||||
- `packing_list.fodt`: date en haut a droite = date du jour; unites Net/Gross = unite de `purchase.line`.
|
||||
- `bill.fodt` (sale): la 2eme date doit etre une vraie maturity date (depuis `invoice.lines_to_pay.maturity_date`), pas `payment_term.rec_name`.
|
||||
- `bill.fodt` (sale): le montant en lettres doit provenir du montant du bill (facture/total), pas du `unit_price` de ligne.
|
||||
- Quand un template affiche les placeholders en brut, verifier que les champs sont bien des placeholders Relatorio dans le XML (pas du texte litteral).
|
||||
- Eviter les apostrophes echappees style `\'` dans placeholders; preferer `"` et `'`.
|
||||
|
||||
## 4.bis) Memo templates de session
|
||||
|
||||
- Voir aussi `notes/template_business_rules.md` pour le recap detaille (business rules + decisions templates de la session).
|
||||
|
||||
## 5) Workflow de modification (obligatoire)
|
||||
|
||||
@@ -110,3 +124,18 @@ Toujours fournir:
|
||||
3. Proposer le patch minimal.
|
||||
4. Implementer + tester cible.
|
||||
5. Rendre avec le contrat de sortie (section 8).
|
||||
- Rappels session 2026-04-09:
|
||||
- `invoice_ict.fodt` / `invoice_ict_final.fodt`: poids et unites depuis `lot.qt.hist` / `lot_unit_line`, priorite lots `physic`, sinon lot `virtual` unique.
|
||||
- `invoice_ict.fodt` / `invoice_ict_final.fodt`: infos shipment depuis les lots reels des lignes facture; ne rien afficher si plusieurs shipments differents.
|
||||
- `invoice_ict.fodt` / `invoice_ict_final.fodt`: `S/I` = `shipment.reference`; `NB BALES: 0` => `Unchanged` sur le final.
|
||||
- `invoice_ict.fodt` / `invoice_ict_final.fodt`: quantites uniformisees a `2` decimales; conversion `LBS` via UoM, jamais via un facteur fixe aveugle.
|
||||
- `invoice_ict.fodt` / `invoice_ict_final.fodt`: si plusieurs lignes reutilisent le meme lot, les lignes detaillees suivent la quantite facturee convertie, mais le `GROSS` global doit rester le vrai delta historique du lot.
|
||||
- `sale_ict.fodt`: meme priorite lots; les mots suivent l'unite reelle; le total convertit vers une unite commune, qui est celle du lot virtuel seulement s'il y a un seul lot virtuel sur tout le report.
|
||||
- `lot.report.r_del_period`: utiliser `sale.line.del_period` pour `lot_s` sans `lot_p`, sinon `purchase.line.del_period`.
|
||||
- `lot.do_weighing`: `lot_qt` editable et ecrasement direct de `lot.lot_qt`.
|
||||
- `account.invoice`: `Validate` cree aussi le `account.move` pour les factures client, attribue aussi le `number` a ce stade pour les factures client comme fournisseur; `Post` ne doit plus forcer une fresh session sur ce flux.
|
||||
- `pricing.pricing`: saisie manuelle autorisee meme sans composant; en manuel, l'utilisateur saisit seulement `Qt` et `Settl. price`; `fixed_qt`, `fixed_qt_price`, `unfixed_qt`, `unfixed_qt_price` et `eod_price` sont derives automatiquement.
|
||||
- `pricing.pricing`: en manuel, `fixed_qt` = cumul des `quantity`, `fixed_qt_price` = moyenne ponderee cumulee des `settl_price`, `unfixed_qt` = reste a fixer, `unfixed_qt_price` = `settl_price` de la ligne.
|
||||
- `pricing.pricing`: `eod_price` reste non editable et calcule en prix moyen pondere; `last=True` gere par groupe `line + component`, choisi sur la `pricing_date` la plus grande.
|
||||
- `purchase_trade`: `trader` filtre sur `TRADER`, `operator` sur `OPERATOR`; fallback sur `quantity` si `quantity_theorical` est vide dans les quotas/pricings.
|
||||
- `sale.line` / `purchase.line`: en mode `basis`, sans `price_component`, le `Price` et le `Fix. progress` de la ligne doivent remonter depuis la ligne `Summary` sans component.
|
||||
|
||||
@@ -485,7 +485,7 @@ class Invoice(Workflow, ModelSQL, ModelView, TaxableMixin, InvoiceReportMixin):
|
||||
})
|
||||
cls.__rpc__.update({
|
||||
'post': RPC(
|
||||
readonly=False, instantiate=0, fresh_session=True),
|
||||
readonly=False, instantiate=0, fresh_session=False),
|
||||
})
|
||||
|
||||
@classmethod
|
||||
@@ -1890,17 +1890,15 @@ class Invoice(Workflow, ModelSQL, ModelView, TaxableMixin, InvoiceReportMixin):
|
||||
cls._check_taxes(invoices)
|
||||
# cls._check_similar(invoices)
|
||||
|
||||
invoices_in = cls.browse([i for i in invoices if i.type == 'in'])
|
||||
cls.set_number(invoices_in)
|
||||
cls.set_number(invoices)
|
||||
cls._store_cache(invoices)
|
||||
|
||||
moves = []
|
||||
for invoice in invoices:
|
||||
if invoice.type == 'in':
|
||||
move = invoice.get_move()
|
||||
if move != invoice.move:
|
||||
invoice.move = move
|
||||
moves.append(move)
|
||||
move = invoice.get_move()
|
||||
if move != invoice.move:
|
||||
invoice.move = move
|
||||
moves.append(move)
|
||||
invoice.do_lot_invoicing()
|
||||
if moves:
|
||||
Move.save(moves)
|
||||
|
||||
@@ -8,13 +8,13 @@
|
||||
|
||||
|
||||
<meta:generator>LibreOffice/7.6.0.3$Windows_X86_64 LibreOffice_project/69edd8b8ebc41d00b4de3915dc82f8f0fc3b6265</meta:generator>
|
||||
<meta:editing-duration>PT3H16M29S</meta:editing-duration>
|
||||
<meta:editing-cycles>9</meta:editing-cycles>
|
||||
<meta:editing-duration>PT3H20M59S</meta:editing-duration>
|
||||
<meta:editing-cycles>12</meta:editing-cycles>
|
||||
|
||||
<dc:date>2026-03-27T07:35:45.157000000</dc:date><meta:document-statistic meta:table-count="10" meta:image-count="2" meta:object-count="0" meta:page-count="2" meta:paragraph-count="61" meta:word-count="210" meta:character-count="2997" meta:non-whitespace-character-count="2429"/></office:meta>
|
||||
<dc:date>2026-04-10T10:30:16.567000000</dc:date><meta:document-statistic meta:table-count="10" meta:image-count="2" meta:object-count="0" meta:page-count="2" meta:paragraph-count="66" meta:word-count="168" meta:character-count="2416" meta:non-whitespace-character-count="1896"/></office:meta>
|
||||
<office:settings>
|
||||
<config:config-item-set config:name="ooo:view-settings">
|
||||
<config:config-item config:name="ViewAreaTop" config:type="long">28575</config:config-item>
|
||||
<config:config-item config:name="ViewAreaTop" config:type="long">6879</config:config-item>
|
||||
<config:config-item config:name="ViewAreaLeft" config:type="long">0</config:config-item>
|
||||
<config:config-item config:name="ViewAreaWidth" config:type="long">27264</config:config-item>
|
||||
<config:config-item config:name="ViewAreaHeight" config:type="long">13187</config:config-item>
|
||||
@@ -23,12 +23,12 @@
|
||||
<config:config-item-map-indexed config:name="Views">
|
||||
<config:config-item-map-entry>
|
||||
<config:config-item config:name="ViewId" config:type="string">view2</config:config-item>
|
||||
<config:config-item config:name="ViewLeft" config:type="long">7583</config:config-item>
|
||||
<config:config-item config:name="ViewTop" config:type="long">33203</config:config-item>
|
||||
<config:config-item config:name="ViewLeft" config:type="long">13275</config:config-item>
|
||||
<config:config-item config:name="ViewTop" config:type="long">15563</config:config-item>
|
||||
<config:config-item config:name="VisibleLeft" config:type="long">0</config:config-item>
|
||||
<config:config-item config:name="VisibleTop" config:type="long">28575</config:config-item>
|
||||
<config:config-item config:name="VisibleTop" config:type="long">6879</config:config-item>
|
||||
<config:config-item config:name="VisibleRight" config:type="long">27263</config:config-item>
|
||||
<config:config-item config:name="VisibleBottom" config:type="long">41760</config:config-item>
|
||||
<config:config-item config:name="VisibleBottom" config:type="long">20064</config:config-item>
|
||||
<config:config-item config:name="ZoomType" config:type="short">0</config:config-item>
|
||||
<config:config-item config:name="ViewLayoutColumns" config:type="short">0</config:config-item>
|
||||
<config:config-item config:name="ViewLayoutBookMode" config:type="boolean">false</config:config-item>
|
||||
@@ -101,7 +101,7 @@
|
||||
<config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ClipAsCharacterAnchoredWriterFlyFrames" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="UseOldPrinterMetrics" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="Rsid" config:type="int">297701</config:config-item>
|
||||
<config:config-item config:name="Rsid" config:type="int">523469</config:config-item>
|
||||
<config:config-item config:name="RsidRoot" config:type="int">84510</config:config-item>
|
||||
<config:config-item config:name="ProtectForm" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="MsWordCompTrailingBlanks" config:type="boolean">false</config:config-item>
|
||||
@@ -168,19 +168,20 @@
|
||||
<style:font-face style:name="Lucida Sans1" svg:font-family="'Lucida Sans'" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Microsoft YaHei" svg:font-family="'Microsoft YaHei'" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Tahoma" svg:font-family="Tahoma, arial" style:font-family-generic="swiss" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Times New Roman" svg:font-family="'Times New Roman', Times" style:font-family-generic="roman" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Times New Roman" svg:font-family="'Times New Roman'" style:font-family-generic="roman" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Times New Roman1" svg:font-family="'Times New Roman', Times" style:font-family-generic="roman" style:font-pitch="variable"/>
|
||||
</office:font-face-decls>
|
||||
<office:styles>
|
||||
<style:default-style style:family="graphic">
|
||||
<style:graphic-properties svg:stroke-color="#808080" draw:fill-color="#cfe7f5" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.3cm" draw:shadow-offset-y="0.3cm" draw:start-line-spacing-horizontal="0.283cm" draw:start-line-spacing-vertical="0.283cm" draw:end-line-spacing-horizontal="0.283cm" draw:end-line-spacing-vertical="0.283cm" style:writing-mode="lr-tb" style:flow-with-text="true"/>
|
||||
<style:paragraph-properties style:text-autospace="none" style:line-break="strict" loext:tab-stop-distance="0cm" style:font-independent-line-spacing="false">
|
||||
<style:paragraph-properties style:text-autospace="none" style:line-break="strict" loext:tab-stop-distance="0cm" style:writing-mode="lr-tb" style:font-independent-line-spacing="false">
|
||||
<style:tab-stops/>
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Times New Roman" fo:font-size="12pt" fo:language="fr" fo:country="CH" style:letter-kerning="true" style:font-name-asian="Times New Roman" style:font-size-asian="12pt" style:language-asian="fr" style:country-asian="CH" style:font-name-complex="Times New Roman" style:font-size-complex="12pt" style:language-complex="fr" style:country-complex="CH"/>
|
||||
<style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Times New Roman1" fo:font-size="12pt" fo:language="fr" fo:country="CH" style:letter-kerning="true" style:font-name-asian="Times New Roman1" style:font-size-asian="12pt" style:language-asian="fr" style:country-asian="CH" style:font-name-complex="Times New Roman1" style:font-size-complex="12pt" style:language-complex="fr" style:country-complex="CH"/>
|
||||
</style:default-style>
|
||||
<style:default-style style:family="paragraph">
|
||||
<style:paragraph-properties fo:hyphenation-ladder-count="no-limit" style:text-autospace="none" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="1.249cm" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Times New Roman" fo:font-size="12pt" fo:language="fr" fo:country="CH" style:letter-kerning="true" style:font-name-asian="Times New Roman" style:font-size-asian="12pt" style:language-asian="fr" style:country-asian="CH" style:font-name-complex="Times New Roman" style:font-size-complex="12pt" style:language-complex="fr" style:country-complex="CH" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="no-limit" loext:hyphenation-zone="no-limit"/>
|
||||
<style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Times New Roman1" fo:font-size="12pt" fo:language="fr" fo:country="CH" style:letter-kerning="true" style:font-name-asian="Times New Roman1" style:font-size-asian="12pt" style:language-asian="fr" style:country-asian="CH" style:font-name-complex="Times New Roman1" style:font-size-complex="12pt" style:language-complex="fr" style:country-complex="CH" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="no-limit" loext:hyphenation-zone="no-limit"/>
|
||||
</style:default-style>
|
||||
<style:default-style style:family="table">
|
||||
<style:table-properties table:border-model="collapsing"/>
|
||||
@@ -245,7 +246,7 @@
|
||||
</style:style>
|
||||
<style:style style:name="No_20_Spacing" style:display-name="No Spacing" style:family="paragraph">
|
||||
<style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-align="start" style:justify-single-word="false" fo:text-indent="0cm" style:auto-text-indent="false" style:text-autospace="ideograph-alpha" style:vertical-align="auto"/>
|
||||
<style:text-properties style:font-name="Calibri1" fo:font-family="Calibri, 'Century Gothic'" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="11pt" fo:language="it" fo:country="IT" style:font-name-asian="Times New Roman" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:font-size-asian="11pt" style:language-asian="en" style:country-asian="US" style:font-name-complex="Calibri1" style:font-family-complex="Calibri, 'Century Gothic'" style:font-family-generic-complex="swiss" style:font-pitch-complex="variable" style:font-size-complex="11pt" style:language-complex="ar" style:country-complex="SA"/>
|
||||
<style:text-properties style:font-name="Calibri1" fo:font-family="Calibri, 'Century Gothic'" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="11pt" fo:language="it" fo:country="IT" style:font-name-asian="Times New Roman1" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:font-size-asian="11pt" style:language-asian="en" style:country-asian="US" style:font-name-complex="Calibri1" style:font-family-complex="Calibri, 'Century Gothic'" style:font-family-generic-complex="swiss" style:font-pitch-complex="variable" style:font-size-complex="11pt" style:language-complex="ar" style:country-complex="SA"/>
|
||||
</style:style>
|
||||
<style:style style:name="Header_20_and_20_Footer" style:display-name="Header and Footer" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
|
||||
<style:paragraph-properties text:number-lines="false" text:line-number="0">
|
||||
@@ -295,30 +296,35 @@
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="Normal" style:family="paragraph">
|
||||
<style:paragraph-properties fo:hyphenation-ladder-count="no-limit"/>
|
||||
<style:text-properties fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="no-limit" loext:hyphenation-zone="no-limit"/>
|
||||
</style:style>
|
||||
<style:style style:name="Default_20_Paragraph_20_Font" style:display-name="Default Paragraph Font" style:family="text"/>
|
||||
<style:style style:name="Titolo_20_1_20_Carattere" style:display-name="Titolo 1 Carattere" style:family="text" style:parent-style-name="Default_20_Paragraph_20_Font">
|
||||
<style:text-properties style:font-name="Arial1" fo:font-family="Arial, Arial" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="12pt" fo:language="en" fo:country="US" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color" fo:font-weight="bold" style:font-name-asian="Arial1" style:font-family-asian="Arial, Arial" style:font-family-generic-asian="swiss" style:font-pitch-asian="variable" style:font-size-asian="12pt" style:language-asian="en" style:country-asian="US" style:font-weight-asian="bold" style:font-name-complex="Arial1" style:font-family-complex="Arial, Arial" style:font-family-generic-complex="swiss" style:font-pitch-complex="variable" style:font-size-complex="12pt" style:font-weight-complex="bold"/>
|
||||
</style:style>
|
||||
<style:style style:name="Intestazione_20_Carattere" style:display-name="Intestazione Carattere" style:family="text" style:parent-style-name="Default_20_Paragraph_20_Font">
|
||||
<style:text-properties style:font-name="Times New Roman" fo:font-family="'Times New Roman', Times" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="10pt" style:font-name-asian="Times New Roman" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:font-size-asian="10pt" style:font-name-complex="Times New Roman" style:font-family-complex="'Times New Roman', Times" style:font-family-generic-complex="roman" style:font-pitch-complex="variable" style:font-size-complex="10pt"/>
|
||||
<style:text-properties style:font-name="Times New Roman1" fo:font-family="'Times New Roman', Times" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="10pt" style:font-name-asian="Times New Roman1" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:font-size-asian="10pt" style:font-name-complex="Times New Roman1" style:font-family-complex="'Times New Roman', Times" style:font-family-generic-complex="roman" style:font-pitch-complex="variable" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="Placeholder_20_Text" style:display-name="Placeholder Text" style:family="text" style:parent-style-name="Default_20_Paragraph_20_Font">
|
||||
<style:text-properties fo:color="#808080" loext:opacity="100%" style:font-name="Times New Roman" fo:font-family="'Times New Roman', Times" style:font-family-generic="roman" style:font-pitch="variable" style:font-name-asian="Times New Roman" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:font-name-complex="Times New Roman" style:font-family-complex="'Times New Roman', Times" style:font-family-generic-complex="roman" style:font-pitch-complex="variable"/>
|
||||
<style:text-properties fo:color="#808080" loext:opacity="100%" style:font-name="Times New Roman1" fo:font-family="'Times New Roman', Times" style:font-family-generic="roman" style:font-pitch="variable" style:font-name-asian="Times New Roman1" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:font-name-complex="Times New Roman1" style:font-family-complex="'Times New Roman', Times" style:font-family-generic-complex="roman" style:font-pitch-complex="variable"/>
|
||||
</style:style>
|
||||
<style:style style:name="Testo_20_fumetto_20_Carattere" style:display-name="Testo fumetto Carattere" style:family="text" style:parent-style-name="Default_20_Paragraph_20_Font">
|
||||
<style:text-properties style:font-name="Tahoma" fo:font-family="Tahoma, arial" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="8pt" style:font-name-asian="Tahoma" style:font-family-asian="Tahoma, arial" style:font-family-generic-asian="swiss" style:font-pitch-asian="variable" style:font-size-asian="8pt" style:font-name-complex="Tahoma" style:font-family-complex="Tahoma, arial" style:font-family-generic-complex="swiss" style:font-pitch-complex="variable" style:font-size-complex="8pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="PiÃ_a8__20_di_20_pagina_20_Carattere" style:display-name="Piè di pagina Carattere" style:family="text" style:parent-style-name="Default_20_Paragraph_20_Font">
|
||||
<style:text-properties style:font-name="Times New Roman" fo:font-family="'Times New Roman', Times" style:font-family-generic="roman" style:font-pitch="variable" style:font-name-asian="Times New Roman" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:font-name-complex="Times New Roman" style:font-family-complex="'Times New Roman', Times" style:font-family-generic-complex="roman" style:font-pitch-complex="variable"/>
|
||||
<style:text-properties style:font-name="Times New Roman1" fo:font-family="'Times New Roman', Times" style:font-family-generic="roman" style:font-pitch="variable" style:font-name-asian="Times New Roman1" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:font-name-complex="Times New Roman1" style:font-family-complex="'Times New Roman', Times" style:font-family-generic-complex="roman" style:font-pitch-complex="variable"/>
|
||||
</style:style>
|
||||
<style:style style:name="Nessuna_20_spaziatura_20_Carattere" style:display-name="Nessuna spaziatura Carattere" style:family="text" style:parent-style-name="Default_20_Paragraph_20_Font">
|
||||
<style:text-properties style:font-name="Calibri1" fo:font-family="Calibri, 'Century Gothic'" style:font-family-generic="swiss" style:font-pitch="variable" fo:language="it" fo:country="IT" style:font-name-asian="Times New Roman" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:language-asian="en" style:country-asian="US" style:font-name-complex="Calibri1" style:font-family-complex="Calibri, 'Century Gothic'" style:font-family-generic-complex="swiss" style:font-pitch-complex="variable"/>
|
||||
<style:text-properties style:font-name="Calibri1" fo:font-family="Calibri, 'Century Gothic'" style:font-family-generic="swiss" style:font-pitch="variable" fo:language="it" fo:country="IT" style:font-name-asian="Times New Roman1" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:language-asian="en" style:country-asian="US" style:font-name-complex="Calibri1" style:font-family-complex="Calibri, 'Century Gothic'" style:font-family-generic-complex="swiss" style:font-pitch-complex="variable"/>
|
||||
</style:style>
|
||||
<style:style style:name="Placeholder" style:family="text">
|
||||
<style:text-properties fo:font-variant="small-caps" fo:color="#008080" loext:opacity="100%" style:text-underline-style="dotted" style:text-underline-width="auto" style:text-underline-color="font-color"/>
|
||||
</style:style>
|
||||
<style:style style:name="Police_20_par_20_dÃ_a9_faut" style:display-name="Police par défaut" style:family="text"/>
|
||||
<style:style style:name="Default_20_Paragraph_20_Font_20__28_WW_29_" style:display-name="Default Paragraph Font (WW)" style:family="text"/>
|
||||
<style:style style:name="Police_20_par_20_défaut" style:display-name="Police par défaut" style:family="text"/>
|
||||
<style:style style:name="Frame" style:family="graphic">
|
||||
<style:graphic-properties text:anchor-type="paragraph" svg:x="0cm" svg:y="0cm" style:wrap="parallel" style:number-wrapped-paragraphs="no-limit" style:wrap-contour="false" style:vertical-pos="top" style:vertical-rel="paragraph-content" style:horizontal-pos="center" style:horizontal-rel="paragraph-content" fo:background-color="transparent" draw:fill="none" draw:fill-color="#cfe7f5"/>
|
||||
</style:style>
|
||||
@@ -664,7 +670,7 @@
|
||||
</style:style>
|
||||
<style:style style:name="P21" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties fo:font-size="10pt" fo:language="en" fo:country="GB" style:font-size-asian="10pt" style:font-name-complex="Times New Roman" style:font-size-complex="10pt"/>
|
||||
<style:text-properties fo:font-size="10pt" fo:language="en" fo:country="GB" style:font-size-asian="10pt" style:font-name-complex="Times New Roman1" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P22" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
@@ -684,7 +690,7 @@
|
||||
</style:style>
|
||||
<style:style style:name="P26" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties fo:font-size="10pt" fo:language="en" fo:country="US" style:font-size-asian="10pt" style:font-name-complex="Times New Roman" style:font-size-complex="10pt"/>
|
||||
<style:text-properties fo:font-size="10pt" fo:language="en" fo:country="US" style:font-size-asian="10pt" style:font-name-complex="Times New Roman1" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P27" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
@@ -696,7 +702,7 @@
|
||||
</style:style>
|
||||
<style:style style:name="P29" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-name-complex="Times New Roman" style:font-size-complex="10pt"/>
|
||||
<style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-name-complex="Times New Roman1" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P30" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" fo:text-align="center" style:justify-single-word="false" style:writing-mode="lr-tb"/>
|
||||
@@ -708,7 +714,7 @@
|
||||
</style:style>
|
||||
<style:style style:name="P32" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties fo:font-size="10pt" fo:language="fr" fo:country="CH" style:font-size-asian="10pt" style:font-name-complex="Times New Roman" style:font-size-complex="10pt"/>
|
||||
<style:text-properties fo:font-size="10pt" fo:language="fr" fo:country="CH" style:font-size-asian="10pt" style:font-name-complex="Times New Roman1" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P33" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" fo:text-align="end" style:justify-single-word="false" style:writing-mode="lr-tb"/>
|
||||
@@ -724,7 +730,7 @@
|
||||
</style:style>
|
||||
<style:style style:name="P36" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties fo:font-size="1pt" fo:language="en" fo:country="US" style:font-size-asian="1pt" style:font-name-complex="Times New Roman" style:font-size-complex="1pt" text:display="none"/>
|
||||
<style:text-properties fo:font-size="1pt" fo:language="en" fo:country="US" style:font-size-asian="1pt" style:font-name-complex="Times New Roman1" style:font-size-complex="1pt" text:display="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="P37" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
@@ -759,14 +765,34 @@
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties officeooo:paragraph-rsid="00022035"/>
|
||||
</style:style>
|
||||
<style:style style:name="P44" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties fo:font-size="10pt" fo:language="en" fo:country="GB" officeooo:paragraph-rsid="000391f3" style:font-size-asian="10pt" style:font-name-complex="Arial1" style:font-size-complex="10pt"/>
|
||||
<style:style style:name="P44" style:family="paragraph" style:parent-style-name="Normal">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%"/>
|
||||
<style:text-properties fo:color="#000000" loext:opacity="100%" style:font-name="Arial" fo:font-size="10pt" officeooo:paragraph-rsid="00056da2" style:letter-kerning="false" style:font-name-asian="Times New Roman" style:font-size-asian="10pt" style:font-name-complex="Arial" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P45" style:family="paragraph" style:parent-style-name="footer">
|
||||
<style:style style:name="P45" style:family="paragraph" style:parent-style-name="Normal">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%"/>
|
||||
<style:text-properties fo:color="#000000" loext:opacity="100%" style:font-name="Calibri" fo:font-size="10pt" officeooo:paragraph-rsid="00056da2" style:letter-kerning="false" style:font-name-asian="Times New Roman" style:font-size-asian="10pt" style:font-name-complex="Arial" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P46" style:family="paragraph" style:parent-style-name="Normal">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%"/>
|
||||
<style:text-properties officeooo:paragraph-rsid="00056da2"/>
|
||||
</style:style>
|
||||
<style:style style:name="P47" style:family="paragraph" style:parent-style-name="Normal">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%"/>
|
||||
<style:text-properties style:font-name="Calibri" fo:font-size="10pt" officeooo:paragraph-rsid="00056da2" style:font-size-asian="10pt" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P48" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties style:font-name="Calibri" fo:font-size="10pt" fo:language="fr" fo:country="CH" style:font-size-asian="10pt" style:font-name-complex="Arial1" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P49" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-name-complex="Times New Roman1" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P50" style:family="paragraph" style:parent-style-name="footer">
|
||||
<style:paragraph-properties style:writing-mode="lr-tb"/>
|
||||
</style:style>
|
||||
<style:style style:name="P46" style:family="paragraph" style:parent-style-name="header">
|
||||
<style:style style:name="P51" style:family="paragraph" style:parent-style-name="header">
|
||||
<style:paragraph-properties style:writing-mode="lr-tb"/>
|
||||
</style:style>
|
||||
<style:style style:name="T1" style:family="text">
|
||||
@@ -790,6 +816,24 @@
|
||||
<style:style style:name="T7" style:family="text">
|
||||
<style:text-properties fo:language="fr" fo:country="CH"/>
|
||||
</style:style>
|
||||
<style:style style:name="T8" style:family="text">
|
||||
<style:text-properties fo:color="#000000" loext:opacity="100%" style:font-name="Arial" fo:font-size="9pt" style:letter-kerning="false" style:font-name-asian="Times New Roman" style:font-size-asian="9pt" style:font-name-complex="Arial" style:font-size-complex="9pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T9" style:family="text">
|
||||
<style:text-properties fo:color="#000000" loext:opacity="100%" style:font-name="Arial" fo:font-size="9pt" officeooo:rsid="00056da2" style:letter-kerning="false" style:font-name-asian="Times New Roman" style:font-size-asian="9pt" style:font-name-complex="Arial" style:font-size-complex="9pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T10" style:family="text">
|
||||
<style:text-properties fo:color="#000000" loext:opacity="100%" fo:font-size="9pt" style:letter-kerning="false" style:font-name-asian="Times New Roman" style:font-size-asian="9pt" style:font-name-complex="Arial" style:font-size-complex="9pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T11" style:family="text">
|
||||
<style:text-properties fo:color="#000000" loext:opacity="100%" fo:font-size="9pt" officeooo:rsid="00056da2" style:letter-kerning="false" style:font-name-asian="Times New Roman" style:font-size-asian="9pt" style:font-name-complex="Arial" style:font-size-complex="9pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T12" style:family="text">
|
||||
<style:text-properties fo:color="#000000" loext:opacity="100%" style:letter-kerning="false" style:font-name-asian="Times New Roman" style:font-name-complex="Arial"/>
|
||||
</style:style>
|
||||
<style:style style:name="T13" style:family="text">
|
||||
<style:text-properties fo:color="#000000" loext:opacity="100%" officeooo:rsid="00056da2" style:letter-kerning="false" style:font-name-asian="Times New Roman" style:font-name-complex="Arial"/>
|
||||
</style:style>
|
||||
<style:style style:name="fr1" style:family="graphic" style:parent-style-name="Graphics">
|
||||
<style:graphic-properties style:run-through="background" style:wrap="run-through" style:number-wrapped-paragraphs="no-limit" style:vertical-pos="top" style:vertical-rel="baseline" style:mirror="none" fo:clip="rect(0cm, 0cm, 0cm, 0cm)" draw:luminance="0%" draw:contrast="0%" draw:red="0%" draw:green="0%" draw:blue="0%" draw:gamma="100%" draw:color-inversion="false" draw:image-opacity="100%" draw:color-mode="standard"/>
|
||||
</style:style>
|
||||
@@ -3930,7 +3974,7 @@
|
||||
<text:p text:style-name="P25">Goods description</text:p>
|
||||
</table:table-cell>
|
||||
<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> <text:placeholder text:placeholder-type="text"><invoice.report_weight_unit_upper></text:placeholder>)</text:p>
|
||||
<text:p text:style-name="P26">QUANTITY: <text:placeholder text:placeholder-type="text"><invoice.report_lbs_display></text:placeholder><text:s/>LBS (<text:placeholder text:placeholder-type="text"><invoice.report_net_display></text:placeholder> <text:placeholder text:placeholder-type="text"><invoice.report_weight_unit_upper></text:placeholder>)</text:p>
|
||||
<text:p text:style-name="P26"/>
|
||||
<text:p text:style-name="P21"><text:placeholder text:placeholder-type="text"><invoice.report_description_upper or invoice.report_product_description></text:placeholder><text:placeholder text:placeholder-type="text"><' CROP ' + invoice.report_crop_name if invoice.report_crop_name else ''></text:placeholder></text:p>
|
||||
<text:p text:style-name="P21"><text:placeholder text:placeholder-type="text"><invoice.report_attributes_name></text:placeholder></text:p>
|
||||
@@ -3941,8 +3985,7 @@
|
||||
<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="P32"><text:placeholder text:placeholder-type="text"><invoice.report_incoterm></text:placeholder></text:p>
|
||||
<text:p text:style-name="P29"><text:span text:style-name="T1">ALL DETAILS AND SPECIFICATIONS AS PER</text:span> <text:span text:style-name="T3">BENEFICIARY </text:span></text:p>
|
||||
<text:p text:style-name="P29"><text:span text:style-name="T7"><text:placeholder text:placeholder-type="text"><invoice.report_incoterm></text:placeholder></text:span><text:span text:style-name="T3"><text:s/></text:span></text:p>
|
||||
<text:p text:style-name="P26"/>
|
||||
<text:p text:style-name="P26"/>
|
||||
<text:p text:style-name="P12"/>
|
||||
@@ -3974,10 +4017,10 @@
|
||||
<text:p text:style-name="P15"><text:placeholder text:placeholder-type="text"><invoice.report_nb_bale></text:placeholder><text:s/></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau6.A2" office:value-type="string">
|
||||
<text:p text:style-name="P15"><text:placeholder text:placeholder-type="text"><format_number(invoice.report_gross, invoice.party.lang) if invoice.report_gross != '' else ''></text:placeholder><text:s/></text:p>
|
||||
<text:p text:style-name="P15"><text:placeholder text:placeholder-type="text"><invoice.report_gross_display></text:placeholder><text:s/></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau6.A2" office:value-type="string">
|
||||
<text:p text:style-name="P30"><text:placeholder text:placeholder-type="text"><format_number(invoice.report_net, invoice.party.lang) if invoice.report_net != '' else ''></text:placeholder><text:s/></text:p>
|
||||
<text:p text:style-name="P30"><text:placeholder text:placeholder-type="text"><invoice.report_net_display></text:placeholder><text:s/></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau6.A2" office:value-type="string">
|
||||
<text:p text:style-name="P16"/>
|
||||
@@ -4001,7 +4044,7 @@
|
||||
<text:p text:style-name="P16">Equivalent to LBS</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau7.A1" office:value-type="string">
|
||||
<text:p text:style-name="P16"><text:placeholder text:placeholder-type="text"><format_number(invoice.report_lbs, invoice.party.lang) if invoice.report_lbs != '' else ''></text:placeholder><text:s/></text:p>
|
||||
<text:p text:style-name="P16"><text:placeholder text:placeholder-type="text"><invoice.report_lbs_display></text:placeholder><text:s/></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau7.A1" office:value-type="string">
|
||||
<text:p text:style-name="P20"/>
|
||||
@@ -4021,8 +4064,11 @@
|
||||
<text:p text:style-name="P14">FREIGHT VALUE: <text:placeholder text:placeholder-type="text"><invoice.report_freight_currency_symbol></text:placeholder><text:s/><text:placeholder text:placeholder-type="text"><format_number(invoice.report_freight_amount, invoice.party.lang) if invoice.report_freight_amount != '' else ''></text:placeholder></text:p>
|
||||
<text:p text:style-name="P14"/>
|
||||
<text:p text:style-name="P17">WE CERTIFY THAT THE MERCHANDISE IS OF <text:span text:style-name="T7"><text:placeholder text:placeholder-type="text"><invoice.report_origin or ''></text:placeholder></text:span><text:s/>ORIGIN</text:p>
|
||||
<text:p text:style-name="P31"><text:soft-page-break/>L/C NUMBER </text:p>
|
||||
<text:p text:style-name="P31"/>
|
||||
<text:p text:style-name="P17"/>
|
||||
<text:p text:style-name="P47"><text:span text:style-name="T12">B</text:span><text:span text:style-name="T13">ANK</text:span><text:span text:style-name="T12">: EFG BANK SA</text:span></text:p>
|
||||
<text:p text:style-name="P45">IBAN : CH8808667007168111027</text:p>
|
||||
<text:p text:style-name="P45">SwifT Code: EFGBCHZZ</text:p>
|
||||
<text:p text:style-name="P48"/>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau8.A1" office:value-type="string">
|
||||
<text:p text:style-name="P34"><text:s text:c="3"/><text:placeholder text:placeholder-type="text"><format_currency(invoice.total_amount, invoice.party.lang, invoice.currency)></text:placeholder><text:s/></text:p>
|
||||
@@ -4034,6 +4080,7 @@
|
||||
<text:p text:style-name="P11"/>
|
||||
<table:table table:name="Tableau9" table:style-name="Tableau9">
|
||||
<table:table-column table:style-name="Tableau9.A"/>
|
||||
<text:soft-page-break/>
|
||||
<table:table-row table:style-name="Tableau9.1">
|
||||
<table:table-cell table:style-name="Tableau9.A1" office:value-type="string">
|
||||
<text:p text:style-name="P21">NET LANDED WEIGHTS, ACTUAL TARE, NO FRANCHISE</text:p>
|
||||
@@ -4059,7 +4106,7 @@
|
||||
<text:p text:style-name="P13">Controller Name</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau10.A1" office:value-type="string">
|
||||
<text:p text:style-name="P25"><text:placeholder text:placeholder-type="text"><invoice.report_si_number></text:placeholder></text:p>
|
||||
<text:p text:style-name="P25"><text:placeholder text:placeholder-type="text"><invoice.report_si_reference></text:placeholder></text:p>
|
||||
<text:p text:style-name="P25"/>
|
||||
<text:p text:style-name="P25"><text:placeholder text:placeholder-type="text"><invoice.report_controller_name></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
@@ -4107,4 +4154,4 @@
|
||||
<text:p text:style-name="P38"/>
|
||||
</office:text>
|
||||
</office:body>
|
||||
</office:document>
|
||||
</office:document>
|
||||
@@ -4,31 +4,31 @@
|
||||
<office:meta>
|
||||
<dc:title>Credit / Debit Note</dc:title>
|
||||
<meta:initial-creator>willen</meta:initial-creator>
|
||||
<meta:creation-date>2018-12-09T16:20:00</meta:creation-date>
|
||||
<dc:date>2026-03-27T08:01:16.333000000</dc:date>
|
||||
<meta:print-date>2007-08-28T18:19:00</meta:print-date>
|
||||
<meta:generator>LibreOffice/7.6.0.3$Windows_X86_64 LibreOffice_project/69edd8b8ebc41d00b4de3915dc82f8f0fc3b6265</meta:generator>
|
||||
<meta:editing-duration>PT3H13M14S</meta:editing-duration>
|
||||
<meta:editing-cycles>13</meta:editing-cycles>
|
||||
|
||||
<meta:document-statistic meta:table-count="10" meta:image-count="2" meta:object-count="0" meta:page-count="2" meta:paragraph-count="68" meta:word-count="226" meta:character-count="3098" meta:non-whitespace-character-count="2521"/></office:meta>
|
||||
|
||||
|
||||
<meta:generator>LibreOffice/7.6.0.3$Windows_X86_64 LibreOffice_project/69edd8b8ebc41d00b4de3915dc82f8f0fc3b6265</meta:generator>
|
||||
<meta:editing-duration>PT3H14M14S</meta:editing-duration>
|
||||
<meta:editing-cycles>15</meta:editing-cycles>
|
||||
|
||||
<dc:date>2026-04-10T09:14:51.284000000</dc:date><meta:document-statistic meta:table-count="10" meta:image-count="2" meta:object-count="0" meta:page-count="2" meta:paragraph-count="67" meta:word-count="175" meta:character-count="2499" meta:non-whitespace-character-count="1973"/></office:meta>
|
||||
<office:settings>
|
||||
<config:config-item-set config:name="ooo:view-settings">
|
||||
<config:config-item config:name="ViewAreaTop" config:type="long">9437</config:config-item>
|
||||
<config:config-item config:name="ViewAreaTop" config:type="long">17727</config:config-item>
|
||||
<config:config-item config:name="ViewAreaLeft" config:type="long">0</config:config-item>
|
||||
<config:config-item config:name="ViewAreaWidth" config:type="long">27264</config:config-item>
|
||||
<config:config-item config:name="ViewAreaHeight" config:type="long">13242</config:config-item>
|
||||
<config:config-item config:name="ViewAreaHeight" config:type="long">13187</config:config-item>
|
||||
<config:config-item config:name="ShowRedlineChanges" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="InBrowseMode" config:type="boolean">false</config:config-item>
|
||||
<config:config-item-map-indexed config:name="Views">
|
||||
<config:config-item-map-entry>
|
||||
<config:config-item config:name="ViewId" config:type="string">view2</config:config-item>
|
||||
<config:config-item config:name="ViewLeft" config:type="long">10084</config:config-item>
|
||||
<config:config-item config:name="ViewTop" config:type="long">16424</config:config-item>
|
||||
<config:config-item config:name="ViewLeft" config:type="long">5639</config:config-item>
|
||||
<config:config-item config:name="ViewTop" config:type="long">26935</config:config-item>
|
||||
<config:config-item config:name="VisibleLeft" config:type="long">0</config:config-item>
|
||||
<config:config-item config:name="VisibleTop" config:type="long">9437</config:config-item>
|
||||
<config:config-item config:name="VisibleTop" config:type="long">17727</config:config-item>
|
||||
<config:config-item config:name="VisibleRight" config:type="long">27263</config:config-item>
|
||||
<config:config-item config:name="VisibleBottom" config:type="long">22677</config:config-item>
|
||||
<config:config-item config:name="VisibleBottom" config:type="long">30912</config:config-item>
|
||||
<config:config-item config:name="ZoomType" config:type="short">0</config:config-item>
|
||||
<config:config-item config:name="ViewLayoutColumns" config:type="short">0</config:config-item>
|
||||
<config:config-item config:name="ViewLayoutBookMode" config:type="boolean">false</config:config-item>
|
||||
@@ -101,11 +101,11 @@
|
||||
<config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ClipAsCharacterAnchoredWriterFlyFrames" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="UseOldPrinterMetrics" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="Rsid" config:type="int">665618</config:config-item>
|
||||
<config:config-item config:name="Rsid" config:type="int">890727</config:config-item>
|
||||
<config:config-item config:name="RsidRoot" config:type="int">84510</config:config-item>
|
||||
<config:config-item config:name="ProtectForm" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="MsWordCompTrailingBlanks" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="MsWordCompMinLineHeightByFly" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="MsWordCompMinLineHeightByFly" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="MathBaselineAlignment" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="SmallCapsPercentage66" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item>
|
||||
@@ -114,7 +114,7 @@
|
||||
<config:config-item config:name="EmbedOnlyUsedFonts" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="EmbedLatinScriptFonts" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="EmbedAsianScriptFonts" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="TabOverMargin" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="TabOverMargin" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="ApplyParagraphMarkFormatToNumbering" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="TabOverSpacing" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="TreatSingleColumnBreakAsPageBreak" config:type="boolean">false</config:config-item>
|
||||
@@ -131,6 +131,7 @@
|
||||
<config:config-item config:name="ImagePreferredDPI" config:type="int">0</config:config-item>
|
||||
<config:config-item config:name="AutoFirstLineIndentDisregardLineSpace" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="HyphenateURLs" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="DoNotBreakWrappedTables" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="NoNumberingShowFollowBy" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="DropCapPunctuation" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="PrintAnnotationMode" config:type="short">0</config:config-item>
|
||||
@@ -158,16 +159,20 @@
|
||||
</office:script>
|
||||
</office:scripts>
|
||||
<office:font-face-decls>
|
||||
<style:font-face style:name="0" svg:font-family="0" style:font-family-generic="roman" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Arial" svg:font-family="Arial" style:font-family-generic="swiss" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Arial1" svg:font-family="Arial, Arial" style:font-family-generic="swiss" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Calibri" svg:font-family="Calibri" style:font-family-generic="swiss" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Calibri1" svg:font-family="Calibri, 'Century Gothic'" style:font-family-generic="swiss" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="FuturaBookATT" svg:font-family="FuturaBookATT, 'Century Gothic'" style:font-family-generic="swiss" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Lucida Sans" svg:font-family="'Lucida Sans'" style:font-family-generic="swiss"/>
|
||||
<style:font-face style:name="Lucida Sans1" svg:font-family="'Lucida Sans'" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Liberation Serif" svg:font-family="'Liberation Serif'" style:font-family-generic="roman" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Lucida Sans" svg:font-family="'Lucida Sans'" style:font-family-generic="roman" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Lucida Sans1" svg:font-family="'Lucida Sans'" style:font-family-generic="swiss"/>
|
||||
<style:font-face style:name="Lucida Sans2" svg:font-family="'Lucida Sans'" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Microsoft YaHei" svg:font-family="'Microsoft YaHei'" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Tahoma" svg:font-family="Tahoma, arial" style:font-family-generic="swiss" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Times New Roman" svg:font-family="'Times New Roman', Times" style:font-family-generic="roman" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Times New Roman" svg:font-family="'Times New Roman'" style:font-family-generic="swiss" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Times New Roman1" svg:font-family="'Times New Roman', Times" style:font-family-generic="roman" style:font-pitch="variable"/>
|
||||
</office:font-face-decls>
|
||||
<office:styles>
|
||||
<style:default-style style:family="graphic">
|
||||
@@ -175,11 +180,11 @@
|
||||
<style:paragraph-properties style:text-autospace="none" style:line-break="strict" loext:tab-stop-distance="0cm" style:writing-mode="lr-tb" style:font-independent-line-spacing="false">
|
||||
<style:tab-stops/>
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Times New Roman" fo:font-size="12pt" fo:language="fr" fo:country="CH" style:letter-kerning="true" style:font-name-asian="Times New Roman" style:font-size-asian="12pt" style:language-asian="fr" style:country-asian="CH" style:font-name-complex="Times New Roman" style:font-size-complex="12pt" style:language-complex="fr" style:country-complex="CH"/>
|
||||
<style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Times New Roman1" fo:font-size="12pt" fo:language="fr" fo:country="CH" style:letter-kerning="true" style:font-name-asian="Times New Roman1" style:font-size-asian="12pt" style:language-asian="fr" style:country-asian="CH" style:font-name-complex="Times New Roman1" style:font-size-complex="12pt" style:language-complex="fr" style:country-complex="CH"/>
|
||||
</style:default-style>
|
||||
<style:default-style style:family="paragraph">
|
||||
<style:paragraph-properties fo:hyphenation-ladder-count="no-limit" style:text-autospace="none" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="1.249cm" style:writing-mode="page"/>
|
||||
<style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Times New Roman" fo:font-size="12pt" fo:language="fr" fo:country="CH" style:letter-kerning="true" style:font-name-asian="Times New Roman" style:font-size-asian="12pt" style:language-asian="fr" style:country-asian="CH" style:font-name-complex="Times New Roman" style:font-size-complex="12pt" style:language-complex="fr" style:country-complex="CH" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="no-limit" loext:hyphenation-zone="no-limit"/>
|
||||
<style:paragraph-properties fo:hyphenation-ladder-count="no-limit" style:text-autospace="none" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="1.249cm" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Times New Roman1" fo:font-size="12pt" fo:language="fr" fo:country="CH" style:letter-kerning="true" style:font-name-asian="Times New Roman1" style:font-size-asian="12pt" style:language-asian="fr" style:country-asian="CH" style:font-name-complex="Times New Roman1" style:font-size-complex="12pt" style:language-complex="fr" style:country-complex="CH" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="no-limit" loext:hyphenation-zone="no-limit"/>
|
||||
</style:default-style>
|
||||
<style:default-style style:family="table">
|
||||
<style:table-properties table:border-model="collapsing"/>
|
||||
@@ -193,21 +198,21 @@
|
||||
</style:style>
|
||||
<style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text">
|
||||
<style:paragraph-properties fo:margin-top="0.423cm" fo:margin-bottom="0.212cm" style:contextual-spacing="false" fo:keep-with-next="always"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-family="Arial" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-asian="Microsoft YaHei" style:font-family-asian="'Microsoft YaHei'" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="14pt" style:font-name-complex="Lucida Sans1" style:font-family-complex="'Lucida Sans'" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-family="Arial" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-asian="Microsoft YaHei" style:font-family-asian="'Microsoft YaHei'" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="14pt" style:font-name-complex="Lucida Sans2" style:font-family-complex="'Lucida Sans'" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.212cm" style:contextual-spacing="false"/>
|
||||
</style:style>
|
||||
<style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="list">
|
||||
<style:text-properties style:font-name-complex="Lucida Sans" style:font-family-complex="'Lucida Sans'" style:font-family-generic-complex="swiss"/>
|
||||
<style:text-properties style:font-name-complex="Lucida Sans1" style:font-family-complex="'Lucida Sans'" style:font-family-generic-complex="swiss"/>
|
||||
</style:style>
|
||||
<style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
|
||||
<style:paragraph-properties fo:margin-top="0.212cm" fo:margin-bottom="0.212cm" style:contextual-spacing="false" text:number-lines="false" text:line-number="0"/>
|
||||
<style:text-properties fo:font-size="12pt" fo:font-style="italic" style:font-size-asian="12pt" style:font-style-asian="italic" style:font-name-complex="Lucida Sans" style:font-family-complex="'Lucida Sans'" style:font-family-generic-complex="swiss" style:font-size-complex="12pt" style:font-style-complex="italic"/>
|
||||
<style:text-properties fo:font-size="12pt" fo:font-style="italic" style:font-size-asian="12pt" style:font-style-asian="italic" style:font-name-complex="Lucida Sans1" style:font-family-complex="'Lucida Sans'" style:font-family-generic-complex="swiss" style:font-size-complex="12pt" style:font-style-complex="italic"/>
|
||||
</style:style>
|
||||
<style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard" style:class="index">
|
||||
<style:paragraph-properties text:number-lines="false" text:line-number="0"/>
|
||||
<style:text-properties style:font-name-complex="Lucida Sans" style:font-family-complex="'Lucida Sans'" style:font-family-generic-complex="swiss"/>
|
||||
<style:text-properties style:font-name-complex="Lucida Sans1" style:font-family-complex="'Lucida Sans'" style:font-family-generic-complex="swiss"/>
|
||||
</style:style>
|
||||
<style:style style:name="heading_20_1" style:display-name="heading 1" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Standard" style:default-outline-level="1" style:list-style-name="">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" fo:text-align="center" style:justify-single-word="false" fo:keep-with-next="always"/>
|
||||
@@ -244,7 +249,7 @@
|
||||
</style:style>
|
||||
<style:style style:name="No_20_Spacing" style:display-name="No Spacing" style:family="paragraph">
|
||||
<style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-align="start" style:justify-single-word="false" fo:text-indent="0cm" style:auto-text-indent="false" style:text-autospace="ideograph-alpha" style:vertical-align="auto"/>
|
||||
<style:text-properties style:font-name="Calibri1" fo:font-family="Calibri, 'Century Gothic'" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="11pt" fo:language="it" fo:country="IT" style:font-name-asian="Times New Roman" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:font-size-asian="11pt" style:language-asian="en" style:country-asian="US" style:font-name-complex="Calibri1" style:font-family-complex="Calibri, 'Century Gothic'" style:font-family-generic-complex="swiss" style:font-pitch-complex="variable" style:font-size-complex="11pt" style:language-complex="ar" style:country-complex="SA"/>
|
||||
<style:text-properties style:font-name="Calibri1" fo:font-family="Calibri, 'Century Gothic'" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="11pt" fo:language="it" fo:country="IT" style:font-name-asian="Times New Roman1" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:font-size-asian="11pt" style:language-asian="en" style:country-asian="US" style:font-name-complex="Calibri1" style:font-family-complex="Calibri, 'Century Gothic'" style:font-family-generic-complex="swiss" style:font-pitch-complex="variable" style:font-size-complex="11pt" style:language-complex="ar" style:country-complex="SA"/>
|
||||
</style:style>
|
||||
<style:style style:name="Header_20_and_20_Footer" style:display-name="Header and Footer" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
|
||||
<style:paragraph-properties text:number-lines="false" text:line-number="0">
|
||||
@@ -277,29 +282,70 @@
|
||||
<style:paragraph-properties fo:text-align="center" style:justify-single-word="false" text:number-lines="false" text:line-number="0"/>
|
||||
<style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/>
|
||||
</style:style>
|
||||
<style:style style:name="Normal1" style:family="paragraph">
|
||||
<style:paragraph-properties fo:orphans="2" fo:widows="2" fo:hyphenation-ladder-count="no-limit" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-family="'Liberation Serif'" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="12pt" fo:language="en" fo:country="GB" style:letter-kerning="true" style:font-name-asian="0" style:font-family-asian="0" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:font-size-asian="12pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Lucida Sans" style:font-family-complex="'Lucida Sans'" style:font-family-generic-complex="roman" style:font-pitch-complex="variable" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="no-limit" loext:hyphenation-zone="no-limit"/>
|
||||
</style:style>
|
||||
<style:style style:name="header1" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="0.423cm">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="8.001cm" style:type="center"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="footer1" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="0.423cm">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="8.001cm" style:type="center"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
</style:style>
|
||||
<style:style style:name="footer2" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="0.423cm">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="8.001cm" style:type="center"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
</style:style>
|
||||
<style:style style:name="header2" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="0.423cm">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="8.001cm" style:type="center"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="Default_20_Paragraph_20_Font" style:display-name="Default Paragraph Font" style:family="text"/>
|
||||
<style:style style:name="Titolo_20_1_20_Carattere" style:display-name="Titolo 1 Carattere" style:family="text" style:parent-style-name="Default_20_Paragraph_20_Font">
|
||||
<style:text-properties style:font-name="Arial1" fo:font-family="Arial, Arial" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="12pt" fo:language="en" fo:country="US" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color" fo:font-weight="bold" style:font-name-asian="Arial1" style:font-family-asian="Arial, Arial" style:font-family-generic-asian="swiss" style:font-pitch-asian="variable" style:font-size-asian="12pt" style:language-asian="en" style:country-asian="US" style:font-weight-asian="bold" style:font-name-complex="Arial1" style:font-family-complex="Arial, Arial" style:font-family-generic-complex="swiss" style:font-pitch-complex="variable" style:font-size-complex="12pt" style:font-weight-complex="bold"/>
|
||||
</style:style>
|
||||
<style:style style:name="Intestazione_20_Carattere" style:display-name="Intestazione Carattere" style:family="text" style:parent-style-name="Default_20_Paragraph_20_Font">
|
||||
<style:text-properties style:font-name="Times New Roman" fo:font-family="'Times New Roman', Times" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="10pt" style:font-name-asian="Times New Roman" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:font-size-asian="10pt" style:font-name-complex="Times New Roman" style:font-family-complex="'Times New Roman', Times" style:font-family-generic-complex="roman" style:font-pitch-complex="variable" style:font-size-complex="10pt"/>
|
||||
<style:text-properties style:font-name="Times New Roman1" fo:font-family="'Times New Roman', Times" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="10pt" style:font-name-asian="Times New Roman1" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:font-size-asian="10pt" style:font-name-complex="Times New Roman1" style:font-family-complex="'Times New Roman', Times" style:font-family-generic-complex="roman" style:font-pitch-complex="variable" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="Placeholder_20_Text" style:display-name="Placeholder Text" style:family="text" style:parent-style-name="Default_20_Paragraph_20_Font">
|
||||
<style:text-properties fo:color="#808080" loext:opacity="100%" style:font-name="Times New Roman" fo:font-family="'Times New Roman', Times" style:font-family-generic="roman" style:font-pitch="variable" style:font-name-asian="Times New Roman" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:font-name-complex="Times New Roman" style:font-family-complex="'Times New Roman', Times" style:font-family-generic-complex="roman" style:font-pitch-complex="variable"/>
|
||||
<style:text-properties fo:color="#808080" loext:opacity="100%" style:font-name="Times New Roman1" fo:font-family="'Times New Roman', Times" style:font-family-generic="roman" style:font-pitch="variable" style:font-name-asian="Times New Roman1" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:font-name-complex="Times New Roman1" style:font-family-complex="'Times New Roman', Times" style:font-family-generic-complex="roman" style:font-pitch-complex="variable"/>
|
||||
</style:style>
|
||||
<style:style style:name="Testo_20_fumetto_20_Carattere" style:display-name="Testo fumetto Carattere" style:family="text" style:parent-style-name="Default_20_Paragraph_20_Font">
|
||||
<style:text-properties style:font-name="Tahoma" fo:font-family="Tahoma, arial" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="8pt" style:font-name-asian="Tahoma" style:font-family-asian="Tahoma, arial" style:font-family-generic-asian="swiss" style:font-pitch-asian="variable" style:font-size-asian="8pt" style:font-name-complex="Tahoma" style:font-family-complex="Tahoma, arial" style:font-family-generic-complex="swiss" style:font-pitch-complex="variable" style:font-size-complex="8pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="PiÃ_a8__20_di_20_pagina_20_Carattere" style:display-name="Piè di pagina Carattere" style:family="text" style:parent-style-name="Default_20_Paragraph_20_Font">
|
||||
<style:text-properties style:font-name="Times New Roman" fo:font-family="'Times New Roman', Times" style:font-family-generic="roman" style:font-pitch="variable" style:font-name-asian="Times New Roman" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:font-name-complex="Times New Roman" style:font-family-complex="'Times New Roman', Times" style:font-family-generic-complex="roman" style:font-pitch-complex="variable"/>
|
||||
<style:text-properties style:font-name="Times New Roman1" fo:font-family="'Times New Roman', Times" style:font-family-generic="roman" style:font-pitch="variable" style:font-name-asian="Times New Roman1" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:font-name-complex="Times New Roman1" style:font-family-complex="'Times New Roman', Times" style:font-family-generic-complex="roman" style:font-pitch-complex="variable"/>
|
||||
</style:style>
|
||||
<style:style style:name="Nessuna_20_spaziatura_20_Carattere" style:display-name="Nessuna spaziatura Carattere" style:family="text" style:parent-style-name="Default_20_Paragraph_20_Font">
|
||||
<style:text-properties style:font-name="Calibri1" fo:font-family="Calibri, 'Century Gothic'" style:font-family-generic="swiss" style:font-pitch="variable" fo:language="it" fo:country="IT" style:font-name-asian="Times New Roman" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:language-asian="en" style:country-asian="US" style:font-name-complex="Calibri1" style:font-family-complex="Calibri, 'Century Gothic'" style:font-family-generic-complex="swiss" style:font-pitch-complex="variable"/>
|
||||
<style:text-properties style:font-name="Calibri1" fo:font-family="Calibri, 'Century Gothic'" style:font-family-generic="swiss" style:font-pitch="variable" fo:language="it" fo:country="IT" style:font-name-asian="Times New Roman1" style:font-family-asian="'Times New Roman', Times" style:font-family-generic-asian="roman" style:font-pitch-asian="variable" style:language-asian="en" style:country-asian="US" style:font-name-complex="Calibri1" style:font-family-complex="Calibri, 'Century Gothic'" style:font-family-generic-complex="swiss" style:font-pitch-complex="variable"/>
|
||||
</style:style>
|
||||
<style:style style:name="Placeholder" style:family="text">
|
||||
<style:text-properties fo:font-variant="small-caps" fo:color="#008080" loext:opacity="100%" style:text-underline-style="dotted" style:text-underline-width="auto" style:text-underline-color="font-color"/>
|
||||
</style:style>
|
||||
<style:style style:name="Police_20_par_20_dÃ_a9_faut" style:display-name="Police par défaut" style:family="text"/>
|
||||
<style:style style:name="Police_20_par_20_défaut" style:display-name="Police par défaut" style:family="text"/>
|
||||
<style:style style:name="Default_20_Paragraph_20_Font_20__28_WW_29_" style:display-name="Default Paragraph Font (WW)" style:family="text"/>
|
||||
<style:style style:name="Default_20_Paragraph_20_Font1" style:display-name="Default Paragraph Font1" style:family="text"/>
|
||||
<style:style style:name="Frame" style:family="graphic">
|
||||
<style:graphic-properties text:anchor-type="paragraph" svg:x="0cm" svg:y="0cm" style:wrap="parallel" style:number-wrapped-paragraphs="no-limit" style:wrap-contour="false" style:vertical-pos="top" style:vertical-rel="paragraph-content" style:horizontal-pos="center" style:horizontal-rel="paragraph-content" fo:background-color="transparent" draw:fill="none" draw:fill-color="#cfe7f5"/>
|
||||
</style:style>
|
||||
@@ -396,6 +442,9 @@
|
||||
<text:notes-configuration text:note-class="footnote" style:num-format="1" text:start-value="0" text:footnotes-position="page" text:start-numbering-at="document"/>
|
||||
<text:notes-configuration text:note-class="endnote" style:num-format="i" text:start-value="0"/>
|
||||
<text:linenumbering-configuration text:number-lines="false" text:offset="0.499cm" style:num-format="1" text:number-position="left" text:increment="5"/>
|
||||
<style:default-page-layout>
|
||||
<style:page-layout-properties style:writing-mode="lr-tb" style:layout-grid-standard-mode="true"/>
|
||||
</style:default-page-layout>
|
||||
<loext:theme loext:name="Office Theme">
|
||||
<loext:theme-colors loext:name="LibreOffice">
|
||||
<loext:color loext:name="dark1" loext:color="#000000"/>
|
||||
@@ -642,11 +691,11 @@
|
||||
</style:style>
|
||||
<style:style style:name="P21" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties fo:font-size="10pt" fo:language="en" fo:country="GB" style:font-size-asian="10pt" style:font-name-complex="Times New Roman" style:font-size-complex="10pt"/>
|
||||
<style:text-properties fo:font-size="10pt" fo:language="en" fo:country="GB" style:font-size-asian="10pt" style:font-name-complex="Times New Roman1" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P22" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties fo:font-size="10pt" fo:language="en" fo:country="GB" officeooo:paragraph-rsid="000681ce" style:font-size-asian="10pt" style:font-name-complex="Times New Roman" style:font-size-complex="10pt"/>
|
||||
<style:text-properties fo:font-size="10pt" fo:language="en" fo:country="GB" officeooo:paragraph-rsid="000681ce" style:font-size-asian="10pt" style:font-name-complex="Times New Roman1" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P23" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
@@ -666,11 +715,11 @@
|
||||
</style:style>
|
||||
<style:style style:name="P27" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties fo:font-size="10pt" fo:language="en" fo:country="US" style:font-size-asian="10pt" style:font-name-complex="Times New Roman" style:font-size-complex="10pt"/>
|
||||
<style:text-properties fo:font-size="10pt" fo:language="en" fo:country="US" style:font-size-asian="10pt" style:font-name-complex="Times New Roman1" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P28" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties fo:font-size="10pt" fo:language="en" fo:country="US" officeooo:paragraph-rsid="000681ce" style:font-size-asian="10pt" style:font-name-complex="Times New Roman" style:font-size-complex="10pt"/>
|
||||
<style:text-properties fo:font-size="10pt" fo:language="en" fo:country="US" officeooo:paragraph-rsid="000681ce" style:font-size-asian="10pt" style:font-name-complex="Times New Roman1" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P29" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
@@ -682,7 +731,7 @@
|
||||
</style:style>
|
||||
<style:style style:name="P31" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-name-complex="Times New Roman" style:font-size-complex="10pt"/>
|
||||
<style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-name-complex="Times New Roman1" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P32" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" fo:text-align="center" style:justify-single-word="false" style:writing-mode="lr-tb"/>
|
||||
@@ -694,7 +743,7 @@
|
||||
</style:style>
|
||||
<style:style style:name="P34" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties fo:font-size="10pt" fo:language="fr" fo:country="CH" style:font-size-asian="10pt" style:font-name-complex="Times New Roman" style:font-size-complex="10pt"/>
|
||||
<style:text-properties fo:font-size="10pt" fo:language="fr" fo:country="CH" style:font-size-asian="10pt" style:font-name-complex="Times New Roman1" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P35" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" fo:text-align="end" style:justify-single-word="false" style:writing-mode="lr-tb"/>
|
||||
@@ -710,7 +759,7 @@
|
||||
</style:style>
|
||||
<style:style style:name="P38" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties fo:font-size="1pt" fo:language="en" fo:country="US" style:font-size-asian="1pt" style:font-name-complex="Times New Roman" style:font-size-complex="1pt" text:display="none"/>
|
||||
<style:text-properties fo:font-size="1pt" fo:language="en" fo:country="US" style:font-size-asian="1pt" style:font-name-complex="Times New Roman1" style:font-size-complex="1pt" text:display="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="P39" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
@@ -745,14 +794,25 @@
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties officeooo:paragraph-rsid="00022035"/>
|
||||
</style:style>
|
||||
<style:style style:name="P46" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties fo:font-size="10pt" fo:language="en" fo:country="GB" style:font-size-asian="10pt" style:font-name-complex="Times New Roman" style:font-size-complex="10pt"/>
|
||||
<style:style style:name="P46" style:family="paragraph" style:parent-style-name="Normal1">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%"/>
|
||||
</style:style>
|
||||
<style:style style:name="P47" style:family="paragraph" style:parent-style-name="footer">
|
||||
<style:style style:name="P47" style:family="paragraph" style:parent-style-name="Normal1">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%"/>
|
||||
<style:text-properties style:font-name="Calibri" fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P48" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties fo:color="#000000" loext:opacity="100%" style:font-name="Calibri" fo:font-size="10pt" fo:language="fr" fo:country="CH" style:letter-kerning="false" style:font-name-asian="Times New Roman" style:font-size-asian="10pt" style:font-name-complex="Arial" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P49" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:line-height="100%" style:writing-mode="lr-tb"/>
|
||||
<style:text-properties style:font-name="Calibri" fo:font-size="10pt" fo:language="fr" fo:country="CH" style:font-size-asian="10pt" style:font-name-complex="Arial1" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P50" style:family="paragraph" style:parent-style-name="footer">
|
||||
<style:paragraph-properties style:writing-mode="lr-tb"/>
|
||||
</style:style>
|
||||
<style:style style:name="P48" style:family="paragraph" style:parent-style-name="header">
|
||||
<style:style style:name="P51" style:family="paragraph" style:parent-style-name="header">
|
||||
<style:paragraph-properties style:writing-mode="lr-tb"/>
|
||||
</style:style>
|
||||
<style:style style:name="T1" style:family="text">
|
||||
@@ -776,11 +836,32 @@
|
||||
<style:style style:name="T7" style:family="text">
|
||||
<style:text-properties fo:language="fr" fo:country="CH"/>
|
||||
</style:style>
|
||||
<style:style style:name="T8" style:family="text">
|
||||
<style:text-properties fo:color="#000000" loext:opacity="100%"/>
|
||||
</style:style>
|
||||
<style:style style:name="T9" style:family="text">
|
||||
<style:text-properties fo:color="#000000" loext:opacity="100%" style:font-name="Arial" fo:font-size="9pt" style:letter-kerning="false" style:font-name-asian="Times New Roman" style:font-size-asian="9pt" style:font-name-complex="Arial" style:font-size-complex="9pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T10" style:family="text">
|
||||
<style:text-properties fo:color="#000000" loext:opacity="100%" style:font-name="Arial" fo:font-size="10pt" style:letter-kerning="false" style:font-name-asian="Times New Roman" style:font-size-asian="10pt" style:font-name-complex="Arial" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T11" style:family="text">
|
||||
<style:text-properties fo:color="#000000" loext:opacity="100%" style:font-name="Arial" style:letter-kerning="false" style:font-name-asian="Times New Roman" style:font-name-complex="Arial"/>
|
||||
</style:style>
|
||||
<style:style style:name="T12" style:family="text">
|
||||
<style:text-properties fo:color="#000000" loext:opacity="100%" fo:font-size="9pt" style:letter-kerning="false" style:font-name-asian="Times New Roman" style:font-size-asian="9pt" style:font-name-complex="Arial" style:font-size-complex="9pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T13" style:family="text">
|
||||
<style:text-properties fo:color="#000000" loext:opacity="100%" fo:font-size="10pt" style:letter-kerning="false" style:font-name-asian="Times New Roman" style:font-size-asian="10pt" style:font-name-complex="Arial" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T14" style:family="text">
|
||||
<style:text-properties fo:color="#000000" loext:opacity="100%" style:letter-kerning="false" style:font-name-asian="Times New Roman" style:font-name-complex="Arial"/>
|
||||
</style:style>
|
||||
<style:style style:name="fr1" style:family="graphic" style:parent-style-name="Graphics">
|
||||
<style:graphic-properties style:run-through="background" style:wrap="run-through" style:number-wrapped-paragraphs="no-limit" style:vertical-pos="top" style:vertical-rel="baseline" style:mirror="none" fo:clip="rect(0cm, 0cm, 0cm, 0cm)" draw:luminance="0%" draw:contrast="0%" draw:red="0%" draw:green="0%" draw:blue="0%" draw:gamma="100%" draw:color-inversion="false" draw:image-opacity="100%" draw:color-mode="standard"/>
|
||||
</style:style>
|
||||
<style:page-layout style:name="pm1">
|
||||
<style:page-layout-properties fo:page-width="21.001cm" fo:page-height="29.7cm" style:num-format="1" style:print-orientation="portrait" fo:margin-top="0.75cm" fo:margin-bottom="1.499cm" fo:margin-left="2cm" fo:margin-right="2cm" fo:border="none" fo:padding="0cm" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.706cm" style:layout-grid-ruby-height="0.353cm" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0cm" loext:margin-gutter="0cm">
|
||||
<style:page-layout-properties fo:page-width="21.001cm" fo:page-height="29.7cm" style:num-format="1" style:print-orientation="portrait" fo:margin-top="0.75cm" fo:margin-bottom="1.499cm" fo:margin-left="2cm" fo:margin-right="2cm" fo:border="none" fo:padding="0cm" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="44" style:layout-grid-base-height="0.55cm" style:layout-grid-ruby-height="0cm" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="true" style:layout-grid-display="true" style:layout-grid-base-width="0.37cm" style:layout-grid-snap-to="true" style:footnote-max-height="0cm" loext:margin-gutter="0cm">
|
||||
<style:footnote-sep style:width="0.018cm" style:distance-before-sep="0.101cm" style:distance-after-sep="0.101cm" style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>
|
||||
</style:page-layout-properties>
|
||||
<style:header-style>
|
||||
@@ -3916,7 +3997,7 @@
|
||||
<text:p text:style-name="P26">Goods description</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau5.A1" office:value-type="string">
|
||||
<text:p text:style-name="P27">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="P27">QUANTITY: <text:placeholder text:placeholder-type="text"><invoice.report_lbs_display></text:placeholder><text:s/>LBS (<text:placeholder text:placeholder-type="text"><invoice.report_net_display></text:placeholder> <text:placeholder text:placeholder-type="text"><invoice.report_weight_unit_upper></text:placeholder>)</text:p>
|
||||
<text:p text:style-name="P27"/>
|
||||
<text:p text:style-name="P21"><text:placeholder text:placeholder-type="text"><invoice.report_description_upper or invoice.report_product_description></text:placeholder><text:placeholder text:placeholder-type="text"><' CROP ' + invoice.report_crop_name if invoice.report_crop_name else ''></text:placeholder></text:p>
|
||||
<text:p text:style-name="P21"><text:placeholder text:placeholder-type="text"><invoice.report_attributes_name></text:placeholder></text:p>
|
||||
@@ -3956,13 +4037,13 @@
|
||||
</table:table-row>
|
||||
<table:table-row table:style-name="Tableau6.1">
|
||||
<table:table-cell table:style-name="Tableau6.A2" office:value-type="string">
|
||||
<text:p text:style-name="P15"><text:placeholder text:placeholder-type="text"><invoice.report_nb_bale></text:placeholder><text:s/></text:p>
|
||||
<text:p text:style-name="P15"><text:placeholder text:placeholder-type="text"><invoice.report_cndn_nb_bale></text:placeholder><text:s/></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau6.A2" office:value-type="string">
|
||||
<text:p text:style-name="P15"><text:placeholder text:placeholder-type="text"><format_number(invoice.report_gross, invoice.party.lang) if invoice.report_gross != '' else ''></text:placeholder><text:s/></text:p>
|
||||
<text:p text:style-name="P15"><text:placeholder text:placeholder-type="text"><invoice.report_gross_display></text:placeholder><text:s/></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau6.A2" office:value-type="string">
|
||||
<text:p text:style-name="P32"><text:placeholder text:placeholder-type="text"><format_number(invoice.report_net, invoice.party.lang) if invoice.report_net != '' else ''></text:placeholder><text:s/></text:p>
|
||||
<text:p text:style-name="P32"><text:placeholder text:placeholder-type="text"><invoice.report_net_display></text:placeholder><text:s/></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau6.A2" office:value-type="string">
|
||||
<text:p text:style-name="P16"/>
|
||||
@@ -3986,7 +4067,7 @@
|
||||
<text:p text:style-name="P16">Equivalent to LBS</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau7.A1" office:value-type="string">
|
||||
<text:p text:style-name="P16"><text:placeholder text:placeholder-type="text"><format_number(invoice.report_lbs, invoice.party.lang) if invoice.report_lbs != '' else ''></text:placeholder><text:s/></text:p>
|
||||
<text:p text:style-name="P16"><text:placeholder text:placeholder-type="text"><invoice.report_lbs_display></text:placeholder><text:s/></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau7.A1" office:value-type="string">
|
||||
<text:p text:style-name="P20"/>
|
||||
@@ -4003,15 +4084,18 @@
|
||||
<text:p text:style-name="P14">At <text:placeholder text:placeholder-type="text"><line></text:placeholder></text:p>
|
||||
<text:p text:style-name="P14"><text:placeholder text:placeholder-type="text"></for></text:placeholder></text:p>
|
||||
<text:p text:style-name="P14"/>
|
||||
<text:p text:style-name="P14"><text:soft-page-break/>FREIGHT VALUE: <text:placeholder text:placeholder-type="text"><invoice.report_freight_currency_symbol></text:placeholder><text:s/><text:placeholder text:placeholder-type="text"><format_number(invoice.report_freight_amount, invoice.party.lang) if invoice.report_freight_amount != '' else ''></text:placeholder></text:p>
|
||||
<text:p text:style-name="P14">FREIGHT VALUE: <text:placeholder text:placeholder-type="text"><invoice.report_freight_currency_symbol></text:placeholder><text:s/><text:placeholder text:placeholder-type="text"><format_number(invoice.report_freight_amount, invoice.party.lang) if invoice.report_freight_amount != '' else ''></text:placeholder></text:p>
|
||||
<text:p text:style-name="P14"/>
|
||||
<text:p text:style-name="P17">WE CERTIFY THAT THE MERCHANDISE IS OF <text:span text:style-name="T7"><text:placeholder text:placeholder-type="text"><invoice.report_origin or ''></text:placeholder></text:span><text:s/>ORIGIN</text:p>
|
||||
<text:p text:style-name="P33">L/C NUMBER </text:p>
|
||||
<text:p text:style-name="P33"/>
|
||||
<text:p text:style-name="P17"/>
|
||||
<text:p text:style-name="P47" loext:marker-style-name="T8"><text:span text:style-name="T14">BANK: EFG BANK SA</text:span></text:p>
|
||||
<text:p text:style-name="P47" loext:marker-style-name="T8"><text:span text:style-name="T14">IBAN : CH8808667007168111027</text:span><text:span text:style-name="T14"/></text:p>
|
||||
<text:p text:style-name="P48">SwifT Code: EFGBCHZZ</text:p>
|
||||
<text:p text:style-name="P49"/>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau8.A1" office:value-type="string">
|
||||
<text:p text:style-name="P36"><text:s text:c="3"/><text:placeholder text:placeholder-type="text"><format_currency(invoice.total_amount, invoice.party.lang, invoice.currency)></text:placeholder><text:s/></text:p>
|
||||
<text:p text:style-name="P24"><text:soft-page-break/></text:p>
|
||||
<text:p text:style-name="P24"/>
|
||||
<text:p text:style-name="P35"/>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
@@ -4019,6 +4103,7 @@
|
||||
<text:p text:style-name="P11"/>
|
||||
<table:table table:name="Tableau9" table:style-name="Tableau9">
|
||||
<table:table-column table:style-name="Tableau9.A"/>
|
||||
<text:soft-page-break/>
|
||||
<table:table-row table:style-name="Tableau9.1">
|
||||
<table:table-cell table:style-name="Tableau9.A1" office:value-type="string">
|
||||
<text:p text:style-name="P21">NET LANDED WEIGHTS, ACTUAL TARE, NO FRANCHISE</text:p>
|
||||
@@ -4044,7 +4129,7 @@
|
||||
<text:p text:style-name="P13">Controller Name</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau10.A1" office:value-type="string">
|
||||
<text:p text:style-name="P26"><text:placeholder text:placeholder-type="text"><invoice.report_si_number></text:placeholder></text:p>
|
||||
<text:p text:style-name="P26"><text:placeholder text:placeholder-type="text"><invoice.report_si_reference></text:placeholder></text:p>
|
||||
<text:p text:style-name="P26"/>
|
||||
<text:p text:style-name="P26"><text:placeholder text:placeholder-type="text"><invoice.report_controller_name></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
@@ -4092,4 +4177,4 @@
|
||||
<text:p text:style-name="P40"/>
|
||||
</office:text>
|
||||
</office:body>
|
||||
</office:document>
|
||||
</office:document>
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
import datetime
|
||||
from decimal import Decimal
|
||||
from unittest.mock import Mock, patch
|
||||
|
||||
from trytond.modules.account_invoice.exceptions import (
|
||||
PaymentTermValidationError)
|
||||
@@ -251,5 +252,70 @@ class AccountInvoiceTestCase(
|
||||
(datetime.date(2012, 1, 14), Decimal('-1.0')),
|
||||
])
|
||||
|
||||
def test_post_rpc_does_not_require_fresh_session(self):
|
||||
'posting invoices does not force a fresh session'
|
||||
Invoice = Pool().get('account.invoice')
|
||||
|
||||
self.assertFalse(Invoice.__rpc__['post'].fresh_session)
|
||||
|
||||
@with_transaction()
|
||||
def test_validate_invoice_creates_move_for_customer_invoice(self):
|
||||
'validating customer invoices now creates the account move'
|
||||
Invoice = Pool().get('account.invoice')
|
||||
|
||||
move = Mock()
|
||||
invoice = Invoice()
|
||||
invoice.type = 'out'
|
||||
invoice.move = None
|
||||
invoice.get_move = Mock(return_value=move)
|
||||
invoice.do_lot_invoicing = Mock()
|
||||
|
||||
move_model = Mock()
|
||||
|
||||
with patch.object(Invoice, '_check_taxes'), patch.object(
|
||||
Invoice, '_store_cache'), patch.object(
|
||||
Invoice, 'browse', return_value=[]), patch.object(
|
||||
Invoice, 'cleanMoves') as clean_moves, patch.object(
|
||||
Invoice, 'save') as save_invoices, patch(
|
||||
'trytond.modules.account_invoice.invoice.Pool'
|
||||
) as PoolMock:
|
||||
PoolMock.return_value.get.return_value = move_model
|
||||
|
||||
Invoice.validate_invoice([invoice])
|
||||
|
||||
self.assertIs(invoice.move, move)
|
||||
invoice.get_move.assert_called_once_with()
|
||||
invoice.do_lot_invoicing.assert_called_once_with()
|
||||
move_model.save.assert_called_once_with([move])
|
||||
clean_moves.assert_called_once_with([move])
|
||||
save_invoices.assert_called()
|
||||
|
||||
@with_transaction()
|
||||
def test_validate_invoice_sets_number_for_customer_invoice(self):
|
||||
'validating customer invoices now assigns the invoice number'
|
||||
Invoice = Pool().get('account.invoice')
|
||||
|
||||
move = Mock()
|
||||
invoice = Invoice()
|
||||
invoice.type = 'out'
|
||||
invoice.move = None
|
||||
invoice.get_move = Mock(return_value=move)
|
||||
invoice.do_lot_invoicing = Mock()
|
||||
|
||||
move_model = Mock()
|
||||
|
||||
with patch.object(Invoice, '_check_taxes'), patch.object(
|
||||
Invoice, '_store_cache'), patch.object(
|
||||
Invoice, 'set_number') as set_number, patch.object(
|
||||
Invoice, 'cleanMoves'), patch.object(
|
||||
Invoice, 'save'), patch(
|
||||
'trytond.modules.account_invoice.invoice.Pool'
|
||||
) as PoolMock:
|
||||
PoolMock.return_value.get.return_value = move_model
|
||||
|
||||
Invoice.validate_invoice([invoice])
|
||||
|
||||
set_number.assert_called_once_with([invoice])
|
||||
|
||||
|
||||
del ModuleTestCase
|
||||
|
||||
@@ -102,6 +102,15 @@ de negoce physique:
|
||||
- le `unit_price` doit rester un prix de base, hors `premium`
|
||||
- le `premium` doit impacter le prix total economique et donc le `amount`,
|
||||
aussi bien en `priced` qu'en `basis`
|
||||
- dans `pricing.pricing` en saisie manuelle, l'utilisateur renseigne
|
||||
seulement `quantity` et `settl_price`
|
||||
- `fixed_qt`, `fixed_qt_price`, `unfixed_qt`, `unfixed_qt_price` et
|
||||
`eod_price` sont des valeurs derivees et ne doivent pas etre saisies a la
|
||||
main
|
||||
- en manuel, `fixed_qt` = cumul des `quantity` du groupe trie par
|
||||
`pricing_date`
|
||||
- en manuel, `fixed_qt_price` = moyenne ponderee cumulee des `settl_price`
|
||||
- en manuel, `unfixed_qt_price` = `settl_price` de la ligne
|
||||
- pour les documents commerciaux / facture, une ligne `basis` affiche le
|
||||
`premium` comme prix visible, pas le prix economique total
|
||||
- si `linked currency` est active, le `premium` est saisi dans la devise /
|
||||
@@ -159,6 +168,12 @@ de negoce physique:
|
||||
- Le calcul du prix peut diverger entre `unit_price`, `linked_price`,
|
||||
`lot_price` et valuation si le premium n'est pas traite explicitement dans
|
||||
chaque maillon.
|
||||
- Sur `account.invoice`, le workflow `Validate` doit maintenant aligner
|
||||
fournisseur et client pour:
|
||||
- creation du `account.move`
|
||||
- attribution du `number`
|
||||
- `Post` ne doit pas reintroduire une difference de session/fresh login cote
|
||||
client
|
||||
|
||||
## 7) Definition of done (module `purchase_trade`)
|
||||
|
||||
|
||||
@@ -280,5 +280,6 @@ def register():
|
||||
invoice.PurchaseReport,
|
||||
stock.ShipmentShippingReport,
|
||||
stock.ShipmentInsuranceReport,
|
||||
stock.ShipmentPackingListReport,
|
||||
module='purchase_trade', type_='report')
|
||||
|
||||
|
||||
@@ -16,3 +16,4 @@ class Configuration(ModelSingleton, ModelSQL, ModelView):
|
||||
purchase_report_template = fields.Char("Purchase Template")
|
||||
shipment_shipping_report_template = fields.Char("Shipping Template")
|
||||
shipment_insurance_report_template = fields.Char("Insurance Template")
|
||||
shipment_packing_list_report_template = fields.Char("Packing List Template")
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Business Rules - Purchase Trade
|
||||
|
||||
Statut: `draft`
|
||||
Version: `v0.4`
|
||||
Derniere mise a jour: `2026-04-02`
|
||||
Version: `v0.5`
|
||||
Derniere mise a jour: `2026-04-10`
|
||||
Owner metier: `a completer`
|
||||
Owner technique: `a completer`
|
||||
|
||||
@@ -333,8 +333,52 @@ Owner technique: `a completer`
|
||||
- seuls les lots physiques des `incoming_moves` du shipment sont exportes
|
||||
- l'action exige au minimum un `controller` et un `returned_id` sur le
|
||||
shipment
|
||||
- les cles renvoyees par le systeme distant et la date d'envoi sont
|
||||
conservees sur le `weight.report` local
|
||||
- les cles renvoyees par le systeme distant et la date d'envoi sont
|
||||
conservees sur le `weight.report` local
|
||||
- Priorite:
|
||||
- `importante`
|
||||
|
||||
### BR-PT-016 - En pricing manuel, seules la quantite fixee du jour et le prix de marche sont saisis
|
||||
|
||||
- Intent: simplifier la saisie utilisateur et garantir une coherence unique
|
||||
entre les colonnes de `pricing.pricing`.
|
||||
- Description:
|
||||
- Pour une ligne de `pricing.pricing` en mode manuel, l'utilisateur ne doit
|
||||
saisir que:
|
||||
- `quantity`
|
||||
- `settl_price`
|
||||
- Les autres colonnes de suivi sont derivees automatiquement sur tout le
|
||||
groupe metier (`line + component` ou `sale_line + component`) trie par
|
||||
`pricing_date`.
|
||||
- Resultat attendu:
|
||||
- `fixed_qt` = cumul des `quantity`
|
||||
- `fixed_qt_price` = moyenne ponderee cumulee des `settl_price`
|
||||
- `unfixed_qt` = quantite de base de la ligne - `fixed_qt`
|
||||
- `unfixed_qt_price` = `settl_price` de la ligne
|
||||
- `eod_price` = moyenne ponderee entre jambe fixee et non fixee
|
||||
- `last=True` reste unique par groupe et suit la plus grande `pricing_date`
|
||||
- Hors scope:
|
||||
- la generation automatique des lignes quand `pricing.component.auto = True`
|
||||
ne doit pas changer de comportement
|
||||
- Priorite:
|
||||
- `structurante`
|
||||
|
||||
### BR-PT-017 - Le workflow Validate des factures client doit aussi attribuer le numero
|
||||
|
||||
- Intent: aligner le comportement des factures client et fournisseur au moment
|
||||
de `Validate`.
|
||||
- Description:
|
||||
- Lors du workflow `Validate` sur `account.invoice`, une facture client
|
||||
(`type = out`) doit maintenant:
|
||||
- creer son `account.move`
|
||||
- recevoir son `number`
|
||||
- La numerotation ne doit plus etre repoussee au `Post` cote client.
|
||||
- Resultat attendu:
|
||||
- a l'issue de `Validate`, une facture fournisseur ou client possede deja:
|
||||
- son `account.move`
|
||||
- son `number`
|
||||
- `Post` conserve son role de posting comptable sans reintroduire de
|
||||
difference de session/fresh login cote client
|
||||
- Priorite:
|
||||
- `importante`
|
||||
- Resultat attendu:
|
||||
|
||||
@@ -114,6 +114,10 @@ Derniere mise a jour: `2026-04-07`
|
||||
- `Payment`
|
||||
- `Purchase`
|
||||
- `Shipment`
|
||||
- Dans la section `Shipment`, les templates metier attendus sont:
|
||||
- `Shipping`
|
||||
- `Insurance`
|
||||
- `Packing List`
|
||||
- Regle:
|
||||
- si le champ de template correspondant est vide, le report doit echouer
|
||||
explicitement avec `No template found`
|
||||
|
||||
@@ -26,6 +26,11 @@ class Invoice(metaclass=PoolMeta):
|
||||
text += '.0'
|
||||
return text or '0'
|
||||
|
||||
@classmethod
|
||||
def _format_report_quantity_display(cls, value):
|
||||
return cls._format_report_number(
|
||||
value, digits='0.01', strip_trailing_zeros=False)
|
||||
|
||||
def _get_report_invoice_line(self):
|
||||
for line in self.lines or []:
|
||||
if getattr(line, 'type', None) == 'line':
|
||||
@@ -39,6 +44,243 @@ class Invoice(metaclass=PoolMeta):
|
||||
]
|
||||
return lines or list(self.lines or [])
|
||||
|
||||
@staticmethod
|
||||
def _get_report_related_lots(line):
|
||||
lots = []
|
||||
seen = set()
|
||||
|
||||
def add_lot(lot):
|
||||
if not lot:
|
||||
return
|
||||
lot_id = getattr(lot, 'id', None)
|
||||
key = ('id', lot_id) if lot_id is not None else ('obj', id(lot))
|
||||
if key in seen:
|
||||
return
|
||||
seen.add(key)
|
||||
lots.append(lot)
|
||||
|
||||
add_lot(getattr(line, 'lot', None))
|
||||
origin = getattr(line, 'origin', None)
|
||||
for lot in getattr(origin, 'lots', []) or []:
|
||||
add_lot(lot)
|
||||
return lots
|
||||
|
||||
@classmethod
|
||||
def _get_report_preferred_lots(cls, line):
|
||||
lots = cls._get_report_related_lots(line)
|
||||
physicals = [
|
||||
lot for lot in lots
|
||||
if getattr(lot, 'lot_type', None) == 'physic'
|
||||
]
|
||||
if physicals:
|
||||
return physicals
|
||||
virtuals = [
|
||||
lot for lot in lots
|
||||
if getattr(lot, 'lot_type', None) == 'virtual'
|
||||
]
|
||||
if len(virtuals) == 1:
|
||||
return virtuals
|
||||
return []
|
||||
|
||||
@staticmethod
|
||||
def _get_report_line_sign(line):
|
||||
quantity = Decimal(str(getattr(line, 'quantity', 0) or 0))
|
||||
return Decimal(-1) if quantity < 0 else Decimal(1)
|
||||
|
||||
@staticmethod
|
||||
def _get_report_lot_hist_weights(lot):
|
||||
if not lot:
|
||||
return None, None
|
||||
if hasattr(lot, 'get_hist_quantity'):
|
||||
net, gross = lot.get_hist_quantity()
|
||||
return (
|
||||
Decimal(str(net or 0)),
|
||||
Decimal(str(gross if gross not in (None, '') else net or 0)),
|
||||
)
|
||||
hist = list(getattr(lot, 'lot_hist', []) or [])
|
||||
state = getattr(lot, 'lot_state', None)
|
||||
state_id = getattr(state, 'id', None)
|
||||
if state_id is not None:
|
||||
for entry in hist:
|
||||
quantity_type = getattr(entry, 'quantity_type', None)
|
||||
if getattr(quantity_type, 'id', None) == state_id:
|
||||
net = Decimal(str(getattr(entry, 'quantity', 0) or 0))
|
||||
gross = Decimal(str(
|
||||
getattr(entry, 'gross_quantity', None)
|
||||
if getattr(entry, 'gross_quantity', None) not in (None, '')
|
||||
else net))
|
||||
return net, gross
|
||||
return None, None
|
||||
|
||||
def _get_report_invoice_line_weights(self, line):
|
||||
lots = self._get_report_preferred_lots(line)
|
||||
if lots and self._report_invoice_line_reuses_lot(line):
|
||||
quantity = self._get_report_invoice_line_quantity_from_line(line)
|
||||
return quantity, quantity
|
||||
if lots:
|
||||
sign = self._get_report_line_sign(line)
|
||||
net_total = Decimal(0)
|
||||
gross_total = Decimal(0)
|
||||
for lot in lots:
|
||||
net, gross = self._get_report_lot_hist_weights(lot)
|
||||
if net is None:
|
||||
continue
|
||||
net_total += net
|
||||
gross_total += gross
|
||||
if net_total or gross_total:
|
||||
return net_total * sign, gross_total * sign
|
||||
quantity = Decimal(str(getattr(line, 'quantity', 0) or 0))
|
||||
return quantity, quantity
|
||||
|
||||
@staticmethod
|
||||
def _get_report_line_lot_keys(line):
|
||||
keys = []
|
||||
for lot in Invoice._get_report_preferred_lots(line):
|
||||
lot_id = getattr(lot, 'id', None)
|
||||
keys.append(lot_id if lot_id is not None else id(lot))
|
||||
return tuple(sorted(keys))
|
||||
|
||||
def _report_invoice_line_reuses_lot(self, line):
|
||||
line_keys = self._get_report_line_lot_keys(line)
|
||||
if not line_keys:
|
||||
return False
|
||||
for other in self._get_report_invoice_lines():
|
||||
if other is line:
|
||||
continue
|
||||
if self._get_report_line_lot_keys(other) == line_keys:
|
||||
return True
|
||||
return False
|
||||
|
||||
def _get_report_reused_lot_lines(self):
|
||||
groups = {}
|
||||
for line in self._get_report_invoice_lines():
|
||||
lots = self._get_report_preferred_lots(line)
|
||||
if not lots:
|
||||
continue
|
||||
for lot in lots:
|
||||
lot_id = getattr(lot, 'id', None)
|
||||
key = lot_id if lot_id is not None else id(lot)
|
||||
groups.setdefault(key, {'lot': lot, 'lines': []})
|
||||
groups[key]['lines'].append(line)
|
||||
return {
|
||||
key: value for key, value in groups.items()
|
||||
if len(value['lines']) > 1
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def _convert_report_quantity(quantity, from_unit, to_unit):
|
||||
value = Decimal(str(quantity or 0))
|
||||
if not from_unit or not to_unit:
|
||||
return value
|
||||
if getattr(from_unit, 'id', None) == getattr(to_unit, 'id', None):
|
||||
return value
|
||||
from_name = getattr(from_unit, 'rec_name', None)
|
||||
to_name = getattr(to_unit, 'rec_name', None)
|
||||
if from_name and to_name and from_name == to_name:
|
||||
return value
|
||||
converted = Pool().get('product.uom').compute_qty(
|
||||
from_unit, float(value), to_unit) or 0
|
||||
return Decimal(str(converted))
|
||||
|
||||
@classmethod
|
||||
def _get_report_invoice_line_quantity_from_line(cls, line):
|
||||
quantity = Decimal(str(getattr(line, 'quantity', 0) or 0))
|
||||
return cls._convert_report_quantity(
|
||||
quantity,
|
||||
getattr(line, 'unit', None),
|
||||
cls._get_report_invoice_line_unit(line),
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def _find_report_hist_entry_for_quantity(cls, lot, quantity, exclude_state_id=None):
|
||||
target = Decimal(str(quantity or 0)).copy_abs()
|
||||
for entry in list(getattr(lot, 'lot_hist', []) or []):
|
||||
quantity_type = getattr(entry, 'quantity_type', None)
|
||||
if getattr(quantity_type, 'id', None) == exclude_state_id:
|
||||
continue
|
||||
entry_quantity = Decimal(str(getattr(entry, 'quantity', 0) or 0))
|
||||
if entry_quantity == target:
|
||||
return entry
|
||||
return None
|
||||
|
||||
def _get_report_reused_lot_gross_total(self):
|
||||
reused_lots = self._get_report_reused_lot_lines()
|
||||
if not reused_lots:
|
||||
return None
|
||||
total = Decimal(0)
|
||||
for data in reused_lots.values():
|
||||
lot = data['lot']
|
||||
_, current_gross = self._get_report_lot_hist_weights(lot)
|
||||
if current_gross is None:
|
||||
continue
|
||||
current_state = getattr(getattr(lot, 'lot_state', None), 'id', None)
|
||||
negative_lines = [
|
||||
line for line in data['lines']
|
||||
if Decimal(str(getattr(line, 'quantity', 0) or 0)) < 0
|
||||
]
|
||||
previous_gross = Decimal(0)
|
||||
matched = False
|
||||
for line in negative_lines:
|
||||
previous_entry = self._find_report_hist_entry_for_quantity(
|
||||
lot,
|
||||
self._get_report_invoice_line_quantity_from_line(line),
|
||||
exclude_state_id=current_state,
|
||||
)
|
||||
if not previous_entry:
|
||||
continue
|
||||
previous_gross += Decimal(str(
|
||||
getattr(previous_entry, 'gross_quantity', 0) or 0))
|
||||
matched = True
|
||||
if matched:
|
||||
total += current_gross - previous_gross
|
||||
return total
|
||||
|
||||
@staticmethod
|
||||
def _get_report_invoice_line_unit(line):
|
||||
lots = Invoice._get_report_preferred_lots(line)
|
||||
if lots and getattr(lots[0], 'lot_unit_line', None):
|
||||
return lots[0].lot_unit_line
|
||||
return getattr(line, 'unit', None)
|
||||
|
||||
@staticmethod
|
||||
def _get_report_lbs_unit():
|
||||
Uom = Pool().get('product.uom')
|
||||
for domain in (
|
||||
[('symbol', '=', 'LBS')],
|
||||
[('rec_name', '=', 'LBS')],
|
||||
[('name', '=', 'LBS')],
|
||||
[('symbol', '=', 'LB')],
|
||||
[('rec_name', '=', 'LB')],
|
||||
[('name', '=', 'LB')]):
|
||||
units = Uom.search(domain, limit=1)
|
||||
if units:
|
||||
return units[0]
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
def _convert_report_quantity_to_lbs(cls, quantity, unit):
|
||||
value = Decimal(str(quantity or 0))
|
||||
if value == 0:
|
||||
return Decimal('0.00')
|
||||
if not unit:
|
||||
return (value * Decimal('2204.62')).quantize(Decimal('0.01'))
|
||||
label = (
|
||||
getattr(unit, 'symbol', None)
|
||||
or getattr(unit, 'rec_name', None)
|
||||
or getattr(unit, 'name', None)
|
||||
or ''
|
||||
).strip().upper()
|
||||
if label in {'LBS', 'LB', 'POUND', 'POUNDS'}:
|
||||
return value.quantize(Decimal('0.01'))
|
||||
lbs_unit = cls._get_report_lbs_unit()
|
||||
if lbs_unit:
|
||||
converted = Pool().get('product.uom').compute_qty(
|
||||
unit, float(value), lbs_unit) or 0
|
||||
return Decimal(str(converted)).quantize(Decimal('0.01'))
|
||||
if label in {'KG', 'KGS', 'KILOGRAM', 'KILOGRAMS'}:
|
||||
return (value * Decimal('2.20462')).quantize(Decimal('0.01'))
|
||||
return (value * Decimal('2204.62')).quantize(Decimal('0.01'))
|
||||
|
||||
@staticmethod
|
||||
def _clean_report_description(value):
|
||||
text = (value or '').strip()
|
||||
@@ -81,6 +323,35 @@ class Invoice(metaclass=PoolMeta):
|
||||
return lot
|
||||
return line.lots[0]
|
||||
|
||||
@staticmethod
|
||||
def _get_report_lot_shipment(lot):
|
||||
if not lot:
|
||||
return None
|
||||
return (
|
||||
getattr(lot, 'lot_shipment_in', None)
|
||||
or getattr(lot, 'lot_shipment_out', None)
|
||||
or getattr(lot, 'lot_shipment_internal', None)
|
||||
)
|
||||
|
||||
def _get_report_invoice_shipments(self):
|
||||
shipments = []
|
||||
seen = set()
|
||||
for line in self._get_report_invoice_lines():
|
||||
for lot in self._get_report_preferred_lots(line):
|
||||
shipment = self._get_report_lot_shipment(lot)
|
||||
if not shipment:
|
||||
continue
|
||||
shipment_id = getattr(shipment, 'id', None)
|
||||
key = (
|
||||
getattr(shipment, '__name__', None),
|
||||
shipment_id if shipment_id is not None else id(shipment),
|
||||
)
|
||||
if key in seen:
|
||||
continue
|
||||
seen.add(key)
|
||||
shipments.append(shipment)
|
||||
return shipments
|
||||
|
||||
def _get_report_invoice_lots(self):
|
||||
invoice_lines = self._get_report_invoice_lines()
|
||||
if not invoice_lines:
|
||||
@@ -140,14 +411,13 @@ class Invoice(metaclass=PoolMeta):
|
||||
return fees[0] if fees else None
|
||||
|
||||
def _get_report_shipment(self):
|
||||
lot = self._get_report_lot()
|
||||
if not lot:
|
||||
shipments = self._get_report_invoice_shipments()
|
||||
if len(shipments) == 1:
|
||||
return shipments[0]
|
||||
if len(shipments) > 1:
|
||||
return None
|
||||
return (
|
||||
getattr(lot, 'lot_shipment_in', None)
|
||||
or getattr(lot, 'lot_shipment_out', None)
|
||||
or getattr(lot, 'lot_shipment_internal', None)
|
||||
)
|
||||
lot = self._get_report_lot()
|
||||
return self._get_report_lot_shipment(lot)
|
||||
|
||||
@staticmethod
|
||||
def _get_report_bank_account(party):
|
||||
@@ -390,20 +660,17 @@ class Invoice(metaclass=PoolMeta):
|
||||
def report_quantity_lines(self):
|
||||
details = []
|
||||
for line in self._get_report_invoice_lines():
|
||||
quantity = getattr(line, 'report_net', '')
|
||||
if quantity == '':
|
||||
quantity = getattr(line, 'quantity', '')
|
||||
quantity, _ = self._get_report_invoice_line_weights(line)
|
||||
if quantity == '':
|
||||
continue
|
||||
quantity_text = self._format_report_number(
|
||||
quantity, keep_trailing_decimal=True)
|
||||
unit = getattr(line, 'unit', None)
|
||||
quantity_text = self._format_report_quantity_display(quantity)
|
||||
unit = self._get_report_invoice_line_unit(line)
|
||||
unit_name = unit.rec_name.upper() if unit and unit.rec_name else ''
|
||||
lbs = getattr(line, 'report_lbs', '')
|
||||
lbs = self._convert_report_quantity_to_lbs(quantity, unit)
|
||||
parts = [quantity_text, unit_name]
|
||||
if lbs != '':
|
||||
parts.append(
|
||||
f"({self._format_report_number(lbs, digits='0.01')} LBS)")
|
||||
f"({self._format_report_quantity_display(lbs)} LBS)")
|
||||
detail = ' '.join(part for part in parts if part)
|
||||
if detail:
|
||||
details.append(detail)
|
||||
@@ -586,11 +853,46 @@ class Invoice(metaclass=PoolMeta):
|
||||
return 'NB BALES: ' + str(int(nb_bale))
|
||||
return ''
|
||||
|
||||
@property
|
||||
def report_cndn_nb_bale(self):
|
||||
nb_bale = self.report_nb_bale
|
||||
if nb_bale == 'NB BALES: 0':
|
||||
return 'Unchanged'
|
||||
return nb_bale
|
||||
|
||||
@property
|
||||
def report_net_display(self):
|
||||
net = self.report_net
|
||||
if net == '':
|
||||
return ''
|
||||
return self._format_report_quantity_display(net)
|
||||
|
||||
@property
|
||||
def report_gross_display(self):
|
||||
gross = self.report_gross
|
||||
if gross == '':
|
||||
return ''
|
||||
return self._format_report_quantity_display(gross)
|
||||
|
||||
@property
|
||||
def report_lbs_display(self):
|
||||
lbs = self.report_lbs
|
||||
if lbs == '':
|
||||
return ''
|
||||
return self._format_report_quantity_display(lbs)
|
||||
|
||||
@property
|
||||
def report_gross(self):
|
||||
if self.lines:
|
||||
reused_gross = self._get_report_reused_lot_gross_total()
|
||||
if reused_gross is not None:
|
||||
non_reused_total = sum(
|
||||
self._get_report_invoice_line_weights(line)[1]
|
||||
for line in self._get_report_invoice_lines()
|
||||
if not self._report_invoice_line_reuses_lot(line))
|
||||
return non_reused_total + reused_gross
|
||||
return sum(
|
||||
Decimal(str(getattr(line, 'quantity', 0) or 0))
|
||||
self._get_report_invoice_line_weights(line)[1]
|
||||
for line in self._get_report_invoice_lines())
|
||||
line = self._get_report_trade_line()
|
||||
if line and line.lots:
|
||||
@@ -604,7 +906,7 @@ class Invoice(metaclass=PoolMeta):
|
||||
def report_net(self):
|
||||
if self.lines:
|
||||
return sum(
|
||||
Decimal(str(getattr(line, 'quantity', 0) or 0))
|
||||
self._get_report_invoice_line_weights(line)[0]
|
||||
for line in self._get_report_invoice_lines())
|
||||
line = self._get_report_trade_line()
|
||||
if line and line.lots:
|
||||
@@ -621,12 +923,21 @@ class Invoice(metaclass=PoolMeta):
|
||||
net = self.report_net
|
||||
if net == '':
|
||||
return ''
|
||||
return round(Decimal(net) * Decimal('2204.62'),2)
|
||||
invoice_line = self._get_report_invoice_line()
|
||||
unit = self._get_report_invoice_line_unit(invoice_line) if invoice_line else None
|
||||
return self._convert_report_quantity_to_lbs(net, unit)
|
||||
|
||||
@property
|
||||
def report_weight_unit_upper(self):
|
||||
line = self._get_report_trade_line() or self._get_report_invoice_line()
|
||||
unit = getattr(line, 'unit', None) if line else None
|
||||
invoice_line = self._get_report_invoice_line()
|
||||
unit = self._get_report_invoice_line_unit(invoice_line) if invoice_line else None
|
||||
if not unit:
|
||||
line = self._get_report_trade_line()
|
||||
lot = self._get_report_lot()
|
||||
unit = (
|
||||
getattr(lot, 'lot_unit_line', None)
|
||||
or getattr(line, 'unit', None) if line else None
|
||||
)
|
||||
if unit and unit.rec_name:
|
||||
return unit.rec_name.upper()
|
||||
return 'KGS'
|
||||
@@ -634,6 +945,16 @@ class Invoice(metaclass=PoolMeta):
|
||||
@property
|
||||
def report_note_title(self):
|
||||
total = Decimal(str(self.total_amount or 0))
|
||||
invoice_type = getattr(self, 'type', None)
|
||||
if not invoice_type:
|
||||
if self.sales:
|
||||
invoice_type = 'out'
|
||||
elif self.purchases:
|
||||
invoice_type = 'in'
|
||||
if invoice_type == 'out':
|
||||
if total < 0:
|
||||
return 'Credit Note'
|
||||
return 'Debit Note'
|
||||
if total < 0:
|
||||
return 'Debit Note'
|
||||
return 'Credit Note'
|
||||
@@ -721,6 +1042,13 @@ class Invoice(metaclass=PoolMeta):
|
||||
return shipment.number or ''
|
||||
return ''
|
||||
|
||||
@property
|
||||
def report_si_reference(self):
|
||||
shipment = self._get_report_shipment()
|
||||
if shipment:
|
||||
return getattr(shipment, 'reference', None) or ''
|
||||
return ''
|
||||
|
||||
@property
|
||||
def report_freight_amount(self):
|
||||
fee = self._get_report_freight_fee()
|
||||
@@ -832,6 +1160,16 @@ class InvoiceLine(metaclass=PoolMeta):
|
||||
@property
|
||||
def report_net(self):
|
||||
if self.type == 'line':
|
||||
invoice = getattr(self, 'invoice', None)
|
||||
if invoice and invoice._report_invoice_line_reuses_lot(self):
|
||||
return Invoice._get_report_invoice_line_quantity_from_line(self)
|
||||
lot = getattr(self, 'lot', None)
|
||||
if lot:
|
||||
net, _ = Invoice._get_report_lot_hist_weights(lot)
|
||||
if net is None:
|
||||
net = 0
|
||||
sign = Invoice._get_report_line_sign(self)
|
||||
return Decimal(str(net or 0)) * sign
|
||||
return self.quantity
|
||||
return ''
|
||||
|
||||
@@ -840,7 +1178,8 @@ class InvoiceLine(metaclass=PoolMeta):
|
||||
net = self.report_net
|
||||
if net == '':
|
||||
return ''
|
||||
return round(Decimal(net) * Decimal('2204.62'),2)
|
||||
unit = Invoice._get_report_invoice_line_unit(self)
|
||||
return Invoice._convert_report_quantity_to_lbs(net, unit)
|
||||
|
||||
|
||||
class ReportTemplateMixin:
|
||||
|
||||
@@ -1334,11 +1334,16 @@ class LotQt(
|
||||
Case((lp.id>0, lp.lot_premium_sale),else_=ls.lot_premium_sale).as_('r_lot_premium_sale'),
|
||||
Case((lp.id>0, lp.lot_parent),else_=ls.lot_parent).as_('r_lot_parent'),
|
||||
Case((lp.id>0, lp.lot_himself),else_=ls.lot_himself).as_('r_lot_himself'),
|
||||
Case((lp.id>0, lp.lot_container),else_=ls.lot_container).as_('r_lot_container'),
|
||||
Case((lp.id>0, lp.line),else_=None).as_('r_line'),
|
||||
Case((pu.id>0, pu.id),else_=None).as_('r_purchase'),
|
||||
Case((sa.id>0, sa.id),else_=None).as_('r_sale'),
|
||||
Case((ls.id>0, ls.sale_line),else_=None).as_('r_sale_line'),
|
||||
Case((lp.id>0, lp.lot_container),else_=ls.lot_container).as_('r_lot_container'),
|
||||
Case((lp.id>0, lp.line),else_=None).as_('r_line'),
|
||||
Case(
|
||||
(((lqt.lot_s != None) & (lqt.lot_p == None) & (sl.id > 0)),
|
||||
sl.del_period),
|
||||
else_=Case((pl.id>0, pl.del_period),else_=None)
|
||||
).as_('r_del_period'),
|
||||
Case((pu.id>0, pu.id),else_=None).as_('r_purchase'),
|
||||
Case((sa.id>0, sa.id),else_=None).as_('r_sale'),
|
||||
Case((ls.id>0, ls.sale_line),else_=None).as_('r_sale_line'),
|
||||
(MaQt + AvQt).as_('r_tot'),
|
||||
pu.party.as_('r_supplier'),
|
||||
sa.party.as_('r_client'),
|
||||
@@ -1439,13 +1444,14 @@ class LotQt(
|
||||
lp.lot_av.as_("r_lot_av"),
|
||||
lp.lot_premium.as_("r_lot_premium"),
|
||||
lp.lot_premium_sale.as_("r_lot_premium_sale"),
|
||||
lp.lot_parent.as_("r_lot_parent"),
|
||||
lp.lot_himself.as_("r_lot_himself"),
|
||||
lp.lot_container.as_("r_lot_container"),
|
||||
lp.line.as_("r_line"),
|
||||
Case((pu.id > 0, pu.id), else_=None).as_("r_purchase"),
|
||||
Case((sa.id > 0, sa.id), else_=None).as_("r_sale"),
|
||||
lp.sale_line.as_("r_sale_line"),
|
||||
lp.lot_parent.as_("r_lot_parent"),
|
||||
lp.lot_himself.as_("r_lot_himself"),
|
||||
lp.lot_container.as_("r_lot_container"),
|
||||
lp.line.as_("r_line"),
|
||||
pl.del_period.as_("r_del_period"),
|
||||
Case((pu.id > 0, pu.id), else_=None).as_("r_purchase"),
|
||||
Case((sa.id > 0, sa.id), else_=None).as_("r_sale"),
|
||||
lp.sale_line.as_("r_sale_line"),
|
||||
(MaQt2 + Abs(AvQt2)).as_("r_tot"),
|
||||
pu.party.as_("r_supplier"),
|
||||
sa.party.as_("r_client"),
|
||||
@@ -1504,13 +1510,14 @@ class LotQt(
|
||||
Max(lp.lot_av).as_("r_lot_av"),
|
||||
Avg(lp.lot_premium).as_("r_lot_premium"),
|
||||
Literal(None).as_("r_lot_premium_sale"),
|
||||
Literal(None).as_("r_lot_parent"),
|
||||
Literal(None).as_("r_lot_himself"),
|
||||
Max(lp.lot_container).as_("r_lot_container"),
|
||||
lp.line.as_("r_line"),
|
||||
Max(Case((pu.id > 0, pu.id), else_=None)).as_("r_purchase"),
|
||||
Max(Case((sa.id > 0, sa.id), else_=None)).as_("r_sale"),
|
||||
lp.sale_line.as_("r_sale_line"),
|
||||
Literal(None).as_("r_lot_parent"),
|
||||
Literal(None).as_("r_lot_himself"),
|
||||
Max(lp.lot_container).as_("r_lot_container"),
|
||||
lp.line.as_("r_line"),
|
||||
Max(pl.del_period).as_("r_del_period"),
|
||||
Max(Case((pu.id > 0, pu.id), else_=None)).as_("r_purchase"),
|
||||
Max(Case((sa.id > 0, sa.id), else_=None)).as_("r_sale"),
|
||||
lp.sale_line.as_("r_sale_line"),
|
||||
Sum(MaQt2 + Abs(AvQt2)).as_("r_tot"),
|
||||
Max(pu.party).as_("r_supplier"),
|
||||
Max(sa.party).as_("r_client"),
|
||||
@@ -1557,13 +1564,14 @@ class LotQt(
|
||||
union.r_lot_av.as_("r_lot_av"),
|
||||
union.r_lot_premium.as_("r_lot_premium"),
|
||||
union.r_lot_premium_sale.as_("r_lot_premium_sale"),
|
||||
union.r_lot_parent.as_("r_lot_parent"),
|
||||
union.r_lot_himself.as_("r_lot_himself"),
|
||||
union.r_lot_container.as_("r_lot_container"),
|
||||
union.r_line.as_("r_line"),
|
||||
union.r_purchase.as_("r_purchase"),
|
||||
union.r_sale.as_("r_sale"),
|
||||
union.r_sale_line.as_("r_sale_line"),
|
||||
union.r_lot_parent.as_("r_lot_parent"),
|
||||
union.r_lot_himself.as_("r_lot_himself"),
|
||||
union.r_lot_container.as_("r_lot_container"),
|
||||
union.r_line.as_("r_line"),
|
||||
union.r_del_period.as_("r_del_period"),
|
||||
union.r_purchase.as_("r_purchase"),
|
||||
union.r_sale.as_("r_sale"),
|
||||
union.r_sale_line.as_("r_sale_line"),
|
||||
union.r_tot.as_("r_tot"),
|
||||
union.r_supplier.as_("r_supplier"),
|
||||
union.r_client.as_("r_client"),
|
||||
@@ -1630,14 +1638,15 @@ class LotReport(
|
||||
r_lot_shipment_out = fields.Many2One('stock.shipment.out', "Shipment Out")
|
||||
r_lot_shipment_internal = fields.Many2One('stock.shipment.internal', "Shipment Internal")
|
||||
r_lot_move = fields.Many2One('stock.move', "Move")
|
||||
r_lot_parent = fields.Many2One('lot.lot',"Parent")
|
||||
r_lot_himself = fields.Many2One('lot.lot',"Lot")
|
||||
r_lot_container = fields.Char("Container")
|
||||
r_lot_unit_line = fields.Function(fields.Many2One('product.uom', "Unit"),'get_unit')
|
||||
r_lot_price = fields.Function(fields.Numeric("Price", digits='r_lot_unit_line'),'get_lot_price')
|
||||
r_lot_price_sale = fields.Function(fields.Numeric("Price", digits='r_lot_unit_line'),'get_lot_sale_price')
|
||||
r_sale_line = fields.Many2One('sale.line',"S. line")
|
||||
r_sale = fields.Many2One('sale.sale',"Sale")
|
||||
r_lot_parent = fields.Many2One('lot.lot',"Parent")
|
||||
r_lot_himself = fields.Many2One('lot.lot',"Lot")
|
||||
r_lot_container = fields.Char("Container")
|
||||
r_lot_unit_line = fields.Function(fields.Many2One('product.uom', "Unit"),'get_unit')
|
||||
r_lot_price = fields.Function(fields.Numeric("Price", digits='r_lot_unit_line'),'get_lot_price')
|
||||
r_lot_price_sale = fields.Function(fields.Numeric("Price", digits='r_lot_unit_line'),'get_lot_sale_price')
|
||||
r_del_period = fields.Many2One('product.month', "Delivery Period")
|
||||
r_sale_line = fields.Many2One('sale.line',"S. line")
|
||||
r_sale = fields.Many2One('sale.sale',"Sale")
|
||||
r_tot = fields.Numeric("Qt tot", digits='r_lot_unit_line')
|
||||
r_supplier = fields.Many2One('party.party',"Supplier")
|
||||
r_client = fields.Many2One('party.party',"Client")
|
||||
@@ -3041,25 +3050,26 @@ class LotWeighing(Wizard):
|
||||
Lot = Pool().get('lot.lot')
|
||||
context = Transaction().context
|
||||
ids = context.get('active_ids')
|
||||
for i in ids:
|
||||
if i > 10000000:
|
||||
raise UserError("Trying to do weighing on open quantity!")
|
||||
val = {}
|
||||
lot = Lot(i)
|
||||
val['lot'] = lot.id
|
||||
val['lot_name'] = lot.lot_name
|
||||
for i in ids:
|
||||
if i > 10000000:
|
||||
raise UserError("Trying to do weighing on open quantity!")
|
||||
val = {}
|
||||
lot = Lot(i)
|
||||
val['lot'] = lot.id
|
||||
val['lot_name'] = lot.lot_name
|
||||
if lot.lot_shipment_in:
|
||||
val['lot_shipment_in'] = lot.lot_shipment_in.id
|
||||
if lot.lot_shipment_internal:
|
||||
val['lot_shipment_internal'] = lot.lot_shipment_internal.id
|
||||
if lot.lot_shipment_out:
|
||||
val['lot_shipment_out'] = lot.lot_shipment_out.id
|
||||
val['lot_product'] = lot.lot_product.id
|
||||
val['lot_quantity'] = lot.lot_quantity
|
||||
val['lot_gross_quantity'] = lot.lot_gross_quantity
|
||||
val['lot_unit'] = lot.lot_unit.id
|
||||
val['lot_unit_line'] = lot.lot_unit_line.id
|
||||
lot_p.append(val)
|
||||
if lot.lot_shipment_out:
|
||||
val['lot_shipment_out'] = lot.lot_shipment_out.id
|
||||
val['lot_product'] = lot.lot_product.id
|
||||
val['lot_qt'] = lot.lot_qt
|
||||
val['lot_quantity'] = lot.lot_quantity
|
||||
val['lot_gross_quantity'] = lot.lot_gross_quantity
|
||||
val['lot_unit'] = lot.lot_unit.id
|
||||
val['lot_unit_line'] = lot.lot_unit_line.id
|
||||
lot_p.append(val)
|
||||
return {
|
||||
'lot_p': lot_p,
|
||||
}
|
||||
@@ -3074,17 +3084,18 @@ class LotWeighing(Wizard):
|
||||
lhs = LotHist.search([('lot',"=",l.lot.id),('quantity_type','=',self.w.lot_state.id)])
|
||||
if lhs:
|
||||
lh = lhs[0]
|
||||
else:
|
||||
lh = LotHist()
|
||||
lh.lot = l.lot
|
||||
lh.quantity_type = self.w.lot_state
|
||||
lh.quantity = round(l.lot_quantity_new,5)
|
||||
lh.gross_quantity = round(l.lot_gross_quantity_new,5)
|
||||
LotHist.save([lh])
|
||||
|
||||
if self.w.lot_update_state :
|
||||
l.lot.lot_state = self.w.lot_state
|
||||
Lot.save([l.lot])
|
||||
else:
|
||||
lh = LotHist()
|
||||
lh.lot = l.lot
|
||||
lh.quantity_type = self.w.lot_state
|
||||
lh.quantity = round(l.lot_quantity_new,5)
|
||||
lh.gross_quantity = round(l.lot_gross_quantity_new,5)
|
||||
LotHist.save([lh])
|
||||
l.lot.lot_qt = l.lot_qt
|
||||
|
||||
if self.w.lot_update_state :
|
||||
l.lot.lot_state = self.w.lot_state
|
||||
Lot.save([l.lot])
|
||||
diff = round(Decimal(l.lot.get_current_quantity_converted() - quantity),5)
|
||||
if diff != 0 :
|
||||
#need to update virtual part
|
||||
@@ -3119,12 +3130,13 @@ class LotWeighingLot(ModelView):
|
||||
lot_name = fields.Char("Name",readonly=True)
|
||||
lot_shipment_in = fields.Many2One('stock.shipment.in',"Shipment In")
|
||||
lot_shipment_internal = fields.Many2One('stock.shipment.internal',"Shipment Internal")
|
||||
lot_shipment_out = fields.Many2One('stock.shipment.out',"Shipment Out")
|
||||
lot_product = fields.Many2One('product.product',"Product",readonly=True)
|
||||
lot_quantity = fields.Numeric("Net weight",digits=(1,5),readonly=True)
|
||||
lot_gross_quantity = fields.Numeric("Gross weight",digits=(1,5),readonly=True)
|
||||
lot_unit = fields.Many2One('product.uom',"Unit",readonly=True)
|
||||
lot_unit_line = fields.Many2One('product.uom',"Unit",readonly=True)
|
||||
lot_shipment_out = fields.Many2One('stock.shipment.out',"Shipment Out")
|
||||
lot_product = fields.Many2One('product.product',"Product",readonly=True)
|
||||
lot_qt = fields.Integer("Qt")
|
||||
lot_quantity = fields.Numeric("Net weight",digits=(1,5),readonly=True)
|
||||
lot_gross_quantity = fields.Numeric("Gross weight",digits=(1,5),readonly=True)
|
||||
lot_unit = fields.Many2One('product.uom',"Unit",readonly=True)
|
||||
lot_unit_line = fields.Many2One('product.uom',"Unit",readonly=True)
|
||||
lot_quantity_new = fields.Numeric("New net weight",digits=(1,5))
|
||||
lot_gross_quantity_new = fields.Numeric("New gross weight",digits=(1,5))
|
||||
lot_shipment_origin = fields.Function(
|
||||
|
||||
@@ -325,20 +325,20 @@ class Component(ModelSQL, ModelView):
|
||||
|
||||
super(Component, cls).delete(components)
|
||||
|
||||
class Pricing(ModelSQL,ModelView):
|
||||
"Pricing"
|
||||
__name__ = 'pricing.pricing'
|
||||
|
||||
pricing_date = fields.Date("Date")
|
||||
price_component = fields.Many2One('pricing.component', "Component")#, domain=[('id', 'in', Eval('line.price_components'))], ondelete='CASCADE')
|
||||
quantity = fields.Numeric("Qt",digits='unit')
|
||||
settl_price = fields.Numeric("Settl. price",digits='unit')
|
||||
fixed_qt = fields.Numeric("Fixed qt",digits='unit',readonly=True)
|
||||
fixed_qt_price = fields.Numeric("Fixed qt price",digits='unit',readonly=True)
|
||||
unfixed_qt = fields.Numeric("Unfixed qt",digits='unit',readonly=True)
|
||||
unfixed_qt_price = fields.Numeric("Unfixed qt price",digits='unit',readonly=True)
|
||||
eod_price = fields.Numeric("EOD price",digits='unit',readonly=True)
|
||||
last = fields.Boolean("Last")
|
||||
class Pricing(ModelSQL,ModelView):
|
||||
"Pricing"
|
||||
__name__ = 'pricing.pricing'
|
||||
|
||||
pricing_date = fields.Date("Date")
|
||||
price_component = fields.Many2One('pricing.component', "Component")#, domain=[('id', 'in', Eval('line.price_components'))], ondelete='CASCADE')
|
||||
quantity = fields.Numeric("Qt",digits='unit')
|
||||
settl_price = fields.Numeric("Settl. price",digits='unit')
|
||||
fixed_qt = fields.Numeric("Fixed qt",digits='unit', readonly=True)
|
||||
fixed_qt_price = fields.Numeric("Fixed qt price",digits='unit', readonly=True)
|
||||
unfixed_qt = fields.Numeric("Unfixed qt",digits='unit', readonly=True)
|
||||
unfixed_qt_price = fields.Numeric("Unfixed qt price",digits='unit', readonly=True)
|
||||
eod_price = fields.Numeric("EOD price",digits='unit',readonly=True)
|
||||
last = fields.Boolean("Last")
|
||||
|
||||
@classmethod
|
||||
def default_fixed_qt(cls):
|
||||
@@ -364,24 +364,244 @@ class Pricing(ModelSQL,ModelView):
|
||||
def default_settl_price(cls):
|
||||
return Decimal(0)
|
||||
|
||||
@classmethod
|
||||
def default_eod_price(cls):
|
||||
return Decimal(0)
|
||||
|
||||
def get_fixed_price(self):
|
||||
price = Decimal(0)
|
||||
Pricing = Pool().get('pricing.pricing')
|
||||
pricings = Pricing.search(['price_component','=',self.price_component.id],order=[('pricing_date', 'ASC')])
|
||||
if pricings:
|
||||
cumul_qt = Decimal(0)
|
||||
cumul_qt_price = Decimal(0)
|
||||
for pr in pricings:
|
||||
cumul_qt += pr.quantity
|
||||
cumul_qt_price += pr.quantity * pr.settl_price
|
||||
if pr.id == self.id:
|
||||
break
|
||||
if cumul_qt > 0:
|
||||
price = cumul_qt_price / cumul_qt
|
||||
@classmethod
|
||||
def default_eod_price(cls):
|
||||
return Decimal(0)
|
||||
|
||||
@staticmethod
|
||||
def _weighted_average_price(fixed_qt, fixed_price, unfixed_qt, unfixed_price):
|
||||
fixed_qt = Decimal(str(fixed_qt or 0))
|
||||
fixed_price = Decimal(str(fixed_price or 0))
|
||||
unfixed_qt = Decimal(str(unfixed_qt or 0))
|
||||
unfixed_price = Decimal(str(unfixed_price or 0))
|
||||
total_qty = fixed_qt + unfixed_qt
|
||||
if total_qty == 0:
|
||||
return Decimal(0)
|
||||
return round(
|
||||
((fixed_qt * fixed_price) + (unfixed_qt * unfixed_price)) / total_qty,
|
||||
4,
|
||||
)
|
||||
|
||||
def compute_eod_price(self):
|
||||
if getattr(self, 'sale_line', None) and hasattr(self, 'get_eod_price_sale'):
|
||||
return self.get_eod_price_sale()
|
||||
if getattr(self, 'line', None) and hasattr(self, 'get_eod_price_purchase'):
|
||||
return self.get_eod_price_purchase()
|
||||
return self._weighted_average_price(
|
||||
self.fixed_qt,
|
||||
self.fixed_qt_price,
|
||||
self.unfixed_qt,
|
||||
self.unfixed_qt_price,
|
||||
)
|
||||
|
||||
@fields.depends('fixed_qt', 'fixed_qt_price', 'unfixed_qt', 'unfixed_qt_price')
|
||||
def on_change_fixed_qt(self):
|
||||
self.eod_price = self.compute_eod_price()
|
||||
|
||||
@fields.depends('fixed_qt', 'fixed_qt_price', 'unfixed_qt', 'unfixed_qt_price')
|
||||
def on_change_fixed_qt_price(self):
|
||||
self.eod_price = self.compute_eod_price()
|
||||
|
||||
@fields.depends('fixed_qt', 'fixed_qt_price', 'unfixed_qt', 'unfixed_qt_price')
|
||||
def on_change_unfixed_qt(self):
|
||||
self.eod_price = self.compute_eod_price()
|
||||
|
||||
@fields.depends('fixed_qt', 'fixed_qt_price', 'unfixed_qt', 'unfixed_qt_price')
|
||||
def on_change_unfixed_qt_price(self):
|
||||
self.eod_price = self.compute_eod_price()
|
||||
|
||||
@classmethod
|
||||
def create(cls, vlist):
|
||||
records = super(Pricing, cls).create(vlist)
|
||||
cls._sync_manual_values(records)
|
||||
cls._sync_manual_last(records)
|
||||
cls._sync_eod_price(records)
|
||||
return records
|
||||
|
||||
@classmethod
|
||||
def write(cls, *args):
|
||||
super(Pricing, cls).write(*args)
|
||||
if (Transaction().context.get('skip_pricing_eod_sync')
|
||||
or Transaction().context.get('skip_pricing_last_sync')):
|
||||
return
|
||||
records = []
|
||||
actions = iter(args)
|
||||
for record_set, values in zip(actions, actions):
|
||||
if values:
|
||||
records.extend(record_set)
|
||||
cls._sync_manual_values(records)
|
||||
cls._sync_manual_last(records)
|
||||
cls._sync_eod_price(records)
|
||||
|
||||
@classmethod
|
||||
def _sync_eod_price(cls, records):
|
||||
if not records:
|
||||
return
|
||||
with Transaction().set_context(skip_pricing_eod_sync=True):
|
||||
for record in records:
|
||||
eod_price = record.compute_eod_price()
|
||||
if Decimal(str(record.eod_price or 0)) == Decimal(str(eod_price or 0)):
|
||||
continue
|
||||
super(Pricing, cls).write([record], {
|
||||
'eod_price': eod_price,
|
||||
})
|
||||
|
||||
@classmethod
|
||||
def _is_manual_pricing_record(cls, record):
|
||||
component = getattr(record, 'price_component', None)
|
||||
if component is None:
|
||||
return True
|
||||
return not bool(getattr(component, 'auto', False))
|
||||
|
||||
@classmethod
|
||||
def _get_pricing_group_domain(cls, record):
|
||||
component = getattr(record, 'price_component', None)
|
||||
if getattr(record, 'sale_line', None):
|
||||
return [
|
||||
('sale_line', '=', record.sale_line.id),
|
||||
('price_component', '=',
|
||||
component.id if getattr(component, 'id', None) else None),
|
||||
]
|
||||
if getattr(record, 'line', None):
|
||||
return [
|
||||
('line', '=', record.line.id),
|
||||
('price_component', '=',
|
||||
component.id if getattr(component, 'id', None) else None),
|
||||
]
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
def _get_base_quantity(cls, record):
|
||||
owner = getattr(record, 'sale_line', None) or getattr(record, 'line', None)
|
||||
if not owner:
|
||||
return Decimal(0)
|
||||
if hasattr(owner, '_get_pricing_base_quantity'):
|
||||
return Decimal(str(owner._get_pricing_base_quantity() or 0))
|
||||
quantity = getattr(owner, 'quantity_theorical', None)
|
||||
if quantity is None:
|
||||
quantity = getattr(owner, 'quantity', None)
|
||||
return Decimal(str(quantity or 0))
|
||||
|
||||
@classmethod
|
||||
def _sync_manual_values(cls, records):
|
||||
if (not records
|
||||
or Transaction().context.get('skip_pricing_manual_sync')):
|
||||
return
|
||||
domains = []
|
||||
seen = set()
|
||||
for record in records:
|
||||
if not cls._is_manual_pricing_record(record):
|
||||
continue
|
||||
domain = cls._get_pricing_group_domain(record)
|
||||
if not domain:
|
||||
continue
|
||||
key = tuple(domain)
|
||||
if key in seen:
|
||||
continue
|
||||
seen.add(key)
|
||||
domains.append(domain)
|
||||
if not domains:
|
||||
return
|
||||
with Transaction().set_context(
|
||||
skip_pricing_manual_sync=True,
|
||||
skip_pricing_last_sync=True,
|
||||
skip_pricing_eod_sync=True):
|
||||
for domain in domains:
|
||||
pricings = cls.search(
|
||||
domain,
|
||||
order=[('pricing_date', 'ASC'), ('id', 'ASC')])
|
||||
if not pricings:
|
||||
continue
|
||||
base_quantity = cls._get_base_quantity(pricings[0])
|
||||
cumul_qt = Decimal(0)
|
||||
cumul_qt_price = Decimal(0)
|
||||
total = len(pricings)
|
||||
for index, pricing in enumerate(pricings):
|
||||
quantity = Decimal(str(pricing.quantity or 0))
|
||||
settl_price = Decimal(str(pricing.settl_price or 0))
|
||||
cumul_qt += quantity
|
||||
cumul_qt_price += quantity * settl_price
|
||||
fixed_qt = cumul_qt
|
||||
if fixed_qt > 0:
|
||||
fixed_qt_price = round(cumul_qt_price / fixed_qt, 4)
|
||||
else:
|
||||
fixed_qt_price = Decimal(0)
|
||||
unfixed_qt = base_quantity - fixed_qt
|
||||
if unfixed_qt < Decimal('0.001'):
|
||||
unfixed_qt = Decimal(0)
|
||||
fixed_qt = base_quantity
|
||||
values = {
|
||||
'fixed_qt': fixed_qt,
|
||||
'fixed_qt_price': fixed_qt_price,
|
||||
'unfixed_qt': unfixed_qt,
|
||||
'unfixed_qt_price': settl_price,
|
||||
'last': index == (total - 1),
|
||||
}
|
||||
eod_price = cls._weighted_average_price(
|
||||
values['fixed_qt'],
|
||||
values['fixed_qt_price'],
|
||||
values['unfixed_qt'],
|
||||
values['unfixed_qt_price'],
|
||||
)
|
||||
values['eod_price'] = eod_price
|
||||
super(Pricing, cls).write([pricing], values)
|
||||
|
||||
@classmethod
|
||||
def _get_manual_last_group_domain(cls, record):
|
||||
return cls._get_pricing_group_domain(record)
|
||||
|
||||
@classmethod
|
||||
def _sync_manual_last(cls, records):
|
||||
if not records:
|
||||
return
|
||||
domains = []
|
||||
seen = set()
|
||||
for record in records:
|
||||
domain = cls._get_manual_last_group_domain(record)
|
||||
if not domain:
|
||||
continue
|
||||
key = tuple(domain)
|
||||
if key in seen:
|
||||
continue
|
||||
seen.add(key)
|
||||
domains.append(domain)
|
||||
if not domains:
|
||||
return
|
||||
with Transaction().set_context(
|
||||
skip_pricing_last_sync=True,
|
||||
skip_pricing_eod_sync=True):
|
||||
for domain in domains:
|
||||
pricings = cls.search(
|
||||
domain,
|
||||
order=[('pricing_date', 'ASC'), ('id', 'ASC')])
|
||||
if not pricings:
|
||||
continue
|
||||
last_pricing = pricings[-1]
|
||||
for pricing in pricings[:-1]:
|
||||
if pricing.last:
|
||||
super(Pricing, cls).write([pricing], {'last': False})
|
||||
if not last_pricing.last:
|
||||
super(Pricing, cls).write([last_pricing], {'last': True})
|
||||
|
||||
def get_fixed_price(self):
|
||||
price = Decimal(0)
|
||||
Pricing = Pool().get('pricing.pricing')
|
||||
domain = self._get_pricing_group_domain(self)
|
||||
if not domain:
|
||||
return price
|
||||
pricings = Pricing.search(domain, order=[('pricing_date', 'ASC'), ('id', 'ASC')])
|
||||
if pricings:
|
||||
cumul_qt = Decimal(0)
|
||||
cumul_qt_price = Decimal(0)
|
||||
for pr in pricings:
|
||||
quantity = Decimal(str(pr.quantity or 0))
|
||||
settl_price = Decimal(str(pr.settl_price or 0))
|
||||
cumul_qt += quantity
|
||||
cumul_qt_price += quantity * settl_price
|
||||
if pr.id == self.id:
|
||||
break
|
||||
if cumul_qt > 0:
|
||||
price = cumul_qt_price / cumul_qt
|
||||
return round(price,4)
|
||||
|
||||
|
||||
|
||||
@@ -139,10 +139,14 @@ class Component(metaclass=PoolMeta):
|
||||
if self.line:
|
||||
return self.line.unit
|
||||
|
||||
def get_quota_purchase(self, name):
|
||||
if self.line:
|
||||
if self.line.quantity:
|
||||
return round(self.line.quantity_theorical / (self.nbdays if self.nbdays > 0 else 1),5)
|
||||
def get_quota_purchase(self, name):
|
||||
if self.line:
|
||||
quantity = getattr(self.line, 'quantity_theorical', None)
|
||||
if quantity is None:
|
||||
quantity = getattr(self.line, 'quantity', None)
|
||||
if quantity is not None:
|
||||
nbdays = self.nbdays if self.nbdays and self.nbdays > 0 else 1
|
||||
return round(Decimal(quantity) / nbdays, 5)
|
||||
|
||||
class Pricing(metaclass=PoolMeta):
|
||||
"Pricing"
|
||||
@@ -151,14 +155,17 @@ class Pricing(metaclass=PoolMeta):
|
||||
line = fields.Many2One('purchase.line',"Lines")
|
||||
unit = fields.Function(fields.Many2One('product.uom',"Unit"),'get_unit_purchase')
|
||||
|
||||
def get_unit_purchase(self,name):
|
||||
if self.line:
|
||||
return self.line.unit
|
||||
|
||||
def get_eod_price_purchase(self):
|
||||
if self.line:
|
||||
return round((self.fixed_qt * self.fixed_qt_price + self.unfixed_qt * self.unfixed_qt_price)/Decimal(self.line.quantity_theorical),4)
|
||||
return Decimal(0)
|
||||
def get_unit_purchase(self,name):
|
||||
if self.line:
|
||||
return self.line.unit
|
||||
|
||||
def get_eod_price_purchase(self):
|
||||
return self._weighted_average_price(
|
||||
self.fixed_qt,
|
||||
self.fixed_qt_price,
|
||||
self.unfixed_qt,
|
||||
self.unfixed_qt_price,
|
||||
)
|
||||
|
||||
class Summary(ModelSQL,ModelView):
|
||||
"Pricing summary"
|
||||
@@ -289,8 +296,12 @@ class Purchase(metaclass=PoolMeta):
|
||||
'purchase',
|
||||
'Analytic Dimensions'
|
||||
)
|
||||
trader = fields.Many2One('party.party',"Trader")
|
||||
operator = fields.Many2One('party.party',"Operator")
|
||||
trader = fields.Many2One(
|
||||
'party.party', "Trader",
|
||||
domain=[('categories.name', '=', 'TRADER')])
|
||||
operator = fields.Many2One(
|
||||
'party.party', "Operator",
|
||||
domain=[('categories.name', '=', 'OPERATOR')])
|
||||
our_reference = fields.Char("Our Reference")
|
||||
company_visible = fields.Function(
|
||||
fields.Boolean("Visible"), 'on_change_with_company_visible')
|
||||
@@ -1229,11 +1240,15 @@ class Line(metaclass=PoolMeta):
|
||||
if self.tol_max and self.quantity_theorical:
|
||||
return round((1+(self.tol_max/100))*Decimal(self.quantity_theorical),3)
|
||||
|
||||
def get_progress(self,name):
|
||||
PS = Pool().get('purchase.pricing.summary')
|
||||
ps = PS.search(['line','=',self.id])
|
||||
if ps:
|
||||
return sum((e.progress if e.progress else 0) * (e.ratio if e.ratio else 0) / 100 for e in ps)
|
||||
def get_progress(self,name):
|
||||
PS = Pool().get('purchase.pricing.summary')
|
||||
ps = PS.search(['line','=',self.id])
|
||||
if ps:
|
||||
if not self.price_components:
|
||||
manual = [e for e in ps if not e.price_component]
|
||||
if manual:
|
||||
return manual[0].progress or 0
|
||||
return sum((e.progress if e.progress else 0) * (e.ratio if e.ratio else 0) / 100 for e in ps)
|
||||
|
||||
def getVirtualLot(self):
|
||||
if self.lots:
|
||||
@@ -1285,8 +1300,16 @@ class Line(metaclass=PoolMeta):
|
||||
for t in self.terms:
|
||||
price += (t.manual_price if t.manual_price else Decimal(0))
|
||||
else:
|
||||
for pc in self.price_components:
|
||||
PP = Pool().get('purchase.pricing.summary')
|
||||
if not self.price_components:
|
||||
PP = Pool().get('purchase.pricing.summary')
|
||||
pp = PP.search([
|
||||
('line', '=', self.id),
|
||||
('price_component', '=', None),
|
||||
], limit=1)
|
||||
if pp:
|
||||
return round(Decimal(pp[0].price or 0), 4)
|
||||
for pc in self.price_components:
|
||||
PP = Pool().get('purchase.pricing.summary')
|
||||
pp = PP.search([('price_component','=',pc.id),('line','=',self.id)])
|
||||
if pp:
|
||||
price += pp[0].price * (pc.ratio / 100)
|
||||
@@ -1623,23 +1646,13 @@ class Line(metaclass=PoolMeta):
|
||||
|
||||
if self.price_components:
|
||||
for pc in self.price_components:
|
||||
if not pc.auto:
|
||||
Pricing = Pool().get('pricing.pricing')
|
||||
pricings = Pricing.search(['price_component','=',pc.id],order=[('pricing_date', 'ASC')])
|
||||
if pricings:
|
||||
cumul_qt = Decimal(0)
|
||||
index = 0
|
||||
for pr in pricings:
|
||||
cumul_qt += pr.quantity
|
||||
pr.fixed_qt = cumul_qt
|
||||
pr.fixed_qt_price = pr.get_fixed_price()
|
||||
pr.unfixed_qt = Decimal(pr.line.quantity_theorical) - pr.fixed_qt
|
||||
pr.unfixed_qt_price = pr.fixed_qt_price
|
||||
pr.eod_price = pr.get_eod_price_purchase()
|
||||
if index == len(pricings) - 1:
|
||||
pr.last = True
|
||||
index += 1
|
||||
Pricing.save([pr])
|
||||
if not pc.auto:
|
||||
Pricing = Pool().get('pricing.pricing')
|
||||
pricings = Pricing.search(['price_component','=',pc.id],order=[('pricing_date', 'ASC')])
|
||||
if pricings:
|
||||
Pricing._sync_manual_values(pricings)
|
||||
Pricing._sync_manual_last(pricings)
|
||||
Pricing._sync_eod_price(pricings)
|
||||
|
||||
if pc.triggers and pc.auto:
|
||||
prDate = []
|
||||
@@ -1670,9 +1683,9 @@ class Line(metaclass=PoolMeta):
|
||||
i += 1
|
||||
return lprice
|
||||
|
||||
def getnearprice(self,pl,d,t,max_date=None):
|
||||
if pl:
|
||||
pl_sorted = sorted(pl, key=lambda x: x['date'])
|
||||
def getnearprice(self,pl,d,t,max_date=None):
|
||||
if pl:
|
||||
pl_sorted = sorted(pl, key=lambda x: x['date'])
|
||||
pminus = pl_sorted[0]
|
||||
if not max_date:
|
||||
max_date = d.date()
|
||||
@@ -1687,17 +1700,24 @@ class Line(metaclass=PoolMeta):
|
||||
return pminus[t]
|
||||
else:
|
||||
return Decimal(0)
|
||||
pminus = p
|
||||
return pl_sorted[len(pl)-1][t]
|
||||
return Decimal(0)
|
||||
|
||||
def generate_pricing(self,pc,dl,pl):
|
||||
Pricing = Pool().get('pricing.pricing')
|
||||
pricing = Pricing.search(['price_component','=',pc.id])
|
||||
if pricing:
|
||||
Pricing.delete(pricing)
|
||||
cumul_qt = 0
|
||||
index = 0
|
||||
pminus = p
|
||||
return pl_sorted[len(pl)-1][t]
|
||||
return Decimal(0)
|
||||
|
||||
def _get_pricing_base_quantity(self):
|
||||
quantity = self.quantity_theorical
|
||||
if quantity is None:
|
||||
quantity = self.quantity
|
||||
return Decimal(str(quantity or 0))
|
||||
|
||||
def generate_pricing(self,pc,dl,pl):
|
||||
Pricing = Pool().get('pricing.pricing')
|
||||
pricing = Pricing.search(['price_component','=',pc.id])
|
||||
if pricing:
|
||||
Pricing.delete(pricing)
|
||||
base_quantity = self._get_pricing_base_quantity()
|
||||
cumul_qt = 0
|
||||
index = 0
|
||||
dl_sorted = sorted(dl)
|
||||
for d in dl_sorted:
|
||||
if pc.pricing_date and d.date() > pc.pricing_date:
|
||||
@@ -1712,16 +1732,16 @@ class Line(metaclass=PoolMeta):
|
||||
if price > 0:
|
||||
cumul_qt += pc.quota
|
||||
p.fixed_qt = round(Decimal(cumul_qt),5)
|
||||
p.fixed_qt_price = round(Decimal(self.getnearprice(pl,d,'avg')),4)
|
||||
#p.fixed_qt_price = p.get_fixed_price()
|
||||
if p.fixed_qt_price == 0:
|
||||
p.fixed_qt_price = round(Decimal(self.getnearprice(pl,d,'avg_minus_1')),4)
|
||||
p.unfixed_qt = round(Decimal(self.quantity_theorical) - Decimal(cumul_qt),5)
|
||||
if p.unfixed_qt < 0.001:
|
||||
p.unfixed_qt = Decimal(0)
|
||||
p.fixed_qt = Decimal(self.quantity_theorical)
|
||||
if price > 0:
|
||||
p.unfixed_qt_price = price
|
||||
p.fixed_qt_price = round(Decimal(self.getnearprice(pl,d,'avg')),4)
|
||||
#p.fixed_qt_price = p.get_fixed_price()
|
||||
if p.fixed_qt_price == 0:
|
||||
p.fixed_qt_price = round(Decimal(self.getnearprice(pl,d,'avg_minus_1')),4)
|
||||
p.unfixed_qt = round(base_quantity - Decimal(cumul_qt),5)
|
||||
if p.unfixed_qt < 0.001:
|
||||
p.unfixed_qt = Decimal(0)
|
||||
p.fixed_qt = base_quantity
|
||||
if price > 0:
|
||||
p.unfixed_qt_price = price
|
||||
else:
|
||||
pr = Decimal(pc.price_index.get_price(p.pricing_date,self.unit,self.purchase.currency,True))
|
||||
pr = round(pr,4)
|
||||
|
||||
@@ -103,10 +103,14 @@ class Component(metaclass=PoolMeta):
|
||||
if self.sale_line:
|
||||
return self.sale_line.unit
|
||||
|
||||
def get_quota_sale(self, name):
|
||||
if self.sale_line:
|
||||
if self.sale_line.quantity:
|
||||
return round(self.sale_line.quantity_theorical / (self.nbdays if self.nbdays > 0 else 1),4)
|
||||
def get_quota_sale(self, name):
|
||||
if self.sale_line:
|
||||
quantity = getattr(self.sale_line, 'quantity_theorical', None)
|
||||
if quantity is None:
|
||||
quantity = getattr(self.sale_line, 'quantity', None)
|
||||
if quantity is not None:
|
||||
nbdays = self.nbdays if self.nbdays and self.nbdays > 0 else 1
|
||||
return round(Decimal(quantity) / nbdays, 4)
|
||||
|
||||
class Pricing(metaclass=PoolMeta):
|
||||
"Pricing"
|
||||
@@ -115,14 +119,17 @@ class Pricing(metaclass=PoolMeta):
|
||||
sale_line = fields.Many2One('sale.line',"Lines")
|
||||
unit = fields.Function(fields.Many2One('product.uom',"Unit"),'get_unit_sale')
|
||||
|
||||
def get_unit_sale(self,name):
|
||||
if self.sale_line:
|
||||
return self.sale_line.unit
|
||||
|
||||
def get_eod_price_sale(self):
|
||||
if self.sale_line:
|
||||
return round((self.fixed_qt * self.fixed_qt_price + self.unfixed_qt * self.unfixed_qt_price)/Decimal(self.sale_line.quantity),4)
|
||||
return Decimal(0)
|
||||
def get_unit_sale(self,name):
|
||||
if self.sale_line:
|
||||
return self.sale_line.unit
|
||||
|
||||
def get_eod_price_sale(self):
|
||||
return self._weighted_average_price(
|
||||
self.fixed_qt,
|
||||
self.fixed_qt_price,
|
||||
self.unfixed_qt,
|
||||
self.unfixed_qt_price,
|
||||
)
|
||||
|
||||
class Summary(ModelSQL,ModelView):
|
||||
"Pricing summary"
|
||||
@@ -253,8 +260,12 @@ class Sale(metaclass=PoolMeta):
|
||||
'sale',
|
||||
'Analytic Dimensions'
|
||||
)
|
||||
trader = fields.Many2One('party.party',"Trader")
|
||||
operator = fields.Many2One('party.party',"Operator")
|
||||
trader = fields.Many2One(
|
||||
'party.party', "Trader",
|
||||
domain=[('categories.name', '=', 'TRADER')])
|
||||
operator = fields.Many2One(
|
||||
'party.party', "Operator",
|
||||
domain=[('categories.name', '=', 'OPERATOR')])
|
||||
our_reference = fields.Char("Our Reference")
|
||||
company_visible = fields.Function(
|
||||
fields.Boolean("Visible"), 'on_change_with_company_visible')
|
||||
@@ -395,65 +406,198 @@ class Sale(metaclass=PoolMeta):
|
||||
if line:
|
||||
return line.note
|
||||
return ''
|
||||
|
||||
@staticmethod
|
||||
def _get_report_line_lots(line):
|
||||
return list(getattr(line, 'lots', []) or [])
|
||||
|
||||
@classmethod
|
||||
def _get_report_preferred_lots(cls, line):
|
||||
lots = cls._get_report_line_lots(line)
|
||||
physicals = [
|
||||
lot for lot in lots
|
||||
if getattr(lot, 'lot_type', None) == 'physic'
|
||||
]
|
||||
if physicals:
|
||||
return physicals
|
||||
virtuals = [
|
||||
lot for lot in lots
|
||||
if getattr(lot, 'lot_type', None) == 'virtual'
|
||||
]
|
||||
if len(virtuals) == 1:
|
||||
return virtuals
|
||||
return []
|
||||
|
||||
@staticmethod
|
||||
def _get_report_lot_hist_weights(lot):
|
||||
if not lot:
|
||||
return None, None
|
||||
if hasattr(lot, 'get_hist_quantity'):
|
||||
net, gross = lot.get_hist_quantity()
|
||||
return (
|
||||
Decimal(str(net or 0)),
|
||||
Decimal(str(gross if gross not in (None, '') else net or 0)),
|
||||
)
|
||||
hist = list(getattr(lot, 'lot_hist', []) or [])
|
||||
state = getattr(lot, 'lot_state', None)
|
||||
state_id = getattr(state, 'id', None)
|
||||
if state_id is not None:
|
||||
for entry in hist:
|
||||
quantity_type = getattr(entry, 'quantity_type', None)
|
||||
if getattr(quantity_type, 'id', None) == state_id:
|
||||
net = Decimal(str(getattr(entry, 'quantity', 0) or 0))
|
||||
gross = Decimal(str(
|
||||
getattr(entry, 'gross_quantity', None)
|
||||
if getattr(entry, 'gross_quantity', None) not in (None, '')
|
||||
else net))
|
||||
return net, gross
|
||||
return None, None
|
||||
|
||||
@classmethod
|
||||
def _get_report_line_weights(cls, line):
|
||||
lots = cls._get_report_preferred_lots(line)
|
||||
if lots:
|
||||
net_total = Decimal(0)
|
||||
gross_total = Decimal(0)
|
||||
for lot in lots:
|
||||
net, gross = cls._get_report_lot_hist_weights(lot)
|
||||
if net is None:
|
||||
continue
|
||||
net_total += net
|
||||
gross_total += gross
|
||||
if net_total or gross_total:
|
||||
return net_total, gross_total
|
||||
quantity = Decimal(str(getattr(line, 'quantity', 0) or 0))
|
||||
return quantity, quantity
|
||||
|
||||
@classmethod
|
||||
def _get_report_line_unit(cls, line):
|
||||
lots = cls._get_report_preferred_lots(line)
|
||||
if lots and getattr(lots[0], 'lot_unit_line', None):
|
||||
return lots[0].lot_unit_line
|
||||
return getattr(line, 'unit', None)
|
||||
|
||||
def _get_report_total_unit(self):
|
||||
virtual_units = []
|
||||
for line in self._get_report_lines():
|
||||
for lot in self._get_report_line_lots(line):
|
||||
if (
|
||||
getattr(lot, 'lot_type', None) == 'virtual'
|
||||
and getattr(lot, 'lot_unit_line', None)):
|
||||
virtual_units.append(lot.lot_unit_line)
|
||||
if len(virtual_units) == 1:
|
||||
return virtual_units[0]
|
||||
line = self._get_report_first_line()
|
||||
if line:
|
||||
return self._get_report_line_unit(line)
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def _get_report_unit_wording(unit):
|
||||
label = ''
|
||||
for attr in ('symbol', 'rec_name', 'name'):
|
||||
value = getattr(unit, attr, None)
|
||||
if value:
|
||||
label = str(value).strip().upper()
|
||||
break
|
||||
mapping = {
|
||||
'MT': ('METRIC TON', 'METRIC TONS'),
|
||||
'METRIC TON': ('METRIC TON', 'METRIC TONS'),
|
||||
'METRIC TONS': ('METRIC TON', 'METRIC TONS'),
|
||||
'KG': ('KILOGRAM', 'KILOGRAMS'),
|
||||
'KGS': ('KILOGRAM', 'KILOGRAMS'),
|
||||
'KILOGRAM': ('KILOGRAM', 'KILOGRAMS'),
|
||||
'KILOGRAMS': ('KILOGRAM', 'KILOGRAMS'),
|
||||
'LB': ('POUND', 'POUNDS'),
|
||||
'LBS': ('POUND', 'POUNDS'),
|
||||
'POUND': ('POUND', 'POUNDS'),
|
||||
'POUNDS': ('POUND', 'POUNDS'),
|
||||
'BALE': ('BALE', 'BALES'),
|
||||
'BALES': ('BALE', 'BALES'),
|
||||
}
|
||||
if label in mapping:
|
||||
return mapping[label]
|
||||
if label.endswith('S') and len(label) > 1:
|
||||
return label[:-1], label
|
||||
return label, label
|
||||
|
||||
@classmethod
|
||||
def _report_quantity_to_words(cls, quantity, unit):
|
||||
singular, plural = cls._get_report_unit_wording(unit)
|
||||
return quantity_to_words(
|
||||
quantity,
|
||||
unit_singular=singular,
|
||||
unit_plural=plural,
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def _convert_report_quantity(quantity, from_unit, to_unit):
|
||||
value = Decimal(str(quantity or 0))
|
||||
if not from_unit or not to_unit:
|
||||
return value
|
||||
if getattr(from_unit, 'id', None) == getattr(to_unit, 'id', None):
|
||||
return value
|
||||
from_name = getattr(from_unit, 'rec_name', None)
|
||||
to_name = getattr(to_unit, 'rec_name', None)
|
||||
if from_name and to_name and from_name == to_name:
|
||||
return value
|
||||
Uom = Pool().get('product.uom')
|
||||
converted = Uom.compute_qty(from_unit, float(value), to_unit) or 0
|
||||
return Decimal(str(converted))
|
||||
|
||||
def _get_report_total_weight(self, index):
|
||||
lines = self._get_report_lines()
|
||||
if not lines:
|
||||
return None
|
||||
total_unit = self._get_report_total_unit()
|
||||
total = Decimal(0)
|
||||
for line in lines:
|
||||
quantity = self._get_report_line_weights(line)[index]
|
||||
total += self._convert_report_quantity(
|
||||
quantity,
|
||||
self._get_report_line_unit(line),
|
||||
total_unit,
|
||||
)
|
||||
return total
|
||||
|
||||
@property
|
||||
def report_gross(self):
|
||||
lines = self._get_report_lines()
|
||||
if lines:
|
||||
total = Decimal(0)
|
||||
for line in lines:
|
||||
phys_lots = [l for l in line.lots if l.lot_type == 'physic']
|
||||
if phys_lots:
|
||||
total += sum(Decimal(str(l.get_current_gross_quantity() or 0))
|
||||
for l in phys_lots)
|
||||
else:
|
||||
total += Decimal(str(line.quantity or 0))
|
||||
total = self._get_report_total_weight(1)
|
||||
if total is not None:
|
||||
return total
|
||||
return ''
|
||||
|
||||
@property
|
||||
def report_net(self):
|
||||
lines = self._get_report_lines()
|
||||
if lines:
|
||||
total = Decimal(0)
|
||||
for line in lines:
|
||||
phys_lots = [l for l in line.lots if l.lot_type == 'physic']
|
||||
if phys_lots:
|
||||
total += sum(Decimal(str(l.get_current_quantity() or 0))
|
||||
for l in phys_lots)
|
||||
else:
|
||||
total += Decimal(str(line.quantity or 0))
|
||||
total = self._get_report_total_weight(0)
|
||||
if total is not None:
|
||||
return total
|
||||
return ''
|
||||
|
||||
@property
|
||||
def report_total_quantity(self):
|
||||
lines = self._get_report_lines()
|
||||
if lines:
|
||||
total = sum(Decimal(str(line.quantity or 0)) for line in lines)
|
||||
total = self._get_report_total_weight(0)
|
||||
if total is not None:
|
||||
return self._format_report_number(total, keep_trailing_decimal=True)
|
||||
return '0.0'
|
||||
|
||||
@property
|
||||
def report_quantity_unit_upper(self):
|
||||
line = self._get_report_first_line()
|
||||
if line and line.unit:
|
||||
return line.unit.rec_name.upper()
|
||||
unit = self._get_report_line_unit(line) if line else None
|
||||
if unit and unit.rec_name:
|
||||
return unit.rec_name.upper()
|
||||
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))
|
||||
return self._get_report_line_weights(line)[0]
|
||||
|
||||
@property
|
||||
def report_qt(self):
|
||||
lines = self._get_report_lines()
|
||||
if lines:
|
||||
total = sum(self._get_report_line_quantity(line) for line in lines)
|
||||
return quantity_to_words(total)
|
||||
total = self._get_report_total_weight(0)
|
||||
if total is not None:
|
||||
return self._report_quantity_to_words(
|
||||
total, self._get_report_total_unit())
|
||||
return ''
|
||||
|
||||
@property
|
||||
@@ -466,8 +610,12 @@ class Sale(metaclass=PoolMeta):
|
||||
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)
|
||||
line_unit = self._get_report_line_unit(line)
|
||||
unit = (
|
||||
line_unit.rec_name.upper()
|
||||
if line_unit and line_unit.rec_name else ''
|
||||
)
|
||||
words = self._report_quantity_to_words(current_quantity, line_unit)
|
||||
period = line.del_period.description if getattr(line, 'del_period', None) else ''
|
||||
detail = ' '.join(
|
||||
part for part in [
|
||||
@@ -554,8 +702,12 @@ class Sale(metaclass=PoolMeta):
|
||||
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)
|
||||
line_unit = self._get_report_line_unit(line)
|
||||
unit = (
|
||||
line_unit.rec_name.upper()
|
||||
if line_unit and line_unit.rec_name else ''
|
||||
)
|
||||
words = self._report_quantity_to_words(current_quantity, line_unit)
|
||||
period = line.del_period.description if getattr(line, 'del_period', None) else ''
|
||||
quantity_line = ' '.join(
|
||||
part for part in [
|
||||
@@ -598,7 +750,7 @@ class Sale(metaclass=PoolMeta):
|
||||
return '\n'.join(periods)
|
||||
return ''
|
||||
|
||||
@property
|
||||
@property
|
||||
def report_payment_date(self):
|
||||
line = self._get_report_first_line()
|
||||
if line:
|
||||
@@ -609,6 +761,51 @@ class Sale(metaclass=PoolMeta):
|
||||
if payment_date:
|
||||
payment_date = format_date_en(payment_date)
|
||||
return payment_date
|
||||
|
||||
def _get_report_bill_amount(self):
|
||||
invoices = [
|
||||
invoice for invoice in (self.invoices or [])
|
||||
if getattr(invoice, 'state', None) != 'cancelled'
|
||||
]
|
||||
if invoices:
|
||||
invoice = sorted(
|
||||
invoices,
|
||||
key=lambda i: (
|
||||
getattr(i, 'invoice_date', None) or datetime.date.min,
|
||||
getattr(i, 'id', 0)))[0]
|
||||
return Decimal(str(getattr(invoice, 'total_amount', 0) or 0))
|
||||
return Decimal(str(self.total_amount or 0))
|
||||
|
||||
@property
|
||||
def report_bill_amount(self):
|
||||
return self._get_report_bill_amount()
|
||||
|
||||
@property
|
||||
def report_bill_amount_words(self):
|
||||
value = self._get_report_bill_amount()
|
||||
if self.currency and (self.currency.rec_name or '').upper() == 'USC':
|
||||
return amount_to_currency_words(value, 'USC', 'USC')
|
||||
return amount_to_currency_words(value)
|
||||
|
||||
@property
|
||||
def report_bill_maturity_date(self):
|
||||
maturity_dates = []
|
||||
for invoice in (self.invoices or []):
|
||||
if getattr(invoice, 'state', None) == 'cancelled':
|
||||
continue
|
||||
for line in (invoice.lines_to_pay or []):
|
||||
if getattr(line, 'maturity_date', None):
|
||||
maturity_dates.append(line.maturity_date)
|
||||
if maturity_dates:
|
||||
return min(maturity_dates)
|
||||
|
||||
if self.lc_date:
|
||||
return self.lc_date
|
||||
|
||||
line = self._get_report_first_line()
|
||||
if line and self.payment_term and self.payment_term.lines:
|
||||
Date = Pool().get('ir.date')
|
||||
return self.payment_term.lines[0].get_date(Date.today(), line)
|
||||
|
||||
@property
|
||||
def report_shipment(self):
|
||||
@@ -970,11 +1167,15 @@ class SaleLine(metaclass=PoolMeta):
|
||||
if self.tol_max and self.quantity_theorical:
|
||||
return round((1+(self.tol_max/100))*Decimal(self.quantity_theorical),3)
|
||||
|
||||
def get_progress(self,name):
|
||||
PS = Pool().get('sale.pricing.summary')
|
||||
ps = PS.search(['sale_line','=',self.id])
|
||||
if ps:
|
||||
return sum((e.progress if e.progress else 0) * (e.ratio if e.ratio else 0) / 100 for e in ps)
|
||||
def get_progress(self,name):
|
||||
PS = Pool().get('sale.pricing.summary')
|
||||
ps = PS.search(['sale_line','=',self.id])
|
||||
if ps:
|
||||
if not self.price_components:
|
||||
manual = [e for e in ps if not e.price_component]
|
||||
if manual:
|
||||
return manual[0].progress or 0
|
||||
return sum((e.progress if e.progress else 0) * (e.ratio if e.ratio else 0) / 100 for e in ps)
|
||||
|
||||
def getVirtualLot(self):
|
||||
if self.lots:
|
||||
@@ -1028,6 +1229,14 @@ class SaleLine(metaclass=PoolMeta):
|
||||
|
||||
def _get_basis_component_price(self):
|
||||
price = Decimal(0)
|
||||
if not self.price_components:
|
||||
PP = Pool().get('sale.pricing.summary')
|
||||
pp = PP.search([
|
||||
('sale_line', '=', self.id),
|
||||
('price_component', '=', None),
|
||||
], limit=1)
|
||||
if pp:
|
||||
return round(Decimal(pp[0].price or 0), 4)
|
||||
for pc in self.price_components:
|
||||
PP = Pool().get('sale.pricing.summary')
|
||||
pp = PP.search([('price_component','=',pc.id),('sale_line','=',self.id)])
|
||||
@@ -1131,23 +1340,13 @@ class SaleLine(metaclass=PoolMeta):
|
||||
def check_pricing(self):
|
||||
if self.price_components:
|
||||
for pc in self.price_components:
|
||||
if not pc.auto:
|
||||
Pricing = Pool().get('pricing.pricing')
|
||||
pricings = Pricing.search(['price_component','=',pc.id],order=[('pricing_date', 'ASC')])
|
||||
if pricings:
|
||||
cumul_qt = Decimal(0)
|
||||
index = 0
|
||||
for pr in pricings:
|
||||
cumul_qt += pr.quantity
|
||||
pr.fixed_qt = cumul_qt
|
||||
pr.fixed_qt_price = pr.get_fixed_price()
|
||||
pr.unfixed_qt = Decimal(pr.sale_line.quantity_theorical) - pr.fixed_qt
|
||||
pr.unfixed_qt_price = pr.fixed_qt_price
|
||||
pr.eod_price = pr.get_eod_price_sale()
|
||||
if index == len(pricings) - 1:
|
||||
pr.last = True
|
||||
index += 1
|
||||
Pricing.save([pr])
|
||||
if not pc.auto:
|
||||
Pricing = Pool().get('pricing.pricing')
|
||||
pricings = Pricing.search(['price_component','=',pc.id],order=[('pricing_date', 'ASC')])
|
||||
if pricings:
|
||||
Pricing._sync_manual_values(pricings)
|
||||
Pricing._sync_manual_last(pricings)
|
||||
Pricing._sync_eod_price(pricings)
|
||||
|
||||
if pc.triggers and pc.auto:
|
||||
prDate = []
|
||||
@@ -1178,9 +1377,9 @@ class SaleLine(metaclass=PoolMeta):
|
||||
i += 1
|
||||
return lprice
|
||||
|
||||
def getnearprice(self,pl,d,t,max_date=None):
|
||||
if pl:
|
||||
pl_sorted = sorted(pl, key=lambda x: x['date'])
|
||||
def getnearprice(self,pl,d,t,max_date=None):
|
||||
if pl:
|
||||
pl_sorted = sorted(pl, key=lambda x: x['date'])
|
||||
pminus = pl_sorted[0]
|
||||
if not max_date:
|
||||
max_date = d.date()
|
||||
@@ -1195,17 +1394,24 @@ class SaleLine(metaclass=PoolMeta):
|
||||
return pminus[t]
|
||||
else:
|
||||
return Decimal(0)
|
||||
pminus = p
|
||||
return pl_sorted[len(pl)-1][t]
|
||||
return Decimal(0)
|
||||
|
||||
def generate_pricing(self,pc,dl,pl):
|
||||
Pricing = Pool().get('pricing.pricing')
|
||||
pricing = Pricing.search(['price_component','=',pc.id])
|
||||
if pricing:
|
||||
Pricing.delete(pricing)
|
||||
cumul_qt = 0
|
||||
index = 0
|
||||
pminus = p
|
||||
return pl_sorted[len(pl)-1][t]
|
||||
return Decimal(0)
|
||||
|
||||
def _get_pricing_base_quantity(self):
|
||||
quantity = self.quantity_theorical
|
||||
if quantity is None:
|
||||
quantity = self.quantity
|
||||
return Decimal(str(quantity or 0))
|
||||
|
||||
def generate_pricing(self,pc,dl,pl):
|
||||
Pricing = Pool().get('pricing.pricing')
|
||||
pricing = Pricing.search(['price_component','=',pc.id])
|
||||
if pricing:
|
||||
Pricing.delete(pricing)
|
||||
base_quantity = self._get_pricing_base_quantity()
|
||||
cumul_qt = 0
|
||||
index = 0
|
||||
dl_sorted = sorted(dl)
|
||||
for d in dl_sorted:
|
||||
if pc.pricing_date and d.date() > pc.pricing_date:
|
||||
@@ -1222,17 +1428,17 @@ class SaleLine(metaclass=PoolMeta):
|
||||
if price > 0:
|
||||
cumul_qt += pc.quota_sale
|
||||
p.fixed_qt = round(Decimal(cumul_qt),4)
|
||||
p.fixed_qt_price = round(Decimal(self.getnearprice(pl,d,'avg',pc.pricing_date)),4)
|
||||
#p.fixed_qt_price = p.get_fixed_price()
|
||||
if p.fixed_qt_price == 0:
|
||||
p.fixed_qt_price = round(Decimal(self.getnearprice(pl,d,'avg_minus_1',pc.pricing_date)),4)
|
||||
p.unfixed_qt = round(Decimal(self.quantity_theorical) - Decimal(cumul_qt),4)
|
||||
if p.unfixed_qt < 0.001:
|
||||
p.unfixed_qt = Decimal(0)
|
||||
p.fixed_qt = Decimal(self.quantity_theorical)
|
||||
if price > 0:
|
||||
logger.info("GENERATE_1:%s",price)
|
||||
p.unfixed_qt_price = price
|
||||
p.fixed_qt_price = round(Decimal(self.getnearprice(pl,d,'avg',pc.pricing_date)),4)
|
||||
#p.fixed_qt_price = p.get_fixed_price()
|
||||
if p.fixed_qt_price == 0:
|
||||
p.fixed_qt_price = round(Decimal(self.getnearprice(pl,d,'avg_minus_1',pc.pricing_date)),4)
|
||||
p.unfixed_qt = round(base_quantity - Decimal(cumul_qt),4)
|
||||
if p.unfixed_qt < 0.001:
|
||||
p.unfixed_qt = Decimal(0)
|
||||
p.fixed_qt = base_quantity
|
||||
if price > 0:
|
||||
logger.info("GENERATE_1:%s",price)
|
||||
p.unfixed_qt_price = price
|
||||
else:
|
||||
pr = Decimal(pc.price_index.get_price(p.pricing_date,self.unit,self.sale.currency,True))
|
||||
pr = round(pr,4)
|
||||
|
||||
@@ -533,6 +533,46 @@ class ShipmentIn(metaclass=PoolMeta):
|
||||
value = Decimal(str(value or 0)).quantize(Decimal('0.01'))
|
||||
return format(value, 'f')
|
||||
|
||||
@staticmethod
|
||||
def _format_report_quantity(value, digits='0.001'):
|
||||
if value in (None, ''):
|
||||
return ''
|
||||
quantity = Decimal(str(value or 0)).quantize(Decimal(digits))
|
||||
text = format(quantity, 'f')
|
||||
return text.rstrip('0').rstrip('.') or '0'
|
||||
|
||||
def _get_report_trade(self):
|
||||
line = self._get_report_trade_line()
|
||||
if not line:
|
||||
return None
|
||||
return getattr(line, 'sale', None) or getattr(line, 'purchase', None)
|
||||
|
||||
def _get_report_weight_totals(self):
|
||||
net = Decimal('0')
|
||||
gross = Decimal('0')
|
||||
for move in (self.incoming_moves or self.moves or []):
|
||||
lot = getattr(move, 'lot', None)
|
||||
if lot:
|
||||
lot_net = (
|
||||
lot.get_current_quantity()
|
||||
if hasattr(lot, 'get_current_quantity')
|
||||
else lot.get_current_quantity_converted()
|
||||
if hasattr(lot, 'get_current_quantity_converted')
|
||||
else getattr(move, 'quantity', 0)
|
||||
)
|
||||
lot_gross = (
|
||||
lot.get_current_gross_quantity()
|
||||
if hasattr(lot, 'get_current_gross_quantity')
|
||||
else lot_net
|
||||
)
|
||||
net += Decimal(str(lot_net or 0))
|
||||
gross += Decimal(str(lot_gross or 0))
|
||||
else:
|
||||
quantity = Decimal(str(getattr(move, 'quantity', 0) or 0))
|
||||
net += quantity
|
||||
gross += quantity
|
||||
return net, gross
|
||||
|
||||
@property
|
||||
def report_product_name(self):
|
||||
line = self._get_report_trade_line()
|
||||
@@ -652,6 +692,106 @@ class ShipmentIn(metaclass=PoolMeta):
|
||||
today = Date.today()
|
||||
date_text = today.strftime('%d-%m-%Y') if today else ''
|
||||
return ', '.join(part for part in [place, date_text] if part)
|
||||
|
||||
@property
|
||||
def report_packing_product_class(self):
|
||||
return self.report_product_name
|
||||
|
||||
@property
|
||||
def report_packing_contract_number(self):
|
||||
trade = self._get_report_trade()
|
||||
return (
|
||||
getattr(trade, 'reference', None)
|
||||
or getattr(trade, 'number', None)
|
||||
or self.reference
|
||||
or self.number
|
||||
or '')
|
||||
|
||||
@property
|
||||
def report_packing_invoice_qty(self):
|
||||
quantity = self.quantity if self.quantity not in (None, '') else 0
|
||||
return self._format_report_quantity(quantity)
|
||||
|
||||
@property
|
||||
def report_packing_invoice_qty_unit(self):
|
||||
unit = self.unit
|
||||
return (
|
||||
getattr(unit, 'symbol', None)
|
||||
or getattr(unit, 'rec_name', None)
|
||||
or '')
|
||||
|
||||
@property
|
||||
def report_packing_origin(self):
|
||||
trade = self._get_report_trade()
|
||||
return (
|
||||
getattr(trade, 'product_origin', None)
|
||||
or getattr(self.from_location, 'name', None)
|
||||
or '')
|
||||
|
||||
@property
|
||||
def report_packing_product(self):
|
||||
return self.report_product_name
|
||||
|
||||
@property
|
||||
def report_packing_counterparty_name(self):
|
||||
trade = self._get_report_trade()
|
||||
party = getattr(trade, 'party', None) if trade else None
|
||||
if party:
|
||||
return party.rec_name or ''
|
||||
return getattr(self.supplier, 'rec_name', '') or ''
|
||||
|
||||
@property
|
||||
def report_packing_ship_name(self):
|
||||
if self.vessel and self.vessel.vessel_name:
|
||||
return self.vessel.vessel_name
|
||||
return self.transport_type or ''
|
||||
|
||||
@property
|
||||
def report_packing_loading_port(self):
|
||||
return getattr(self.from_location, 'name', '') or ''
|
||||
|
||||
@property
|
||||
def report_packing_destination_port(self):
|
||||
return getattr(self.to_location, 'name', '') or ''
|
||||
|
||||
@property
|
||||
def report_packing_chunk_number(self):
|
||||
return self.bl_number or self.number or ''
|
||||
|
||||
@property
|
||||
def report_packing_chunk_date(self):
|
||||
if self.bl_date:
|
||||
return self.bl_date.strftime('%d-%m-%Y')
|
||||
return ''
|
||||
|
||||
@property
|
||||
def report_packing_today_date(self):
|
||||
Date = Pool().get('ir.date')
|
||||
today = Date.today()
|
||||
if not today:
|
||||
return ''
|
||||
return f"{today.strftime('%B')} {today.day}, {today.year}"
|
||||
|
||||
@property
|
||||
def report_packing_weight_unit(self):
|
||||
line = self._get_report_trade_line()
|
||||
unit = getattr(line, 'unit', None) if line else None
|
||||
if unit:
|
||||
return (
|
||||
getattr(unit, 'symbol', None)
|
||||
or getattr(unit, 'rec_name', None)
|
||||
or '')
|
||||
return self.report_packing_invoice_qty_unit or 'KGS'
|
||||
|
||||
@property
|
||||
def report_packing_gross_weight(self):
|
||||
_, gross = self._get_report_weight_totals()
|
||||
return self._format_report_quantity(gross)
|
||||
|
||||
@property
|
||||
def report_packing_net_weight(self):
|
||||
net, _ = self._get_report_weight_totals()
|
||||
return self._format_report_quantity(net)
|
||||
|
||||
def get_rec_name(self, name=None):
|
||||
if self.number:
|
||||
@@ -2153,3 +2293,12 @@ class ShipmentInsuranceReport(ShipmentTemplateReportMixin, BaseSupplierShipping)
|
||||
def _resolve_configured_report_path(cls, action):
|
||||
return cls._resolve_template_path(
|
||||
'shipment_insurance_report_template', 'stock')
|
||||
|
||||
|
||||
class ShipmentPackingListReport(ShipmentTemplateReportMixin, BaseSupplierShipping):
|
||||
__name__ = 'stock.shipment.in.packing_list'
|
||||
|
||||
@classmethod
|
||||
def _resolve_configured_report_path(cls, action):
|
||||
return cls._resolve_template_path(
|
||||
'shipment_packing_list_report_template', 'stock')
|
||||
|
||||
@@ -72,6 +72,18 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<field name="model">stock.shipment.in,-1</field>
|
||||
<field name="action" ref="report_shipment_in_insurance"/>
|
||||
</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>
|
||||
<field name="report_name">stock.shipment.in.packing_list</field>
|
||||
<field name="report">stock/packing_list.fodt</field>
|
||||
</record>
|
||||
<record model="ir.action.keyword" id="report_shipment_in_packing_list_keyword">
|
||||
<field name="keyword">form_print</field>
|
||||
<field name="model">stock.shipment.in,-1</field>
|
||||
<field name="action" ref="report_shipment_in_packing_list"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.action.wizard" id="act_update_sof">
|
||||
<field name="name">Update with SoF PDF</field>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
|
||||
import datetime
|
||||
from decimal import Decimal
|
||||
from unittest.mock import Mock, patch
|
||||
|
||||
@@ -184,6 +185,250 @@ class PurchaseTradeTestCase(ModuleTestCase):
|
||||
self.assertEqual(
|
||||
PurchaseLine.default_pricing_rule(), 'Default pricing rule')
|
||||
|
||||
def test_component_quota_uses_quantity_fallback_when_theoretical_is_missing(self):
|
||||
'component quota does not crash when theoretical quantity is still empty'
|
||||
SaleComponent = Pool().get('pricing.component')
|
||||
PurchaseComponent = Pool().get('pricing.component')
|
||||
|
||||
sale_component = SaleComponent()
|
||||
sale_component.nbdays = None
|
||||
sale_component.sale_line = Mock(
|
||||
quantity=Decimal('12'),
|
||||
quantity_theorical=None,
|
||||
)
|
||||
|
||||
purchase_component = PurchaseComponent()
|
||||
purchase_component.nbdays = None
|
||||
purchase_component.line = Mock(
|
||||
quantity=Decimal('15'),
|
||||
quantity_theorical=None,
|
||||
)
|
||||
|
||||
self.assertEqual(sale_component.get_quota_sale('quota_sale'), Decimal('12.0000'))
|
||||
self.assertEqual(
|
||||
purchase_component.get_quota_purchase('quota'),
|
||||
Decimal('15.00000'))
|
||||
|
||||
def test_sale_and_purchase_generate_pricing_use_quantity_fallback(self):
|
||||
'pricing generation uses quantity when theoretical quantity is missing'
|
||||
Sale = Pool().get('sale.sale')
|
||||
Purchase = Pool().get('purchase.purchase')
|
||||
|
||||
sale = Sale()
|
||||
sale.id = 1
|
||||
sale.quantity = Decimal('10')
|
||||
sale.quantity_theorical = None
|
||||
sale.unit = Mock()
|
||||
sale.sale = Mock(currency=Mock())
|
||||
sale.getnearprice = Mock(return_value=Decimal('0'))
|
||||
|
||||
purchase = Purchase()
|
||||
purchase.id = 1
|
||||
purchase.quantity = Decimal('12')
|
||||
purchase.quantity_theorical = None
|
||||
purchase.unit = Mock()
|
||||
purchase.purchase = Mock(currency=Mock())
|
||||
purchase.getnearprice = Mock(return_value=Decimal('0'))
|
||||
|
||||
pricing_model = Mock()
|
||||
pricing_model.search.return_value = []
|
||||
pc_sale = Mock(id=1, quota_sale=Decimal('2'), pricing_date=None, price_index=Mock(get_price=Mock(return_value=Decimal('1'))))
|
||||
pc_purchase = Mock(id=1, quota=Decimal('3'), pricing_date=None, price_index=Mock(get_price=Mock(return_value=Decimal('1'))))
|
||||
|
||||
with patch('trytond.modules.purchase_trade.sale.Pool') as SalePool, patch(
|
||||
'trytond.modules.purchase_trade.purchase.Pool') as PurchasePool:
|
||||
SalePool.return_value.get.return_value = pricing_model
|
||||
PurchasePool.return_value.get.return_value = pricing_model
|
||||
|
||||
sale.generate_pricing(pc_sale, [datetime.datetime(2026, 4, 1)], [])
|
||||
purchase.generate_pricing(pc_purchase, [datetime.datetime(2026, 4, 1)], [])
|
||||
|
||||
self.assertEqual(pricing_model.save.call_args_list[0].args[0][0].unfixed_qt, Decimal('10'))
|
||||
self.assertEqual(pricing_model.save.call_args_list[1].args[0][0].unfixed_qt, Decimal('12'))
|
||||
|
||||
def test_pricing_manual_fields_are_editable_except_eod(self):
|
||||
'manual pricing rows only edit quantity and settlement while derived values stay computed'
|
||||
Pricing = Pool().get('pricing.pricing')
|
||||
|
||||
self.assertFalse(Pricing.quantity.readonly)
|
||||
self.assertFalse(Pricing.settl_price.readonly)
|
||||
self.assertTrue(Pricing.fixed_qt.readonly)
|
||||
self.assertTrue(Pricing.fixed_qt_price.readonly)
|
||||
self.assertTrue(Pricing.unfixed_qt.readonly)
|
||||
self.assertTrue(Pricing.unfixed_qt_price.readonly)
|
||||
self.assertTrue(Pricing.eod_price.readonly)
|
||||
|
||||
def test_pricing_eod_uses_weighted_average_for_manual_rows(self):
|
||||
'manual pricing eod uses the weighted average of fixed and unfixed legs'
|
||||
Pricing = Pool().get('pricing.pricing')
|
||||
|
||||
pricing = Pricing()
|
||||
pricing.fixed_qt = Decimal('4')
|
||||
pricing.fixed_qt_price = Decimal('100')
|
||||
pricing.unfixed_qt = Decimal('6')
|
||||
pricing.unfixed_qt_price = Decimal('110')
|
||||
|
||||
self.assertEqual(pricing.compute_eod_price(), Decimal('106.0000'))
|
||||
|
||||
def test_sale_and_purchase_eod_use_same_weighted_formula(self):
|
||||
'auto sale/purchase eod helpers use the same weighted average formula'
|
||||
Pricing = Pool().get('pricing.pricing')
|
||||
|
||||
sale_pricing = Pricing()
|
||||
sale_pricing.sale_line = Mock(quantity=Decimal('999'))
|
||||
sale_pricing.fixed_qt = Decimal('4')
|
||||
sale_pricing.fixed_qt_price = Decimal('100')
|
||||
sale_pricing.unfixed_qt = Decimal('6')
|
||||
sale_pricing.unfixed_qt_price = Decimal('110')
|
||||
|
||||
purchase_pricing = Pricing()
|
||||
purchase_pricing.line = Mock(quantity_theorical=Decimal('999'))
|
||||
purchase_pricing.fixed_qt = Decimal('4')
|
||||
purchase_pricing.fixed_qt_price = Decimal('100')
|
||||
purchase_pricing.unfixed_qt = Decimal('6')
|
||||
purchase_pricing.unfixed_qt_price = Decimal('110')
|
||||
|
||||
self.assertEqual(sale_pricing.get_eod_price_sale(), Decimal('106.0000'))
|
||||
self.assertEqual(
|
||||
purchase_pricing.get_eod_price_purchase(), Decimal('106.0000'))
|
||||
|
||||
def test_pricing_sync_manual_last_uses_greatest_date_per_component_group(self):
|
||||
'pricing rows keep one last by line/component, chosen by greatest pricing date'
|
||||
Pricing = Pool().get('pricing.pricing')
|
||||
|
||||
sale_line = Mock(id=10)
|
||||
component = Mock(id=33)
|
||||
first = Mock(
|
||||
id=1,
|
||||
price_component=component,
|
||||
sale_line=sale_line,
|
||||
line=None,
|
||||
pricing_date=datetime.date(2026, 4, 10),
|
||||
last=True,
|
||||
)
|
||||
second = Mock(
|
||||
id=2,
|
||||
price_component=component,
|
||||
sale_line=sale_line,
|
||||
line=None,
|
||||
pricing_date=datetime.date(2026, 4, 9),
|
||||
last=False,
|
||||
)
|
||||
|
||||
with patch.object(Pricing, 'search', return_value=[second, first]), patch(
|
||||
'trytond.modules.purchase_trade.pricing.super') as super_mock:
|
||||
Pricing._sync_manual_last([first, second])
|
||||
|
||||
self.assertEqual(super_mock.return_value.write.call_args_list[0].args[0], [second])
|
||||
self.assertEqual(super_mock.return_value.write.call_args_list[0].args[1], {'last': False})
|
||||
self.assertEqual(super_mock.return_value.write.call_args_list[1].args[0], [first])
|
||||
self.assertEqual(super_mock.return_value.write.call_args_list[1].args[1], {'last': True})
|
||||
|
||||
def test_pricing_sync_manual_values_recomputes_manual_group_from_quantity_and_settl(self):
|
||||
'manual pricing rows derive fixed/unfixed values from quantity and settlement price'
|
||||
Pricing = Pool().get('pricing.pricing')
|
||||
|
||||
sale_line = Mock(id=10)
|
||||
sale_line._get_pricing_base_quantity = Mock(return_value=Decimal('10'))
|
||||
component = Mock(id=33, auto=False)
|
||||
first = Mock(
|
||||
id=1,
|
||||
price_component=component,
|
||||
sale_line=sale_line,
|
||||
line=None,
|
||||
pricing_date=datetime.date(2026, 4, 10),
|
||||
quantity=Decimal('4'),
|
||||
settl_price=Decimal('100'),
|
||||
)
|
||||
second = Mock(
|
||||
id=2,
|
||||
price_component=component,
|
||||
sale_line=sale_line,
|
||||
line=None,
|
||||
pricing_date=datetime.date(2026, 4, 11),
|
||||
quantity=Decimal('3'),
|
||||
settl_price=Decimal('110'),
|
||||
)
|
||||
|
||||
with patch.object(Pricing, 'search', return_value=[first, second]), patch(
|
||||
'trytond.modules.purchase_trade.pricing.super') as super_mock:
|
||||
Pricing._sync_manual_values([first, second])
|
||||
|
||||
first_values = super_mock.return_value.write.call_args_list[0].args[1]
|
||||
self.assertEqual(first_values['fixed_qt'], Decimal('4'))
|
||||
self.assertEqual(first_values['fixed_qt_price'], Decimal('100.0000'))
|
||||
self.assertEqual(first_values['unfixed_qt'], Decimal('6'))
|
||||
self.assertEqual(first_values['unfixed_qt_price'], Decimal('100'))
|
||||
self.assertEqual(first_values['eod_price'], Decimal('100.0000'))
|
||||
self.assertFalse(first_values['last'])
|
||||
|
||||
second_values = super_mock.return_value.write.call_args_list[1].args[1]
|
||||
self.assertEqual(second_values['fixed_qt'], Decimal('7'))
|
||||
self.assertEqual(second_values['fixed_qt_price'], Decimal('104.2857'))
|
||||
self.assertEqual(second_values['unfixed_qt'], Decimal('3'))
|
||||
self.assertEqual(second_values['unfixed_qt_price'], Decimal('110'))
|
||||
self.assertEqual(second_values['eod_price'], Decimal('106.0000'))
|
||||
self.assertTrue(second_values['last'])
|
||||
|
||||
def test_sale_and_purchase_trader_operator_domains_use_explicit_categories(self):
|
||||
'sale and purchase trader/operator fields are filtered by TRADER/OPERATOR categories'
|
||||
Sale = Pool().get('sale.sale')
|
||||
Purchase = Pool().get('purchase.purchase')
|
||||
|
||||
self.assertEqual(
|
||||
Sale.trader.domain, [('categories.name', '=', 'TRADER')])
|
||||
self.assertEqual(
|
||||
Sale.operator.domain, [('categories.name', '=', 'OPERATOR')])
|
||||
self.assertEqual(
|
||||
Purchase.trader.domain, [('categories.name', '=', 'TRADER')])
|
||||
self.assertEqual(
|
||||
Purchase.operator.domain, [('categories.name', '=', 'OPERATOR')])
|
||||
|
||||
def test_sale_line_basis_price_and_progress_use_manual_summary_without_component(self):
|
||||
'sale line basis values use manual summary rows even without a component'
|
||||
SaleLine = Pool().get('sale.line')
|
||||
summary_model = Mock()
|
||||
summary_model.search.side_effect = [
|
||||
[Mock(price=Decimal('150'), progress=1, price_component=None)],
|
||||
[Mock(price=Decimal('150'), progress=1, price_component=None)],
|
||||
]
|
||||
|
||||
line = SaleLine()
|
||||
line.id = 1
|
||||
line.price_type = 'basis'
|
||||
line.price_components = []
|
||||
line.enable_linked_currency = False
|
||||
line.linked_currency = None
|
||||
|
||||
with patch('trytond.modules.purchase_trade.sale.Pool') as PoolMock:
|
||||
PoolMock.return_value.get.return_value = summary_model
|
||||
|
||||
self.assertEqual(line.get_basis_price(), Decimal('150.0000'))
|
||||
self.assertEqual(line.get_progress('progress'), 1)
|
||||
|
||||
def test_purchase_line_basis_price_and_progress_use_manual_summary_without_component(self):
|
||||
'purchase line basis values use manual summary rows even without a component'
|
||||
PurchaseLine = Pool().get('purchase.line')
|
||||
summary_model = Mock()
|
||||
summary_model.search.side_effect = [
|
||||
[Mock(price=Decimal('150'), progress=1, price_component=None)],
|
||||
[Mock(price=Decimal('150'), progress=1, price_component=None)],
|
||||
]
|
||||
|
||||
line = PurchaseLine()
|
||||
line.id = 1
|
||||
line.price_type = 'basis'
|
||||
line.price_components = []
|
||||
line.terms = []
|
||||
line.enable_linked_currency = False
|
||||
line.linked_currency = None
|
||||
|
||||
with patch('trytond.modules.purchase_trade.purchase.Pool') as PoolMock:
|
||||
PoolMock.return_value.get.return_value = summary_model
|
||||
|
||||
self.assertEqual(line.get_basis_price(), Decimal('150.0000'))
|
||||
self.assertEqual(line.get_progress('progress'), 1)
|
||||
|
||||
def test_sale_line_write_updates_virtual_lot_when_theorical_qty_increases(self):
|
||||
'sale line write increases virtual lot and open lot.qt when contractual qty grows'
|
||||
SaleLine = Pool().get('sale.line')
|
||||
@@ -510,11 +755,13 @@ 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')
|
||||
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_packing_list_report_template='packing_list_custom.fodt',
|
||||
)
|
||||
]
|
||||
|
||||
@@ -535,6 +782,12 @@ class PurchaseTradeTestCase(ModuleTestCase):
|
||||
'report': 'stock/insurance.fodt',
|
||||
}),
|
||||
'stock/insurance_custom.fodt')
|
||||
self.assertEqual(
|
||||
packing_report._resolve_configured_report_path({
|
||||
'name': 'Packing List',
|
||||
'report': 'stock/packing_list.fodt',
|
||||
}),
|
||||
'stock/packing_list_custom.fodt')
|
||||
|
||||
def test_shipment_insurance_helpers_use_fee_and_controller(self):
|
||||
'shipment insurance helpers read insurance fee and shipment context'
|
||||
@@ -630,6 +883,34 @@ class PurchaseTradeTestCase(ModuleTestCase):
|
||||
self.assertEqual(
|
||||
shipment.report_insurance_surveyor, 'SGS')
|
||||
|
||||
def test_shipment_packing_helpers_use_today_and_trade_unit(self):
|
||||
'packing list helpers expose today date and trade line unit'
|
||||
ShipmentIn = Pool().get('stock.shipment.in')
|
||||
shipment = ShipmentIn()
|
||||
shipment.quantity = Decimal('1010')
|
||||
shipment.unit = Mock(symbol='KGS', rec_name='KGS')
|
||||
|
||||
trade_line = Mock()
|
||||
trade_line.unit = Mock(symbol='MT', rec_name='MT')
|
||||
lot = Mock(line=trade_line, sale_line=None)
|
||||
lot.get_current_quantity = Mock(return_value=Decimal('1010'))
|
||||
lot.get_current_gross_quantity = Mock(return_value=Decimal('1012'))
|
||||
move = Mock(lot=lot, quantity=Decimal('0'))
|
||||
shipment.incoming_moves = [move]
|
||||
shipment.moves = [move]
|
||||
|
||||
with patch(
|
||||
'trytond.modules.purchase_trade.stock.Pool'
|
||||
) as PoolMock:
|
||||
date_model = Mock()
|
||||
date_model.today.return_value = datetime.date(2026, 4, 8)
|
||||
PoolMock.return_value.get.return_value = date_model
|
||||
|
||||
self.assertEqual(
|
||||
shipment.report_packing_today_date, 'April 8, 2026')
|
||||
self.assertEqual(
|
||||
shipment.report_packing_weight_unit, 'MT')
|
||||
|
||||
def test_sale_report_multi_line_helpers_aggregate_all_lines(self):
|
||||
'sale report helpers aggregate quantity, price lines and shipment periods'
|
||||
Sale = Pool().get('sale.sale')
|
||||
@@ -677,6 +958,106 @@ class PurchaseTradeTestCase(ModuleTestCase):
|
||||
'USC 70.2500 PER POUND (SEVENTY USC AND TWENTY FIVE CENTS) ON ICE Cotton #2 MAY 2026',
|
||||
])
|
||||
|
||||
def test_sale_report_converts_mixed_units_for_total_and_words(self):
|
||||
'sale report totals prefer the virtual lot unit as common unit'
|
||||
Sale = Pool().get('sale.sale')
|
||||
|
||||
mt = Mock(id=1, rec_name='MT')
|
||||
kg = Mock(id=2, rec_name='KILOGRAM')
|
||||
|
||||
line_mt = Mock()
|
||||
line_mt.type = 'line'
|
||||
line_mt.quantity = Decimal('1000')
|
||||
line_mt.unit = mt
|
||||
line_mt.del_period = Mock(description='MARCH 2026')
|
||||
line_mt.lots = []
|
||||
|
||||
virtual = Mock(lot_type='virtual', lot_unit_line=kg)
|
||||
virtual.get_hist_quantity.return_value = (
|
||||
Decimal('1000000'),
|
||||
Decimal('1000000'),
|
||||
)
|
||||
line_kg = Mock()
|
||||
line_kg.type = 'line'
|
||||
line_kg.quantity = Decimal('1000')
|
||||
line_kg.unit = mt
|
||||
line_kg.del_period = Mock(description='MAY 2026')
|
||||
line_kg.lots = [virtual]
|
||||
|
||||
sale = Sale()
|
||||
sale.lines = [line_mt, line_kg]
|
||||
|
||||
uom_model = Mock()
|
||||
uom_model.compute_qty.side_effect = (
|
||||
lambda from_unit, qty, to_unit: (
|
||||
qty * 1000
|
||||
if getattr(from_unit, 'rec_name', None) == 'MT'
|
||||
and getattr(to_unit, 'rec_name', None) == 'KILOGRAM'
|
||||
else (
|
||||
qty / 1000
|
||||
if getattr(from_unit, 'rec_name', None) == 'KILOGRAM'
|
||||
and getattr(to_unit, 'rec_name', None) == 'MT'
|
||||
else qty
|
||||
)
|
||||
))
|
||||
|
||||
with patch('trytond.modules.purchase_trade.sale.Pool') as PoolMock:
|
||||
PoolMock.return_value.get.return_value = uom_model
|
||||
|
||||
self.assertEqual(sale.report_total_quantity, '2000000.0')
|
||||
self.assertEqual(sale.report_quantity_unit_upper, 'KILOGRAM')
|
||||
self.assertEqual(sale.report_qt, 'TWO MILLION KILOGRAMS')
|
||||
self.assertEqual(
|
||||
sale.report_quantity_lines.splitlines(),
|
||||
[
|
||||
'1000.0 MT (ONE THOUSAND METRIC TONS) - MARCH 2026',
|
||||
'1000000.0 KILOGRAM (ONE MILLION KILOGRAMS) - MAY 2026',
|
||||
])
|
||||
|
||||
def test_sale_report_total_unit_falls_back_when_multiple_virtual_lots(self):
|
||||
'sale report common unit uses virtual only when there is a single one'
|
||||
Sale = Pool().get('sale.sale')
|
||||
|
||||
mt = Mock(id=1, rec_name='MT')
|
||||
kg = Mock(id=2, rec_name='KILOGRAM')
|
||||
|
||||
line_mt = Mock(type='line', quantity=Decimal('1000'), unit=mt)
|
||||
line_mt.del_period = Mock(description='MARCH 2026')
|
||||
line_mt.lots = []
|
||||
|
||||
virtual_a = Mock(lot_type='virtual', lot_unit_line=kg)
|
||||
virtual_a.get_hist_quantity.return_value = (
|
||||
Decimal('1000000'),
|
||||
Decimal('1000000'),
|
||||
)
|
||||
virtual_b = Mock(lot_type='virtual', lot_unit_line=kg)
|
||||
virtual_b.get_hist_quantity.return_value = (
|
||||
Decimal('1000000'),
|
||||
Decimal('1000000'),
|
||||
)
|
||||
line_kg = Mock(type='line', quantity=Decimal('1000'), unit=mt)
|
||||
line_kg.del_period = Mock(description='MAY 2026')
|
||||
line_kg.lots = [virtual_a, virtual_b]
|
||||
|
||||
sale = Sale()
|
||||
sale.lines = [line_mt, line_kg]
|
||||
|
||||
uom_model = Mock()
|
||||
uom_model.compute_qty.side_effect = (
|
||||
lambda from_unit, qty, to_unit: (
|
||||
qty / 1000
|
||||
if getattr(from_unit, 'rec_name', None) == 'KILOGRAM'
|
||||
and getattr(to_unit, 'rec_name', None) == 'MT'
|
||||
else qty
|
||||
))
|
||||
|
||||
with patch('trytond.modules.purchase_trade.sale.Pool') as PoolMock:
|
||||
PoolMock.return_value.get.return_value = uom_model
|
||||
|
||||
self.assertEqual(sale.report_quantity_unit_upper, 'MT')
|
||||
self.assertEqual(sale.report_total_quantity, '2000.0')
|
||||
self.assertEqual(sale.report_qt, 'TWO THOUSAND METRIC TONS')
|
||||
|
||||
def test_report_product_fields_expose_name_and_description(self):
|
||||
'sale and invoice templates use stable product name/description helpers'
|
||||
Sale = Pool().get('sale.sale')
|
||||
@@ -805,15 +1186,86 @@ class PurchaseTradeTestCase(ModuleTestCase):
|
||||
'USC 8.3000 PER POUND (EIGHT USC AND THIRTY CENTS) ON ICE Cotton #2 MARCH 2026',
|
||||
)])
|
||||
|
||||
def test_invoice_report_note_title_uses_total_amount_sign(self):
|
||||
'final invoice title switches between credit and debit note'
|
||||
def test_sale_report_uses_single_virtual_lot_hist_when_no_physical(self):
|
||||
'sale report uses the unique virtual lot hist when no physical lot exists'
|
||||
Sale = Pool().get('sale.sale')
|
||||
|
||||
virtual = Mock(lot_type='virtual', lot_unit_line=Mock(rec_name='LBS'))
|
||||
virtual.get_hist_quantity.return_value = (
|
||||
Decimal('930'),
|
||||
Decimal('0'),
|
||||
)
|
||||
line = Mock(type='line', quantity=Decimal('1000'))
|
||||
line.lots = [virtual]
|
||||
line.unit = Mock(rec_name='MT')
|
||||
line.del_period = Mock(description='MARCH 2026')
|
||||
|
||||
sale = Sale()
|
||||
sale.lines = [line]
|
||||
|
||||
self.assertEqual(sale.report_net, Decimal('930'))
|
||||
self.assertEqual(sale.report_gross, Decimal('930'))
|
||||
self.assertEqual(sale.report_total_quantity, '930.0')
|
||||
self.assertEqual(sale.report_quantity_unit_upper, 'LBS')
|
||||
self.assertEqual(
|
||||
sale.report_quantity_lines,
|
||||
'930.0 LBS (NINE HUNDRED AND THIRTY POUNDS) - MARCH 2026')
|
||||
|
||||
def test_sale_report_prefers_physical_lot_hist_over_virtual(self):
|
||||
'sale report prioritizes physical lot hist values over virtual ones'
|
||||
Sale = Pool().get('sale.sale')
|
||||
|
||||
virtual = Mock(lot_type='virtual', lot_unit_line=Mock(rec_name='LBS'))
|
||||
virtual.get_hist_quantity.return_value = (
|
||||
Decimal('930'),
|
||||
Decimal('940'),
|
||||
)
|
||||
physical = Mock(lot_type='physic', lot_unit_line=Mock(rec_name='LBS'))
|
||||
physical.get_hist_quantity.return_value = (
|
||||
Decimal('950'),
|
||||
Decimal('980'),
|
||||
)
|
||||
line = Mock(type='line', quantity=Decimal('1000'))
|
||||
line.lots = [virtual, physical]
|
||||
line.unit = Mock(rec_name='MT')
|
||||
line.del_period = Mock(description='MARCH 2026')
|
||||
|
||||
sale = Sale()
|
||||
sale.lines = [line]
|
||||
|
||||
self.assertEqual(sale.report_net, Decimal('950'))
|
||||
self.assertEqual(sale.report_gross, Decimal('980'))
|
||||
self.assertEqual(sale.report_total_quantity, '950.0')
|
||||
self.assertEqual(sale.report_quantity_unit_upper, 'LBS')
|
||||
self.assertEqual(
|
||||
sale.report_quantity_lines,
|
||||
'950.0 LBS (NINE HUNDRED AND FIFTY POUNDS) - MARCH 2026')
|
||||
|
||||
def test_invoice_report_note_title_uses_sale_direction(self):
|
||||
'sale final note title is inverted from the raw amount sign'
|
||||
Invoice = Pool().get('account.invoice')
|
||||
|
||||
debit = Invoice()
|
||||
debit.type = 'out'
|
||||
debit.total_amount = Decimal('10')
|
||||
self.assertEqual(debit.report_note_title, 'Debit Note')
|
||||
|
||||
credit = Invoice()
|
||||
credit.type = 'out'
|
||||
credit.total_amount = Decimal('-10')
|
||||
self.assertEqual(credit.report_note_title, 'Credit Note')
|
||||
|
||||
def test_invoice_report_note_title_keeps_inverse_for_purchase(self):
|
||||
'purchase final note title keeps the opposite mapping'
|
||||
Invoice = Pool().get('account.invoice')
|
||||
|
||||
credit = Invoice()
|
||||
credit.type = 'in'
|
||||
credit.total_amount = Decimal('10')
|
||||
self.assertEqual(credit.report_note_title, 'Credit Note')
|
||||
|
||||
debit = Invoice()
|
||||
debit.type = 'in'
|
||||
debit.total_amount = Decimal('-10')
|
||||
self.assertEqual(debit.report_note_title, 'Debit Note')
|
||||
|
||||
@@ -828,6 +1280,291 @@ class PurchaseTradeTestCase(ModuleTestCase):
|
||||
|
||||
self.assertEqual(invoice.report_net, Decimal('800'))
|
||||
|
||||
def test_invoice_report_weights_use_current_lot_hist_values(self):
|
||||
'invoice net and gross weights come from the current lot hist entry'
|
||||
Invoice = Pool().get('account.invoice')
|
||||
|
||||
unit = Mock(rec_name='LBS', symbol='LBS')
|
||||
lot = Mock(lot_unit_line=unit)
|
||||
lot.get_hist_quantity.return_value = (
|
||||
Decimal('950'),
|
||||
Decimal('980'),
|
||||
)
|
||||
line = Mock(type='line', quantity=Decimal('1000'), lot=lot, unit=Mock(rec_name='MT'))
|
||||
invoice = Invoice()
|
||||
invoice.lines = [line]
|
||||
|
||||
self.assertEqual(invoice.report_net, Decimal('950'))
|
||||
self.assertEqual(invoice.report_gross, Decimal('980'))
|
||||
self.assertEqual(invoice.report_weight_unit_upper, 'LBS')
|
||||
self.assertEqual(
|
||||
invoice.report_quantity_lines,
|
||||
'950.00 LBS (950.00 LBS)')
|
||||
|
||||
def test_invoice_report_lbs_converts_kilogram_to_lbs(self):
|
||||
'invoice lbs helper converts kilogram quantities with the proper uom ratio'
|
||||
Invoice = Pool().get('account.invoice')
|
||||
|
||||
kg = Mock(id=1, rec_name='KILOGRAM', symbol='KG')
|
||||
lbs = Mock(id=2, rec_name='LBS', symbol='LBS')
|
||||
lot = Mock(lot_unit_line=kg)
|
||||
lot.get_hist_quantity.return_value = (
|
||||
Decimal('999995'),
|
||||
Decimal('999995'),
|
||||
)
|
||||
line = Mock(type='line', quantity=Decimal('999995'), lot=lot, unit=kg)
|
||||
invoice = Invoice()
|
||||
invoice.lines = [line]
|
||||
|
||||
uom_model = Mock()
|
||||
uom_model.search.return_value = [lbs]
|
||||
uom_model.compute_qty.side_effect = (
|
||||
lambda from_unit, qty, to_unit: qty * 2.20462
|
||||
)
|
||||
|
||||
with patch('trytond.modules.purchase_trade.invoice.Pool') as PoolMock:
|
||||
PoolMock.return_value.get.return_value = uom_model
|
||||
|
||||
self.assertEqual(invoice.report_lbs, Decimal('2204608.98'))
|
||||
self.assertEqual(
|
||||
invoice.report_quantity_lines,
|
||||
'999995.00 KILOGRAM (2204608.98 LBS)')
|
||||
self.assertEqual(invoice.report_net_display, '999995.00')
|
||||
self.assertEqual(invoice.report_lbs_display, '2204608.98')
|
||||
|
||||
def test_invoice_report_weights_keep_line_sign_with_lot_hist_values(self):
|
||||
'invoice lot hist values keep the invoice line sign for final notes'
|
||||
Invoice = Pool().get('account.invoice')
|
||||
|
||||
positive_lot = Mock(lot_unit_line=Mock(rec_name='LBS'))
|
||||
positive_lot.get_hist_quantity.return_value = (
|
||||
Decimal('950'),
|
||||
Decimal('980'),
|
||||
)
|
||||
negative_lot = Mock(lot_unit_line=Mock(rec_name='LBS'))
|
||||
negative_lot.get_hist_quantity.return_value = (
|
||||
Decimal('150'),
|
||||
Decimal('160'),
|
||||
)
|
||||
positive = Mock(type='line', quantity=Decimal('1000'), lot=positive_lot)
|
||||
negative = Mock(type='line', quantity=Decimal('-200'), lot=negative_lot)
|
||||
invoice = Invoice()
|
||||
invoice.lines = [positive, negative]
|
||||
|
||||
self.assertEqual(invoice.report_net, Decimal('800'))
|
||||
self.assertEqual(invoice.report_gross, Decimal('820'))
|
||||
|
||||
def test_invoice_report_uses_line_quantities_when_same_lot_is_invoiced_twice(self):
|
||||
'invoice final note keeps line differences when two lines share the same lot'
|
||||
Invoice = Pool().get('account.invoice')
|
||||
|
||||
mt = Mock(id=1, rec_name='MT')
|
||||
kg = Mock(id=2, rec_name='KILOGRAM')
|
||||
current_type = Mock(id=100)
|
||||
previous_type = Mock(id=200)
|
||||
shared_lot = Mock(id=10, lot_type='physic', lot_unit_line=kg)
|
||||
shared_lot.lot_state = current_type
|
||||
shared_lot.get_hist_quantity.return_value = (
|
||||
Decimal('999995'),
|
||||
Decimal('999992'),
|
||||
)
|
||||
shared_lot.lot_hist = [
|
||||
Mock(
|
||||
quantity_type=previous_type,
|
||||
quantity=Decimal('999995'),
|
||||
gross_quantity=Decimal('999998'),
|
||||
),
|
||||
Mock(
|
||||
quantity_type=current_type,
|
||||
quantity=Decimal('999990'),
|
||||
gross_quantity=Decimal('999992'),
|
||||
),
|
||||
]
|
||||
|
||||
negative = Mock(
|
||||
type='line',
|
||||
quantity=Decimal('-999.995'),
|
||||
unit=mt,
|
||||
lot=shared_lot,
|
||||
)
|
||||
positive = Mock(
|
||||
type='line',
|
||||
quantity=Decimal('999.990'),
|
||||
unit=mt,
|
||||
lot=shared_lot,
|
||||
)
|
||||
|
||||
invoice = Invoice()
|
||||
negative.invoice = invoice
|
||||
positive.invoice = invoice
|
||||
invoice.lines = [negative, positive]
|
||||
|
||||
uom_model = Mock()
|
||||
uom_model.search.return_value = [Mock(id=3, rec_name='LBS', symbol='LBS')]
|
||||
uom_model.compute_qty.side_effect = (
|
||||
lambda from_unit, qty, to_unit: (
|
||||
qty * 1000
|
||||
if getattr(from_unit, 'rec_name', None) == 'MT'
|
||||
and getattr(to_unit, 'rec_name', None) == 'KILOGRAM'
|
||||
else (
|
||||
qty * 2.20462
|
||||
if getattr(from_unit, 'rec_name', None) == 'KILOGRAM'
|
||||
and getattr(to_unit, 'rec_name', None) == 'LBS'
|
||||
else qty
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
with patch('trytond.modules.purchase_trade.invoice.Pool') as PoolMock:
|
||||
PoolMock.return_value.get.return_value = uom_model
|
||||
|
||||
self.assertEqual(invoice.report_net, Decimal('-5.000'))
|
||||
self.assertEqual(invoice.report_gross, Decimal('-6'))
|
||||
self.assertEqual(
|
||||
invoice.report_quantity_lines.splitlines(),
|
||||
[
|
||||
'-999995.0 KILOGRAM (-2204608.98 LBS)',
|
||||
'999990.0 KILOGRAM (2204597.95 LBS)',
|
||||
])
|
||||
|
||||
def test_invoice_report_weights_use_single_virtual_lot_when_no_physical(self):
|
||||
'invoice uses the unique virtual lot hist when no physical lot exists'
|
||||
Invoice = Pool().get('account.invoice')
|
||||
|
||||
virtual = Mock(id=1, lot_type='virtual', lot_unit_line=Mock(rec_name='LBS'))
|
||||
virtual.get_hist_quantity.return_value = (
|
||||
Decimal('930'),
|
||||
Decimal('0'),
|
||||
)
|
||||
origin = Mock(lots=[virtual])
|
||||
line = Mock(
|
||||
type='line',
|
||||
quantity=Decimal('1000'),
|
||||
lot=None,
|
||||
origin=origin,
|
||||
unit=Mock(rec_name='MT'),
|
||||
)
|
||||
invoice = Invoice()
|
||||
invoice.lines = [line]
|
||||
|
||||
self.assertEqual(invoice.report_net, Decimal('930'))
|
||||
self.assertEqual(invoice.report_gross, Decimal('930'))
|
||||
self.assertEqual(invoice.report_weight_unit_upper, 'LBS')
|
||||
|
||||
def test_invoice_report_weights_prefer_physical_lots_over_virtual(self):
|
||||
'invoice uses physical lot hist values whenever physical lots exist'
|
||||
Invoice = Pool().get('account.invoice')
|
||||
|
||||
virtual = Mock(id=1, lot_type='virtual', lot_unit_line=Mock(rec_name='LBS'))
|
||||
virtual.get_hist_quantity.return_value = (
|
||||
Decimal('930'),
|
||||
Decimal('940'),
|
||||
)
|
||||
physical = Mock(id=2, lot_type='physic', lot_unit_line=Mock(rec_name='LBS'))
|
||||
physical.get_hist_quantity.return_value = (
|
||||
Decimal('950'),
|
||||
Decimal('980'),
|
||||
)
|
||||
origin = Mock(lots=[virtual, physical])
|
||||
line = Mock(
|
||||
type='line',
|
||||
quantity=Decimal('1000'),
|
||||
lot=virtual,
|
||||
origin=origin,
|
||||
unit=Mock(rec_name='MT'),
|
||||
)
|
||||
invoice = Invoice()
|
||||
invoice.lines = [line]
|
||||
|
||||
self.assertEqual(invoice.report_net, Decimal('950'))
|
||||
self.assertEqual(invoice.report_gross, Decimal('980'))
|
||||
self.assertEqual(invoice.report_weight_unit_upper, 'LBS')
|
||||
|
||||
def test_invoice_report_shipment_uses_invoice_line_lot_not_first_trade_line(self):
|
||||
'invoice shipment info comes from the lots linked to the invoiced line'
|
||||
Invoice = Pool().get('account.invoice')
|
||||
|
||||
shipment_a = Mock(
|
||||
id=1,
|
||||
bl_date='2026-04-01',
|
||||
bl_number='BL-A',
|
||||
vessel=Mock(vessel_name='VESSEL A'),
|
||||
from_location=Mock(rec_name='LOADING A'),
|
||||
to_location=Mock(rec_name='DISCHARGE A'),
|
||||
controller=Mock(rec_name='CTRL A'),
|
||||
number='SI-A',
|
||||
)
|
||||
shipment_b = Mock(
|
||||
id=2,
|
||||
bl_date='2026-04-05',
|
||||
bl_number='BL-B',
|
||||
vessel=Mock(vessel_name='VESSEL B'),
|
||||
from_location=Mock(rec_name='LOADING B'),
|
||||
to_location=Mock(rec_name='DISCHARGE B'),
|
||||
controller=Mock(rec_name='CTRL B'),
|
||||
number='SI-B',
|
||||
)
|
||||
lot_a = Mock(id=10, lot_type='physic', lot_shipment_in=shipment_a)
|
||||
lot_b = Mock(id=20, lot_type='physic', lot_shipment_in=shipment_b)
|
||||
line_a = Mock(lots=[lot_a])
|
||||
line_b = Mock(lots=[lot_b])
|
||||
purchase = Mock(lines=[line_a, line_b])
|
||||
|
||||
invoice_line = Mock(type='line', lot=lot_b, origin=line_b)
|
||||
invoice = Invoice()
|
||||
invoice.purchases = [purchase]
|
||||
invoice.lines = [invoice_line]
|
||||
|
||||
self.assertEqual(invoice.report_bl_nb, 'BL-B')
|
||||
self.assertEqual(invoice.report_bl_date, '2026-04-05')
|
||||
self.assertEqual(invoice.report_vessel, 'VESSEL B')
|
||||
self.assertEqual(invoice.report_loading_port, 'LOADING B')
|
||||
self.assertEqual(invoice.report_discharge_port, 'DISCHARGE B')
|
||||
self.assertEqual(invoice.report_controller_name, 'CTRL B')
|
||||
self.assertEqual(invoice.report_si_number, 'SI-B')
|
||||
self.assertEqual(invoice.report_si_reference, 'REF-B')
|
||||
|
||||
def test_invoice_report_shipment_is_blank_if_invoice_mixes_shipments(self):
|
||||
'invoice shipment fields stay empty when multiple shipments are invoiced together'
|
||||
Invoice = Pool().get('account.invoice')
|
||||
|
||||
shipment_a = Mock(
|
||||
id=1,
|
||||
bl_date='2026-04-01',
|
||||
bl_number='BL-A',
|
||||
vessel=Mock(vessel_name='VESSEL A'),
|
||||
from_location=Mock(rec_name='LOADING A'),
|
||||
to_location=Mock(rec_name='DISCHARGE A'),
|
||||
controller=Mock(rec_name='CTRL A'),
|
||||
number='SI-A',
|
||||
)
|
||||
shipment_b = Mock(
|
||||
id=2,
|
||||
bl_date='2026-04-05',
|
||||
bl_number='BL-B',
|
||||
reference='REF-B',
|
||||
vessel=Mock(vessel_name='VESSEL B'),
|
||||
from_location=Mock(rec_name='LOADING B'),
|
||||
to_location=Mock(rec_name='DISCHARGE B'),
|
||||
controller=Mock(rec_name='CTRL B'),
|
||||
number='SI-B',
|
||||
)
|
||||
lot_a = Mock(id=10, lot_type='physic', lot_shipment_in=shipment_a)
|
||||
lot_b = Mock(id=20, lot_type='physic', lot_shipment_in=shipment_b)
|
||||
line_a = Mock(type='line', lot=lot_a, origin=Mock(lots=[lot_a]))
|
||||
line_b = Mock(type='line', lot=lot_b, origin=Mock(lots=[lot_b]))
|
||||
invoice = Invoice()
|
||||
invoice.lines = [line_a, line_b]
|
||||
|
||||
self.assertIsNone(invoice.report_bl_nb)
|
||||
self.assertIsNone(invoice.report_bl_date)
|
||||
self.assertEqual(invoice.report_vessel, None)
|
||||
self.assertEqual(invoice.report_loading_port, '')
|
||||
self.assertEqual(invoice.report_discharge_port, '')
|
||||
self.assertEqual(invoice.report_controller_name, '')
|
||||
self.assertEqual(invoice.report_si_number, '')
|
||||
self.assertEqual(invoice.report_si_reference, '')
|
||||
|
||||
def test_invoice_report_nb_bale_sums_signed_line_lot_quantities(self):
|
||||
'invoice reports packaging from the signed sum of line lot_qt values'
|
||||
Invoice = Pool().get('account.invoice')
|
||||
@@ -840,6 +1577,18 @@ class PurchaseTradeTestCase(ModuleTestCase):
|
||||
|
||||
self.assertEqual(invoice.report_nb_bale, 'NB BALES: 0')
|
||||
|
||||
def test_invoice_report_cndn_nb_bale_displays_unchanged_for_zero(self):
|
||||
'CN/DN bale label displays Unchanged when the signed balance is zero'
|
||||
Invoice = Pool().get('account.invoice')
|
||||
|
||||
lot = Mock(lot_qt=Decimal('350'), lot_unit=Mock(symbol='bale'))
|
||||
negative = Mock(type='line', quantity=Decimal('-1000'), lot=lot)
|
||||
positive = Mock(type='line', quantity=Decimal('1000'), lot=lot)
|
||||
invoice = Invoice()
|
||||
invoice.lines = [negative, positive]
|
||||
|
||||
self.assertEqual(invoice.report_cndn_nb_bale, 'Unchanged')
|
||||
|
||||
def test_invoice_report_positive_rate_lines_keep_positive_components(self):
|
||||
'invoice final note pricing section keeps only positive component lines'
|
||||
Invoice = Pool().get('account.invoice')
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
<prefix name="qt_icon"/>
|
||||
</field>
|
||||
<field name="r_lot_p" width="60"/>
|
||||
<field name="r_del_period" width="110"/>
|
||||
<field name="r_supplier" width="90"/>
|
||||
<field name="r_purchase" width="120"/>
|
||||
<field name="r_lot_pur_inv" width="120"/>
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
<field name="lot_shipment_origin"/>
|
||||
<field name="lot_product"/>
|
||||
<field name="lot_unit_line"/>
|
||||
<field name="lot_qt"/>
|
||||
<field name="lot_quantity"/>
|
||||
<field name="lot_gross_quantity"/>
|
||||
<field name="lot_quantity_new"/>
|
||||
|
||||
@@ -29,4 +29,6 @@
|
||||
<field name="shipment_shipping_report_template" colspan="3"/>
|
||||
<label name="shipment_insurance_report_template"/>
|
||||
<field name="shipment_insurance_report_template" colspan="3"/>
|
||||
<label name="shipment_packing_list_report_template"/>
|
||||
<field name="shipment_packing_list_report_template" colspan="3"/>
|
||||
</form>
|
||||
|
||||
@@ -1,30 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta: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:rpt="http://openoffice.org/2005/report" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d: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:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field: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:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:officeooo="http://openoffice.org/2009/office" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text">
|
||||
<office:meta>
|
||||
<meta:generator>LibreOffice/7.6.0.3$Windows_X86_64 LibreOffice_project/69edd8b8ebc41d00b4de3915dc82f8f0fc3b6265</meta:generator>
|
||||
<dc:date>2026-03-15T13:01:38.668000000</dc:date><meta:editing-duration>PT10M4S</meta:editing-duration><meta:editing-cycles>1</meta:editing-cycles><meta:document-statistic meta:table-count="7" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="22" meta:word-count="122" meta:character-count="932" meta:non-whitespace-character-count="828"/></office:meta>
|
||||
<office:meta><meta:initial-creator>Giorgio Calligaro</meta:initial-creator><meta:creation-date>2026-03-12T13:26:00</meta:creation-date><dc:date>2026-03-12T17:30:00</dc:date><meta:print-date>2026-03-12T17:29:00</meta:print-date><meta:editing-cycles>3</meta:editing-cycles><meta:editing-duration>P0D</meta:editing-duration><meta:document-statistic meta:table-count="1" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="11" meta:word-count="30" meta:character-count="221" meta:non-whitespace-character-count="186"/><meta:generator>LibreOffice/7.6.0.3$Windows_X86_64 LibreOffice_project/69edd8b8ebc41d00b4de3915dc82f8f0fc3b6265</meta:generator><meta:user-defined meta:name="Company">Fintel S.A.</meta:user-defined><meta:user-defined meta:name="Operator">HACER</meta:user-defined></office:meta>
|
||||
<office:settings>
|
||||
<config:config-item-set config:name="ooo:view-settings">
|
||||
<config:config-item config:name="ViewAreaTop" config:type="long">0</config:config-item>
|
||||
<config:config-item config:name="ViewAreaLeft" config:type="long">0</config:config-item>
|
||||
<config:config-item config:name="ViewAreaWidth" config:type="long">31487</config:config-item>
|
||||
<config:config-item config:name="ViewAreaHeight" config:type="long">15713</config:config-item>
|
||||
<config:config-item config:name="ViewAreaWidth" config:type="long">43623</config:config-item>
|
||||
<config:config-item config:name="ViewAreaHeight" config:type="long">21098</config:config-item>
|
||||
<config:config-item config:name="ShowRedlineChanges" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="InBrowseMode" config:type="boolean">false</config:config-item>
|
||||
<config:config-item-map-indexed config:name="Views">
|
||||
<config:config-item-map-entry>
|
||||
<config:config-item config:name="ViewId" config:type="string">view2</config:config-item>
|
||||
<config:config-item config:name="ViewLeft" config:type="long">6627</config:config-item>
|
||||
<config:config-item config:name="ViewTop" config:type="long">7108</config:config-item>
|
||||
<config:config-item config:name="ViewLeft" config:type="long">17221</config:config-item>
|
||||
<config:config-item config:name="ViewTop" config:type="long">7202</config:config-item>
|
||||
<config:config-item config:name="VisibleLeft" config:type="long">0</config:config-item>
|
||||
<config:config-item config:name="VisibleTop" config:type="long">0</config:config-item>
|
||||
<config:config-item config:name="VisibleRight" config:type="long">31485</config:config-item>
|
||||
<config:config-item config:name="VisibleBottom" config:type="long">15711</config:config-item>
|
||||
<config:config-item config:name="VisibleRight" config:type="long">43621</config:config-item>
|
||||
<config:config-item config:name="VisibleBottom" config:type="long">21096</config:config-item>
|
||||
<config:config-item config:name="ZoomType" config:type="short">0</config:config-item>
|
||||
<config:config-item config:name="ViewLayoutColumns" config:type="short">0</config:config-item>
|
||||
<config:config-item config:name="ViewLayoutBookMode" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ZoomFactor" config:type="short">140</config:config-item>
|
||||
<config:config-item config:name="ZoomFactor" config:type="short">100</config:config-item>
|
||||
<config:config-item config:name="IsSelectedFrame" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="KeepRatio" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="AnchoredTextOverflowLegacy" config:type="boolean">false</config:config-item>
|
||||
@@ -37,9 +35,9 @@
|
||||
<config:config-item-set config:name="ooo:configuration-settings">
|
||||
<config:config-item config:name="AlignTabStopPosition" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="PrinterSetup" config:type="base64Binary"/>
|
||||
<config:config-item config:name="AddParaTableSpacing" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="AddParaTableSpacing" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="IgnoreFirstLineIndentInNumbering" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="TabAtLeftIndentForParagraphsInList" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="TabAtLeftIndentForParagraphsInList" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ChartAutoUpdate" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="LinkUpdateMode" config:type="short">1</config:config-item>
|
||||
@@ -68,13 +66,13 @@
|
||||
<config:config-item config:name="PrinterIndependentLayout" config:type="string">high-resolution</config:config-item>
|
||||
<config:config-item config:name="IsLabelDocument" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ClippedPictures" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="AddFrameOffsets" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="AddFrameOffsets" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="AddVerticalFrameOffsets" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="AddExternalLeading" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="UnbreakableNumberings" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="HeaderSpacingBelowLastPara" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="TabsRelativeToIndent" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="TableRowKeep" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="HeaderSpacingBelowLastPara" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="TabsRelativeToIndent" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="TableRowKeep" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="OutlineLevelYieldsNumbering" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="AllowPrintJobCancel" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="TabOverflow" config:type="boolean">true</config:config-item>
|
||||
@@ -93,11 +91,11 @@
|
||||
<config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ClipAsCharacterAnchoredWriterFlyFrames" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="UseOldPrinterMetrics" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="Rsid" config:type="int">1907347</config:config-item>
|
||||
<config:config-item config:name="RsidRoot" config:type="int">1907347</config:config-item>
|
||||
<config:config-item config:name="Rsid" config:type="int">1475016</config:config-item>
|
||||
<config:config-item config:name="RsidRoot" config:type="int">1475016</config:config-item>
|
||||
<config:config-item config:name="ProtectForm" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="MsWordCompTrailingBlanks" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="MsWordCompMinLineHeightByFly" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="MsWordCompTrailingBlanks" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="MsWordCompMinLineHeightByFly" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="MathBaselineAlignment" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="SmallCapsPercentage66" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item>
|
||||
@@ -106,24 +104,25 @@
|
||||
<config:config-item config:name="EmbedOnlyUsedFonts" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="EmbedLatinScriptFonts" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="EmbedAsianScriptFonts" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="TabOverMargin" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ApplyParagraphMarkFormatToNumbering" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="TabOverMargin" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="ApplyParagraphMarkFormatToNumbering" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="TabOverSpacing" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="TreatSingleColumnBreakAsPageBreak" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="SurroundTextWrapSmall" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="SurroundTextWrapSmall" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="PropLineSpacingShrinksFirstLine" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="SubtractFlysAnchoredAtFlys" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="EmptyDbFieldHidesPara" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="EmptyDbFieldHidesPara" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="ContinuousEndnotes" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ProtectBookmarks" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ProtectFields" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="FrameAutowidthWithMorePara" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="FrameAutowidthWithMorePara" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="GutterAtTop" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="FootnoteInColumnToPageEnd" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="ImagePreferredDPI" config:type="int">0</config:config-item>
|
||||
<config:config-item config:name="AutoFirstLineIndentDisregardLineSpace" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="HyphenateURLs" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="NoNumberingShowFollowBy" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="DoNotBreakWrappedTables" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="NoNumberingShowFollowBy" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="DropCapPunctuation" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="PrintAnnotationMode" config:type="short">0</config:config-item>
|
||||
<config:config-item config:name="PrintPageBackground" config:type="boolean">true</config:config-item>
|
||||
@@ -151,11 +150,15 @@
|
||||
</office:scripts>
|
||||
<office:font-face-decls>
|
||||
<style:font-face style:name="Arial" svg:font-family="Arial" style:font-family-generic="roman" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Arial1" svg:font-family="Arial" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Calibri" svg:font-family="Calibri" style:font-family-generic="roman" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Liberation Sans" svg:font-family="'Liberation Sans'" style:font-family-generic="swiss" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Liberation Serif" svg:font-family="'Liberation Serif'" style:font-family-generic="roman" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Lucida Sans" svg:font-family="'Lucida Sans'" style:font-family-generic="swiss"/>
|
||||
<style:font-face style:name="Lucida Sans1" svg:font-family="'Lucida Sans'" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Microsoft YaHei" svg:font-family="'Microsoft YaHei'" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="NSimSun" svg:font-family="NSimSun" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Times New Roman" svg:font-family="'Times New Roman'" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
</office:font-face-decls>
|
||||
<office:styles>
|
||||
<style:default-style style:family="graphic">
|
||||
@@ -163,11 +166,11 @@
|
||||
<style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" loext:tab-stop-distance="0cm" style:writing-mode="lr-tb" style:font-independent-line-spacing="false">
|
||||
<style:tab-stops/>
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Arial" fo:font-size="9pt" fo:language="en" fo:country="GB" style:letter-kerning="true" style:font-name-asian="NSimSun" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Lucida Sans1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/>
|
||||
<style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="en" fo:country="GB" style:letter-kerning="true" style:font-name-asian="NSimSun" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Lucida Sans1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/>
|
||||
</style:default-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:tab-stop-distance="1.251cm" style:writing-mode="page"/>
|
||||
<style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Arial" fo:font-size="9pt" fo:language="en" fo:country="GB" style:letter-kerning="true" style:font-name-asian="NSimSun" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Lucida Sans1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="5" loext:hyphenation-zone="no-limit"/>
|
||||
<style:paragraph-properties fo:hyphenation-ladder-count="no-limit" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="1.249cm" style:writing-mode="page"/>
|
||||
<style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="en" fo:country="GB" style:letter-kerning="true" style:font-name-asian="NSimSun" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Lucida Sans1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="5" loext:hyphenation-zone="no-limit"/>
|
||||
</style:default-style>
|
||||
<style:default-style style:family="table">
|
||||
<style:table-properties table:border-model="collapsing"/>
|
||||
@@ -175,7 +178,10 @@
|
||||
<style:default-style style:family="table-row">
|
||||
<style:table-row-properties fo:keep-together="auto"/>
|
||||
</style:default-style>
|
||||
<style:style style:name="Standard" style:family="paragraph" style:class="text"/>
|
||||
<style:style style:name="Standard" style:family="paragraph" style:class="text">
|
||||
<style:paragraph-properties fo:text-align="start" style:justify-single-word="false" fo:orphans="2" fo:widows="2" style:vertical-align="auto"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-family="Arial" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="11pt" fo:language="fr" fo:country="FR" style:font-name-asian="Times New Roman" style:font-family-asian="'Times New Roman'" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="11pt" style:language-asian="fr" style:country-asian="FR" style:font-name-complex="Arial1" style:font-family-complex="Arial" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="11pt" style:language-complex="ar" style:country-complex="SA"/>
|
||||
</style:style>
|
||||
<style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text">
|
||||
<style:paragraph-properties fo:margin-top="0.423cm" fo:margin-bottom="0.212cm" style:contextual-spacing="false" fo:keep-with-next="always"/>
|
||||
<style:text-properties style:font-name="Liberation Sans" fo:font-family="'Liberation Sans'" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-asian="Microsoft YaHei" style:font-family-asian="'Microsoft YaHei'" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="14pt" style:font-name-complex="Lucida Sans1" style:font-family-complex="'Lucida Sans'" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt"/>
|
||||
@@ -194,12 +200,12 @@
|
||||
<style:paragraph-properties text:number-lines="false" text:line-number="0"/>
|
||||
<style:text-properties style:font-size-asian="12pt" style:font-name-complex="Lucida Sans" style:font-family-complex="'Lucida Sans'" style:font-family-generic-complex="swiss"/>
|
||||
</style:style>
|
||||
<style:style style:name="Table_20_Contents" style:display-name="Table Contents" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
|
||||
<style:paragraph-properties fo:orphans="0" fo:widows="0" text:number-lines="false" text:line-number="0"/>
|
||||
</style:style>
|
||||
<style:style style:name="Placeholder" style:family="text">
|
||||
<style:text-properties fo:font-variant="small-caps" fo:color="#008080" loext:opacity="100%" style:text-underline-style="dotted" style:text-underline-width="auto" style:text-underline-color="font-color"/>
|
||||
<style:style style:name="Normal_20_Table_20__28_WW_29_" style:display-name="Normal Table (WW)" style:family="paragraph">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.353cm" style:contextual-spacing="false" fo:line-height="115%" fo:text-align="start" style:justify-single-word="false" fo:orphans="2" fo:widows="2" style:vertical-align="auto"/>
|
||||
<style:text-properties style:font-name="Calibri" fo:font-family="Calibri" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="11pt" fo:language="en" fo:country="GB" style:font-name-asian="Times New Roman" style:font-family-asian="'Times New Roman'" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="11pt" style:language-asian="en" style:country-asian="GB" style:font-name-complex="Times New Roman" style:font-family-complex="'Times New Roman'" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="11pt" style:language-complex="ar" style:country-complex="SA"/>
|
||||
</style:style>
|
||||
<style:style style:name="Style1" style:family="paragraph" style:parent-style-name="Standard"/>
|
||||
<style:style style:name="Default_20_Paragraph_20_Font_20__28_WW_29_" style:display-name="Default Paragraph Font (WW)" style:family="text"/>
|
||||
<text:outline-style style:name="Outline">
|
||||
<text:outline-level-style text:level="1" style:num-format="">
|
||||
<style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
|
||||
@@ -255,6 +261,9 @@
|
||||
<text:notes-configuration text:note-class="footnote" style:num-format="1" text:start-value="0" text:footnotes-position="page" text:start-numbering-at="document"/>
|
||||
<text:notes-configuration text:note-class="endnote" style:num-format="i" text:start-value="0"/>
|
||||
<text:linenumbering-configuration text:number-lines="false" text:offset="0.499cm" style:num-format="1" text:number-position="left" text:increment="5"/>
|
||||
<style:default-page-layout>
|
||||
<style:page-layout-properties style:layout-grid-standard-mode="true"/>
|
||||
</style:default-page-layout>
|
||||
<loext:theme loext:name="Office Theme">
|
||||
<loext:theme-colors loext:name="LibreOffice">
|
||||
<loext:color loext:name="dark1" loext:color="#000000"/>
|
||||
@@ -273,239 +282,154 @@
|
||||
</loext:theme>
|
||||
</office:styles>
|
||||
<office:automatic-styles>
|
||||
<style:style style:name="BillOfExchange" style:family="table">
|
||||
<style:table-properties style:width="20.001cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
<style:style style:name="Tableau1" style:family="table">
|
||||
<style:table-properties style:width="15.24cm" fo:margin-left="0.635cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left" style:writing-mode="lr-tb"/>
|
||||
</style:style>
|
||||
<style:style style:name="BillOfExchange.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="4.75cm"/>
|
||||
<style:style style:name="Tableau1.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="1.905cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="BillOfExchange.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="15.251cm"/>
|
||||
<style:style style:name="Tableau1.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="2.54cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="BillOfExchange.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
<style:style style:name="Tableau1.C" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="2.332cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="BillOfExchange.B1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.101cm" fo:border="0.5pt solid #000000"/>
|
||||
<style:style style:name="Tableau1.D" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="1.478cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
<style:style style:name="Tableau1.E" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="0.953cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="4.001cm"/>
|
||||
<style:style style:name="Tableau1.F" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="6.031cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="3.5cm"/>
|
||||
<style:style style:name="Tableau1.1" style:family="table-row">
|
||||
<style:table-row-properties style:min-row-height="2.223cm" fo:keep-together="auto"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.C" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="10.899cm"/>
|
||||
<style:style style:name="Tableau1.A1" style:family="table-cell">
|
||||
<style:table-cell-properties style:vertical-align="" fo:padding-left="0.123cm" fo:padding-right="0.123cm" fo:padding-top="0cm" fo:padding-bottom="0cm" fo:border="none" style:writing-mode="lr-tb"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
<style:style style:name="Tableau1.2" style:family="table-row">
|
||||
<style:table-row-properties fo:keep-together="always"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.C1" style:family="table-cell">
|
||||
<style:table-cell-properties style:vertical-align="middle" fo:padding="0.101cm" fo:border="1.5pt solid #000000"/>
|
||||
<style:style style:name="Tableau1.3" style:family="table-row">
|
||||
<style:table-row-properties fo:keep-together="always"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
<style:style style:name="Tableau1.4" style:family="table-row">
|
||||
<style:table-row-properties fo:keep-together="always"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="4.5cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="13.899cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2.B1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner3" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner3.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="18.399cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner3.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="2.499cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="15.9cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4.B1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="2.499cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="15.9cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5.B1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="2.499cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="3.5cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.F" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="3.902cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.B1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="4.001cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="3.5cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.C" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="10.899cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.C1" style:family="table-cell">
|
||||
<style:table-cell-properties style:vertical-align="middle" fo:padding="0.101cm" fo:border="1.5pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="4.5cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="13.899cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2.B1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner3" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner3.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="18.399cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner3.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="2.499cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="15.9cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4.B1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="2.499cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="15.9cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5.B1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="2.499cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="3.5cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.F" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="3.902cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.B1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
<style:style style:name="Tableau1.5" style:family="table-row">
|
||||
<style:table-row-properties fo:keep-together="auto"/>
|
||||
</style:style>
|
||||
<style:style style:name="P1" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-size="8pt"/>
|
||||
<style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-indent="0cm" style:auto-text-indent="false" style:writing-mode="lr-tb">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="7.303cm"/>
|
||||
<style:tab-stop style:position="10.795cm"/>
|
||||
<style:tab-stop style:position="22.86cm" style:type="right"/>
|
||||
<style:tab-stop style:position="26.988cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
</style:style>
|
||||
<style:style style:name="P2" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-size="8pt" fo:font-weight="bold"/>
|
||||
<style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-indent="0cm" style:auto-text-indent="false" style:writing-mode="lr-tb">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="7.303cm"/>
|
||||
<style:tab-stop style:position="10.795cm"/>
|
||||
<style:tab-stop style:position="22.86cm" style:type="right"/>
|
||||
<style:tab-stop style:position="26.988cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties fo:font-size="8pt" fo:language="en" fo:country="GB" style:font-size-asian="8pt" style:font-size-complex="8pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P3" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:text-align="center" style:justify-single-word="false"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-size="8pt"/>
|
||||
<style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-indent="0cm" style:auto-text-indent="false" style:writing-mode="lr-tb">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="7.303cm"/>
|
||||
<style:tab-stop style:position="10.795cm"/>
|
||||
<style:tab-stop style:position="22.86cm" style:type="right"/>
|
||||
<style:tab-stop style:position="26.988cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties fo:font-size="5pt" fo:language="en" fo:country="GB" fo:font-weight="bold" style:font-size-asian="5pt" style:font-weight-asian="bold" style:font-size-complex="5pt" style:font-weight-complex="bold"/>
|
||||
</style:style>
|
||||
<style:style style:name="P4" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:text-align="end" style:justify-single-word="false"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-size="8pt"/>
|
||||
<style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-indent="0cm" style:auto-text-indent="false" style:writing-mode="lr-tb">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="7.303cm"/>
|
||||
<style:tab-stop style:position="10.795cm"/>
|
||||
<style:tab-stop style:position="22.86cm" style:type="right"/>
|
||||
<style:tab-stop style:position="26.988cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties fo:font-size="3pt" fo:language="en" fo:country="GB" style:font-size-asian="3pt" style:font-size-complex="3pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P5" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-size="7pt"/>
|
||||
<style:style style:name="P5" style:family="paragraph" style:parent-style-name="Style1">
|
||||
<style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-indent="0cm" style:auto-text-indent="false" style:writing-mode="lr-tb">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="7.303cm"/>
|
||||
<style:tab-stop style:position="10.795cm"/>
|
||||
<style:tab-stop style:position="22.86cm" style:type="right"/>
|
||||
<style:tab-stop style:position="26.988cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties fo:font-size="8pt" fo:language="en" fo:country="GB" style:font-size-asian="8pt" style:font-size-complex="8pt" text:display="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="P6" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:text-align="center" style:justify-single-word="false"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-size="7pt"/>
|
||||
<style:style style:name="P6" style:family="paragraph" style:parent-style-name="Style1">
|
||||
<style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-indent="0cm" style:auto-text-indent="false" style:writing-mode="lr-tb">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="7.303cm"/>
|
||||
<style:tab-stop style:position="10.795cm"/>
|
||||
<style:tab-stop style:position="22.86cm" style:type="right"/>
|
||||
<style:tab-stop style:position="26.988cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties fo:font-size="8pt" fo:language="en" fo:country="GB" style:font-size-asian="8pt" style:font-size-complex="8pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P7" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:text-align="center" style:justify-single-word="false"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-size="9pt" fo:font-weight="bold"/>
|
||||
<style:style style:name="P7" style:family="paragraph" style:parent-style-name="Style1">
|
||||
<style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-indent="0cm" style:auto-text-indent="false" style:writing-mode="lr-tb">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="7.303cm"/>
|
||||
<style:tab-stop style:position="10.795cm"/>
|
||||
<style:tab-stop style:position="22.86cm" style:type="right"/>
|
||||
<style:tab-stop style:position="26.988cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
</style:style>
|
||||
<style:style style:name="P8" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:text-align="center" style:justify-single-word="false"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-size="7pt"/>
|
||||
<style:style style:name="P8" style:family="paragraph" style:parent-style-name="Style1">
|
||||
<style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-indent="0cm" style:auto-text-indent="false" style:writing-mode="lr-tb">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="7.303cm"/>
|
||||
<style:tab-stop style:position="10.795cm"/>
|
||||
<style:tab-stop style:position="22.86cm" style:type="right"/>
|
||||
<style:tab-stop style:position="26.988cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties fo:font-size="12pt" fo:language="en" fo:country="GB" style:font-size-asian="12pt" style:font-size-complex="12pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P9" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:text-align="center" style:justify-single-word="false"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-size="7pt" officeooo:paragraph-rsid="001d1a93"/>
|
||||
<style:style style:name="T1" style:family="text">
|
||||
<style:text-properties fo:font-size="8pt" fo:language="en" fo:country="GB" style:font-size-asian="8pt" style:font-size-complex="8pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T2" style:family="text">
|
||||
<style:text-properties fo:font-size="8pt" fo:language="en" fo:country="GB" style:font-size-asian="8pt" style:font-size-complex="8pt" text:display="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="T3" style:family="text">
|
||||
<style:text-properties fo:font-size="8pt" fo:language="en" fo:country="GB" fo:font-weight="bold" style:font-size-asian="8pt" style:font-weight-asian="bold" style:font-size-complex="8pt" style:font-weight-complex="bold"/>
|
||||
</style:style>
|
||||
<style:style style:name="T4" style:family="text">
|
||||
<style:text-properties fo:font-size="12pt" fo:language="en" fo:country="GB" style:font-size-asian="12pt" style:font-size-complex="12pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T5" style:family="text">
|
||||
<style:text-properties fo:language="en" fo:country="GB"/>
|
||||
</style:style>
|
||||
<style:style style:name="T6" style:family="text">
|
||||
<style:text-properties fo:font-size="5pt" fo:language="en" fo:country="GB" fo:font-weight="bold" style:font-size-asian="5pt" style:font-weight-asian="bold" style:font-size-complex="5pt" style:font-weight-complex="bold"/>
|
||||
</style:style>
|
||||
<style:style style:name="T7" style:family="text">
|
||||
<style:text-properties fo:font-size="3pt" fo:language="en" fo:country="GB" style:font-size-asian="3pt" style:font-size-complex="3pt"/>
|
||||
</style:style>
|
||||
<style:page-layout style:name="pm1">
|
||||
<style:page-layout-properties fo:page-width="21.001cm" fo:page-height="9.999cm" style:num-format="1" style:print-orientation="landscape" fo:margin-top="0.4cm" fo:margin-bottom="0.4cm" fo:margin-left="0.499cm" fo:margin-right="0.499cm" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.706cm" style:layout-grid-ruby-height="0.353cm" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0cm" loext:margin-gutter="0cm">
|
||||
<style:page-layout-properties fo:page-width="29.7cm" fo:page-height="21.001cm" style:num-format="1" style:print-orientation="landscape" fo:margin-top="6.701cm" fo:margin-bottom="1.501cm" fo:margin-left="9.502cm" fo:margin-right="1.501cm" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="12798" style:layout-grid-base-height="0.176cm" style:layout-grid-ruby-height="0cm" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:layout-grid-base-width="0.388cm" style:layout-grid-snap-to="true" style:footnote-max-height="0cm" loext:margin-gutter="0cm">
|
||||
<style:footnote-sep style:width="0.018cm" style:distance-before-sep="0.101cm" style:distance-after-sep="0.101cm" style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>
|
||||
</style:page-layout-properties>
|
||||
<style:header-style/>
|
||||
@@ -527,127 +451,103 @@
|
||||
<text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
|
||||
<text:sequence-decl text:display-outline-level="0" text:name="Figure"/>
|
||||
</text:sequence-decls>
|
||||
<text:p text:style-name="P1"><text:placeholder text:placeholder-type="text"><for each="sale in records"></text:placeholder></text:p>
|
||||
<table:table table:name="BillOfExchange" table:style-name="BillOfExchange">
|
||||
<table:table-column table:style-name="BillOfExchange.A"/>
|
||||
<table:table-column table:style-name="BillOfExchange.B"/>
|
||||
<table:table-row>
|
||||
<table:table-cell table:style-name="BillOfExchange.A1" table:number-rows-spanned="2" office:value-type="string">
|
||||
<text:p text:style-name="P6">Accepted by:</text:p>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P9">Per aval:</text:p>
|
||||
<text:p text:style-name="P5" loext:marker-style-name="T2"><text:placeholder text:placeholder-type="text"><for each="sale in records"></text:placeholder></text:p>
|
||||
<table:table table:name="Tableau1" table:style-name="Tableau1">
|
||||
<table:table-column table:style-name="Tableau1.A"/>
|
||||
<table:table-column table:style-name="Tableau1.B"/>
|
||||
<table:table-column table:style-name="Tableau1.C"/>
|
||||
<table:table-column table:style-name="Tableau1.D"/>
|
||||
<table:table-column table:style-name="Tableau1.E"/>
|
||||
<table:table-column table:style-name="Tableau1.F"/>
|
||||
<table:table-row table:style-name="Tableau1.1">
|
||||
<table:table-cell table:style-name="Tableau1.A1" office:value-type="string">
|
||||
<text:p text:style-name="P6" loext:marker-style-name="T1"/>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="BillOfExchange.B1" office:value-type="string">
|
||||
<table:table table:name="Inner1" table:style-name="Inner1">
|
||||
<table:table-column table:style-name="Inner1.A"/>
|
||||
<table:table-column table:style-name="Inner1.B"/>
|
||||
<table:table-column table:style-name="Inner1.C"/>
|
||||
<table:table-row>
|
||||
<table:table-cell table:style-name="Inner1.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1">Geneva, <text:placeholder text:placeholder-type="text"><format_date(sale.sale_date, sale.party.lang)></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner1.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1">For</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner1.C1" office:value-type="string">
|
||||
<text:p text:style-name="P7"><text:placeholder text:placeholder-type="text"><format_currency(sale.lines[0].unit_price, sale.party.lang, sale.currency) if sale.lines else ''></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<table:table table:name="Inner2" table:style-name="Inner2">
|
||||
<table:table-column table:style-name="Inner2.A"/>
|
||||
<table:table-column table:style-name="Inner2.B"/>
|
||||
<table:table-row>
|
||||
<table:table-cell table:style-name="Inner2.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1">At / on <text:placeholder text:placeholder-type="text"><sale.payment_term.rec_name if sale.payment_term else ''></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner2.B1" office:value-type="string">
|
||||
<text:p text:style-name="P1">for value received, please pay against this sole Bill of Exchange</text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<text:p text:style-name="P1">to our order of Melya S.A., Switzerland, the amount of</text:p>
|
||||
<table:table table:name="Inner3" table:style-name="Inner3">
|
||||
<table:table-column table:style-name="Inner3.A"/>
|
||||
<table:table-row>
|
||||
<table:table-cell table:style-name="Inner3.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1"> </text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<text:p text:style-name="P5">effective payment to be made in <text:placeholder text:placeholder-type="text"><sale.currency.symbol if sale.currency else ''></text:placeholder> only, without deduction for and free of any taxes, impost, levies or duties present or future of any nature under the laws of <text:placeholder text:placeholder-type="text"><sale.party.addresses[0].country.name if sale.party and sale.party.addresses else ''></text:placeholder> or any political subdivision thereof or therein.</text:p>
|
||||
<table:table table:name="Inner4" table:style-name="Inner4">
|
||||
<table:table-column table:style-name="Inner4.A"/>
|
||||
<table:table-column table:style-name="Inner4.B"/>
|
||||
<table:table-row>
|
||||
<table:table-cell table:style-name="Inner4.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1">Payable at</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner4.B1" office:value-type="string">
|
||||
<text:p text:style-name="P1"><text:placeholder text:placeholder-type="text"><sale.party.addresses[0].city if sale.party and sale.party.addresses else ''></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<table:table table:name="Inner5" table:style-name="Inner5">
|
||||
<table:table-column table:style-name="Inner5.A"/>
|
||||
<table:table-column table:style-name="Inner5.B"/>
|
||||
<table:table-row>
|
||||
<table:table-cell table:style-name="Inner5.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1">Drawn on at</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner5.B1" office:value-type="string">
|
||||
<text:p text:style-name="P1"><text:placeholder text:placeholder-type="text"><sale.party.rec_name></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<table:table table:name="Inner6" table:style-name="Inner6">
|
||||
<table:table-column table:style-name="Inner6.A"/>
|
||||
<table:table-column table:style-name="Inner6.B"/>
|
||||
<table:table-column table:style-name="Inner6.A"/>
|
||||
<table:table-column table:style-name="Inner6.B"/>
|
||||
<table:table-column table:style-name="Inner6.A"/>
|
||||
<table:table-column table:style-name="Inner6.F"/>
|
||||
<table:table-row>
|
||||
<table:table-cell table:style-name="Inner6.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1">No</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner6.B1" office:value-type="string">
|
||||
<text:p text:style-name="P1"> </text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner6.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1">/ Invoice No</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner6.B1" office:value-type="string">
|
||||
<text:p text:style-name="P1"><text:placeholder text:placeholder-type="text"><sale.full_number></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner6.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1">/ D:</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner6.B1" office:value-type="string">
|
||||
<text:p text:style-name="P1"><text:placeholder text:placeholder-type="text"><sale.reference if sale.reference else ''></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<table:table-cell table:style-name="Tableau1.A1" table:number-columns-spanned="2" office:value-type="string">
|
||||
<text:p text:style-name="P7" loext:marker-style-name="T1"><text:span text:style-name="T1"><text:placeholder text:placeholder-type="text"><format_date(sale.sale_date, sale.party.lang)></text:placeholder></text:span><text:span text:style-name="T1"/></text:p>
|
||||
<text:p text:style-name="P8" loext:marker-style-name="T4"/>
|
||||
<text:p text:style-name="P7" loext:marker-style-name="T1"><text:span text:style-name="T1"><text:placeholder text:placeholder-type="text"><format_date(sale.report_bill_maturity_date, sale.party.lang) if sale.report_bill_maturity_date else ''></text:placeholder></text:span><text:span text:style-name="T1"/></text:p>
|
||||
<text:p text:style-name="P6" loext:marker-style-name="T1"/>
|
||||
<text:p text:style-name="P6" loext:marker-style-name="T1"/>
|
||||
<text:p text:style-name="P6" loext:marker-style-name="T1"/>
|
||||
</table:table-cell>
|
||||
<table:covered-table-cell/>
|
||||
<table:table-cell table:style-name="Tableau1.A1" table:number-columns-spanned="2" office:value-type="string">
|
||||
<text:p text:style-name="P6" loext:marker-style-name="T1"/>
|
||||
</table:table-cell>
|
||||
<table:covered-table-cell/>
|
||||
<table:table-cell table:style-name="Tableau1.A1" office:value-type="string">
|
||||
<text:p text:style-name="P7" loext:marker-style-name="T5"><text:span text:style-name="T3"><text:placeholder text:placeholder-type="text"><format_currency(sale.report_bill_amount, sale.party.lang, sale.currency)></text:placeholder></text:span><text:span text:style-name="T3"/></text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
<table:table-row>
|
||||
<table:covered-table-cell table:style-name="BillOfExchange.A1"/>
|
||||
<table:table-cell table:style-name="BillOfExchange.A1" office:value-type="string">
|
||||
<text:p text:style-name="P6"/>
|
||||
<table:table-row table:style-name="Tableau1.2">
|
||||
<table:table-cell table:style-name="Tableau1.A1" table:number-columns-spanned="6" office:value-type="string">
|
||||
<text:p text:style-name="P1" loext:marker-style-name="T1"><text:span text:style-name="T1">***<text:placeholder text:placeholder-type="text"><sale.report_bill_amount_words></text:placeholder>***</text:span><text:span text:style-name="T1"/></text:p>
|
||||
<text:p text:style-name="P2" loext:marker-style-name="T1"/>
|
||||
</table:table-cell>
|
||||
<table:covered-table-cell/>
|
||||
<table:covered-table-cell/>
|
||||
<table:covered-table-cell/>
|
||||
<table:covered-table-cell/>
|
||||
<table:covered-table-cell/>
|
||||
</table:table-row>
|
||||
<table:table-row table:style-name="Tableau1.3">
|
||||
<table:table-cell table:style-name="Tableau1.A1" office:value-type="string">
|
||||
<text:p text:style-name="P2" loext:marker-style-name="T1"/>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau1.A1" office:value-type="string">
|
||||
<text:p text:style-name="P2" loext:marker-style-name="T1"/>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau1.A1" table:number-columns-spanned="4" office:value-type="string">
|
||||
<text:p text:style-name="P1" loext:marker-style-name="T1"><text:span text:style-name="T1"><text:placeholder text:placeholder-type="text"><sale.currency.symbol if sale.currency else ''></text:placeholder></text:span><text:span text:style-name="T1"/></text:p>
|
||||
<text:p text:style-name="P3" loext:marker-style-name="T6"/>
|
||||
<text:p text:style-name="P1" loext:marker-style-name="T1"><text:span text:style-name="T1"><text:s text:c="13"/><text:placeholder text:placeholder-type="text"><(sale.party.addresses[0].country.name.upper()) if sale.party and sale.party.addresses and sale.party.addresses[0].country else ''></text:placeholder></text:span><text:span text:style-name="T1"/></text:p>
|
||||
<text:p text:style-name="P2" loext:marker-style-name="T1"/>
|
||||
<text:p text:style-name="P2" loext:marker-style-name="T1"/>
|
||||
<text:p text:style-name="P2" loext:marker-style-name="T1"/>
|
||||
<text:p text:style-name="P2" loext:marker-style-name="T1"/>
|
||||
<text:p text:style-name="P2" loext:marker-style-name="T1"/>
|
||||
</table:table-cell>
|
||||
<table:covered-table-cell/>
|
||||
<table:covered-table-cell/>
|
||||
<table:covered-table-cell/>
|
||||
</table:table-row>
|
||||
<table:table-row table:style-name="Tableau1.4">
|
||||
<table:table-cell table:style-name="Tableau1.A1" office:value-type="string">
|
||||
<text:p text:style-name="P2" loext:marker-style-name="T1"/>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau1.A1" table:number-columns-spanned="5" office:value-type="string">
|
||||
<text:p text:style-name="P4" loext:marker-style-name="T7"/>
|
||||
<text:p text:style-name="P2" loext:marker-style-name="T1"/>
|
||||
<text:p text:style-name="P1" loext:marker-style-name="T1"><text:span text:style-name="T1"><text:placeholder text:placeholder-type="text"><sale.party.rec_name></text:placeholder></text:span><text:span text:style-name="T1"/></text:p>
|
||||
<text:p text:style-name="P1" loext:marker-style-name="T1"><text:span text:style-name="T1"><text:placeholder text:placeholder-type="text"><sale.full_number></text:placeholder></text:span><text:span text:style-name="T1"/></text:p>
|
||||
<text:p text:style-name="P1" loext:marker-style-name="T1"><text:span text:style-name="T1"><text:placeholder text:placeholder-type="text"><sale.party.addresses[0].city if sale.party and sale.party.addresses else ''></text:placeholder></text:span><text:span text:style-name="T1"/></text:p>
|
||||
<text:p text:style-name="P1" loext:marker-style-name="T1"><text:span text:style-name="T1"><text:placeholder text:placeholder-type="text"><sale.reference if sale.reference else ''></text:placeholder></text:span><text:span text:style-name="T1"/></text:p>
|
||||
<text:p text:style-name="P2" loext:marker-style-name="T1"/>
|
||||
</table:table-cell>
|
||||
<table:covered-table-cell/>
|
||||
<table:covered-table-cell/>
|
||||
<table:covered-table-cell/>
|
||||
<table:covered-table-cell/>
|
||||
</table:table-row>
|
||||
<table:table-row table:style-name="Tableau1.5">
|
||||
<table:table-cell table:style-name="Tableau1.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1" loext:marker-style-name="T5"><text:span text:style-name="T1"><text:s/></text:span><text:span text:style-name="T1"/></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau1.A1" office:value-type="string">
|
||||
<text:p text:style-name="P2" loext:marker-style-name="T1"/>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau1.A1" table:number-columns-spanned="2" office:value-type="string">
|
||||
<text:p text:style-name="P2" loext:marker-style-name="T1"/>
|
||||
</table:table-cell>
|
||||
<table:covered-table-cell/>
|
||||
<table:table-cell table:style-name="Tableau1.A1" table:number-columns-spanned="2" office:value-type="string">
|
||||
<text:p text:style-name="P2" loext:marker-style-name="T1"/>
|
||||
</table:table-cell>
|
||||
<table:covered-table-cell/>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<text:p text:style-name="P1"><text:placeholder text:placeholder-type="text"></for></text:placeholder></text:p>
|
||||
<text:p text:style-name="P2" loext:marker-style-name="T1"><text:placeholder text:placeholder-type="text"></for></text:placeholder></text:p>
|
||||
</office:text>
|
||||
</office:body>
|
||||
</office:document>
|
||||
</office:document>
|
||||
|
||||
653
modules/sale/bill_old.fodt
Normal file
653
modules/sale/bill_old.fodt
Normal file
@@ -0,0 +1,653 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta: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:rpt="http://openoffice.org/2005/report" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d: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:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field: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:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:officeooo="http://openoffice.org/2009/office" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text">
|
||||
<office:meta>
|
||||
<meta:generator>LibreOffice/7.6.0.3$Windows_X86_64 LibreOffice_project/69edd8b8ebc41d00b4de3915dc82f8f0fc3b6265</meta:generator>
|
||||
<dc:date>2026-03-15T13:01:38.668000000</dc:date><meta:editing-duration>PT10M4S</meta:editing-duration><meta:editing-cycles>1</meta:editing-cycles><meta:document-statistic meta:table-count="7" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="22" meta:word-count="122" meta:character-count="932" meta:non-whitespace-character-count="828"/></office:meta>
|
||||
<office:settings>
|
||||
<config:config-item-set config:name="ooo:view-settings">
|
||||
<config:config-item config:name="ViewAreaTop" config:type="long">0</config:config-item>
|
||||
<config:config-item config:name="ViewAreaLeft" config:type="long">0</config:config-item>
|
||||
<config:config-item config:name="ViewAreaWidth" config:type="long">31487</config:config-item>
|
||||
<config:config-item config:name="ViewAreaHeight" config:type="long">15713</config:config-item>
|
||||
<config:config-item config:name="ShowRedlineChanges" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="InBrowseMode" config:type="boolean">false</config:config-item>
|
||||
<config:config-item-map-indexed config:name="Views">
|
||||
<config:config-item-map-entry>
|
||||
<config:config-item config:name="ViewId" config:type="string">view2</config:config-item>
|
||||
<config:config-item config:name="ViewLeft" config:type="long">6627</config:config-item>
|
||||
<config:config-item config:name="ViewTop" config:type="long">7108</config:config-item>
|
||||
<config:config-item config:name="VisibleLeft" config:type="long">0</config:config-item>
|
||||
<config:config-item config:name="VisibleTop" config:type="long">0</config:config-item>
|
||||
<config:config-item config:name="VisibleRight" config:type="long">31485</config:config-item>
|
||||
<config:config-item config:name="VisibleBottom" config:type="long">15711</config:config-item>
|
||||
<config:config-item config:name="ZoomType" config:type="short">0</config:config-item>
|
||||
<config:config-item config:name="ViewLayoutColumns" config:type="short">0</config:config-item>
|
||||
<config:config-item config:name="ViewLayoutBookMode" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ZoomFactor" config:type="short">140</config:config-item>
|
||||
<config:config-item config:name="IsSelectedFrame" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="KeepRatio" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="AnchoredTextOverflowLegacy" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="LegacySingleLineFontwork" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ConnectorUseSnapRect" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="IgnoreBreakAfterMultilineField" config:type="boolean">false</config:config-item>
|
||||
</config:config-item-map-entry>
|
||||
</config:config-item-map-indexed>
|
||||
</config:config-item-set>
|
||||
<config:config-item-set config:name="ooo:configuration-settings">
|
||||
<config:config-item config:name="AlignTabStopPosition" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="PrinterSetup" config:type="base64Binary"/>
|
||||
<config:config-item config:name="AddParaTableSpacing" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="IgnoreFirstLineIndentInNumbering" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="TabAtLeftIndentForParagraphsInList" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ChartAutoUpdate" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="LinkUpdateMode" config:type="short">1</config:config-item>
|
||||
<config:config-item config:name="FieldAutoUpdate" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="UnxForceZeroExtLeading" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="UseOldNumbering" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="AddParaTableSpacingAtStart" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="PrinterName" config:type="string"/>
|
||||
<config:config-item config:name="InvertBorderSpacing" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="RedlineProtectionKey" config:type="base64Binary"/>
|
||||
<config:config-item config:name="UseFormerTextWrapping" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="PrinterPaperFromSetup" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="BackgroundParaOverDrawings" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="CurrentDatabaseCommand" config:type="string"/>
|
||||
<config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item>
|
||||
<config:config-item config:name="DisableOffPagePositioning" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ApplyUserData" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="SaveThumbnail" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="StylesNoDefault" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="SaveGlobalDocumentLinks" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="CurrentDatabaseDataSource" config:type="string"/>
|
||||
<config:config-item config:name="CurrentDatabaseCommandType" config:type="int">0</config:config-item>
|
||||
<config:config-item config:name="EmbeddedDatabaseName" config:type="string"/>
|
||||
<config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="PrinterIndependentLayout" config:type="string">high-resolution</config:config-item>
|
||||
<config:config-item config:name="IsLabelDocument" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ClippedPictures" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="AddFrameOffsets" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="AddVerticalFrameOffsets" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="AddExternalLeading" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="UnbreakableNumberings" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="HeaderSpacingBelowLastPara" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="TabsRelativeToIndent" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="TableRowKeep" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="OutlineLevelYieldsNumbering" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="AllowPrintJobCancel" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="TabOverflow" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="UseFormerLineSpacing" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="AddParaSpacingToTableCells" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="DoNotCaptureDrawObjsOnPage" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ConsiderTextWrapOnObjPos" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="AddParaLineSpacingToTableCells" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="CollapseEmptyCellPara" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="UseFormerObjectPositioning" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="EmbedSystemFonts" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="DoNotJustifyLinesWithManualBreak" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="DoNotResetParaAttrsForNumFont" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="FloattableNomargins" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="IgnoreTabsAndBlanksForLineCalculation" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ClipAsCharacterAnchoredWriterFlyFrames" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="UseOldPrinterMetrics" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="Rsid" config:type="int">1907347</config:config-item>
|
||||
<config:config-item config:name="RsidRoot" config:type="int">1907347</config:config-item>
|
||||
<config:config-item config:name="ProtectForm" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="MsWordCompTrailingBlanks" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="MsWordCompMinLineHeightByFly" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="MathBaselineAlignment" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="SmallCapsPercentage66" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="PrintDrawings" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="EmbedComplexScriptFonts" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="EmbedOnlyUsedFonts" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="EmbedLatinScriptFonts" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="EmbedAsianScriptFonts" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="TabOverMargin" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ApplyParagraphMarkFormatToNumbering" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="TabOverSpacing" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="TreatSingleColumnBreakAsPageBreak" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="SurroundTextWrapSmall" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="PropLineSpacingShrinksFirstLine" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="SubtractFlysAnchoredAtFlys" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="EmptyDbFieldHidesPara" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ContinuousEndnotes" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ProtectBookmarks" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="ProtectFields" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="FrameAutowidthWithMorePara" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="GutterAtTop" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="FootnoteInColumnToPageEnd" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="ImagePreferredDPI" config:type="int">0</config:config-item>
|
||||
<config:config-item config:name="AutoFirstLineIndentDisregardLineSpace" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="HyphenateURLs" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="NoNumberingShowFollowBy" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="DropCapPunctuation" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="PrintAnnotationMode" config:type="short">0</config:config-item>
|
||||
<config:config-item config:name="PrintPageBackground" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="PrintBlackFonts" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="PrintControls" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="PrintLeftPages" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="PrintGraphics" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="PrintEmptyPages" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="PrintHiddenText" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="PrintTextPlaceholder" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="PrintProspect" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="PrintProspectRTL" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="PrintReversed" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="PrintRightPages" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="PrintFaxName" config:type="string"/>
|
||||
<config:config-item config:name="PrintPaperFromSetup" config:type="boolean">false</config:config-item>
|
||||
<config:config-item config:name="PrintTables" config:type="boolean">true</config:config-item>
|
||||
<config:config-item config:name="PrintSingleJobs" config:type="boolean">false</config:config-item>
|
||||
</config:config-item-set>
|
||||
</office:settings>
|
||||
<office:scripts>
|
||||
<office:script script:language="ooo:Basic">
|
||||
<ooo:libraries xmlns:ooo="http://openoffice.org/2004/office" xmlns:xlink="http://www.w3.org/1999/xlink"/>
|
||||
</office:script>
|
||||
</office:scripts>
|
||||
<office:font-face-decls>
|
||||
<style:font-face style:name="Arial" svg:font-family="Arial" style:font-family-generic="roman" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Liberation Sans" svg:font-family="'Liberation Sans'" style:font-family-generic="swiss" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Lucida Sans" svg:font-family="'Lucida Sans'" style:font-family-generic="swiss"/>
|
||||
<style:font-face style:name="Lucida Sans1" svg:font-family="'Lucida Sans'" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Microsoft YaHei" svg:font-family="'Microsoft YaHei'" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="NSimSun" svg:font-family="NSimSun" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
</office:font-face-decls>
|
||||
<office:styles>
|
||||
<style:default-style style:family="graphic">
|
||||
<style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.3cm" draw:shadow-offset-y="0.3cm" draw:start-line-spacing-horizontal="0.283cm" draw:start-line-spacing-vertical="0.283cm" draw:end-line-spacing-horizontal="0.283cm" draw:end-line-spacing-vertical="0.283cm" style:flow-with-text="false"/>
|
||||
<style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" loext:tab-stop-distance="0cm" style:writing-mode="lr-tb" style:font-independent-line-spacing="false">
|
||||
<style:tab-stops/>
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Arial" fo:font-size="9pt" fo:language="en" fo:country="GB" style:letter-kerning="true" style:font-name-asian="NSimSun" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Lucida Sans1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/>
|
||||
</style:default-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:tab-stop-distance="1.251cm" style:writing-mode="page"/>
|
||||
<style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Arial" fo:font-size="9pt" fo:language="en" fo:country="GB" style:letter-kerning="true" style:font-name-asian="NSimSun" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Lucida Sans1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="5" loext:hyphenation-zone="no-limit"/>
|
||||
</style:default-style>
|
||||
<style:default-style style:family="table">
|
||||
<style:table-properties table:border-model="collapsing"/>
|
||||
</style:default-style>
|
||||
<style:default-style style:family="table-row">
|
||||
<style:table-row-properties fo:keep-together="auto"/>
|
||||
</style:default-style>
|
||||
<style:style style:name="Standard" style:family="paragraph" style:class="text"/>
|
||||
<style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text">
|
||||
<style:paragraph-properties fo:margin-top="0.423cm" fo:margin-bottom="0.212cm" style:contextual-spacing="false" fo:keep-with-next="always"/>
|
||||
<style:text-properties style:font-name="Liberation Sans" fo:font-family="'Liberation Sans'" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-asian="Microsoft YaHei" style:font-family-asian="'Microsoft YaHei'" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="14pt" style:font-name-complex="Lucida Sans1" style:font-family-complex="'Lucida Sans'" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.247cm" style:contextual-spacing="false" fo:line-height="115%"/>
|
||||
</style:style>
|
||||
<style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="list">
|
||||
<style:text-properties style:font-size-asian="12pt" style:font-name-complex="Lucida Sans" style:font-family-complex="'Lucida Sans'" style:font-family-generic-complex="swiss"/>
|
||||
</style:style>
|
||||
<style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
|
||||
<style:paragraph-properties fo:margin-top="0.212cm" fo:margin-bottom="0.212cm" style:contextual-spacing="false" text:number-lines="false" text:line-number="0"/>
|
||||
<style:text-properties fo:font-size="12pt" fo:font-style="italic" style:font-size-asian="12pt" style:font-style-asian="italic" style:font-name-complex="Lucida Sans" style:font-family-complex="'Lucida Sans'" style:font-family-generic-complex="swiss" style:font-size-complex="12pt" style:font-style-complex="italic"/>
|
||||
</style:style>
|
||||
<style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard" style:class="index">
|
||||
<style:paragraph-properties text:number-lines="false" text:line-number="0"/>
|
||||
<style:text-properties style:font-size-asian="12pt" style:font-name-complex="Lucida Sans" style:font-family-complex="'Lucida Sans'" style:font-family-generic-complex="swiss"/>
|
||||
</style:style>
|
||||
<style:style style:name="Table_20_Contents" style:display-name="Table Contents" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
|
||||
<style:paragraph-properties fo:orphans="0" fo:widows="0" text:number-lines="false" text:line-number="0"/>
|
||||
</style:style>
|
||||
<style:style style:name="Placeholder" style:family="text">
|
||||
<style:text-properties fo:font-variant="small-caps" fo:color="#008080" loext:opacity="100%" style:text-underline-style="dotted" style:text-underline-width="auto" style:text-underline-color="font-color"/>
|
||||
</style:style>
|
||||
<text:outline-style style:name="Outline">
|
||||
<text:outline-level-style text:level="1" style:num-format="">
|
||||
<style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
|
||||
<style:list-level-label-alignment text:label-followed-by="listtab"/>
|
||||
</style:list-level-properties>
|
||||
</text:outline-level-style>
|
||||
<text:outline-level-style text:level="2" style:num-format="">
|
||||
<style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
|
||||
<style:list-level-label-alignment text:label-followed-by="listtab"/>
|
||||
</style:list-level-properties>
|
||||
</text:outline-level-style>
|
||||
<text:outline-level-style text:level="3" style:num-format="">
|
||||
<style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
|
||||
<style:list-level-label-alignment text:label-followed-by="listtab"/>
|
||||
</style:list-level-properties>
|
||||
</text:outline-level-style>
|
||||
<text:outline-level-style text:level="4" style:num-format="">
|
||||
<style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
|
||||
<style:list-level-label-alignment text:label-followed-by="listtab"/>
|
||||
</style:list-level-properties>
|
||||
</text:outline-level-style>
|
||||
<text:outline-level-style text:level="5" style:num-format="">
|
||||
<style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
|
||||
<style:list-level-label-alignment text:label-followed-by="listtab"/>
|
||||
</style:list-level-properties>
|
||||
</text:outline-level-style>
|
||||
<text:outline-level-style text:level="6" style:num-format="">
|
||||
<style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
|
||||
<style:list-level-label-alignment text:label-followed-by="listtab"/>
|
||||
</style:list-level-properties>
|
||||
</text:outline-level-style>
|
||||
<text:outline-level-style text:level="7" style:num-format="">
|
||||
<style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
|
||||
<style:list-level-label-alignment text:label-followed-by="listtab"/>
|
||||
</style:list-level-properties>
|
||||
</text:outline-level-style>
|
||||
<text:outline-level-style text:level="8" style:num-format="">
|
||||
<style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
|
||||
<style:list-level-label-alignment text:label-followed-by="listtab"/>
|
||||
</style:list-level-properties>
|
||||
</text:outline-level-style>
|
||||
<text:outline-level-style text:level="9" style:num-format="">
|
||||
<style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
|
||||
<style:list-level-label-alignment text:label-followed-by="listtab"/>
|
||||
</style:list-level-properties>
|
||||
</text:outline-level-style>
|
||||
<text:outline-level-style text:level="10" style:num-format="">
|
||||
<style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
|
||||
<style:list-level-label-alignment text:label-followed-by="listtab"/>
|
||||
</style:list-level-properties>
|
||||
</text:outline-level-style>
|
||||
</text:outline-style>
|
||||
<text:notes-configuration text:note-class="footnote" style:num-format="1" text:start-value="0" text:footnotes-position="page" text:start-numbering-at="document"/>
|
||||
<text:notes-configuration text:note-class="endnote" style:num-format="i" text:start-value="0"/>
|
||||
<text:linenumbering-configuration text:number-lines="false" text:offset="0.499cm" style:num-format="1" text:number-position="left" text:increment="5"/>
|
||||
<loext:theme loext:name="Office Theme">
|
||||
<loext:theme-colors loext:name="LibreOffice">
|
||||
<loext:color loext:name="dark1" loext:color="#000000"/>
|
||||
<loext:color loext:name="light1" loext:color="#ffffff"/>
|
||||
<loext:color loext:name="dark2" loext:color="#000000"/>
|
||||
<loext:color loext:name="light2" loext:color="#ffffff"/>
|
||||
<loext:color loext:name="accent1" loext:color="#18a303"/>
|
||||
<loext:color loext:name="accent2" loext:color="#0369a3"/>
|
||||
<loext:color loext:name="accent3" loext:color="#a33e03"/>
|
||||
<loext:color loext:name="accent4" loext:color="#8e03a3"/>
|
||||
<loext:color loext:name="accent5" loext:color="#c99c00"/>
|
||||
<loext:color loext:name="accent6" loext:color="#c9211e"/>
|
||||
<loext:color loext:name="hyperlink" loext:color="#0000ee"/>
|
||||
<loext:color loext:name="followed-hyperlink" loext:color="#551a8b"/>
|
||||
</loext:theme-colors>
|
||||
</loext:theme>
|
||||
</office:styles>
|
||||
<office:automatic-styles>
|
||||
<style:style style:name="BillOfExchange" style:family="table">
|
||||
<style:table-properties style:width="20.001cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="BillOfExchange.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="4.75cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="BillOfExchange.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="15.251cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="BillOfExchange.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="BillOfExchange.B1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.101cm" fo:border="0.5pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="4.001cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="3.5cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.C" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="10.899cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.C1" style:family="table-cell">
|
||||
<style:table-cell-properties style:vertical-align="middle" fo:padding="0.101cm" fo:border="1.5pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="4.5cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="13.899cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2.B1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner3" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner3.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="18.399cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner3.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="2.499cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="15.9cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4.B1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="2.499cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="15.9cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5.B1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="2.499cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="3.5cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.F" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="3.902cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.B1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="4.001cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="3.5cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.C" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="10.899cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner1.C1" style:family="table-cell">
|
||||
<style:table-cell-properties style:vertical-align="middle" fo:padding="0.101cm" fo:border="1.5pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="4.5cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="13.899cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner2.B1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner3" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner3.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="18.399cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner3.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="2.499cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="15.9cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner4.B1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="2.499cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="15.9cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner5.B1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6" style:family="table">
|
||||
<style:table-properties style:width="18.399cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="2.499cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="3.5cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.F" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="3.902cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.049cm" fo:border="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="Inner6.B1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.049cm" fo:padding-top="0.049cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="P1" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-size="8pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P2" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-size="8pt" fo:font-weight="bold"/>
|
||||
</style:style>
|
||||
<style:style style:name="P3" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:text-align="center" style:justify-single-word="false"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-size="8pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P4" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:text-align="end" style:justify-single-word="false"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-size="8pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P5" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-size="7pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P6" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:text-align="center" style:justify-single-word="false"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-size="7pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P7" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:text-align="center" style:justify-single-word="false"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-size="9pt" fo:font-weight="bold"/>
|
||||
</style:style>
|
||||
<style:style style:name="P8" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:text-align="center" style:justify-single-word="false"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-size="7pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P9" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false" fo:text-align="center" style:justify-single-word="false"/>
|
||||
<style:text-properties style:font-name="Arial" fo:font-size="7pt" officeooo:paragraph-rsid="001d1a93"/>
|
||||
</style:style>
|
||||
<style:page-layout style:name="pm1">
|
||||
<style:page-layout-properties fo:page-width="21.001cm" fo:page-height="9.999cm" style:num-format="1" style:print-orientation="landscape" fo:margin-top="0.4cm" fo:margin-bottom="0.4cm" fo:margin-left="0.499cm" fo:margin-right="0.499cm" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.706cm" style:layout-grid-ruby-height="0.353cm" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0cm" loext:margin-gutter="0cm">
|
||||
<style:footnote-sep style:width="0.018cm" style:distance-before-sep="0.101cm" style:distance-after-sep="0.101cm" style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>
|
||||
</style:page-layout-properties>
|
||||
<style:header-style/>
|
||||
<style:footer-style/>
|
||||
</style:page-layout>
|
||||
<style:style style:name="dp1" style:family="drawing-page">
|
||||
<style:drawing-page-properties draw:background-size="full"/>
|
||||
</style:style>
|
||||
</office:automatic-styles>
|
||||
<office:master-styles>
|
||||
<style:master-page style:name="Standard" style:page-layout-name="pm1" draw:style-name="dp1"/>
|
||||
</office:master-styles>
|
||||
<office:body>
|
||||
<office:text>
|
||||
<text:sequence-decls>
|
||||
<text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
|
||||
<text:sequence-decl text:display-outline-level="0" text:name="Table"/>
|
||||
<text:sequence-decl text:display-outline-level="0" text:name="Text"/>
|
||||
<text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
|
||||
<text:sequence-decl text:display-outline-level="0" text:name="Figure"/>
|
||||
</text:sequence-decls>
|
||||
<text:p text:style-name="P1"><text:placeholder text:placeholder-type="text"><for each="sale in records"></text:placeholder></text:p>
|
||||
<table:table table:name="BillOfExchange" table:style-name="BillOfExchange">
|
||||
<table:table-column table:style-name="BillOfExchange.A"/>
|
||||
<table:table-column table:style-name="BillOfExchange.B"/>
|
||||
<table:table-row>
|
||||
<table:table-cell table:style-name="BillOfExchange.A1" table:number-rows-spanned="2" office:value-type="string">
|
||||
<text:p text:style-name="P6">Accepted by:</text:p>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P6"/>
|
||||
<text:p text:style-name="P9">Per aval:</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="BillOfExchange.B1" office:value-type="string">
|
||||
<table:table table:name="Inner1" table:style-name="Inner1">
|
||||
<table:table-column table:style-name="Inner1.A"/>
|
||||
<table:table-column table:style-name="Inner1.B"/>
|
||||
<table:table-column table:style-name="Inner1.C"/>
|
||||
<table:table-row>
|
||||
<table:table-cell table:style-name="Inner1.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1">Geneva, <text:placeholder text:placeholder-type="text"><format_date(sale.sale_date, sale.party.lang)></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner1.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1">For</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner1.C1" office:value-type="string">
|
||||
<text:p text:style-name="P7"><text:placeholder text:placeholder-type="text"><format_currency(sale.lines[0].unit_price, sale.party.lang, sale.currency) if sale.lines else ''></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<table:table table:name="Inner2" table:style-name="Inner2">
|
||||
<table:table-column table:style-name="Inner2.A"/>
|
||||
<table:table-column table:style-name="Inner2.B"/>
|
||||
<table:table-row>
|
||||
<table:table-cell table:style-name="Inner2.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1">At / on <text:placeholder text:placeholder-type="text"><sale.payment_term.rec_name if sale.payment_term else ''></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner2.B1" office:value-type="string">
|
||||
<text:p text:style-name="P1">for value received, please pay against this sole Bill of Exchange</text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<text:p text:style-name="P1">to our order of Melya S.A., Switzerland, the amount of</text:p>
|
||||
<table:table table:name="Inner3" table:style-name="Inner3">
|
||||
<table:table-column table:style-name="Inner3.A"/>
|
||||
<table:table-row>
|
||||
<table:table-cell table:style-name="Inner3.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1"> </text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<text:p text:style-name="P5">effective payment to be made in <text:placeholder text:placeholder-type="text"><sale.currency.symbol if sale.currency else ''></text:placeholder> only, without deduction for and free of any taxes, impost, levies or duties present or future of any nature under the laws of <text:placeholder text:placeholder-type="text"><sale.party.addresses[0].country.name if sale.party and sale.party.addresses else ''></text:placeholder> or any political subdivision thereof or therein.</text:p>
|
||||
<table:table table:name="Inner4" table:style-name="Inner4">
|
||||
<table:table-column table:style-name="Inner4.A"/>
|
||||
<table:table-column table:style-name="Inner4.B"/>
|
||||
<table:table-row>
|
||||
<table:table-cell table:style-name="Inner4.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1">Payable at</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner4.B1" office:value-type="string">
|
||||
<text:p text:style-name="P1"><text:placeholder text:placeholder-type="text"><sale.party.addresses[0].city if sale.party and sale.party.addresses else ''></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<table:table table:name="Inner5" table:style-name="Inner5">
|
||||
<table:table-column table:style-name="Inner5.A"/>
|
||||
<table:table-column table:style-name="Inner5.B"/>
|
||||
<table:table-row>
|
||||
<table:table-cell table:style-name="Inner5.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1">Drawn on at</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner5.B1" office:value-type="string">
|
||||
<text:p text:style-name="P1"><text:placeholder text:placeholder-type="text"><sale.party.rec_name></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<table:table table:name="Inner6" table:style-name="Inner6">
|
||||
<table:table-column table:style-name="Inner6.A"/>
|
||||
<table:table-column table:style-name="Inner6.B"/>
|
||||
<table:table-column table:style-name="Inner6.A"/>
|
||||
<table:table-column table:style-name="Inner6.B"/>
|
||||
<table:table-column table:style-name="Inner6.A"/>
|
||||
<table:table-column table:style-name="Inner6.F"/>
|
||||
<table:table-row>
|
||||
<table:table-cell table:style-name="Inner6.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1">No</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner6.B1" office:value-type="string">
|
||||
<text:p text:style-name="P1"> </text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner6.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1">/ Invoice No</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner6.B1" office:value-type="string">
|
||||
<text:p text:style-name="P1"><text:placeholder text:placeholder-type="text"><sale.full_number></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner6.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1">/ D:</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Inner6.B1" office:value-type="string">
|
||||
<text:p text:style-name="P1"><text:placeholder text:placeholder-type="text"><sale.reference if sale.reference else ''></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
<table:table-row>
|
||||
<table:covered-table-cell table:style-name="BillOfExchange.A1"/>
|
||||
<table:table-cell table:style-name="BillOfExchange.A1" office:value-type="string">
|
||||
<text:p text:style-name="P6"/>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<text:p text:style-name="P1"><text:placeholder text:placeholder-type="text"></for></text:placeholder></text:p>
|
||||
</office:text>
|
||||
</office:body>
|
||||
</office:document>
|
||||
@@ -422,18 +422,6 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<field name="action" ref="report_bill"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.action.report" id="report_sale_final">
|
||||
<field name="name">Sale (final)</field>
|
||||
<field name="model">sale.sale</field>
|
||||
<field name="report_name">sale.sale</field>
|
||||
<field name="report">sale/sale_final.fodt</field>
|
||||
</record>
|
||||
<record model="ir.action.keyword" id="report_sale_final_keyword">
|
||||
<field name="keyword">form_print</field>
|
||||
<field name="model">sale.sale,-1</field>
|
||||
<field name="action" ref="report_sale_final"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="sale_line_view_form">
|
||||
<field name="model">sale.line</field>
|
||||
<field name="type">form</field>
|
||||
|
||||
@@ -1031,7 +1031,7 @@
|
||||
</text:sequence-decls>
|
||||
<text:p text:style-name="P46"/>
|
||||
<text:h text:style-name="Heading_20_1" text:outline-level="1">Certificate of Insurance No. <text:span text:style-name="Police_20_par_20_défaut"><text:span text:style-name="T3"><text:placeholder text:placeholder-type="text"><records[0].report_insurance_certificate_number or ''></text:placeholder></text:span></text:span></text:h>
|
||||
<text:h text:style-name="Heading_20_3" text:outline-level="3">This is to certify that we have insured for account of <text:span text:style-name="Police_20_par_20_défaut"><text:span text:style-name="T3"><text:placeholder text:placeholder-type="text"><records[0].report_insurance_account_of or ''></text:placeholder></text:span></text:span></text:h>
|
||||
<text:h text:style-name="Heading_20_3" text:outline-level="3">This is to certify that we have insured for account of <text:span text:style-name="Police_20_par_20_défaut"><text:span text:style-name="T3"><text:placeholder text:placeholder-type="text"><records[0].company.party.rec_name if records[0].company and records[0].company.party else ''></text:placeholder></text:span></text:span></text:h>
|
||||
<text:p text:style-name="P19"/>
|
||||
<text:p text:style-name="P20"/>
|
||||
<text:p text:style-name="P21"><text:span text:style-name="Police_20_par_20_défaut"><text:span text:style-name="T12">Marine Insurance</text:span></text:span><text:span text:style-name="Police_20_par_20_défaut"><text:span text:style-name="T13"> </text:span></text:span><text:span text:style-name="Police_20_par_20_défaut"><text:span text:style-name="T12">Policy</text:span></text:span><text:span text:style-name="Police_20_par_20_défaut"><text:span text:style-name="T14"> </text:span></text:span><text:span text:style-name="Police_20_par_20_défaut"><text:span text:style-name="T12">No. 4.008.227.782<text:tab/>the following shipment: Description of goods and/or</text:span></text:span><text:span text:style-name="Police_20_par_20_défaut"><text:span text:style-name="T15"> </text:span></text:span><text:span text:style-name="Police_20_par_20_défaut"><text:span text:style-name="T12">services:</text:span></text:span></text:p>
|
||||
|
||||
1698
modules/stock/packing_list.fodt
Normal file
1698
modules/stock/packing_list.fodt
Normal file
File diff suppressed because it is too large
Load Diff
96
notes/template_business_rules.md
Normal file
96
notes/template_business_rules.md
Normal file
@@ -0,0 +1,96 @@
|
||||
# Template Business Rules - Session Memo
|
||||
|
||||
Date: 2026-04-08
|
||||
Scope: templates Relatorio + ponts `report_*` Python.
|
||||
|
||||
## 1) Regles metier confirmees
|
||||
|
||||
- `insurance.fodt`:
|
||||
- "This is to certify that we have insured for account of" doit afficher la compagnie courante (`shipment.company.party`), pas le client.
|
||||
- "Amount insured" suit la regle 110% de la valeur incoming.
|
||||
- Base incoming: montant des incoming moves lies au shipment, derive des lots et de la source achat (`purchase.line.unit_price * current_quantity_converted`).
|
||||
- `sale bill`:
|
||||
- La 2eme date attendue est une maturity date (echeance), pas le libelle de condition de paiement.
|
||||
- Le montant en toutes lettres doit correspondre au montant du bill (montant facture/total), pas au prix unitaire d'une ligne.
|
||||
|
||||
## 2) Pratiques templates Relatorio
|
||||
|
||||
- Preferer des proprietes Python `report_*` stables sur le modele plutot que des expressions Genshi complexes.
|
||||
- Pour `stock.shipment.in`, privilegier `records[0].report_*` dans le template.
|
||||
- Si un placeholder s'affiche en brut dans le PDF:
|
||||
- verifier que c'est un vrai `text:placeholder` ODF et pas du texte simple.
|
||||
- verifier le scope de variable (`records[0]` vs variable locale non definie).
|
||||
- Dans les placeholders XML:
|
||||
- utiliser `"` et `'` dans les expressions XML.
|
||||
- eviter les echappements de type `\'`.
|
||||
|
||||
## 3) Decisions de conception appliquees
|
||||
|
||||
- `insurance.fodt`:
|
||||
- ajout d'un champ shipment `surveyor` (party.party) via onglet "Surveyor".
|
||||
- ajout d'une propriete `report_insurance_contact_surveyor` pour la zone "Contact the following surveyor".
|
||||
- `payment_order.fodt`:
|
||||
- migration des tags `<...>` legacy vers la syntaxe template habituelle du projet.
|
||||
- ajout de la section de config template, et exposition depuis `account.invoice` comme pour CN/DN/Invoice/Prepayment.
|
||||
- `packing_list.fodt`:
|
||||
- date en haut droite basee sur la date du jour.
|
||||
- unites Net/Gross alignees sur l'unite de `purchase.line`.
|
||||
- `bill.fodt`:
|
||||
- suppression du report `sale_final.fodt` du menu sale.
|
||||
- ajout de ponts Python cote sale pour:
|
||||
- montant bill numerique,
|
||||
- montant bill en lettres,
|
||||
- maturity date issue de `invoice.lines_to_pay.maturity_date` (avec fallback metier).
|
||||
|
||||
## 4) Check-list rapide avant validation d'un template
|
||||
|
||||
- Les placeholders sont-ils tous resolus (aucun `<records[...]...>` brut)?
|
||||
- Le scope est-il correct (`records[0]` / `sale` / `invoice`) partout, y compris header/footer?
|
||||
- La source metier est-elle correcte (compagnie vs client, total vs unit_price, maturity date vs payment term)?
|
||||
- Les formats sont-ils conformes (date, devise, montant en lettres)?
|
||||
- Le template est-il bien expose dans la config + menu d'impression de la forme cible?
|
||||
|
||||
## 5) Session 2026-04-09 - Rappels metier purchase_trade / account_invoice
|
||||
|
||||
- Factures trade:
|
||||
- `NET` et `GROSS` viennent de `lot.qt.hist` du lot retenu, pas de `invoice.line.quantity`.
|
||||
- priorite lots: `physic` d'abord, sinon lot `virtual` unique.
|
||||
- l'unite affichee vient de `lot.lot_unit_line`.
|
||||
- les infos shipment doivent dependre des lots reels des lignes facture.
|
||||
- le label `S/I` doit afficher `shipment.reference`.
|
||||
- `invoice_ict_final.fodt`: si `NB BALES = 0`, afficher `Unchanged`.
|
||||
- les quantites de `invoice_ict` et `invoice_ict_final` sont uniformisees a `2` decimales.
|
||||
- la conversion vers `LBS` doit passer par `product.uom.compute_qty`, pas un facteur fixe.
|
||||
- si plusieurs lignes reutilisent le meme lot, les lignes detaillees utilisent la quantite facturee convertie, mais le `GROSS` global doit continuer a refleter le vrai delta historique du lot.
|
||||
- CN / DN:
|
||||
- cote `sale` / `out`: montant negatif => `Credit Note`, montant positif => `Debit Note`.
|
||||
- cote `purchase` / `in`: logique inverse conservee.
|
||||
- Report sale:
|
||||
- meme priorite lots que facture.
|
||||
- les quantites en lettres suivent l'unite reelle (`MT`, `KILOGRAM`, `LBS`).
|
||||
- le total convertit les lignes vers une unite commune.
|
||||
- l'unite commune est celle du lot virtuel seulement s'il y a un seul lot virtuel sur tout le report.
|
||||
- Lots:
|
||||
- `lot.report.r_del_period` affiche `sale.line.del_period` pour `lot_s` sans `lot_p`, sinon `purchase.line.del_period`.
|
||||
- dans `Do weighing`, `lot_qt` doit etre editable et ecraser directement `lot.lot_qt`.
|
||||
- Factures client / fournisseur:
|
||||
- `Validate` cree aussi le `account.move` pour les factures client.
|
||||
- `Validate` attribue aussi le `number` pour les factures client; la numerotation ne doit plus attendre `Post` cote `out`.
|
||||
- `Post` ne doit plus forcer une fresh session / demande de mot de passe sur ce flux.
|
||||
- Pricing:
|
||||
- `pricing.pricing` peut etre saisi manuellement meme sans composant.
|
||||
- en manuel, l'utilisateur saisit seulement `quantity` et `settl_price`.
|
||||
- `fixed_qt`, `fixed_qt_price`, `unfixed_qt`, `unfixed_qt_price` sont derives automatiquement et restent non editables.
|
||||
- `fixed_qt` = cumul des `quantity` du groupe.
|
||||
- `fixed_qt_price` = moyenne ponderee cumulee des `settl_price`.
|
||||
- `unfixed_qt` = quantite de base restante a fixer.
|
||||
- `unfixed_qt_price` = `settl_price` de la ligne.
|
||||
- `eod_price` reste non editable et suit le prix moyen pondere.
|
||||
- le mode auto suit la meme formule.
|
||||
- `last` est gere par groupe metier (`line + component`), avec un seul `last=True` par groupe.
|
||||
- la ligne `last=True` est celle de `pricing_date` la plus grande; `id` ne sert qu'en tie-break.
|
||||
- Divers:
|
||||
- `trader` filtre sur `TRADER`.
|
||||
- `operator` filtre sur `OPERATOR`.
|
||||
- les quotas/pricings doivent fallback sur `quantity` si `quantity_theorical` est vide.
|
||||
- `sale.line` / `purchase.line`: en mode `basis`, si aucun `price_component` n'est defini, le prix et la progression doivent remonter depuis la ligne `Summary` / `pricing.summary` sans component.
|
||||
Reference in New Issue
Block a user