diff --git a/customer_itch_cycle/__manifest__.py b/customer_itch_cycle/__manifest__.py
index 5c6d243..1f489f3 100644
--- a/customer_itch_cycle/__manifest__.py
+++ b/customer_itch_cycle/__manifest__.py
@@ -2,10 +2,16 @@
{
'name': 'Customer Itch Cycle Management',
'version': '1.0',
- 'depends': ['base', 'sale'],
- 'author': 'Your Name',
+ 'depends': [
+ 'base',
+ 'sale_stock'
+ ],
+ 'author': 'Benoit Vézina',
'category': 'Sales Management',
+ 'summary': 'Manage customer itch cycles by product for proactive sales engagement.',
+ 'website': 'https://www.bemade.org',
'description': "Manage customer itch cycles by product for proactive sales engagement.",
+ 'license': 'AGPL-3',
'data': [
'views/itch_cycle_product_partner_view.xml',
'views/res_partner_view.xml',
diff --git a/customer_itch_cycle/models/itch_cycle_product_partner.py b/customer_itch_cycle/models/itch_cycle_product_partner.py
index 7dae52b..d443659 100644
--- a/customer_itch_cycle/models/itch_cycle_product_partner.py
+++ b/customer_itch_cycle/models/itch_cycle_product_partner.py
@@ -56,12 +56,58 @@ class ItchCycleProductPartner(models.Model):
store=True
)
+ manualy_set_cycle = fields.Integer(
+ string="Cycle moyen (jours) défini manuellement"
+ )
+
+ manualy_set_qty = fields.Float(
+ string="Quantité défini manuellement"
+ )
+
next_expected_date = fields.Date(
string="Prochaine vente prévue",
compute="_compute_next_expected_date",
store=True
)
+ manualy_set_next_date = fields.Date(
+ string="Prochaine vente prévue défini manuellement"
+ )
+
+ calc_next_date = fields.Date(
+ string="Prochaine vente prévue calculée",
+ compute="_compute_next_expected_date",
+ store=True
+ )
+
+ calc_average_cycle = fields.Integer(
+ string="Cycle moyen (jours) calculé",
+ compute="_compute_itch_cycle_duration",
+ store=True
+ )
+
+ calc_average_qty = fields.Float(
+ string="Quantité moyenne calculée",
+ compute="_compute_mean_quantity_ordered",
+ store=True
+ )
+
+ @api.depends('manualy_set_cycle','average_cycle')
+ def _compute_itch_cycle_duration(self):
+ for record in self:
+ if record.manualy_set_cycle:
+ record.calc_average_cycle = record.manualy_set_cycle
+ else:
+ record.calc_average_cycle = record.average_cycle
+
+ @api.depends('manualy_set_qty','max_quantity_ordered')
+ def _compute_mean_quantity_ordered(self):
+ for record in self:
+ if record.manualy_set_qty:
+ record.calc_average_qty = record.manualy_set_qty
+ else:
+ record.calc_average_qty = record.max_quantity
+
prediction_status = fields.Selection(
selection=[
('on_time', 'À l’heure'),
@@ -174,8 +220,8 @@ class ItchCycleProductPartner(models.Model):
sale_order_lines = self.env['sale.order.line'].search([
('order_id.state', 'in', ['sale', 'done']), # Commandes confirmées ou terminées
('qty_delivered', '>', 0), # Quantité livrée supérieure à 0
- ('product_id', '!=', False), # Exclure les lignes sans produit
- ('order_id.partner_id', '=', 5024659), # un client pour test
+ ('product_id', '!=', False) # Exclure les lignes sans produit
+# ('order_id.partner_id', '=', 5024659), # un client pour test
])
# Carte pour regrouper par couple (client, produit)
@@ -227,22 +273,27 @@ class ItchCycleProductPartner(models.Model):
})
return True
+ @api.depends('sale_order_line_ids')
def _compute_quantity_total_ordered(self):
for record in self:
record.quantity_total_ordered = sum(record.sale_order_line_ids.mapped('product_uom_qty'))
+ @api.depends('sale_order_line_ids')
def _compute_quantity_of_orders(self):
for record in self:
record.quantity_of_orders = len(record.sale_order_line_ids)
+ @api.depends('sale_order_line_ids')
def _compute_min_quantity_ordered(self):
for record in self:
record.min_quantity_ordered = min(record.sale_order_line_ids.mapped('product_uom_qty'))
+ @api.depends('sale_order_line_ids')
def _compute_max_quantity_ordered(self):
for record in self:
record.max_quantity_ordered = max(record.sale_order_line_ids.mapped('product_uom_qty'))
+ @api.depends('sale_order_line_ids')
def _compute_mean_quantity_ordered(self):
for record in self:
record.mean_quantity_ordered = np.mean(record.sale_order_line_ids.mapped('product_uom_qty'))
diff --git a/customer_itch_cycle/models/res_partner.py b/customer_itch_cycle/models/res_partner.py
index e574881..a0e9f56 100644
--- a/customer_itch_cycle/models/res_partner.py
+++ b/customer_itch_cycle/models/res_partner.py
@@ -8,13 +8,13 @@ class ResPartner(models.Model):
itch_cycle_product_ids = fields.One2many(
comodel_name='itch.cycle.product.partner',
inverse_name='partner_id',
- string="Itch Cycles Produits"
+ string="Itch Cycles Products"
)
reorder_cycle_product_ids = fields.One2many(
comodel_name='itch.cycle.product.partner',
inverse_name='partner_id',
- string="Itch Cycles Produits",
+ string="Reorder Cycles Products",
domain=[('quantity_of_orders', '>', 1)]
)
diff --git a/customer_itch_cycle/models/sale_order_line.py b/customer_itch_cycle/models/sale_order_line.py
index 55e3c22..04db55d 100644
--- a/customer_itch_cycle/models/sale_order_line.py
+++ b/customer_itch_cycle/models/sale_order_line.py
@@ -8,6 +8,18 @@ class SaleOrderLine(models.Model):
string="Cycle Produit/Partenaire"
)
+ stock_move_ids = fields.One2many(
+ comodel_name='stock.move',
+ inverse_name='sale_line_id',
+ string="Mouvements de stock"
+ )
+
+ sale_date = fields.Datetime(
+ string="Date de vente",
+ related='order_id.date_order',
+ store=True
+ )
+
@api.model_create_multi
def create(self, vals_list):
# Appeler le super pour créer les lignes
diff --git a/customer_itch_cycle/views/itch_cycle_product_partner_view.xml b/customer_itch_cycle/views/itch_cycle_product_partner_view.xml
index 7bb46c0..6696f36 100644
--- a/customer_itch_cycle/views/itch_cycle_product_partner_view.xml
+++ b/customer_itch_cycle/views/itch_cycle_product_partner_view.xml
@@ -29,6 +29,11 @@
+
+
+
+
+
@@ -36,7 +41,6 @@
-
@@ -52,6 +56,7 @@
+