printer-core 0.0.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 (62) hide show
  1. printer_core/__init__.py +1 -0
  2. printer_core/algorithms/__init__.py +3 -0
  3. printer_core/algorithms/products_modifiers_multiprinter.py +59 -0
  4. printer_core/algorithms/products_modifiers_multiprinter_family.py +53 -0
  5. printer_core/algorithms/products_modifiers_unique_ticket.py +30 -0
  6. printer_core/builders/__init__.py +4 -0
  7. printer_core/builders/client_ticket_builder.py +97 -0
  8. printer_core/builders/header_builder.py +26 -0
  9. printer_core/builders/kitchen_ticket_payload_builder.py +99 -0
  10. printer_core/builders/printer_products_grouper.py +19 -0
  11. printer_core/clock.py +6 -0
  12. printer_core/context/__init__.py +1 -0
  13. printer_core/context/ticket_context_builder.py +55 -0
  14. printer_core/dispatchers/__init__.py +2 -0
  15. printer_core/dispatchers/kitchen_ticket_dispatcher.py +34 -0
  16. printer_core/dispatchers/payload_dispatcher.py +18 -0
  17. printer_core/entities/__init__.py +53 -0
  18. printer_core/entities/print_context.py +15 -0
  19. printer_core/entities/print_models.py +230 -0
  20. printer_core/formatters/__init__.py +1 -0
  21. printer_core/formatters/discount_formatter.py +17 -0
  22. printer_core/ports.py +45 -0
  23. printer_core/selectors/__init__.py +1 -0
  24. printer_core/selectors/family_product_selector.py +33 -0
  25. printer_core/services/__init__.py +12 -0
  26. printer_core/services/flows/__init__.py +5 -0
  27. printer_core/services/flows/base.py +26 -0
  28. printer_core/services/flows/client.py +97 -0
  29. printer_core/services/flows/kitchen.py +113 -0
  30. printer_core/services/march_printer_service.py +61 -0
  31. printer_core/services/multi_printer_family_service.py +102 -0
  32. printer_core/services/multi_printer_service.py +49 -0
  33. printer_core/services/order_print_service.py +98 -0
  34. printer_core/services/print_policy.py +72 -0
  35. printer_core/services/unique_ticket_service.py +52 -0
  36. printer_core/tests/__init__.py +0 -0
  37. printer_core/tests/unitaries/__init__.py +0 -0
  38. printer_core/tests/unitaries/helpers.py +188 -0
  39. printer_core/tests/unitaries/test_cases_output.py +189 -0
  40. printer_core/tests/unitaries/test_client_ticket_builder.py +78 -0
  41. printer_core/tests/unitaries/test_discount_formatter.py +37 -0
  42. printer_core/tests/unitaries/test_family_product_selector.py +28 -0
  43. printer_core/tests/unitaries/test_flows.py +141 -0
  44. printer_core/tests/unitaries/test_header_builder_foodeo_printers.py +87 -0
  45. printer_core/tests/unitaries/test_kitchen_ticket_dispatcher.py +61 -0
  46. printer_core/tests/unitaries/test_kitchen_ticket_payload_builder.py +113 -0
  47. printer_core/tests/unitaries/test_march_printer_service.py +31 -0
  48. printer_core/tests/unitaries/test_multi_printer_family_service.py +53 -0
  49. printer_core/tests/unitaries/test_multi_printer_service.py +51 -0
  50. printer_core/tests/unitaries/test_order_print_service.py +144 -0
  51. printer_core/tests/unitaries/test_payload_dispatcher.py +61 -0
  52. printer_core/tests/unitaries/test_print_policy.py +45 -0
  53. printer_core/tests/unitaries/test_printer_helpers.py +71 -0
  54. printer_core/tests/unitaries/test_printer_products_grouper.py +20 -0
  55. printer_core/tests/unitaries/test_products_modifiers.py +102 -0
  56. printer_core/tests/unitaries/test_ticket_context_builder.py +71 -0
  57. printer_core/tests/unitaries/test_unique_ticket_service.py +24 -0
  58. printer_core/utils/__init__.py +1 -0
  59. printer_core/utils/printer_helpers.py +42 -0
  60. printer_core-0.0.1.dist-info/METADATA +24 -0
  61. printer_core-0.0.1.dist-info/RECORD +62 -0
  62. printer_core-0.0.1.dist-info/WHEEL +4 -0
