import expenses and purchase orders

This commit is contained in:
Florian du Garage Num 2025-08-31 07:44:03 +02:00
parent 8a019fe6a2
commit 8b989218f6
4 changed files with 224 additions and 7 deletions

View File

@ -284,24 +284,141 @@ On fait 2 imports successifs:
### 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
| Prix unitaire | | | Ne pas importer |
| Total | total_amount | Total | |
| Quantité
| Taxes/ID externe | tax_ids/id
| Payé par | payment_mode
| Référence de la facture | ref
| 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... | description | Notes interne
# Migrate hr.payroll.structure
### 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
@ -323,7 +440,7 @@ On fait 2 imports successifs:
| 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 | | |
| Heures de travail/ID externe | resource_calendar_id/id | | Remplacer les id |
### Migrate hr.payroll

View File

@ -4,3 +4,5 @@ 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

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