odoo-addon-base-tier-validation 16.0.1.0.4.29__py3-none-any.whl → 16.0.1.5.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. odoo/addons/base_tier_validation/README.rst +11 -6
  2. odoo/addons/base_tier_validation/__manifest__.py +1 -1
  3. odoo/addons/base_tier_validation/i18n/base_tier_validation.pot +104 -6
  4. odoo/addons/base_tier_validation/i18n/es.po +147 -73
  5. odoo/addons/base_tier_validation/i18n/es_MX.po +104 -6
  6. odoo/addons/base_tier_validation/i18n/fr.po +186 -78
  7. odoo/addons/base_tier_validation/i18n/it.po +159 -48
  8. odoo/addons/base_tier_validation/i18n/nl_NL.po +159 -37
  9. odoo/addons/base_tier_validation/i18n/sv.po +140 -54
  10. odoo/addons/base_tier_validation/i18n/tr.po +107 -6
  11. odoo/addons/base_tier_validation/i18n/zh_CN.po +107 -6
  12. odoo/addons/base_tier_validation/models/res_config_settings.py +3 -3
  13. odoo/addons/base_tier_validation/models/res_users.py +5 -0
  14. odoo/addons/base_tier_validation/models/tier_definition.py +18 -0
  15. odoo/addons/base_tier_validation/models/tier_review.py +18 -3
  16. odoo/addons/base_tier_validation/models/tier_validation.py +183 -63
  17. odoo/addons/base_tier_validation/readme/CONTRIBUTORS.rst +2 -0
  18. odoo/addons/base_tier_validation/static/description/index.html +68 -65
  19. odoo/addons/base_tier_validation/static/src/xml/tier_review_template.xml +41 -17
  20. odoo/addons/base_tier_validation/templates/tier_validation_templates.xml +7 -6
  21. odoo/addons/base_tier_validation/tests/common.py +19 -6
  22. odoo/addons/base_tier_validation/tests/test_tier_validation.py +415 -0
  23. odoo/addons/base_tier_validation/tests/tier_validation_tester.py +13 -2
  24. odoo/addons/base_tier_validation/views/res_config_settings_views.xml +6 -6
  25. odoo/addons/base_tier_validation/views/tier_definition_view.xml +14 -1
  26. {odoo_addon_base_tier_validation-16.0.1.0.4.29.dist-info → odoo_addon_base_tier_validation-16.0.1.5.1.dist-info}/METADATA +13 -8
  27. {odoo_addon_base_tier_validation-16.0.1.0.4.29.dist-info → odoo_addon_base_tier_validation-16.0.1.5.1.dist-info}/RECORD +29 -29
  28. {odoo_addon_base_tier_validation-16.0.1.0.4.29.dist-info → odoo_addon_base_tier_validation-16.0.1.5.1.dist-info}/WHEEL +1 -1
  29. {odoo_addon_base_tier_validation-16.0.1.0.4.29.dist-info → odoo_addon_base_tier_validation-16.0.1.5.1.dist-info}/top_level.txt +0 -0
@@ -305,6 +305,51 @@ class TierTierValidation(CommonTierValidation):
305
305
  0, len(record1.review_ids.filtered(lambda l: l.status == "pending"))
306
306
  )
307
307
 
308
+ def test_12_approve_sequence_same_user_bypassed(self):
309
+ """Similar to test_12_approve_sequence, with all same users,
310
+ but approve_sequence_bypass is True"""
311
+ # Create new test record
312
+ test_record = self.test_model.create({"test_field": 2.5})
313
+ # Create tier definitions
314
+ self.tier_def_obj.create(
315
+ {
316
+ "model_id": self.tester_model.id,
317
+ "review_type": "individual",
318
+ "reviewer_id": self.test_user_1.id,
319
+ "definition_domain": "[('test_field', '>', 1.0)]",
320
+ "approve_sequence": True,
321
+ "approve_sequence_bypass": True,
322
+ "sequence": 20,
323
+ }
324
+ )
325
+ self.tier_def_obj.create(
326
+ {
327
+ "model_id": self.tester_model.id,
328
+ "review_type": "individual",
329
+ "reviewer_id": self.test_user_1.id,
330
+ "definition_domain": "[('test_field', '>', 1.0)]",
331
+ "approve_sequence": True,
332
+ "approve_sequence_bypass": True,
333
+ "sequence": 10,
334
+ }
335
+ )
336
+ # Request validation
337
+ self.assertFalse(self.test_record.review_ids)
338
+ reviews = test_record.with_user(self.test_user_1.id).request_validation()
339
+ self.assertTrue(reviews)
340
+
341
+ record1 = test_record.with_user(self.test_user_1.id)
342
+ record1.invalidate_model()
343
+ self.assertTrue(record1.can_review)
344
+ # When the first tier is validated, all the rest will be approved.
345
+ self.assertEqual(
346
+ 3, len(record1.review_ids.filtered(lambda l: l.status == "pending"))
347
+ )
348
+ record1.validate_tier()
349
+ self.assertEqual(
350
+ 0, len(record1.review_ids.filtered(lambda l: l.status == "pending"))
351
+ )
352
+
308
353
  def test_13_onchange_review_type(self):