@@ -0,0 +1,113 @@
1
+ import unittest
2
+ from printer_core.builders.kitchen_ticket_payload_builder import KitchenTicketPayloadBuilder
3
+ from printer_core.entities import KitchenProductLine, PrintSettingsData, ProductsGroup
4
+
5
+ from printer_core.tests.unitaries.helpers import FakeClock, make_kitchen_settings, make_request, make_ticket_settings
6
+
7
+
8
+ class KitchenTicketPayloadBuilderTest(unittest.TestCase):
9
+ def test_build_sets_model_and_created_at(self):
10
+ builder = KitchenTicketPayloadBuilder(clock=FakeClock("2024-01-02 12:00"))
11
+ request = make_request(request_type="local")
12
+ products = [KitchenProductLine(name="A", qty=1, option=None, printer_r="P1", printer_w="80")]
13
+ ticket_settings = make_ticket_settings(qty_kitchen_ticket=2)
14
+ kitchen_settings = make_kitchen_settings(show_total_price=False, show_command_guests=False)
15
+
16
+ payload = builder.build(
17
+ request=request,
18
+ printer_name="P1",
19
+ tpv_key="TPV1",
20
+ printer_width="80",
21
+ products=products,
22
+ ticket_settings=ticket_settings,
23
+ kitchen_ticket_settings=kitchen_settings,
24
+ group_products_func=lambda items: [ProductsGroup(group="G", products=items)],
25
+ )
26
+
27
+ self.assertEqual(payload.model, 1)
28
+ self.assertEqual(payload.data.created_at, "2024-01-02 12:00")
29
+ self.assertEqual(payload.printer_qty, 2)
30
+
31
+ def test_build_uses_shift_time_for_domicile(self):
32
+ builder = KitchenTicketPayloadBuilder(clock=FakeClock("2024-01-02 12:00"))
33
+ request = make_request(
34
+ request_type="domicilio",
35
+ shift_time="10:30",
36
+ delivery_date="2024-03-10",
37
+ )
38
+ products = [KitchenProductLine(name="A", qty=1, option=None, printer_r="P1", printer_w="80")]
39
+ payload = builder.build(
40
+ request=request,
41
+ printer_name="P1",
42
+ tpv_key="TPV1",
43
+ printer_width="80",
44
+ products=products,
45
+ ticket_settings=make_ticket_settings(),
46
+ kitchen_ticket_settings=make_kitchen_settings(),
47
+ group_products_func=lambda items: [ProductsGroup(group="G", products=items)],
48
+ )
49
+
50
+ self.assertEqual(payload.data.created_at, "2024-03-10 10:30")
51
+ self.assertEqual(payload.model, 2)
52
+
53
+ def test_build_includes_total_and_command_guests(self):
54
+ builder = KitchenTicketPayloadBuilder(clock=FakeClock())
55
+ request = make_request(request_type="local", total="12.00", request_price="10.00", command_guests=3)
56
+ products = [KitchenProductLine(name="A", qty=1, option=None, printer_r="P1", printer_w="80")]
57
+ kitchen_settings = make_kitchen_settings(show_total_price=True, show_command_guests=True)
58
+
59
+ payload = builder.build(
60
+ request=request,
61
+ printer_name="P1",
62
+ tpv_key="TPV1",
63
+ printer_width="80",
64
+ products=products,
65
+ ticket_settings=make_ticket_settings(),
66
+ kitchen_ticket_settings=kitchen_settings,
67
+ group_products_func=lambda items: [ProductsGroup(group="G", products=items)],
68
+ )
69
+
70
+ self.assertEqual(payload.data.total, "12.00")
71
+ self.assertEqual(payload.data.request_price, "10.00")
72
+ self.assertEqual(payload.data.command_guests, 3)
73
+
74
+ def test_build_groups_products_when_enabled(self):
75
+ builder = KitchenTicketPayloadBuilder(clock=FakeClock())
76
+ request = make_request(request_type="local", group_by_orders=True)
77
+ products = [KitchenProductLine(name="A", qty=1, option=None, printer_r="P1", printer_w="80")]
78
+ kitchen_settings = make_kitchen_settings(show_total_price=False, show_command_guests=False)
79
+
80
+ payload = builder.build(
81
+ request=request,
82
+ printer_name="P1",
83
+ tpv_key="TPV1",
84
+ printer_width="80",
85
+ products=products,
86
+ ticket_settings=make_ticket_settings(),
87
+ kitchen_ticket_settings=kitchen_settings,
88
+ group_products_func=lambda items: [ProductsGroup(group="G", products=items)],
89
+ )
90
+
91
+ self.assertIsNone(payload.data.products)
92
+ self.assertEqual(payload.data.products_groups[0].group, "G")
93
+
94
+ def test_build_print_settings_overrides_show_header(self):
95
+ builder = KitchenTicketPayloadBuilder(clock=FakeClock())
96
+ request = make_request(
97
+ request_type="local",
98
+ PrintSettings=PrintSettingsData(show_header=True, show_local_header=False),
99
+ )
100
+ products = [KitchenProductLine(name="A", qty=1, option=None, printer_r="P1", printer_w="80")]
101
+
102
+ payload = builder.build(
103
+ request=request,
104
+ printer_name="P1",
105
+ tpv_key="TPV1",
106
+ printer_width="80",
107
+ products=products,
108
+ ticket_settings=make_ticket_settings(),
109
+ kitchen_ticket_settings=make_kitchen_settings(),
110
+ group_products_func=lambda items: [ProductsGroup(group="G", products=items)],
111
+ )
112
+
113
+ self.assertEqual(payload.PrintSettings.show_header, False)
@@ -0,0 +1,31 @@
1
+ import unittest
2
+ from printer_core.entities import MarchCommandData, PrintSettingsData
3
+ from printer_core.services.march_printer_service import MarchPrinterService
4
+
5
+ from printer_core.tests.unitaries.helpers import FakeClock, FakeGateway, make_printer
6
+
7
+
8
+ class MarchPrinterServiceTest(unittest.TestCase):
9
+ def test_build_and_send(self):
10
+ gateway = FakeGateway()
11
+ clock = FakeClock("2024-02-01 09:00")
12
+ service = MarchPrinterService(gateway=gateway, clock=clock)
13
+ printers = [make_printer(name="P1", tpv="TPV1"), make_printer(name="P2", tpv="TPV1")]
14
+ command_data = MarchCommandData(table_name="T1", credit_card=False, serial="S1", type="local")
15
+ print_settings = PrintSettingsData(show_header=False)
16
+
17
+ payloads = service.build_and_send(
18
+ printers=printers,
19
+ command_data=command_data,
20
+ order_type_text="Marchar primeros",
21
+ tpv_key="TPV1",
22
+ currency="EUR",
23
+ print_settings=print_settings,
24
+ printer_qty=2,
25
+ )
26
+
27
+ self.assertEqual(len(payloads), 2)
28
+ self.assertEqual(payloads[0].data.created_at, "2024-02-01 09:00")
29
+ self.assertEqual(payloads[0].printer_qty, 2)
30
+ self.assertEqual(len(gateway.calls), 2)
31
+ self.assertEqual(gateway.calls[0][1][0]["printer"], "P1")
@@ -0,0 +1,53 @@
1
+ from unittest.mock import patch
2
+
3
+ import unittest
4
+ from printer_core.entities import FamilyData
5
+ from printer_core.services.multi_printer_family_service import MultiPrinterFamilyService
6
+
7
+ from printer_core.tests.unitaries.helpers import FakeFamilyProvider, make_kitchen_settings, make_printer, make_product, make_request, make_ticket_settings
8
+
9
+
10
+ class MultiPrinterFamilyServiceTest(unittest.TestCase):
11
+ def test_build_and_dispatch_by_family(self):
12
+ family_1 = FamilyData(id=1, name="Family 1")
13
+ family_2 = FamilyData(id=2, name="Family 2")
14
+ provider = FakeFamilyProvider(
15
+ families=[family_1, family_2],
16
+ family_by_category={10: family_1, 20: family_2},
17
+ )
18
+ request = make_request(order_by="name")
19
+ products = [
20
+ make_product(name="A", category=10, printer=[make_printer(name="P1")]),
21
+ make_product(name="B", category=20, printer=[make_printer(name="P2")]),
22
+ make_product(name="C", category=None),
23
+ ]
24
+ kitchen_settings = make_kitchen_settings(show_price_per_unit=False)
25
+ ticket_settings = make_ticket_settings()
26
+ dispatch_calls: list[int] = []
27
+
28
+ class DummyDispatcher:
29
+ def __init__(self, gateway):
30
+ self._gateway = gateway
31
+
32
+ def dispatch(self, request, grouped_products, ticket_settings, kitchen_ticket_settings, group_products_func):
33
+ dispatch_calls.append(len(grouped_products))
34
+ return []
35
+
36
+ with patch("printer_core.services.multi_printer_family_service.KitchenTicketDispatcher", DummyDispatcher):
37
+ service = MultiPrinterFamilyService(
38
+ gateway=object(),
39
+ family_provider=provider,
40
+ currency_symbol_resolver=lambda _: "",
41
+ order_by_func=lambda items: items,
42
+ group_products_func=lambda items: [],
43
+ )
44
+ service.build_and_dispatch(
45
+ request=request,
46
+ products=products,
47
+ main_printer=make_printer(name="Main"),
48
+ ticket_settings=ticket_settings,
49
+ kitchen_ticket_settings=kitchen_settings,
50
+ )
51
+
52
+ self.assertEqual(len(dispatch_calls), 3)
53
+ self.assertTrue(all(count >= 1 for count in dispatch_calls))
@@ -0,0 +1,51 @@
1
+ from unittest.mock import patch
2
+
3
+ import unittest
4
+ from printer_core.services.multi_printer_service import MultiPrinterService
5
+
6
+ from printer_core.tests.unitaries.helpers import FakeGateway, make_kitchen_settings, make_printer, make_product, make_request, make_ticket_settings
7
+
8
+
9
+ class MultiPrinterServiceTest(unittest.TestCase):
10
+ def test_build_and_dispatch_groups_by_printer(self):
11
+ gateway = FakeGateway()
12
+ request = make_request(order_by="name")
13
+ products = [
14
+ make_product(name="B", printer=[make_printer(name="P1", printer_width="80", tpv="TPV1")]),
15
+ make_product(name="A", printer=[make_printer(name="P2", printer_width="58", tpv="TPV2")]),
16
+ ]
17
+ kitchen_settings = make_kitchen_settings(show_price_per_unit=False)
18
+ ticket_settings = make_ticket_settings()
19
+ captured: dict[str, object] = {}
20
+
21
+ class DummyDispatcher:
22
+ def __init__(self, gateway):
23
+ self._gateway = gateway
24
+
25
+ def dispatch(self, request, grouped_products, ticket_settings, kitchen_ticket_settings, group_products_func):
26
+ captured["grouped"] = grouped_products
27
+ captured["group_func"] = group_products_func
28
+ return []
29
+
30
+ def reverse_order(items):
31
+ return list(reversed(items))
32
+
33
+ with patch("printer_core.services.multi_printer_service.KitchenTicketDispatcher", DummyDispatcher):
34
+ service = MultiPrinterService(
35
+ gateway=gateway,
36
+ currency_symbol_resolver=lambda _: "",
37
+ order_by_func=reverse_order,
38
+ group_products_func=lambda items: [],
39
+ )
40
+ service.build_and_dispatch(
41
+ request=request,
42
+ products=products,
43
+ main_printer=make_printer(name="Main"),
44
+ ticket_settings=ticket_settings,
45
+ kitchen_ticket_settings=kitchen_settings,
46
+ )
47
+
48
+ grouped = captured["grouped"]
49
+ self.assertEqual(len(grouped), 2)
50
+ self.assertEqual({group.printer_name for group in grouped}, {"P1", "P2"})
51
+ self.assertEqual(captured["group_func"].__name__, "<lambda>")
@@ -0,0 +1,144 @@
1
+ import unittest
2
+ from printer_core.entities import PrintChannel, PrintJob
3
+ from printer_core.services.order_print_service import OrderPrintService
4
+ from printer_core.services.print_policy import FlowTarget
5
+
6
+ from printer_core.tests.unitaries.helpers import (
7
+ FakeClock,
8
+ make_discount,
9
+ make_global_settings,
10
+ make_kitchen_settings,
11
+ make_product,
12
+ make_request,
13
+ make_ticket_settings,
14
+ )
15
+
16
+
17
+ class FakeFlow:
18
+ def __init__(self, target: FlowTarget, return_value: list[object]):
19
+ self.target = target
20
+ self.return_value = return_value
21
+ self.calls: list[dict[str, object]] = []
22
+
23
+ def execute(self, base_request, products, context, channel, tpv_key=None):
24
+ self.calls.append({
25
+ "base_request": base_request,
26
+ "products": products,
27
+ "context": context,
28
+ "channel": channel,
29
+ "tpv_key": tpv_key,
30
+ })
31
+ return self.return_value
32
+
33
+
34
+ class OrderPrintServiceTest(unittest.TestCase):
35
+ def test_print_job_enriches_request_and_runs_flows(self):
36
+ kitchen_flow = FakeFlow(FlowTarget.KITCHEN, return_value=[{"kitchen": True}])
37
+ client_flow = FakeFlow(FlowTarget.CLIENT, return_value=[{"client": True}])
38
+ service = OrderPrintService(
39
+ gateway=object(),
40
+ header_provider=object(),
41
+ print_settings_builder=object(),
42
+ family_provider=object(),
43
+ currency_symbol_resolver=lambda _: "",
44
+ flows=[kitchen_flow, client_flow],
45
+ )
46
+ request = make_request(
47
+ request_type="local",
48
+ currency=None,
49
+ discount=make_discount(),
50
+ price_domicile_service="2.00",
51
+ )
52
+ job = PrintJob(request=request, products=[make_product()], tpv_key="TPV1")
53
+ context = type("Ctx", (), {
54
+ "ticket_settings": make_ticket_settings(ticket_kitchen_local=True, ticket_client_local=True),
55
+ "kitchen_settings": make_kitchen_settings(print_by="categories"),
56
+ "global_settings": make_global_settings(currency="EUR", iva=21),
57
+ })()
58
+
59
+ result = service.print_job(job, context, PrintChannel.LOCAL)
60
+
61
+ self.assertEqual(result.multi_printer, [{"kitchen": True}])
62
+ self.assertEqual(result.ticket_client, [{"client": True}])
63
+ enriched = kitchen_flow.calls[0]["base_request"]
64
+ self.assertIsNone(enriched.discount)
65
+ self.assertEqual(enriched.currency, "EUR")
66
+ self.assertEqual(enriched.price_domicile_service, None)
67
+ self.assertIsNotNone(enriched.ivaData)
68
+
69
+ def test_print_job_domicile_total_includes_service_price(self):
70
+ kitchen_flow = FakeFlow(FlowTarget.KITCHEN, return_value=[])
71
+ service = OrderPrintService(
72
+ gateway=object(),
73
+ header_provider=object(),
74
+ print_settings_builder=object(),
75
+ family_provider=object(),
76
+ currency_symbol_resolver=lambda _: "",
77
+ flows=[kitchen_flow],
78
+ )
79
+ service._clock = FakeClock("2024-05-01 08:00")
80
+ request = make_request(
81
+ request_type="domicilio",
82
+ request_price="10.00",
83
+ price_domicile_service="2.00",
84
+ )
85
+ job = PrintJob(request=request, products=[make_product()], tpv_key="TPV1")
86
+ context = type("Ctx", (), {
87
+ "ticket_settings": make_ticket_settings(ticket_kitchen_domicile_or_pickup=True),
88
+ "kitchen_settings": make_kitchen_settings(print_by="categories"),
89
+ "global_settings": make_global_settings(currency="EUR", iva=21),
90
+ })()
91
+
92
+ service.print_job(job, context, PrintChannel.DOMICILE)
93
+
94
+ enriched = kitchen_flow.calls[0]["base_request"]
95
+ self.assertEqual(enriched.total, "12.00")
96
+ self.assertEqual(enriched.price_domicile_service, "2.00")
97
+
98
+ def test_print_job_overrides_created_at_for_barra(self):
99
+ kitchen_flow = FakeFlow(FlowTarget.KITCHEN, return_value=[])
100
+ service = OrderPrintService(
101
+ gateway=object(),
102
+ header_provider=object(),
103
+ print_settings_builder=object(),
104
+ family_provider=object(),
105
+ currency_symbol_resolver=lambda _: "",
106
+ flows=[kitchen_flow],
107
+ )
108
+ service._clock = FakeClock("2024-05-01 08:00")
109
+ request = make_request(request_type="barra", created_at="old")
110
+ job = PrintJob(request=request, products=[make_product()], tpv_key="TPV1")
111
+ context = type("Ctx", (), {
112
+ "ticket_settings": make_ticket_settings(ticket_kitchen_barra=True),
113
+ "kitchen_settings": make_kitchen_settings(print_by="categories"),
114
+ "global_settings": make_global_settings(currency="EUR", iva=21),
115
+ })()
116
+
117
+ service.print_job(job, context, PrintChannel.BARRA)
118
+
119
+ enriched = kitchen_flow.calls[0]["base_request"]
120
+ self.assertEqual(enriched.created_at, "2024-05-01 08:00")
121
+
122
+ def test_print_job_skips_flows_when_disabled(self):
123
+ kitchen_flow = FakeFlow(FlowTarget.KITCHEN, return_value=[])
124
+ service = OrderPrintService(
125
+ gateway=object(),
126
+ header_provider=object(),
127
+ print_settings_builder=object(),
128
+ family_provider=object(),
129
+ currency_symbol_resolver=lambda _: "",
130
+ flows=[kitchen_flow],
131
+ )
132
+ request = make_request(request_type="local")
133
+ job = PrintJob(request=request, products=[make_product()], tpv_key="TPV1")
134
+ context = type("Ctx", (), {
135
+ "ticket_settings": make_ticket_settings(ticket_kitchen_local=False, ticket_client_local=False),
136
+ "kitchen_settings": make_kitchen_settings(print_by="categories"),
137
+ "global_settings": make_global_settings(currency="EUR", iva=21),
138
+ })()
139
+
140
+ result = service.print_job(job, context, PrintChannel.LOCAL)
141
+
142
+ self.assertEqual(kitchen_flow.calls, [])
143
+ self.assertIsNone(result.multi_printer)
144
+ self.assertIsNone(result.ticket_client)
@@ -0,0 +1,61 @@
1
+ import unittest
2
+ from printer_core.dispatchers.payload_dispatcher import PayloadDispatcher
3
+ from printer_core.entities import ClientTicketData, ClientTicketPayload
4
+
5
+ from printer_core.tests.unitaries.helpers import FakeGateway
6
+
7
+
8
+ class PayloadDispatcherTest(unittest.TestCase):
9
+ def test_send_model_payload(self):
10
+ gateway = FakeGateway()
11
+ dispatcher = PayloadDispatcher(gateway=gateway)
12
+ payload = ClientTicketPayload(
13
+ data=ClientTicketData(
14
+ id=1,
15
+ type="local",
16
+ serial="S1",
17
+ credit_card=False,
18
+ request_price="10.00",
19
+ ),
20
+ currency="EUR",
21
+ model=2,
22
+ company_key="TPV1",
23
+ printer="P1",
24
+ printer_qty=1,
25
+ printer_width="80",
26
+ )
27
+
28
+ dispatcher.send("TPV1", payload)
29
+
30
+ self.assertEqual(len(gateway.calls), 1)
31
+ tpv_key, data = gateway.calls[0]
32
+ self.assertEqual(tpv_key, "TPV1")
33
+ self.assertEqual(data["printer"], "P1")
34
+
35
+ def test_send_list_payload(self):
36
+ gateway = FakeGateway()
37
+ dispatcher = PayloadDispatcher(gateway=gateway)
38
+ payloads = [
39
+ ClientTicketPayload(
40
+ data=ClientTicketData(
41
+ id=1,
42
+ type="local",
43
+ serial="S1",
44
+ credit_card=False,
45
+ request_price="10.00",
46
+ ),
47
+ currency="EUR",
48
+ model=2,
49
+ company_key="TPV1",
50
+ printer="P1",
51
+ printer_qty=1,
52
+ printer_width="80",
53
+ )
54
+ ]
55
+
56
+ dispatcher.send("TPV1", payloads)
57
+
58
+ self.assertEqual(len(gateway.calls), 1)
59
+ tpv_key, data = gateway.calls[0]
60
+ self.assertEqual(tpv_key, "TPV1")
61
+ self.assertEqual(data[0]["printer"], "P1")
@@ -0,0 +1,45 @@
1
+ import unittest
2
+ from printer_core.entities import PrintChannel
3
+ from printer_core.services.print_policy import FlowTarget, PrintPolicy
4
+
5
+ from printer_core.tests.unitaries.helpers import make_global_settings, make_request, make_ticket_settings
6
+
7
+
8
+ class PrintPolicyTest(unittest.TestCase):
9
+ def test_plan_local(self):
10
+ ticket_settings = make_ticket_settings(
11
+ ticket_kitchen_local=True,
12
+ ticket_client_local=True,
13
+ )
14
+ policy = PrintPolicy(PrintChannel.LOCAL, ticket_settings, make_global_settings())
15
+
16
+ plan = policy.plan(make_request())
17
+
18
+ self.assertIn(FlowTarget.KITCHEN, plan.enabled_flows)
19
+ self.assertIn(FlowTarget.CLIENT, plan.enabled_flows)
20
+
21
+ def test_plan_barra_suppresses_client_for_credit_card(self):
22
+ ticket_settings = make_ticket_settings(
23
+ ticket_kitchen_barra=True,
24
+ ticket_client_barra=True,
25
+ )
26
+ global_settings = make_global_settings(use_payment_terminal=True)
27
+ policy = PrintPolicy(PrintChannel.BARRA, ticket_settings, global_settings)
28
+ request = make_request(credit_card=True)
29
+
30
+ plan = policy.plan(request)
31
+
32
+ self.assertIn(FlowTarget.KITCHEN, plan.enabled_flows)
33
+ self.assertNotIn(FlowTarget.CLIENT, plan.enabled_flows)
34
+
35
+ def test_plan_domicile(self):
36
+ ticket_settings = make_ticket_settings(
37
+ ticket_kitchen_domicile_or_pickup=True,
38
+ ticket_client_domicile_or_pickup=False,
39
+ )
40
+ policy = PrintPolicy(PrintChannel.DOMICILE, ticket_settings, make_global_settings())
41
+
42
+ plan = policy.plan(make_request(request_type="domicilio"))
43
+
44
+ self.assertIn(FlowTarget.KITCHEN, plan.enabled_flows)
45
+ self.assertNotIn(FlowTarget.CLIENT, plan.enabled_flows)
@@ -0,0 +1,71 @@
1
+ from decimal import Decimal
2
+
3
+ import unittest
4
+ from printer_core.entities import KitchenProductLine
5
+ from printer_core.utils.printer_helpers import build_iva_data, group_products_by_orders, order_products_by_name
6
+
7
+
8
+ class PrinterHelpersTest(unittest.TestCase):
9
+ def test_order_products_by_name(self):
10
+ products = [
11
+ KitchenProductLine(name="Zeta", qty=1, option=None, printer_r="P1", printer_w="80"),
12
+ KitchenProductLine(name="Alpha", qty=1, option=None, printer_r="P1", printer_w="80"),
13
+ ]
14
+
15
+ sorted_products = order_products_by_name(products)
16
+
17
+ self.assertEqual([item.name for item in sorted_products], ["Alpha", "Zeta"])
18
+
19
+ def test_group_products_by_orders(self):
20
+ products = [
21
+ KitchenProductLine(
22
+ name="A",
23
+ qty=1,
24
+ option=None,
25
+ printer_r="P1",
26
+ printer_w="80",
27
+ order="2",
28
+ order_readable="Mesa 2",
29
+ ),
30
+ KitchenProductLine(
31
+ name="B",
32
+ qty=1,
33
+ option=None,
34
+ printer_r="P1",
35
+ printer_w="80",
36
+ order="1",
37
+ order_readable="Mesa 1",
38
+ ),
39
+ KitchenProductLine(
40
+ name="C",
41
+ qty=1,
42
+ option=None,
43
+ printer_r="P1",
44
+ printer_w="80",
45
+ order=None,
46
+ ),
47
+ KitchenProductLine(
48
+ name="D",
49
+ qty=1,
50
+ option=None,
51
+ printer_r="P1",
52
+ printer_w="80",
53
+ order="not-a-number",
54
+ ),
55
+ ]
56
+
57
+ grouped = group_products_by_orders(products)
58
+
59
+ self.assertEqual(grouped[0].group, "Mesa 1")
60
+ self.assertEqual(grouped[0].products[0].order, "1")
61
+ self.assertEqual(grouped[1].group, "Mesa 2")
62
+ self.assertEqual(grouped[1].products[0].order, "2")
63
+ self.assertEqual(grouped[2].group, "Sin orden")
64
+ self.assertEqual([item.name for item in grouped[2].products], ["C"])
65
+
66
+ def test_build_iva_data(self):
67
+ data = build_iva_data(Decimal("121.00"), Decimal("21"))
68
+
69
+ self.assertEqual(data.Base, "100.00")
70
+ self.assertEqual(data.impo, "21.00")
71
+ self.assertEqual(data.iva, "21")
@@ -0,0 +1,20 @@
1
+ import unittest
2
+ from printer_core.builders.printer_products_grouper import PrinterProductsGrouper
3
+ from printer_core.entities import KitchenProductLine
4
+
5
+
6
+ class PrinterProductsGrouperTest(unittest.TestCase):
7
+ def test_group_by_printer_key(self):
8
+ products = [
9
+ KitchenProductLine(name="A", qty=1, option=None, printer_r="P1", printer_w="80", tpv="TPV1"),
10
+ KitchenProductLine(name="B", qty=1, option=None, printer_r="P1", printer_w="80", tpv="TPV1"),
11
+ KitchenProductLine(name="C", qty=1, option=None, printer_r="P2", printer_w="58", tpv="TPV2"),
12
+ ]
13
+
14
+ grouped = PrinterProductsGrouper.group_by_printer_key(products)
15
+
16
+ self.assertEqual(len(grouped), 2)
17
+ self.assertEqual(grouped[0].printer_name, "P1")
18
+ self.assertEqual(len(grouped[0].products), 2)
19
+ self.assertEqual(grouped[1].printer_name, "P2")
20
+ self.assertEqual(len(grouped[1].products), 1)