diff --git a/account_credit_hold/__init__.py b/account_credit_hold/__init__.py deleted file mode 100644 index 0650744..0000000 --- a/account_credit_hold/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import models diff --git a/account_credit_hold/__manifest__.py b/account_credit_hold/__manifest__.py deleted file mode 100644 index e60291f..0000000 --- a/account_credit_hold/__manifest__.py +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "Account Credit Hold", - "version": "17.0.1.1.1", - "summary": "Allows setting clients on credit hold, blocking the ability confirm a new sales order.", - "category": "Accounting/Accounting", - "author": "Bemade Inc.", - "maintainer": "Marc Durepos ", - "website": "http://www.bemade.org", - "license": "LGPL-3", - "depends": ["sale", "account_followup", "stock"], - "data": [ - "views/account_followup_views.xml", - "views/sale_order_views.xml", - "views/res_partner_views.xml", - "views/stock_picking_views.xml", - ], - "demo": [], - "installable": True, - "auto_install": False, -} diff --git a/account_credit_hold/migration18.md b/account_credit_hold/migration18.md deleted file mode 100644 index b6f7efd..0000000 --- a/account_credit_hold/migration18.md +++ /dev/null @@ -1,246 +0,0 @@ -# Migration vers Odoo 18.0 - Module account_credit_hold - -## Fonctionnalités -- Ajoute un champ "Place on Credit Hold" sur les lignes de suivi de compte (account_followup.followup.line) -- Ajoute des champs et fonctionnalités sur les partenaires: - - postpone_hold_until: Date de report du blocage - - hold_bg: Champ technique pour le statut de blocage - - on_hold: État calculé du blocage de crédit -- Bloque la confirmation des commandes de vente si le client est en blocage de crédit -- Ajoute des indicateurs visuels (ruban rouge) sur: - - Commandes de vente - - Fiches partenaires - - Transferts de stock -- Ajoute des boutons pour mettre/lever le blocage de crédit dans la vue de suivi des comptes - -## Analyse pour la Migration - -### Dépendances -- sale -- account_followup -- stock - -### Changements Techniques Requis -1. Mettre à jour la version dans __manifest__.py vers 18.0 -2. Vérifier la compatibilité des vues XML avec Odoo 18.0 -3. Vérifier si des changements dans l'API account_followup en 18.0 - -### Points d'Attention -1. Le module utilise l'héritage de vues et de modèles standard d'Odoo: - - account_followup.followup.line - - res.partner - - sale.order - - stock.picking - - account.followup.report - -2. Fonctionnalités critiques à tester après migration: - - Calcul automatique du statut on_hold - - Blocage de la confirmation des commandes - - Nettoyage automatique des reports de blocage expirés (@api.autovacuum) - - Affichage correct des rubans d'avertissement - - Propagation du statut hold aux contacts liés (commercial_partner_id) - -3. Implémentation Technique: - - Utilisation de champs computed avec store=True et compute_sudo=True - - Mécanisme de nettoyage automatique via @api.autovacuum - - Héritage de _execute_followup_partner pour automatisation du hold - - Messages de chatter automatiques lors des changements de statut - -4. Points Spécifiques aux Vues: - - Utilisation du widget web_ribbon pour les indicateurs visuels - - Boutons conditionnels dans la vue de suivi des comptes - - Champs invisibles pour la logique d'affichage (hold_bg, on_hold) - - Groupes de sécurité sur le champ postpone_hold_until - -## Questions et Considérations - -1. Vérifier si Odoo 18.0 n'a pas introduit des fonctionnalités natives similaires dans account_followup: - - Système de blocage automatique des clients - - Gestion des périodes de grâce - - Indicateurs visuels de blocage - -2. Points à valider: - - La structure des vues héritées est-elle identique en 18.0? - - Les champs related et computed fonctionnent-ils de la même manière? - - Le système de suivi des comptes (account_followup) a-t-il évolué? - - Le décorateur @api.autovacuum est-il toujours supporté? - - Le widget web_ribbon utilise-t-il toujours la même API? - -3. Considérations d'Architecture: - - Le mécanisme de propagation du statut hold via commercial_partner_id est-il optimal? - - Possibilité de simplifier la logique de calcul du statut hold? - - Pertinence de stocker le champ hold_bg vs calcul à la demande - -4. Alternatives Potentielles: - - Utiliser le système de credit limit natif d'Odoo avec des règles personnalisées? - - Intégrer avec le système de blocage des partenaires d'Odoo? - - Utiliser les étapes de facturation (invoice_status) plutôt qu'un champ séparé? - -## Alternatives Natives Odoo 18.0 - -### Système de Crédit Natif -1. Odoo 18.0 inclut des fonctionnalités natives de gestion de crédit: - - Champ `credit_limit` sur res.partner - - Configuration du blocage au niveau de la société - - Règles de blocage basées sur: - - Montant de crédit maximum - - Factures échues - - Âge des factures - -2. Possibilités d'utilisation des fonctionnalités natives: - - Utiliser `credit_limit` au lieu de `on_hold` - - Configurer les règles de blocage dans la configuration de la comptabilité - - Utiliser les notifications natives de dépassement de crédit - -### Améliorations Possibles -1. Intégration avec le système natif: - - Synchroniser notre `on_hold` avec le système natif de blocage - - Utiliser les API natives de vérification de crédit - - Conserver uniquement les fonctionnalités non disponibles nativement - -2. Simplification du code: - - Remplacer les champs custom par des champs natifs quand possible - - Utiliser le système d'alertes natif pour les rubans - - Intégrer avec le système de workflow natif - -## Recommandations pour la Migration - -### Approche "Vanilla First" -1. Évaluer chaque fonctionnalité custom: - - Est-elle disponible nativement dans Odoo 18.0? - - Peut-elle être remplacée par une configuration native? - - Le besoin business existe-t-il toujours? - -2. Prioriser l'utilisation des fonctionnalités natives: - - Système de crédit natif - - Système de workflow natif - - API de notification standard - - Widgets standards de l'interface - -### Modifications Techniques Recommandées -1. Remplacer les attributs obsolètes: - - Supprimer les `attrs` dans les vues (Odoo 16.0+) - - Utiliser `list` au lieu de `tree` (Odoo 17.0+) - - Adapter les widgets aux nouvelles conventions - -2. Optimisation des performances: - - Utiliser les indexes de base de données appropriés - - Optimiser les recherches et calculs - - Implémenter le lazy loading quand possible - -### Plan de Test Approfondi -1. Tests fonctionnels: - - Validation du comportement avec le système natif - - Tests de régression sur les fonctionnalités custom - - Vérification des performances - -2. Tests d'intégration: - - Interaction avec le workflow de vente - - Synchronisation avec la comptabilité - - Comportement avec les autres modules - -## État de la Migration -⚪ En analyse préliminaire - -## Plan de Migration - -### Étape 1: Analyse des Changements Odoo 18.0 -- [ ] Examiner les changements dans account_followup -- [ ] Vérifier les nouvelles fonctionnalités de gestion de crédit -- [ ] Analyser les modifications des vues héritées - -### Étape 2: Adaptation Technique -- [ ] Mise à jour du manifeste -- [ ] Vérification de la compatibilité des décorateurs -- [ ] Adaptation des vues XML si nécessaire -- [ ] Test des champs computed et related - -### Étape 3: Tests Fonctionnels -- [ ] Validation du mécanisme de hold -- [ ] Test de la propagation aux contacts -- [ ] Vérification des nettoyages automatiques -- [ ] Test des indicateurs visuels - -### Étape 4: Optimisation -- [ ] Évaluation des alternatives natives -- [ ] Simplification potentielle du code -- [ ] Amélioration des performances - -## Notes de Version -- Version originale: 17.0.1.1.1 -- Dernière analyse: 26/01/2025 - -## Fonctionnalités Natives dans Odoo 18.0 - -Odoo 18.0 inclut nativement plusieurs fonctionnalités de gestion du crédit : - -1. **Gestion des Limites de Crédit** - - Champ `credit_limit` sur les partenaires - - Champ `use_partner_credit_limit` pour activer/désactiver par partenaire - - Configuration globale `account_use_credit_limit` au niveau de la société - - Champ `credit` pour le total des créances - - Champ `trust` pour le niveau de confiance du débiteur - -2. **Visibilité et Contrôle** - - Champ `show_credit_limit` basé sur la configuration de la société - - Groupes de sécurité pour la gestion des limites de crédit - -### Différences avec Notre Module - -1. **Fonctionnalités à Migrer** - - [ ] Indicateurs visuels spécifiques pour les clients en dépassement - - [ ] Blocage automatique des commandes en dépassement - - [ ] Workflow d'approbation personnalisé - -2. **Fonctionnalités à Adapter** - - [ ] Utiliser les champs natifs plutôt que nos champs customs - - [ ] Intégrer nos règles de blocage avec le système natif - - [ ] Adapter les rapports et vues pour utiliser les champs natifs - -## Plan de Migration - -### Phase 1 : Préparation -1. **Analyse des Données** - - [ ] Identifier les clients avec des limites de crédit - - [ ] Mapper les champs actuels vers les champs natifs - - [ ] Lister les règles de blocage personnalisées - -2. **Configuration** - - [ ] Activer la gestion du crédit dans la configuration de la société - - [ ] Configurer les groupes de sécurité appropriés - - [ ] Préparer les scripts de migration des données - -### Phase 2 : Migration -1. **Migration des Données** - - [ ] Transférer les limites de crédit vers le champ natif - - [ ] Migrer les configurations de blocage - - [ ] Mettre à jour les vues et rapports - -2. **Développement** - - [ ] Adapter le code de blocage des commandes - - [ ] Implémenter les indicateurs visuels manquants - - [ ] Ajouter les fonctionnalités spécifiques non disponibles nativement - -### Phase 3 : Tests -1. **Validation Fonctionnelle** - - [ ] Tester les limites de crédit - - [ ] Vérifier le blocage des commandes - - [ ] Valider les workflows d'approbation - -2. **Tests d'Intégration** - - [ ] Tester avec les autres modules - - [ ] Vérifier la compatibilité avec les processus existants - -## État de la Migration -🟡 En cours d'analyse - Utilisation partielle des fonctionnalités natives - -## Notes Importantes -- La gestion du crédit est maintenant une fonctionnalité native d'Odoo -- Certaines fonctionnalités spécifiques devront être maintenues -- L'approche recommandée est d'utiliser au maximum les fonctionnalités natives et de ne conserver que les extensions nécessaires - -## Prochaines Étapes -1. Valider l'approche avec l'équipe -2. Créer les scripts de migration des données -3. Développer les fonctionnalités manquantes -4. Planifier la formation des utilisateurs \ No newline at end of file diff --git a/account_credit_hold/models/__init__.py b/account_credit_hold/models/__init__.py deleted file mode 100644 index 0c2c11c..0000000 --- a/account_credit_hold/models/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from . import account_followup -from . import res_partner -from . import sale_order -from . import stock_picking -from . import account_followup_report diff --git a/account_credit_hold/models/account_followup.py b/account_credit_hold/models/account_followup.py deleted file mode 100644 index 5af3363..0000000 --- a/account_credit_hold/models/account_followup.py +++ /dev/null @@ -1,8 +0,0 @@ -from odoo import fields, models, api - - -class FollowupLine(models.Model): - _inherit = 'account_followup.followup.line' - - account_hold = fields.Boolean(string="Place on Credit Hold", - help="Place clients on account hold, restricting confirmation of new orders.") diff --git a/account_credit_hold/models/account_followup_report.py b/account_credit_hold/models/account_followup_report.py deleted file mode 100644 index a28efdc..0000000 --- a/account_credit_hold/models/account_followup_report.py +++ /dev/null @@ -1,12 +0,0 @@ -from odoo import models, fields, api, _ - - -class FollowUpReport(models.AbstractModel): - _inherit = 'account.followup.report' - - def _get_line_info(self, followup_line): - res = super()._get_line_info(followup_line) - res.update({ - 'credit_hold': followup_line.account_hold - }) - return res diff --git a/account_credit_hold/models/res_partner.py b/account_credit_hold/models/res_partner.py deleted file mode 100644 index 7cdf9a1..0000000 --- a/account_credit_hold/models/res_partner.py +++ /dev/null @@ -1,80 +0,0 @@ -from odoo import fields, models, api, _ -from datetime import date - - -class Partner(models.Model): - _inherit = "res.partner" - - postpone_hold_until = fields.Date( - string="Postpone Hold", - help="Grace period specific to this partner despite unpaid invoices.", - tracking=True, - ) - - hold_bg = fields.Boolean( - string="Hold (technical)", - compute="_compute_hold_bg", - store=True, - default=False, - compute_sudo=True, - tracking=True, - ) - on_hold = fields.Boolean( - string="Account on Hold", - help="Client account is on hold for unpaid overdue invoices.", - compute="_compute_on_hold", - compute_sudo=True, - ) - - @api.depends("postpone_hold_until", "hold_bg") - def _compute_on_hold(self): - # manually re-compute hold_bg since followup_status doesn't get updated in Python but gets recalculated - # by an SQL query every time - self._compute_hold_bg() - for rec in self: - # If the parent company is on hold, so are all its sub-contacts and subsidiaries - if rec.commercial_partner_id and rec.commercial_partner_id.on_hold: - rec.on_hold = True - return - # If there is no parent company or the parent is not on hold, we compute for ourselves - if rec.hold_bg and not ( - rec.postpone_hold_until and rec.postpone_hold_until > date.today() - ): - rec.on_hold = True - else: - if rec.on_hold: - rec.message_post(_("Credit hold lifted.")) - rec.on_hold = False - - @api.autovacuum - def _cleanup_expired_hold_postponements(self): - expired_holds = self.search([("postpone_hold_until", "<=", date.today())]) - expired_holds.write({"postpone_hold_until": False}) - - def action_credit_hold(self): - for rec in self: - rec.hold_bg = True - rec.message_post(body=_("Placed on credit hold.")) - - def action_lift_credit_hold(self): - for rec in self: - rec.hold_bg = False - rec.message_post(body=_("Credit hold lifted.")) - - def _execute_followup_partner(self, options=None): - res = super()._execute_followup_partner(options) - if self.followup_status == "in_need_of_action": - if self.followup_line_id.account_hold: - self.action_credit_hold() - return res - - @api.depends("followup_status", "followup_line_id") - def _compute_hold_bg(self): - first_followup_level = self._get_first_followup_level() - for rec in self: - prev_hold_bg = rec.hold_bg - level = rec.followup_line_id - if rec.followup_status == "no_action_needed" and not level: - rec.hold_bg = False - else: - rec.hold_bg = prev_hold_bg diff --git a/account_credit_hold/models/sale_order.py b/account_credit_hold/models/sale_order.py deleted file mode 100644 index 390e97e..0000000 --- a/account_credit_hold/models/sale_order.py +++ /dev/null @@ -1,17 +0,0 @@ -from odoo import fields, models, api, _ -from odoo.exceptions import UserError - - -class SaleOrder(models.Model): - _inherit = "sale.order" - - client_on_hold = fields.Boolean(string='Client on Hold', - help="Whether or not a client has been put on hold due to unpaid invoices.", - related="partner_id.on_hold") - - @api.depends('client_on_hold') - def action_confirm(self): - if any(self.mapped('client_on_hold')): - raise UserError(_("This client is on credit hold. No new orders can be confirmed until past-due invoices " - "are paid or the accounting team postpones the hold.")) - super().action_confirm() diff --git a/account_credit_hold/models/stock_picking.py b/account_credit_hold/models/stock_picking.py deleted file mode 100644 index 0d46e32..0000000 --- a/account_credit_hold/models/stock_picking.py +++ /dev/null @@ -1,9 +0,0 @@ -from odoo import fields, models, api - - -class ModelName(models.Model): - _inherit = "stock.picking" - - client_on_hold = fields.Boolean(string='Client on Hold', - help="Whether or not a client has been put on hold due to unpaid invoices.", - related="partner_id.on_hold") diff --git a/account_credit_hold/readme.md b/account_credit_hold/readme.md deleted file mode 100644 index db624c3..0000000 --- a/account_credit_hold/readme.md +++ /dev/null @@ -1,40 +0,0 @@ -# Overview - -This module adds the notion of placing clients on credit hold to the followup levels from the Odoo Enterprise -account_followup module. It adds an option to followup levels to mark clients matching the followup criteria as on -credit hold. This hold restricts the confirmation of new sales orders for these clients. - -Accountant and admin users can set a date until which the account hold will be -postponed on a specific partner's form view. This effectively gives clients an extra -grace period, allowing orders to be confirmed until the period ends. - -# Change Log - -## 17.0.1.0.0 (2024-05-15) - -Various modifications to adapt code to Odoo 17.0 - -## 15.0.2.0.0 (2023-05-04) - -Complete remake of the module, making the "Credit Hold" an action that is either manually or -automatically triggered from the Accounting > Followup Reports section or by setting the automatic application field -on followup levels. - -## 15.0.1.1.0 (2023-05-03) - -Adds a ribbon to stock pickings for clients on hold, and therefore a dependency on stock. - -## 15.0.1.0.2 (2023-05-03) - -Fix to sale order view and sale order confirmation for clients not on hold. - -## 15.0.1.0.1 (2023-05-03) - -Fix clients on hold when status is "outstanding_invoices". - -## 15.0.1.0.0 (2023-05-02) Initial Release - -Initial release of the module, including a setting on follow-up levels to toggle placing on credit hold. Blocks -the confirmation of sales orders for clients on credit hold. Red "Credit Hold" banner appears on sales orders and -partner form view when a client is on credit hold. Credit hold can be postponed by setting the "Postpone Hold" field -on the partner form view. \ No newline at end of file diff --git a/account_credit_hold/views/account_followup_views.xml b/account_credit_hold/views/account_followup_views.xml deleted file mode 100644 index 962cd79..0000000 --- a/account_credit_hold/views/account_followup_views.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - account_credit_hold.account_followup_line.form - account_followup.followup.line - - - - - - - - customer.statements.form.view.inherit - res.partner - - - - -