Compare commits
146 Commits
6bf245ac64
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 56b173d225 | |||
| 27450d51f6 | |||
| ea31706ff8 | |||
| 35fe191939 | |||
| 062b42f83f | |||
| debe374f1b | |||
| b5b554bad0 | |||
| 1d6f3158c0 | |||
| ff2b897b7a | |||
| 30d4362c09 | |||
| aa9a18fb93 | |||
| 4faa7fd83c | |||
| ca20d418cc | |||
| 3314d31fcd | |||
| f6db19d1d9 | |||
| 257916bd6c | |||
| 2cdcbe7303 | |||
| 98893647f6 | |||
| 2e276e2b1f | |||
| 384c1285b1 | |||
| 308252215f | |||
| 7965b22954 | |||
| 8ae2c7ca9c | |||
| 16151381cc | |||
| 4db0395a11 | |||
| fbfa73110f | |||
| 9544418897 | |||
| e40a32e796 | |||
| 530f2f9d97 | |||
| 9879926f08 | |||
| 04e9d7dc03 | |||
| 7a123b1af6 | |||
| a2b053c565 | |||
| 6018429369 | |||
| 4d4e7ab625 | |||
| 68ce1f3a62 | |||
| d8a56637c9 | |||
| a1486175f2 | |||
| 228ee07a9c | |||
| 036a2801e5 | |||
| c2838dcfd3 | |||
| 6e26f178ce | |||
| 4458871423 | |||
| 99782b5b0e | |||
| d09d183cdc | |||
| ec45440400 | |||
| edb23b008c | |||
| fca279a038 | |||
| 512862113a | |||
| 1ed79a2363 | |||
| 05a75f000a | |||
| 77a5366622 | |||
| c203e1b300 | |||
| 22ad8547e4 | |||
| 2ea2165653 | |||
| 5e72d4f98d | |||
| b1680cc96c | |||
| cfb719a7da | |||
| 9e4a12605c | |||
| 4013f9d74c | |||
| 280cff5fdb | |||
| 897c6f6824 | |||
| 8906f00d36 | |||
| 29a719c117 | |||
| d71257720e | |||
| aee9c3277e | |||
| b68f475e22 | |||
| 90eab73430 | |||
| 472806ef06 | |||
| 0def187750 | |||
| 229b6037fb | |||
| 8a90216357 | |||
| 4bbd7a5e76 | |||
| 9c8d7f11ae | |||
| b39607d987 | |||
| 65482b4a8b | |||
| 8b9787d4c0 | |||
| a1ab7dec82 | |||
| 5ae8af84fb | |||
| c90b14fcc1 | |||
| e9ff9c76ab | |||
| 63d8266a9c | |||
| add4cdc137 | |||
| 4d94aa78ed | |||
| da01249f66 | |||
|
|
5cbb57c657 | ||
| 50a8c6328f | |||
| eaa5c8b544 | |||
| 78e9e06a8b | |||
| 9f06398b2c | |||
| 51a84f1f2e | |||
| 00330008d1 | |||
| 3480eb8a7a | |||
| 5179d98289 | |||
| 2109d7a3e4 | |||
| 1f350e6207 | |||
| 7722292482 | |||
| ec359f6b8a | |||
| 845b9cf749 | |||
| 48b941b109 | |||
| 18ece66cdb | |||
| acfc2fe88a | |||
| 888b880bd6 | |||
| 1f62ae91dd | |||
| 05e68636ad | |||
| bfb9bb3188 | |||
| b78e64f9f1 | |||
| 199b8aec12 | |||
| 1757075f2b | |||
| 172d38479d | |||
| 4902368b15 | |||
| 7b4f757cb5 | |||
| b37f132cdf | |||
| 15f791bd92 | |||
| 58cd66e543 | |||
| cc6ce82ec1 | |||
| 11526ef3ee | |||
| 6d52317804 | |||
| a99efcfc5b | |||
| 0d5cf7dffc | |||
| 613b679908 | |||
| 51ced23ab8 | |||
| 2958e1fb9e | |||
| 346a34951d | |||
| b644aea007 | |||
| 5dbaba5f32 | |||
| d133665fc7 | |||
| c2cb2a874c | |||
| 408970c339 | |||
| ea2627c9ae | |||
| ac988a714a | |||
| 97eae6e4a6 | |||
| 3976b387d7 | |||
| 9b8e8127a1 | |||
| f53a9bce27 | |||
| a7753b974f | |||
| c687828ba5 | |||
| 5054b64cd0 | |||
| 06922973b7 | |||
| 18ebf7f06c | |||
| 44c4560f24 | |||
| 7643bf21fb | |||
| 97677025d7 | |||
| 02fe5b3e5d | |||
| 6e529deca0 | |||
| efee365fc6 |
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
*.pyc
|
||||
39
AGENTS.md
39
AGENTS.md
@@ -38,15 +38,39 @@ Guide rapide pour les agents qui codent dans ce repository.
|
||||
- Lire `wsgi.py`, `rpc.py`, `protocols/*`, `tests/test_rpc.py`, `tests/test_wsgi.py`.
|
||||
- Si bug metier:
|
||||
- Modifier uniquement `modules/<module>/` + ses tests.
|
||||
- Conventions de champs dates:
|
||||
- Dans ce projet, ne pas introduire de `fields.DateTime`.
|
||||
- Utiliser `fields.Date` pour les dates metier et les champs de suivi UI, sauf demande explicite deja existante dans le module cible.
|
||||
- Si bug template Relatorio (`.fodt`):
|
||||
- Lire d'abord le template standard voisin du meme domaine (`invoice.fodt`, `sale.fodt`, etc.).
|
||||
- Preferer des proprietes Python simples exposees par le modele plutot que des expressions Genshi complexes dans le template.
|
||||
- Dans les placeholders XML, utiliser `"` et `'` plutot que des antislashs type `\'`.
|
||||
- Si un document facture depend fortement d'une vente/achat, ajouter au besoin un petit pont Python pour exposer des `report_*` stables au template.
|
||||
- Pour les templates `stock.shipment.in`, preferer aussi des proprietes `report_*` sur le shipment plutot que des contextes ad hoc (`si_*`) quand le document devient metier ou client-specifique.
|
||||
- Si plusieurs actions de report pointent vers `report_name = 'account.invoice'`, verifier aussi le cache `invoice_report_cache` dans `modules/account_invoice/invoice.py`: un mauvais cache peut faire croire que plusieurs actions utilisent le meme `.fodt`.
|
||||
- Avant de conclure qu'un template ou une action est faux, verifier si le report alternatif doit bypasser le cache standard.
|
||||
- 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) Memos metier et templates
|
||||
|
||||
- Regles metier transverses:
|
||||
- `notes/business_rules.md`
|
||||
- Regles metier locales `purchase_trade`:
|
||||
- `modules/purchase_trade/docs/business-rules.md`
|
||||
- Decisions templates / reports:
|
||||
- `notes/template_business_rules.md`
|
||||
|
||||
## 5) Workflow de modification (obligatoire)
|
||||
|
||||
@@ -105,3 +129,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.
|
||||
|
||||
1
debug.log
Normal file
1
debug.log
Normal file
@@ -0,0 +1 @@
|
||||
[0407/143111.471:ERROR:third_party\crashpad\crashpad\util\win\registration_protocol_win.cc:108] CreateFile: Accès refusé. (0x5)
|
||||
5
deployment/README.md
Normal file
5
deployment/README.md
Normal file
@@ -0,0 +1,5 @@
|
||||
# Deployment Notes
|
||||
|
||||
- Runbook onboarding SSH: `deployment/runbooks/vps-onboarding.md`
|
||||
- VPS 46.202.173.47 credentials: `deployment/vps/46.202.173.47-credentials.md`
|
||||
- VPS 46.202.173.47 quickstart: `deployment/vps/46.202.173.47-quickstart.md`
|
||||
57
deployment/runbooks/vps-onboarding.md
Normal file
57
deployment/runbooks/vps-onboarding.md
Normal file
@@ -0,0 +1,57 @@
|
||||
# Procedure - Ajouter un nouveau VPS (SSH)
|
||||
|
||||
Date de reference: 2026-04-07
|
||||
|
||||
## 1) Preparation locale (Windows)
|
||||
|
||||
1. Creer le dossier SSH local si absent:
|
||||
`New-Item -ItemType Directory -Force $env:USERPROFILE\.ssh`
|
||||
|
||||
2. Generer une cle dediee VPS:
|
||||
`ssh-keygen -t ed25519 -C "vps-deploy" -f $env:USERPROFILE\.ssh\vps_deploy_key`
|
||||
|
||||
3. Lire la cle publique:
|
||||
`Get-Content $env:USERPROFILE\.ssh\vps_deploy_key.pub`
|
||||
|
||||
## 2) Installer la cle sur le VPS
|
||||
|
||||
1. Se connecter au VPS avec mot de passe (premiere fois):
|
||||
`ssh <user>@<ip_vps>`
|
||||
|
||||
2. Sur le VPS, preparer le dossier SSH:
|
||||
`mkdir -p ~/.ssh`
|
||||
`chmod 700 ~/.ssh`
|
||||
|
||||
3. Ajouter la cle publique (une ligne complete):
|
||||
`echo "ssh-ed25519 ... vps-deploy" >> ~/.ssh/authorized_keys`
|
||||
`chmod 600 ~/.ssh/authorized_keys`
|
||||
|
||||
## 3) Tester la connexion par cle
|
||||
|
||||
Depuis Windows:
|
||||
`ssh -i $env:USERPROFILE\.ssh\vps_deploy_key <user>@<ip_vps>`
|
||||
|
||||
## 4) Test operationnel minimal
|
||||
|
||||
Creer un dossier distant:
|
||||
`ssh -i $env:USERPROFILE\.ssh\vps_deploy_key <user>@<ip_vps> "mkdir -p ~/test_codex_deploy && ls -ld ~/test_codex_deploy"`
|
||||
|
||||
## 5) Durcissement recommande
|
||||
|
||||
- Desactiver l'authentification par mot de passe apres validation de la cle.
|
||||
- Utiliser une cle dediee par environnement (dev/staging/prod).
|
||||
- Documenter user + IP + chemin de cle dans une fiche VPS separee.
|
||||
|
||||
## 6) Note importante - Contrainte sandbox Codex
|
||||
|
||||
- Si une commande SSH/SCP echoue avec un message proche de:
|
||||
- `Identity file ... not accessible: Permission denied`
|
||||
- Cause probable:
|
||||
- la session est en sandbox et ne peut pas lire la cle locale dans
|
||||
`C:\Users\<user>\.ssh\...`.
|
||||
- Action:
|
||||
- relancer la commande en mode `require_escalated` (hors sandbox) pour
|
||||
autoriser l'acces a la cle locale.
|
||||
- Exemple observe le 2026-04-07:
|
||||
- creation du dossier `/root/test` sur `46.202.173.47` reussie uniquement
|
||||
apres escalation.
|
||||
36
deployment/vps/46.202.173.47-credentials.md
Normal file
36
deployment/vps/46.202.173.47-credentials.md
Normal file
@@ -0,0 +1,36 @@
|
||||
# Fiche VPS - 46.202.173.47
|
||||
|
||||
Date de reference: 2026-04-07
|
||||
|
||||
## Identite serveur
|
||||
|
||||
- IP: `46.202.173.47`
|
||||
- Hostname alias conseille: `vps3`
|
||||
|
||||
## Acces
|
||||
|
||||
- Cle publique Laurent Barontini (vps-deploy):
|
||||
`ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEm8JMCYsk6I1IoYhIHXNrdyERHdh+eeDCJagOHaRAEK vps-deploy`
|
||||
|
||||
- Cle publique Sylvain Duvernay (s.duvernay@singa-associates.com):
|
||||
`ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG6Xsp/v6q6JO04ETv1880qoSPptUMxlWQvgcBz67o63 s.duvernay@singa-associates.com`
|
||||
- Fichier local: `$env:USERPROFILE\.ssh\id_ed25519`
|
||||
|
||||
- Mot de passe fourni:
|
||||
`!!OpenSquared!!`
|
||||
|
||||
- Utilisateur SSH:
|
||||
'root'
|
||||
- Port SSH:
|
||||
'22'
|
||||
|
||||
## Commande de connexion type
|
||||
|
||||
- Laurent Barontini (cle vps-deploy):
|
||||
`ssh -i $env:USERPROFILE\.ssh\vps_deploy_key <user>@46.202.173.47`
|
||||
|
||||
- Sylvain Duvernay (cle id_ed25519):
|
||||
`ssh -i $env:USERPROFILE\.ssh\id_ed25519 <user>@46.202.173.47`
|
||||
|
||||
- Avec port custom:
|
||||
`ssh -i $env:USERPROFILE\.ssh\id_ed25519 -p <port> <user>@46.202.173.47`
|
||||
39
deployment/vps/46.202.173.47-quickstart.md
Normal file
39
deployment/vps/46.202.173.47-quickstart.md
Normal file
@@ -0,0 +1,39 @@
|
||||
# Commandes Rapides - VPS 46.202.173.47
|
||||
|
||||
Date de reference: 2026-04-07
|
||||
|
||||
## Cles SSH par utilisateur
|
||||
|
||||
| Utilisateur | Fichier cle locale |
|
||||
|---|---|
|
||||
| Laurent Barontini | `$env:USERPROFILE\.ssh\vps_deploy_key` |
|
||||
| Sylvain Duvernay | `$env:USERPROFILE\.ssh\id_ed25519` |
|
||||
|
||||
> Les commandes ci-dessous utilisent `id_ed25519` (Sylvain Duvernay).
|
||||
|
||||
## 1) Test SSH
|
||||
|
||||
`ssh -i $env:USERPROFILE\.ssh\id_ed25519 <user>@46.202.173.47 "echo ok"`
|
||||
|
||||
## 2) Creer un dossier test distant
|
||||
|
||||
`ssh -i $env:USERPROFILE\.ssh\id_ed25519 <user>@46.202.173.47 "mkdir -p ~/test_codex_deploy && ls -ld ~/test_codex_deploy"`
|
||||
|
||||
## 3) Lister home distant
|
||||
|
||||
`ssh -i $env:USERPROFILE\.ssh\id_ed25519 <user>@46.202.173.47 "ls -la ~"`
|
||||
|
||||
## 4) Copier un fichier local vers le VPS
|
||||
|
||||
`scp -i $env:USERPROFILE\.ssh\id_ed25519 .\local.txt <user>@46.202.173.47:~/local.txt`
|
||||
|
||||
## 5) Recuperer un fichier du VPS
|
||||
|
||||
`scp -i $env:USERPROFILE\.ssh\id_ed25519 <user>@46.202.173.47:~/remote.txt .\remote.txt`
|
||||
|
||||
## 6) Depannage sandbox (Codex)
|
||||
|
||||
- Symptome:
|
||||
- `Identity file ... not accessible: Permission denied`
|
||||
- Correctif:
|
||||
- relancer la commande SSH/SCP en mode escalade (`require_escalated`).
|
||||
10
modules/AGENTS.md
Normal file
10
modules/AGENTS.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# AGENTS.md - Regles globales des modules
|
||||
|
||||
Ce guide complete le `AGENTS.md` racine et s'applique a tous les modules sous `modules/`.
|
||||
|
||||
## Regles transversales
|
||||
|
||||
- Ne pas introduire de `fields.DateTime` dans les modules metier sauf demande explicite et code cible deja base sur ce type.
|
||||
- Pour afficher une date issue d'un champ technique comme `create_date`, preferer un champ fonctionnel en `fields.Date` plutot qu'un acces direct en vue.
|
||||
- Si une vue doit afficher une information technique non declaree explicitement sur le modele, ajouter un champ fonctionnel dedie cote Python avant de modifier le XML.
|
||||
|
||||
@@ -1013,7 +1013,9 @@ class Line(DescriptionOriginMixin, MoveLineMixin, ModelSQL, ModelView):
|
||||
|
||||
journal = fields.Function(fields.Many2One('account.journal',"Journal"),'get_journal')
|
||||
|
||||
rate = fields.Function(fields.Numeric("Rate",digits=(1,6)),'get_rate')
|
||||
rate = fields.Numeric("Rate", digits=(10, 6), states={
|
||||
'readonly': _states['readonly'],
|
||||
})
|
||||
|
||||
del _states
|
||||
|
||||
@@ -1117,46 +1119,84 @@ class Line(DescriptionOriginMixin, MoveLineMixin, ModelSQL, ModelView):
|
||||
return line.move.id
|
||||
|
||||
def get_rate(self,name=None):
|
||||
if self.amount_second_currency:
|
||||
return round((self.credit if self.credit else self.debit) / abs(self.amount_second_currency),6)
|
||||
amount = self.credit if self.credit else self.debit
|
||||
amount_second_currency = getattr(self, 'amount_second_currency', None)
|
||||
if amount_second_currency and amount:
|
||||
return round(abs(amount_second_currency) / amount, 6)
|
||||
|
||||
def _set_rate_from_amounts(self):
|
||||
if (getattr(self, 'amount_second_currency', None)
|
||||
and not getattr(self, 'rate', None)):
|
||||
self.rate = self.get_rate()
|
||||
|
||||
@fields.depends(
|
||||
'debit', 'credit',
|
||||
'date','second_currency','amount_second_currency')
|
||||
def on_change_amount_second_currency(self):
|
||||
Currency = Pool().get('currency.currency')
|
||||
Date = Pool().get('ir.date')
|
||||
if self.second_currency != None and self.amount_second_currency != None and (not self.credit and not self.debit):
|
||||
tdate = Date.today()
|
||||
if self.date:
|
||||
tdate = self.date
|
||||
rate = Currency._get_rate([self.second_currency],tdate)
|
||||
if rate:
|
||||
rate = rate[self.second_currency.id]
|
||||
if self.amount_second_currency > 0:
|
||||
self.debit = round(rate * self.amount_second_currency,2)
|
||||
elif self.amount_second_currency > 0:
|
||||
self.credit = round(rate * abs(self.amount_second_currency),2)
|
||||
self.rate = self.get_rate()
|
||||
|
||||
@fields.depends(
|
||||
'debit', 'credit',
|
||||
'date','second_currency','amount_second_currency')
|
||||
'date','second_currency','amount_second_currency', 'rate',
|
||||
'origin', 'move_origin', 'move', '_parent_move.origin',
|
||||
'company', 'account')
|
||||
def on_change_second_currency(self):
|
||||
if self._manual_rate_mode():
|
||||
self.rate = self._get_second_currency_rate()
|
||||
self._compute_amount_from_second_currency()
|
||||
|
||||
@fields.depends(
|
||||
'debit', 'credit',
|
||||
'date','second_currency','amount_second_currency', 'rate',
|
||||
'origin', 'move_origin', 'move', '_parent_move.origin',
|
||||
'company', 'account')
|
||||
def on_change_rate(self):
|
||||
if self._manual_rate_mode() and not self.debit and not self.credit:
|
||||
self._compute_amount_from_second_currency()
|
||||
|
||||
def _manual_rate_mode(self):
|
||||
if getattr(self, 'origin', None) or getattr(self, 'move_origin', None):
|
||||
return False
|
||||
move = getattr(self, 'move', None)
|
||||
if move and getattr(move, 'origin', None):
|
||||
return False
|
||||
return True
|
||||
|
||||
def _get_second_currency_rate(self):
|
||||
Currency = Pool().get('currency.currency')
|
||||
Date = Pool().get('ir.date')
|
||||
if self.second_currency != None and self.amount_second_currency != None and (not self.credit and not self.debit):
|
||||
tdate = Date.today()
|
||||
if self.date:
|
||||
tdate = self.date
|
||||
rate = Currency._get_rate([self.second_currency],tdate)
|
||||
if rate:
|
||||
rate = rate[self.second_currency.id]
|
||||
if self.second_currency is None:
|
||||
return None
|
||||
tdate = Date.today()
|
||||
if self.date:
|
||||
tdate = self.date
|
||||
rates = Currency._get_rate([self.second_currency], tdate)
|
||||
return rates.get(self.second_currency.id) if rates else None
|
||||
|
||||
def _get_company_currency(self):
|
||||
Company = Pool().get('company.company')
|
||||
for record in (self, getattr(self, 'move', None),
|
||||
getattr(self, 'account', None)):
|
||||
company = getattr(record, 'company', None)
|
||||
if company:
|
||||
return company.currency
|
||||
company_id = Transaction().context.get('company')
|
||||
if company_id:
|
||||
return Company(company_id).currency
|
||||
|
||||
def _compute_amount_from_second_currency(self):
|
||||
if self.second_currency is not None and self.amount_second_currency is not None:
|
||||
if not self.rate:
|
||||
self.rate = self._get_second_currency_rate()
|
||||
if self.rate:
|
||||
company_currency = self._get_company_currency()
|
||||
if not company_currency:
|
||||
return
|
||||
amount = company_currency.round(
|
||||
abs(self.amount_second_currency) / self.rate)
|
||||
if self.amount_second_currency > 0:
|
||||
self.debit = round(rate * self.amount_second_currency,2)
|
||||
elif self.amount_second_currency > 0:
|
||||
self.credit = round(rate * abs(self.amount_second_currency),2)
|
||||
self.rate = self.get_rate()
|
||||
self.debit = amount
|
||||
self.credit = Decimal(0)
|
||||
elif self.amount_second_currency < 0:
|
||||
self.debit = Decimal(0)
|
||||
self.credit = amount
|
||||
else:
|
||||
self.debit = Decimal(0)
|
||||
self.credit = Decimal(0)
|
||||
|
||||
@fields.depends(
|
||||
'move', 'debit', 'credit',
|
||||
@@ -1223,15 +1263,26 @@ class Line(DescriptionOriginMixin, MoveLineMixin, ModelSQL, ModelView):
|
||||
if self.debit:
|
||||
self.credit = Decimal(0)
|
||||
self._amount_second_currency_sign()
|
||||
self.rate = self.get_rate()
|
||||
|
||||
@fields.depends('debit', 'credit', 'amount_second_currency')
|
||||
def on_change_credit(self):
|
||||
if self.credit:
|
||||
self.debit = Decimal(0)
|
||||
self._amount_second_currency_sign()
|
||||
self.rate = self.get_rate()
|
||||
|
||||
@fields.depends('amount_second_currency', 'debit', 'credit')
|
||||
@fields.depends(
|
||||
'amount_second_currency', 'debit', 'credit', 'date', 'second_currency',
|
||||
'rate', 'origin', 'move_origin', 'move', '_parent_move.origin',
|
||||
'company', 'account')
|
||||
def on_change_amount_second_currency(self):
|
||||
if self._manual_rate_mode():
|
||||
if not self.rate:
|
||||
self.rate = self._get_second_currency_rate()
|
||||
self._compute_amount_from_second_currency()
|
||||
elif not self.rate:
|
||||
self.rate = self.get_rate()
|
||||
self._amount_second_currency_sign()
|
||||
|
||||
def _amount_second_currency_sign(self):
|
||||
@@ -1241,6 +1292,7 @@ class Line(DescriptionOriginMixin, MoveLineMixin, ModelSQL, ModelView):
|
||||
self.amount_second_currency = \
|
||||
self.amount_second_currency.copy_sign(
|
||||
(self.debit or 0) - (self.credit or 0))
|
||||
self._set_rate_from_amounts()
|
||||
|
||||
@fields.depends('account')
|
||||
def on_change_account(self):
|
||||
@@ -1545,6 +1597,14 @@ class Line(DescriptionOriginMixin, MoveLineMixin, ModelSQL, ModelView):
|
||||
for fname in move_fields(move_name=False):
|
||||
vals.setdefault(fname, None)
|
||||
lines = super(Line, cls).create(vlist)
|
||||
to_save = []
|
||||
for line in lines:
|
||||
if (getattr(line, 'amount_second_currency', None)
|
||||
and not getattr(line, 'rate', None)):
|
||||
line._set_rate_from_amounts()
|
||||
to_save.append(line)
|
||||
if to_save:
|
||||
cls.save(to_save)
|
||||
period_and_journals = set((line.period, line.journal)
|
||||
for line in lines)
|
||||
for period, journal in period_and_journals:
|
||||
|
||||
@@ -12,7 +12,7 @@ from trytond.modules.account.exceptions import (
|
||||
from trytond.modules.account.tax import TaxableMixin
|
||||
from trytond.modules.company.tests import (
|
||||
CompanyTestMixin, PartyCompanyCheckEraseMixin, create_company, set_company)
|
||||
from trytond.modules.currency.tests import create_currency
|
||||
from trytond.modules.currency.tests import add_currency_rate, create_currency
|
||||
from trytond.pool import Pool
|
||||
from trytond.tests.test_tryton import ModuleTestCase, with_transaction
|
||||
from trytond.transaction import Transaction, inactive_records
|
||||
@@ -576,6 +576,54 @@ class AccountTestCase(
|
||||
self.assertEqual(
|
||||
cash_cur.amount_second_currency, Decimal(50))
|
||||
|
||||
@with_transaction()
|
||||
def test_move_line_second_currency_amount_on_change(self):
|
||||
'Test account move line computes amount from second currency'
|
||||
pool = Pool()
|
||||
Account = pool.get('account.account')
|
||||
Line = pool.get('account.move.line')
|
||||
|
||||
company = create_company()
|
||||
with set_company(company):
|
||||
create_chart(company)
|
||||
second_currency = create_currency('sec')
|
||||
add_currency_rate(second_currency, Decimal('0.939506'))
|
||||
|
||||
expense, = Account.search([
|
||||
('type.expense', '=', True),
|
||||
])
|
||||
|
||||
line = Line(
|
||||
account=expense,
|
||||
second_currency=second_currency,
|
||||
amount_second_currency=Decimal('100.00'))
|
||||
line.on_change_amount_second_currency()
|
||||
|
||||
self.assertEqual(line.debit, Decimal('106.44'))
|
||||
self.assertEqual(line.credit, Decimal(0))
|
||||
self.assertEqual(line.rate, Decimal('0.939506'))
|
||||
self.assertEqual(line.get_rate(), Decimal('0.939496'))
|
||||
|
||||
line = Line(
|
||||
account=expense,
|
||||
credit=Decimal('7.61'),
|
||||
second_currency=second_currency,
|
||||
amount_second_currency=Decimal('-108.10'))
|
||||
line.on_change_amount_second_currency()
|
||||
|
||||
self.assertEqual(line.debit, Decimal(0))
|
||||
self.assertEqual(line.credit, Decimal('115.06'))
|
||||
self.assertEqual(line.rate, Decimal('0.939506'))
|
||||
self.assertEqual(line.get_rate(), Decimal('0.939510'))
|
||||
|
||||
line.debit = line.credit = Decimal(0)
|
||||
line.rate = Decimal('1.100000')
|
||||
line.on_change_rate()
|
||||
|
||||
self.assertEqual(line.debit, Decimal(0))
|
||||
self.assertEqual(line.credit, Decimal('98.27'))
|
||||
self.assertEqual(line.rate, Decimal('1.100000'))
|
||||
|
||||
@with_transaction()
|
||||
def test_account_type_amount(self):
|
||||
"Test account type amount"
|
||||
|
||||
@@ -26,6 +26,8 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<field name="amount_second_currency" symbol=""/>
|
||||
<label name="second_currency"/>
|
||||
<field name="second_currency"/>
|
||||
<label name="rate"/>
|
||||
<field name="rate"/>
|
||||
</page>
|
||||
<page name="tax_lines">
|
||||
<field name="tax_lines" colspan="4"/>
|
||||
|
||||
15
modules/account_ch_os/__init__.py
Normal file
15
modules/account_ch_os/__init__.py
Normal file
@@ -0,0 +1,15 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
|
||||
from trytond.pool import Pool
|
||||
|
||||
from . import account
|
||||
|
||||
|
||||
def register():
|
||||
Pool.register(
|
||||
account.AccountTemplate,
|
||||
module='account_ch_os', type_='model')
|
||||
Pool.register(
|
||||
account.CreateChart,
|
||||
module='account_ch_os', type_='wizard')
|
||||
27
modules/account_ch_os/account.py
Normal file
27
modules/account_ch_os/account.py
Normal file
@@ -0,0 +1,27 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
|
||||
from trytond.pool import Pool, PoolMeta
|
||||
|
||||
|
||||
class AccountTemplate(metaclass=PoolMeta):
|
||||
__name__ = 'account.account.template'
|
||||
|
||||
|
||||
class CreateChart(metaclass=PoolMeta):
|
||||
__name__ = 'account.create_chart'
|
||||
|
||||
def default_properties(self, fields):
|
||||
pool = Pool()
|
||||
ModelData = pool.get('ir.model.data')
|
||||
defaults = super().default_properties(fields)
|
||||
try:
|
||||
template_id = ModelData.get_id('account_ch_os', 'root')
|
||||
except KeyError:
|
||||
return defaults
|
||||
if self.account.account_template.id == template_id:
|
||||
defaults['account_receivable'] = self.get_account(
|
||||
'account_ch_os.acct_110000')
|
||||
defaults['account_payable'] = self.get_account(
|
||||
'account_ch_os.acct_200000')
|
||||
return defaults
|
||||
2395
modules/account_ch_os/account_ch_os.xml
Normal file
2395
modules/account_ch_os/account_ch_os.xml
Normal file
File diff suppressed because it is too large
Load Diff
2
modules/account_ch_os/tests/__init__.py
Normal file
2
modules/account_ch_os/tests/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
12
modules/account_ch_os/tests/test_module.py
Normal file
12
modules/account_ch_os/tests/test_module.py
Normal file
@@ -0,0 +1,12 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
|
||||
from trytond.tests.test_tryton import ModuleTestCase
|
||||
|
||||
|
||||
class AccountCHOSTestCase(ModuleTestCase):
|
||||
'Test Account CH OS module'
|
||||
module = 'account_ch_os'
|
||||
|
||||
|
||||
del ModuleTestCase
|
||||
6
modules/account_ch_os/tryton.cfg
Normal file
6
modules/account_ch_os/tryton.cfg
Normal file
@@ -0,0 +1,6 @@
|
||||
[tryton]
|
||||
version=7.2.3
|
||||
depends:
|
||||
account
|
||||
xml:
|
||||
account_ch_os.xml
|
||||
@@ -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
|
||||
@@ -515,7 +515,9 @@ class Invoice(Workflow, ModelSQL, ModelView, TaxableMixin, InvoiceReportMixin):
|
||||
~((table.state == 'cancelled') & (table.number == Null)),
|
||||
CharLength(table.number), table.number]
|
||||
|
||||
@fields.depends('selection_rate','rate_date')
|
||||
@fields.depends(
|
||||
'selection_rate', 'rate_date', 'currency', 'company', 'invoice_date',
|
||||
'lines')
|
||||
def on_change_with_rate(self, name=None):
|
||||
return self.get_selected_rate()
|
||||
|
||||
@@ -528,8 +530,8 @@ class Invoice(Workflow, ModelSQL, ModelView, TaxableMixin, InvoiceReportMixin):
|
||||
def get_selected_rate(self,name=None):
|
||||
Currency = Pool().get('currency.currency')
|
||||
Date = Pool().get('ir.date')
|
||||
company = self.company
|
||||
currency = self.currency
|
||||
company = getattr(self, 'company', None)
|
||||
currency = getattr(self, 'currency', None)
|
||||
|
||||
if not currency or not company:
|
||||
return None
|
||||
@@ -1218,6 +1220,7 @@ class Invoice(Workflow, ModelSQL, ModelView, TaxableMixin, InvoiceReportMixin):
|
||||
line.amount_second_currency = (
|
||||
line.amount_second_currency.copy_sign(
|
||||
line.debit - line.credit))
|
||||
line.rate = line.get_rate()
|
||||
line.account = self.account
|
||||
logger.info("_GET_MOVE_LINE_ACCOUNT:%s",line.account)
|
||||
if self.account.party_required:
|
||||
@@ -1286,14 +1289,16 @@ class Invoice(Workflow, ModelSQL, ModelView, TaxableMixin, InvoiceReportMixin):
|
||||
remainder = sum(l.debit - l.credit for l in move_lines)
|
||||
if self.payment_term:
|
||||
payment_date = self.payment_term_date or self.invoice_date or today
|
||||
model = str(self.lines[0].origin).split(",")[0] if self.lines[0].origin else None
|
||||
origin = self.lines[0].origin if self.lines and self.lines[0].origin else None
|
||||
model = str(origin).split(",")[0] if origin else None
|
||||
logger.info("MODEL:%s",model)
|
||||
line = None
|
||||
if model:
|
||||
Line = Pool().get(model)
|
||||
line = Line(int(str(self.lines[0].origin).split(",")[1]))
|
||||
line = Line(int(str(origin).split(",")[1]))
|
||||
logger.info("LINE:%s",line)
|
||||
term_lines = self.payment_term.compute(
|
||||
self.total_amount, self.currency, payment_date, line)
|
||||
term_lines = self.payment_term.compute(
|
||||
self.total_amount, self.currency, payment_date, line)
|
||||
else:
|
||||
term_lines = [(self.payment_term_date or today, self.total_amount)]
|
||||
past_payment_term_dates = []
|
||||
@@ -1890,17 +1895,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)
|
||||
@@ -1963,23 +1966,35 @@ class Invoice(Workflow, ModelSQL, ModelView, TaxableMixin, InvoiceReportMixin):
|
||||
move_line_.amount_second_currency = -original_amount
|
||||
|
||||
if amount < 0:
|
||||
lot_has_sale_invoice = (
|
||||
move_line.lot
|
||||
and (move_line.lot.sale_invoice_line
|
||||
or move_line.lot.sale_invoice_line_prov))
|
||||
move_line.debit = Decimal(0)
|
||||
move_line.credit = -amount
|
||||
move_line.account = gl.product.account_stock_used if not (move_line.lot.sale_invoice_line or move_line.lot.sale_invoice_line_prov) else gl.product.account_stock_out_used
|
||||
move_line.account = gl.product.account_stock_used if not lot_has_sale_invoice else gl.product.account_stock_out_used
|
||||
move_line.account = gl.product.account_cogs_used if gl.fee else move_line.account
|
||||
move_line_.credit = Decimal(0)
|
||||
move_line_.debit = -amount
|
||||
move_line_.account = gl.product.account_stock_in_used
|
||||
else:
|
||||
lot_has_sale_invoice = (
|
||||
move_line.lot
|
||||
and (move_line.lot.sale_invoice_line
|
||||
or move_line.lot.sale_invoice_line_prov))
|
||||
move_line.debit = amount
|
||||
move_line.credit = Decimal(0)
|
||||
move_line.account = gl.product.account_stock_used if not (move_line.lot.sale_invoice_line or move_line.lot.sale_invoice_line_prov) else gl.product.account_stock_out_used
|
||||
move_line.account = gl.product.account_stock_used if not lot_has_sale_invoice else gl.product.account_stock_out_used
|
||||
move_line.account = gl.product.account_cogs_used if gl.fee else move_line.account
|
||||
move_line_.debit = Decimal(0)
|
||||
move_line_.credit = amount
|
||||
move_line_.account = gl.product.account_stock_in_used
|
||||
|
||||
move_lines = [move_line,move_line_]
|
||||
if getattr(move_line, 'amount_second_currency', None):
|
||||
move_line.rate = move_line.get_rate()
|
||||
if getattr(move_line_, 'amount_second_currency', None):
|
||||
move_line_.rate = move_line_.get_rate()
|
||||
|
||||
if drop:
|
||||
drop_line = AccountMoveLine()
|
||||
@@ -2017,6 +2032,10 @@ class Invoice(Workflow, ModelSQL, ModelView, TaxableMixin, InvoiceReportMixin):
|
||||
drop_line_.second_currency = self.currency
|
||||
drop_line_.amount_second_currency = -original_amount
|
||||
move_lines = [drop_line,drop_line_]
|
||||
if getattr(drop_line, 'amount_second_currency', None):
|
||||
drop_line.rate = drop_line.get_rate()
|
||||
if getattr(drop_line_, 'amount_second_currency', None):
|
||||
drop_line_.rate = drop_line_.get_rate()
|
||||
|
||||
return move_lines
|
||||
|
||||
@@ -3252,6 +3271,7 @@ class InvoiceLine(sequence_ordered(), ModelSQL, ModelView, TaxableMixin):
|
||||
line.amount_second_currency = (
|
||||
line.amount_second_currency.copy_sign(
|
||||
line.debit - line.credit))
|
||||
line.rate = line.get_rate()
|
||||
line.account = self.account
|
||||
logger.info("GET_MOVE_LINES_ACCOUNT:%s",line.account)
|
||||
if self.account.party_required:
|
||||
@@ -3547,6 +3567,7 @@ class InvoiceTax(sequence_ordered(), ModelSQL, ModelView):
|
||||
line.amount_second_currency = (
|
||||
line.amount_second_currency.copy_sign(
|
||||
line.debit - line.credit))
|
||||
line.rate = line.get_rate()
|
||||
line.account = self.account
|
||||
if self.account.party_required:
|
||||
line.party = self.invoice.party
|
||||
|
||||
@@ -288,7 +288,7 @@ this repository contains the full copyright notices and license terms. -->
|
||||
</record>
|
||||
|
||||
<record model="ir.action.report" id="report_invoice">
|
||||
<field name="name">Provisional Invoice</field>
|
||||
<field name="name">Invoice</field>
|
||||
<field name="model">account.invoice</field>
|
||||
<field name="report_name">account.invoice</field>
|
||||
<field name="report">account_invoice/invoice.fodt</field>
|
||||
@@ -314,7 +314,7 @@ this repository contains the full copyright notices and license terms. -->
|
||||
</record>
|
||||
|
||||
<record model="ir.action.report" id="report_invoice_ict_final">
|
||||
<field name="name">Final Invoice</field>
|
||||
<field name="name">CN/DN</field>
|
||||
<field name="model">account.invoice</field>
|
||||
<field name="report_name">account.invoice</field>
|
||||
<field name="report">account_invoice/invoice_ict_final.fodt</field>
|
||||
|
||||
@@ -2,19 +2,19 @@
|
||||
|
||||
<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>
|
||||
<dc:title>Provisional Invoice</dc:title>
|
||||
<dc:title>Invoice</dc:title>
|
||||
<meta:initial-creator>willen</meta:initial-creator>
|
||||
|
||||
|
||||
|
||||
<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>
|
||||
@@ -3866,7 +3910,7 @@
|
||||
<table:table-row table:style-name="Tableau3.1">
|
||||
<table:table-cell table:style-name="Tableau3.A1" office:value-type="string">
|
||||
<text:p text:style-name="P22"/>
|
||||
<text:p text:style-name="P22">Provisional Invoice</text:p>
|
||||
<text:p text:style-name="P22">Invoice</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau3.A1" office:value-type="string">
|
||||
<text:p text:style-name="P22"/>
|
||||
@@ -3930,15 +3974,19 @@
|
||||
<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> MTS)</text:p>
|
||||
<text:p text:style-name="P21"><text:placeholder text:placeholder-type="text"><invoice.report_description_upper or invoice.report_product_description></text:placeholder><text:s/>CROP <text:placeholder text:placeholder-type="text"><invoice.report_crop_name></text:placeholder></text:p>
|
||||
<text:p text:style-name="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>
|
||||
<text:p text:style-name="P18">At <text:placeholder text:placeholder-type="text"><invoice.report_rate_currency_upper></text:placeholder><text:s/><text:placeholder text:placeholder-type="text"><invoice.report_rate_value></text:placeholder><text:s/>PER <text:placeholder text:placeholder-type="text"><invoice.report_rate_unit_upper></text:placeholder><text:s/>(<text:placeholder text:placeholder-type="text"><invoice.report_rate_price_words></text:placeholder>) <text:placeholder text:placeholder-type="text"><invoice.report_rate_pricing_text></text:placeholder></text:p>
|
||||
<text:p text:style-name="P26"><text:placeholder text:placeholder-type="text"><for each="block in invoice.report_trade_blocks"></text:placeholder></text:p>
|
||||
<text:p text:style-name="P26"><text:placeholder text:placeholder-type="text"><block[0]></text:placeholder></text:p>
|
||||
<text:p text:style-name="P18">At <text:placeholder text:placeholder-type="text"><block[1]></text:placeholder></text:p>
|
||||
<text:p text:style-name="P18"/>
|
||||
<text:p text:style-name="P26"><text:placeholder text:placeholder-type="text"></for></text:placeholder></text:p>
|
||||
<text:p text:style-name="P18"/>
|
||||
<text:p text:style-name="P18"/>
|
||||
<text:p text:style-name="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="P26">PROFORMA INVOICE NO. <text:placeholder text:placeholder-type="text"><invoice.report_proforma_invoice_number></text:placeholder><text:s/>DATED <text:placeholder text:placeholder-type="text"><format_date(invoice.report_proforma_invoice_date, invoice.party.lang) if invoice.report_proforma_invoice_date else ''></text:placeholder>.</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"/>
|
||||
</table:table-cell>
|
||||
@@ -3952,10 +4000,10 @@
|
||||
<text:p text:style-name="P15"><text:s text:c="19"/>BALES</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau6.A1" office:value-type="string">
|
||||
<text:p text:style-name="P41"><text:s text:c="13"/>Gross KGS</text:p>
|
||||
<text:p text:style-name="P41"><text:s text:c="13"/>Gross <text:placeholder text:placeholder-type="text"><invoice.report_weight_unit_upper></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau6.A1" office:value-type="string">
|
||||
<text:p text:style-name="P15"><text:s text:c="13"/>NET KGS</text:p>
|
||||
<text:p text:style-name="P15"><text:s text:c="13"/>NET <text:placeholder text:placeholder-type="text"><invoice.report_weight_unit_upper></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau6.A1" office:value-type="string">
|
||||
<text:p text:style-name="P41"><text:s text:c="10"/></text:p>
|
||||
@@ -3969,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"/>
|
||||
@@ -3996,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"/>
|
||||
@@ -4009,13 +4057,18 @@
|
||||
<table:table-column table:style-name="Tableau8.B"/>
|
||||
<table:table-row table:style-name="Tableau8.1">
|
||||
<table:table-cell table:style-name="Tableau8.A1" office:value-type="string">
|
||||
<text:p text:style-name="P14">At <text:placeholder text:placeholder-type="text"><invoice.report_rate_currency_upper></text:placeholder><text:s/><text:placeholder text:placeholder-type="text"><invoice.report_rate_value></text:placeholder><text:s/>PER <text:placeholder text:placeholder-type="text"><invoice.report_rate_unit_upper></text:placeholder><text:s/>(<text:placeholder text:placeholder-type="text"><invoice.report_rate_price_words></text:placeholder>) <text:placeholder text:placeholder-type="text"><invoice.report_rate_pricing_text></text:placeholder></text:p>
|
||||
<text:p text:style-name="P14"><text:placeholder text:placeholder-type="text"><for each="line in invoice.report_rate_lines.splitlines()"></text:placeholder></text:p>
|
||||
<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">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>
|
||||
@@ -4027,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>
|
||||
@@ -4052,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>
|
||||
|
||||
@@ -2,33 +2,33 @@
|
||||
|
||||
<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>
|
||||
<dc:title>Final Invoice</dc:title>
|
||||
<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>
|
||||
@@ -3852,7 +3933,7 @@
|
||||
<table:table-row table:style-name="Tableau3.1">
|
||||
<table:table-cell table:style-name="Tableau3.A1" office:value-type="string">
|
||||
<text:p text:style-name="P23"/>
|
||||
<text:p text:style-name="P23">Final Invoice</text:p>
|
||||
<text:p text:style-name="P23"><text:placeholder text:placeholder-type="text"><invoice.report_note_title></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau3.A1" office:value-type="string">
|
||||
<text:p text:style-name="P23"/>
|
||||
@@ -3916,23 +3997,19 @@
|
||||
<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"><text:placeholder text:placeholder-type="text"><for each="line in invoice.lines"></text:placeholder></text:p>
|
||||
<text:p text:style-name="P28"><text:placeholder text:placeholder-type="text"><if test="line.type == 'line'"></text:placeholder></text:p>
|
||||
<text:p text:style-name="P22"><text:placeholder text:placeholder-type="text"><if test="line.report_description_upper"></text:placeholder></text:p>
|
||||
<text:p text:style-name="P22"><text:placeholder text:placeholder-type="text"><line.report_description_upper></text:placeholder></text:p>
|
||||
<text:p text:style-name="P22"><text:placeholder text:placeholder-type="text"></if></text:placeholder></text:p>
|
||||
<text:p text:style-name="P27">QUANTITY <text:placeholder text:placeholder-type="text"><format_number(line.report_lbs, invoice.party.lang) if line.report_lbs != '' else ''></text:placeholder><text:s/>LBS (<text:placeholder text:placeholder-type="text"><format_number(line.report_net, invoice.party.lang) if line.report_net != '' else ''></text:placeholder> MTS)</text:p>
|
||||
<text:p text:style-name="P21"><text:placeholder text:placeholder-type="text"><line.report_product_description or line.product_name or ''></text:placeholder><text:s/>CROP <text:placeholder text:placeholder-type="text"><line.report_crop_name></text:placeholder></text:p>
|
||||
<text:p text:style-name="P21"><text:placeholder text:placeholder-type="text"><line.report_attributes_name></text:placeholder></text:p>
|
||||
<text:p text:style-name="P18">At <text:placeholder text:placeholder-type="text"><line.report_rate_currency_upper></text:placeholder><text:s/><text:placeholder text:placeholder-type="text"><line.report_rate_value></text:placeholder><text:s/>PER <text:placeholder text:placeholder-type="text"><line.report_rate_unit_upper></text:placeholder><text:s/>(<text:placeholder text:placeholder-type="text"><line.report_rate_price_words></text:placeholder>) <text:placeholder text:placeholder-type="text"><line.report_rate_pricing_text></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>
|
||||
<text:p text:style-name="P27"><text:placeholder text:placeholder-type="text"><for each="block in invoice.report_trade_blocks"></text:placeholder></text:p>
|
||||
<text:p text:style-name="P27"><text:placeholder text:placeholder-type="text"><block[0]></text:placeholder></text:p>
|
||||
<text:p text:style-name="P18">At <text:placeholder text:placeholder-type="text"><block[1]></text:placeholder></text:p>
|
||||
<text:p text:style-name="P18"/>
|
||||
<text:p text:style-name="P21"><text:placeholder text:placeholder-type="text"></if></text:placeholder></text:p>
|
||||
<text:p text:style-name="P18"/>
|
||||
<text:p text:style-name="P21"><text:placeholder text:placeholder-type="text"></for></text:placeholder></text:p>
|
||||
<text:p text:style-name="P27"><text:placeholder text:placeholder-type="text"></for></text:placeholder></text:p>
|
||||
<text:p text:style-name="P21"/>
|
||||
<text:p text:style-name="P34"><text:placeholder text:placeholder-type="text"><invoice.report_incoterm></text:placeholder></text:p>
|
||||
<text:p text:style-name="P31"><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="P27">PROFORMA INVOICE NO. <text:placeholder text:placeholder-type="text"><invoice.report_proforma_invoice_number></text:placeholder><text:s/>DATED <text:placeholder text:placeholder-type="text"><format_date(invoice.report_proforma_invoice_date, invoice.party.lang) if invoice.report_proforma_invoice_date else ''></text:placeholder>.</text:p>
|
||||
<text:p text:style-name="P27"/>
|
||||
<text:p text:style-name="P27"/>
|
||||
<text:p text:style-name="P12"/>
|
||||
</table:table-cell>
|
||||
@@ -3946,10 +4023,10 @@
|
||||
<text:p text:style-name="P15"><text:s text:c="19"/>BALES</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau6.A1" office:value-type="string">
|
||||
<text:p text:style-name="P43"><text:s text:c="13"/>Gross KGS</text:p>
|
||||
<text:p text:style-name="P43"><text:s text:c="13"/>Gross <text:placeholder text:placeholder-type="text"><invoice.report_weight_unit_upper></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau6.A1" office:value-type="string">
|
||||
<text:p text:style-name="P15"><text:s text:c="13"/>NET KGS</text:p>
|
||||
<text:p text:style-name="P15"><text:s text:c="13"/>NET <text:placeholder text:placeholder-type="text"><invoice.report_weight_unit_upper></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau6.A1" office:value-type="string">
|
||||
<text:p text:style-name="P43"><text:s text:c="10"/></text:p>
|
||||
@@ -3960,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"/>
|
||||
@@ -3990,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,17 +4080,22 @@
|
||||
<table:table-column table:style-name="Tableau8.B"/>
|
||||
<table:table-row table:style-name="Tableau8.1">
|
||||
<table:table-cell table:style-name="Tableau8.A1" office:value-type="string">
|
||||
<text:p text:style-name="P14">At <text:placeholder text:placeholder-type="text"><invoice.report_rate_currency_upper></text:placeholder><text:s/><text:placeholder text:placeholder-type="text"><invoice.report_rate_value></text:placeholder><text:s/>PER <text:placeholder text:placeholder-type="text"><invoice.report_rate_unit_upper></text:placeholder><text:s/>(<text:placeholder text:placeholder-type="text"><invoice.report_rate_price_words></text:placeholder>) <text:placeholder text:placeholder-type="text"><invoice.report_rate_pricing_text></text:placeholder></text:p>
|
||||
<text:p text:style-name="P14"><text:placeholder text:placeholder-type="text"><for each="line in invoice.report_positive_rate_lines.splitlines()"></text:placeholder></text:p>
|
||||
<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>
|
||||
@@ -4021,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>
|
||||
@@ -4046,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>
|
||||
|
||||
1708
modules/account_invoice/invoice_melya.fodt
Normal file
1708
modules/account_invoice/invoice_melya.fodt
Normal file
File diff suppressed because it is too large
Load Diff
1499
modules/account_invoice/packing_list.fodt
Normal file
1499
modules/account_invoice/packing_list.fodt
Normal file
File diff suppressed because it is too large
Load Diff
1872
modules/account_invoice/payment_order.fodt
Normal file
1872
modules/account_invoice/payment_order.fodt
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
@@ -181,7 +181,11 @@ class InvoiceLine(metaclass=PoolMeta):
|
||||
company=self.invoice.company.id, date=accounting_date):
|
||||
anglo_saxon_move_lines = self._get_anglo_saxon_move_lines(
|
||||
cost, type_)
|
||||
if type_ == 'in_supplier' and (self.lot.sale_invoice_line_prov or self.lot.sale_invoice_line) and not self.fee:
|
||||
lot_has_sale_invoice = (
|
||||
self.lot
|
||||
and (self.lot.sale_invoice_line_prov
|
||||
or self.lot.sale_invoice_line))
|
||||
if type_ == 'in_supplier' and lot_has_sale_invoice and not self.fee:
|
||||
anglo_saxon_move_lines_ = self._get_anglo_saxon_move_lines(cost, 'out_customer')
|
||||
result.extend(anglo_saxon_move_lines)
|
||||
result.extend(anglo_saxon_move_lines_)
|
||||
|
||||
@@ -248,29 +248,10 @@ class AutomationDocument(ModelSQL, ModelView, Workflow):
|
||||
ShipmentWR.save([swr])
|
||||
doc.notes = (doc.notes or "") + f"Shipment found: {sh[0].number}\n"
|
||||
logger.info("BL_NUMBER:%s",sh[0].bl_number)
|
||||
if sh[0].incoming_moves:
|
||||
factor_net = wr.net_landed_kg / wr.bales if wr.bales else 1
|
||||
factor_gross = wr.gross_landed_kg / wr.bales if wr.bales else 1
|
||||
for move in sh[0].incoming_moves:
|
||||
lot = move.lot
|
||||
if lot.lot_type == 'physic':
|
||||
wr_payload = {
|
||||
"chunk_key": lot.lot_chunk_key,
|
||||
"gross_weight": float(round(Decimal(lot.lot_qt) * factor_gross,5)),
|
||||
"net_weight": float(round(Decimal(lot.lot_qt) * factor_net,5)),
|
||||
"tare_total": float(round(wr.tare_kg * (Decimal(lot.lot_qt) / wr.bales),5)) ,
|
||||
"bags": int(lot.lot_qt),
|
||||
"surveyor_code": sh[0].controller.get_alf(),
|
||||
"place_key": sh[0].to_location.get_places(),
|
||||
"report_date": int(wr.report_date.strftime("%Y%m%d")),#wr.report_date.isoformat() if wr.report_date else None,
|
||||
"weight_date": int(wr.weight_date.strftime("%Y%m%d")),#wr.weight_date.isoformat() if wr.weight_date else None,
|
||||
"agent": sh[0].agent.get_alf(),
|
||||
"forwarder_ref": sh[0].returned_id
|
||||
}
|
||||
logger.info("PAYLOAD:%s",wr_payload)
|
||||
data = doc.create_weight_report(wr_payload)
|
||||
doc.notes = (doc.notes or "") + f"WR created in Fintrade: {data.get('success')}\n"
|
||||
doc.notes = (doc.notes or "") + f"WR key: {data.get('weight_report_key')}\n"
|
||||
doc.notes = (
|
||||
(doc.notes or "")
|
||||
+ "Global WR linked to shipment. "
|
||||
+ "Create remote lot WRs from the weight report form.\n")
|
||||
|
||||
# if cls.rule_set.ocr_required:[]
|
||||
# cls.run_ocr([doc])
|
||||
|
||||
@@ -11,6 +11,7 @@ import traceback
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Cron(metaclass=PoolMeta):
|
||||
__name__ = 'ir.cron'
|
||||
|
||||
@@ -18,9 +19,11 @@ class Cron(metaclass=PoolMeta):
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.method.selection.append(
|
||||
('automation.cron|update_shipment', "Update Shipment from freight booking info")
|
||||
('automation.cron|update_shipment',
|
||||
"Update Shipment from freight booking info")
|
||||
)
|
||||
|
||||
|
||||
class AutomationCron(ModelSQL, ModelView):
|
||||
"Automation Cron"
|
||||
__name__ = 'automation.cron'
|
||||
@@ -30,7 +33,7 @@ class AutomationCron(ModelSQL, ModelView):
|
||||
('weekly', "Weekly"),
|
||||
('monthly', "Monthly"),
|
||||
], "Frequency", required=True,
|
||||
help="How frequently rates must be updated.")
|
||||
help="How frequently rates must be updated.")
|
||||
|
||||
last_update = fields.Date("Last Update", required=True)
|
||||
|
||||
@@ -70,12 +73,13 @@ class AutomationCron(ModelSQL, ModelView):
|
||||
))
|
||||
|
||||
rows = cursor.fetchall()
|
||||
logger.info(f"Nombre total de lignes à traiter : {len(rows)}")
|
||||
logger.info(f"Nombre total de lignes a traiter : {len(rows)}")
|
||||
|
||||
# ---- PREMIÈRE TRANSACTION : Création des objets de référence ----
|
||||
# Premiere transaction : creation des objets de reference
|
||||
with Transaction().new_transaction() as trans1:
|
||||
try:
|
||||
logger.info("Début de la création des objets de référence...")
|
||||
logger.info(
|
||||
"Debut de la creation des objets de reference...")
|
||||
|
||||
parties_to_save = []
|
||||
vessels_to_save = []
|
||||
@@ -85,7 +89,7 @@ class AutomationCron(ModelSQL, ModelView):
|
||||
vessels_cache = {}
|
||||
locations_cache = {}
|
||||
|
||||
# Collecter les données des objets de référence
|
||||
# Collecter les donnees des objets de reference
|
||||
for row in rows:
|
||||
(
|
||||
si_number, si_date, si_quantity, si_unit,
|
||||
@@ -97,7 +101,6 @@ class AutomationCron(ModelSQL, ModelView):
|
||||
comments, fintrade_booking_key
|
||||
) = row
|
||||
|
||||
# Fonction pour obtenir ou créer un Party
|
||||
def get_or_create_party(name):
|
||||
if not name:
|
||||
return None
|
||||
@@ -105,20 +108,18 @@ class AutomationCron(ModelSQL, ModelView):
|
||||
if name_upper in parties_cache:
|
||||
return parties_cache[name_upper]
|
||||
|
||||
# Chercher d'abord dans la base
|
||||
existing = Party.search([('name', '=', name_upper)], limit=1)
|
||||
existing = Party.search(
|
||||
[('name', '=', name_upper)], limit=1)
|
||||
if existing:
|
||||
parties_cache[name_upper] = existing[0]
|
||||
return existing[0]
|
||||
|
||||
# Créer un nouveau
|
||||
new_p = Party()
|
||||
new_p.name = name_upper
|
||||
parties_cache[name_upper] = new_p
|
||||
parties_to_save.append(new_p)
|
||||
return new_p
|
||||
|
||||
# Fonction pour obtenir ou créer un Vessel
|
||||
def get_or_create_vessel(name):
|
||||
if not name:
|
||||
return None
|
||||
@@ -126,7 +127,8 @@ class AutomationCron(ModelSQL, ModelView):
|
||||
if name_upper in vessels_cache:
|
||||
return vessels_cache[name_upper]
|
||||
|
||||
existing = Vessel.search([('vessel_name', '=', name_upper)], limit=1)
|
||||
existing = Vessel.search(
|
||||
[('vessel_name', '=', name_upper)], limit=1)
|
||||
if existing:
|
||||
vessels_cache[name_upper] = existing[0]
|
||||
return existing[0]
|
||||
@@ -137,7 +139,6 @@ class AutomationCron(ModelSQL, ModelView):
|
||||
vessels_to_save.append(new_v)
|
||||
return new_v
|
||||
|
||||
# Fonction pour obtenir ou créer une Location
|
||||
def get_or_create_location(name, type_):
|
||||
if not name:
|
||||
return None
|
||||
@@ -148,9 +149,8 @@ class AutomationCron(ModelSQL, ModelView):
|
||||
|
||||
existing = Location.search([
|
||||
('name', '=', name_upper),
|
||||
('type', '=', type_)
|
||||
('type', '=', type_),
|
||||
], limit=1)
|
||||
|
||||
if existing:
|
||||
locations_cache[key] = existing[0]
|
||||
return existing[0]
|
||||
@@ -162,40 +162,40 @@ class AutomationCron(ModelSQL, ModelView):
|
||||
locations_to_save.append(new_loc)
|
||||
return new_loc
|
||||
|
||||
# Collecter les objets à créer
|
||||
_ = get_or_create_party(carrier_name)
|
||||
_ = get_or_create_party(agent_name)
|
||||
_ = get_or_create_vessel(vessel_name)
|
||||
_ = get_or_create_location(loading_name, 'supplier')
|
||||
_ = get_or_create_location(destination_name, 'customer')
|
||||
|
||||
# Sauvegarder tous les objets de référence
|
||||
if parties_to_save:
|
||||
logger.info(f"Création de {len(parties_to_save)} parties...")
|
||||
logger.info(f"Creation de {len(parties_to_save)} parties...")
|
||||
Party.save(parties_to_save)
|
||||
|
||||
if vessels_to_save:
|
||||
logger.info(f"Création de {len(vessels_to_save)} vessels...")
|
||||
logger.info(f"Creation de {len(vessels_to_save)} vessels...")
|
||||
Vessel.save(vessels_to_save)
|
||||
|
||||
if locations_to_save:
|
||||
logger.info(f"Création de {len(locations_to_save)} locations...")
|
||||
logger.info(
|
||||
f"Creation de {len(locations_to_save)} locations...")
|
||||
Location.save(locations_to_save)
|
||||
|
||||
trans1.commit()
|
||||
logger.info("Première transaction commitée : objets de référence créés")
|
||||
logger.info(
|
||||
"Premiere transaction commitee : objets de reference crees")
|
||||
|
||||
except Exception as e:
|
||||
trans1.rollback()
|
||||
logger.error(f"Erreur dans la création des objets de référence : {e}")
|
||||
logger.error(
|
||||
f"Erreur dans la creation des objets de reference : {e}")
|
||||
logger.error(traceback.format_exc())
|
||||
raise
|
||||
|
||||
# ---- TRANSACTIONS INDIVIDUELLES pour chaque shipment ----
|
||||
# Transactions individuelles pour chaque shipment
|
||||
successful_shipments = 0
|
||||
failed_shipments = []
|
||||
|
||||
# Recréer le curseur après la nouvelle transaction
|
||||
cursor2 = Transaction().connection.cursor()
|
||||
cursor2.execute(*t.select(
|
||||
t.ShippingInstructionNumber,
|
||||
@@ -232,40 +232,73 @@ class AutomationCron(ModelSQL, ModelView):
|
||||
|
||||
logger.info(f"Traitement shipment {i}/{len(rows2)} : SI {si_number}")
|
||||
|
||||
# ---- TRANSACTION INDIVIDUELLE pour ce shipment ----
|
||||
try:
|
||||
with Transaction().new_transaction() as trans_shipment:
|
||||
logger.info(f"Début transaction pour SI {si_number}")
|
||||
logger.info(f"Debut transaction pour SI {si_number}")
|
||||
|
||||
# Vérifier si le shipment existe déjà
|
||||
existing_shipment = ShipmentIn.search([
|
||||
('reference', '=', si_number)
|
||||
], limit=1)
|
||||
|
||||
if existing_shipment:
|
||||
logger.info(f"Shipment {si_number} existe déjà, ignoré")
|
||||
shipment = existing_shipment[0]
|
||||
if shipment.incoming_moves:
|
||||
logger.info(
|
||||
"Shipment %s existe deja avec lots, ignore",
|
||||
si_number)
|
||||
trans_shipment.commit()
|
||||
continue
|
||||
|
||||
logger.info(
|
||||
"Shipment %s existe deja sans lots, verification freight_booking_lots",
|
||||
si_number)
|
||||
inv_date, inv_nb = shipment._create_lots_from_fintrade()
|
||||
shipment = ShipmentIn(shipment.id)
|
||||
if shipment.incoming_moves:
|
||||
shipment.controller = shipment.get_controller()
|
||||
shipment.controller_target = controller
|
||||
if not shipment.fees:
|
||||
shipment.create_fee(shipment.controller)
|
||||
shipment.instructions = shipment.get_instructions_html(
|
||||
inv_date, inv_nb)
|
||||
ShipmentIn.save([shipment])
|
||||
logger.info(
|
||||
"Shipment %s mis a jour avec %s incoming move(s)",
|
||||
si_number, len(shipment.incoming_moves))
|
||||
else:
|
||||
logger.info(
|
||||
"Shipment %s existe sans lots et aucun lot disponible pour l'instant",
|
||||
si_number)
|
||||
trans_shipment.commit()
|
||||
continue
|
||||
|
||||
# Récupérer les objets (maintenant ils existent dans la base)
|
||||
carrier = None
|
||||
if carrier_name:
|
||||
carrier_list = Party.search([('name', '=', str(carrier_name).strip().upper())], limit=1)
|
||||
carrier_list = Party.search([
|
||||
('name', '=',
|
||||
str(carrier_name).strip().upper())
|
||||
], limit=1)
|
||||
if carrier_list:
|
||||
carrier = carrier_list[0]
|
||||
logger.info(f"Carrier trouvé pour {si_number}: {carrier.name}")
|
||||
logger.info(
|
||||
f"Carrier trouve pour {si_number}: {carrier.name}")
|
||||
else:
|
||||
logger.warning(f"Carrier NON TROUVÉ pour {si_number}: '{carrier_name}'")
|
||||
logger.warning(
|
||||
f"Carrier NON TROUVE pour {si_number}: '{carrier_name}'")
|
||||
|
||||
agent = None
|
||||
|
||||
agent_list = Party.search([('name', '=', str(agent_name or 'TBN').strip().upper())], limit=1)
|
||||
agent_list = Party.search([
|
||||
('name', '=', str(agent_name or 'TBN').strip().upper())
|
||||
], limit=1)
|
||||
if agent_list:
|
||||
agent = agent_list[0]
|
||||
|
||||
vessel = None
|
||||
if vessel_name:
|
||||
vessel_list = Vessel.search([('vessel_name', '=', str(vessel_name).strip().upper())], limit=1)
|
||||
vessel_list = Vessel.search([
|
||||
('vessel_name', '=',
|
||||
str(vessel_name).strip().upper())
|
||||
], limit=1)
|
||||
if vessel_list:
|
||||
vessel = vessel_list[0]
|
||||
|
||||
@@ -287,18 +320,18 @@ class AutomationCron(ModelSQL, ModelView):
|
||||
if loc_to_list:
|
||||
loc_to = loc_to_list[0]
|
||||
|
||||
# Vérification critique du carrier
|
||||
if not carrier:
|
||||
error_msg = f"ERREUR CRITIQUE: Carrier manquant pour SI {si_number} (valeur: '{carrier_name}')"
|
||||
error_msg = (
|
||||
f"ERREUR CRITIQUE: Carrier manquant pour SI {si_number} "
|
||||
f"(valeur: '{carrier_name}')")
|
||||
logger.error(error_msg)
|
||||
raise ValueError(error_msg)
|
||||
|
||||
# Créer le shipment
|
||||
shipment = ShipmentIn()
|
||||
shipment.reference = si_number
|
||||
shipment.from_location = loc_from
|
||||
shipment.to_location = loc_to
|
||||
shipment.carrier = None #carrier
|
||||
shipment.carrier = None # carrier
|
||||
shipment.supplier = agent
|
||||
shipment.agent = agent
|
||||
shipment.vessel = vessel
|
||||
@@ -308,20 +341,19 @@ class AutomationCron(ModelSQL, ModelView):
|
||||
shipment.etd = etd_date
|
||||
shipment.etad = shipment.bl_date + timedelta(days=20)
|
||||
|
||||
# Sauvegarder ce shipment uniquement
|
||||
ShipmentIn.save([shipment])
|
||||
inv_date,inv_nb = shipment._create_lots_from_fintrade()
|
||||
inv_date, inv_nb = shipment._create_lots_from_fintrade()
|
||||
shipment.controller = shipment.get_controller()
|
||||
shipment.controller_target = controller
|
||||
shipment.create_fee(shipment.controller)
|
||||
shipment.instructions = shipment.get_instructions_html(inv_date,inv_nb)
|
||||
shipment.instructions = shipment.get_instructions_html(
|
||||
inv_date, inv_nb)
|
||||
ShipmentIn.save([shipment])
|
||||
trans_shipment.commit()
|
||||
successful_shipments += 1
|
||||
logger.info(f"✓ Shipment {si_number} créé avec succès")
|
||||
logger.info(f"Shipment {si_number} cree avec succes")
|
||||
|
||||
except Exception as e:
|
||||
# Cette transaction échoue mais les autres continuent
|
||||
error_details = {
|
||||
'si_number': si_number,
|
||||
'carrier_name': carrier_name,
|
||||
@@ -330,7 +362,7 @@ class AutomationCron(ModelSQL, ModelView):
|
||||
}
|
||||
failed_shipments.append(error_details)
|
||||
|
||||
logger.error(f"✗ ERREUR pour shipment {si_number}: {e}")
|
||||
logger.error(f"ERREUR pour shipment {si_number}: {e}")
|
||||
logger.error(f" Carrier: '{carrier_name}'")
|
||||
logger.error(f" Agent: '{agent_name}'")
|
||||
logger.error(f" Vessel: '{vessel_name}'")
|
||||
@@ -339,23 +371,21 @@ class AutomationCron(ModelSQL, ModelView):
|
||||
if line.strip():
|
||||
logger.error(f" {line}")
|
||||
|
||||
# ---- RÉSUMÉ FINAL ----
|
||||
logger.info("=" * 60)
|
||||
logger.info("RÉSUMÉ DE L'EXÉCUTION")
|
||||
logger.info("RESUME DE L'EXECUTION")
|
||||
logger.info("=" * 60)
|
||||
logger.info(f"Total de shipments à traiter : {len(rows2)}")
|
||||
logger.info(f"Shipments créés avec succès : {successful_shipments}")
|
||||
logger.info(f"Shipments en échec : {len(failed_shipments)}")
|
||||
logger.info(f"Total de shipments a traiter : {len(rows2)}")
|
||||
logger.info(f"Shipments crees avec succes : {successful_shipments}")
|
||||
logger.info(f"Shipments en echec : {len(failed_shipments)}")
|
||||
|
||||
if failed_shipments:
|
||||
logger.info("\nDétail des échecs :")
|
||||
logger.info("\nDetail des echecs :")
|
||||
for i, error in enumerate(failed_shipments, 1):
|
||||
logger.info(f" {i}. SI {error['si_number']}:")
|
||||
logger.info(f" Carrier: '{error['carrier_name']}'")
|
||||
logger.info(f" Erreur: {error['error']}")
|
||||
|
||||
# Log supplémentaire pour debug
|
||||
logger.info("\nAnalyse des carriers problématiques :")
|
||||
logger.info("\nAnalyse des carriers problematiques :")
|
||||
problematic_carriers = {}
|
||||
for error in failed_shipments:
|
||||
carrier = error['carrier_name']
|
||||
@@ -365,13 +395,14 @@ class AutomationCron(ModelSQL, ModelView):
|
||||
problematic_carriers[carrier] = 1
|
||||
|
||||
for carrier, count in problematic_carriers.items():
|
||||
logger.info(f" Carrier '{carrier}' : {count} échec(s)")
|
||||
|
||||
# Vérifier si ce carrier existe dans la base
|
||||
existing = Party.search([('name', '=', str(carrier).strip().upper())], limit=1)
|
||||
logger.info(f" Carrier '{carrier}' : {count} echec(s)")
|
||||
existing = Party.search([
|
||||
('name', '=', str(carrier).strip().upper())
|
||||
], limit=1)
|
||||
if existing:
|
||||
logger.info(f" → EXISTE DANS LA BASE (ID: {existing[0].id})")
|
||||
logger.info(
|
||||
f" -> EXISTE DANS LA BASE (ID: {existing[0].id})")
|
||||
else:
|
||||
logger.info(f" → N'EXISTE PAS DANS LA BASE")
|
||||
logger.info(" -> N'EXISTE PAS DANS LA BASE")
|
||||
|
||||
logger.info("=" * 60)
|
||||
@@ -18,6 +18,13 @@ class IncomingConfiguration(metaclass=PoolMeta):
|
||||
class Incoming(metaclass=PoolMeta):
|
||||
__name__ = 'document.incoming'
|
||||
|
||||
created_at = fields.Function(
|
||||
fields.Date("Created At"),
|
||||
'get_created_at')
|
||||
result_notes = fields.Function(
|
||||
fields.Text("Result Notes"),
|
||||
'get_result_notes')
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
@@ -25,6 +32,7 @@ class Incoming(metaclass=PoolMeta):
|
||||
('weight_report', "Weight Report"))
|
||||
cls.type.selection.append(
|
||||
('controller', "Controller"))
|
||||
cls._order = [('create_date', 'DESC')]
|
||||
|
||||
@classmethod
|
||||
def _get_results(cls):
|
||||
@@ -39,7 +47,7 @@ class Incoming(metaclass=PoolMeta):
|
||||
WR.save([wr])
|
||||
WR.run_ocr([wr])
|
||||
WR.run_metadata([wr])
|
||||
|
||||
WR.run_pipeline([wr])
|
||||
return wr
|
||||
|
||||
def _process_controller(self):
|
||||
@@ -54,6 +62,25 @@ class Incoming(metaclass=PoolMeta):
|
||||
|
||||
return wr
|
||||
|
||||
def get_created_at(self, name=None):
|
||||
create_date = getattr(self, 'create_date', None)
|
||||
if not create_date:
|
||||
return None
|
||||
return create_date.date()
|
||||
|
||||
@classmethod
|
||||
def order_created_at(cls, tables):
|
||||
table, _ = tables[None]
|
||||
return [table.create_date]
|
||||
|
||||
def get_result_notes(self, name=None):
|
||||
result = getattr(self, 'result', None)
|
||||
if not result:
|
||||
return ''
|
||||
if getattr(result, '__name__', None) == 'automation.document':
|
||||
return getattr(result, 'notes', '') or ''
|
||||
return ''
|
||||
|
||||
# @property
|
||||
# def supplier_invoice_company(self):
|
||||
# pass
|
||||
|
||||
@@ -8,5 +8,10 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<field name="inherit" ref="document_incoming.document_incoming_configuration_view_form"/>
|
||||
<field name="name">document_incoming_configuration_form</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="document_incoming_view_list_wr">
|
||||
<field name="model">document.incoming</field>
|
||||
<field name="inherit" ref="document_incoming.document_incoming_view_list"/>
|
||||
<field name="name">document_incoming_list</field>
|
||||
</record>
|
||||
</data>
|
||||
</tryton>
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
version=7.2.0
|
||||
depends:
|
||||
document_incoming
|
||||
automation
|
||||
ir
|
||||
party
|
||||
xml:
|
||||
document.xml
|
||||
view/document_incoming_list.xml
|
||||
|
||||
11
modules/document_incoming_wr/view/document_incoming_list.xml
Normal file
11
modules/document_incoming_wr/view/document_incoming_list.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<data>
|
||||
<xpath expr="/tree/field[@name='name']" position="before">
|
||||
<field name="created_at" expand="2"/>
|
||||
</xpath>
|
||||
<xpath expr="/tree/field[@name='result']" position="after">
|
||||
<field name="result_notes" expand="2"/>
|
||||
</xpath>
|
||||
</data>
|
||||
@@ -45,10 +45,14 @@ de negoce physique:
|
||||
- `modules/purchase_trade/docs/template-rules.md`
|
||||
- Catalogue des proprietes templates:
|
||||
- `modules/purchase_trade/docs/template-properties.md`
|
||||
- Padding facture provisoire vente / validation comptable:
|
||||
- `modules/purchase_trade/docs/padding-invoice-accounting.md`
|
||||
|
||||
## 4) Invariants metier a preserver
|
||||
|
||||
- Un lot `virtual` est la reference d'ouverture de quantite pour une `purchase.line`.
|
||||
- Une `sale.line` doit aussi avoir au minimum un lot `virtual`; une valuation
|
||||
cote sale ne doit donc pas disparaitre juste parce que le lot est `open`.
|
||||
- Le lot physique est le pont principal entre:
|
||||
- `purchase.line`
|
||||
- `sale.line`
|
||||
@@ -57,8 +61,96 @@ de negoce physique:
|
||||
- Pour remonter d'une facture vers shipment / BL / controller / fret:
|
||||
- privilegier le lot physique
|
||||
- ne pas multiplier des chemins d'acces concurrents
|
||||
- Pour les champs de colis (`NB BALES`) dans les templates facture:
|
||||
- la source de verite est `line.lot.lot_qt`
|
||||
- sur une facture, sommer les `lot_qt` des lignes de facture
|
||||
- tenir compte du signe de la ligne de facture pour les notes finales
|
||||
- ne pas proratiser depuis le poids (`net` / `gross`)
|
||||
- Le `FREIGHT VALUE` d'un template facture vient du `fee.fee` du shipment
|
||||
dont le produit est `Maritime freight`.
|
||||
- Pour `stock/insurance.fodt`, le `Amount insured` doit venir en priorite de
|
||||
`110%` du total des `incoming_moves` (fallback fee `Insurance` si aucun
|
||||
montant incoming calculable).
|
||||
- Pour le surveyor du certificat d'assurance shipment, la priorite est:
|
||||
`shipment.surveyor` -> `shipment.controller` -> fournisseur du fee
|
||||
`Insurance`.
|
||||
- Pour `payment_order.fodt`, utiliser des proprietes
|
||||
`invoice.report_payment_order_*` plutot que des tokens legacy `<...>`.
|
||||
- Ajouter un champ de template dans `Document Templates` ne rend pas le report
|
||||
visible dans la fiche: il faut aussi l'action `ir.action.report` +
|
||||
`ir.action.keyword` (`form_print`) cote `account.invoice`.
|
||||
- Le wizard `Create contracts` en mode `matched` peut maintenant partir de
|
||||
plusieurs `lot.qt`, mais doit conserver un matching par lot source et laisser
|
||||
`created_by_code = True` sur les lignes creees pour ne pas declencher les
|
||||
creations automatiques de lots dans les validations.
|
||||
- En valuation / PnL:
|
||||
- la valeur stockee dans `type` est la cle technique (`pur. priced`,
|
||||
`sale priced`, `pur. fee`, etc.), pas le label affiche dans l'UI
|
||||
- les references doivent rester coherentes avec le type de lot:
|
||||
`Purchase/Open`, `Purchase/Physic`, `Sale/Open`, `Sale/Physic`
|
||||
- pour une sale matchee, les lignes de valuation purchase generees sur un lot
|
||||
physique doivent aussi renseigner `sale` et `sale_line` afin de remonter
|
||||
dans l'onglet PnL de la sale
|
||||
- une sale non matchee doit etre valorisable "sale-first" et alimenter
|
||||
`valuation.valuation` / `valuation.valuation.line`
|
||||
- si une `sale.line` `basis` n'a ni `price_summary` ni `lot_price_sale`,
|
||||
creer quand meme une ligne `sale priced` avec `price = 0` et `amount = 0`
|
||||
plutot que de ne rien generer
|
||||
- le MTM ne doit etre renseigne que pour `pur. priced`, `sale priced` et
|
||||
`derivative`; jamais pour les fees
|
||||
- `mtm_price` doit afficher le prix brut de valorisation (sans ratio), alors
|
||||
que `mtm` reste le montant calcule selon la logique de strategie
|
||||
- En pricing:
|
||||
- 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 /
|
||||
unite liee (ex: `USC/LB`) puis converti vers le repere de la ligne pour le
|
||||
calcul du `amount`
|
||||
- en `basis + linked currency`, le `linked_price` doit representer le prix
|
||||
basis brut (hors premium) dans la devise liee; le `unit_price` reste ce
|
||||
prix brut converti, et le `premium` converti est ajoute seulement dans
|
||||
l'`amount`
|
||||
- si `linked currency` est cochee, `linked_price`, `linked_currency` et
|
||||
`linked_unit` sont requis
|
||||
- dans les forms, presenter le bloc prix dans l'ordre:
|
||||
`price_type` -> linked fields -> `premium` -> `unit_price` -> `amount`
|
||||
- en valuation `basis`, le premium s'applique a chaque composant, pas
|
||||
uniquement a une ligne de resume
|
||||
- pour une ligne `basis` sans `price_summary`, la valuation fallback doit
|
||||
utiliser `unit_price + premium` (et pas `unit_price` seul)
|
||||
- a la validation d'une `sale.line`, si un lot virtuel est cree et qu'aucun
|
||||
matching purchase n'existe, il faut lancer `generate_from_sale_line()` pour
|
||||
alimenter le PnL sale-first
|
||||
- En padding de facture provisoire vente:
|
||||
- le padding est saisi globalement dans `lot.invoice`
|
||||
- il est uniquement applique aux factures provisoires cote vente
|
||||
- il est reparti par lot et stocke dans `lot.sale_invoice_padding`
|
||||
- la ligne facture affiche `Inc. padding` depuis le lot
|
||||
- le padding augmente `account.invoice.line.quantity`, donc le move principal
|
||||
de facture inclut deja le montant padding
|
||||
- les comptes de padding viennent de `account.configuration`:
|
||||
`Default Sale Padding` et `Default Accrual Padding`
|
||||
- la section `Padding` doit rester avant la section `Invoice` dans
|
||||
`Financial / Configuration`
|
||||
- la provisoire cree un `additional_move` debit `Default Sale Padding` /
|
||||
credit `Default Accrual Padding`
|
||||
- la finale cree l'inverse en reprenant le montant depuis
|
||||
`lot.sale_invoice_line_prov`, donc avec le prix, la devise, la date et le
|
||||
taux de la provisoire
|
||||
- le wizard final doit calculer son delta depuis la quantite provisoire hors
|
||||
padding: `sale_invoice_line_prov.quantity - sale_invoice_padding`
|
||||
|
||||
## 5) Conventions de modification
|
||||
|
||||
@@ -71,6 +163,13 @@ de negoce physique:
|
||||
`docs/business-rules.md`.
|
||||
5. Si une convention de template change, mettre a jour
|
||||
`docs/template-rules.md`.
|
||||
6. Pour les vues XML Tryton de ce module, utiliser `editable="1"` sur les
|
||||
`<tree>` editables; ne pas utiliser `editable="bottom"`.
|
||||
7. Ne pas ajouter `keyword_open` / `open_keyword` sur les vues `<tree>`:
|
||||
ces attributs ne sont pas supportes par Tryton.
|
||||
8. Si une regle de texte par defaut durable est demandee sur achat/vente,
|
||||
preferer un singleton de configuration expose dans un menu fonctionnel
|
||||
existant plutot qu'un menu technique `purchase_trade`.
|
||||
|
||||
## 6) Pieges connus
|
||||
|
||||
@@ -81,6 +180,25 @@ de negoce physique:
|
||||
- Pour les donnees achat/vente partagees, ne pas supposer qu'une facture de
|
||||
vente doit lire directement sur la `sale.line`: souvent, la verite metier
|
||||
passe par le lot physique et/ou la `account.invoice.line`.
|
||||
- Les templates `invoice_ict*` peuvent partager les memes proprietes Python;
|
||||
si une regle doit valoir pour provisional et final, la mettre dans
|
||||
`modules/purchase_trade/invoice.py` plutot que dupliquer dans les `.fodt`.
|
||||
- Dans les ecrans PnL, le label `Sale price` correspond au type stocke
|
||||
`sale priced`; idem pour `Pur. price` / `pur. priced`.
|
||||
- Une ligne `basis` sans resume de pricing peut sinon disparaitre de la
|
||||
valuation si aucun fallback explicite a `0` n'est prevu.
|
||||
- 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
|
||||
- Pour le padding provisoire vente, ne pas changer la quantite physique du lot:
|
||||
l'ecart doit rester porte par `lot.sale_invoice_padding` et visible sur la
|
||||
facture via `Inc. padding`.
|
||||
|
||||
## 7) Definition of done (module `purchase_trade`)
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ from trytond.pool import Pool
|
||||
|
||||
from . import (
|
||||
account,
|
||||
configuration,
|
||||
purchase,
|
||||
sale,
|
||||
global_reporting,
|
||||
@@ -56,6 +57,7 @@ def register():
|
||||
lc.LCMessage,
|
||||
lc.CreateLCStart,
|
||||
global_reporting.GRConfiguration,
|
||||
configuration.Configuration,
|
||||
module='purchase_trade', type_='model')
|
||||
Pool.register(
|
||||
incoming.ImportSwift,
|
||||
@@ -108,6 +110,9 @@ def register():
|
||||
valuation.ValuationDyn,
|
||||
valuation.ValuationReport,
|
||||
valuation.ValuationReportContext,
|
||||
valuation.ValuationProcessDimension,
|
||||
valuation.ValuationProcessStart,
|
||||
valuation.ValuationProcessResult,
|
||||
derivative.Derivative,
|
||||
derivative.DerivativeMatch,
|
||||
derivative.MatchWizardStart,
|
||||
@@ -188,6 +193,12 @@ def register():
|
||||
Pool.register(
|
||||
account.PhysicalTradeIFRS,
|
||||
module='purchase_trade', type_='model')
|
||||
Pool.register(
|
||||
configuration.AccountConfiguration,
|
||||
configuration.AccountConfigurationDefaultAccount,
|
||||
invoice.InvoicePaddingReport,
|
||||
invoice.InvoicePaddingContext,
|
||||
module='purchase_trade', type_='model')
|
||||
Pool.register(
|
||||
invoice.Invoice,
|
||||
invoice.InvoiceLine,
|
||||
@@ -262,10 +273,20 @@ def register():
|
||||
forex.ForexReport,
|
||||
purchase.PnlReport,
|
||||
purchase.PositionReport,
|
||||
valuation.ValuationProcess,
|
||||
derivative.DerivativeMatchWizard,
|
||||
module='purchase', type_='wizard')
|
||||
Pool.register(
|
||||
sale.SaleCreatePurchase,
|
||||
sale.SaleAllocationsWizard,
|
||||
module='sale', type_='wizard')
|
||||
Pool.register(
|
||||
invoice.InvoiceReport,
|
||||
invoice.SaleReport,
|
||||
invoice.PurchaseReport,
|
||||
stock.ShipmentShippingReport,
|
||||
stock.ShipmentInsuranceReport,
|
||||
stock.ShipmentCOOReport,
|
||||
stock.ShipmentPackingListReport,
|
||||
module='purchase_trade', type_='report')
|
||||
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
# account.py
|
||||
from trytond.model import ModelSQL, ModelView, fields
|
||||
from trytond.pool import PoolMeta
|
||||
from trytond.pyson import Eval
|
||||
|
||||
__all__ = ['PhysicalTradeIFRS']
|
||||
__all__ = [
|
||||
'PhysicalTradeIFRS',
|
||||
]
|
||||
__metaclass__ = PoolMeta
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
<?xml version="1.0"?>
|
||||
<tryton>
|
||||
<data>
|
||||
<record model="ir.ui.view" id="account_configuration_view_form">
|
||||
<field name="model">account.configuration</field>
|
||||
<field name="inherit" ref="account.configuration_view_form"/>
|
||||
<field name="name">account_configuration_form</field>
|
||||
</record>
|
||||
|
||||
<record model="res.group" id="group_physical_trade_ifrs">
|
||||
<field name="name">Physical Trade IFRS</field>
|
||||
</record>
|
||||
|
||||
141
modules/purchase_trade/configuration.py
Normal file
141
modules/purchase_trade/configuration.py
Normal file
@@ -0,0 +1,141 @@
|
||||
from trytond.model import ModelSingleton, ModelSQL, ModelView, fields
|
||||
from trytond.pool import Pool, PoolMeta
|
||||
from trytond.pyson import Eval
|
||||
from trytond.transaction import Transaction
|
||||
|
||||
|
||||
class AccountConfiguration(metaclass=PoolMeta):
|
||||
__name__ = 'account.configuration'
|
||||
|
||||
default_sale_padding_account = fields.MultiValue(fields.Many2One(
|
||||
'account.account', "Default Sale Padding",
|
||||
domain=[
|
||||
('closed', '!=', True),
|
||||
('type.revenue', '=', True),
|
||||
('company', '=', Eval('context', {}).get('company', -1)),
|
||||
]))
|
||||
default_accrual_padding_account = fields.MultiValue(fields.Many2One(
|
||||
'account.account', "Default Accrual Padding",
|
||||
domain=[
|
||||
('closed', '!=', True),
|
||||
('type.statement', '=', 'balance'),
|
||||
('company', '=', Eval('context', {}).get('company', -1)),
|
||||
]))
|
||||
|
||||
@classmethod
|
||||
def multivalue_model(cls, field):
|
||||
pool = Pool()
|
||||
if field in {
|
||||
'default_sale_padding_account',
|
||||
'default_accrual_padding_account',
|
||||
}:
|
||||
return pool.get('account.configuration.default_account')
|
||||
return super().multivalue_model(field)
|
||||
|
||||
|
||||
class AccountConfigurationDefaultAccount(metaclass=PoolMeta):
|
||||
__name__ = 'account.configuration.default_account'
|
||||
|
||||
default_sale_padding_account = fields.Many2One(
|
||||
'account.account', "Default Sale Padding",
|
||||
domain=[
|
||||
('closed', '!=', True),
|
||||
('type.revenue', '=', True),
|
||||
('company', '=', Eval('company', -1)),
|
||||
])
|
||||
default_accrual_padding_account = fields.Many2One(
|
||||
'account.account', "Default Accrual Padding",
|
||||
domain=[
|
||||
('closed', '!=', True),
|
||||
('type.statement', '=', 'balance'),
|
||||
('company', '=', Eval('company', -1)),
|
||||
])
|
||||
|
||||
|
||||
class Configuration(ModelSingleton, ModelSQL, ModelView):
|
||||
"Purchase Trade Configuration"
|
||||
__name__ = 'purchase_trade.configuration'
|
||||
|
||||
_REPORT_LABELS = (
|
||||
('sale_report_label', 'sale', 'report_sale', 'Proforma'),
|
||||
('sale_bill_report_label', 'sale', 'report_bill', 'Draft'),
|
||||
('invoice_report_label', 'account_invoice', 'report_invoice',
|
||||
'Invoice'),
|
||||
('invoice_cndn_report_label', 'account_invoice',
|
||||
'report_invoice_ict_final', 'CN/DN'),
|
||||
('invoice_prepayment_report_label', 'account_invoice',
|
||||
'report_prepayment', 'Prepayment'),
|
||||
('invoice_packing_list_report_label', 'purchase_trade',
|
||||
'report_invoice_packing_list', 'Packing List'),
|
||||
('invoice_payment_order_report_label', 'purchase_trade',
|
||||
'report_payment_order', 'Payment Order'),
|
||||
('purchase_report_label', 'purchase', 'report_purchase', 'Purchase'),
|
||||
('shipment_shipping_report_label', 'stock',
|
||||
'report_shipment_in_shipping', 'Shipping instructions'),
|
||||
('shipment_insurance_report_label', 'purchase_trade',
|
||||
'report_shipment_in_insurance', 'Insurance'),
|
||||
('shipment_coo_report_label', 'purchase_trade',
|
||||
'report_shipment_in_coo', 'COO'),
|
||||
('shipment_packing_list_report_label', 'purchase_trade',
|
||||
'report_shipment_in_packing_list', 'Packing List'),
|
||||
)
|
||||
|
||||
pricing_rule = fields.Text("Pricing Rule")
|
||||
sale_report_template = fields.Char("Sale Template")
|
||||
sale_report_label = fields.Char("Sale Menu Label")
|
||||
sale_bill_report_template = fields.Char("Sale Bill Template")
|
||||
sale_bill_report_label = fields.Char("Sale Bill Menu Label")
|
||||
sale_final_report_template = fields.Char("Sale Final Template")
|
||||
invoice_report_template = fields.Char("Invoice Template")
|
||||
invoice_report_label = fields.Char("Invoice Menu Label")
|
||||
invoice_cndn_report_template = fields.Char("CN/DN Template")
|
||||
invoice_cndn_report_label = fields.Char("CN/DN Menu Label")
|
||||
invoice_prepayment_report_template = fields.Char("Prepayment Template")
|
||||
invoice_prepayment_report_label = fields.Char("Prepayment Menu Label")
|
||||
invoice_packing_list_report_template = fields.Char("Packing List Template")
|
||||
invoice_packing_list_report_label = fields.Char("Packing List Menu Label")
|
||||
invoice_payment_order_report_template = fields.Char("Payment Order Template")
|
||||
invoice_payment_order_report_label = fields.Char(
|
||||
"Payment Order Menu Label")
|
||||
purchase_report_template = fields.Char("Purchase Template")
|
||||
purchase_report_label = fields.Char("Purchase Menu Label")
|
||||
shipment_shipping_report_template = fields.Char("Shipping Template")
|
||||
shipment_shipping_report_label = fields.Char("Shipping Menu Label")
|
||||
shipment_insurance_report_template = fields.Char("Insurance Template")
|
||||
shipment_insurance_report_label = fields.Char("Insurance Menu Label")
|
||||
shipment_coo_report_template = fields.Char("COO Template")
|
||||
shipment_coo_report_label = fields.Char("COO Menu Label")
|
||||
shipment_packing_list_report_template = fields.Char("Packing List Template")
|
||||
shipment_packing_list_report_label = fields.Char(
|
||||
"Packing List Menu Label")
|
||||
|
||||
@classmethod
|
||||
def create(cls, vlist):
|
||||
records = super().create(vlist)
|
||||
cls._sync_report_labels(records)
|
||||
return records
|
||||
|
||||
@classmethod
|
||||
def write(cls, *args):
|
||||
super().write(*args)
|
||||
cls._sync_report_labels(sum(args[::2], []))
|
||||
|
||||
@classmethod
|
||||
def _sync_report_labels(cls, records):
|
||||
if not records:
|
||||
return
|
||||
pool = Pool()
|
||||
ModelData = pool.get('ir.model.data')
|
||||
ActionReport = pool.get('ir.action.report')
|
||||
to_write = []
|
||||
for record in records:
|
||||
for field_name, module, xml_id, default_label in cls._REPORT_LABELS:
|
||||
label = (getattr(record, field_name, '') or '').strip()
|
||||
action_id = ModelData.get_id(module, xml_id)
|
||||
action = ActionReport(action_id)
|
||||
target_label = label or default_label
|
||||
if getattr(action, 'name', '') != target_label:
|
||||
to_write.extend(([action], {'name': target_label}))
|
||||
if to_write:
|
||||
with Transaction().set_user(0):
|
||||
ActionReport.write(*to_write)
|
||||
48
modules/purchase_trade/configuration.xml
Normal file
48
modules/purchase_trade/configuration.xml
Normal file
@@ -0,0 +1,48 @@
|
||||
<tryton>
|
||||
<data>
|
||||
<record model="ir.ui.view" id="purchase_trade_configuration_view_form">
|
||||
<field name="model">purchase_trade.configuration</field>
|
||||
<field name="type">form</field>
|
||||
<field name="name">configuration_form</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="purchase_trade_template_configuration_view_form">
|
||||
<field name="model">purchase_trade.configuration</field>
|
||||
<field name="type">form</field>
|
||||
<field name="name">template_configuration_form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.action.act_window" id="act_purchase_trade_configuration_form">
|
||||
<field name="name">Pricing Configuration</field>
|
||||
<field name="res_model">purchase_trade.configuration</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_purchase_trade_configuration_form_view1">
|
||||
<field name="sequence" eval="10"/>
|
||||
<field name="view" ref="purchase_trade_configuration_view_form"/>
|
||||
<field name="act_window" ref="act_purchase_trade_configuration_form"/>
|
||||
</record>
|
||||
<record model="ir.action.act_window" id="act_purchase_trade_template_configuration_form">
|
||||
<field name="name">Document Templates</field>
|
||||
<field name="res_model">purchase_trade.configuration</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_purchase_trade_template_configuration_form_view1">
|
||||
<field name="sequence" eval="10"/>
|
||||
<field name="view" ref="purchase_trade_template_configuration_view_form"/>
|
||||
<field name="act_window" ref="act_purchase_trade_template_configuration_form"/>
|
||||
</record>
|
||||
|
||||
<menuitem
|
||||
name="Configuration"
|
||||
parent="price.menu_price"
|
||||
action="act_purchase_trade_configuration_form"
|
||||
sequence="10"
|
||||
id="menu_purchase_trade_configuration"
|
||||
icon="tryton-settings"/>
|
||||
<menuitem
|
||||
name="Document Templates"
|
||||
parent="document_incoming.menu_configuration"
|
||||
action="act_purchase_trade_template_configuration_form"
|
||||
sequence="20"
|
||||
id="menu_purchase_trade_template_configuration"
|
||||
icon="tryton-settings"/>
|
||||
</data>
|
||||
</tryton>
|
||||
@@ -1,8 +1,8 @@
|
||||
# Business Rules - Purchase Trade
|
||||
|
||||
Statut: `draft`
|
||||
Version: `v0.2`
|
||||
Derniere mise a jour: `2026-03-27`
|
||||
Version: `v0.7`
|
||||
Derniere mise a jour: `2026-04-26`
|
||||
Owner metier: `a completer`
|
||||
Owner technique: `a completer`
|
||||
|
||||
@@ -100,6 +100,448 @@ Owner technique: `a completer`
|
||||
- Priorite:
|
||||
- `importante`
|
||||
|
||||
### BR-PT-004 - La valuation doit couvrir les flux purchase et sale, y compris les sales non matchees
|
||||
|
||||
- Intent: obtenir un PnL coherent cote achat et cote vente, meme lorsqu'une
|
||||
sale n'est pas encore matchee a une purchase.
|
||||
- Description:
|
||||
- Le flux historique de valuation part de `purchase.line` puis remonte vers
|
||||
les ventes via les lots/lots matchants.
|
||||
- Le systeme doit egalement savoir valoriser directement une `sale.line`
|
||||
non matchee ("sale-first").
|
||||
- Une sale non matchee doit creer des lignes dans
|
||||
`valuation.valuation` et `valuation.valuation.line` afin d'apparaitre dans
|
||||
l'onglet PnL de la sale.
|
||||
- Resultat attendu:
|
||||
- pour une `sale.line` non matchee, generer au minimum les types:
|
||||
- `sale priced`
|
||||
- `sale fee`
|
||||
- `derivative` si la ligne porte des derives
|
||||
- si la sale est matchee via un lot physique, les lignes purchase portees par
|
||||
ce lot physique doivent aussi renseigner `sale` et `sale_line`
|
||||
- une sale matchee doit donc voir:
|
||||
- ses lignes `sale *`
|
||||
- les lignes purchase portees par le lot physique partage
|
||||
- Priorite:
|
||||
- `structurante`
|
||||
|
||||
### BR-PT-005 - Les references de valuation doivent decrire la nature du lot de la ligne
|
||||
|
||||
- Intent: eviter les ambiguïtes dans les ecrans PnL entre lots `open` et lots
|
||||
`physic`.
|
||||
- Description:
|
||||
- La reference affichee dans la valuation doit decrire la ligne elle-meme,
|
||||
pas son vis-a-vis.
|
||||
- Les references autorisees pour les lignes de prix sont:
|
||||
- `Purchase/Open`
|
||||
- `Purchase/Physic`
|
||||
- `Sale/Open`
|
||||
- `Sale/Physic`
|
||||
- Resultat attendu:
|
||||
- un lot `virtual` cote purchase ne doit jamais sortir avec la reference
|
||||
`Purchase/Physic`
|
||||
- un lot `virtual` cote sale ne doit jamais sortir avec la reference
|
||||
`Sale/Physic`
|
||||
- un lot physique matche peut produire:
|
||||
- une ligne purchase en `Purchase/Physic`
|
||||
- une ligne sale en `Sale/Physic`
|
||||
- un open sale matche a un open purchase peut produire des quantites egales
|
||||
tout en gardant des references differentes (`Purchase/Open` vs `Sale/Open`)
|
||||
- Priorite:
|
||||
- `importante`
|
||||
|
||||
### BR-PT-006 - Une sale basis sans prix detaille doit quand meme apparaitre en valuation
|
||||
|
||||
- Intent: ne pas perdre les lignes de PnL lorsque le detail de pricing n'est
|
||||
pas encore renseigne.
|
||||
- Description:
|
||||
- Une `sale.line` de type `basis` peut exister avec un lot `virtual`, sans
|
||||
`price_summary` et sans `lot_price_sale`.
|
||||
- Dans ce cas, la valuation doit quand meme creer une ligne `sale priced`.
|
||||
- Resultat attendu:
|
||||
- si `price_summary` est vide:
|
||||
- creer une ligne `sale priced`
|
||||
- avec `price = 0`
|
||||
- avec `amount = 0`
|
||||
- avec un `state` de type `unfixed`
|
||||
- si `lot_price_sale` est vide sur un lot sale, utiliser `sale_line.unit_price`
|
||||
comme fallback quand il existe
|
||||
- Priorite:
|
||||
- `importante`
|
||||
|
||||
### BR-PT-007 - Le MTM de valuation ne s'applique pas aux fees
|
||||
|
||||
- Intent: distinguer les lignes de prix marquables au marche des lignes de
|
||||
frais qui ne doivent pas etre mark-to-market.
|
||||
- Description:
|
||||
- Le systeme peut renseigner `mtm_price`, `mtm` et `strategy` uniquement pour:
|
||||
- `pur. priced`
|
||||
- `sale priced`
|
||||
- `derivative`
|
||||
- Les fees (`pur. fee`, `sale fee`, `shipment fee`, `line fee`) ne doivent
|
||||
jamais porter de valorisation MTM.
|
||||
- Resultat attendu:
|
||||
- les lignes de fee doivent conserver:
|
||||
- `mtm_price = NULL`
|
||||
- `mtm = NULL`
|
||||
- `strategy = NULL`
|
||||
- `mtm_price` doit representer le prix brut de valorisation sans appliquer le
|
||||
ratio de composant
|
||||
- `mtm` reste le montant calcule selon la logique de strategie
|
||||
- Priorite:
|
||||
- `structurante`
|
||||
|
||||
### BR-PT-007-bis - Mark as finished ignore seulement le reliquat ouvert
|
||||
|
||||
- Intent: conserver le PnL reel des lots executes tout en masquant le reliquat
|
||||
ouvert d'une ligne terminee.
|
||||
- Description:
|
||||
- Sur une `purchase.line` ou une `sale.line`, le champ `finished`
|
||||
(`Mark as finished`) ne signifie pas que la ligne ne doit plus etre
|
||||
valorisee.
|
||||
- Il signifie seulement que les lots ouverts / virtuels restants ne doivent
|
||||
plus alimenter la valuation.
|
||||
- Resultat attendu:
|
||||
- les lots physiques continuent de produire:
|
||||
- PnL prix
|
||||
- PnL fees
|
||||
- les derivatives continuent de produire du PnL meme si la ligne est
|
||||
marquee finie
|
||||
- les lots virtuels / ouverts d'une ligne finie sont ignores
|
||||
- Priorite:
|
||||
- `structurante`
|
||||
|
||||
### BR-PT-008 - Le premium fait partie du prix contractuel en `priced` et en `basis`
|
||||
|
||||
- Intent: garantir que le montant total valorise et facture reflete toujours le
|
||||
premium/discount saisi sur la ligne.
|
||||
- Description:
|
||||
- Le `premium` d'une `purchase.line` ou `sale.line` doit impacter le prix
|
||||
total quelle que soit la `price_type`.
|
||||
- Cette regle vaut pour:
|
||||
- les calculs de `amount`
|
||||
- la valuation / PnL
|
||||
- Resultat attendu:
|
||||
- le `unit_price` reste le prix de base, hors premium
|
||||
- en `priced`, le montant economique = `unit_price + premium`
|
||||
- en `basis`, le premium s'ajoute aussi au prix total economique
|
||||
- en valuation `basis`, le premium s'applique a chaque composant valorise
|
||||
(ex: meme premium repete sur chaque bloc ICE)
|
||||
- Exemple metier:
|
||||
- `8.30 USC/LB 500 TONS ON ICE MCH'26`
|
||||
- `8.30 USC/LB 500 TONS ON ICE MAY 26`
|
||||
- le premium `8.30 USC/LB` s'applique a chaque composant
|
||||
- Priorite:
|
||||
- `structurante`
|
||||
|
||||
### BR-PT-009 - En linked currency, le premium est exprime dans la devise/unite liee
|
||||
|
||||
- Intent: respecter la facon dont les traders saisissent les prix sur certains
|
||||
produits (ex: coton en `USC/LB`).
|
||||
- Description:
|
||||
- Quand `enable_linked_currency` est coche, le `premium` est saisi dans la
|
||||
devise / unite liee, pas dans la devise / unite native de la ligne.
|
||||
- Le systeme doit convertir ce premium vers le repere de la ligne pour les
|
||||
calculs internes de montant et de valuation.
|
||||
- Resultat attendu:
|
||||
- `premium` est interprete dans le repere `linked_currency` / `linked_unit`
|
||||
- le `unit_price` ne doit pas absorber ce premium
|
||||
- les `amount` et valuations doivent refleter ce premium converti
|
||||
- si `linked currency` est cochee, `linked_price`, `linked_currency` et
|
||||
`linked_unit` sont obligatoires
|
||||
- Priorite:
|
||||
- `structurante`
|
||||
|
||||
### BR-PT-010 - En `basis + linked currency`, le linked price suit le basis brut
|
||||
|
||||
- Intent: rendre lisible la decomposition entre prix basis de marche et premium.
|
||||
- Description:
|
||||
- Quand une ligne est en `basis` et `linked currency`, le bloc
|
||||
`linked_price` doit etre recalcule automatiquement.
|
||||
- Ce `linked_price` doit representer le prix basis brut, hors premium.
|
||||
- Le `unit_price` de la ligne doit rester ce prix brut converti.
|
||||
- Le premium converti n'est ajoute qu'au niveau du `amount`.
|
||||
- Resultat attendu:
|
||||
- modification du basis -> mise a jour automatique du `linked_price`
|
||||
- `linked_price` = base market / basis
|
||||
- `unit_price` = `linked_price` converti
|
||||
- `amount` = quantite * (`unit_price` + premium converti)
|
||||
- Priorite:
|
||||
- `importante`
|
||||
|
||||
### BR-PT-011 - Une sale line non matchee avec lot virtuel doit generer une valuation sale-first des la validation
|
||||
|
||||
- Intent: ne pas attendre un matching purchase pour afficher le PnL d'une sale
|
||||
ouverte.
|
||||
- Description:
|
||||
- Lors de la validation d'une `sale.line`, le systeme peut creer un lot
|
||||
`virtual`.
|
||||
- Si aucun `lot.qt` ne relie ce lot a une `purchase.line`, il faut tout de
|
||||
meme generer la valuation cote sale.
|
||||
|
||||
### BR-PT-012 - Le wizard Create contracts peut creer un seul achat matche a plusieurs open sales
|
||||
|
||||
- Intent: permettre la creation d'un contrat achat unique a partir de plusieurs
|
||||
`lot.qt` de vente selectionnes.
|
||||
- Description:
|
||||
- En mode `matched`, le wizard `Create contracts` peut recevoir plusieurs
|
||||
`lot.qt` selectionnes.
|
||||
- Il doit creer un seul contrat, avec une ligne par lot source selectionne.
|
||||
- Chaque ligne doit conserver son lot d'origine pour le matching.
|
||||
- Resultat attendu:
|
||||
- le wizard agrege les quantites de la selection
|
||||
- il refuse une quantite saisie differente du total selectionne
|
||||
- il conserve `created_by_code = True` sur les lignes creees pour ne pas
|
||||
declencher les creations automatiques parasites lors des validations
|
||||
- Priorite:
|
||||
- `importante`
|
||||
|
||||
### BR-PT-013 - Le texte par defaut de pricing_rule est configure globalement
|
||||
|
||||
- Intent: centraliser un texte metier recurrent reutilise a la creation des
|
||||
lignes achat et vente.
|
||||
- Description:
|
||||
- Le module expose un singleton `purchase_trade.configuration` avec un champ
|
||||
texte `pricing_rule`.
|
||||
- Toute nouvelle `purchase.line` et `sale.line` doit prendre ce texte comme
|
||||
valeur par defaut de `pricing_rule`.
|
||||
- Resultat attendu:
|
||||
- la configuration est accessible depuis le menu `Prices`
|
||||
- la valeur sert de defaut a la creation des lignes
|
||||
- les lignes existantes ne sont pas modifiees retroactivement
|
||||
- Priorite:
|
||||
- `importante`
|
||||
|
||||
### BR-PT-014 - L'affectation d'un controller doit suivre l'ecart a l'objectif regional
|
||||
|
||||
- Intent: repartir les controllers selon les cibles definies dans l'onglet
|
||||
`Execution` des `party.party`.
|
||||
- Description:
|
||||
- chaque ligne `party.execution` fixe une cible `% targeted` pour un
|
||||
controller sur une `country.region`
|
||||
- le `% achieved` est calcule a partir des `stock.shipment.in` deja affectes
|
||||
a un controller dans cette zone
|
||||
- la zone d'un shipment est determinee par `shipment.to_location.country`
|
||||
- une region parente couvre aussi ses sous-regions
|
||||
- Resultat attendu:
|
||||
- pour une ligne `party.execution`, `achieved_percent` =
|
||||
`shipments de la zone avec ce controller / shipments controles de la zone`
|
||||
- le denominateur ne compte que les `stock.shipment.in` qui ont deja un
|
||||
`controller`; les shipments encore non affectes ne biaisent donc pas la
|
||||
statistique affichee
|
||||
- lors d'un choix automatique de controller, la priorite va a la regle dont
|
||||
l'ecart `targeted - achieved` est le plus eleve
|
||||
- un controller a `80%` cible et `40%` reel doit donc passer avant un
|
||||
controller a `50%` cible et `45%` reel sur la meme zone
|
||||
- l'appartenance a la zone se lit depuis `shipment.to_location.country`, et
|
||||
une region parente couvre aussi ses sous-regions
|
||||
- Priorite:
|
||||
- `importante`
|
||||
|
||||
### BR-PT-015 - Les weight reports distants par lot partent du weight report global attache au shipment
|
||||
|
||||
- Intent: separer la creation du `weight.report` global et l'export detaille
|
||||
par lot vers le systeme distant.
|
||||
- Description:
|
||||
- l'automation cree le `weight.report` global et l'attache au
|
||||
`stock.shipment.in`
|
||||
- l'export FastAPI par lot ne part plus directement de l'automation
|
||||
- l'utilisateur ouvre le `weight.report` voulu depuis le shipment et lance
|
||||
l'action d'export depuis ce rapport
|
||||
- Resultat attendu:
|
||||
- le rapport choisi sert de base unique pour calculer les payloads par lot
|
||||
- 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
|
||||
- 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:
|
||||
- apres creation du lot virtuel, si aucun matching purchase n'existe:
|
||||
- appeler `Valuation.generate_from_sale_line(line)`
|
||||
- creer au moins la ligne `sale priced` fallback si la ligne porte un prix
|
||||
economique via le premium
|
||||
- Priorite:
|
||||
- `importante`
|
||||
|
||||
### BR-PT-018 - Les contrats distinguent le compte bancaire tiers du compte bancaire compagnie
|
||||
|
||||
- Intent: eviter de confondre le compte bancaire du client/fournisseur avec le
|
||||
compte bancaire de la compagnie courante utilise pour encaisser ou payer.
|
||||
- Description:
|
||||
- Sur `sale.sale` et `purchase.purchase`, `bank_account` represente le compte
|
||||
bancaire propre a la `party` du contrat.
|
||||
- Sur `sale.sale` et `purchase.purchase`, `our_bank_account` represente le
|
||||
compte bancaire utilise par la compagnie courante pour encaisser ou payer.
|
||||
- `bank_account` est limite aux comptes bancaires de la party du contrat.
|
||||
- `our_bank_account` reste librement selectionnable parmi les comptes
|
||||
bancaires disponibles.
|
||||
- Resultat attendu:
|
||||
- si plusieurs comptes existent, le compte dont la devise correspond a la
|
||||
devise du contrat est propose en priorite
|
||||
- si aucun compte ne matche la devise, le premier compte disponible est
|
||||
propose
|
||||
- le champ `Our Bank Account` est pre-rempli depuis les comptes de la
|
||||
compagnie quand possible, mais sa recherche n'est pas limitee a ces comptes
|
||||
- Priorite:
|
||||
- `importante`
|
||||
|
||||
### BR-PT-019 - Le padding de facture provisoire vente augmente la quantite facturee sans modifier le lot physique
|
||||
|
||||
- Intent: permettre de constituer une provision sur une facture provisoire
|
||||
vente tout en gardant la trace de l'ecart avec la quantite reelle du lot.
|
||||
- Description:
|
||||
- Le wizard `lot.invoice` expose un padding global uniquement pour les
|
||||
factures provisoires cote vente.
|
||||
- Ce padding global est reparti egalement entre les lots selectionnes.
|
||||
- La quantite de chaque ligne de facture provisoire vente est augmentee de la
|
||||
part de padding du lot.
|
||||
- Le padding ne modifie pas la quantite physique du lot.
|
||||
- Resultat attendu:
|
||||
- deux lots factures ensemble avec un padding global de `1000` recoivent
|
||||
chacun `500` de padding
|
||||
- la ligne facture affiche la quantite augmentee
|
||||
- la ligne facture expose `Inc. padding`
|
||||
- le lot conserve sa part de padding dans `sale_invoice_padding`
|
||||
- Validation comptable:
|
||||
- au `Validate`, le move principal de facture inclut deja le padding car il
|
||||
est integre a `account.invoice.line.quantity`
|
||||
- la provisoire cree un `additional_move` avec le couple de comptes configure
|
||||
`Default Sale Padding` / `Default Accrual Padding`
|
||||
- montant provisoire:
|
||||
`lot.sale_invoice_padding * account.invoice.line.unit_price`
|
||||
- la finale cree l'ecriture inverse pour exactement le montant padding
|
||||
comptabilise lors de la provisoire
|
||||
- le montant d'extourne finale doit etre relu depuis
|
||||
`lot.sale_invoice_line_prov`, afin de reprendre le prix, la devise, la date
|
||||
et le taux de la provisoire
|
||||
- le calcul de quantite finale doit retirer le padding de la quantite
|
||||
provisoire avant de calculer le delta
|
||||
- voir `modules/purchase_trade/docs/padding-invoice-accounting.md`
|
||||
- Priorite:
|
||||
- `importante`
|
||||
|
||||
### BR-PT-012 - Fallback valuation basis sans summary: utiliser le prix economique de la ligne
|
||||
|
||||
- Intent: eviter qu'une valuation `basis` ouverte sorte a zero alors que la
|
||||
ligne a bien une valeur economique via le premium.
|
||||
- Description:
|
||||
- Une ligne `basis` peut ne pas avoir encore de `price_summary`.
|
||||
- Dans ce cas, la valuation fallback ne doit pas prendre `unit_price` seul si
|
||||
celui-ci est brut et hors premium.
|
||||
- Resultat attendu:
|
||||
- le fallback valuation `basis` doit utiliser:
|
||||
- `unit_price + premium converti`
|
||||
- cette regle vaut au minimum pour:
|
||||
- `sale.line` non matchee
|
||||
- `purchase.line` sans summary
|
||||
- Priorite:
|
||||
- `importante`
|
||||
|
||||
### BR-PT-013 - Create Contracts multi-lots doit conserver un matching par lot source
|
||||
|
||||
- Intent: permettre la creation d'un seul contrat mirror a partir de plusieurs
|
||||
open quantities sans perdre le lien lot-a-lot.
|
||||
- Description:
|
||||
- Le wizard `Create contracts` peut etre lance avec plusieurs `lot.qt`
|
||||
selectionnes.
|
||||
- En creation `matched`, le systeme doit creer un seul contrat avec une ligne
|
||||
par lot source selectionne, et chaque ligne doit etre matchee avec son lot
|
||||
d'origine.
|
||||
- Resultat attendu:
|
||||
- la quantite totale du wizard = somme des open quantities selectionnees
|
||||
- le contrat cree porte plusieurs lignes si plusieurs lots source sont
|
||||
selectionnes
|
||||
- chaque ligne creee reutilise le `shipment_origin` et le lot source qui lui
|
||||
correspondent
|
||||
- `created_by_code` doit rester positionne sur les lignes creees par wizard
|
||||
pour eviter la recreation automatique de lots virtuels dans les `validate`
|
||||
de `purchase.line`, `sale.line` et `lot.lot`
|
||||
- Priorite:
|
||||
- `importante`
|
||||
|
||||
### BR-PT-014 - Delivery period: From doit rester inferieur ou egal a To
|
||||
|
||||
- Intent: eviter les periodes de livraison incoherentes sur les lignes achat et
|
||||
vente.
|
||||
- Description:
|
||||
- Les champs `from_del` et `to_del` sont presents sur `purchase.line` et
|
||||
`sale.line`.
|
||||
- Si les deux dates sont renseignees, `from_del` ne doit jamais etre
|
||||
posterieur a `to_del`.
|
||||
- Resultat attendu:
|
||||
- la sauvegarde d'une `purchase.line` ou `sale.line` est bloquee si
|
||||
`from_del > to_del`
|
||||
- une date ouverte reste autorisee si seulement une des deux bornes est
|
||||
renseignee
|
||||
- Priorite:
|
||||
- `importante`
|
||||
|
||||
### BR-PT-015 - Pricing manuel: composant limite a la ligne courante
|
||||
|
||||
- Intent: eviter qu'une ligne de pricing saisie manuellement utilise un
|
||||
composant rattache a une autre ligne de contrat.
|
||||
- Description:
|
||||
- Dans l'onglet `Pricing dates` d'une `purchase.line`, le champ
|
||||
`pricing.pricing.price_component` doit proposer uniquement les composants
|
||||
dont `pricing.component.line` est la ligne achat courante.
|
||||
- Dans l'onglet `Pricing dates` d'une `sale.line`, il doit proposer
|
||||
uniquement les composants dont `pricing.component.sale_line` est la ligne
|
||||
vente courante.
|
||||
- Une ligne de pricing sans composant reste possible pour le mode manuel sans
|
||||
component.
|
||||
- Resultat attendu:
|
||||
- le domaine UI filtre les composants sur la ligne courante
|
||||
- une validation serveur bloque aussi un composant appartenant a une autre
|
||||
ligne
|
||||
- Priorite:
|
||||
- `importante`
|
||||
|
||||
## 4) Exemples concrets
|
||||
|
||||
### Exemple E1 - Augmentation simple
|
||||
@@ -146,6 +588,8 @@ Owner technique: `a completer`
|
||||
- Fichiers Python concernes:
|
||||
- `modules/purchase_trade/purchase.py`
|
||||
- `modules/purchase_trade/lot.py`
|
||||
- `modules/purchase_trade/valuation.py`
|
||||
- `modules/purchase_trade/sale.py`
|
||||
|
||||
## 6) Strategie de tests
|
||||
|
||||
@@ -155,3 +599,11 @@ Pour cette regle, couvrir au minimum:
|
||||
- augmentation sans `lot.qt` ouvert
|
||||
- diminution possible
|
||||
- diminution impossible avec erreur
|
||||
- valuation purchase/sale sur lot physique matche
|
||||
- valuation sale-first sur sale non matchee avec lot virtual
|
||||
- valuation sale `basis` sans `price_summary`
|
||||
- absence de MTM sur les fees
|
||||
- premium en `priced`
|
||||
- premium en `basis`
|
||||
- premium en `linked currency`
|
||||
- synchro `basis` -> `linked_price` -> `unit_price`
|
||||
|
||||
249
modules/purchase_trade/docs/padding-invoice-accounting.md
Normal file
249
modules/purchase_trade/docs/padding-invoice-accounting.md
Normal file
@@ -0,0 +1,249 @@
|
||||
# Padding facture provisoire vente - notes de session
|
||||
|
||||
Statut: `implemente - a valider comptablement`
|
||||
Derniere mise a jour: `2026-04-26`
|
||||
Scope: `lot.invoice` -> `account.invoice.line` -> `account.move`
|
||||
|
||||
## 1) Objectif metier
|
||||
|
||||
Le padding sert a augmenter temporairement la quantite facturee sur une facture
|
||||
provisoire cote vente, afin de constituer une provision avant la facture finale.
|
||||
|
||||
Le padding ne change jamais la quantite physique du lot. Il represente seulement
|
||||
la part incluse en plus dans la facture provisoire.
|
||||
|
||||
Exemple:
|
||||
|
||||
- 2 lots factures ensemble
|
||||
- padding global saisi dans le wizard: `1000`
|
||||
- repartition actuelle: `500` par lot
|
||||
- chaque ligne facture affiche:
|
||||
- `Quantity = quantite reelle du lot + padding du lot`
|
||||
- `Inc. padding = padding du lot`
|
||||
|
||||
## 2) Saisie et stockage
|
||||
|
||||
### Wizard `lot.invoice`
|
||||
|
||||
- Champ: `sale_padding`
|
||||
- Label UI: `Global padding`
|
||||
- Visible uniquement pour:
|
||||
- `type = sale`
|
||||
- `action = prov`
|
||||
|
||||
Au clic `Invoice`, le wizard:
|
||||
|
||||
1. prend le padding global saisi
|
||||
2. le repartit egalement entre les lots selectionnes
|
||||
3. ecrit la part de chaque lot dans `lot.sale_invoice_padding`
|
||||
4. lance la creation de la facture provisoire vente
|
||||
|
||||
### `lot.lot`
|
||||
|
||||
- Champ: `sale_invoice_padding`
|
||||
- Label UI: `Sale invoice padding`
|
||||
- Mode UI: readonly
|
||||
- Role: memoire durable de la part de padding appliquee au lot.
|
||||
|
||||
Ce champ est la source de verite fonctionnelle pour:
|
||||
|
||||
- afficher le padding sur la facture
|
||||
- exclure le padding du calcul de delta de la facture finale
|
||||
- calculer les ecritures comptables specifiques au padding
|
||||
|
||||
### `account.invoice.line`
|
||||
|
||||
- Champ fonctionnel: `included_padding`
|
||||
- Label UI: `Inc. padding`
|
||||
- Unite affichee: meme unite que `Quantity`
|
||||
- Role: afficher `line.lot.sale_invoice_padding` sur la ligne facture.
|
||||
|
||||
La valeur n'est pas stockee sur la ligne facture. Elle lit le padding depuis le
|
||||
lot pour eviter une deuxieme source de verite.
|
||||
|
||||
## 3) Impact sur la facture provisoire
|
||||
|
||||
Lors de la creation des lignes de facture vente provisoire:
|
||||
|
||||
- seules les lignes positives `out` / `Pro forma` sont impactees
|
||||
- `invoice_line.quantity` est augmente de `lot.sale_invoice_padding`
|
||||
- le montant de ligne augmente naturellement car Tryton calcule:
|
||||
- `quantity * unit_price`
|
||||
|
||||
Consequence:
|
||||
|
||||
- le move principal de facture contient deja le chiffre d'affaires augmente par
|
||||
le padding
|
||||
- `Inc. padding` rend visible la part artificielle incluse dans la quantite
|
||||
- le lot garde sa quantite physique reelle
|
||||
|
||||
## 4) Impact sur la facture finale
|
||||
|
||||
La facture finale doit comparer la quantite physique finale avec la quantite
|
||||
reelle deja facturee en provisoire, pas avec la quantite provisoire augmentee du
|
||||
padding.
|
||||
|
||||
Regle:
|
||||
|
||||
- quantite provisoire reelle =
|
||||
`lot.sale_invoice_line_prov.quantity - lot.sale_invoice_padding`
|
||||
- delta final =
|
||||
`lot.quantite_physique_courante - quantite_provisoire_reelle`
|
||||
|
||||
Exemple:
|
||||
|
||||
- lot initial: `993`
|
||||
- padding provisoire: `100`
|
||||
- facture provisoire: `1093`
|
||||
- apres weighing: `1080`
|
||||
- delta final attendu: `1080 - 993 = 87`
|
||||
|
||||
Sans cette correction, le wizard comparerait `1080` a `1093` et proposerait
|
||||
`-13`, ce qui est faux car le padding ne doit pas etre considere comme une
|
||||
quantite physique deja facturee.
|
||||
|
||||
## 5) Configuration comptable
|
||||
|
||||
Deux comptes par defaut sont ajoutes dans `Financial / Configuration`, dans une
|
||||
section dediee `Padding` placee avant la section `Invoice`.
|
||||
|
||||
Champs:
|
||||
|
||||
- `Default Sale Padding`
|
||||
- champ technique: `default_sale_padding_account`
|
||||
- compte metier attendu: `80021`
|
||||
- nature attendue: revenu
|
||||
- `Default Accrual Padding`
|
||||
- champ technique: `default_accrual_padding_account`
|
||||
- compte metier attendu: `42021`
|
||||
- nature attendue: bilan / accrual
|
||||
|
||||
Les champs suivent le pattern Tryton de `account.configuration`:
|
||||
|
||||
- champ `MultiValue` sur `account.configuration`
|
||||
- stockage dans `account.configuration.default_account`
|
||||
- domaine par compagnie via le contexte `company`
|
||||
|
||||
## 6) Ecriture padding a la validation d'une provisoire
|
||||
|
||||
Point d'entree:
|
||||
|
||||
- `account.invoice.validate_invoice`
|
||||
- puis `invoice.do_lot_invoicing()`
|
||||
- surcharge `purchase_trade.invoice.Invoice.do_lot_invoicing`
|
||||
|
||||
Condition:
|
||||
|
||||
- facture client: `invoice.type = out`
|
||||
- reference facture: `Provisional`
|
||||
- ligne facture: `description = Pro forma`
|
||||
- ligne rattachee a un lot
|
||||
- `lot.sale_invoice_padding > 0`
|
||||
|
||||
Montant:
|
||||
|
||||
- `padding_amount = lot.sale_invoice_padding * invoice_line.unit_price`
|
||||
- devise: devise de la facture provisoire
|
||||
- montant societe: converti avec la devise, le taux et la date de la facture
|
||||
provisoire
|
||||
|
||||
Ecriture creee en `additional_move`:
|
||||
|
||||
- description: `Sale padding accrual`
|
||||
- debit: `Default Sale Padding` (`80021`)
|
||||
- credit: `Default Accrual Padding` (`42021`)
|
||||
- `origin` des lignes: ligne de facture provisoire
|
||||
- `lot` des lignes: lot concerne
|
||||
- `party` renseigne si le compte le requiert
|
||||
|
||||
Raison du `additional_move`:
|
||||
|
||||
- ne pas modifier la construction standard du move principal de facture
|
||||
- isoler l'ecriture padding pour audit et lettrage metier
|
||||
- permettre le posting coordonne avec la facture
|
||||
|
||||
## 7) Ecriture inverse a la finale
|
||||
|
||||
La finale doit extourner exactement le padding comptabilise sur la provisoire.
|
||||
Elle ne doit pas recalculer le montant avec le prix final.
|
||||
|
||||
Source du montant:
|
||||
|
||||
- le lot porte deja le lien vers la ligne provisoire:
|
||||
- `lot.sale_invoice_line_prov`
|
||||
- le montant d'extourne utilise:
|
||||
- `lot.sale_invoice_padding`
|
||||
- `lot.sale_invoice_line_prov.unit_price`
|
||||
- la devise, la date et le taux de la facture provisoire
|
||||
|
||||
Condition:
|
||||
|
||||
- facture client: `invoice.type = out`
|
||||
- reference facture: `Final`
|
||||
- ligne facture: `description = Final`
|
||||
- lot avec `sale_invoice_padding > 0`
|
||||
- lot avec `sale_invoice_line_prov`
|
||||
|
||||
Ecriture creee en `additional_move`:
|
||||
|
||||
- description: `Sale padding reversal`
|
||||
- debit: `Default Accrual Padding` (`42021`)
|
||||
- credit: `Default Sale Padding` (`80021`)
|
||||
- montant: identique au montant padding de la provisoire
|
||||
- `origin` des lignes: ligne de facture provisoire
|
||||
- `lot` des lignes: lot concerne
|
||||
|
||||
## 8) Posting
|
||||
|
||||
Au `Validate`:
|
||||
|
||||
- le move principal de facture est cree
|
||||
- le ou les `additional_moves` padding sont crees en draft
|
||||
|
||||
Au `Post`:
|
||||
|
||||
- les `additional_moves` padding deja crees en draft sont postes
|
||||
- si une facture est postee directement depuis draft, le module cree d'abord les
|
||||
moves padding manquants puis les poste
|
||||
|
||||
Une detection par description evite de recreer deux fois le meme move padding
|
||||
sur la meme facture:
|
||||
|
||||
- `Sale padding accrual`
|
||||
- `Sale padding reversal`
|
||||
|
||||
## 9) Invariants a preserver
|
||||
|
||||
- Le padding est uniquement pour les factures provisoires cote vente.
|
||||
- Le padding ne modifie jamais la quantite physique du lot.
|
||||
- `lot.sale_invoice_padding` reste la memoire fonctionnelle du padding.
|
||||
- La facture affiche toujours l'ecart via `Inc. padding`.
|
||||
- La facture finale ignore le padding pour calculer le delta de quantite.
|
||||
- L'extourne finale reprend le montant de la provisoire, pas le prix final.
|
||||
- Les ecritures padding doivent rester rattachees au lot.
|
||||
|
||||
## 10) Points de vigilance
|
||||
|
||||
- Le sens debit/credit actuellement implemente est:
|
||||
- provisoire: debit `80021`, credit `42021`
|
||||
- finale: debit `42021`, credit `80021`
|
||||
Ce sens doit etre valide par la comptabilite si le plan attendu impose une
|
||||
convention differente.
|
||||
- La detection du type de facture s'appuie sur `invoice.reference`:
|
||||
- `Provisional`
|
||||
- `Final`
|
||||
- La detection des lignes s'appuie sur `invoice_line.description`:
|
||||
- `Pro forma`
|
||||
- `Final`
|
||||
- Si ces libelles changent, la logique padding doit etre ajustee.
|
||||
- Les tests unitaires complets n'ont pas pu etre lances dans l'environnement
|
||||
local actuel a cause de dependances manquantes (`pytest`, puis `jwt`).
|
||||
|
||||
## 11) Validations techniques de session
|
||||
|
||||
Validations effectuees localement:
|
||||
|
||||
- compilation Python ciblee des fichiers touches
|
||||
- validation XML ciblee des vues et definitions modifiees
|
||||
- `git diff --check` sans erreur bloquante, avec seulement des alertes CRLF
|
||||
existantes dans le repository
|
||||
@@ -1,8 +1,8 @@
|
||||
# Template Properties - Purchase Trade
|
||||
|
||||
Statut: `draft`
|
||||
Version: `v0.1`
|
||||
Derniere mise a jour: `2026-03-27`
|
||||
Version: `v0.3`
|
||||
Derniere mise a jour: `2026-04-23`
|
||||
|
||||
## 1) Objectif
|
||||
|
||||
@@ -29,6 +29,8 @@ Derniere mise a jour: `2026-03-27`
|
||||
- reutiliser si possible les proprietes `report_*` deja presentes sur `sale.sale`
|
||||
- Pour un achat:
|
||||
- reutiliser si possible les proprietes `report_*` deja presentes sur `purchase.purchase`
|
||||
- Pour un shipment entrant:
|
||||
- reutiliser si possible les proprietes `report_*` exposees sur `stock.shipment.in`
|
||||
|
||||
## 4) Propriete disponibles sur `account.invoice`
|
||||
|
||||
@@ -62,6 +64,10 @@ Source code: `modules/purchase_trade/invoice.py`
|
||||
- Usage: description produit principale
|
||||
- Source de verite: premiere ligne metier liee a la facture
|
||||
|
||||
- `report_product_name`
|
||||
- Usage: nom produit principal
|
||||
- Source de verite: premiere ligne metier liee a la facture
|
||||
|
||||
- `report_description_upper`
|
||||
- Usage: description de ligne en majuscules
|
||||
- Source de verite: premiere `account.invoice.line`
|
||||
@@ -94,6 +100,10 @@ Source code: `modules/purchase_trade/invoice.py`
|
||||
- Usage: poids net converti en LBS
|
||||
- Source de verite: conversion de `report_net`
|
||||
|
||||
- `report_quantity_lines`
|
||||
- Usage: detail quantite multi-lignes pour les templates facture
|
||||
- Source de verite: `sale.report_quantity_lines` si vente source, sinon aggregation des `account.invoice.line`
|
||||
|
||||
### Bloc prix type `sale_ict`
|
||||
|
||||
- `report_rate_currency_upper`
|
||||
@@ -116,6 +126,10 @@ Source code: `modules/purchase_trade/invoice.py`
|
||||
- Usage: texte de pricing additionnel
|
||||
- Source de verite: premiere `account.invoice.line` de type `line`
|
||||
|
||||
- `report_rate_lines`
|
||||
- Usage: detail multi-lignes du bloc `At ... PER ...`
|
||||
- Source de verite: `sale.report_price_lines` si vente source, sinon aggregation des `account.invoice.line`
|
||||
|
||||
### Logistique / shipment
|
||||
|
||||
- `report_shipment`
|
||||
@@ -186,6 +200,81 @@ Source code: `modules/purchase_trade/invoice.py`
|
||||
- Usage: devise du `FREIGHT VALUE`
|
||||
- Source de verite: devise du fee `Maritime freight`, fallback devise facture
|
||||
|
||||
### Payment order
|
||||
|
||||
- `report_payment_order_short_name`
|
||||
- Usage: nom court emetteur du payment order
|
||||
- Source de verite: `invoice.company.party.rec_name`
|
||||
|
||||
- `report_payment_order_document_reference`
|
||||
- Usage: reference du document payment order
|
||||
- Source de verite: `invoice.number`, fallback `invoice.reference`
|
||||
|
||||
- `report_payment_order_from_account_nb`
|
||||
- Usage: compte bancaire emetteur
|
||||
- Source de verite: premier `bank.account` de la societe
|
||||
|
||||
- `report_payment_order_to_bank_name`
|
||||
- Usage: banque destinataire
|
||||
- Source de verite: banque du premier compte bancaire du partenaire facture
|
||||
|
||||
- `report_payment_order_to_bank_city`
|
||||
- Usage: ville banque destinataire
|
||||
- Source de verite: adresse de la banque destinataire
|
||||
|
||||
- `report_payment_order_amount`
|
||||
- Usage: montant payment order
|
||||
- Source de verite: `invoice.total_amount`
|
||||
|
||||
- `report_payment_order_currency_code`
|
||||
- Usage: devise payment order
|
||||
- Source de verite: `invoice.currency` (`code`, fallback `rec_name/symbol`)
|
||||
|
||||
- `report_payment_order_amount_text`
|
||||
- Usage: montant en lettres
|
||||
- Source de verite: conversion `amount_to_currency_words(invoice.total_amount)`
|
||||
|
||||
- `report_payment_order_value_date`
|
||||
- Usage: date valeur
|
||||
- Source de verite: `invoice.payment_term_date`, fallback `invoice.invoice_date`
|
||||
|
||||
- `report_payment_order_company_address`
|
||||
- Usage: bloc beneficiaire
|
||||
- Source de verite: `invoice.invoice_address.full_address`, fallback
|
||||
`invoice.report_address`
|
||||
|
||||
- `report_payment_order_beneficiary_account_nb`
|
||||
- Usage: compte beneficiaire
|
||||
- Source de verite: premier compte bancaire du `invoice.party`
|
||||
|
||||
- `report_payment_order_beneficiary_bank_name`
|
||||
- Usage: banque beneficiaire
|
||||
- Source de verite: banque du compte beneficiaire
|
||||
|
||||
- `report_payment_order_beneficiary_bank_city`
|
||||
- Usage: ville banque beneficiaire
|
||||
- Source de verite: adresse banque beneficiaire
|
||||
|
||||
- `report_payment_order_swift_code`
|
||||
- Usage: swift/bic beneficiaire
|
||||
- Source de verite: `bank.bic`
|
||||
|
||||
- `report_payment_order_other_instructions`
|
||||
- Usage: instructions complementaires
|
||||
- Source de verite: `invoice.description`
|
||||
|
||||
- `report_payment_order_reference`
|
||||
- Usage: reference business de paiement
|
||||
- Source de verite: `invoice.reference`, fallback `invoice.number`
|
||||
|
||||
- `report_payment_order_current_user`
|
||||
- Usage: signataire payment order
|
||||
- Source de verite: utilisateur courant (`res.user`)
|
||||
|
||||
- `report_payment_order_current_user_email`
|
||||
- Usage: email retour swift
|
||||
- Source de verite: contact email du `party` utilisateur, fallback `user.email`
|
||||
|
||||
## 5) Proprietes disponibles sur `account.invoice.line`
|
||||
|
||||
Source code: `modules/purchase_trade/invoice.py`
|
||||
@@ -239,21 +328,44 @@ Source code: `modules/purchase_trade/invoice.py`
|
||||
Source code: `modules/purchase_trade/sale.py`
|
||||
|
||||
- `report_terms`
|
||||
- `report_crop_name`
|
||||
- `report_gross`
|
||||
- `report_net`
|
||||
- `report_qt`
|
||||
- `report_total_quantity`
|
||||
- `report_quantity_unit_upper`
|
||||
- `report_quantity_lines`
|
||||
- `report_nb_bale`
|
||||
- `report_deal`
|
||||
- `report_packing`
|
||||
- `report_price`
|
||||
- `report_price_lines`
|
||||
- `report_delivery`
|
||||
- `report_payment_date`
|
||||
- `report_shipment`
|
||||
- `report_shipment_periods`
|
||||
- `report_product_name`
|
||||
- `report_product_description`
|
||||
|
||||
Usage typique:
|
||||
- base de travail pour les templates de type `sale_ict.fodt`
|
||||
- source de verite de plusieurs proprietes du bridge facture
|
||||
|
||||
### Proprietes specifiques `sale_melya.fodt`
|
||||
|
||||
- `report_melya_proforma_number`
|
||||
- Usage: valeur affichee dans `Proforma Nr`
|
||||
- Source de verite: deal lie via `report_deal`, fallback numero de vente
|
||||
|
||||
- `report_melya_buyer_address`
|
||||
- Usage: bloc buyer avec nom long et adresse
|
||||
- Source de verite: `sale.invoice_address.full_address` avec le contexte
|
||||
`address_with_party`
|
||||
|
||||
- `report_melya_incoterm`
|
||||
- Usage: ligne `DELIVERY TERMS`
|
||||
- Source de verite: incoterm code + lieu incoterm + pays du lieu incoterm
|
||||
|
||||
## 7) Proprietes utiles deja presentes sur `purchase.purchase`
|
||||
|
||||
Source code: `modules/purchase_trade/purchase.py`
|
||||
@@ -274,8 +386,43 @@ Usage typique:
|
||||
- `modules/account_invoice/invoice_ict.fodt`
|
||||
- `modules/account_invoice/invoice_ict_final.fodt`
|
||||
- `modules/sale/sale_ict.fodt`
|
||||
- `modules/stock/insurance.fodt`
|
||||
|
||||
## 9) Recommandations
|
||||
## 9) Proprietes utiles deja presentes sur `stock.shipment.in`
|
||||
|
||||
Source code: `modules/purchase_trade/stock.py`
|
||||
|
||||
- `report_product_name`
|
||||
- `report_product_description`
|
||||
- `report_insurance_footer_ref`
|
||||
- `report_insurance_certificate_number`
|
||||
- `report_insurance_account_of`
|
||||
- `report_insurance_goods_description`
|
||||
- `report_insurance_loading_port`
|
||||
- `report_insurance_discharge_port`
|
||||
- `report_insurance_transport`
|
||||
- `report_insurance_amount`
|
||||
- `report_insurance_incoming_amount`
|
||||
- `report_insurance_amount_insured`
|
||||
- `report_insurance_surveyor`
|
||||
- `report_insurance_contact_surveyor`
|
||||
- `report_insurance_issue_place_and_date`
|
||||
|
||||
Usage typique:
|
||||
- templates shipment relies a l'assurance
|
||||
- `report_insurance_amount`: montant affiche dans `Amount insured` (priorite a
|
||||
`110%` du total incoming, fallback fee `Insurance`)
|
||||
- `report_insurance_incoming_amount`: somme `incoming_moves` de
|
||||
`quantity * unit_price`, avec fallback lot
|
||||
(`lot.line.unit_price * lot.get_current_quantity_converted()`)
|
||||
- `report_insurance_amount_insured`: `110%` de
|
||||
`report_insurance_incoming_amount`
|
||||
- `report_insurance_contact_surveyor`: surveyor affiche sous
|
||||
`Contact the following surveyor` (priorite au champ shipment `surveyor`,
|
||||
puis fallback controller / fee `Insurance`)
|
||||
- base de travail pour un certificat d'assurance lie a un shipment
|
||||
|
||||
## 10) Recommandations
|
||||
|
||||
- Avant d'ajouter une nouvelle expression dans un `.fodt`, verifier si une
|
||||
propriete `report_*` existe deja ici.
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Template Rules - Purchase Trade
|
||||
|
||||
Statut: `draft`
|
||||
Version: `v0.2`
|
||||
Derniere mise a jour: `2026-03-27`
|
||||
Version: `v0.4`
|
||||
Derniere mise a jour: `2026-04-07`
|
||||
|
||||
## 1) Scope
|
||||
|
||||
@@ -98,6 +98,135 @@ Derniere mise a jour: `2026-03-27`
|
||||
- verifier si le probleme vient du cache avant de modifier le `.fodt`
|
||||
- pour un report alternatif, ne pas reutiliser le cache du report standard `account_invoice/invoice.fodt`
|
||||
- si besoin, bypasser la lecture/ecriture du cache pour les templates alternatifs
|
||||
- pour les clients multi-templates, preferer une configuration metier qui
|
||||
stocke le nom du template par action (`Invoice`, `CN/DN`, `Prepayment`)
|
||||
plutot qu'une modification manuelle de `ir_action_report.report`
|
||||
|
||||
### TR-012 - Centraliser les templates client dans `Document Templates`
|
||||
|
||||
- Pour les templates client-specifiques, ne pas modifier `ir_action_report.report`
|
||||
en base a la main selon l'environnement ou le client.
|
||||
- Preferer la configuration singleton `purchase_trade.configuration`,
|
||||
exposee dans `Documents > Configuration > Document Templates`.
|
||||
- Sections actuellement attendues:
|
||||
- `Sale`
|
||||
- `Invoice`
|
||||
- `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`
|
||||
- ne pas masquer dynamiquement l'action d'impression si ce n'est pas
|
||||
necessaire
|
||||
|
||||
### TR-013 - `sale_melya.fodt` et `invoice_melya.fodt` doivent afficher nom + description produit
|
||||
|
||||
- Dans les templates client Melya, le bloc produit doit prevoir:
|
||||
- une ligne pour le nom produit
|
||||
- une ligne pour la description produit
|
||||
- Ne pas dereferencer directement `line.product.name` / `line.product.description`
|
||||
dans les `.fodt`.
|
||||
- Preferer:
|
||||
- `sale.report_product_name`
|
||||
- `sale.report_product_description`
|
||||
- `invoice.report_product_name`
|
||||
- `invoice.report_product_description`
|
||||
|
||||
### TR-014 - `invoice_melya.fodt` doit afficher `Invoice` et `Reference` sur les bons champs
|
||||
|
||||
- Pour `modules/account_invoice/invoice_melya.fodt`:
|
||||
- `Invoice` doit afficher `invoice.number`
|
||||
- `Reference` doit afficher `invoice.report_contract_number`
|
||||
- Ne pas reutiliser `invoice.reference` pour ce label dans ce template client
|
||||
sans demande explicite
|
||||
|
||||
### TR-015 - Le template `stock/insurance.fodt` doit lire sur `stock.shipment.in`
|
||||
|
||||
- Le template `modules/stock/insurance.fodt` est pilote par le report
|
||||
`stock.shipment.in.insurance`.
|
||||
- Toutes les croix rouges / placeholders metier doivent etre remplacees par
|
||||
des proprietes `report_*` exposees sur `stock.shipment.in`.
|
||||
- Pour ce template, ne pas compter sur une variable Genshi locale `shipment`
|
||||
dans tout le document; preferer `records[0]....` dans le `.fodt`.
|
||||
- Source de verite du montant assure:
|
||||
- sommer les montants des `incoming_moves` du shipment
|
||||
- montant d'un move = `move.quantity * move.unit_price`
|
||||
- si `move.unit_price` est vide, fallback via lot:
|
||||
`lot.line.unit_price * lot.get_current_quantity_converted()`
|
||||
- exposer au moins:
|
||||
- le montant total des incoming moves
|
||||
- le montant assure a `110%` de ce total
|
||||
- pour le placeholder `Amount insured`, `report_insurance_amount` doit
|
||||
afficher ce `110%`, avec fallback fee `Insurance` si aucun montant
|
||||
incoming n'est calculable
|
||||
|
||||
### TR-016 - Hypotheses actuelles pour le certificat d'assurance shipment
|
||||
|
||||
- Tant qu'une source metier plus precise n'est pas fournie:
|
||||
- numero du certificat: `shipment.bl_number`, sinon `shipment.number`
|
||||
- `insured for account of`: client de la premiere ligne metier retrouvee via
|
||||
lot physique, sinon `shipment.supplier`
|
||||
- `surveyor`: `shipment.surveyor`, sinon `shipment.controller`, sinon
|
||||
fournisseur du fee `Insurance`
|
||||
- lieu/date d'emission: ville de la societe + date du jour
|
||||
- Si une source differente est decidee plus tard, corriger la propriete Python
|
||||
plutot que complexifier `insurance.fodt`
|
||||
|
||||
### TR-017 - `payment_order.fodt` doit utiliser des proprietes `report_payment_order_*`
|
||||
|
||||
- Pour `modules/account_invoice/payment_order.fodt`, ne pas utiliser des
|
||||
placeholders externes legacy (tokens metier entre `<...>` du systeme source).
|
||||
- Tous les placeholders du template doivent pointer vers des proprietes Python
|
||||
stables exposees sur `account.invoice`:
|
||||
- `report_payment_order_document_reference`
|
||||
- `report_payment_order_from_account_nb`
|
||||
- `report_payment_order_to_bank_name`
|
||||
- `report_payment_order_to_bank_city`
|
||||
- `report_payment_order_amount`
|
||||
- `report_payment_order_currency_code`
|
||||
- `report_payment_order_amount_text`
|
||||
- `report_payment_order_value_date`
|
||||
- `report_payment_order_company_address`
|
||||
- `report_payment_order_beneficiary_account_nb`
|
||||
- `report_payment_order_beneficiary_bank_name`
|
||||
- `report_payment_order_beneficiary_bank_city`
|
||||
- `report_payment_order_swift_code`
|
||||
- `report_payment_order_other_instructions`
|
||||
- `report_payment_order_reference`
|
||||
- `report_payment_order_current_user`
|
||||
- `report_payment_order_current_user_email`
|
||||
- Eviter les marqueurs conditionnels heredites de l'ancien moteur (`++...`):
|
||||
privilegier des placeholders simples avec fallback `or ''`.
|
||||
|
||||
### TR-018 - Un template configure n'apparait dans le form que si une action report existe
|
||||
|
||||
- Ajouter un champ dans `Document Templates` ne suffit pas a rendre un
|
||||
template imprimable depuis la fiche.
|
||||
- Pour afficher l'entree dans `account.invoice`, il faut aussi:
|
||||
- un `ir.action.report` sur `model = account.invoice`
|
||||
- un `ir.action.keyword` `form_print` lie a cette action
|
||||
- Appliquer cette regle pour `Payment Order` comme pour `Invoice`,
|
||||
`Prepayment` et `CN/DN`.
|
||||
|
||||
### TR-019 - Un placeholder Relatorio doit etre dans une balise `text:placeholder`
|
||||
|
||||
- Dans un `.fodt`, une expression du type `<records[0].report_* ...>`
|
||||
ecrite en texte brut peut s'afficher telle quelle a l'impression.
|
||||
- Regle stricte:
|
||||
- encapsuler les expressions dans
|
||||
`<text:placeholder text:placeholder-type="text">...</text:placeholder>`
|
||||
- ne pas laisser de token `<...>` directement dans un `text:span`,
|
||||
`text:p`, `text:h`, etc.
|
||||
- Exemple:
|
||||
- incorrect:
|
||||
`PAYMENT ORDER <records[0].report_payment_order_document_reference or ''>`
|
||||
- correct:
|
||||
`PAYMENT ORDER <text:placeholder text:placeholder-type="text"><records[0].report_payment_order_document_reference or ''></text:placeholder>`
|
||||
|
||||
### TR-007 - Pour une facture trade, privilegier le lot physique comme chemin de navigation
|
||||
|
||||
@@ -126,6 +255,44 @@ Derniere mise a jour: `2026-03-27`
|
||||
- utiliser `fee.get_amount()`
|
||||
- Si le fee a sa propre devise, preferer aussi exposer le symbole de devise depuis le fee plutot que depuis la facture.
|
||||
|
||||
### TR-009 - Ne pas dereferencer directement `del_period.description` dans les templates
|
||||
|
||||
- Eviter les expressions du type:
|
||||
- `sale.lines[0].del_period.description`
|
||||
- `purchase.lines[0].del_period.description`
|
||||
- Meme avec un `if ... else`, ces acces sont fragiles dans un `.fodt` et
|
||||
rendent le debug plus difficile.
|
||||
- Preferer une propriete Python stable:
|
||||
- `sale.report_delivery_period_description`
|
||||
- `purchase.report_delivery_period_description`
|
||||
- `invoice.report_delivery_period_description`
|
||||
|
||||
### TR-010 - En template, un contrat `basis` affiche le premium comme prix
|
||||
|
||||
- Pour les templates commerciaux/facture (`sale_ict`, `invoice_ict`, etc.),
|
||||
le prix affiche d'une ligne `basis` ne doit pas etre le prix economique total
|
||||
(`unit_price`, `linked_price` ou prix basis brut).
|
||||
- La valeur a afficher est uniquement le `premium`:
|
||||
- en devise/unite liee si `linked currency` est active
|
||||
- sinon dans la devise/unite native de la ligne
|
||||
- Le texte de curve / pricing (`ON ICE ...`) reste affiche a cote, mais la
|
||||
valeur numerique et sa version en lettres doivent representer le premium.
|
||||
|
||||
### TR-011 - Pour `NB BALES` sur une facture, sommer les `lot_qt` des lignes facture
|
||||
|
||||
- Pour `invoice_ict.fodt` et `invoice_ict_final.fodt`, la source de verite du
|
||||
nombre de bales n'est pas le poids (`report_net`, `report_gross`) mais
|
||||
`line.lot.lot_qt`.
|
||||
- La regle attendue est:
|
||||
- lire les lignes de facture
|
||||
- recuperer leur `lot`
|
||||
- sommer `lot.lot_qt`
|
||||
- sur une note finale, tenir compte du signe de la ligne de facture pour que
|
||||
les lignes positives et negatives se compensent
|
||||
- Ne pas recalculer le nombre de bales a partir du poids:
|
||||
- les poids peuvent varier (humidite, poids net/gross)
|
||||
- le nombre de bales peut rester stable
|
||||
|
||||
## 4) Workflow recommande pour corriger un template en erreur
|
||||
|
||||
1. Identifier le placeholder exact qui provoque l'erreur Relatorio.
|
||||
|
||||
@@ -321,10 +321,22 @@ class Fee(ModelSQL,ModelView):
|
||||
qt = self.get_fee_lots_qt()
|
||||
if qt:
|
||||
return qt
|
||||
line = self.line or self.sale_line
|
||||
if line and line.lots:
|
||||
return sum(
|
||||
Decimal(lot.get_current_quantity_converted(0, self.unit))
|
||||
for lot in line.lots)
|
||||
LotQt = Pool().get('lot.qt')
|
||||
lqts = LotQt.search(['lot_shipment_in','=',self.shipment_in.id])
|
||||
if lqts:
|
||||
return Decimal(lqts[0].lot_quantity)
|
||||
if self.shipment_in:
|
||||
lqts = LotQt.search(['lot_shipment_in','=',self.shipment_in.id])
|
||||
if lqts:
|
||||
return Decimal(lqts[0].lot_quantity)
|
||||
|
||||
def _get_amount_quantity(self):
|
||||
quantity = self.quantity
|
||||
if quantity is None:
|
||||
quantity = self.get_quantity()
|
||||
return Decimal(quantity or 0)
|
||||
|
||||
def get_amount(self,name=None):
|
||||
Date = Pool().get('ir.date')
|
||||
@@ -358,7 +370,7 @@ class Fee(ModelSQL,ModelView):
|
||||
compounding='simple'
|
||||
)
|
||||
|
||||
return round(factor * self.line.unit_price * (self.quantity if self.quantity else 0) * sign,2)
|
||||
return round(factor * self.line.unit_price * self._get_amount_quantity() * sign,2)
|
||||
if self.sale_line:
|
||||
if self.sale_line.sale.payment_term:
|
||||
beg_date = self.fee_date if self.fee_date else Date.today()
|
||||
@@ -374,7 +386,7 @@ class Fee(ModelSQL,ModelView):
|
||||
compounding='simple'
|
||||
)
|
||||
logger.info("FACTOR:%s",factor)
|
||||
return round(factor * self.sale_line.unit_price * (self.quantity if self.quantity else 0) * sign,2)
|
||||
return round(factor * self.sale_line.unit_price * self._get_amount_quantity() * sign,2)
|
||||
|
||||
elif self.mode == 'perqt':
|
||||
if self.shipment_in:
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
66
modules/purchase_trade/invoice.xml
Normal file
66
modules/purchase_trade/invoice.xml
Normal file
@@ -0,0 +1,66 @@
|
||||
<tryton>
|
||||
<data>
|
||||
<record model="ir.ui.view" id="invoice_line_view_form">
|
||||
<field name="model">account.invoice.line</field>
|
||||
<field name="inherit" ref="account_invoice.invoice_line_view_form"/>
|
||||
<field name="name">invoice_line_form</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="invoice_line_view_tree_sequence">
|
||||
<field name="model">account.invoice.line</field>
|
||||
<field name="inherit" ref="account_invoice.invoice_line_view_tree_sequence"/>
|
||||
<field name="name">invoice_line_tree_sequence</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.action.report" id="report_invoice_packing_list">
|
||||
<field name="name">Packing List</field>
|
||||
<field name="model">account.invoice</field>
|
||||
<field name="report_name">account.invoice</field>
|
||||
<field name="report">account_invoice/packing_list.fodt</field>
|
||||
<field name="single" eval="True"/>
|
||||
</record>
|
||||
<record model="ir.action.keyword" id="report_invoice_packing_list_keyword">
|
||||
<field name="keyword">form_print</field>
|
||||
<field name="model">account.invoice,-1</field>
|
||||
<field name="action" ref="report_invoice_packing_list"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.action.report" id="report_payment_order">
|
||||
<field name="name">Payment Order</field>
|
||||
<field name="model">account.invoice</field>
|
||||
<field name="report_name">account.invoice</field>
|
||||
<field name="report">account_invoice/payment_order.fodt</field>
|
||||
<field name="single" eval="True"/>
|
||||
</record>
|
||||
<record model="ir.action.keyword" id="report_payment_order_keyword">
|
||||
<field name="keyword">form_print</field>
|
||||
<field name="model">account.invoice,-1</field>
|
||||
<field name="action" ref="report_payment_order"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="invoice_padding_context_view_form">
|
||||
<field name="model">invoice.padding.context</field>
|
||||
<field name="type">form</field>
|
||||
<field name="name">invoice_padding_context_form</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="invoice_padding_report_view_list">
|
||||
<field name="model">invoice.padding.report</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="name">invoice_padding_report_list</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window" id="act_invoice_padding_report_form">
|
||||
<field name="name">Invoice with padding</field>
|
||||
<field name="res_model">invoice.padding.report</field>
|
||||
<field name="context_model">invoice.padding.context</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_invoice_padding_report_form_view">
|
||||
<field name="sequence" eval="70"/>
|
||||
<field name="view" ref="invoice_padding_report_view_list"/>
|
||||
<field name="act_window" ref="act_invoice_padding_report_form"/>
|
||||
</record>
|
||||
<menuitem
|
||||
parent="purchase_trade.menu_global_reporting"
|
||||
sequence="101"
|
||||
action="act_invoice_padding_report_form"
|
||||
id="menu_invoice_padding_report_form"/>
|
||||
</data>
|
||||
</tryton>
|
||||
@@ -55,6 +55,8 @@ class Lot(metaclass=PoolMeta):
|
||||
invoice_line_prov = fields.Many2One('account.invoice.line',"Purch. Invoice line prov")
|
||||
sale_invoice_line = fields.Many2One('account.invoice.line',"Sale Invoice line")
|
||||
sale_invoice_line_prov = fields.Many2One('account.invoice.line',"Sale Invoice line prov")
|
||||
sale_invoice_padding = fields.Numeric(
|
||||
"Sale invoice padding", digits='lot_unit_line', readonly=True)
|
||||
delta_qt = fields.Numeric("Delta Qt")
|
||||
delta_pr = fields.Numeric("Delta Pr")
|
||||
delta_amt = fields.Numeric("Delta Amt")
|
||||
@@ -1336,6 +1338,11 @@ class LotQt(
|
||||
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(
|
||||
(((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'),
|
||||
@@ -1443,6 +1450,7 @@ class LotQt(
|
||||
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"),
|
||||
@@ -1508,6 +1516,7 @@ class LotQt(
|
||||
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"),
|
||||
@@ -1561,6 +1570,7 @@ class LotQt(
|
||||
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"),
|
||||
@@ -1636,6 +1646,7 @@ class LotReport(
|
||||
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')
|
||||
@@ -2711,9 +2722,17 @@ class LotInvoice(Wizard):
|
||||
val_s['lot_diff_price'] = 0
|
||||
val_s['lot_diff_amount'] = 0
|
||||
if lot.sale_invoice_line_prov:
|
||||
val_s['lot_diff_quantity'] = val_s['lot_quantity'] - Decimal(lot.sale_invoice_line_prov.quantity)
|
||||
provisional_quantity = (
|
||||
Decimal(lot.sale_invoice_line_prov.quantity)
|
||||
- Decimal(str(lot.sale_invoice_padding or 0)))
|
||||
val_s['lot_diff_quantity'] = (
|
||||
val_s['lot_quantity'] - provisional_quantity)
|
||||
val_s['lot_diff_price'] = val_s['lot_price'] - Decimal(lot.sale_invoice_line_prov.unit_price)
|
||||
val_s['lot_diff_amount'] = val_s['lot_amount'] - Decimal(lot.sale_invoice_line_prov.amount)
|
||||
provisional_amount = (
|
||||
provisional_quantity
|
||||
* Decimal(lot.sale_invoice_line_prov.unit_price))
|
||||
val_s['lot_diff_amount'] = (
|
||||
val_s['lot_amount'] - provisional_amount)
|
||||
val_s['lot_currency'] = lot.lot_price_ct_symbol_sale
|
||||
val_s['lot_unit'] = sale_line.unit.id if sale_line else None
|
||||
lot_s.append(val_s)
|
||||
@@ -2779,12 +2798,16 @@ class LotInvoice(Wizard):
|
||||
Purchase = Pool().get('purchase.purchase')
|
||||
Sale = Pool().get('sale.sale')
|
||||
lots = []
|
||||
purchases = []
|
||||
sales = []
|
||||
action = self.inv.action
|
||||
for r in self.records:
|
||||
purchase = r.r_line.purchase
|
||||
sale = None
|
||||
if r.r_sale_line:
|
||||
sale = r.r_sale_line.sale
|
||||
purchase = r.r_line.purchase if r.r_line else None
|
||||
sale = r.r_sale_line.sale if r.r_sale_line else None
|
||||
if purchase and purchase not in purchases:
|
||||
purchases.append(purchase)
|
||||
if sale and sale not in sales:
|
||||
sales.append(sale)
|
||||
lot = Lot(r.r_lot_p)
|
||||
# if lot.move == None:
|
||||
# Warning = Pool().get('res.user.warning')
|
||||
@@ -2799,16 +2822,44 @@ class LotInvoice(Wizard):
|
||||
|
||||
invoice_line = None
|
||||
if self.inv.type == 'purchase':
|
||||
Purchase._process_invoice([purchase],lots,action,self.inv.pp_pur)
|
||||
invoice_line = r.r_lot_p.invoice_line if r.r_lot_p.invoice_line else r.r_lot_p.invoice_line_prov
|
||||
Purchase._process_invoice(purchases, lots, action, self.inv.pp_pur)
|
||||
for lot in lots:
|
||||
lot = Lot(lot.id)
|
||||
invoice_line = lot.invoice_line or lot.invoice_line_prov
|
||||
if invoice_line:
|
||||
break
|
||||
else:
|
||||
if sale:
|
||||
Sale._process_invoice([sale],lots,action,self.inv.pp_sale)
|
||||
invoice_line = r.r_lot_p.invoice_line if r.r_lot_p.sale_invoice_line else r.r_lot_p.sale_invoice_line_prov
|
||||
if sales:
|
||||
self._apply_sale_invoice_padding(lots)
|
||||
Sale._process_invoice(sales, lots, action, self.inv.pp_sale)
|
||||
for lot in lots:
|
||||
lot = Lot(lot.id)
|
||||
invoice_line = lot.sale_invoice_line or lot.sale_invoice_line_prov
|
||||
if invoice_line:
|
||||
break
|
||||
if not invoice_line:
|
||||
raise UserError("No invoice line was generated from the selected lots.")
|
||||
self.message.invoice = invoice_line.invoice
|
||||
|
||||
return 'message'
|
||||
|
||||
@classmethod
|
||||
def _split_sale_padding(cls, padding, lots):
|
||||
padding = Decimal(str(padding or 0))
|
||||
if not padding or not lots:
|
||||
return {}
|
||||
share = padding / Decimal(len(lots))
|
||||
return {lot.id: share for lot in lots}
|
||||
|
||||
def _apply_sale_invoice_padding(self, lots):
|
||||
Lot = Pool().get('lot.lot')
|
||||
if self.inv.type != 'sale' or self.inv.action != 'prov':
|
||||
return
|
||||
padding_by_lot = self._split_sale_padding(self.inv.sale_padding, lots)
|
||||
for lot in lots:
|
||||
lot.sale_invoice_padding = padding_by_lot.get(lot.id, Decimal(0))
|
||||
Lot.save(lots)
|
||||
|
||||
def default_message(self, fields):
|
||||
return {
|
||||
'message': 'The invoice has been successfully created.',
|
||||
@@ -2849,16 +2900,24 @@ class LotInvoiceStart(ModelView):
|
||||
amount = fields.Numeric("Amount to invoice",digits='unit',readonly=True,states={'invisible': Eval('type')=='sale'})
|
||||
quantity_s = fields.Numeric("Quantity to invoice",digits='unit',readonly=True,states={'invisible': Eval('type')=='purchase'})
|
||||
amount_s = fields.Numeric("Amount to invoice",digits='unit',readonly=True,states={'invisible': Eval('type')=='purchase'})
|
||||
sale_padding = fields.Numeric("Global padding", digits='unit',
|
||||
states={
|
||||
'invisible': (Eval('type') == 'purchase') | (Eval('action') != 'prov'),
|
||||
})
|
||||
|
||||
@fields.depends('type')
|
||||
def on_change_with_action(self, name=None):
|
||||
if self.lot_p and self.type == 'purchase':
|
||||
if self.lot_p[0].lot.line.purchase.wb.qt_type in [e.quantity_type for e in self.lot_p[0].lot.lot_hist]:
|
||||
purchase = getattr(getattr(self.lot_p[0].lot, 'line', None), 'purchase', None)
|
||||
wb = getattr(purchase, 'wb', None)
|
||||
if wb and wb.qt_type in [e.quantity_type for e in self.lot_p[0].lot.lot_hist]:
|
||||
return 'final'
|
||||
else:
|
||||
return 'prov'
|
||||
if self.lot_s and self.type == 'sale':
|
||||
if self.lot_s[0].lot.sale_line.sale.wb.qt_type in [e.quantity_type for e in self.lot_s[0].lot.lot_hist]:
|
||||
sale = getattr(getattr(self.lot_s[0].lot, 'sale_line', None), 'sale', None)
|
||||
wb = getattr(sale, 'wb', None)
|
||||
if wb and wb.qt_type in [e.quantity_type for e in self.lot_s[0].lot.lot_hist]:
|
||||
return 'final'
|
||||
else:
|
||||
return 'prov'
|
||||
@@ -2885,7 +2944,7 @@ class LotInvoiceStart(ModelView):
|
||||
amount += l.lot_amount
|
||||
return amount
|
||||
|
||||
@fields.depends('lot_s','type','quantity_s')
|
||||
@fields.depends('lot_s','type','quantity_s','sale_padding')
|
||||
def on_change_with_quantity_s(self, name=None):
|
||||
if self.lot_s and self.type == 'sale':
|
||||
quantity = Decimal(0)
|
||||
@@ -2894,17 +2953,23 @@ class LotInvoiceStart(ModelView):
|
||||
quantity += l.lot_diff_quantity
|
||||
else:
|
||||
quantity += l.lot_quantity
|
||||
quantity += Decimal(str(self.sale_padding or 0))
|
||||
return quantity
|
||||
|
||||
@fields.depends('lot_s','type','amount_s')
|
||||
@fields.depends('lot_s','type','amount_s','sale_padding')
|
||||
def on_change_with_amount_s(self, name=None):
|
||||
if self.lot_s and self.type == 'sale':
|
||||
amount = Decimal(0)
|
||||
padding = Decimal(str(self.sale_padding or 0))
|
||||
padding_share = (
|
||||
padding / Decimal(len(self.lot_s))
|
||||
if padding and self.lot_s else Decimal(0))
|
||||
for l in self.lot_s:
|
||||
if l.lot.sale_invoice_line_prov:
|
||||
amount += l.lot_diff_amount
|
||||
else:
|
||||
amount += l.lot_amount
|
||||
amount += padding_share * Decimal(str(l.lot_price or 0))
|
||||
return amount
|
||||
|
||||
@classmethod
|
||||
@@ -3041,6 +3106,7 @@ class LotWeighing(Wizard):
|
||||
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
|
||||
@@ -3067,6 +3133,7 @@ class LotWeighing(Wizard):
|
||||
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
|
||||
@@ -3107,6 +3174,7 @@ class LotWeighingLot(ModelView):
|
||||
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_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)
|
||||
@@ -3165,22 +3233,40 @@ class CreateContracts(Wizard):
|
||||
sh_int = None
|
||||
sh_out = None
|
||||
lot = None
|
||||
qt = None
|
||||
qt = Decimal(0)
|
||||
type = None
|
||||
shipment_in_values = set()
|
||||
shipment_internal_values = set()
|
||||
shipment_out_values = set()
|
||||
for i in ids:
|
||||
val = {}
|
||||
if i < 10000000:
|
||||
raise UserError("You must create contract from an open quantity !")
|
||||
l = LotQt(i - 10000000)
|
||||
ll = Lot(l.lot_p if l.lot_p else l.lot_s)
|
||||
type = "Sale" if l.lot_p else "Purchase"
|
||||
current_type = "Sale" if l.lot_p else "Purchase"
|
||||
if type and current_type != type:
|
||||
raise UserError("You must select open quantities from the same side.")
|
||||
type = current_type
|
||||
if product and ll.lot_product.id != product:
|
||||
raise UserError("You must select open quantities with the same product.")
|
||||
if unit and l.lot_unit.id != unit:
|
||||
raise UserError("You must select open quantities with the same unit.")
|
||||
unit = l.lot_unit.id
|
||||
qt = l.lot_quantity
|
||||
qt += abs(Decimal(str(l.lot_quantity or 0)))
|
||||
product = ll.lot_product.id
|
||||
sh_in = l.lot_shipment_in.id if l.lot_shipment_in else None
|
||||
sh_int = l.lot_shipment_internal.id if l.lot_shipment_internal else None
|
||||
sh_out = l.lot_shipment_out.id if l.lot_shipment_out else None
|
||||
lot = ll.id
|
||||
shipment_in_values.add(l.lot_shipment_in.id if l.lot_shipment_in else None)
|
||||
shipment_internal_values.add(
|
||||
l.lot_shipment_internal.id if l.lot_shipment_internal else None)
|
||||
shipment_out_values.add(l.lot_shipment_out.id if l.lot_shipment_out else None)
|
||||
if lot is None:
|
||||
lot = ll.id
|
||||
|
||||
if len(shipment_in_values) == 1:
|
||||
sh_in = next(iter(shipment_in_values))
|
||||
if len(shipment_internal_values) == 1:
|
||||
sh_int = next(iter(shipment_internal_values))
|
||||
if len(shipment_out_values) == 1:
|
||||
sh_out = next(iter(shipment_out_values))
|
||||
|
||||
return {
|
||||
'quantity': qt,
|
||||
|
||||
@@ -31,6 +31,16 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<field name="name">lot_graph</field>
|
||||
<field name="priority" eval="10"/>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="lot_view_form">
|
||||
<field name="model">lot.lot</field>
|
||||
<field name="inherit" ref="lot.lot_view_form"/>
|
||||
<field name="name">lot_form</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="lot_view_tree_sequence">
|
||||
<field name="model">lot.lot</field>
|
||||
<field name="inherit" ref="lot.lot_view_tree_sequence"/>
|
||||
<field name="name">lot_tree_sequence</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window" id="act_lot_visgraph">
|
||||
<field name="name">Lots graph</field>
|
||||
<field name="res_model">lot.lot</field>
|
||||
|
||||
@@ -16,8 +16,65 @@ class PartyExecution(ModelSQL,ModelView):
|
||||
percent = fields.Numeric("% targeted")
|
||||
achieved_percent = fields.Function(fields.Numeric("% achieved"),'get_percent')
|
||||
|
||||
@staticmethod
|
||||
def _to_decimal(value):
|
||||
if value is None:
|
||||
return Decimal('0')
|
||||
if isinstance(value, Decimal):
|
||||
return value
|
||||
return Decimal(str(value))
|
||||
|
||||
@classmethod
|
||||
def _round_percent(cls, value):
|
||||
return cls._to_decimal(value).quantize(
|
||||
Decimal('0.01'), rounding=ROUND_HALF_UP)
|
||||
|
||||
def matches_country(self, country):
|
||||
if not self.area or not country or not getattr(country, 'region', None):
|
||||
return False
|
||||
region = country.region
|
||||
while region:
|
||||
if region.id == self.area.id:
|
||||
return True
|
||||
region = getattr(region, 'parent', None)
|
||||
return False
|
||||
|
||||
def matches_shipment(self, shipment):
|
||||
location = getattr(shipment, 'to_location', None)
|
||||
country = getattr(location, 'country', None)
|
||||
return self.matches_country(country)
|
||||
|
||||
@classmethod
|
||||
def compute_achieved_percent_for(cls, party, area):
|
||||
if not party or not area:
|
||||
return Decimal('0')
|
||||
Shipment = Pool().get('stock.shipment.in')
|
||||
shipments = Shipment.search([
|
||||
('controller', '!=', None),
|
||||
])
|
||||
execution = cls()
|
||||
execution.area = area
|
||||
shipments = [
|
||||
shipment for shipment in shipments
|
||||
if execution.matches_shipment(shipment)]
|
||||
total = len(shipments)
|
||||
if not total:
|
||||
return Decimal('0')
|
||||
achieved = sum(
|
||||
1 for shipment in shipments
|
||||
if shipment.controller and shipment.controller.id == party.id)
|
||||
return cls._round_percent(
|
||||
(Decimal(achieved) * Decimal('100')) / Decimal(total))
|
||||
|
||||
def compute_achieved_percent(self):
|
||||
return self.__class__.compute_achieved_percent_for(
|
||||
self.party, self.area)
|
||||
|
||||
def get_target_gap(self):
|
||||
return self._to_decimal(self.percent) - self.compute_achieved_percent()
|
||||
|
||||
def get_percent(self,name):
|
||||
return 2
|
||||
return self.compute_achieved_percent()
|
||||
|
||||
class PartyExecutionSla(ModelSQL,ModelView):
|
||||
"Party Execution Sla"
|
||||
@@ -70,6 +127,18 @@ class Party(metaclass=PoolMeta):
|
||||
def IsAvailableForControl(self,sh):
|
||||
return True
|
||||
|
||||
def get_controller_execution_priority(self, shipment):
|
||||
best_rule = None
|
||||
best_gap = None
|
||||
for execution in self.execution or []:
|
||||
if not execution.matches_shipment(shipment):
|
||||
continue
|
||||
gap = execution.get_target_gap()
|
||||
if best_gap is None or gap > best_gap:
|
||||
best_gap = gap
|
||||
best_rule = execution
|
||||
return best_gap, best_rule
|
||||
|
||||
def get_sla_cost(self,location):
|
||||
if self.sla:
|
||||
for sla in self.sla:
|
||||
@@ -77,6 +146,7 @@ class Party(metaclass=PoolMeta):
|
||||
sp = SlaPlace.search([('pes','=', sla.id),('location','=',location)])
|
||||
if sp:
|
||||
return sp[0].cost,sp[0].mode,sp[0].currency,sp[0].unit
|
||||
return None, None, None, None
|
||||
|
||||
def get_alf(self):
|
||||
if self.name == 'CARGO CONTROL':
|
||||
@@ -91,24 +161,38 @@ class Party(metaclass=PoolMeta):
|
||||
if rows:
|
||||
return int(rows[0][0])
|
||||
|
||||
@classmethod
|
||||
def _ensure_category(cls, party, category_name):
|
||||
if not (party and category_name):
|
||||
return
|
||||
Category = Pool().get('party.category')
|
||||
PartyCategory = Pool().get('party.party-party.category')
|
||||
cat = Category.search(['name', '=', category_name], limit=1)
|
||||
if not cat:
|
||||
return
|
||||
cat = cat[0]
|
||||
existing = PartyCategory.search([
|
||||
('party', '=', party.id),
|
||||
('category', '=', cat.id),
|
||||
], limit=1)
|
||||
if existing:
|
||||
return
|
||||
pc = PartyCategory()
|
||||
pc.party = party.id
|
||||
pc.category = cat.id
|
||||
PartyCategory.save([pc])
|
||||
|
||||
@classmethod
|
||||
def getPartyByName(cls, party, category=None):
|
||||
party = party.upper()
|
||||
p = cls.search([('name', '=', party)], limit=1)
|
||||
if p:
|
||||
cls._ensure_category(p[0], category)
|
||||
return p[0]
|
||||
else:
|
||||
p = cls()
|
||||
p.name = party
|
||||
cls.save([p])
|
||||
if category:
|
||||
Category = Pool().get('party.category')
|
||||
cat = Category.search(['name','=',category])
|
||||
if cat:
|
||||
PartyCategory = Pool().get('party.party-party.category')
|
||||
pc = PartyCategory()
|
||||
pc.party = p.id
|
||||
pc.category = cat[0].id
|
||||
PartyCategory.save([pc])
|
||||
cls._ensure_category(p, category)
|
||||
return p
|
||||
|
||||
@@ -4,6 +4,7 @@ from trytond.model import fields
|
||||
from trytond.pool import Pool, PoolMeta
|
||||
from trytond.pyson import Bool, Eval, Id
|
||||
from trytond.model import (ModelSQL, ModelView)
|
||||
from trytond.exceptions import UserError
|
||||
from trytond.tools import is_full_text, lstrip_wildcard
|
||||
from trytond.transaction import Transaction, inactive_records
|
||||
from decimal import getcontext, Decimal, ROUND_HALF_UP
|
||||
@@ -330,13 +331,19 @@ class Pricing(ModelSQL,ModelView):
|
||||
__name__ = 'pricing.pricing'
|
||||
|
||||
pricing_date = fields.Date("Date")
|
||||
price_component = fields.Many2One('pricing.component', "Component")#, domain=[('id', 'in', Eval('line.price_components'))], ondelete='CASCADE')
|
||||
price_component = fields.Many2One(
|
||||
'pricing.component', "Component",
|
||||
domain=[('id', 'in', Eval('available_components', []))],
|
||||
depends=['available_components'])#, ondelete='CASCADE')
|
||||
available_components = fields.Function(
|
||||
fields.One2Many('pricing.component', '', "Available Components"),
|
||||
'on_change_with_available_components')
|
||||
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)
|
||||
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")
|
||||
|
||||
@@ -368,16 +375,273 @@ class Pricing(ModelSQL,ModelView):
|
||||
def default_eod_price(cls):
|
||||
return Decimal(0)
|
||||
|
||||
@fields.depends('line', 'sale_line')
|
||||
def on_change_with_available_components(self, name=None):
|
||||
Component = Pool().get('pricing.component')
|
||||
line = getattr(self, 'line', None)
|
||||
if line:
|
||||
return Component.search([('line', '=', line)])
|
||||
sale_line = getattr(self, 'sale_line', None)
|
||||
if sale_line:
|
||||
return Component.search([('sale_line', '=', sale_line)])
|
||||
return []
|
||||
|
||||
@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)
|
||||
|
||||
@staticmethod
|
||||
def _component_matches_owner(record):
|
||||
def record_id(value):
|
||||
return getattr(value, 'id', value)
|
||||
|
||||
component = getattr(record, 'price_component', None)
|
||||
if not component:
|
||||
return True
|
||||
line = getattr(record, 'line', None)
|
||||
if line:
|
||||
return record_id(getattr(component, 'line', None)) == record_id(line)
|
||||
sale_line = getattr(record, 'sale_line', None)
|
||||
if sale_line:
|
||||
return (
|
||||
record_id(getattr(component, 'sale_line', None))
|
||||
== record_id(sale_line))
|
||||
return True
|
||||
|
||||
@classmethod
|
||||
def validate(cls, records):
|
||||
super(Pricing, cls).validate(records)
|
||||
for record in records:
|
||||
if not cls._component_matches_owner(record):
|
||||
raise UserError(
|
||||
"Pricing component must belong to the related line.")
|
||||
|
||||
@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')
|
||||
pricings = Pricing.search(['price_component','=',self.price_component.id],order=[('pricing_date', 'ASC')])
|
||||
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:
|
||||
cumul_qt += pr.quantity
|
||||
cumul_qt_price += pr.quantity * pr.settl_price
|
||||
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:
|
||||
|
||||
@@ -141,8 +141,12 @@ class Component(metaclass=PoolMeta):
|
||||
|
||||
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)
|
||||
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"
|
||||
@@ -156,9 +160,12 @@ class Pricing(metaclass=PoolMeta):
|
||||
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)
|
||||
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"
|
||||
@@ -260,6 +267,8 @@ class Purchase(metaclass=PoolMeta):
|
||||
'bank.account', "Bank Account",
|
||||
domain=[('id', 'in', Eval('bank_accounts', []))],
|
||||
depends=['bank_accounts'])
|
||||
our_bank_account = fields.Many2One(
|
||||
'bank.account', "Our Bank Account")
|
||||
from_location = fields.Many2One('stock.location', 'From location', required=True,domain=[('type', "!=", 'customer')])
|
||||
to_location = fields.Many2One('stock.location', 'To location', required=True,domain=[('type', "!=", 'supplier')])
|
||||
shipment_in = fields.Many2One('stock.shipment.in','Purchases')
|
||||
@@ -289,8 +298,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')
|
||||
@@ -313,6 +326,17 @@ class Purchase(metaclass=PoolMeta):
|
||||
return account
|
||||
return party_bank_accounts[0]
|
||||
|
||||
def _get_default_our_bank_account(self):
|
||||
if (not self.company or not self.company.party
|
||||
or not self.company.party.bank_accounts):
|
||||
return None
|
||||
company_bank_accounts = list(self.company.party.bank_accounts)
|
||||
if self.currency:
|
||||
for account in company_bank_accounts:
|
||||
if account.currency == self.currency:
|
||||
return account
|
||||
return company_bank_accounts[0]
|
||||
|
||||
@fields.depends('party', '_parent_party.bank_accounts')
|
||||
def on_change_with_bank_accounts(self, name=None):
|
||||
if self.party and self.party.bank_accounts:
|
||||
@@ -321,14 +345,25 @@ class Purchase(metaclass=PoolMeta):
|
||||
|
||||
@fields.depends(
|
||||
'company', 'party', 'invoice_party', 'payment_term', 'lines',
|
||||
'bank_account', '_parent_party.bank_accounts')
|
||||
'bank_account', 'our_bank_account', '_parent_party.bank_accounts',
|
||||
'_parent_company.party')
|
||||
def on_change_party(self):
|
||||
super().on_change_party()
|
||||
self.bank_account = self._get_default_bank_account()
|
||||
self.our_bank_account = self._get_default_our_bank_account()
|
||||
|
||||
@fields.depends('party', 'currency', '_parent_party.bank_accounts')
|
||||
@fields.depends(
|
||||
'party', 'company', 'currency', '_parent_party.bank_accounts',
|
||||
'_parent_company.party')
|
||||
def on_change_currency(self):
|
||||
self.bank_account = self._get_default_bank_account()
|
||||
self.our_bank_account = self._get_default_our_bank_account()
|
||||
|
||||
@fields.depends('company', 'currency', 'our_bank_account',
|
||||
'_parent_company.party')
|
||||
def on_change_company(self):
|
||||
super().on_change_company()
|
||||
self.our_bank_account = self._get_default_our_bank_account()
|
||||
|
||||
@classmethod
|
||||
def default_wb(cls):
|
||||
@@ -359,6 +394,25 @@ class Purchase(metaclass=PoolMeta):
|
||||
def default_tol_max(cls):
|
||||
return 0
|
||||
|
||||
@staticmethod
|
||||
def _has_matched_physical_lots(purchase):
|
||||
for line in purchase.lines or []:
|
||||
for lot in line.lots or []:
|
||||
if (
|
||||
getattr(lot, 'lot_type', None) == 'physic'
|
||||
and getattr(lot, 'line', None)
|
||||
and getattr(lot, 'sale_line', None)):
|
||||
return True
|
||||
return False
|
||||
|
||||
@classmethod
|
||||
def delete(cls, purchases):
|
||||
for purchase in purchases:
|
||||
if cls._has_matched_physical_lots(purchase):
|
||||
raise UserError(
|
||||
"You cannot delete a purchase matched to a sale")
|
||||
super().delete(purchases)
|
||||
|
||||
@property
|
||||
def report_terms(self):
|
||||
if self.lines:
|
||||
@@ -395,6 +449,12 @@ class Purchase(metaclass=PoolMeta):
|
||||
del_date = format_date_en(del_date)
|
||||
return del_date
|
||||
|
||||
@property
|
||||
def report_delivery_period_description(self):
|
||||
if self.lines and self.lines[0].del_period:
|
||||
return self.lines[0].del_period.description or ''
|
||||
return ''
|
||||
|
||||
@property
|
||||
def report_payment_date(self):
|
||||
if self.lines:
|
||||
@@ -509,6 +569,40 @@ class Purchase(metaclass=PoolMeta):
|
||||
if self.doc_template:
|
||||
return self.doc_template.type
|
||||
|
||||
@classmethod
|
||||
def _check_lines_delivery_period_values(cls, values):
|
||||
line_commands = values.get('lines') or []
|
||||
if not line_commands:
|
||||
return
|
||||
Line = Pool().get('purchase.line')
|
||||
pending_values = {}
|
||||
for command in line_commands:
|
||||
action = command[0]
|
||||
if action == 'create':
|
||||
for line_values in command[1]:
|
||||
Line._check_delivery_period_values([Line()], line_values)
|
||||
elif action == 'write':
|
||||
actions = iter(command[1:])
|
||||
for line_ids, line_values in zip(actions, actions):
|
||||
for line_id in line_ids:
|
||||
pending_values.setdefault(line_id, {}).update(
|
||||
line_values)
|
||||
elif action == 'add':
|
||||
for line_id in command[1]:
|
||||
pending_values.setdefault(line_id, {})
|
||||
for line_id, line_values in pending_values.items():
|
||||
Line._check_delivery_period_values(
|
||||
Line.browse([line_id]), line_values)
|
||||
|
||||
@classmethod
|
||||
def write(cls, *args):
|
||||
actions = iter(args)
|
||||
args = []
|
||||
for purchases, values in zip(actions, actions):
|
||||
cls._check_lines_delivery_period_values(values)
|
||||
args.extend((purchases, values))
|
||||
super().write(*args)
|
||||
|
||||
@classmethod
|
||||
def copy(cls, purchases, default=None):
|
||||
if default is None:
|
||||
@@ -545,9 +639,11 @@ class Purchase(metaclass=PoolMeta):
|
||||
|
||||
#line unit_price calculation
|
||||
if line.price_type == 'basis' and line.lots: #line.price_pricing and line.price_components and
|
||||
previous_linked_price = line.linked_price
|
||||
line.sync_linked_price_from_basis()
|
||||
unit_price = line.get_basis_price()
|
||||
logger.info("VALIDATEPURCHASE:%s",unit_price)
|
||||
if unit_price != line.unit_price:
|
||||
if unit_price != line.unit_price or line.linked_price != previous_linked_price:
|
||||
line.unit_price = unit_price
|
||||
logger.info("VALIDATEPURCHASE2:%s",line.unit_price)
|
||||
Line.save([line])
|
||||
@@ -1021,6 +1117,53 @@ class QualityAnalysis(ModelSQL,ModelView):
|
||||
class Line(metaclass=PoolMeta):
|
||||
__name__ = 'purchase.line'
|
||||
|
||||
@classmethod
|
||||
def default_pricing_rule(cls):
|
||||
try:
|
||||
Configuration = Pool().get('purchase_trade.configuration')
|
||||
except KeyError:
|
||||
return ''
|
||||
configurations = Configuration.search([], limit=1)
|
||||
if configurations:
|
||||
return configurations[0].pricing_rule or ''
|
||||
return ''
|
||||
|
||||
@staticmethod
|
||||
def _has_invalid_delivery_period(line):
|
||||
return (
|
||||
bool(line.from_del)
|
||||
and bool(line.to_del)
|
||||
and line.from_del > line.to_del)
|
||||
|
||||
@classmethod
|
||||
def _check_delivery_period_values(cls, lines, values=None):
|
||||
values = values or {}
|
||||
for line in lines:
|
||||
from_del = values.get('from_del', getattr(line, 'from_del', None))
|
||||
to_del = values.get('to_del', getattr(line, 'to_del', None))
|
||||
if from_del and to_del and from_del > to_del:
|
||||
raise UserError(
|
||||
"Delivery period From date must be before To date.")
|
||||
|
||||
@classmethod
|
||||
def create(cls, vlist):
|
||||
for values in vlist:
|
||||
cls._check_delivery_period_values([cls()], values)
|
||||
return super().create(vlist)
|
||||
|
||||
def _check_delivery_period(self):
|
||||
if self._has_invalid_delivery_period(self):
|
||||
raise UserError(
|
||||
"Delivery period From date must be before To date.")
|
||||
|
||||
@fields.depends('from_del', 'to_del')
|
||||
def on_change_from_del(self):
|
||||
self._check_delivery_period()
|
||||
|
||||
@fields.depends('from_del', 'to_del')
|
||||
def on_change_to_del(self):
|
||||
self._check_delivery_period()
|
||||
|
||||
quantity_theorical = fields.Numeric("Contractual Qt", digits='unit', readonly=False)
|
||||
price_type = fields.Selection([
|
||||
('cash', 'Cash Price'),
|
||||
@@ -1079,15 +1222,20 @@ class Line(metaclass=PoolMeta):
|
||||
enable_linked_currency = fields.Boolean("Linked currencies")
|
||||
linked_price = fields.Numeric("Price", digits='unit',states={
|
||||
'invisible': (~Eval('enable_linked_currency')),
|
||||
})
|
||||
'required': Eval('enable_linked_currency'),
|
||||
'readonly': Eval('price_type') == 'basis',
|
||||
}, depends=['enable_linked_currency', 'price_type'])
|
||||
linked_currency = fields.Many2One('currency.linked',"Currency",states={
|
||||
'invisible': (~Eval('enable_linked_currency')),
|
||||
})
|
||||
'required': Eval('enable_linked_currency'),
|
||||
}, depends=['enable_linked_currency'])
|
||||
linked_unit = fields.Many2One('product.uom', 'Unit',states={
|
||||
'invisible': (~Eval('enable_linked_currency')),
|
||||
})
|
||||
'required': Eval('enable_linked_currency'),
|
||||
}, depends=['enable_linked_currency'])
|
||||
premium = fields.Numeric("Premium/Discount",digits='unit')
|
||||
fee_ = fields.Many2One('fee.fee',"Fee")
|
||||
pricing_rule = fields.Text("Pricing description")
|
||||
|
||||
attributes = fields.Dict(
|
||||
'product.attribute', 'Attributes',
|
||||
@@ -1129,6 +1277,13 @@ class Line(metaclass=PoolMeta):
|
||||
def default_finished(cls):
|
||||
return False
|
||||
|
||||
@property
|
||||
def report_fixing_rule(self):
|
||||
pricing_rule = ''
|
||||
if self.pricing_rule:
|
||||
pricing_rule = self.pricing_rule
|
||||
return pricing_rule
|
||||
|
||||
|
||||
@fields.depends('product')
|
||||
def on_change_with_attribute_set(self, name=None):
|
||||
@@ -1202,18 +1357,70 @@ class Line(metaclass=PoolMeta):
|
||||
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:
|
||||
return [l for l in self.lots if l.lot_type=='virtual'][0]
|
||||
|
||||
def get_basis_price(self):
|
||||
def _get_linked_unit_factor(self):
|
||||
if not (self.enable_linked_currency and self.linked_currency):
|
||||
return None
|
||||
factor = Decimal(self.linked_currency.factor or 0)
|
||||
if not factor:
|
||||
return None
|
||||
unit_factor = Decimal(1)
|
||||
if self.linked_unit:
|
||||
source_unit = getattr(self, 'unit', None)
|
||||
if not source_unit and self.product:
|
||||
source_unit = self.product.purchase_uom or self.product.default_uom
|
||||
if not source_unit:
|
||||
return factor
|
||||
Uom = Pool().get('product.uom')
|
||||
unit_factor = Decimal(str(
|
||||
Uom.compute_qty(source_unit, float(1), self.linked_unit) or 0))
|
||||
return factor * unit_factor
|
||||
|
||||
def _linked_to_line_price(self, price):
|
||||
factor = self._get_linked_unit_factor()
|
||||
price = Decimal(price or 0)
|
||||
if not factor:
|
||||
return price
|
||||
return round(price * factor, 4)
|
||||
|
||||
def _line_to_linked_price(self, price):
|
||||
factor = self._get_linked_unit_factor()
|
||||
price = Decimal(price or 0)
|
||||
if not factor:
|
||||
return price
|
||||
return round(price / factor, 4)
|
||||
|
||||
def _get_premium_price(self):
|
||||
premium = Decimal(self.premium or 0)
|
||||
if not premium:
|
||||
return Decimal(0)
|
||||
if self.enable_linked_currency and self.linked_currency:
|
||||
return self._linked_to_line_price(premium)
|
||||
return premium
|
||||
|
||||
def _get_basis_component_price(self):
|
||||
price = Decimal(0)
|
||||
if self.terms:
|
||||
for t in self.terms:
|
||||
price += (t.manual_price if t.manual_price else Decimal(0))
|
||||
else:
|
||||
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)])
|
||||
@@ -1221,22 +1428,33 @@ class Line(metaclass=PoolMeta):
|
||||
price += pp[0].price * (pc.ratio / 100)
|
||||
return round(price,4)
|
||||
|
||||
def get_basis_price(self):
|
||||
return round(self._get_basis_component_price(), 4)
|
||||
|
||||
def sync_linked_price_from_basis(self):
|
||||
if self.enable_linked_currency and self.linked_currency:
|
||||
self.linked_price = self._line_to_linked_price(
|
||||
self._get_basis_component_price())
|
||||
|
||||
def get_price(self,lot_premium=0):
|
||||
return (self.unit_price + Decimal(lot_premium)) if self.unit_price else Decimal(0) + (self.premium if self.premium else Decimal(0))
|
||||
return round(
|
||||
Decimal(self.unit_price or 0)
|
||||
+ Decimal(lot_premium or 0),
|
||||
4)
|
||||
|
||||
def get_price_linked_currency(self,lot_premium=0):
|
||||
if self.linked_unit:
|
||||
Uom = Pool().get('product.uom')
|
||||
qt = Uom.compute_qty(self.unit, float(1), self.linked_unit)
|
||||
return round(((self.linked_price + Decimal(lot_premium) + (self.premium if self.premium else Decimal(0))) * self.linked_currency.factor) * Decimal(qt), 4)
|
||||
else:
|
||||
return round((self.linked_price + Decimal(lot_premium) + (self.premium if self.premium else Decimal(0))) * self.linked_currency.factor, 4)
|
||||
return round(
|
||||
self._linked_to_line_price(
|
||||
Decimal(self.linked_price or 0)
|
||||
+ Decimal(lot_premium or 0)),
|
||||
4)
|
||||
|
||||
@fields.depends('id','unit','quantity','unit_price','price_pricing','price_type','price_components','premium','estimated_date','lots','fees','enable_linked_currency','linked_price','linked_currency','linked_unit')
|
||||
@fields.depends('id','unit','quantity','unit_price','price_pricing','price_type','price_components','estimated_date','lots','fees','enable_linked_currency','linked_price','linked_currency','linked_unit')
|
||||
def on_change_with_unit_price(self, name=None):
|
||||
Date = Pool().get('ir.date')
|
||||
logger.info("ONCHANGEUNITPRICE:%s",self.unit_price)
|
||||
if self.price_type == 'basis' and self.lots: #self.price_pricing and self.price_components and
|
||||
if self.price_type == 'basis':
|
||||
self.sync_linked_price_from_basis()
|
||||
price = self.get_basis_price()
|
||||
logger.info("ONCHANGEUNITPRICE_IN:%s",price)
|
||||
return price
|
||||
@@ -1246,10 +1464,64 @@ class Line(metaclass=PoolMeta):
|
||||
if hasattr(self, 'derivatives') and self.derivatives:
|
||||
for d in self.derivatives:
|
||||
return round(d.price_index.get_price(Date.today(),self.unit,self.purchase.currency,True),4)
|
||||
return self.unit_price
|
||||
return self.get_price()
|
||||
|
||||
@fields.depends(
|
||||
'type', 'quantity', 'unit_price', 'unit', 'product',
|
||||
'purchase', '_parent_purchase.currency',
|
||||
'premium', 'enable_linked_currency', 'linked_currency', 'linked_unit')
|
||||
def on_change_with_amount(self):
|
||||
if (self.type == 'line'
|
||||
and self.quantity is not None
|
||||
and self.unit_price is not None):
|
||||
currency = self.purchase.currency if self.purchase else None
|
||||
amount = Decimal(str(self.quantity)) * (
|
||||
Decimal(self.unit_price or 0) + self._get_premium_price())
|
||||
if currency:
|
||||
return currency.round(amount)
|
||||
return amount
|
||||
return Decimal(0)
|
||||
|
||||
@fields.depends(
|
||||
'unit', 'product', 'price_type', 'enable_linked_currency',
|
||||
'linked_currency', 'linked_unit', 'linked_price', 'premium',
|
||||
methods=['on_change_with_unit_price', 'on_change_with_amount'])
|
||||
def _recompute_trade_price_fields(self):
|
||||
self.unit_price = self.on_change_with_unit_price()
|
||||
self.amount = self.on_change_with_amount()
|
||||
|
||||
@fields.depends(methods=['_recompute_trade_price_fields'])
|
||||
def on_change_premium(self):
|
||||
self._recompute_trade_price_fields()
|
||||
|
||||
@fields.depends(methods=['_recompute_trade_price_fields'])
|
||||
def on_change_price_type(self):
|
||||
self._recompute_trade_price_fields()
|
||||
|
||||
@fields.depends(methods=['_recompute_trade_price_fields'])
|
||||
def on_change_enable_linked_currency(self):
|
||||
self._recompute_trade_price_fields()
|
||||
|
||||
@fields.depends(methods=['_recompute_trade_price_fields'])
|
||||
def on_change_linked_price(self):
|
||||
self._recompute_trade_price_fields()
|
||||
|
||||
@fields.depends(methods=['_recompute_trade_price_fields'])
|
||||
def on_change_linked_currency(self):
|
||||
self._recompute_trade_price_fields()
|
||||
|
||||
@fields.depends(methods=['_recompute_trade_price_fields'])
|
||||
def on_change_linked_unit(self):
|
||||
self._recompute_trade_price_fields()
|
||||
|
||||
@classmethod
|
||||
def write(cls, *args):
|
||||
actions = iter(args)
|
||||
args = []
|
||||
for records, values in zip(actions, actions):
|
||||
cls._check_delivery_period_values(records, values)
|
||||
args.extend((records, values))
|
||||
|
||||
# Agents:
|
||||
# Ici on gère la variation éventuelle de la théorical quantity après création du contrat
|
||||
# Si delta > 0 on met à jour le lot virtual qui est toujours unique pour une purchase line
|
||||
@@ -1272,14 +1544,21 @@ class Line(metaclass=PoolMeta):
|
||||
lines = sum(args[::2], [])
|
||||
for line in lines:
|
||||
if line.id in old_values:
|
||||
old = Decimal(old_values[line.id] or 0)
|
||||
new = Decimal(line.quantity_theorical or 0)
|
||||
delta = new - old
|
||||
virtual_lots = [lot for lot in (line.lots or []) if lot.lot_type == 'virtual']
|
||||
if not virtual_lots:
|
||||
continue
|
||||
vlot = virtual_lots[0]
|
||||
# Initializing quantity_theorical after virtual-lot creation
|
||||
# must not add the line quantity a second time.
|
||||
old = old_values[line.id]
|
||||
baseline = (
|
||||
Decimal(old)
|
||||
if old is not None
|
||||
else Decimal(vlot.get_current_quantity_converted() or 0)
|
||||
)
|
||||
delta = new - baseline
|
||||
if delta > 0:
|
||||
virtual_lots = [lot for lot in (line.lots or []) if lot.lot_type == 'virtual']
|
||||
if not virtual_lots:
|
||||
continue
|
||||
vlot = virtual_lots[0]
|
||||
new_qty = round(Decimal(vlot.get_current_quantity_converted() or 0) + delta, 5)
|
||||
vlot.set_current_quantity(new_qty, new_qty, 1)
|
||||
Lot.save([vlot])
|
||||
@@ -1302,10 +1581,6 @@ class Line(metaclass=PoolMeta):
|
||||
lqt.lot_unit = line.unit
|
||||
LotQt.save([lqt])
|
||||
elif delta < 0:
|
||||
virtual_lots = [lot for lot in (line.lots or []) if lot.lot_type == 'virtual']
|
||||
if not virtual_lots:
|
||||
continue
|
||||
vlot = virtual_lots[0]
|
||||
decrease = abs(delta)
|
||||
lqts = LotQt.search([
|
||||
('lot_p', '=', vlot.id),
|
||||
@@ -1363,6 +1638,9 @@ class Line(metaclass=PoolMeta):
|
||||
def validate(cls, lines):
|
||||
super(Line, cls).validate(lines)
|
||||
for line in lines:
|
||||
if cls._has_invalid_delivery_period(line):
|
||||
raise UserError(
|
||||
"Delivery period From date must be before To date.")
|
||||
if line.price_components:
|
||||
for pc in line.price_components:
|
||||
if pc.triggers:
|
||||
@@ -1497,19 +1775,9 @@ class Line(metaclass=PoolMeta):
|
||||
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])
|
||||
Pricing._sync_manual_values(pricings)
|
||||
Pricing._sync_manual_last(pricings)
|
||||
Pricing._sync_eod_price(pricings)
|
||||
|
||||
if pc.triggers and pc.auto:
|
||||
prDate = []
|
||||
@@ -1561,11 +1829,18 @@ class Line(metaclass=PoolMeta):
|
||||
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)
|
||||
@@ -1586,10 +1861,10 @@ class Line(metaclass=PoolMeta):
|
||||
#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)
|
||||
p.unfixed_qt = round(base_quantity - Decimal(cumul_qt),5)
|
||||
if p.unfixed_qt < 0.001:
|
||||
p.unfixed_qt = Decimal(0)
|
||||
p.fixed_qt = Decimal(self.quantity_theorical)
|
||||
p.fixed_qt = base_quantity
|
||||
if price > 0:
|
||||
p.unfixed_qt_price = price
|
||||
else:
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -4,6 +4,7 @@ import logging
|
||||
|
||||
from trytond.pool import Pool
|
||||
from trytond.transaction import Transaction
|
||||
from trytond.exceptions import UserError
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -35,16 +36,11 @@ class ContractFactory:
|
||||
Date = pool.get('ir.date')
|
||||
|
||||
created = []
|
||||
|
||||
base_contract = (
|
||||
ct.lot.sale_line.sale
|
||||
if type_ == 'Purchase'
|
||||
else ct.lot.line.purchase
|
||||
)
|
||||
sources = cls._get_sources(ct, type_)
|
||||
base_contract = cls._get_base_contract(sources, ct, type_)
|
||||
|
||||
for c in contracts:
|
||||
contract = Purchase() if type_ == 'Purchase' else Sale()
|
||||
line = PurchaseLine() if type_ == 'Purchase' else SaleLine()
|
||||
|
||||
# ---------- CONTRACT ----------
|
||||
parts = c.currency_unit.split("_")
|
||||
@@ -79,33 +75,34 @@ class ContractFactory:
|
||||
|
||||
contract.save()
|
||||
|
||||
# ---------- LINE ----------
|
||||
line.quantity = c.quantity
|
||||
line.quantity_theorical = c.quantity
|
||||
line.product = ct.product
|
||||
line.unit = ct.unit
|
||||
line.price_type = c.price_type
|
||||
line.created_by_code = ct.matched
|
||||
line.premium = Decimal(0)
|
||||
line_sources = cls._get_line_sources(c, sources, ct)
|
||||
for source in line_sources:
|
||||
line = PurchaseLine() if type_ == 'Purchase' else SaleLine()
|
||||
|
||||
if type_ == 'Purchase':
|
||||
line.purchase = contract.id
|
||||
else:
|
||||
line.sale = contract.id
|
||||
# ---------- LINE ----------
|
||||
line.quantity = source['quantity']
|
||||
line.quantity_theorical = source['quantity']
|
||||
line.product = ct.product
|
||||
line.unit = ct.unit
|
||||
line.price_type = c.price_type
|
||||
line.created_by_code = ct.matched
|
||||
line.premium = Decimal(0)
|
||||
|
||||
cls._apply_price(line, c, parts)
|
||||
if type_ == 'Purchase':
|
||||
line.purchase = contract.id
|
||||
else:
|
||||
line.sale = contract.id
|
||||
|
||||
line.del_period = c.del_period
|
||||
line.from_del = c.from_del
|
||||
line.to_del = c.to_del
|
||||
cls._apply_price(line, c, parts)
|
||||
cls._apply_delivery(line, c, source)
|
||||
|
||||
line.save()
|
||||
line.save()
|
||||
|
||||
logger.info("CREATE_ID:%s", contract.id)
|
||||
logger.info("CREATE_LINE_ID:%s", line.id)
|
||||
logger.info("CREATE_ID:%s", contract.id)
|
||||
logger.info("CREATE_LINE_ID:%s", line.id)
|
||||
|
||||
if ct.matched:
|
||||
cls._create_lot(line, c, ct, type_)
|
||||
if ct.matched:
|
||||
cls._create_lot(line, c, source, type_)
|
||||
|
||||
created.append(contract)
|
||||
|
||||
@@ -155,12 +152,124 @@ class ContractFactory:
|
||||
else:
|
||||
line.unit_price = c.price if c.price else Decimal(0)
|
||||
|
||||
@staticmethod
|
||||
def _apply_delivery(line, c, source):
|
||||
source_line = source.get('trade_line')
|
||||
if source.get('use_source_delivery') and source_line:
|
||||
line.del_period = getattr(source_line, 'del_period', None)
|
||||
line.from_del = getattr(source_line, 'from_del', None)
|
||||
line.to_del = getattr(source_line, 'to_del', None)
|
||||
return
|
||||
line.del_period = c.del_period
|
||||
line.from_del = c.from_del
|
||||
line.to_del = c.to_del
|
||||
|
||||
@staticmethod
|
||||
def _normalize_quantity(quantity):
|
||||
return abs(Decimal(str(quantity or 0))).quantize(Decimal('0.00001'))
|
||||
|
||||
@classmethod
|
||||
def _get_base_contract(cls, sources, ct, type_):
|
||||
if sources:
|
||||
source_lot = sources[0]['lot']
|
||||
return (
|
||||
source_lot.sale_line.sale
|
||||
if type_ == 'Purchase'
|
||||
else source_lot.line.purchase
|
||||
)
|
||||
return (
|
||||
ct.lot.sale_line.sale
|
||||
if type_ == 'Purchase'
|
||||
else ct.lot.line.purchase
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def _get_sources(cls, ct, type_):
|
||||
pool = Pool()
|
||||
LotQt = pool.get('lot.qt')
|
||||
context = Transaction().context or {}
|
||||
active_ids = context.get('active_ids') or []
|
||||
sources = []
|
||||
if active_ids:
|
||||
for record_id in active_ids:
|
||||
if record_id < 10000000:
|
||||
continue
|
||||
lqt = LotQt(record_id - 10000000)
|
||||
lot = lqt.lot_p or lqt.lot_s
|
||||
if not lot:
|
||||
continue
|
||||
trade_line = (
|
||||
lot.sale_line if type_ == 'Purchase' else lot.line
|
||||
)
|
||||
sources.append({
|
||||
'lqt': lqt,
|
||||
'lot': lot,
|
||||
'trade_line': trade_line,
|
||||
'quantity': cls._normalize_quantity(lqt.lot_quantity),
|
||||
'shipment_origin': lqt.lot_shipment_origin,
|
||||
})
|
||||
elif getattr(ct, 'lot', None):
|
||||
lot = ct.lot
|
||||
trade_line = (
|
||||
lot.sale_line if type_ == 'Purchase' else lot.line
|
||||
)
|
||||
sources.append({
|
||||
'lqt': None,
|
||||
'lot': lot,
|
||||
'trade_line': trade_line,
|
||||
'quantity': cls._normalize_quantity(getattr(ct, 'quantity', 0)),
|
||||
'shipment_origin': cls._get_shipment_origin(ct),
|
||||
})
|
||||
|
||||
cls._validate_sources(sources, type_)
|
||||
return sources
|
||||
|
||||
@classmethod
|
||||
def _validate_sources(cls, sources, type_):
|
||||
if not sources:
|
||||
return
|
||||
first_line = sources[0]['trade_line']
|
||||
for source in sources[1:]:
|
||||
line = source['trade_line']
|
||||
if bool(getattr(line, 'sale', None)) != bool(getattr(first_line, 'sale', None)):
|
||||
raise UserError('Selected lots must all come from the same side.')
|
||||
if getattr(line.product, 'id', None) != getattr(first_line.product, 'id', None):
|
||||
raise UserError('Selected lots must share the same product.')
|
||||
if getattr(line.unit, 'id', None) != getattr(first_line.unit, 'id', None):
|
||||
raise UserError('Selected lots must share the same unit.')
|
||||
|
||||
@classmethod
|
||||
def _get_line_sources(cls, contract_detail, sources, ct):
|
||||
if not ct.matched or len(sources) <= 1:
|
||||
quantity = cls._normalize_quantity(contract_detail.quantity)
|
||||
source = sources[0] if sources else {
|
||||
'lot': getattr(ct, 'lot', None),
|
||||
'trade_line': None,
|
||||
'shipment_origin': cls._get_shipment_origin(ct),
|
||||
}
|
||||
return [{
|
||||
**source,
|
||||
'quantity': quantity,
|
||||
'use_source_delivery': False,
|
||||
}]
|
||||
|
||||
selected_total = sum(source['quantity'] for source in sources)
|
||||
requested = cls._normalize_quantity(contract_detail.quantity)
|
||||
if requested != selected_total:
|
||||
raise UserError(
|
||||
'For multi-lot matched creation, quantity must equal the total selected open quantity.'
|
||||
)
|
||||
return [{
|
||||
**source,
|
||||
'use_source_delivery': True,
|
||||
} for source in sources]
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# LOT / MATCHING (repris tel quel du wizard)
|
||||
# -------------------------------------------------------------------------
|
||||
|
||||
@classmethod
|
||||
def _create_lot(cls, line, c, ct, type_):
|
||||
def _create_lot(cls, line, c, source, type_):
|
||||
pool = Pool()
|
||||
Lot = pool.get('lot.lot')
|
||||
LotQtHist = pool.get('lot.qt.hist')
|
||||
@@ -192,10 +301,9 @@ class ContractFactory:
|
||||
|
||||
lot.save()
|
||||
|
||||
vlot = ct.lot
|
||||
shipment_origin = cls._get_shipment_origin(ct)
|
||||
|
||||
qt = c.quantity
|
||||
vlot = source['lot']
|
||||
shipment_origin = source.get('shipment_origin')
|
||||
qt = source['quantity']
|
||||
|
||||
if type_ == 'Purchase':
|
||||
if not lot.updateVirtualPart(qt, shipment_origin, vlot):
|
||||
|
||||
@@ -25,6 +25,8 @@ import logging
|
||||
import json
|
||||
import re
|
||||
import html
|
||||
from trytond.exceptions import UserError
|
||||
from trytond.modules.stock.shipment import SupplierShipping as BaseSupplierShipping
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -103,6 +105,17 @@ class InvoiceLine(metaclass=PoolMeta):
|
||||
|
||||
lot = fields.Many2One('lot.lot',"Lot")
|
||||
fee = fields.Many2One('fee.fee',"Fee")
|
||||
included_padding = fields.Function(
|
||||
fields.Numeric("Inc. padding", digits=(1, 5)),
|
||||
'get_included_padding')
|
||||
|
||||
def get_included_padding(self, name):
|
||||
if (self.lot
|
||||
and self.invoice_type == 'out'
|
||||
and self.description == 'Pro forma'
|
||||
and Decimal(str(self.quantity or 0)) > 0):
|
||||
return self.lot.sale_invoice_padding or Decimal(0)
|
||||
return Decimal(0)
|
||||
|
||||
@classmethod
|
||||
def validate(cls, lines):
|
||||
@@ -441,6 +454,7 @@ class ShipmentIn(metaclass=PoolMeta):
|
||||
)
|
||||
shipment_wr = fields.One2Many('shipment.wr','shipment_in',"WR")
|
||||
controller = fields.Many2One('party.party',"Controller")
|
||||
surveyor = fields.Many2One('party.party', "Surveyor")
|
||||
controller_target = fields.Char("Targeted controller")
|
||||
send_instruction = fields.Boolean("Send instruction")
|
||||
instructions = fields.Text("Instructions")
|
||||
@@ -463,6 +477,427 @@ class ShipmentIn(metaclass=PoolMeta):
|
||||
if self.vessel:
|
||||
return self.vessel.vessel_type
|
||||
|
||||
def _get_report_primary_move(self):
|
||||
moves = list(self.incoming_moves or self.moves or [])
|
||||
return moves[0] if moves else None
|
||||
|
||||
def _get_report_primary_lot(self):
|
||||
move = self._get_report_primary_move()
|
||||
return getattr(move, 'lot', None) if move else None
|
||||
|
||||
def _get_report_trade_line(self):
|
||||
lot = self._get_report_primary_lot()
|
||||
if not lot:
|
||||
return None
|
||||
return getattr(lot, 'sale_line', None) or getattr(lot, 'line', None)
|
||||
|
||||
def _get_report_insurance_fee(self):
|
||||
for fee in self.fees or []:
|
||||
product = getattr(fee, 'product', None)
|
||||
name = ((getattr(product, 'name', '') or '')).strip().lower()
|
||||
if 'insurance' in name:
|
||||
return fee
|
||||
return None
|
||||
|
||||
def _get_report_incoming_amount_data(self):
|
||||
total = Decimal('0.0')
|
||||
currency = None
|
||||
for move in (self.incoming_moves or []):
|
||||
move_amount, move_currency = self._get_report_incoming_move_amount(
|
||||
move)
|
||||
total += move_amount
|
||||
if not currency and move_currency:
|
||||
currency = move_currency
|
||||
return total, currency
|
||||
|
||||
def _get_report_incoming_move_amount(self, move):
|
||||
quantity = Decimal(str(getattr(move, 'quantity', 0) or 0))
|
||||
unit_price = getattr(move, 'unit_price', None)
|
||||
if unit_price not in (None, ''):
|
||||
move_currency = getattr(move, 'currency', None)
|
||||
return quantity * Decimal(str(unit_price or 0)), move_currency
|
||||
|
||||
lot = getattr(move, 'lot', None)
|
||||
line = getattr(lot, 'line', None) if lot else None
|
||||
if not lot or not line:
|
||||
return Decimal('0.0'), None
|
||||
|
||||
lot_quantity = Decimal(str(
|
||||
lot.get_current_quantity_converted() or 0))
|
||||
line_unit_price = Decimal(str(getattr(line, 'unit_price', 0) or 0))
|
||||
trade = getattr(line, 'purchase', None)
|
||||
line_currency = getattr(trade, 'currency', None) if trade else None
|
||||
return lot_quantity * line_unit_price, line_currency
|
||||
|
||||
@staticmethod
|
||||
def _get_report_currency_text(currency):
|
||||
return (
|
||||
getattr(currency, 'rec_name', None)
|
||||
or getattr(currency, 'code', None)
|
||||
or getattr(currency, 'symbol', None)
|
||||
or '')
|
||||
|
||||
@staticmethod
|
||||
def _format_report_amount(value):
|
||||
if value in (None, ''):
|
||||
return ''
|
||||
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()
|
||||
product = getattr(line, 'product', None) if line else None
|
||||
if product:
|
||||
return product.name or ''
|
||||
move = self._get_report_primary_move()
|
||||
product = getattr(move, 'product', None) if move else None
|
||||
return getattr(product, 'name', '') or ''
|
||||
|
||||
@property
|
||||
def report_product_description(self):
|
||||
line = self._get_report_trade_line()
|
||||
product = getattr(line, 'product', None) if line else None
|
||||
if product:
|
||||
return product.description or ''
|
||||
move = self._get_report_primary_move()
|
||||
product = getattr(move, 'product', None) if move else None
|
||||
return getattr(product, 'description', '') or ''
|
||||
|
||||
@property
|
||||
def report_insurance_footer_ref(self):
|
||||
return self.bl_number or self.number or ''
|
||||
|
||||
@property
|
||||
def report_insurance_certificate_number(self):
|
||||
return self.bl_number or self.number or ''
|
||||
|
||||
@property
|
||||
def report_insurance_account_of(self):
|
||||
line = self._get_report_trade_line()
|
||||
trade = getattr(line, 'sale', None) or getattr(line, 'purchase', None)
|
||||
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_insurance_goods_description(self):
|
||||
name = self.report_product_name
|
||||
description = self.report_product_description
|
||||
if description and description != name:
|
||||
return ' - '.join(part for part in [name, description] if part)
|
||||
return name or description
|
||||
|
||||
@property
|
||||
def report_insurance_loading_port(self):
|
||||
return getattr(self.from_location, 'name', '') or ''
|
||||
|
||||
@property
|
||||
def report_insurance_discharge_port(self):
|
||||
return getattr(self.to_location, 'name', '') or ''
|
||||
|
||||
@property
|
||||
def report_insurance_transport(self):
|
||||
if self.vessel and self.vessel.vessel_name:
|
||||
return self.vessel.vessel_name
|
||||
return self.transport_type or ''
|
||||
|
||||
@property
|
||||
def report_insurance_amount(self):
|
||||
insured_amount, insured_currency = self._get_report_incoming_amount_data()
|
||||
if insured_amount:
|
||||
insured_amount *= Decimal('1.10')
|
||||
currency_text = self._get_report_currency_text(insured_currency)
|
||||
amount_text = self._format_report_amount(insured_amount)
|
||||
return ' '.join(part for part in [currency_text, amount_text] if part)
|
||||
|
||||
fee = self._get_report_insurance_fee()
|
||||
if not fee:
|
||||
return ''
|
||||
currency = getattr(fee, 'currency', None)
|
||||
currency_text = self._get_report_currency_text(currency)
|
||||
amount = self._format_report_amount(fee.get_amount())
|
||||
return ' '.join(part for part in [currency_text, amount] if part)
|
||||
|
||||
@property
|
||||
def report_insurance_incoming_amount(self):
|
||||
amount, currency = self._get_report_incoming_amount_data()
|
||||
currency_text = self._get_report_currency_text(currency)
|
||||
amount_text = self._format_report_amount(amount)
|
||||
return ' '.join(part for part in [currency_text, amount_text] if part)
|
||||
|
||||
@property
|
||||
def report_insurance_amount_insured(self):
|
||||
amount, currency = self._get_report_incoming_amount_data()
|
||||
insured_amount = amount * Decimal('1.10')
|
||||
currency_text = self._get_report_currency_text(currency)
|
||||
amount_text = self._format_report_amount(insured_amount)
|
||||
return ' '.join(part for part in [currency_text, amount_text] if part)
|
||||
|
||||
@property
|
||||
def report_insurance_surveyor(self):
|
||||
if self.surveyor:
|
||||
return self.surveyor.rec_name or ''
|
||||
if self.controller:
|
||||
return self.controller.rec_name or ''
|
||||
fee = self._get_report_insurance_fee()
|
||||
supplier = getattr(fee, 'supplier', None) if fee else None
|
||||
return getattr(supplier, 'rec_name', '') or ''
|
||||
|
||||
@property
|
||||
def report_insurance_contact_surveyor(self):
|
||||
return self.report_insurance_surveyor
|
||||
|
||||
@property
|
||||
def report_insurance_issue_place_and_date(self):
|
||||
Date = Pool().get('ir.date')
|
||||
address = None
|
||||
if self.company and getattr(self.company, 'party', None):
|
||||
address = self.company.party.address_get()
|
||||
place = (
|
||||
getattr(address, 'city', None)
|
||||
or getattr(self.company.party, 'rec_name', None)
|
||||
if self.company and getattr(self.company, 'party', None) else ''
|
||||
) or ''
|
||||
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)
|
||||
|
||||
@property
|
||||
def report_coo_exporter(self):
|
||||
company = getattr(self, 'company', None)
|
||||
party = getattr(company, 'party', None) if company else None
|
||||
if not party:
|
||||
return ''
|
||||
address = party.address_get() if hasattr(party, 'address_get') else None
|
||||
lines = [getattr(party, 'rec_name', None) or getattr(party, 'name', None) or '']
|
||||
if address and getattr(address, 'full_address', None):
|
||||
lines.append(address.full_address)
|
||||
return '\n'.join(filter(None, lines))
|
||||
|
||||
@property
|
||||
def report_coo_consignee(self):
|
||||
trade = self._get_report_trade()
|
||||
party = getattr(trade, 'party', None) if trade else None
|
||||
if not party:
|
||||
return ''
|
||||
address = party.address_get() if hasattr(party, 'address_get') else None
|
||||
lines = [getattr(party, 'rec_name', None) or getattr(party, 'name', None) or '']
|
||||
if address and getattr(address, 'full_address', None):
|
||||
lines.append(address.full_address)
|
||||
return '\n'.join(filter(None, lines))
|
||||
|
||||
@property
|
||||
def report_coo_number(self):
|
||||
return getattr(self, 'reference', None) or self.number or ''
|
||||
|
||||
@property
|
||||
def report_coo_transport(self):
|
||||
parts = []
|
||||
if self.bl_number:
|
||||
parts.append(f"B/L {self.bl_number}")
|
||||
ship_name = self.report_packing_ship_name
|
||||
if ship_name:
|
||||
parts.append(ship_name)
|
||||
if self.booking:
|
||||
parts.append(f"Booking {self.booking}")
|
||||
return ' - '.join(parts)
|
||||
|
||||
@property
|
||||
def report_coo_origin_country(self):
|
||||
return self.report_packing_origin or ''
|
||||
|
||||
@property
|
||||
def report_coo_observations(self):
|
||||
parts = []
|
||||
contract = self.report_packing_contract_number
|
||||
if contract:
|
||||
parts.append(f"Contract: {contract}")
|
||||
if self.note:
|
||||
parts.append(self.note)
|
||||
return '\n'.join(filter(None, parts))
|
||||
|
||||
@property
|
||||
def report_coo_goods_description(self):
|
||||
parts = [self.report_product_name, self.report_product_description]
|
||||
if self.container:
|
||||
container_numbers = ', '.join(
|
||||
filter(None, (getattr(c, 'container_no', None) or '' for c in self.container)))
|
||||
if container_numbers:
|
||||
parts.append(f"Container(s): {container_numbers}")
|
||||
return '\n'.join(filter(None, parts))
|
||||
|
||||
@property
|
||||
def report_coo_net_weight(self):
|
||||
return self.report_packing_net_weight
|
||||
|
||||
@property
|
||||
def report_coo_gross_weight(self):
|
||||
return self.report_packing_gross_weight
|
||||
|
||||
@property
|
||||
def report_coo_weight_unit(self):
|
||||
return self.report_packing_weight_unit or ''
|
||||
|
||||
@property
|
||||
def report_coo_net_weight_display(self):
|
||||
parts = [self.report_coo_net_weight, self.report_coo_weight_unit]
|
||||
return ' '.join(part for part in parts if part)
|
||||
|
||||
@property
|
||||
def report_coo_gross_weight_display(self):
|
||||
parts = [self.report_coo_gross_weight, self.report_coo_weight_unit]
|
||||
return ' '.join(part for part in parts if part)
|
||||
|
||||
@property
|
||||
def report_coo_issue_date(self):
|
||||
Date = Pool().get('ir.date')
|
||||
today = Date.today()
|
||||
if not today:
|
||||
return ''
|
||||
return today.strftime('%d-%m-%Y')
|
||||
|
||||
def get_rec_name(self, name=None):
|
||||
if self.number:
|
||||
return self.number + '[' + (self.vessel.vessel_name if self.vessel else '') + (('-' + self.travel_nb) if self.travel_nb else '') + ']'
|
||||
@@ -472,20 +907,27 @@ class ShipmentIn(metaclass=PoolMeta):
|
||||
def create_fee(self,controller):
|
||||
Fee = Pool().get('fee.fee')
|
||||
Product = Pool().get('product.product')
|
||||
if not controller:
|
||||
logger.info("CREATE_FEE_SKIPPED:NO_CONTROLLER shipment=%s", self)
|
||||
return
|
||||
fee = Fee()
|
||||
fee.shipment_in = self.id
|
||||
fee.supplier = controller
|
||||
fee.type = 'budgeted'
|
||||
fee.p_r = 'pay'
|
||||
price,mode,curr,unit = controller.get_sla_cost(self.to_location)
|
||||
if price and mode and curr and unit:
|
||||
fee.mode = mode
|
||||
fee.currency = curr
|
||||
fee.unit = unit
|
||||
fee.quantity = self.get_bales() or 1
|
||||
fee.product = Product.get_by_name('Reweighing')
|
||||
fee.price = price
|
||||
Fee.save([fee])
|
||||
if not (price and mode and curr and unit):
|
||||
logger.info(
|
||||
"CREATE_FEE_SKIPPED:NO_SLA shipment=%s controller=%s location=%s",
|
||||
self, controller, self.to_location)
|
||||
return
|
||||
fee.mode = mode
|
||||
fee.currency = curr
|
||||
fee.unit = unit
|
||||
fee.quantity = self.get_bales() or 1
|
||||
fee.product = Product.get_by_name('Reweighing')
|
||||
fee.price = price
|
||||
Fee.save([fee])
|
||||
|
||||
def get_controller(self):
|
||||
ControllerCategory = Pool().get('party.category')
|
||||
@@ -494,9 +936,19 @@ class ShipmentIn(metaclass=PoolMeta):
|
||||
if cc:
|
||||
cc = cc[0]
|
||||
controllers = PartyCategory.search(['category','=',cc.id])
|
||||
prioritized = []
|
||||
for c in controllers:
|
||||
if c.party.IsAvailableForControl(self):
|
||||
return c.party
|
||||
if not c.party.IsAvailableForControl(self):
|
||||
continue
|
||||
gap, rule = c.party.get_controller_execution_priority(self)
|
||||
prioritized.append((
|
||||
1 if rule else 0,
|
||||
gap if gap is not None else Decimal('-999999'),
|
||||
c.party,
|
||||
))
|
||||
if prioritized:
|
||||
prioritized.sort(key=lambda item: (item[0], item[1]), reverse=True)
|
||||
return prioritized[0][2]
|
||||
|
||||
def get_instructions_html(self,inv_date,inv_nb):
|
||||
vessel = self.vessel.vessel_name if self.vessel else ""
|
||||
@@ -650,7 +1102,6 @@ class ShipmentIn(metaclass=PoolMeta):
|
||||
sale_line.linked_currency = 1
|
||||
sale_line.linked_unit = Uom.get_by_name(sell_price_unit)
|
||||
sale_line.linked_price = round(sell_price,4)
|
||||
sale_line.unit_price = sale_line.get_price_linked_currency()
|
||||
else:
|
||||
sale.currency = Currency.get_by_name(sell_price_currency)
|
||||
sale_line.unit_price = round(sell_price,4)
|
||||
@@ -663,6 +1114,8 @@ class ShipmentIn(metaclass=PoolMeta):
|
||||
sale_line.product = Product.get_by_name('BRAZIL COTTON')
|
||||
logger.info("PRODUCT:%s",sale_line.product)
|
||||
sale_line.unit = Uom.get_by_name(lot_unit)
|
||||
if sell_price_currency == 'USC':
|
||||
sale_line.unit_price = sale_line.get_price_linked_currency()
|
||||
sale_line.price_type = 'priced'
|
||||
sale_line.created_by_code = False
|
||||
sale_line.note = dec_key
|
||||
@@ -728,7 +1181,7 @@ class ShipmentIn(metaclass=PoolMeta):
|
||||
logger.info("ADD_LOT:%s",int(chunk_key))
|
||||
LotQt.add_physical_lots(lqt,[l])
|
||||
|
||||
return inv_date,inv_nb
|
||||
return inv_date,inv_nb
|
||||
|
||||
def html_to_text(self,html_content):
|
||||
text = re.sub(r"<br\s*/?>", "\n", html_content, flags=re.IGNORECASE)
|
||||
@@ -1894,3 +2347,80 @@ class RevaluateStart(ModelView):
|
||||
@classmethod
|
||||
def default_delete_after(cls):
|
||||
return False
|
||||
|
||||
|
||||
class ShipmentTemplateReportMixin:
|
||||
|
||||
@classmethod
|
||||
def _get_purchase_trade_configuration(cls):
|
||||
Configuration = Pool().get('purchase_trade.configuration')
|
||||
configurations = Configuration.search([], limit=1)
|
||||
return configurations[0] if configurations else None
|
||||
|
||||
@classmethod
|
||||
def _get_action_report_path(cls, action):
|
||||
if isinstance(action, dict):
|
||||
return action.get('report') or ''
|
||||
return getattr(action, 'report', '') or ''
|
||||
|
||||
@classmethod
|
||||
def _resolve_template_path(cls, field_name, default_prefix):
|
||||
config = cls._get_purchase_trade_configuration()
|
||||
template = getattr(config, field_name, '') if config else ''
|
||||
template = (template or '').strip()
|
||||
if not template:
|
||||
raise UserError('No template found')
|
||||
if '/' not in template:
|
||||
return f'{default_prefix}/{template}'
|
||||
return template
|
||||
|
||||
@classmethod
|
||||
def _get_resolved_action(cls, action):
|
||||
report_path = cls._resolve_configured_report_path(action)
|
||||
if isinstance(action, dict):
|
||||
resolved = dict(action)
|
||||
resolved['report'] = report_path
|
||||
return resolved
|
||||
setattr(action, 'report', report_path)
|
||||
return action
|
||||
|
||||
@classmethod
|
||||
def _execute(cls, records, header, data, action):
|
||||
resolved_action = cls._get_resolved_action(action)
|
||||
return super()._execute(records, header, data, resolved_action)
|
||||
|
||||
|
||||
class ShipmentShippingReport(ShipmentTemplateReportMixin, BaseSupplierShipping):
|
||||
__name__ = 'stock.shipment.in.shipping'
|
||||
|
||||
@classmethod
|
||||
def _resolve_configured_report_path(cls, action):
|
||||
return cls._resolve_template_path(
|
||||
'shipment_shipping_report_template', 'stock')
|
||||
|
||||
|
||||
class ShipmentInsuranceReport(ShipmentTemplateReportMixin, BaseSupplierShipping):
|
||||
__name__ = 'stock.shipment.in.insurance'
|
||||
|
||||
@classmethod
|
||||
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')
|
||||
|
||||
|
||||
class ShipmentCOOReport(ShipmentTemplateReportMixin, BaseSupplierShipping):
|
||||
__name__ = 'stock.shipment.in.coo'
|
||||
|
||||
@classmethod
|
||||
def _resolve_configured_report_path(cls, action):
|
||||
return cls._resolve_template_path(
|
||||
'shipment_coo_report_template', 'stock')
|
||||
|
||||
@@ -8,6 +8,11 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<field name="inherit" ref="stock.shipment_in_view_form"/>
|
||||
<field name="name">shipment_in_form</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="shipment_in_view_tree">
|
||||
<field name="model">stock.shipment.in</field>
|
||||
<field name="inherit" ref="stock.shipment_in_view_tree"/>
|
||||
<field name="name">shipment_in_tree</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="shipment_internal_view_form">
|
||||
<field name="model">stock.shipment.internal</field>
|
||||
<field name="inherit" ref="stock.shipment_internal_view_form"/>
|
||||
@@ -61,6 +66,42 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<field name="url">https://www.vesselfinder.com</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.action.report" id="report_shipment_in_insurance">
|
||||
<field name="name">Insurance</field>
|
||||
<field name="model">stock.shipment.in</field>
|
||||
<field name="report_name">stock.shipment.in.insurance</field>
|
||||
<field name="report">stock/insurance.fodt</field>
|
||||
</record>
|
||||
<record model="ir.action.keyword" id="report_shipment_in_insurance_keyword">
|
||||
<field name="keyword">form_print</field>
|
||||
<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_coo">
|
||||
<field name="name">COO</field>
|
||||
<field name="model">stock.shipment.in</field>
|
||||
<field name="report_name">stock.shipment.in.coo</field>
|
||||
<field name="report">stock/coo.fodt</field>
|
||||
</record>
|
||||
<record model="ir.action.keyword" id="report_shipment_in_coo_keyword">
|
||||
<field name="keyword">form_print</field>
|
||||
<field name="model">stock.shipment.in,-1</field>
|
||||
<field name="action" ref="report_shipment_in_coo"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.action.report" id="report_shipment_in_packing_list">
|
||||
<field name="name">Packing List</field>
|
||||
<field name="model">stock.shipment.in</field>
|
||||
<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>
|
||||
<field name="wiz_name">sof.update</field>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2,6 +2,7 @@
|
||||
version=7.2.7
|
||||
depends:
|
||||
ir
|
||||
price
|
||||
purchase
|
||||
sale
|
||||
account_invoice
|
||||
@@ -10,11 +11,13 @@ depends:
|
||||
lot
|
||||
document_incoming
|
||||
incoterm
|
||||
bank
|
||||
xml:
|
||||
purchase.xml
|
||||
sale.xml
|
||||
lot.xml
|
||||
pricing.xml
|
||||
configuration.xml
|
||||
stock.xml
|
||||
workflow.xml
|
||||
lc.xml
|
||||
@@ -34,4 +37,5 @@ xml:
|
||||
weight_report.xml
|
||||
dimension.xml
|
||||
backtoback.xml
|
||||
invoice.xml
|
||||
account.xml
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,25 @@
|
||||
<tryton>
|
||||
<data>
|
||||
<record model="ir.ui.view" id="valuation_process_dimension_view_tree">
|
||||
<field name="model">valuation.process.dimension</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="name">valuation_process_dimension_tree</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="valuation_process_dimension_view_form">
|
||||
<field name="model">valuation.process.dimension</field>
|
||||
<field name="type">form</field>
|
||||
<field name="name">valuation_process_dimension_form</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="valuation_process_start_view_form">
|
||||
<field name="model">valuation.process.start</field>
|
||||
<field name="type">form</field>
|
||||
<field name="name">valuation_process_start_form</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="valuation_process_result_view_form">
|
||||
<field name="model">valuation.process.result</field>
|
||||
<field name="type">form</field>
|
||||
<field name="name">valuation_process_result_form</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="valuation_view_tree_sequence3">
|
||||
<field name="model">valuation.valuation</field>
|
||||
<field name="type">tree</field>
|
||||
@@ -36,6 +56,10 @@
|
||||
<field name="res_model">valuation.report</field>
|
||||
<field name="context_model">valuation.report.context</field>
|
||||
</record>
|
||||
<record model="ir.action.wizard" id="act_valuation_process">
|
||||
<field name="name">Process valuation</field>
|
||||
<field name="wiz_name">valuation.process</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_valuation_form_view">
|
||||
<field name="sequence" eval="70"/>
|
||||
<field name="view" ref="valuation_view_list"/>
|
||||
@@ -43,8 +67,17 @@
|
||||
</record>
|
||||
|
||||
<menuitem
|
||||
parent="purchase_trade.menu_global_reporting"
|
||||
sequence="120"
|
||||
name="Valuation"
|
||||
sequence="98"
|
||||
id="menu_valuation"/>
|
||||
<menuitem
|
||||
parent="menu_valuation"
|
||||
sequence="10"
|
||||
action="act_valuation_process"
|
||||
id="menu_valuation_process"/>
|
||||
<menuitem
|
||||
parent="menu_valuation"
|
||||
sequence="20"
|
||||
action="act_valuation_form"
|
||||
id="menu_valuation_form"/>
|
||||
</data>
|
||||
|
||||
11
modules/purchase_trade/view/account_configuration_form.xml
Normal file
11
modules/purchase_trade/view/account_configuration_form.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0"?>
|
||||
<data>
|
||||
<xpath expr="/form/separator[@id='invoice']"
|
||||
position="before">
|
||||
<separator id="padding" string="Padding" colspan="4"/>
|
||||
<label name="default_sale_padding_account"/>
|
||||
<field name="default_sale_padding_account"/>
|
||||
<label name="default_accrual_padding_account"/>
|
||||
<field name="default_accrual_padding_account"/>
|
||||
</xpath>
|
||||
</data>
|
||||
5
modules/purchase_trade/view/configuration_form.xml
Normal file
5
modules/purchase_trade/view/configuration_form.xml
Normal file
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0"?>
|
||||
<form col="4">
|
||||
<label name="pricing_rule"/>
|
||||
<field name="pricing_rule" colspan="3"/>
|
||||
</form>
|
||||
@@ -9,13 +9,13 @@
|
||||
<field name="tol_min"/>
|
||||
<field name="tol_max"/>
|
||||
<field name="price_type"/>
|
||||
<field name="from_location"/>
|
||||
<field name="to_location"/>
|
||||
<field name="payment_term"/>
|
||||
<field name="incoterm"/>
|
||||
<field name="crop"/>
|
||||
<field name="del_period"/>
|
||||
<field name="from_del"/>
|
||||
<field name="to_del"/>
|
||||
<field name="from_location"/>
|
||||
<field name="to_location"/>
|
||||
<field name="category" tree_invisible="1"/>
|
||||
</tree>
|
||||
|
||||
7
modules/purchase_trade/view/invoice_line_form.xml
Normal file
7
modules/purchase_trade/view/invoice_line_form.xml
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0"?>
|
||||
<data>
|
||||
<xpath expr="/form/notebook/page[@id='general']/label[@name='quantity']" position="before">
|
||||
<label name="included_padding"/>
|
||||
<field name="included_padding"/>
|
||||
</xpath>
|
||||
</data>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0"?>
|
||||
<data>
|
||||
<xpath expr="/tree/field[@name='quantity']" position="after">
|
||||
<field name="included_padding" symbol="unit"/>
|
||||
</xpath>
|
||||
</data>
|
||||
16
modules/purchase_trade/view/invoice_padding_context_form.xml
Normal file
16
modules/purchase_trade/view/invoice_padding_context_form.xml
Normal file
@@ -0,0 +1,16 @@
|
||||
<form>
|
||||
<label name="from_date"/>
|
||||
<field name="from_date"/>
|
||||
<label name="to_date"/>
|
||||
<field name="to_date"/>
|
||||
<label name="party"/>
|
||||
<field name="party"/>
|
||||
<label name="currency"/>
|
||||
<field name="currency"/>
|
||||
<label name="status"/>
|
||||
<field name="status"/>
|
||||
<label name="sale"/>
|
||||
<field name="sale"/>
|
||||
<label name="lot"/>
|
||||
<field name="lot"/>
|
||||
</form>
|
||||
19
modules/purchase_trade/view/invoice_padding_report_list.xml
Normal file
19
modules/purchase_trade/view/invoice_padding_report_list.xml
Normal file
@@ -0,0 +1,19 @@
|
||||
<tree>
|
||||
<field name="party" width="140"/>
|
||||
<field name="currency" width="60"/>
|
||||
<field name="sale" width="100"/>
|
||||
<field name="sale_line" width="100"/>
|
||||
<field name="lot" width="120"/>
|
||||
<field name="product" width="140"/>
|
||||
<field name="padding_status" width="80"/>
|
||||
<field name="padding_quantity" width="110" sum="1"/>
|
||||
<field name="unit" width="60"/>
|
||||
<field name="unit_price" width="90"/>
|
||||
<field name="padding_amount" width="110" sum="1"/>
|
||||
<field name="provisional_invoice" width="130"/>
|
||||
<field name="provisional_date" width="90"/>
|
||||
<field name="provisional_state" width="90"/>
|
||||
<field name="final_invoice" width="130"/>
|
||||
<field name="final_date" width="90"/>
|
||||
<field name="final_state" width="90"/>
|
||||
</tree>
|
||||
7
modules/purchase_trade/view/lot_form.xml
Normal file
7
modules/purchase_trade/view/lot_form.xml
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0"?>
|
||||
<data>
|
||||
<xpath expr="/form/label[@name='warrant_nb']" position="before">
|
||||
<label name="sale_invoice_padding"/>
|
||||
<field name="sale_invoice_padding"/>
|
||||
</xpath>
|
||||
</data>
|
||||
@@ -16,6 +16,8 @@
|
||||
<field name="amount"/>
|
||||
<label name="quantity_s"/>
|
||||
<field name="quantity_s"/>
|
||||
<label name="sale_padding"/>
|
||||
<field name="sale_padding"/>
|
||||
<label name="amount_s"/>
|
||||
<field name="amount_s"/>
|
||||
<newline/>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
6
modules/purchase_trade/view/lot_tree_sequence.xml
Normal file
6
modules/purchase_trade/view/lot_tree_sequence.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0"?>
|
||||
<data>
|
||||
<xpath expr="/tree/field[@name='lot_quantity']" position="after">
|
||||
<field name="sale_invoice_padding" optional="1"/>
|
||||
</xpath>
|
||||
</data>
|
||||
@@ -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"/>
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
<form>
|
||||
<field name="line" invisible="1"/>
|
||||
<field name="sale_line" invisible="1"/>
|
||||
<field name="available_components" invisible="1"/>
|
||||
<label name="pricing_date"/>
|
||||
<field name="pricing_date"/>
|
||||
<label name="price_component"/>
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
<tree>
|
||||
<field name="line" tree_invisible="1"/>
|
||||
<field name="sale_line" tree_invisible="1"/>
|
||||
<field name="available_components" tree_invisible="1"/>
|
||||
<field name="pricing_date"/>
|
||||
<field name="price_component"/>
|
||||
<field name="quantity"/>
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
<tree>
|
||||
<field name="line" tree_invisible="1"/>
|
||||
<field name="sale_line" tree_invisible="1"/>
|
||||
<field name="available_components" tree_invisible="1"/>
|
||||
<field name="pricing_date"/>
|
||||
<field name="price_component"/>
|
||||
<field name="quantity"/>
|
||||
|
||||
@@ -80,7 +80,10 @@ this repository contains the full copyright notices and license terms. -->
|
||||
</page>
|
||||
</xpath>
|
||||
<xpath expr="/form/notebook/page[@id='info']/label[@name='invoice_party']" position="before">
|
||||
<field name="bank_accounts" colspan="4" invisible="1"/>
|
||||
<label name="bank_account"/>
|
||||
<field name="bank_account"/>
|
||||
<label name="our_bank_account"/>
|
||||
<field name="our_bank_account"/>
|
||||
</xpath>
|
||||
</data>
|
||||
|
||||
@@ -9,27 +9,27 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<label name="finished"/>
|
||||
<field name="finished"/>
|
||||
<newline/>
|
||||
<label name="price_type"/>
|
||||
<field name="price_type"/>
|
||||
<label name="enable_linked_currency"/>
|
||||
<field name="enable_linked_currency"/>
|
||||
<newline/>
|
||||
<label name="linked_price"/>
|
||||
<field name="linked_price"/>
|
||||
<label name="linked_currency"/>
|
||||
<field name="linked_currency"/>
|
||||
<label name="linked_unit"/>
|
||||
<field name="linked_unit"/>
|
||||
<newline/>
|
||||
<label name="linked_price"/>
|
||||
<field name="linked_price"/>
|
||||
<label name="premium"/>
|
||||
<field name="premium"/>
|
||||
<newline/>
|
||||
</xpath>
|
||||
<xpath expr="/form/notebook/page[@id='general']/field[@name='amount']" position="after">
|
||||
<newline/>
|
||||
<label name="price_type"/>
|
||||
<field name="price_type"/>
|
||||
<label name="progress"/>
|
||||
<field name="progress" widget="progressbar"/>
|
||||
<newline/>
|
||||
<label name="premium"/>
|
||||
<field name="premium"/>
|
||||
<newline/>
|
||||
<label name="inherit_tol"/>
|
||||
<field name="inherit_tol"/>
|
||||
<newline/>
|
||||
@@ -96,6 +96,10 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<page string="Summary" col="4" id="summary">
|
||||
<field name="price_summary" />
|
||||
</page>
|
||||
<page string="Report" col="4" id="report">
|
||||
<label name="pricing_rule" />
|
||||
<field name="pricing_rule" />
|
||||
</page>
|
||||
</notebook>
|
||||
</page>
|
||||
<page string="Estimated dates" col="4" id="estimated">
|
||||
|
||||
@@ -7,4 +7,7 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<field name="from_del"/>
|
||||
<field name="to_del"/>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='unit_price']" position="after">
|
||||
<field name="premium"/>
|
||||
</xpath>
|
||||
</data>
|
||||
@@ -93,7 +93,10 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<field name="incoterm_location"/>
|
||||
</xpath>
|
||||
<xpath expr="/form/notebook/page[@id='other']/label[@name='company']" position="before">
|
||||
<field name="bank_accounts" colspan="4" invisible="1"/>
|
||||
<label name="bank_account"/>
|
||||
<field name="bank_account"/>
|
||||
<label name="our_bank_account"/>
|
||||
<field name="our_bank_account"/>
|
||||
</xpath>
|
||||
</data>
|
||||
|
||||
@@ -9,27 +9,27 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<label name="finished"/>
|
||||
<field name="finished"/>
|
||||
<newline/>
|
||||
<label name="price_type"/>
|
||||
<field name="price_type"/>
|
||||
<label name="enable_linked_currency"/>
|
||||
<field name="enable_linked_currency"/>
|
||||
<newline/>
|
||||
<label name="linked_price"/>
|
||||
<field name="linked_price"/>
|
||||
<label name="linked_currency"/>
|
||||
<field name="linked_currency"/>
|
||||
<label name="linked_unit"/>
|
||||
<field name="linked_unit"/>
|
||||
<newline/>
|
||||
<label name="linked_price"/>
|
||||
<field name="linked_price"/>
|
||||
<label name="premium"/>
|
||||
<field name="premium"/>
|
||||
<newline/>
|
||||
</xpath>
|
||||
<xpath expr="/form/notebook/page[@id='general']/field[@name='amount']" position="after">
|
||||
<newline/>
|
||||
<label name="price_type"/>
|
||||
<field name="price_type"/>
|
||||
<label name="progress"/>
|
||||
<field name="progress" widget="progressbar"/>
|
||||
<newline/>
|
||||
<label name="premium"/>
|
||||
<field name="premium"/>
|
||||
<newline/>
|
||||
<label name="inherit_tol"/>
|
||||
<field name="inherit_tol"/>
|
||||
<newline/>
|
||||
|
||||
@@ -7,4 +7,7 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<field name="from_del"/>
|
||||
<field name="to_del"/>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='unit_price']" position="after">
|
||||
<field name="premium"/>
|
||||
</xpath>
|
||||
</data>
|
||||
@@ -137,5 +137,9 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<newline/>
|
||||
<field name="shipment_wr" colspan="4" mode="tree" view_ids="purchase_trade.shipment_wr_view_tree"/>
|
||||
</page>
|
||||
<page string="Surveyor" col="4" id="surveyor">
|
||||
<label name="surveyor"/>
|
||||
<field name="surveyor"/>
|
||||
</page>
|
||||
</xpath>
|
||||
</data>
|
||||
8
modules/purchase_trade/view/shipment_in_tree.xml
Normal file
8
modules/purchase_trade/view/shipment_in_tree.xml
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<data>
|
||||
<xpath expr="/tree/field[@name='number']" position="after">
|
||||
<field name="bl_number"/>
|
||||
</xpath>
|
||||
</data>
|
||||
62
modules/purchase_trade/view/template_configuration_form.xml
Normal file
62
modules/purchase_trade/view/template_configuration_form.xml
Normal file
@@ -0,0 +1,62 @@
|
||||
<?xml version="1.0"?>
|
||||
<form col="4">
|
||||
<separator id="sale_templates" string="Sale" colspan="4"/>
|
||||
<label name="sale_report_template"/>
|
||||
<field name="sale_report_template" colspan="3"/>
|
||||
<label name="sale_report_label"/>
|
||||
<field name="sale_report_label" colspan="3"/>
|
||||
<label name="sale_bill_report_template"/>
|
||||
<field name="sale_bill_report_template" colspan="3"/>
|
||||
<label name="sale_bill_report_label"/>
|
||||
<field name="sale_bill_report_label" colspan="3"/>
|
||||
<label name="sale_final_report_template"/>
|
||||
<field name="sale_final_report_template" colspan="3"/>
|
||||
|
||||
<separator id="invoice_templates" string="Invoice" colspan="4"/>
|
||||
<label name="invoice_report_template"/>
|
||||
<field name="invoice_report_template" colspan="3"/>
|
||||
<label name="invoice_report_label"/>
|
||||
<field name="invoice_report_label" colspan="3"/>
|
||||
<label name="invoice_cndn_report_template"/>
|
||||
<field name="invoice_cndn_report_template" colspan="3"/>
|
||||
<label name="invoice_cndn_report_label"/>
|
||||
<field name="invoice_cndn_report_label" colspan="3"/>
|
||||
<label name="invoice_prepayment_report_template"/>
|
||||
<field name="invoice_prepayment_report_template" colspan="3"/>
|
||||
<label name="invoice_prepayment_report_label"/>
|
||||
<field name="invoice_prepayment_report_label" colspan="3"/>
|
||||
<label name="invoice_packing_list_report_template"/>
|
||||
<field name="invoice_packing_list_report_template" colspan="3"/>
|
||||
<label name="invoice_packing_list_report_label"/>
|
||||
<field name="invoice_packing_list_report_label" colspan="3"/>
|
||||
|
||||
<separator id="payment_templates" string="Payment" colspan="4"/>
|
||||
<label name="invoice_payment_order_report_template"/>
|
||||
<field name="invoice_payment_order_report_template" colspan="3"/>
|
||||
<label name="invoice_payment_order_report_label"/>
|
||||
<field name="invoice_payment_order_report_label" colspan="3"/>
|
||||
|
||||
<separator id="purchase_templates" string="Purchase" colspan="4"/>
|
||||
<label name="purchase_report_template"/>
|
||||
<field name="purchase_report_template" colspan="3"/>
|
||||
<label name="purchase_report_label"/>
|
||||
<field name="purchase_report_label" colspan="3"/>
|
||||
|
||||
<separator id="shipment_templates" string="Shipment" colspan="4"/>
|
||||
<label name="shipment_shipping_report_template"/>
|
||||
<field name="shipment_shipping_report_template" colspan="3"/>
|
||||
<label name="shipment_shipping_report_label"/>
|
||||
<field name="shipment_shipping_report_label" colspan="3"/>
|
||||
<label name="shipment_insurance_report_template"/>
|
||||
<field name="shipment_insurance_report_template" colspan="3"/>
|
||||
<label name="shipment_insurance_report_label"/>
|
||||
<field name="shipment_insurance_report_label" colspan="3"/>
|
||||
<label name="shipment_coo_report_template"/>
|
||||
<field name="shipment_coo_report_template" colspan="3"/>
|
||||
<label name="shipment_coo_report_label"/>
|
||||
<field name="shipment_coo_report_label" colspan="3"/>
|
||||
<label name="shipment_packing_list_report_template"/>
|
||||
<field name="shipment_packing_list_report_template" colspan="3"/>
|
||||
<label name="shipment_packing_list_report_label"/>
|
||||
<field name="shipment_packing_list_report_label" colspan="3"/>
|
||||
</form>
|
||||
@@ -12,5 +12,6 @@
|
||||
<field name="base_amount" sum="1"/>
|
||||
<field name="rate"/>
|
||||
<field name="strategy"/>
|
||||
<field name="mtm_price"/>
|
||||
<field name="mtm" optional="0" sum="1"/>
|
||||
</tree>
|
||||
@@ -0,0 +1,6 @@
|
||||
<form col="4">
|
||||
<label name="dimension"/>
|
||||
<field name="dimension"/>
|
||||
<label name="value"/>
|
||||
<field name="value"/>
|
||||
</form>
|
||||
@@ -0,0 +1,4 @@
|
||||
<tree editable="1">
|
||||
<field name="dimension"/>
|
||||
<field name="value"/>
|
||||
</tree>
|
||||
@@ -0,0 +1,3 @@
|
||||
<form>
|
||||
<field name="message"/>
|
||||
</form>
|
||||
18
modules/purchase_trade/view/valuation_process_start_form.xml
Normal file
18
modules/purchase_trade/view/valuation_process_start_form.xml
Normal file
@@ -0,0 +1,18 @@
|
||||
<form col="4">
|
||||
<label name="valuation_type"/>
|
||||
<field name="valuation_type"/>
|
||||
<newline/>
|
||||
<label name="purchase_from_date"/>
|
||||
<field name="purchase_from_date"/>
|
||||
<label name="purchase_to_date"/>
|
||||
<field name="purchase_to_date"/>
|
||||
<label name="purchase_numbers"/>
|
||||
<field name="purchase_numbers" colspan="3"/>
|
||||
<label name="sale_from_date"/>
|
||||
<field name="sale_from_date"/>
|
||||
<label name="sale_to_date"/>
|
||||
<field name="sale_to_date"/>
|
||||
<label name="sale_numbers"/>
|
||||
<field name="sale_numbers" colspan="3"/>
|
||||
<field name="analytic_dimensions" colspan="4"/>
|
||||
</form>
|
||||
@@ -11,5 +11,6 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<field name="quantity" symbol="unit"/>
|
||||
<field name="amount" sum="1"/>
|
||||
<field name="strategy"/>
|
||||
<field name="mtm_price"/>
|
||||
<field name="mtm" optional="0" sum="1"/>
|
||||
</tree>
|
||||
@@ -11,6 +11,7 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<field name="r_quantity" symbol="r_unit"/>
|
||||
<field name="r_amount" sum="1"/>
|
||||
<field name="r_strategy"/>
|
||||
<field name="r_mtm_price"/>
|
||||
<field name="r_mtm" optional="0" sum="1"/>
|
||||
</tree>
|
||||
|
||||
|
||||
@@ -79,6 +79,13 @@
|
||||
<label name="weight_date"/>
|
||||
<field name="weight_date"/>
|
||||
</group>
|
||||
<group id="remote_wr" colspan="8" col="4">
|
||||
<button name="create_remote_weight_reports" string="Create Remote WRs" colspan="4"/>
|
||||
<label name="remote_weight_report_sent_at"/>
|
||||
<field name="remote_weight_report_sent_at"/>
|
||||
<label name="remote_weight_report_keys"/>
|
||||
<field name="remote_weight_report_keys" colspan="4"/>
|
||||
</group>
|
||||
|
||||
<!-- <group id="buttons" colspan="8">
|
||||
<button name="import_json" string="Import JSON"/>
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
<field name="invoice_net_kg"/>
|
||||
<field name="gain_loss_kg"/>
|
||||
<field name="gain_loss_percent"/>
|
||||
<field name="remote_weight_report_sent_at"/>
|
||||
<!-- <button name="import_json" tree_invisible="1"/>
|
||||
<button name="export_json" tree_invisible="1"/> -->
|
||||
</tree>
|
||||
@@ -1,7 +1,10 @@
|
||||
from trytond.model import ModelSQL, ModelView, fields
|
||||
from trytond.pool import Pool
|
||||
from trytond.exceptions import UserError
|
||||
from decimal import Decimal, ROUND_HALF_UP
|
||||
from datetime import datetime as dt
|
||||
import datetime
|
||||
import requests
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -49,21 +52,127 @@ class WeightReport(ModelSQL, ModelView):
|
||||
invoice_net_kg = fields.Numeric('Invoice Net (kg)', digits=(16, 2))
|
||||
gain_loss_kg = fields.Numeric('Gain/Loss (kg)', digits=(16, 2))
|
||||
gain_loss_percent = fields.Numeric('Gain/Loss (%)', digits=(16, 2))
|
||||
remote_weight_report_keys = fields.Text('Remote WR Keys', readonly=True)
|
||||
remote_weight_report_sent_at = fields.Date(
|
||||
'Remote WR Sent At', readonly=True)
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._order = [('report_date', 'DESC')]
|
||||
# cls._buttons.update({
|
||||
# 'import_json': {},
|
||||
# 'export_json': {},
|
||||
# })
|
||||
cls._buttons.update({
|
||||
'create_remote_weight_reports': {},
|
||||
})
|
||||
|
||||
def get_rec_name(self, name):
|
||||
items = [self.lab]
|
||||
if self.reference:
|
||||
items.append('[%s]' % self.reference)
|
||||
return ' '.join(items)
|
||||
|
||||
def create_remote_weight_report(self, wr_payload):
|
||||
response = requests.post(
|
||||
"http://automation-service:8006/weight-report",
|
||||
json=wr_payload,
|
||||
timeout=10
|
||||
)
|
||||
response.raise_for_status()
|
||||
return response.json()
|
||||
|
||||
def get_related_shipments(self):
|
||||
ShipmentWR = Pool().get('shipment.wr')
|
||||
links = ShipmentWR.search([('wr', '=', self.id)])
|
||||
return [link.shipment_in for link in links if link.shipment_in]
|
||||
|
||||
def get_source_shipment(self):
|
||||
shipments = self.get_related_shipments()
|
||||
if not shipments:
|
||||
raise UserError('No shipment is linked to this weight report.')
|
||||
unique_shipments = {shipment.id: shipment for shipment in shipments}
|
||||
if len(unique_shipments) > 1:
|
||||
raise UserError(
|
||||
'This weight report is linked to multiple shipments.')
|
||||
return next(iter(unique_shipments.values()))
|
||||
|
||||
def get_remote_weight_report_lots(self, shipment):
|
||||
lots = []
|
||||
seen = set()
|
||||
for move in shipment.incoming_moves or []:
|
||||
lot = getattr(move, 'lot', None)
|
||||
if (not lot or lot.lot_type != 'physic'
|
||||
or lot.id in seen):
|
||||
continue
|
||||
seen.add(lot.id)
|
||||
lots.append(lot)
|
||||
if not lots:
|
||||
raise UserError(
|
||||
'No physical lot was found on the incoming moves.')
|
||||
return lots
|
||||
|
||||
def validate_remote_weight_report_context(self, shipment):
|
||||
if not shipment.controller:
|
||||
raise UserError(
|
||||
'A controller is required before creating remote weight reports.')
|
||||
if not shipment.returned_id:
|
||||
raise UserError(
|
||||
'A returned ID is required before creating remote weight reports.')
|
||||
if not shipment.agent:
|
||||
raise UserError(
|
||||
'A booking agent is required before creating remote weight reports.')
|
||||
if not shipment.to_location:
|
||||
raise UserError(
|
||||
'A destination location is required before creating remote weight reports.')
|
||||
if not self.bales:
|
||||
raise UserError(
|
||||
'The global weight report must define the number of bales.')
|
||||
if not self.report_date or not self.weight_date:
|
||||
raise UserError(
|
||||
'Report date and weight date are required.')
|
||||
|
||||
def build_remote_weight_report_payload(self, shipment, lot):
|
||||
if not lot.lot_chunk_key:
|
||||
raise UserError(
|
||||
'Each physical lot must have a chunk key before export.')
|
||||
factor_net = self.net_landed_kg / self.bales
|
||||
factor_gross = self.gross_landed_kg / self.bales
|
||||
lot_ratio = Decimal(lot.lot_qt) / self.bales
|
||||
return {
|
||||
"chunk_key": lot.lot_chunk_key,
|
||||
"gross_weight": float(round(
|
||||
Decimal(lot.lot_qt) * factor_gross, 5)),
|
||||
"net_weight": float(round(
|
||||
Decimal(lot.lot_qt) * factor_net, 5)),
|
||||
"tare_total": float(round(self.tare_kg * lot_ratio, 5)),
|
||||
"bags": int(lot.lot_qt),
|
||||
"surveyor_code": shipment.controller.get_alf(),
|
||||
"place_key": shipment.to_location.get_places(),
|
||||
"report_date": int(self.report_date.strftime("%Y%m%d")),
|
||||
"weight_date": int(self.weight_date.strftime("%Y%m%d")),
|
||||
"agent": shipment.agent.get_alf(),
|
||||
"forwarder_ref": shipment.returned_id,
|
||||
}
|
||||
|
||||
@classmethod
|
||||
@ModelView.button
|
||||
def create_remote_weight_reports(cls, reports):
|
||||
to_save = []
|
||||
for report in reports:
|
||||
shipment = report.get_source_shipment()
|
||||
report.validate_remote_weight_report_context(shipment)
|
||||
lots = report.get_remote_weight_report_lots(shipment)
|
||||
created = []
|
||||
for lot in lots:
|
||||
payload = report.build_remote_weight_report_payload(
|
||||
shipment, lot)
|
||||
logger.info("REMOTE_WR_PAYLOAD:%s", payload)
|
||||
data = report.create_remote_weight_report(payload)
|
||||
created.append(
|
||||
f"{lot.rec_name}: {data.get('weight_report_key')}")
|
||||
report.remote_weight_report_keys = '\n'.join(created)
|
||||
report.remote_weight_report_sent_at = datetime.date.today()
|
||||
to_save.append(report)
|
||||
if to_save:
|
||||
cls.save(to_save)
|
||||
# @classmethod
|
||||
# @ModelView.button_action('weight_report.act_import_json')
|
||||
# def import_json(cls, reports):
|
||||
@@ -97,6 +206,12 @@ class WeightReport(ModelSQL, ModelView):
|
||||
|
||||
def parse_date(date_str):
|
||||
logger.info("TRY_TO_PARSE:%s",date_str)
|
||||
if not date_str:
|
||||
return None
|
||||
if isinstance(date_str, datetime.date):
|
||||
return date_str
|
||||
if not isinstance(date_str, str):
|
||||
date_str = str(date_str)
|
||||
for fmt in ('%d %B %Y', '%d %b %Y'):
|
||||
try:
|
||||
return dt.strptime(date_str, fmt).date()
|
||||
@@ -104,6 +219,28 @@ class WeightReport(ModelSQL, ModelView):
|
||||
pass
|
||||
return None
|
||||
|
||||
def parse_bales(value):
|
||||
if value in (None, ''):
|
||||
return 0
|
||||
if isinstance(value, (int, float, Decimal)):
|
||||
return int(Decimal(str(value)).quantize(Decimal('1')))
|
||||
text = str(value).strip()
|
||||
if not text:
|
||||
return 0
|
||||
text = text.replace(' ', '')
|
||||
if ',' in text and '.' in text:
|
||||
text = text.replace(',', '')
|
||||
elif ',' in text:
|
||||
text = text.replace(',', '.')
|
||||
try:
|
||||
decimal_value = Decimal(text)
|
||||
except Exception:
|
||||
if '.' in text:
|
||||
decimal_value = Decimal(text.replace('.', ''))
|
||||
else:
|
||||
raise
|
||||
return int(decimal_value.quantize(Decimal('1')))
|
||||
|
||||
report['report_date'] = parse_date(report_data.get('date', ''))
|
||||
# 3. Contract Information
|
||||
contract_data = json_data.get('contract', {})
|
||||
@@ -178,7 +315,7 @@ class WeightReport(ModelSQL, ModelView):
|
||||
|
||||
report['weighing_place'] = shipment_data.get('weighing_place', '')
|
||||
report['weighing_method'] = shipment_data.get('weighing_method', '')
|
||||
report['bales'] = int(shipment_data.get('bales', 0) or 0)
|
||||
report['bales'] = parse_bales(shipment_data.get('bales', 0))
|
||||
|
||||
# 6. Weights Information
|
||||
weights_data = json_data.get('weights', {})
|
||||
|
||||
@@ -103,18 +103,12 @@
|
||||
</record> -->
|
||||
|
||||
<!-- Model Buttons -->
|
||||
<!-- <record model="ir.model.button" id="weight_report_import_button">
|
||||
<record model="ir.model.button" id="weight_report_create_remote_button">
|
||||
<field name="model">weight.report</field>
|
||||
<field name="name">import_json</field>
|
||||
<field name="string">Import JSON</field>
|
||||
<field name="name">create_remote_weight_reports</field>
|
||||
<field name="string">Create Remote WRs</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.model.button" id="weight_report_export_button">
|
||||
<field name="model">weight.report</field>
|
||||
<field name="name">export_json</field>
|
||||
<field name="string">Export JSON</field>
|
||||
</record> -->
|
||||
|
||||
<!-- Menu Structure -->
|
||||
<menuitem
|
||||
name="Weight Reports"
|
||||
|
||||
@@ -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>
|
||||
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>
|
||||
@@ -399,7 +399,7 @@ this repository contains the full copyright notices and license terms. -->
|
||||
</record>
|
||||
|
||||
<record model="ir.action.report" id="report_sale">
|
||||
<field name="name">Sale</field>
|
||||
<field name="name">Proforma</field>
|
||||
<field name="model">sale.sale</field>
|
||||
<field name="report_name">sale.sale</field>
|
||||
<field name="report">sale/sale.fodt</field>
|
||||
@@ -411,7 +411,7 @@ this repository contains the full copyright notices and license terms. -->
|
||||
</record>
|
||||
|
||||
<record model="ir.action.report" id="report_bill">
|
||||
<field name="name">Bill</field>
|
||||
<field name="name">Draft</field>
|
||||
<field name="model">sale.sale</field>
|
||||
<field name="report_name">sale.sale</field>
|
||||
<field name="report">sale/bill.fodt</field>
|
||||
@@ -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>
|
||||
|
||||
@@ -4069,7 +4069,7 @@
|
||||
<text:s />
|
||||
<text:span text:style-name="T21">CROP </text:span>
|
||||
<text:span text:style-name="T21">
|
||||
<text:placeholder text:placeholder-type="text"><sale.crop.name></text:placeholder>
|
||||
<text:placeholder text:placeholder-type="text"><sale.report_crop_name></text:placeholder>
|
||||
</text:span>
|
||||
</text:p>
|
||||
</table:table-cell>
|
||||
@@ -4091,10 +4091,19 @@
|
||||
<text:p text:style-name="P42" />
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Table4.A1" office:value-type="string">
|
||||
<text:p text:style-name="P31">ABOUT <text:placeholder text:placeholder-type="text"><sum(line.quantity for line in sale.lines)></text:placeholder><text:s /><text:placeholder text:placeholder-type="text"><sale.lines[0].unit.rec_name.upper() if sale.lines and sale.lines[0].unit else ''></text:placeholder><text:s /><text:span text:style-name="T23">(</text:span><text:span text:style-name="T23"><text:placeholder text:placeholder-type="text"><sale.report_qt></text:placeholder></text:span><text:span text:style-name="T23">) </text:span></text:p>
|
||||
<text:p text:style-name="P31">ABOUT <text:placeholder text:placeholder-type="text"><sale.report_total_quantity></text:placeholder><text:s /><text:placeholder text:placeholder-type="text"><sale.report_quantity_unit_upper></text:placeholder><text:s /><text:span text:style-name="T23">(</text:span><text:span text:style-name="T23"><text:placeholder text:placeholder-type="text"><sale.report_qt></text:placeholder></text:span><text:span text:style-name="T23">) </text:span></text:p>
|
||||
<text:p text:style-name="P39">
|
||||
<text:placeholder text:placeholder-type="text"><sale.report_nb_bale></text:placeholder>
|
||||
</text:p>
|
||||
<text:p text:style-name="P39">
|
||||
<text:placeholder text:placeholder-type="text"><for each="line in sale.report_quantity_lines.splitlines()"></text:placeholder>
|
||||
</text:p>
|
||||
<text:p text:style-name="P39">
|
||||
<text:placeholder text:placeholder-type="text"><line></text:placeholder>
|
||||
</text:p>
|
||||
<text:p text:style-name="P39">
|
||||
<text:placeholder text:placeholder-type="text"></for></text:placeholder>
|
||||
</text:p>
|
||||
<text:p text:style-name="P39" />
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
@@ -4110,27 +4119,13 @@
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Table5.A1" office:value-type="string">
|
||||
<text:p text:style-name="P56">
|
||||
<text:placeholder text:placeholder-type="text"><sale.lines[0].linked_currency.rec_name.upper() if sale.lines[0].linked_currency else sale.currency.rec_name.upper()></text:placeholder>
|
||||
<text:s />
|
||||
<text:placeholder text:placeholder-type="text"><sale.lines[0].linked_price if sale.lines[0].linked_price else sale.lines[0].unit_price></text:placeholder>
|
||||
<text:span text:style-name="T23">
|
||||
<text:s />
|
||||
</text:span>
|
||||
<text:span text:style-name="T26">PER </text:span>
|
||||
<text:span text:style-name="T26">
|
||||
<text:placeholder text:placeholder-type="text"><sale.lines[0].linked_unit.rec_name.upper() if sale.lines[0].linked_unit else sale.lines[0].unit.rec_name.upper()></text:placeholder>
|
||||
</text:span>
|
||||
<text:span text:style-name="T26">
|
||||
<text:s />
|
||||
</text:span>
|
||||
<text:span text:style-name="T23">(</text:span>
|
||||
<text:span text:style-name="T26">
|
||||
<text:placeholder text:placeholder-type="text"><sale.report_price></text:placeholder>
|
||||
</text:span>
|
||||
<text:span text:style-name="T23">) </text:span>
|
||||
<text:span text:style-name="T23">
|
||||
<text:placeholder text:placeholder-type="text"><sale.lines[0].get_pricing_text></text:placeholder>
|
||||
</text:span>
|
||||
<text:placeholder text:placeholder-type="text"><for each="line in sale.report_price_lines.splitlines()"></text:placeholder>
|
||||
</text:p>
|
||||
<text:p text:style-name="P56">
|
||||
<text:placeholder text:placeholder-type="text"><line></text:placeholder>
|
||||
</text:p>
|
||||
<text:p text:style-name="P56">
|
||||
<text:placeholder text:placeholder-type="text"></for></text:placeholder>
|
||||
</text:p>
|
||||
<text:p text:style-name="P37" />
|
||||
</table:table-cell>
|
||||
@@ -4199,12 +4194,18 @@
|
||||
</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Table6.A1" office:value-type="string">
|
||||
<text:p text:style-name="P36">
|
||||
<text:placeholder text:placeholder-type="text"><for each="line in sale.report_shipment_periods.splitlines()"></text:placeholder>
|
||||
</text:p>
|
||||
<text:p text:style-name="P36">
|
||||
<text:s />
|
||||
<text:span text:style-name="T24">
|
||||
<text:placeholder text:placeholder-type="text"><sale.lines[0].del_period.description if sale.lines[0].del_period else ''></text:placeholder>
|
||||
<text:placeholder text:placeholder-type="text"><line></text:placeholder>
|
||||
</text:span>
|
||||
</text:p>
|
||||
<text:p text:style-name="P36">
|
||||
<text:placeholder text:placeholder-type="text"></for></text:placeholder>
|
||||
</text:p>
|
||||
<text:p text:style-name="P34" />
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
|
||||
@@ -1721,12 +1721,11 @@
|
||||
</draw:image>
|
||||
</draw:frame><text:tab/><text:tab/><text:span text:style-name="T1">PROFORMA INVOICE</text:span></text:p>
|
||||
<text:p text:style-name="Standard"><text:tab/><text:tab/><text:span text:style-name="T10">Proforma Nr:<text:tab/><text:tab/><text:tab/>Date:</text:span></text:p>
|
||||
<text:p text:style-name="Standard"><text:tab/><text:tab/><text:span text:style-name="T35"><text:placeholder text:placeholder-type="text"><sale.report_deal></text:placeholder></text:span><text:tab/><text:tab/><text:tab/><text:span text:style-name="T35"><text:placeholder text:placeholder-type="text"><format_date(sale.sale_date, sale.party.lang) if sale.sale_date else ''></text:placeholder></text:span></text:p>
|
||||
<text:p text:style-name="Standard"><text:tab/><text:tab/><text:span text:style-name="T35"><text:placeholder text:placeholder-type="text"><sale.report_melya_proforma_number></text:placeholder></text:span><text:tab/><text:tab/><text:tab/><text:span text:style-name="T35"><text:placeholder text:placeholder-type="text"><format_date(sale.sale_date, sale.party.lang) if sale.sale_date else ''></text:placeholder></text:span></text:p>
|
||||
<text:p text:style-name="Standard"/>
|
||||
<text:p text:style-name="Standard"/>
|
||||
<text:p text:style-name="Standard"><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:span text:style-name="T10">Buyer:</text:span></text:p>
|
||||
<text:p text:style-name="Standard"><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:span text:style-name="T33"><text:placeholder text:placeholder-type="text"><sale.party.rec_name></text:placeholder></text:span></text:p>
|
||||
<text:p text:style-name="P1"><text:placeholder text:placeholder-type="text"><for each="line in sale.report_address.splitlines()"></text:placeholder></text:p>
|
||||
<text:p text:style-name="P1"><text:placeholder text:placeholder-type="text"><for each="line in sale.report_melya_buyer_address.splitlines()"></text:placeholder></text:p>
|
||||
<text:p text:style-name="P1"><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:placeholder text:placeholder-type="text"><line></text:placeholder></text:p>
|
||||
<text:p text:style-name="P1"><text:placeholder text:placeholder-type="text"></for></text:placeholder></text:p>
|
||||
<text:p text:style-name="Standard"/>
|
||||
@@ -1763,8 +1762,8 @@
|
||||
<text:p text:style-name="P25" loext:marker-style-name="T39"/>
|
||||
<text:p text:style-name="P24" loext:marker-style-name="T39"/>
|
||||
<text:p text:style-name="P24" loext:marker-style-name="T39"/>
|
||||
<text:p text:style-name="P39" loext:marker-style-name="T26"><text:span text:style-name="T26"><text:s text:c="2"/></text:span><text:span text:style-name="T42"><text:placeholder text:placeholder-type="text"><sale.lines[0].product.name if sale.lines and sale.lines[0].product else ''></text:placeholder></text:span></text:p>
|
||||
<text:p text:style-name="P30" loext:marker-style-name="T26"/>
|
||||
<text:p text:style-name="P39" loext:marker-style-name="T26"><text:span text:style-name="T42"><text:placeholder text:placeholder-type="text"><sale.report_product_name or ''></text:placeholder></text:span></text:p>
|
||||
<text:p text:style-name="P39" loext:marker-style-name="T26"><text:span text:style-name="T42"><text:placeholder text:placeholder-type="text"><sale.report_product_description or ''></text:placeholder></text:span></text:p>
|
||||
<text:p text:style-name="P27" loext:marker-style-name="T42"><text:span text:style-name="T42"><text:s/></text:span></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tableau1.B2" office:value-type="string">
|
||||
@@ -1791,7 +1790,7 @@
|
||||
<text:p text:style-name="P9"/>
|
||||
<text:p text:style-name="P9"/>
|
||||
<text:p text:style-name="P9"/>
|
||||
<text:p text:style-name="P9"><text:span text:style-name="T51">SHIPMENT SCHEDULE</text:span>:<text:tab/><text:span text:style-name="T45"><text:placeholder text:placeholder-type="text"><sale.lines[0].del_period.month_name if sale.lines and sale.lines[0].del_period else ''></text:placeholder></text:span></text:p>
|
||||
<text:p text:style-name="P9"><text:span text:style-name="T51">SHIPMENT SCHEDULE</text:span>:<text:tab/><text:span text:style-name="T45"><text:placeholder text:placeholder-type="text"><sale.report_delivery_period_description or ''></text:placeholder></text:span></text:p>
|
||||
<text:p text:style-name="P9"/>
|
||||
<text:p text:style-name="P6">TOLERANCE:<text:tab/><text:tab/>+/- <text:placeholder text:placeholder-type="text"><sale.tol_min></text:placeholder><text:s/>%</text:p>
|
||||
<text:p text:style-name="P2"/>
|
||||
@@ -1799,17 +1798,25 @@
|
||||
<text:p text:style-name="P3"/>
|
||||
<text:p text:style-name="P3">TRANSPORTATION BY:<text:tab/>VESSEL</text:p>
|
||||
<text:p text:style-name="P3"/>
|
||||
<text:p text:style-name="P8">DELIVERY TERMS:<text:tab/><text:placeholder text:placeholder-type="text"><sale.incoterm.code if sale.incoterm else ''></text:placeholder> <text:s/><text:placeholder text:placeholder-type="text"><sale.incoterm_location.party_name if sale.incoterm_location else ''></text:placeholder></text:p>
|
||||
<text:p text:style-name="P8">DELIVERY TERMS:<text:tab/><text:placeholder text:placeholder-type="text"><sale.report_melya_incoterm></text:placeholder></text:p>
|
||||
<text:p text:style-name="P2"/>
|
||||
<text:p text:style-name="P7">PAYMENT TERMS:<text:tab/><text:placeholder text:placeholder-type="text"><sale.payment_term.description if sale.payment_term else ''></text:placeholder></text:p>
|
||||
<text:p text:style-name="P2"/>
|
||||
<text:p text:style-name="P8">BANK DETAILS:<text:tab/><text:tab/>UBS SWITZERLAND AG</text:p>
|
||||
<text:p text:style-name="P8"><text:tab/><text:tab/><text:tab/>Case Postale CH-1211 Geneve 2</text:p>
|
||||
<text:p text:style-name="P8"><text:tab/><text:tab/><text:tab/>IBAN : CH36 0021 5215 2487 7461 D, Swift Code: UBSWCHZH80A</text:p>
|
||||
<text:p text:style-name="P2"/>
|
||||
<text:p text:style-name="P2"/>
|
||||
<text:p text:style-name="P2">DELIVERY IS SUBJECT TO THE DELIVERY BY OUR SUPPLIER.</text:p>
|
||||
<text:p text:style-name="P2"/>
|
||||
<text:p text:style-name="P2"/>
|
||||
<text:p text:style-name="P2"><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/>Signed by :</text:p>
|
||||
<text:p text:style-name="P2"><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/>(The Seller)</text:p>
|
||||
<text:p text:style-name="P2"><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/> <text:s text:c="12"/><text:span text:style-name="T37">MELYA SA<text:line-break/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/>13 RUE ROBERT CEARD<text:line-break/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/> <text:s text:c="5"/>CH-1204 GENEVA<text:line-break/></text:span><text:span text:style-name="T37"><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/> <text:s text:c="8"/>SWITZERLAND</text:span></text:p>
|
||||
<text:p text:style-name="P2">Signed by :<text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/>Signed by :</text:p>
|
||||
<text:p text:style-name="P2">(The Seller)<text:tab/><text:tab/><text:tab/><text:tab/><text:tab/><text:tab/>(The Buyer)</text:p>
|
||||
<text:p text:style-name="P2"/>
|
||||
<text:p text:style-name="P2"><text:span text:style-name="T37">MELYA SA</text:span></text:p>
|
||||
<text:p text:style-name="P2"><text:span text:style-name="T37">13 RUE ROBERT CEARD</text:span></text:p>
|
||||
<text:p text:style-name="P2"><text:span text:style-name="T37">CH-1204 GENEVA</text:span></text:p>
|
||||
<text:p text:style-name="P2"><text:span text:style-name="T37">SWITZERLAND</text:span></text:p>
|
||||
<text:p text:style-name="P13"><text:soft-page-break/></text:p>
|
||||
<text:p text:style-name="Standard"><text:placeholder text:placeholder-type="text"></for></text:placeholder></text:p>
|
||||
</office:text>
|
||||
|
||||
186
modules/stock/coo.fodt
Normal file
186
modules/stock/coo.fodt
Normal file
@@ -0,0 +1,186 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<office:document
|
||||
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
|
||||
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
|
||||
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
|
||||
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
|
||||
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
|
||||
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
|
||||
xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
|
||||
office:version="1.3"
|
||||
office:mimetype="application/vnd.oasis.opendocument.text">
|
||||
|
||||
<office:meta>
|
||||
<meta:generator>LibreOffice</meta:generator>
|
||||
<dc:title/>
|
||||
<meta:initial-creator>Codex</meta:initial-creator>
|
||||
<meta:creation-date>2026-04-23T00:00:00</meta:creation-date>
|
||||
<dc:date>2026-04-23T00:00:00</dc:date>
|
||||
<meta:editing-cycles>1</meta:editing-cycles>
|
||||
<meta:editing-duration>PT0S</meta:editing-duration>
|
||||
</office:meta>
|
||||
|
||||
<office:settings>
|
||||
<config:config-item-set config:name="ooo:view-settings"/>
|
||||
<config:config-item-set config:name="ooo:configuration-settings"/>
|
||||
</office:settings>
|
||||
|
||||
<office:styles>
|
||||
<style:default-style style:family="paragraph">
|
||||
<style:paragraph-properties style:writing-mode="lr-tb"/>
|
||||
<style:text-properties fo:font-size="12pt" fo:font-family="Arial"
|
||||
style:font-size-asian="12pt" style:font-size-complex="12pt"/>
|
||||
</style:default-style>
|
||||
|
||||
<style:style style:name="Standard" style:family="paragraph" style:class="text">
|
||||
<style:text-properties fo:font-size="12pt" fo:font-family="Arial"/>
|
||||
</style:style>
|
||||
|
||||
<style:style style:name="Center" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:text-align="center"/>
|
||||
</style:style>
|
||||
|
||||
<style:style style:name="Right" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:text-align="right"/>
|
||||
</style:style>
|
||||
|
||||
<style:style style:name="Bold" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:text-properties fo:font-weight="bold"/>
|
||||
</style:style>
|
||||
|
||||
<style:page-layout style:name="PageLayout">
|
||||
<style:page-layout-properties fo:page-width="29.7cm" fo:page-height="21.001cm"
|
||||
style:print-orientation="landscape"
|
||||
fo:margin-top="0.8cm" fo:margin-bottom="0.8cm"
|
||||
fo:margin-left="0.8cm" fo:margin-right="0.8cm"
|
||||
style:writing-mode="lr-tb"/>
|
||||
</style:page-layout>
|
||||
|
||||
<style:master-page style:name="Standard" style:page-layout-name="PageLayout"/>
|
||||
|
||||
<style:style style:name="MainTable" style:family="table">
|
||||
<style:table-properties style:width="27.9cm" fo:margin-left="0cm"/>
|
||||
</style:style>
|
||||
|
||||
<style:style style:name="ColLeft" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="13.95cm"/>
|
||||
</style:style>
|
||||
|
||||
<style:style style:name="ColRight" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="13.95cm"/>
|
||||
</style:style>
|
||||
|
||||
<style:style style:name="Cell" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.02cm"
|
||||
fo:border="0.01cm solid #bfbfbf"
|
||||
style:vertical-align="middle"/>
|
||||
</style:style>
|
||||
|
||||
<style:style style:name="CellTop" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.02cm"
|
||||
fo:border="0.01cm solid #bfbfbf"
|
||||
style:vertical-align="top"/>
|
||||
</style:style>
|
||||
|
||||
<style:style style:name="CellBottom" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding="0.02cm"
|
||||
fo:border="0.01cm solid #bfbfbf"
|
||||
style:vertical-align="bottom"/>
|
||||
</style:style>
|
||||
</office:styles>
|
||||
|
||||
<office:automatic-styles>
|
||||
<style:style style:name="RowTop" style:family="table-row">
|
||||
<style:table-row-properties style:row-height="3.1cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="RowConsignee" style:family="table-row">
|
||||
<style:table-row-properties style:row-height="3.2cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="RowTransport" style:family="table-row">
|
||||
<style:table-row-properties style:row-height="4.0cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="RowGoods" style:family="table-row">
|
||||
<style:table-row-properties style:row-height="1.8cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="RowGross" style:family="table-row">
|
||||
<style:table-row-properties style:row-height="4.2cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="RowDate" style:family="table-row">
|
||||
<style:table-row-properties style:row-height="2.2cm"/>
|
||||
</style:style>
|
||||
</office:automatic-styles>
|
||||
|
||||
<office:body>
|
||||
<office:text>
|
||||
<table:table table:name="COO" table:style-name="MainTable">
|
||||
<table:table-column table:style-name="ColLeft"/>
|
||||
<table:table-column table:style-name="ColRight"/>
|
||||
|
||||
<table:table-row table:style-name="RowTop">
|
||||
<table:table-cell table:style-name="Cell" office:value-type="string">
|
||||
<text:p text:style-name="Standard"/>
|
||||
<text:p text:style-name="Standard"/>
|
||||
<text:p text:style-name="Standard"><text:placeholder text:placeholder-type="text"><records[0].report_coo_exporter or ''></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Cell" office:value-type="string">
|
||||
<text:p text:style-name="Standard"/>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
|
||||
<table:table-row table:style-name="RowConsignee">
|
||||
<table:table-cell table:style-name="Cell" office:value-type="string">
|
||||
<text:p text:style-name="Standard"/>
|
||||
<text:p text:style-name="Standard"><text:placeholder text:placeholder-type="text"><records[0].report_coo_consignee or ''></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Cell" office:value-type="string">
|
||||
<text:p text:style-name="Standard"/>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
|
||||
<table:table-row table:style-name="RowTransport">
|
||||
<table:table-cell table:style-name="Cell" office:value-type="string">
|
||||
<text:p text:style-name="Standard"/>
|
||||
<text:p text:style-name="Standard"/>
|
||||
<text:p text:style-name="Standard"><text:placeholder text:placeholder-type="text"><records[0].report_coo_transport or ''></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Cell" office:value-type="string">
|
||||
<text:p text:style-name="Center"><text:placeholder text:placeholder-type="text"><records[0].report_coo_origin_country or ''></text:placeholder></text:p>
|
||||
<text:p text:style-name="Standard"/>
|
||||
<text:p text:style-name="Standard"><text:placeholder text:placeholder-type="text"><records[0].report_coo_observations or ''></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
|
||||
<table:table-row table:style-name="RowGoods">
|
||||
<table:table-cell table:style-name="Cell" office:value-type="string">
|
||||
<text:p text:style-name="Center"><text:placeholder text:placeholder-type="text"><records[0].report_coo_goods_description or ''></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Cell" office:value-type="string">
|
||||
<text:p text:style-name="Center"><text:placeholder text:placeholder-type="text"><records[0].report_coo_net_weight_display or ''></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
|
||||
<table:table-row table:style-name="RowGross">
|
||||
<table:table-cell table:style-name="Cell" office:value-type="string">
|
||||
<text:p text:style-name="Standard"/>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="CellBottom" office:value-type="string">
|
||||
<text:p text:style-name="Center"><text:placeholder text:placeholder-type="text"><records[0].report_coo_gross_weight_display or ''></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
|
||||
<table:table-row table:style-name="RowDate">
|
||||
<table:table-cell table:style-name="Cell" office:value-type="string">
|
||||
<text:p text:style-name="Standard"/>
|
||||
<text:p text:style-name="Bold"><text:placeholder text:placeholder-type="text"><records[0].report_coo_issue_date or ''></text:placeholder></text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Cell" office:value-type="string">
|
||||
<text:p text:style-name="Standard"/>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
</office:text>
|
||||
</office:body>
|
||||
</office:document>
|
||||
1074
modules/stock/insurance.fodt
Normal file
1074
modules/stock/insurance.fodt
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user