Compare commits

...

4 Commits

Author SHA1 Message Date
Florian du Garage Num
8b989218f6 import expenses and purchase orders 2025-08-31 07:44:03 +02:00
Florian du Garage Num
8a019fe6a2 add sale_order 2025-08-30 03:05:14 +02:00
Florian du Garage Num
6f8ce3f1d4 module gn_payment 2025-08-29 03:01:42 +02:00
Florian du Garage Num
5b809b83c4 add payable/receiver log for import account.move 2025-08-28 21:35:19 +02:00
16 changed files with 602 additions and 58 deletions

View File

@ -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 |

View File

@ -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) |
|-------------|------------------------------------|

View File

@ -7,7 +7,7 @@
"maintainers": ["makayabou"],
"website": "https://git.legaragenumerique.fr",
"depends": [
"account",
"sale_stock",
],
"license": "LGPL-3",
}

View File

@ -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

View File

@ -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."))

View File

@ -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."))

View 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
'''

View 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)

View 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
View 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
View File

@ -0,0 +1,2 @@
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
from . import models

View 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",
}

View 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>

View 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>

View File

@ -0,0 +1 @@
from . import account_journal

View 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')