mirror of
https://github.com/OCA/contract.git
synced 2025-02-13 17:57:24 +02:00
[IMP] subscription_oca: more invoicing modes
This commit is contained in:
@@ -45,6 +45,9 @@ class SaleSubscription(models.Model):
|
||||
required=True,
|
||||
string="Subscription template",
|
||||
)
|
||||
template_invoicing_mode = fields.Selection(
|
||||
related="template_id.invoicing_mode", readonly=True
|
||||
)
|
||||
code = fields.Char(
|
||||
string="Reference",
|
||||
default=lambda self: self.env["ir.sequence"].next_by_code("sale.subscription"),
|
||||
@@ -321,35 +324,53 @@ class SaleSubscription(models.Model):
|
||||
if self.template_id.invoicing_mode != "draft":
|
||||
invoice.action_post()
|
||||
if self.template_id.invoicing_mode == "invoice_send":
|
||||
mail_template = self.template_id.invoice_mail_template_id
|
||||
invoice.with_context(force_send=True).message_post_with_template(
|
||||
mail_template.id,
|
||||
composition_mode="comment",
|
||||
email_layout_xmlid="mail.mail_notification_paynow",
|
||||
)
|
||||
self.send_invoice(invoice)
|
||||
invoice_number = invoice.name
|
||||
message_body = (
|
||||
"<b>%s</b> <a href=# data-oe-model=account.move data-oe-id=%d>%s</a>"
|
||||
% (msg_static, invoice.id, invoice_number)
|
||||
)
|
||||
|
||||
if self.template_id.invoicing_mode == "sale_and_invoice":
|
||||
elif self.template_id.invoicing_mode in ["sale_draft"]:
|
||||
self.create_sale_order()
|
||||
|
||||
elif self.template_id.invoicing_mode in ["sale_confirmed"]:
|
||||
order_id = self.create_sale_order()
|
||||
order_id.action_confirm()
|
||||
|
||||
elif self.template_id.invoicing_mode in [
|
||||
"sale_and_invoice",
|
||||
"sale_and_invoice_draft",
|
||||
"sale_and_invoice_send",
|
||||
]:
|
||||
order_id = self.create_sale_order()
|
||||
order_id.action_done()
|
||||
new_invoice = order_id._create_invoices()
|
||||
new_invoice.action_post()
|
||||
self.write({"invoice_ids": [(4, new_invoice.id)]})
|
||||
if self.template_id.invoicing_mode == "sale_and_invoice":
|
||||
new_invoice.action_post()
|
||||
new_invoice.invoice_origin = order_id.name + ", " + self.name
|
||||
invoice_number = new_invoice.name
|
||||
message_body = (
|
||||
"<b>%s</b> <a href=# data-oe-model=account.move data-oe-id=%d>%s</a>"
|
||||
% (msg_static, new_invoice.id, invoice_number)
|
||||
)
|
||||
if self.template_id.invoicing_mode == "sale_and_invoice_send":
|
||||
self.send_invoice(new_invoice)
|
||||
if not invoice_number:
|
||||
invoice_number = _("To validate")
|
||||
message_body = "<b>%s</b> %s" % (msg_static, invoice_number)
|
||||
self.calculate_recurring_next_date(self.recurring_next_date)
|
||||
self.message_post(body=message_body)
|
||||
|
||||
def send_invoice(self, invoice):
|
||||
mail_template = self.template_id.invoice_mail_template_id
|
||||
invoice.with_context(force_send=True).message_post_with_template(
|
||||
mail_template.id,
|
||||
composition_mode="comment",
|
||||
email_layout_xmlid="mail.mail_notification_paynow",
|
||||
)
|
||||
|
||||
def manual_invoice(self):
|
||||
invoice_id = self.create_invoice()
|
||||
self.calculate_recurring_next_date(self.recurring_next_date)
|
||||
@@ -369,6 +390,43 @@ class SaleSubscription(models.Model):
|
||||
"context": context,
|
||||
}
|
||||
|
||||
def manual_sale_order(self):
|
||||
order = self.create_sale_order()
|
||||
msg_static = _("Created Sale Order with reference")
|
||||
message_body = (
|
||||
"<b>%s</b> <a href=# data-oe-model=sale.order data-oe-id=%d>%s</a>"
|
||||
% (msg_static, order.id, order.name)
|
||||
)
|
||||
self.message_post(body=message_body)
|
||||
return {
|
||||
"name": self.name,
|
||||
"view_type": "form",
|
||||
"view_mode": "form",
|
||||
"res_model": "sale.order",
|
||||
"res_id": order.id,
|
||||
"type": "ir.actions.act_window",
|
||||
}
|
||||
|
||||
def manual_invoice_and_sale_order(self):
|
||||
order_id = self.manual_sale_order()["res_id"]
|
||||
order = self.env["sale.order"].browse(order_id)
|
||||
order.action_done()
|
||||
new_invoice = order._create_invoices()
|
||||
if self.template_invoicing_mode in [
|
||||
"sale_and_invoice",
|
||||
"sale_and_invoice_send",
|
||||
]:
|
||||
new_invoice.action_post()
|
||||
new_invoice.invoice_origin = order.name + ", " + self.name
|
||||
invoice_number = new_invoice.name
|
||||
msg_static = _("Created invoice with reference")
|
||||
message_body = (
|
||||
"<b>%s</b> <a href=# data-oe-model=account.move data-oe-id=%d>%s</a>"
|
||||
% (msg_static, new_invoice.id, invoice_number)
|
||||
)
|
||||
self.message_post(body=message_body)
|
||||
return order, new_invoice
|
||||
|
||||
@api.depends("invoice_ids", "sale_order_ids.invoice_ids")
|
||||
def _compute_account_invoice_ids_count(self):
|
||||
for record in self:
|
||||
|
||||
@@ -34,7 +34,11 @@ class SaleSubscriptionTemplate(models.Model):
|
||||
("draft", "Draft"),
|
||||
("invoice", "Invoice"),
|
||||
("invoice_send", "Invoice & send"),
|
||||
("sale_and_invoice", "Sale order & Invoice"),
|
||||
("sale_and_invoice", "Sale Order & Invoice"),
|
||||
("sale_and_invoice_draft", "Sale Order & Invoice Draft"),
|
||||
("sale_and_invoice_send", "Sale Order & Invoice send"),
|
||||
("sale_draft", "Sale Order Draft"),
|
||||
("sale_confirmed", "Sale Order Confirmed"),
|
||||
],
|
||||
)
|
||||
code = fields.Char()
|
||||
|
||||
@@ -65,6 +65,9 @@ class TestSubscriptionOCA(SavepointCase):
|
||||
cls.product_1.taxes_id = [(6, 0, cls.tax_10pc_incl.ids)]
|
||||
cls.product_2 = cls.env.ref("product.product_product_2")
|
||||
cls.product_2.subscribable = True
|
||||
cls.product_3 = cls.env.ref("product.product_product_3")
|
||||
cls.product_3.subscribable = True
|
||||
cls.product_3.invoice_policy = "order"
|
||||
|
||||
cls.country = cls.env["res.country"].search([], limit=1)
|
||||
cls.fiscal = cls.env["account.fiscal.position"].create(
|
||||
@@ -104,6 +107,27 @@ class TestSubscriptionOCA(SavepointCase):
|
||||
"recurring_rule_type": "days",
|
||||
}
|
||||
)
|
||||
cls.tmpl_sale_draft = cls.create_sub_template(
|
||||
{
|
||||
"recurring_rule_boundary": "unlimited",
|
||||
"invoicing_mode": "sale_draft",
|
||||
"recurring_rule_type": "days",
|
||||
}
|
||||
)
|
||||
cls.tmpl_sale_confirmed = cls.create_sub_template(
|
||||
{
|
||||
"recurring_rule_boundary": "unlimited",
|
||||
"invoicing_mode": "sale_confirmed",
|
||||
"recurring_rule_type": "days",
|
||||
}
|
||||
)
|
||||
cls.tmpl_sale_and_invoice_send = cls.create_sub_template(
|
||||
{
|
||||
"recurring_rule_boundary": "unlimited",
|
||||
"invoicing_mode": "sale_and_invoice_send",
|
||||
"recurring_rule_type": "days",
|
||||
}
|
||||
)
|
||||
|
||||
cls.stage = cls.env["sale.subscription.stage"].create(
|
||||
{
|
||||
@@ -173,6 +197,36 @@ class TestSubscriptionOCA(SavepointCase):
|
||||
"journal_id": cls.cash_journal.id,
|
||||
}
|
||||
)
|
||||
cls.sub_sale_draft = cls.create_sub(
|
||||
{
|
||||
"template_id": cls.tmpl_sale_draft.id,
|
||||
"pricelist_id": cls.pricelist2.id,
|
||||
"date_start": fields.Date.today() - relativedelta(days=100),
|
||||
"recurring_next_date": fields.Date.today(),
|
||||
"in_progress": True,
|
||||
"journal_id": cls.sale_journal.id,
|
||||
}
|
||||
)
|
||||
cls.sub_sale_confirmed = cls.create_sub(
|
||||
{
|
||||
"template_id": cls.tmpl_sale_confirmed.id,
|
||||
"pricelist_id": cls.pricelist2.id,
|
||||
"date_start": fields.Date.today() - relativedelta(days=100),
|
||||
"recurring_next_date": fields.Date.today(),
|
||||
"in_progress": True,
|
||||
"journal_id": cls.sale_journal.id,
|
||||
}
|
||||
)
|
||||
cls.sub_sale_and_invoice_send = cls.create_sub(
|
||||
{
|
||||
"template_id": cls.tmpl_sale_and_invoice_send.id,
|
||||
"pricelist_id": cls.pricelist2.id,
|
||||
"date_start": fields.Date.today() - relativedelta(days=100),
|
||||
"recurring_next_date": fields.Date.today(),
|
||||
"in_progress": True,
|
||||
"journal_id": cls.sale_journal.id,
|
||||
}
|
||||
)
|
||||
|
||||
cls.sub_line = cls.create_sub_line(cls.sub1)
|
||||
cls.sub_line2 = cls.env["sale.subscription.line"].create(
|
||||
@@ -191,6 +245,11 @@ class TestSubscriptionOCA(SavepointCase):
|
||||
cls.sub_line52 = cls.create_sub_line(cls.sub5, cls.product_2.id)
|
||||
cls.sub_line71 = cls.create_sub_line(cls.sub7)
|
||||
cls.sub_line72 = cls.create_sub_line(cls.sub7, cls.product_2.id)
|
||||
cls.sub_line_sd = cls.create_sub_line(cls.sub_sale_draft, cls.product_3.id)
|
||||
cls.sub_line_sc = cls.create_sub_line(cls.sub_sale_confirmed, cls.product_3.id)
|
||||
cls.sub_line_sais = cls.create_sub_line(
|
||||
cls.sub_sale_and_invoice_send, cls.product_3.id
|
||||
)
|
||||
|
||||
cls.close_reason = cls.env["sale.subscription.close.reason"].create(
|
||||
{
|
||||
@@ -503,13 +562,35 @@ class TestSubscriptionOCA(SavepointCase):
|
||||
with self.assertRaises(exceptions.AccessError):
|
||||
subscription.partner_id = self.partner_2
|
||||
|
||||
def test_subscription_oca_sub_sale_draft_workflow(self):
|
||||
res = self._collect_all_sub_test_results(self.sub_sale_draft)
|
||||
self.assertEqual(res[4], 900.0)
|
||||
self.sub_sale_draft.manual_sale_order()
|
||||
self.sub_sale_draft.manual_invoice_and_sale_order()
|
||||
|
||||
def test_subscription_oca_sub_sale_confirmed_workflow(self):
|
||||
res = self._collect_all_sub_test_results(self.sub_sale_confirmed)
|
||||
self.assertEqual(res[4], 900.0)
|
||||
self.sub_sale_confirmed.manual_sale_order()
|
||||
self.sub_sale_confirmed.manual_invoice_and_sale_order()
|
||||
|
||||
def test_subscription_oca_sub_sale_and_invoice_send_workflow(self):
|
||||
res = self._collect_all_sub_test_results(self.sub_sale_and_invoice_send)
|
||||
self.assertEqual(res[4], 900.0)
|
||||
self.sub_sale_and_invoice_send.manual_sale_order()
|
||||
self.sub_sale_and_invoice_send.manual_invoice_and_sale_order()
|
||||
|
||||
def test_subscription_oca_sub_sale_and_invoice_send_workflow_2(self):
|
||||
self.sub_sale_and_invoice_send.generate_invoice()
|
||||
self.assertEqual(len(self.sub_sale_and_invoice_send.invoice_ids), 1)
|
||||
|
||||
def test_subscription_oca_sub_stage(self):
|
||||
# sale.subscription.stage
|
||||
self.stage._check_lot_product() # should not raise
|
||||
|
||||
def test_x_subscription_oca_pricelist_related(self):
|
||||
res = self.partner.read(["subscription_count", "subscription_ids"])
|
||||
self.assertEqual(res[0]["subscription_count"], 8)
|
||||
self.assertEqual(res[0]["subscription_count"], 11)
|
||||
res = self.partner.action_view_subscription_ids()
|
||||
self.assertIsInstance(res, dict)
|
||||
sale_order = self.sub1.create_sale_order()
|
||||
|
||||
@@ -82,7 +82,8 @@
|
||||
<field name="invoicing_mode" widget="radio" />
|
||||
<field
|
||||
name="invoice_mail_template_id"
|
||||
attrs="{'invisible': [('invoicing_mode','!=','invoice_send')], 'required': [('invoicing_mode', '=', 'invoice_send')]}"
|
||||
attrs="{'invisible': [('invoicing_mode','not in',['invoice_send', 'sale_and_invoice_send'])],
|
||||
'required': [('invoicing_mode', 'in', ['invoice_send','sale_and_invoice_send'])]}"
|
||||
/>
|
||||
</group>
|
||||
<group name="right_group">
|
||||
|
||||
@@ -12,6 +12,23 @@
|
||||
name="manual_invoice"
|
||||
type="object"
|
||||
class="btn-primary"
|
||||
attrs="{'invisible': [('template_invoicing_mode', 'not in', ['draft','invoice','invoice_send'])]}"
|
||||
/>
|
||||
|
||||
<button
|
||||
string="Create Sale Order and Invoice"
|
||||
name="manual_invoice_and_sale_order"
|
||||
type="object"
|
||||
class="btn-primary"
|
||||
attrs="{'invisible': [('template_invoicing_mode', 'not in', ['sale_and_invoice','sale_and_invoice_draft','sale_and_invoice_send'])]}"
|
||||
/>
|
||||
|
||||
<button
|
||||
string="Create Sale Order"
|
||||
name="manual_sale_order"
|
||||
type="object"
|
||||
class="btn-primary"
|
||||
attrs="{'invisible': [('template_invoicing_mode', 'not in', ['sale_draft','sale_confirmed'])]}"
|
||||
/>
|
||||
|
||||
<button
|
||||
@@ -99,6 +116,7 @@
|
||||
<group name="right_group">
|
||||
|
||||
<field name="template_id" />
|
||||
<field name="template_invoicing_mode" />
|
||||
<field name="crm_team_id" />
|
||||
<field
|
||||
name="recurring_next_date"
|
||||
|
||||
Reference in New Issue
Block a user