Compare commits
4 Commits
8f0d5775a6
...
8b989218f6
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8b989218f6 | ||
|
|
8a019fe6a2 | ||
|
|
6f8ce3f1d4 | ||
|
|
5b809b83c4 |
@ -6,4 +6,5 @@ Addons for Odoo 18
|
||||
|
||||
| Name | Version | Description |
|
||||
|------------------------|-----------------|---------------------------------------------|
|
||||
| gn_l10n_fr_pcg_asso | 18.0.0.0.1 | PCG pour les associations françaises |
|
||||
| gn_l10n_fr_pcg_asso | 18.0.0.0.1 | PCG pour les associations françaises |
|
||||
| gn_payments | 18.0.0.0.1 | Utilisation de modes de paiements personnalisés |
|
||||
|
||||
@ -86,14 +86,36 @@ Dans la nouvelle instance, exporter les journaux (facturation / Configuration /
|
||||
|
||||
- Supprimer la ligne de l'utilisateur base.admin
|
||||
|
||||
- Identifiant
|
||||
- Langue
|
||||
- Nom
|
||||
- Fuseau horaire
|
||||
- Id externe
|
||||
- Nom de famille
|
||||
- Prénom
|
||||
- Partenaire associé | partner_id/ID
|
||||
| Nom | Nom (mode développeur) | Nouveau nom de colonne | Changements à faire |
|
||||
| ------ | ---------------------------------------------------------- | ----------------------------- | ---------------------------- |
|
||||
| Id externe
|
||||
| Actif | active | | |
|
||||
| Identifiant
|
||||
| Partenaire associé
|
||||
| Partenaire associé/ID extern
|
||||
| Type de jeton de connexion
|
||||
| Id. utilisateur oauth
|
||||
| Notification
|
||||
|
||||
### Migrate hr.employee
|
||||
|
||||
| Nom | Nom (mode développeur) | Nouveau nom de colonne | Changements à faire |
|
||||
| ------ | ---------------------------------------------------------- | ----------------------------- | ---------------------------- |
|
||||
| Id externe | | |
|
||||
| Actif | active | | |
|
||||
| Adresse professionnelle/ID externe | address_id | | |
|
||||
| Mentor/ID externe | coach_id/id | | placer en fin de tableau les enregistrements avec Mentor défini |
|
||||
| Département/ID externe | departement_id | | |
|
||||
| Poste/ID externe | job_id/id | | |
|
||||
| Titre du poste | job_title | | |
|
||||
| Téléphone portable professionnel | mobile_phone | | |
|
||||
| Nom de l'employé | name | | |
|
||||
| Manager/ID externe | parent_id/id | | placer en fin de tableau les enregistrements avec Manager défini |
|
||||
| Calendrier de la ressource/ID externe | resource_calendar_id | | remplacer les ids |
|
||||
| Utilisateur | user_id | | |
|
||||
| Adresse e-mail professionnelle | work_email | | |
|
||||
| Téléphone professionnel | work_phone | | |
|
||||
| Congés/ID externe | leave_manager_id/id | | placer en fin de tableau les enregistrements avec Congés (i.e. Responsable des congés) défini |
|
||||
|
||||
### Migrate account.product
|
||||
|
||||
@ -138,51 +160,51 @@ Dans la nouvelle instance, exporter les journaux (facturation / Configuration /
|
||||
On fait un premier import de account.move, en excluant les colonnes qui provoquent un recalcul du montant (débit, crédit, taxes, produit...)
|
||||
Le deuxième import prend en compte toutes les colonnes.
|
||||
|
||||
| Nom | Nom (dev mode) | Ne pas importer | Dès le 1er import | Nom de colonne pour import | Remplacements |
|
||||
|----------|----------------------------------------------------------- | ----------------| -------------------| ----------------------------- | --------------------- |
|
||||
| ID | id | | X | | |
|
||||
| Extourne/ID | reversal_move_id/id | | X | | |
|
||||
| Type | move_type | | X | | |
|
||||
| Statut | state | | X | | |
|
||||
| Date d'échéance | invoice_date_due | | X | | |
|
||||
| Date | date | | X | | |
|
||||
| Date de facturation | invoice_date | | X | | |
|
||||
| Journal/ID | journal_id/id | | X | | à remplacer |
|
||||
| Journal/Nom du journal | journal_id/name | | X | | à supprimer |
|
||||
| Numéro | name | | X | | |
|
||||
| Référence | ref | | X | | |
|
||||
| Référence du paiement | payment_ref | | X | | |
|
||||
| Partenaire/ID | partner_id/id | | X | | |
|
||||
| Partenaire/Nom | partner_id/name | | X | | |
|
||||
| Paiements/ID | id | | X | | |
|
||||
| Paiements/ID | id | | X | | |
|
||||
| Bon de commande / ID | id | | X | | |
|
||||
| Note de frais/ID | | X | | |
|
||||
| Note de frais/ID | | X | | |
|
||||
| Écritures comptables/ID | line_ids/id | | X | | |
|
||||
| Écritures comptables/Type d'affichage | line_ids/display_type | | X | | sur ttes les lignes |
|
||||
| Écritures comptables/Pièce comptable/ID | line_ids/move_id/id | X | | | |
|
||||
| Écritures comptables/Compte/Code | line_ids/account_id/code | | X | Écritures comptables/Compte | à tester |
|
||||
| Écritures comptables/Libellé | line_ids/name | | X | | |
|
||||
| Écritures comptables/Date d'échéance | line_ids/date_maturity | | X | | |
|
||||
| Écritures comptables/Date de début | line_ids/start_date | | X | | |
|
||||
| Écritures comptables/Date de fin | line_ids/end_date | | X | | |
|
||||
| Écritures comptables/Ligne d'avoir/ID | line_ids/refund_line_ids/id | | X | | |
|
||||
| Écritures comptables/Partenaire/ID | line_ids/partner_id/id | | x | | à vérifier |
|
||||
| Écritures comptables/Unité de mesure/ID | line_ids/product_uom_id/id | | x | | |
|
||||
| Écritures comptables/Débit | line_ids/debit | | | | |
|
||||
| Écritures comptables/Crédit | line_ids/credit | | | | |
|
||||
| Écritures comptables/Produit/ID | line_ids/product_id/id | | | | |
|
||||
| Écritures comptables/Prix unitaire | line_ids/price_unit | | | | |
|
||||
| Écritures comptables/Quantité | line_ids/quantity | | | | |
|
||||
| Écritures comptables/Remise % | line_ids/discount | | | | |
|
||||
| Écritures comptables/Remise fixe | line_ids/discount_fixed | | | | |
|
||||
| Écritures comptables/Taxes/ID | line_ids/tax_ids/id | | | | à remplacer |
|
||||
| Écritures comptables/Taxes | line_ids/tax_ids/id | X | | | à supprimer |
|
||||
| Écritures comptables/Ligne de répartition de la taxe d'origine/ID | line_ids/tax_repartition_line_id/id | | | | à remplacer |
|
||||
| Écritures comptables/Ligne de répartition de la taxe d'origine/Taxe |line_ids/tax_repartition_line_id/tax_id | X | | | à supprimer |
|
||||
| Écritures comptables/Ligne de répartition de la taxe d'origine/Basé sur | line_ids/tax_repartition_line_id/repartition_type | X | | | à supprimer |
|
||||
| Écritures comptables/Ligne de répartition de la taxe d'origine/Type de documents | line_ids/tax_repartition_line_id/document_type | X | | |à supprimer |
|
||||
| Nom | Nom (dev mode) | Ne pas importer | Dès le 1er import | Nom de colonne pour import | Remplacements |
|
||||
|----------|----------------------------------------------------------- | ----------------| ------------------| ---------------------------- | ---------------------------- |
|
||||
| ID | id | | X | | |
|
||||
| Extourne/ID | reversal_move_id/id | | X | | |
|
||||
| Type | move_type | | X | | |
|
||||
| Statut | state | | X | | |
|
||||
| Date d'échéance | invoice_date_due | | X | | |
|
||||
| Date | date | | X | | |
|
||||
| Date de facturation | invoice_date | | X | | |
|
||||
| Journal/ID | journal_id/id | | X | | à remplacer |
|
||||
| Journal/Nom du journal | journal_id/name | | X | | à supprimer |
|
||||
| Numéro | name | | X | | |
|
||||
| Référence | ref | | X | | |
|
||||
| Référence du paiement | payment_ref | | X | | |
|
||||
| Partenaire/ID | partner_id/id | | X | | |
|
||||
| Partenaire/Nom | partner_id/name | | X | | |
|
||||
| Paiements/ID | id | | X | | |
|
||||
| Paiements/ID | id | | X | | |
|
||||
| Bon de commande / ID | id | | X | | |
|
||||
| Note de frais/ID | | X | | |
|
||||
| Note de frais/ID | | X | | |
|
||||
| Écritures comptables/ID | line_ids/id | | X | | |
|
||||
| Écritures comptables/Type d'affichage | line_ids/display_type | | X | | doit etre présent sur ttes les lignes |
|
||||
| Écritures comptables/Pièce comptable/ID | line_ids/move_id/id | X | | | |
|
||||
| Écritures comptables/Compte/Code | line_ids/account_id/code | | X | Écritures comptables/Compte | à tester |
|
||||
| Écritures comptables/Libellé | line_ids/name | | X | | |
|
||||
| Écritures comptables/Date d'échéance | line_ids/date_maturity | | X | | |
|
||||
| Écritures comptables/Date de début | line_ids/start_date | | X | | |
|
||||
| Écritures comptables/Date de fin | line_ids/end_date | | X | | |
|
||||
| Écritures comptables/Ligne d'avoir/ID | line_ids/refund_line_ids/id | | X | | |
|
||||
| Écritures comptables/Partenaire/ID | line_ids/partner_id/id | | x | | à vérifier |
|
||||
| Écritures comptables/Unité de mesure/ID | line_ids/product_uom_id/id | | x | | |
|
||||
| Écritures comptables/Débit | line_ids/debit | | | | |
|
||||
| Écritures comptables/Crédit | line_ids/credit | | | | |
|
||||
| Écritures comptables/Produit/ID | line_ids/product_id/id | | | | |
|
||||
| Écritures comptables/Prix unitaire | line_ids/price_unit | | | | |
|
||||
| Écritures comptables/Quantité | line_ids/quantity | | | | |
|
||||
| Écritures comptables/Remise % | line_ids/discount | | | | |
|
||||
| Écritures comptables/Remise fixe | line_ids/discount_fixed | | | | |
|
||||
| Écritures comptables/Taxes/ID | line_ids/tax_ids/id | | | | à remplacer |
|
||||
| Écritures comptables/Taxes | line_ids/tax_ids/id | X | | | à supprimer |
|
||||
| Écritures comptables/Ligne de répartition de la taxe d'origine/ID | line_ids/tax_repartition_line_id/id | | | | à remplacer |
|
||||
| Écritures comptables/Ligne de répartition de la taxe d'origine/Taxe |line_ids/tax_repartition_line_id/tax_id | X | | | à supprimer |
|
||||
| Écritures comptables/Ligne de répartition de la taxe d'origine/Basé sur | line_ids/tax_repartition_line_id/repartition_type | X | | | à supprimer |
|
||||
| Écritures comptables/Ligne de répartition de la taxe d'origine/Type de documents | line_ids/tax_repartition_line_id/document_type | X | | |à supprimer |
|
||||
|
||||
### Migrate bank statements
|
||||
|
||||
@ -232,8 +254,196 @@ On fait 2 imports successifs:
|
||||
|
||||
### Migrate sale.order
|
||||
|
||||
| Nom | Nom (mode développeur) | Nouveau nom de colonne | Changements à faire |
|
||||
| ------ | ---------------------------------------------------------- | ----------------------------- | ---------------------------- |
|
||||
| ID externe
|
||||
| Adresse de facturation/ID externe | | | |
|
||||
| Adresse de livraison/ID externe | | | |
|
||||
| Client
|
||||
| Client/ID externe
|
||||
| Date de création
|
||||
| Date de la commande
|
||||
| Date de livraison
|
||||
| Lignes de la commande/ID externe
|
||||
| Lignes de la commande/Lignes de facture/ID externe | | Fusionner les valeurs dans une même cellule par ligne de commande, avec la virgule comme séparateur
|
||||
| Lignes de la commande/Article/ID externe | | Lignes de la commande/Produit/ID externe | |
|
||||
| Lignes de la commande/Description | | Lignes de commande/Description | |
|
||||
| Lignes de la commande/Est un acompte
|
||||
| Lignes de la commande/Est une dépense
|
||||
| Lignes de la commande/Est une livraison
|
||||
| Lignes de la commande/Prix unitaire
|
||||
| Lignes de la commande/Quantité
|
||||
| Lignes de la commande/Remise %
|
||||
| Lignes de la commande/Séquence
|
||||
| Lignes de la commande/Taxes/ID externe | | Remplacer les ids |
|
||||
| Lignes de la commande/Type d'affichage
|
||||
| Lignes de la commande/Unité de mesure/ID externe
|
||||
| Lignes de la commande/Statut | | Statut | Remplacer |
|
||||
| Référence client |
|
||||
| Référence commande |
|
||||
|
||||
### Migrate purchase.order
|
||||
|
||||
|
||||
| Nom | Nom (mode développeur) | Nouveau nom de colonne | Changements à faire |
|
||||
| ------ | ---------------------------------------------------------- | ----------------------------- | ---------------------------- |
|
||||
| ID externe
|
||||
| Fournisseur
|
||||
| Fournisseur/ID externe
|
||||
| Créé le
|
||||
| Date de réception | date_planned | Arrivée prévue
|
||||
| Date de confirmation | date_approved
|
||||
| Référence client |
|
||||
| Référence commande |
|
||||
| Lignes de la commande/ID externe
|
||||
| Lignes de la commande/Lignes de facture/ID externe | | Fusionner les valeurs dans une même cellule par ligne de commande, avec la virgule comme séparateur
|
||||
| Lignes de la commande/Article/ID externe | | Lignes de la commande/Produit/ID externe | |
|
||||
| Lignes de la commande/Description | | Lignes de commande/Description | |
|
||||
| Lignes de la commande/Prix unitaire
|
||||
| Lignes de la commande/Quantité
|
||||
| Lignes de la commande/Séquence
|
||||
| Lignes de la commande/Taxes/ID externe | | Remplacer les ids |
|
||||
| Lignes de la commande/Type d'affichage
|
||||
| Lignes de la commande/Unité de mesure/ID externe
|
||||
| Lignes de la commande/Statut | | Statut | Remplacer |
|
||||
|
||||
|
||||
|
||||
### Migrate hr.expense
|
||||
|
||||
| Nom | Nom (mode développeur) | Nouveau nom de colonne | Changements à faire |
|
||||
| ------ | ---------------------------------------------------------- | ----------------------------- | ---------------------------- |
|
||||
| ID externe
|
||||
| Article/ID externe | product_id/id | Catégorie/ID externe | |
|
||||
| Prix unitaire | | | Ne pas importer |
|
||||
| Total | total_amount | Total | |
|
||||
| Quantité
|
||||
| Taxes/ID externe | tax_ids/id | Taxes comprises/ID externe | Remplir toutes les lignes, remplacer les ids, remplacer les taxes non ttc en leur équivalent ttc |
|
||||
| Payé par | payment_mode | | Ne conserver que 'Société' et 'Employé (à rembourser'). Convertir les autres |
|
||||
| | | Moyen de réglement/ID externe | Définir pour chaque mode de paiement l'enregistrement account.payment.method.line correspondant |
|
||||
| Référence de la facture | ref | Référence de la facture | |
|
||||
| Date de la dépense | date
|
||||
| Compte/Code | account_id/code | Compte | |
|
||||
| Employé/ID externe | employee_id/id
|
||||
| Description | name
|
||||
| Notes... | description | Notes interne
|
||||
|
||||
### Migrate hr.expense.sheet
|
||||
|
||||
| Nom | Nom (mode développeur) | Modèle | Nouveau nom de colonne | Changements à faire |
|
||||
| ------ | ------------------------------------|--------------------- | ----------------------------- | ---------------------------- |
|
||||
| ID externe | id | hr.expense.sheet
|
||||
| Statut | status
|
||||
| Résumé de la note de frais | name | | Résumé de la dépense
|
||||
| Employé | employee_id | | Ne pas importer |
|
||||
| Employé/ID externe | employee_id/id | hr.employee | | |
|
||||
| Payé par | payment_mode | | Payé par | Ne conserver que 'Société' et 'Employé (à rembourser'). Convertir les autres |
|
||||
| | | Moyen de réglement/ID externe | Définir pour chaque mode de paiement l'enregistrement account.payment.method.line correspondant |
|
||||
| Journal de banque | journal_id |
|
||||
| Journal de banque/ID externe | journal_id/id | account.journal | | Ne pas importer
|
||||
| Date comptable | accounting_date | | Date de la dépense | Dupliquer dans une colonne Date de validation (à importer aussi) |
|
||||
| Pièce comptable | account_move_id | account.move |
|
||||
| Lignes de frais/id_externe | expense_line_ids/id | hr.expense |
|
||||
|
||||
### Migrate `hr.contribution.register` (Paye/Configuration/Registres des contributions)
|
||||
|
||||
| Nom | Nom (mode développeur) | Modèle | Nouveau nom de colonne | Changements à faire |
|
||||
| ------ | ------------------------------------|--------------------- | ----------------------------- | ---------------------------- |
|
||||
| ID externe | id | hr.contribution.register
|
||||
| Nom | name
|
||||
| Description | description
|
||||
| Partenaire | partner_id | | | Ne pas importer
|
||||
| Partenaire/Id externe | partner_id/id | res.partner |
|
||||
|
||||
### Migrate `hr.salary.rule.category` (Paye/Configuration/Catégorie de règle pour le salaire)
|
||||
|
||||
| Nom | Nom (mode développeur) | Modèle | Nouveau nom de colonne | Changements à faire |
|
||||
| ------ | ------------------------------------|--------------------- | ----------------------------- | ---------------------------- |
|
||||
| ID externe | id | hr.salary.rule.category |
|
||||
| Nom | name
|
||||
| Code | code
|
||||
| Description | description
|
||||
| Parent | parent_id | | | Ne pas importer
|
||||
| Parent/Id externe | parent_id/id | hr.salary.rule.category |
|
||||
|
||||
### Migrate `hr.salary.rule` (Paye/Configuration/Règles salariales)
|
||||
|
||||
Ne pas oublier d'importer les règles enfants à partir de la vue tree
|
||||
|
||||
| Nom | Nom (mode développeur) | Modèle | Nouveau nom de colonne | Changements à faire |
|
||||
| ------ | ------------------------------------|--------------------- | ----------------------------- | ---------------------------- |
|
||||
| ID externe | id | hr.salary.rule |
|
||||
| Apparaît sur le bulletin de paye | appears_on_payslip |
|
||||
| Catégorie/Id externe | category_id/id |
|
||||
| Code | code
|
||||
| Actif | active
|
||||
| Séquence | sequence
|
||||
| Description | description
|
||||
| Condition basée sur | condition_select
|
||||
| Condition python | condition_python
|
||||
| Plage basée sur | condition_range
|
||||
| Plage minimum | condition_range_min
|
||||
| Plage maximum | condition_range_max
|
||||
| Type de montant | amount_select |
|
||||
| Quantité | quantity
|
||||
| Montant fixe | amount_fix
|
||||
| POurcentage % | amount_percentage
|
||||
| Pourcentage basé sur | amount_percentage_base
|
||||
| Code python | amount_python_compute
|
||||
| Règle salariale parent/ID externe | parent_rule_id/id | | Placer à la fin |
|
||||
| Registre de contribution/ID externe | register_id/id | hr.contribution.register
|
||||
| Compte de débit/Code | account_debit/code | account.account | Compte de débit |
|
||||
| Compte de crédit/Code | account_credit/code | account.account | Compte de crédit
|
||||
| Compte analytique | analytic_account_id | account.analytic.account
|
||||
| Taxe | account_tax_id | account.tax |
|
||||
| Entrées/ID externe | input_ids/id | hr.rule.input
|
||||
| Entrées/Description | input_ids/name
|
||||
| Entrées/Code | input_ids/code
|
||||
|
||||
|
||||
### Migrate hr.payroll.structure
|
||||
|
||||
| Nom | Nom (mode développeur) | Modèle | Nouveau nom de colonne | Changements à faire |
|
||||
| ------ | ------------------------------------|--------------------- | ----------------------------- | ---------------------------- |
|
||||
| ID externe | id | hr.payroll.structure |
|
||||
| Nom | name
|
||||
| Parent/ID externe | parent_id/id | hr.payroll.structure
|
||||
| Référence | ref
|
||||
| Description | description
|
||||
| Règles salariales/ID externe | rule_ids/id
|
||||
|
||||
### Migrate hr.job
|
||||
|
||||
| Nom | Nom (mode développeur) | Nouveau nom de colonne | Changements à faire |
|
||||
| ------ | ---------------------------------------------------------- | ----------------------------- | ---------------------------- |
|
||||
| Id externe | id | | |
|
||||
| Poste occupé | name | Poste | |
|
||||
| Description | description
|
||||
|
||||
### Migrate hr.contract
|
||||
|
||||
| Nom | Nom (mode développeur) | Nouveau nom de colonne | Changements à faire |
|
||||
| ------ | ---------------------------------------------------------- | ----------------------------- | ---------------------------- |
|
||||
| Id externe | id | | |
|
||||
| Actif | active | | |
|
||||
| Date de début | date_start | | |
|
||||
| Date de fin | date_end | | |
|
||||
| Employé | | | |
|
||||
| Employee/ID externe | employee_id | | |
|
||||
| Fin de la période d'essai | trial_end_date | | |
|
||||
| Journal des salaires/ID externe | journal_id | | |
|
||||
| Notes | notes | | |
|
||||
| Poste occupé/Id externe | job_id | | |
|
||||
| Référence du contrat | name | | |
|
||||
| Salaire | wage | | |
|
||||
| Statut | state | | |
|
||||
| Structure salariale/ID externe | struct_id/id | | |
|
||||
| Type de structure de salaire | structure_type_id/id | | |
|
||||
| Paie plannifiée | | | |
|
||||
| Heures de travail/ID externe | resource_calendar_id/id | | Remplacer les id |
|
||||
|
||||
### Migrate hr.payroll
|
||||
|
||||
### Import account.move state
|
||||
| Nom | Nom (dev_mode) |
|
||||
|-------------|------------------------------------|
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
"maintainers": ["makayabou"],
|
||||
"website": "https://git.legaragenumerique.fr",
|
||||
"depends": [
|
||||
"account",
|
||||
"sale_stock",
|
||||
],
|
||||
"license": "LGPL-3",
|
||||
}
|
||||
|
||||
@ -3,3 +3,6 @@ from . import statement_line
|
||||
from . import account_move
|
||||
from . import account_move_line
|
||||
from . import account_payment
|
||||
from . import sale_order
|
||||
from . import purchase_order
|
||||
from . import expense_sheet
|
||||
|
||||
@ -1,4 +1,6 @@
|
||||
from odoo import models, fields, api
|
||||
import logging
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class AccountMoveLine(models.Model):
|
||||
_inherit = 'account.move.line'
|
||||
@ -21,3 +23,19 @@ class AccountMoveLine(models.Model):
|
||||
readonly=False,
|
||||
help='Credit journal items that are matched with this journal item.',
|
||||
)
|
||||
@api.constrains('account_id', 'display_type')
|
||||
def _check_payable_receivable(self):
|
||||
for line in self:
|
||||
account_type = line.account_id.account_type
|
||||
if line.move_id.is_sale_document(include_receipts=True):
|
||||
if account_type == 'liability_payable':
|
||||
raise UserError(_("Account %s is of payable type, but is used in a sale operation.", line.account_id.code))
|
||||
if (line.display_type == 'payment_term') ^ (account_type == 'asset_receivable'):
|
||||
_logger.debug("Error receivable on %s: %s - %s (%s)", line.name, line.date_maturity, line.account_id.code, line.account_id.account_type)
|
||||
raise UserError(_("Any journal item on a receivable account must have a due date and vice versa."))
|
||||
if line.move_id.is_purchase_document(include_receipts=True):
|
||||
if account_type == 'asset_receivable':
|
||||
raise UserError(_("Account %s is of receivable type, but is used in a purchase operation.", line.account_id.code))
|
||||
if (line.display_type == 'payment_term') ^ (account_type == 'liability_payable'):
|
||||
_logger.debug("Error payable on %s: %s - %s (%s)", line.date, line.date_maturity, line.account_id.code, line.account_id.account_type)
|
||||
raise UserError(_("Any journal item on a payable account must have a due date and vice versa."))
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
from odoo import models, fields, api
|
||||
from odoo.exceptions import UserError
|
||||
from odoo import models, _, fields, api
|
||||
from odoo.exceptions import UserError, ValidationError
|
||||
import json
|
||||
import base64
|
||||
import logging
|
||||
@ -7,7 +7,7 @@ _logger = logging.getLogger(__name__)
|
||||
|
||||
class AccountPayment(models.Model):
|
||||
_inherit = 'account.payment'
|
||||
|
||||
|
||||
def load(self, import_fields, merged_data):
|
||||
_logger.debug("Custom load for account.payment with import_fields: %s", import_fields)
|
||||
|
||||
@ -23,3 +23,16 @@ class AccountPayment(models.Model):
|
||||
return super().write(vals)
|
||||
_logger.debug("call raw write for account_payment")
|
||||
return models.Model.write(self, vals)
|
||||
|
||||
@api.constrains('payment_method_line_id')
|
||||
def _check_payment_method_line_id(self):
|
||||
''' Ensure the 'payment_method_line_id' field is not null.
|
||||
Can't be done using the regular 'required=True' because the field is a computed editable stored one.
|
||||
'''
|
||||
for pay in self:
|
||||
if not pay.payment_method_line_id:
|
||||
_logger.debug("no payment_method_line_id on payment %s on %s" % (pay.memo, pay.date))
|
||||
raise ValidationError(_("Please define a payment method line on your payment."))
|
||||
elif pay.payment_method_line_id.journal_id and pay.payment_method_line_id.journal_id != pay.journal_id:
|
||||
_logger.debug("inadequat payment_method_line %s for journal %s on payment %s on %s" % (pay.payment_method_line_id.id, pay.journal_id.name, pay.memo, pay.date))
|
||||
raise ValidationError(_("The selected payment method is not available for this payment, please select the payment method again."))
|
||||
|
||||
83
gn_import/models/expense_sheet.py
Normal file
83
gn_import/models/expense_sheet.py
Normal file
@ -0,0 +1,83 @@
|
||||
from odoo import models, _, fields, api
|
||||
from odoo.exceptions import AccessError, UserError, ValidationError, RedirectWarning
|
||||
import logging
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class HrExpense(models.Model):
|
||||
_inherit = ['hr.expense']
|
||||
|
||||
sheet_id = fields.Many2one(
|
||||
comodel_name='hr.expense.sheet',
|
||||
string="Expense Report",
|
||||
domain="[('employee_id', '=', employee_id), ('company_id', '=', company_id)]",
|
||||
readonly=False,
|
||||
copy=False,
|
||||
index=True,
|
||||
)
|
||||
|
||||
class HrExpenseSheet(models.Model):
|
||||
_inherit = ['hr.expense.sheet']
|
||||
|
||||
approval_date = fields.Datetime(string="Approval Date", readonly=False)
|
||||
|
||||
|
||||
'''
|
||||
@api.model
|
||||
def _default_employee_id(self):
|
||||
return self.env.user.employee_id
|
||||
|
||||
employee_id = fields.Many2one(
|
||||
comodel_name='hr.employee',
|
||||
string="Employee",
|
||||
required=True,
|
||||
readonly=False, # False for import
|
||||
default=_default_employee_id,
|
||||
domain=[('filter_for_expense', '=', True)],
|
||||
check_company=True,
|
||||
tracking=True,
|
||||
)
|
||||
|
||||
payment_mode = fields.Selection(
|
||||
related='expense_line_ids.payment_mode',
|
||||
string="Paid By",
|
||||
tracking=True,
|
||||
readonly=False,
|
||||
)
|
||||
|
||||
account_move_ids = fields.One2many(
|
||||
string="Journal Entries",
|
||||
comodel_name='account.move', inverse_name='expense_sheet_id', readonly=False,
|
||||
)
|
||||
|
||||
def _get_expense_account_destination(self):
|
||||
self.ensure_one()
|
||||
_logger.debug("payment_mode for sheet %s: %s" % (self.name, self.payment_mode))
|
||||
if self.payment_mode == 'company_account':
|
||||
#journal = self.expense_outstanding_account_id.journal_id
|
||||
#_logger.debug("journal: %s", journal)
|
||||
_logger.debug("account from payment_line: %s", self.payment_method_line_id.payment_account_id)
|
||||
#_logger.debug("account from company settings: %s", journal.company_id.expense_outstanding_account_id)
|
||||
#account_dest = (
|
||||
# self.payment_method_line_id.payment_account_id
|
||||
# or journal.company_id.expense_outstanding_account_id
|
||||
#)
|
||||
account_dest = self.payment_method_line_id.payment_account_id
|
||||
if not account_dest:
|
||||
error_msg = _(
|
||||
"A default outstanding account must be defined in the settings for company-paid expenses. "
|
||||
"Or specify one in the Journal for the %(method)s payment method.",
|
||||
method=self.payment_method_line_id.display_name,
|
||||
)
|
||||
if self.env['res.config.settings'].has_access('write'):
|
||||
action = self.env.ref('hr_expense.action_hr_expense_configuration')
|
||||
raise RedirectWarning(error_msg, action=action.id, button_text=_("Go to settings"))
|
||||
else:
|
||||
raise UserError(error_msg)
|
||||
else:
|
||||
if not self.employee_id.sudo().work_contact_id:
|
||||
raise UserError(_("No work contact found for the employee %s, please configure one.", self.employee_id.name))
|
||||
partner = self.employee_id.sudo().work_contact_id.with_company(self.company_id)
|
||||
account_dest = partner.property_account_payable_id or partner.parent_id.property_account_payable_id
|
||||
return account_dest.id
|
||||
'''
|
||||
15
gn_import/models/purchase_order.py
Normal file
15
gn_import/models/purchase_order.py
Normal file
@ -0,0 +1,15 @@
|
||||
from odoo import models, fields, api
|
||||
from odoo.exceptions import UserError
|
||||
import json
|
||||
import base64
|
||||
import logging
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class PurchaseOrderLine(models.Model):
|
||||
_inherit = ['purchase.order.line']
|
||||
invoice_lines = fields.One2many('account.move.line', 'purchase_line_id', string="Bill Lines", readonly=False, copy=False)
|
||||
|
||||
class PurchaseOrder(models.Model):
|
||||
_inherit = ['purchase.order']
|
||||
date_approve = fields.Datetime('Confirmation Date', readonly=False, index=True, copy=False)
|
||||
|
||||
23
gn_import/models/sale_order.py
Normal file
23
gn_import/models/sale_order.py
Normal file
@ -0,0 +1,23 @@
|
||||
from odoo import models, fields, api
|
||||
from odoo.exceptions import UserError
|
||||
import json
|
||||
import base64
|
||||
import logging
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
SALE_ORDER_STATE = [
|
||||
('draft', "Quotation"),
|
||||
('sent', "Quotation Sent"),
|
||||
('sale', "Sales Order"),
|
||||
('cancel', "Cancelled"),
|
||||
]
|
||||
|
||||
class SaleOrder(models.Model):
|
||||
_inherit = 'sale.order'
|
||||
|
||||
state = fields.Selection(
|
||||
selection=SALE_ORDER_STATE,
|
||||
string="Status",
|
||||
readonly=False, copy=False, index=True,
|
||||
tracking=3,
|
||||
default='draft')
|
||||
19
gn_payment/README.md
Normal file
19
gn_payment/README.md
Normal file
@ -0,0 +1,19 @@
|
||||
# GN Payment
|
||||
|
||||
Ce module permet d'utiliser des modes de paiement personnalisés.
|
||||
|
||||
Il hérite du modèle account.journal pour en surcharger deux méthodes:
|
||||
_default_inbound_payment_methods et _default_outbound_payment_methods,
|
||||
pour qu'elles renvoient l'ensemble des méthodes de paiement associées
|
||||
aux modes de paiement qui autorisent le journal.
|
||||
Pour déclencher la méthode _compute_inbound_payment_method_line_ids ou
|
||||
_compute_outbound_payment_method_line_ids qui font appel à ces
|
||||
méthodes, il suffit de définir la devise ou le type de journal,
|
||||
ce qui a pour conséquence de créer les lignes de paiement pour le journal.
|
||||
|
||||
Le module crée aussi des enregistrements de base pour account.payment.mode
|
||||
et account.payment.method.
|
||||
|
||||
## Changelog
|
||||
|
||||
- v0.0.1
|
||||
2
gn_payment/__init__.py
Normal file
2
gn_payment/__init__.py
Normal file
@ -0,0 +1,2 @@
|
||||
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
|
||||
from . import models
|
||||
18
gn_payment/__manifest__.py
Normal file
18
gn_payment/__manifest__.py
Normal file
@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "GN - Payments",
|
||||
"version": "18.0.0.0.1",
|
||||
"category": "Accounting",
|
||||
"summary": "Allows to create payment methods",
|
||||
"author": "Le Garage Numérique",
|
||||
"maintainers": ["makayabou"],
|
||||
"website": "https://git.legaragenumerique.fr",
|
||||
"depends": [
|
||||
"account",
|
||||
"account_payment_unece",
|
||||
],
|
||||
"data": [
|
||||
"data/account_payment_methods.xml",
|
||||
"data/account_payment_modes.xml",
|
||||
],
|
||||
"license": "LGPL-3",
|
||||
}
|
||||
62
gn_payment/data/account_payment_methods.xml
Normal file
62
gn_payment/data/account_payment_methods.xml
Normal file
@ -0,0 +1,62 @@
|
||||
<odoo>
|
||||
<record id="gn_payment.account_payment_method_virement_entrant" model="account.payment.method">
|
||||
<field name="name">Virement entrant</field>
|
||||
<field name="code">VIREMENT_IN</field>
|
||||
<field name="payment_type">inbound</field>
|
||||
<field name="unece_id" ref="account_payment_unece.payment_means_30"/>
|
||||
</record>
|
||||
<record id="gn_payment.account_payment_method_virement_sortant" model="account.payment.method">
|
||||
<field name="name">Virement sortant</field>
|
||||
<field name="code">VIREMENT_OUT</field>
|
||||
<field name="payment_type">outbound</field>
|
||||
<field name="unece_id" ref="account_payment_unece.payment_means_30"/>
|
||||
</record>
|
||||
<record id="gn_payment.account_payment_method_prelevement_entrant" model="account.payment.method">
|
||||
<field name="name">Prélévement entrant</field>
|
||||
<field name="code">PRELEVEMENT_IN</field>
|
||||
<field name="payment_type">inbound</field>
|
||||
<field name="unece_id" ref="account_payment_unece.payment_means_31"/>
|
||||
</record>
|
||||
<record id="gn_payment.account_payment_method_prelevement_sortant" model="account.payment.method">
|
||||
<field name="name">Prélévement sortant</field>
|
||||
<field name="code">PRELEVEMENT_OUT</field>
|
||||
<field name="payment_type">outbound</field>
|
||||
<field name="unece_id" ref="account_payment_unece.payment_means_31"/>
|
||||
</record>
|
||||
<record id="gn_payment.account_payment_method_cash_entrant" model="account.payment.method">
|
||||
<field name="name">Cash entrant</field>
|
||||
<field name="code">CASH_IN</field>
|
||||
<field name="payment_type">inbound</field>
|
||||
<field name="unece_id" ref="account_payment_unece.payment_means_10"/>
|
||||
</record>
|
||||
<record id="gn_payment.account_payment_method_cash_sortant" model="account.payment.method">
|
||||
<field name="name">Cash sortant</field>
|
||||
<field name="code">CASH_OUT</field>
|
||||
<field name="payment_type">outbound</field>
|
||||
<field name="unece_id" ref="account_payment_unece.payment_means_10"/>
|
||||
</record>
|
||||
<record id="gn_payment.account_payment_method_cheque_entrant" model="account.payment.method">
|
||||
<field name="name">Chèque entrant</field>
|
||||
<field name="code">CHEQUE_IN</field>
|
||||
<field name="payment_type">inbound</field>
|
||||
<field name="unece_id" ref="account_payment_unece.payment_means_20"/>
|
||||
</record>
|
||||
<record id="gn_payment.account_payment_method_cheque_sortant" model="account.payment.method">
|
||||
<field name="name">Chèque sortant</field>
|
||||
<field name="code">CHEQUE_OUT</field>
|
||||
<field name="payment_type">outbound</field>
|
||||
<field name="unece_id" ref="account_payment_unece.payment_means_20"/>
|
||||
</record>
|
||||
<record id="gn_payment.account_payment_method_cb_flo_0130_sortant" model="account.payment.method">
|
||||
<field name="name">CB Florian 0130 sortant</field>
|
||||
<field name="code">CB_FLO_0130_OUT</field>
|
||||
<field name="payment_type">outbound</field>
|
||||
<field name="unece_id" ref="account_payment_unece.payment_means_48"/>
|
||||
</record>
|
||||
<record id="gn_payment.account_payment_method_cb_brice_7156_sortant" model="account.payment.method">
|
||||
<field name="name">CB Brice 7156 sortant</field>
|
||||
<field name="code">CB_BRICE_7156_OUT</field>
|
||||
<field name="payment_type">outbound</field>
|
||||
<field name="unece_id" ref="account_payment_unece.payment_means_48"/>
|
||||
</record>
|
||||
</odoo>
|
||||
62
gn_payment/data/account_payment_modes.xml
Normal file
62
gn_payment/data/account_payment_modes.xml
Normal file
@ -0,0 +1,62 @@
|
||||
<odoo>
|
||||
<record id="gn_payment.account_payment_mode_virement_entrant" model="account.payment.mode">
|
||||
<field name="name">Virement entrant</field>
|
||||
<field name="payment_method_id" ref="gn_payment.account_payment_method_virement_entrant"/>
|
||||
<field name="payment_type">inbound</field>
|
||||
<field name="bank_account_link">variable</field>
|
||||
</record>
|
||||
<record id="gn_payment.account_payment_mode_virement_sortant" model="account.payment.mode">
|
||||
<field name="name">Virement sortant</field>
|
||||
<field name="payment_method_id" ref="gn_payment.account_payment_method_virement_sortant"/>
|
||||
<field name="payment_type">outbound</field>
|
||||
<field name="bank_account_link">variable</field>
|
||||
</record>
|
||||
<record id="gn_payment.account_payment_mode_prelevement_entrant" model="account.payment.mode">
|
||||
<field name="name">Prélévement entrant</field>
|
||||
<field name="payment_method_id" ref="gn_payment.account_payment_method_prelevement_entrant"/>
|
||||
<field name="payment_type">inbound</field>
|
||||
<field name="bank_account_link">variable</field>
|
||||
</record>
|
||||
<record id="gn_payment.account_payment_mode_prelevement_sortant" model="account.payment.mode">
|
||||
<field name="name">Prélévement sortant</field>
|
||||
<field name="payment_method_id" ref="gn_payment.account_payment_method_prelevement_sortant"/>
|
||||
<field name="payment_type">outbound</field>
|
||||
<field name="bank_account_link">variable</field>
|
||||
</record>
|
||||
<record id="gn_payment.account_payment_mode_cash_entrant" model="account.payment.mode">
|
||||
<field name="name">Cash entrant</field>
|
||||
<field name="payment_method_id" ref="gn_payment.account_payment_method_cash_entrant"/>
|
||||
<field name="payment_type">inbound</field>
|
||||
<field name="bank_account_link">variable</field>
|
||||
</record>
|
||||
<record id="gn_payment.account_payment_mode_cash_sortant" model="account.payment.mode">
|
||||
<field name="name">Cash sortant</field>
|
||||
<field name="payment_method_id" ref="gn_payment.account_payment_method_cash_sortant"/>
|
||||
<field name="payment_type">outbound</field>
|
||||
<field name="bank_account_link">variable</field>
|
||||
</record>
|
||||
<record id="gn_payment.account_payment_mode_cheque_entrant" model="account.payment.mode">
|
||||
<field name="name">Chèque entrant</field>
|
||||
<field name="payment_method_id" ref="gn_payment.account_payment_method_cheque_entrant"/>
|
||||
<field name="payment_type">inbound</field>
|
||||
<field name="bank_account_link">variable</field>
|
||||
</record>
|
||||
<record id="gn_payment.account_payment_mode_cheque_sortant" model="account.payment.mode">
|
||||
<field name="name">Chèque sortant</field>
|
||||
<field name="payment_method_id" ref="gn_payment.account_payment_method_cheque_sortant"/>
|
||||
<field name="payment_type">outbound</field>
|
||||
<field name="bank_account_link">variable</field>
|
||||
</record>
|
||||
<record id="gn_payment.account_payment_mode_cb_flo_0130_sortant" model="account.payment.mode">
|
||||
<field name="name">CB Florian 0130 sortant</field>
|
||||
<field name="payment_method_id" ref="gn_payment.account_payment_method_cb_flo_0130_sortant"/>
|
||||
<field name="payment_type">outbound</field>
|
||||
<field name="bank_account_link">variable</field>
|
||||
</record>
|
||||
<record id="gn_payment.account_payment_mode_cb_brice_7156_sortant" model="account.payment.mode">
|
||||
<field name="name">CB Brice 7156 sortant</field>
|
||||
<field name="payment_method_id" ref="gn_payment.account_payment_method_cb_brice_7156_sortant"/>
|
||||
<field name="payment_type">outbound</field>
|
||||
<field name="bank_account_link">variable</field>
|
||||
</record>
|
||||
</odoo>
|
||||
1
gn_payment/models/__init__.py
Normal file
1
gn_payment/models/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
from . import account_journal
|
||||
14
gn_payment/models/account_journal.py
Normal file
14
gn_payment/models/account_journal.py
Normal file
@ -0,0 +1,14 @@
|
||||
from odoo import models, fields, api
|
||||
import logging
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class AccountJournal(models.Model):
|
||||
_inherit = ['account.journal']
|
||||
|
||||
def _default_inbound_payment_methods(self):
|
||||
modes = self.env['account.payment.mode'].search([("payment_type", "=", "inbound"), '|', ("fixed_journal_id", "=", self.id), ("variable_journal_ids", "in", self.id)])
|
||||
return modes.mapped('payment_method_id')
|
||||
|
||||
def _default_outbound_payment_methods(self):
|
||||
modes = self.env['account.payment.mode'].search([("payment_type", "=", "outbound"), '|', ("fixed_journal_id", "=", self.id), ("variable_journal_ids", "in", self.id)])
|
||||
return modes.mapped('payment_method_id')
|
||||
Loading…
x
Reference in New Issue
Block a user