309
354
  tier_def_id = self.tier_def_obj.create(
310
355
  {
@@ -436,6 +481,376 @@ class TierTierValidation(CommonTierValidation):
436
481
  self.assertTrue(review)
437
482
  self.assertEqual(review.reviewer_ids, self.test_user_2)
438
483
 
484
+ def test_19_notify_on_create(self):
485
+ # notify on create
486
+ tier_definition = self.env["tier.definition"].search([])
487
+ tier_definition.write(
488
+ {
489
+ "notify_on_create": True,
490
+ "notify_on_accepted": False,
491
+ "notify_on_rejected": False,
492
+ "notify_on_restarted": False,
493
+ "review_type": "group",
494
+ "reviewer_group_id": self.env.ref("base.group_system").id,
495
+ }
496
+ )
497
+ test_record_1 = self.test_model.create({"test_field": 2.5})
498
+ notifications_no_1 = len(
499
+ self.env["mail.notification"].search(
500
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
501
+ )
502
+ )
503
+ test_record_1.request_validation()
504
+ notifications_no_2 = len(
505
+ self.env["mail.notification"].search(
506
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
507
+ )
508
+ )
509
+ self.assertEqual(notifications_no_2, notifications_no_1 + 1)
510
+
511
+ # do not notify on create
512
+ tier_definition.write({"notify_on_create": False})
513
+ test_record_2 = self.test_model.create({"test_field": 2.5})
514
+ notifications_no_1 = len(
515
+ self.env["mail.notification"].search(
516
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
517
+ )
518
+ )
519
+ test_record_2.request_validation()
520
+ notifications_no_2 = len(
521
+ self.env["mail.notification"].search(
522
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
523
+ )
524
+ )
525
+ self.assertEqual(notifications_no_2, notifications_no_1)
526
+
527
+ def test_20_notify_on_accepted(self):
528
+ self.test_user_2.write(
529
+ {
530
+ "groups_id": [(6, 0, self.env.ref("base.group_system").ids)],
531
+ }
532
+ )
533
+
534
+ # notify on accepted
535
+ tier_definition = self.env["tier.definition"].search([])
536
+ tier_definition.write(
537
+ {
538
+ "notify_on_create": False,
539
+ "notify_on_accepted": True,
540
+ "notify_on_rejected": False,
541
+ "notify_on_restarted": False,
542
+ "review_type": "group",
543
+ "reviewer_group_id": self.env.ref("base.group_system").id,
544
+ }
545
+ )
546
+ test_record_1 = self.test_model.create({"test_field": 2.5})
547
+ test_record_1.request_validation()
548
+ test_record_1.invalidate_model()
549
+ record = test_record_1.with_user(self.test_user_2.id)
550
+ notifications_no_1 = len(
551
+ self.env["mail.notification"].search(
552
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
553
+ )
554
+ )
555
+ record.validate_tier()
556
+ notifications_no_2 = len(
557
+ self.env["mail.notification"].search(
558
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
559
+ )
560
+ )
561
+ self.assertEqual(notifications_no_2, notifications_no_1 + 1)
562
+
563
+ # do not notify on accepted
564
+ tier_definition.write({"notify_on_accepted": False})
565
+ test_record_2 = self.test_model.create({"test_field": 2.5})
566
+ test_record_2.request_validation()
567
+ test_record_2.invalidate_model()
568
+ test_record_2.with_user(self.test_user_2.id)
569
+ notifications_no_1 = len(
570
+ self.env["mail.notification"].search(
571
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
572
+ )
573
+ )
574
+ test_record_2.validate_tier()
575
+ notifications_no_2 = len(
576
+ self.env["mail.notification"].search(
577
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
578
+ )
579
+ )
580
+ self.assertEqual(notifications_no_2, notifications_no_1)
581
+
582
+ def test_21_notify_on_rejected(self):
583
+ self.test_user_2.write(
584
+ {
585
+ "groups_id": [(6, 0, self.env.ref("base.group_system").ids)],
586
+ }
587
+ )
588
+
589
+ # notify on rejected
590
+ tier_definition = self.env["tier.definition"].search([])
591
+ tier_definition.write(
592
+ {
593
+ "notify_on_create": False,
594
+ "notify_on_accepted": False,
595
+ "notify_on_rejected": True,
596
+ "notify_on_restarted": False,
597
+ "review_type": "group",
598
+ "reviewer_group_id": self.env.ref("base.group_system").id,
599
+ }
600
+ )
601
+ test_record_1 = self.test_model.create({"test_field": 2.5})
602
+ test_record_1.request_validation()
603
+ test_record_1.invalidate_model()
604
+ record = test_record_1.with_user(self.test_user_2.id)
605
+ notifications_no_1 = len(
606
+ self.env["mail.notification"].search(
607
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
608
+ )
609
+ )
610
+ record.reject_tier()
611
+ notifications_no_2 = len(
612
+ self.env["mail.notification"].search(
613
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
614
+ )
615
+ )
616
+ self.assertEqual(notifications_no_2, notifications_no_1 + 1)
617
+
618
+ # do not notify on rejected
619
+ tier_definition.write({"notify_on_rejected": False})
620
+ test_record_2 = self.test_model.create({"test_field": 2.5})
621
+ test_record_2.request_validation()
622
+ test_record_2.invalidate_model()
623
+ test_record_2.with_user(self.test_user_2.id)
624
+
625
+ notifications_no_1 = len(
626
+ self.env["mail.notification"].search(
627
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
628
+ )
629
+ )
630
+ test_record_2.reject_tier()
631
+ notifications_no_2 = len(
632
+ self.env["mail.notification"].search(
633
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
634
+ )
635
+ )
636
+ self.assertEqual(notifications_no_2, notifications_no_1)
637
+
638
+ def test_22_notify_on_restarted(self):
639
+ self.test_user_2.write(
640
+ {
641
+ "groups_id": [(6, 0, self.env.ref("base.group_system").ids)],
642
+ }
643
+ )
644
+
645
+ # notify on restarted
646
+ tier_definition = self.env["tier.definition"].search([])
647
+ tier_definition.write(
648
+ {
649
+ "notify_on_create": False,
650
+ "notify_on_accepted": False,
651
+ "notify_on_rejected": False,
652
+ "notify_on_restarted": True,
653
+ "review_type": "group",
654
+ "reviewer_group_id": self.env.ref("base.group_system").id,
655
+ }
656
+ )
657
+ test_record_1 = self.test_model.create({"test_field": 2.5})
658
+ test_record_1.request_validation()
659
+ test_record_1.invalidate_model()
660
+ record = test_record_1.with_user(self.test_user_2.id)
661
+ notifications_no_1 = len(
662
+ self.env["mail.notification"].search(
663
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
664
+ )
665
+ )
666
+ record.restart_validation()
667
+ notifications_no_2 = len(
668
+ self.env["mail.notification"].search(
669
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
670
+ )
671
+ )
672
+ self.assertEqual(notifications_no_2, notifications_no_1 + 1)
673
+
674
+ # do not notify on restarted
675
+ tier_definition.write({"notify_on_restarted": False})
676
+ test_record_2 = self.test_model.create({"test_field": 2.5})
677
+ test_record_2.request_validation()
678
+ test_record_2.with_user(self.test_user_2.id)
679
+ notifications_no_1 = len(
680
+ self.env["mail.notification"].search(
681
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
682
+ )
683
+ )
684
+ test_record_2.restart_validation()
685
+ notifications_no_2 = len(
686
+ self.env["mail.notification"].search(
687
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
688
+ )
689
+ )
690
+ self.assertEqual(notifications_no_2, notifications_no_1)
691
+
692
+ def test_23_all_notification(self):
693
+ self.test_user_2.write(
694
+ {
695
+ "groups_id": [(6, 0, self.env.ref("base.group_system").ids)],
696
+ }
697
+ )
698
+
699
+ # notify on restarted
700
+ tier_definition = self.env["tier.definition"].search([])
701
+ tier_definition.write(
702
+ {
703
+ "notify_on_create": True,
704
+ "notify_on_accepted": True,
705
+ "notify_on_rejected": True,
706
+ "notify_on_restarted": True,
707
+ "review_type": "group",
708
+ "reviewer_group_id": self.env.ref("base.group_system").id,
709
+ }
710
+ )
711
+
712
+ test_record = self.test_model.create({"test_field": 2.5})
713
+
714
+ # request validation
715
+ notifications_no_1 = len(
716
+ self.env["mail.notification"].search(
717
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
718
+ )
719
+ )
720
+ test_record.request_validation()
721
+ test_record.invalidate_model()
722
+ notifications_no_2 = len(
723
+ self.env["mail.notification"].search(
724
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
725
+ )
726
+ )
727
+ self.assertEqual(notifications_no_2, notifications_no_1 + 1)
728
+
729
+ # accept validation
730
+ record = test_record.with_user(self.test_user_2.id)
731
+ notifications_no_1 = len(
732
+ self.env["mail.notification"].search(
733
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
734
+ )
735
+ )
736
+ record.validate_tier()
737
+ notifications_no_2 = len(
738
+ self.env["mail.notification"].search(
739
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
740
+ )
741
+ )
742
+ self.assertEqual(notifications_no_2, notifications_no_1 + 1)
743
+
744
+ # restart validation
745
+ notifications_no_1 = len(
746
+ self.env["mail.notification"].search(
747
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
748
+ )
749
+ )
750
+ record.restart_validation()
751
+ notifications_no_2 = len(
752
+ self.env["mail.notification"].search(
753
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
754
+ )
755
+ )
756
+ self.assertEqual(notifications_no_2, notifications_no_1 + 1)
757
+
758
+ # reject validation
759
+ record.request_validation()
760
+ notifications_no_1 = len(
761
+ self.env["mail.notification"].search(
762
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
763
+ )
764
+ )
765
+ record.reject_tier()
766
+ notifications_no_2 = len(
767
+ self.env["mail.notification"].search(
768
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
769
+ )
770
+ )
771
+ self.assertEqual(notifications_no_2, notifications_no_1 + 1)
772
+
773
+ def test_24_no_notification(self):
774
+ self.test_user_2.write(
775
+ {
776
+ "groups_id": [(6, 0, self.env.ref("base.group_system").ids)],
777
+ }
778
+ )
779
+
780
+ # notify on restarted
781
+ tier_definition = self.env["tier.definition"].search([])
782
+ tier_definition.write(
783
+ {
784
+ "notify_on_create": False,
785
+ "notify_on_accepted": False,
786
+ "notify_on_rejected": False,
787
+ "notify_on_restarted": False,
788
+ "review_type": "group",
789
+ "reviewer_group_id": self.env.ref("base.group_system").id,
790
+ }
791
+ )
792
+
793
+ test_record = self.test_model.create({"test_field": 2.5})
794
+
795
+ # request validation
796
+ notifications_no_1 = len(
797
+ self.env["mail.notification"].search(
798
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
799
+ )
800
+ )
801
+ test_record.request_validation()
802
+ test_record.invalidate_model()
803
+ notifications_no_2 = len(
804
+ self.env["mail.notification"].search(
805
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
806
+ )
807
+ )
808
+ self.assertEqual(notifications_no_2, notifications_no_1)
809
+
810
+ # accept validation
811
+ record = test_record.with_user(self.test_user_2.id)
812
+ notifications_no_1 = len(
813
+ self.env["mail.notification"].search(
814
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
815
+ )
816
+ )
817
+ record.validate_tier()
818
+ notifications_no_2 = len(
819
+ self.env["mail.notification"].search(
820
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
821
+ )
822
+ )
823
+ self.assertEqual(notifications_no_2, notifications_no_1)
824
+
825
+ # restart validation
826
+ notifications_no_1 = len(
827
+ self.env["mail.notification"].search(
828
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
829
+ )
830
+ )
831
+ record.restart_validation()
832
+ notifications_no_2 = len(
833
+ self.env["mail.notification"].search(
834
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
835
+ )
836
+ )
837
+ self.assertEqual(notifications_no_2, notifications_no_1)
838
+
839
+ # reject validation
840
+ record.request_validation()
841
+ notifications_no_1 = len(
842
+ self.env["mail.notification"].search(
843
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
844
+ )
845
+ )
846
+ record.reject_tier()
847
+ notifications_no_2 = len(
848
+ self.env["mail.notification"].search(
849
+ [("res_partner_id", "=", self.test_user_1.partner_id.id)]
850
+ )
851
+ )
852
+ self.assertEqual(notifications_no_2, notifications_no_1)
853
+
439
854
 
440
855
  @tagged("at_install")
441
856
  class TierTierValidationView(CommonTierValidation):
@@ -1,13 +1,13 @@
1
1
  # Copyright 2018-19 ForgeFlow S.L. (https://www.forgeflow.com)
2
2
  # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3
3
 
4
- from odoo import fields, models
4
+ from odoo import api, fields, models
5
5
 
6
6
 
7
7
  class TierValidationTester(models.Model):
8
8
  _name = "tier.validation.tester"
9
9
  _description = "Tier Validation Tester"
10
- _inherit = ["tier.validation"]
10
+ _inherit = ["tier.validation", "mail.thread"]
11
11
  _tier_validation_manual_config = True
12
12
 
13
13
  state = fields.Selection(
@@ -44,3 +44,14 @@ class TierValidationTester2(models.Model):
44
44
 
45
45
  def action_confirm(self):
46
46
  self.write({"state": "confirmed"})
47
+
48
+
49
+ class TierDefinition(models.Model):
50
+ _inherit = "tier.definition"
51
+
52
+ @api.model
53
+ def _get_tier_validation_model_names(self):
54
+ res = super()._get_tier_validation_model_names()
55
+ res.append("tier.validation.tester")
56
+ res.append("tier.validation.tester2")
57
+ return res
@@ -2,7 +2,7 @@
2
2
  <odoo>
3
3
  <!-- Uncomment me when related modules are migrated-->
4
4
 
5
- <!-- <record id="res_config_settings_view_form_budget" model="ir.ui.view">
5
+ <record id="res_config_settings_view_form_budget" model="ir.ui.view">
6
6
  <field name="name">res.config.settings.view.form.budget</field>
7
7
  <field name="model">res.config.settings</field>
8
8
  <field name="priority" eval="25" />
@@ -29,7 +29,7 @@
29
29
  </div>
30
30
  </div>
31
31
  </div>
32
- <div
32
+ <!-- <div
33
33
  class="col-12 col-lg-6 o_setting_box"
34
34
  id="module_base_tier_validation_server_action"
35
35
  >
@@ -46,7 +46,7 @@
46
46
  Option to trigger server actions on completion of tier reviews
47
47
  </div>
48
48
  </div>
49
- </div>
49
+ </div> -->
50
50
  <div
51
51
  class="col-12 col-lg-6 o_setting_box"
52
52
  id="module_base_tier_validation_forward"
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </div>
63
63
  </div>
64
- <div
64
+ <!-- <div
65
65
  class="col-12 col-lg-6 o_setting_box"
66
66
  id="module_base_tier_validation_report"
67
67
  >
@@ -74,10 +74,10 @@
74
74
  More reports about tier validations, i.e., summary of all my reviews
75
75
  </div>
76
76
  </div>
77
- </div>
77
+ </div> -->
78
78
  </div>
79
79
  </div>
80
80
  </xpath>
81
81
  </field>
82
- </record> -->
82
+ </record>
83
83
  </odoo>
@@ -28,7 +28,7 @@
28
28
  <div class="oe_button_box" name="button_box" />
29
29
  <widget
30
30
  name="web_ribbon"
31
- text="Archived"
31
+ title="Archived"
32
32
  bg_color="bg-danger"
33
33
  attrs="{'invisible': [('active', '=', True)]}"
34
34
  />
@@ -71,6 +71,16 @@
71
71
  />
72
72
  <field name="sequence" />
73
73
  <field name="approve_sequence" />
74
+ <label for="approve_sequence_bypass" invisible="1" />
75
+ <div
76
+ name="approve_sequence_bypass_div"
77
+ class="o_row"
78
+ attrs="{'invisible': [('approve_sequence', '=', False)]}"
79
+ >
80
+ <field name="approve_sequence_bypass" />
81
+ <span
82
+ >Bypassed, if previous tier was validated by same reviewer</span>
83
+ </div>
74
84
  </group>
75
85
  </group>
76
86
  <notebook>
@@ -89,6 +99,9 @@
89
99
  <group name="more_option">
90
100
  <group name="notify">
91
101
  <field name="notify_on_create" />
102
+ <field name="notify_on_accepted" />
103
+ <field name="notify_on_rejected" />
104
+ <field name="notify_on_restarted" />
92
105
  <field name="has_comment" />
93
106
  </group>
94
107
  </group>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: odoo-addon-base-tier-validation
3
- Version: 16.0.1.0.4.29
3
+ Version: 16.0.1.5.1
4
4
  Summary: Implement a validation process based on tiers.
5
5
  Home-page: https://github.com/OCA/server-ux
6
6
  Author: ForgeFlow, Odoo Community Association (OCA)
@@ -13,16 +13,19 @@ Classifier: Framework :: Odoo :: 16.0
13
13
  Classifier: License :: OSI Approved :: GNU Affero General Public License v3
14
14
  Classifier: Development Status :: 6 - Mature
15
15
  Requires-Python: >=3.10
16
- Requires-Dist: odoo (<16.1dev,>=16.0a)
16
+ Requires-Dist: odoo <16.1dev,>=16.0a
17
17
 
18
18
  ====================
19
19
  Base Tier Validation
20
20
  ====================
21
21
 
22
- .. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
22
+ ..
23
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
23
24
  !! This file is generated by oca-gen-addon-readme !!
24
25
  !! changes will be overwritten. !!
25
26
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
27
+ !! source digest: sha256:1b69f3df9b2f479b32acf8c146bb4837086a025d8914c2f773db9f6c4c9eab7a
28
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
26
29
 
27
30
  .. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png
28
31
  :target: https://odoo-community.org/page/development-status
@@ -36,11 +39,11 @@ Base Tier Validation
36
39
  .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
37
40
  :target: https://translation.odoo-community.org/projects/server-ux-16-0/server-ux-16-0-base_tier_validation
38
41
  :alt: Translate me on Weblate
39
- .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
40
- :target: https://runbot.odoo-community.org/runbot/250/16.0
41
- :alt: Try me on Runbot
42
+ .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
43
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/server-ux&target_branch=16.0
44
+ :alt: Try me on Runboat
42
45
 
43
- |badge1| |badge2| |badge3| |badge4| |badge5|
46
+ |badge1| |badge2| |badge3| |badge4| |badge5|
44
47
 
45
48
  Validating some operations is a common need across different areas in a company
46
49
  and sometimes it also involves several people and stages in the process. With
@@ -200,7 +203,7 @@ Bug Tracker
200
203
 
201
204
  Bugs are tracked on `GitHub Issues <https://github.com/OCA/server-ux/issues>`_.
202
205
  In case of trouble, please check there if your issue has already been reported.
203
- If you spotted it first, help us smashing it by providing a detailed and welcomed
206
+ If you spotted it first, help us to smash it by providing a detailed and welcomed
204
207
  `feedback <https://github.com/OCA/server-ux/issues/new?body=module:%20base_tier_validation%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
205
208
 
206
209
  Do not contact contributors directly about support or help with technical issues.
@@ -223,6 +226,8 @@ Contributors
223
226
  * Pedro Gonzalez <pedro.gonzalez@pesol.es>
224
227
  * Kitti U. <kittiu@ecosoft.co.th>
225
228
  * Saran Lim. <saranl@ecosoft.co.th>
229
+ * Evan Soh <evan.soh@omnisoftsolution.com>
230
+ * Manuel Regidor <manuel.regidor@sygel.es>
226
231
 
227
232
  Maintainers
228
233
  ~~~~~~~~~~~