otrs-somconnexio 0.7.3__py2.py3-none-any.whl → 0.8.0__py2.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.
@@ -1,12 +1,9 @@
1
1
  # coding: utf-8
2
2
  from otrs_somconnexio.otrs_models.abstract_article import AbstractArticle
3
- from otrs_somconnexio.services.get_ticket_title import GetTicketTitle
4
3
 
5
4
 
6
5
  class ProvisionArticle(AbstractArticle):
7
- def __init__(self, technology, order_id, service_type, notes=""):
8
- subject = GetTicketTitle(technology, order_id, service_type).build()
6
+ def __init__(self, subject, notes=""):
9
7
  self.subject = subject
10
- if notes:
11
- self.isVisibleForCustomer = "0"
8
+ self.isVisibleForCustomer = "0" if notes else "1"
12
9
  self.body = notes
@@ -1,6 +1,6 @@
1
1
  # coding: utf-8
2
- from pyotrs.lib import Ticket
3
-
2
+ import base64
3
+ from pyotrs.lib import Attachment, Ticket
4
4
  from otrs_somconnexio.client import OTRSClient
5
5
  from otrs_somconnexio.otrs_models.provision_article import ProvisionArticle
6
6
  from otrs_somconnexio.services.get_ticket_title import GetTicketTitle
@@ -11,8 +11,12 @@ class ProvisionTicket:
11
11
  self.responsible_data = responsible_data
12
12
 
13
13
  def create(self):
14
+ new_ticket = self._build_ticket()
14
15
  self.otrs_ticket = OTRSClient().create_otrs_process_ticket(
15
- self._build_ticket(), self._build_article(), self._build_dynamic_fields()
16
+ new_ticket,
17
+ article=self._build_article(),
18
+ dynamic_fields=self._build_dynamic_fields(),
19
+ attachments=self._build_attachments(),
16
20
  )
17
21
 
18
22
  @property
@@ -40,11 +44,16 @@ class ProvisionTicket:
40
44
  }
41
45
  )
42
46
 
47
+ def _get_article_subject(self):
48
+ return self._ticket_title()
49
+
50
+ def _get_article_notes(self):
51
+ return self.service_data.notes
52
+
43
53
  def _build_article(self):
44
54
  provision_article = ProvisionArticle(
45
- self.service_data.technology,
46
- self.service_data.order_id,
47
- self.service_type(),
55
+ self._get_article_subject(),
56
+ self._get_article_notes(),
48
57
  )
49
58
  return provision_article.call()
50
59
 
@@ -55,6 +64,21 @@ class ProvisionTicket:
55
64
  self.service_type(),
56
65
  ).build()
57
66
 
67
+ def _build_attachments(self):
68
+ docs = self._files_to_attach()
69
+ if not docs:
70
+ return []
71
+ return [
72
+ Attachment.create_basic(
73
+ Content=base64.b64encode(bytes(doc["Content"], "utf-8")).decode(
74
+ "utf-8"
75
+ ),
76
+ Filename=doc["Filename"],
77
+ ContentType=doc.get("ContentType", "text/plain"),
78
+ )
79
+ for doc in docs
80
+ ]
81
+
58
82
  def _ticket_type(self):
59
83
  return self.otrs_configuration.type
60
84
 
@@ -93,3 +117,9 @@ class ProvisionTicket:
93
117
  return self.responsible_data.email
94
118
  else:
95
119
  return False
120
+
121
+ def _files_to_attach(self):
122
+ """Override to attach files to the ticket.
123
+ Format: [{"Filename": "file.txt", "Content": "file content", "ContentType": "text/plain"}, ...]
124
+ """
125
+ return []
@@ -8,6 +8,8 @@ class SwitchboardHeaderData:
8
8
  contact_phone,
9
9
  sales_team,
10
10
  technology,
11
+ lead_line_data,
12
+ agent_data,
11
13
  notes="",
12
14
  ):
13
15
  self.order_id = order_id
@@ -15,4 +17,6 @@ class SwitchboardHeaderData:
15
17
  self.contact_phone = contact_phone
16
18
  self.sales_team = sales_team
17
19
  self.technology = technology
20
+ self.lead_line_data = lead_line_data
21
+ self.agent_data = agent_data
18
22
  self.notes = notes
@@ -1,4 +1,6 @@
1
1
  # coding: utf-8
2
+ from tabulate import tabulate
3
+ from itertools import groupby
2
4
  from otrs_somconnexio.otrs_models.provision_ticket import ProvisionTicket
3
5
  from otrs_somconnexio.otrs_models.switchboard_header_dynamic_fields import (
4
6
  SwitchboardHeaderDynamicFields,
@@ -28,3 +30,59 @@ class SwitchboardHeaderTicket(ProvisionTicket):
28
30
 
29
31
  def _ticket_title(self):
30
32
  return "Provisió centraleta virtual (CV) → Capçalera"
33
+
34
+ def _files_to_attach(self):
35
+ formatted_agent_data = self._format_agent_data()
36
+
37
+ attachments = []
38
+
39
+ if formatted_agent_data:
40
+ attachments.append(
41
+ {
42
+ "Filename": "importació_agents_operator_{}.txt".format(
43
+ self.service_data.order_id
44
+ ),
45
+ "Content": formatted_agent_data,
46
+ }
47
+ )
48
+
49
+ return attachments
50
+
51
+ def _get_article_notes(self):
52
+ return self._format_lead_line_data()
53
+
54
+ def _format_lead_line_data(self):
55
+ """Format lead line data for tsv table attachment."""
56
+ lead_line_data = self.service_data.lead_line_data
57
+ if not lead_line_data:
58
+ return ""
59
+
60
+ lead_table_data = list(zip(*lead_line_data.values()))
61
+ headers = lead_line_data.keys()
62
+ lead_lines_table = tabulate(lead_table_data, headers, tablefmt="csv")
63
+
64
+ return lead_lines_table
65
+
66
+ def _format_agent_data(self):
67
+ """Format agent data for operator import attachment.
68
+ Sorted by product, grouped by product.
69
+ """
70
+ agent_data = self.service_data.agent_data
71
+ if not agent_data:
72
+ return ""
73
+
74
+ sorted_agents = sorted(agent_data, key=lambda d: d["product"])
75
+
76
+ pin = "2424"
77
+ agents_info = []
78
+ for product, agents in groupby(sorted_agents, key=lambda ag: ag["product"]):
79
+ agents_info.append(f"{product}:")
80
+
81
+ for agent in agents:
82
+ agents_info.append(
83
+ f"{agent['extension']}\t{agent['agent_name']}\t{pin}\t{agent['agent_name']}\t{agent['agent_email']}" # noqa E501
84
+ )
85
+
86
+ agents_info.append("")
87
+
88
+ return "\n".join(agents_info)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: otrs-somconnexio
3
- Version: 0.7.3
3
+ Version: 0.8.0
4
4
  Summary: Python package for Somconnexio data syncing in OTRS
5
5
  Home-page: https://gitlab.com/coopdevs/otrs_somconnexio
6
6
  Author: Coopdevs
@@ -14,6 +14,8 @@ Classifier: Programming Language :: Python :: 2.7
14
14
  Description-Content-Type: text/markdown
15
15
  Requires-Dist: pyotrs==0.12.7
16
16
  Requires-Dist: future==0.18.2
17
+ Requires-Dist: tabulate==0.9.0
18
+ Requires-Dist: more-itertools==10.0.0
17
19
 
18
20
  # Python 2.7/3.8 module to manage the SomConnexio's ERP integration with OTRS
19
21
 
@@ -19,9 +19,9 @@ otrs_somconnexio/otrs_models/mobile_data.py,sha256=Zl5AlbrtfxT4i6z83sAth_dZcOn0y
19
19
  otrs_somconnexio/otrs_models/mobile_dynamic_fields.py,sha256=cDTG310YUxtOlw8hjKTRrhOiZmC3I1nEvBncaHMhb3Q,3563
20
20
  otrs_somconnexio/otrs_models/mobile_ticket.py,sha256=aNtGteRzD-dOtPqqs3KoqggZaeLy_Za1KEBM5aHGCYI,1336
21
21
  otrs_somconnexio/otrs_models/providers.py,sha256=Jy5lm_gCuwy_BhpNE5JJ5-TrE8aFQpZvMiYZ-PTlgqs,181
22
- otrs_somconnexio/otrs_models/provision_article.py,sha256=jONH4lHzjg2jyx_mxjghw503oUT9VI9QwZrJ25HdOS0,469
22
+ otrs_somconnexio/otrs_models/provision_article.py,sha256=Zs7V9Y8Tag7B8Y_BnEWjIetMO3cSyu397TrItX1jxNI,291
23
23
  otrs_somconnexio/otrs_models/provision_dynamic_fields.py,sha256=LdYbmj2RSiGpKzFt4Ws9gUrZdRWec9jVC0lsy2BK7j0,4347
24
- otrs_somconnexio/otrs_models/provision_ticket.py,sha256=J-gFMjFuAfFe6dwaszQH_A-te4yC9Mt-IhixZT4OLRw,2801
24
+ otrs_somconnexio/otrs_models/provision_ticket.py,sha256=6Nz11-sG_0YARNqaxbJ0XQsZsXsw7XH3L_ENGIo-hFg,3746
25
25
  otrs_somconnexio/otrs_models/responsible_data.py,sha256=KCXkCNe_NLRpVLzeK8iNlbuH-tYag4YOL-MqnCFXn0g,104
26
26
  otrs_somconnexio/otrs_models/router_4G_data.py,sha256=EQIVxVstFswmEcOHzzV1ZyDYaadiU7lbunb5CJg6xAM,194
27
27
  otrs_somconnexio/otrs_models/router_4G_dynamic_fields.py,sha256=NVrfwD2Mj1TTzOC8NYna1XQYXEN6ffAfovlP9VAIHh4,403
@@ -29,9 +29,9 @@ otrs_somconnexio/otrs_models/router_4G_ticket.py,sha256=Z02DL-hgnqB_imVIB0nxZCU_
29
29
  otrs_somconnexio/otrs_models/service.py,sha256=EwxTSe6hPS33KbbPGNYzofhEhB4O4d71P9KkpOEjakA,2121
30
30
  otrs_somconnexio/otrs_models/switchboard_data.py,sha256=TQLv8Kfcz9TXJZY2yXUKD2nm1QVaMZyysYMttumH44k,1743
31
31
  otrs_somconnexio/otrs_models/switchboard_dynamic_fields.py,sha256=K1cRkn7WCxXCsvWLIblSCr30vTtynyCkDA_PVupnLDo,3149
32
- otrs_somconnexio/otrs_models/switchboard_header_data.py,sha256=8LwfLlcTAY9c9iJNOX2n8foOVuUGt7WyLA2XMpy5VuA,427
32
+ otrs_somconnexio/otrs_models/switchboard_header_data.py,sha256=Q3upfUY-alMO26b4D2uKKo531PibcZsVCCCLc35DNjQ,553
33
33
  otrs_somconnexio/otrs_models/switchboard_header_dynamic_fields.py,sha256=ODX1fa_KV6Rp_Jvnv_HMvE79VmfxX7Gs-GflMo3__54,2498
34
- otrs_somconnexio/otrs_models/switchboard_header_ticket.py,sha256=6jjC913q6n9C39eOtPx2nHY9aOEpH3wWM6lym7-xLjs,1078
34
+ otrs_somconnexio/otrs_models/switchboard_header_ticket.py,sha256=b9YwV17Kgc_gaslCIzzpSN7RZTWVr3IMBlH62WZ1WmI,2909
35
35
  otrs_somconnexio/otrs_models/switchboard_ticket.py,sha256=h1PtSnLLGlTWbE091qm2vXjia989JkpBnY0yzvn9OxA,1224
36
36
  otrs_somconnexio/otrs_models/telecom_company.py,sha256=yh8wIE7-AjWESdFsE479WWZ-3uFz_ljUBKF8GK44oow,3077
37
37
  otrs_somconnexio/otrs_models/ticket_factory.py,sha256=QL2u-51EuXy1aJWZxUZMo4JisDoKBAQM83GViXJAPx8,2215
@@ -123,28 +123,28 @@ tests/otrs_models/common_helper.py,sha256=WAd7aenHTfHvxjZMlwFfr32ajaF285Y75eifMj
123
123
  tests/otrs_models/test_abstract_article.py,sha256=udzIihoP0h8Ien20JFz1jLm5Sv2b3wO6f2JZK6zRTKQ,861
124
124
  tests/otrs_models/test_adsl_data.py,sha256=_NGpe5mStNyKPhZ5xFVS62jMdMr5vkzp9SusHmFh4r4,1484
125
125
  tests/otrs_models/test_adsl_dynamic_fields.py,sha256=KfR8RO2EoJC6YRauSBf1ktrS2cgLindyLOu3KTkI_W8,19946
126
- tests/otrs_models/test_adsl_ticket.py,sha256=t_pif_WWhUOLp-8JLbDvqIUiXW035fq386iJzb57ViY,4553
126
+ tests/otrs_models/test_adsl_ticket.py,sha256=iebdC-HDzSZEj-m_hbEsyfjkhhNeHT6FrnET9iDswJc,4587
127
127
  tests/otrs_models/test_coverage_article.py,sha256=O_wm0l75m6sBWEcMdLOvBWDNSVXJ89IkL4IijIgiuPk,1519
128
128
  tests/otrs_models/test_coverage_ticket.py,sha256=0W4f28BMhtZDvPm71d7YPJuiVi9jUI6WJBbjh3xs0mg,1019
129
129
  tests/otrs_models/test_customer_user.py,sha256=9TDojrOsQBqd4kdC8SxvG5Ub18AXkJ_tsYuUeHALZnc,2227
130
130
  tests/otrs_models/test_fiber_data.py,sha256=rdFbcqzI49PV2m30vqnBOmZr2rn_MBqC0bJd0K0dcbI,1833
131
131
  tests/otrs_models/test_fiber_dynamic_fields.py,sha256=taaR8fU8Gh0RppxfKrltDQDz4YnHaBvOOz5_qXhyWoc,27127
132
- tests/otrs_models/test_fiber_ticket.py,sha256=9CeW1x2lZRIF40sD6iPqTGtMlvnKMRvD_uPJx9c5KgU,6361
132
+ tests/otrs_models/test_fiber_ticket.py,sha256=DgbNN5oPJgMp-0o-QebzkZUOdWV4TcmFSd4t3umwxfk,6689
133
133
  tests/otrs_models/test_mobile_data.py,sha256=EBtwJL9kUaThhnKuqpUk6GFv0KS7RhyCF6dJNgr1-m8,1110
134
134
  tests/otrs_models/test_mobile_dynamic_fields.py,sha256=Xi8lj7PCJunwij-VQxqPYnafY2inEqeqQmQfSRFAmOM,19861
135
135
  tests/otrs_models/test_mobile_paused_ticket.py,sha256=T7Gyy7hoG994KHXkTWbJVQC_sC1sgZl4C1_sgpx3hwk,1418
136
- tests/otrs_models/test_mobile_ticket.py,sha256=hFWKdqUpfFOTKAitx9cUPdoIEQu_Hy_tAVOGMuQkgCc,4859
137
- tests/otrs_models/test_provision_article.py,sha256=SwTA96si0tundnu6lGCJGQcaOpnkRnKUYRKO9NcsflI,1773
136
+ tests/otrs_models/test_mobile_ticket.py,sha256=y6gqz7YY-Uo-p5xx5_TNA_-g-MJENpO2OvLofLTm6PA,5167
137
+ tests/otrs_models/test_provision_article.py,sha256=7M6fgw_CCV4ZydDapbnoCQYE0LrPyHlpqeBysp7aMYk,1188
138
138
  tests/otrs_models/test_router_4G_data.py,sha256=3zKZzWd21j8q4oXFG-Pl1Ugtkp4J0_RZx8HtHRzpfKM,1443
139
139
  tests/otrs_models/test_router_4G_dynamic_fields.py,sha256=hjUgmZHmAa5MFpaqtcRVbvaIeTZH5Xzmw6U6xbTSZxM,21577
140
- tests/otrs_models/test_router_4G_ticket.py,sha256=82KhmpV9i9tRql2cjCpouejjOwjggUAeeyJYTUFlBHY,4835
140
+ tests/otrs_models/test_router_4G_ticket.py,sha256=v5PRz3z9dK12_hmYtM7FAS3X681h7BdLumg4ag9x65I,5140
141
141
  tests/otrs_models/test_service.py,sha256=fLFyJ5wE8jszrD9sZlSOebjioR8dv8z2SeGZVcA3r5U,6833
142
142
  tests/otrs_models/test_switchboard_data.py,sha256=QlO_vupDFeavLFH1EIXVzRf4qIJ5AtuyvgCg_v4sXTE,1233
143
143
  tests/otrs_models/test_switchboard_dynamic_fields.py,sha256=JPPz5j0ArtS_RYaGQqkI7h7SupI6Vj7FfcpxnzLPYN0,6138
144
- tests/otrs_models/test_switchboard_header_data.py,sha256=kXkicBHpIaBgVSDDhEIqVgDEu1rpQG0TQLUGL0Jr_3s,534
144
+ tests/otrs_models/test_switchboard_header_data.py,sha256=k9ZZ3fnEIIrbca0572PaGLrWm6snjr94grICot3rLcs,592
145
145
  tests/otrs_models/test_switchboard_header_dynamic_fields.py,sha256=8jCN7AF3ciUHDU5olA9axJHrSvA8xrWaqtJ8cvPqXsk,3557
146
- tests/otrs_models/test_switchboard_header_ticket.py,sha256=L2ucF3I-siiA_J0Q0hwU4DR32A4Zv-LTSfuTs1y8bkg,4508
147
- tests/otrs_models/test_switchboard_ticket.py,sha256=ri1YmKGo0BS572Ma7c-oh-2x1PzwMYbqMxIoExHBsMk,5473
146
+ tests/otrs_models/test_switchboard_header_ticket.py,sha256=kxFXrjhBsYWHxAjlAJXXhIwslZ_JbDsStXN_YCu_NEs,7415
147
+ tests/otrs_models/test_switchboard_ticket.py,sha256=dQYHIyNEM_MPAzNsTljh-4qFaxyvy6HVYoHTMhnqJ64,5471
148
148
  tests/otrs_models/test_telecom_company.py,sha256=nC4uBleU2Lr3qHr5VDo-6kbcTVwKgguC85TcbhTOn1c,1450
149
149
  tests/otrs_models/test_ticket_factory.py,sha256=nvye2LK3vfYv3xRNqsBO9M0zYWRWAPWjEFgdDpY1whQ,4048
150
150
  tests/otrs_models/test_vf_provisioning_article.py,sha256=Yj8vtaowhxP12K_-FMcJNW-5re3yyCCfGLRHCPYgrVA,897
@@ -196,7 +196,7 @@ tests/services/test_update_ticket_with_provider_info.py,sha256=cZUg-hNV4BoMwafbp
196
196
  tests/user_management_client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
197
197
  tests/user_management_client/test_client.py,sha256=088q9H1yf8Hii7zUF17KULqOO-JCxJLsR7vQ8lGHiqg,4410
198
198
  tests/user_management_client/test_user_management_response.py,sha256=HCCG7i2f6-ytrRpTzYZHODKCdW-X5GJn-BMVegd5FXg,1539
199
- otrs_somconnexio-0.7.3.dist-info/METADATA,sha256=NEhwBJ7zXznXiE8D7zJ27rvuHwBjEBkcqNjiLfK-QQw,3458
200
- otrs_somconnexio-0.7.3.dist-info/WHEEL,sha256=fS9sRbCBHs7VFcwJLnLXN1MZRR0_TVTxvXKzOnaSFs8,110
201
- otrs_somconnexio-0.7.3.dist-info/top_level.txt,sha256=gvMaHGNwusWpSIy-PVyb0CKDIA4-4fXmEVER_2a-OnE,23
202
- otrs_somconnexio-0.7.3.dist-info/RECORD,,
199
+ otrs_somconnexio-0.8.0.dist-info/METADATA,sha256=8kmIb1rsU7THFSbI9ltja8v7HPAS9J7PLIgfQdCLpw0,3527
200
+ otrs_somconnexio-0.8.0.dist-info/WHEEL,sha256=fS9sRbCBHs7VFcwJLnLXN1MZRR0_TVTxvXKzOnaSFs8,110
201
+ otrs_somconnexio-0.8.0.dist-info/top_level.txt,sha256=gvMaHGNwusWpSIy-PVyb0CKDIA4-4fXmEVER_2a-OnE,23
202
+ otrs_somconnexio-0.8.0.dist-info/RECORD,,
@@ -12,7 +12,7 @@ class ADSLTicketTestCase(unittest.TestCase):
12
12
  @patch("otrs_somconnexio.otrs_models.provision_ticket.Ticket")
13
13
  def test_build_ticket(self, MockTicket):
14
14
  customer_data = Mock(spec=["id"])
15
- service_data = Mock(spec=["order_id", "technology"])
15
+ service_data = Mock(spec=["order_id", "technology", "notes"])
16
16
  expected_ticket_arguments = {
17
17
  "Title": "Ticket#{} - Només ADSL".format(service_data.order_id),
18
18
  "Type": ADSLTicketConfiguration.type,
@@ -30,18 +30,19 @@ class ADSLTicketTestCase(unittest.TestCase):
30
30
  MockTicket.assert_called_with(expected_ticket_arguments)
31
31
 
32
32
  @patch("otrs_somconnexio.otrs_models.provision_ticket.ProvisionArticle")
33
- def test_build_article(self, MockInternetArticle):
33
+ def test_build_article(self, MockProvisionArticle):
34
34
  customer_data = Mock(spec=[])
35
- service_data = Mock(spec=["order_id", "technology"])
35
+ service_data = Mock(spec=["order_id", "technology", "notes"])
36
36
 
37
- mock_mobile_article = MockInternetArticle.return_value
37
+ mock_adsl_article = MockProvisionArticle.return_value
38
38
 
39
- ADSLTicket(service_data, customer_data, None)._build_article()
39
+ ticket = ADSLTicket(service_data, customer_data, None)
40
+ ticket._build_article()
40
41
 
41
- MockInternetArticle.assert_called_with(
42
- service_data.technology, service_data.order_id, "adsl"
42
+ MockProvisionArticle.assert_called_once_with(
43
+ ticket._ticket_title(), service_data.notes
43
44
  )
44
- mock_mobile_article.call.assert_called_once()
45
+ mock_adsl_article.call.assert_called_once()
45
46
 
46
47
  @patch("otrs_somconnexio.otrs_models.adsl_ticket.ADSLDynamicFields")
47
48
  def test_build_dynamic_fields(self, MockADSLDynamicFields):
@@ -15,7 +15,7 @@ class FiberTicketTestCase(unittest.TestCase):
15
15
  @patch("otrs_somconnexio.otrs_models.provision_ticket.Ticket")
16
16
  def test_build_ticket(self, MockTicket):
17
17
  customer_data = Mock(spec=["id"])
18
- service_data = Mock(spec=["order_id", "technology"])
18
+ service_data = Mock(spec=["order_id", "technology", "notes"])
19
19
 
20
20
  expected_ticket_arguments = {
21
21
  "Title": "Ticket#{} - Només fibra".format(service_data.order_id),
@@ -36,7 +36,7 @@ class FiberTicketTestCase(unittest.TestCase):
36
36
  @patch("otrs_somconnexio.otrs_models.provision_ticket.Ticket")
37
37
  def test_build_ticket_mixed(self, MockTicket):
38
38
  customer_data = Mock(spec=["id"])
39
- service_data = Mock(spec=["order_id", "technology"])
39
+ service_data = Mock(spec=["order_id", "technology", "notes"])
40
40
  service_data.technology = "Mixta"
41
41
  expected_ticket_arguments = {
42
42
  "Title": "Ticket#{} - Fibra mixta".format(service_data.order_id),
@@ -55,16 +55,17 @@ class FiberTicketTestCase(unittest.TestCase):
55
55
  MockTicket.assert_called_with(expected_ticket_arguments)
56
56
 
57
57
  @patch("otrs_somconnexio.otrs_models.provision_ticket.ProvisionArticle")
58
- def test_build_article(self, MockInternetArticle):
58
+ def test_build_article(self, MockProvisionArticle):
59
59
  customer_data = Mock(spec=[])
60
- service_data = Mock(spec=["order_id", "technology"])
60
+ service_data = Mock(spec=["order_id", "technology", "notes"])
61
61
 
62
- mock_mobile_article = MockInternetArticle.return_value
62
+ mock_mobile_article = MockProvisionArticle.return_value
63
63
 
64
- FiberTicket(service_data, customer_data, self.responsible_data)._build_article()
64
+ ticket = FiberTicket(service_data, customer_data, self.responsible_data)
65
+ ticket._build_article()
65
66
 
66
- MockInternetArticle.assert_called_with(
67
- service_data.technology, service_data.order_id, "fiber"
67
+ MockProvisionArticle.assert_called_once_with(
68
+ ticket._ticket_title(), service_data.notes
68
69
  )
69
70
  mock_mobile_article.call.assert_called_once()
70
71
 
@@ -162,3 +163,12 @@ class FiberTicketTestCase(unittest.TestCase):
162
163
  self.assertEqual(
163
164
  ticket.otrs_configuration.service, "Banda Ancha::Fibra::Provisió Fibra"
164
165
  )
166
+
167
+ def test_files_to_attach_no_attachments(self):
168
+ customer_data = Mock()
169
+ service_data = Mock()
170
+
171
+ ticket = FiberTicket(service_data, customer_data, self.responsible_data)
172
+ attachments = ticket._files_to_attach()
173
+
174
+ self.assertFalse(attachments)
@@ -38,17 +38,18 @@ class MobileTicketTestCase(unittest.TestCase):
38
38
 
39
39
  @patch("otrs_somconnexio.otrs_models.provision_ticket.ProvisionArticle")
40
40
  def test_build_article(self, MockProvisionArticle):
41
- mobile_data = Mock(spec=["order_id", "technology"])
41
+ mobile_data = Mock(spec=["order_id", "technology", "notes"])
42
42
  mobile_data.order_id = 123
43
43
 
44
44
  customer_data = Mock(spec=["order_id"])
45
45
 
46
46
  mock_mobile_article = MockProvisionArticle.return_value
47
47
 
48
- MobileTicket(mobile_data, customer_data, self.responsible_data)._build_article()
48
+ ticket = MobileTicket(mobile_data, customer_data, self.responsible_data)
49
+ ticket._build_article()
49
50
 
50
- MockProvisionArticle.assert_called_with(
51
- mobile_data.technology, mobile_data.order_id, "mobile"
51
+ MockProvisionArticle.assert_called_once_with(
52
+ ticket._ticket_title(), mobile_data.notes
52
53
  )
53
54
  mock_mobile_article.call.assert_called_once()
54
55
 
@@ -138,3 +139,12 @@ class MobileTicketTestCase(unittest.TestCase):
138
139
 
139
140
  self.assertEqual(ticket.id, 123)
140
141
  self.assertEqual(ticket.number, "#123")
142
+
143
+ def test_files_to_attach_no_attachments(self):
144
+ customer_data = Mock()
145
+ service_data = Mock()
146
+
147
+ ticket = MobileTicket(service_data, customer_data, self.responsible_data)
148
+ attachments = ticket._files_to_attach()
149
+
150
+ self.assertFalse(attachments)
@@ -1,6 +1,6 @@
1
1
  # coding: utf-8
2
2
  import unittest
3
- from mock import Mock, patch
3
+ from mock import patch
4
4
 
5
5
  from otrs_somconnexio.otrs_models.provision_article import ProvisionArticle
6
6
 
@@ -8,42 +8,25 @@ from otrs_somconnexio.otrs_models.provision_article import ProvisionArticle
8
8
  class ProvisionArticleTestCase(unittest.TestCase):
9
9
  @patch("otrs_somconnexio.otrs_models.abstract_article.Article")
10
10
  def test_call_with_notes(self, MockArticle):
11
-
11
+ subject = "test subject"
12
+ notes = "test notes"
12
13
  expected_article_arguments = {
13
- "Subject": "Ticket#b - Només ADSL",
14
- "Body": "c",
14
+ "Subject": subject,
15
+ "Body": notes,
15
16
  "ContentType": "text/plain; charset=utf8",
16
17
  "IsVisibleForCustomer": "0",
17
18
  }
18
- ProvisionArticle(
19
- service_type="adsl", technology="a", order_id="b", notes="c"
20
- ).call()
19
+ ProvisionArticle(subject=subject, notes=notes).call()
21
20
  MockArticle.assert_called_once_with(expected_article_arguments)
22
21
 
23
22
  @patch("otrs_somconnexio.otrs_models.abstract_article.Article")
24
23
  def test_call_without_notes(self, MockArticle):
25
-
24
+ subject = "test subject"
26
25
  expected_article_arguments = {
27
- "Subject": "Ticket#b - Només fibra",
26
+ "Subject": subject,
28
27
  "Body": "",
29
28
  "ContentType": "text/plain; charset=utf8",
30
29
  "IsVisibleForCustomer": "1",
31
30
  }
32
- ProvisionArticle(
33
- service_type="fiber", technology="a", order_id="b", notes=""
34
- ).call()
35
- MockArticle.assert_called_once_with(expected_article_arguments)
36
-
37
- @patch("otrs_somconnexio.otrs_models.abstract_article.Article")
38
- def test_call_mixed(self, MockArticle):
39
-
40
- expected_article_arguments = {
41
- "Subject": "Ticket#b - Mòbil mixta",
42
- "Body": "c",
43
- "ContentType": "text/plain; charset=utf8",
44
- "IsVisibleForCustomer": "0",
45
- }
46
- ProvisionArticle(
47
- service_type="mobile", technology="Mixta", order_id="b", notes="c"
48
- ).call()
31
+ ProvisionArticle(subject=subject, notes="").call()
49
32
  MockArticle.assert_called_once_with(expected_article_arguments)
@@ -15,7 +15,7 @@ class Router4GTicketTestCase(unittest.TestCase):
15
15
  @patch("otrs_somconnexio.otrs_models.provision_ticket.Ticket")
16
16
  def test_build_ticket(self, MockTicket):
17
17
  customer_data = Mock(spec=["id"])
18
- service_data = Mock(spec=["order_id", "technology"])
18
+ service_data = Mock(spec=["order_id", "technology", "notes"])
19
19
 
20
20
  expected_ticket_arguments = {
21
21
  "Title": "Ticket#{} - Només 4G".format(service_data.order_id),
@@ -36,20 +36,19 @@ class Router4GTicketTestCase(unittest.TestCase):
36
36
  MockTicket.assert_called_with(expected_ticket_arguments)
37
37
 
38
38
  @patch("otrs_somconnexio.otrs_models.provision_ticket.ProvisionArticle")
39
- def test_build_article(self, MockInternetArticle):
39
+ def test_build_article(self, MockProvisionArticle):
40
40
  customer_data = Mock(spec=[])
41
- service_data = Mock(spec=["order_id", "technology"])
41
+ service_data = Mock(spec=["order_id", "technology", "notes"])
42
42
 
43
- mock_internet_article = MockInternetArticle.return_value
43
+ mock_provision_article = MockProvisionArticle.return_value
44
44
 
45
- Router4GTicket(
46
- service_data, customer_data, self.responsible_data
47
- )._build_article()
45
+ ticket = Router4GTicket(service_data, customer_data, self.responsible_data)
46
+ ticket._build_article()
48
47
 
49
- MockInternetArticle.assert_called_with(
50
- service_data.technology, service_data.order_id, "4G"
48
+ MockProvisionArticle.assert_called_once_with(
49
+ ticket._ticket_title(), service_data.notes
51
50
  )
52
- mock_internet_article.call.assert_called_once()
51
+ mock_provision_article.call.assert_called_once()
53
52
 
54
53
  @patch("otrs_somconnexio.otrs_models.router_4G_ticket.Router4GDynamicFields")
55
54
  def test_build_dynamic_fields(self, MockRouter4GDynamicFields):
@@ -133,3 +132,12 @@ class Router4GTicketTestCase(unittest.TestCase):
133
132
 
134
133
  self.assertEqual(ticket.id, 123)
135
134
  self.assertEqual(ticket.number, "#123")
135
+
136
+ def test_files_to_attach_no_attachments(self):
137
+ customer_data = Mock()
138
+ service_data = Mock()
139
+
140
+ ticket = Router4GTicket(service_data, customer_data, self.responsible_data)
141
+ attachments = ticket._files_to_attach()
142
+
143
+ self.assertFalse(attachments)
@@ -10,6 +10,8 @@ class SwitchboardHeaderDataTestCase(unittest.TestCase):
10
10
  order_id=123,
11
11
  contact_phone="666666661",
12
12
  email="test@test.com",
13
+ agent_data=[],
14
+ lead_line_data={},
13
15
  sales_team="residential",
14
16
  technology="switchboard",
15
17
  notes="Notes",
@@ -40,20 +40,21 @@ class SwitchboardHeaderTicketTestCase(unittest.TestCase):
40
40
 
41
41
  @patch("otrs_somconnexio.otrs_models.provision_ticket.ProvisionArticle")
42
42
  def test_build_article(self, MockProvisionArticle):
43
- service_data = Mock(spec=["order_id", "technology"])
43
+ service_data = Mock(spec=["order_id", "technology", "lead_line_data"])
44
44
  service_data.order_id = 123
45
+ service_data.lead_line_data = {}
45
46
  customer_data = Mock(spec=["order_id"])
46
47
 
47
48
  mock_article = MockProvisionArticle.return_value
48
49
 
49
- SwitchboardHeaderTicket(
50
+ ticket = SwitchboardHeaderTicket(
50
51
  service_data, customer_data, self.responsible_data
51
- )._build_article()
52
+ )
53
+ ticket._build_article()
52
54
 
53
55
  MockProvisionArticle.assert_called_with(
54
- service_data.technology,
55
- service_data.order_id,
56
- "switchboard_header",
56
+ ticket._ticket_title(),
57
+ ticket._format_lead_line_data(),
57
58
  )
58
59
  mock_article.call.assert_called_once()
59
60
 
@@ -90,6 +91,8 @@ class SwitchboardHeaderTicketTestCase(unittest.TestCase):
90
91
  "previous_owner_name",
91
92
  "previous_owner_surname",
92
93
  "sales_team",
94
+ "agent_data",
95
+ "lead_line_data",
93
96
  "type",
94
97
  "notes",
95
98
  ]
@@ -108,6 +111,8 @@ class SwitchboardHeaderTicketTestCase(unittest.TestCase):
108
111
  "language",
109
112
  ]
110
113
  )
114
+ service_data.agent_data = []
115
+ service_data.lead_line_data = {}
111
116
 
112
117
  mock_otrs_client = Mock(spec=["create_otrs_process_ticket"])
113
118
  mock_otrs_client.create_otrs_process_ticket.return_value = Mock(
@@ -125,3 +130,76 @@ class SwitchboardHeaderTicketTestCase(unittest.TestCase):
125
130
  mock_otrs_client.create_otrs_process_ticket.assert_called_once()
126
131
  self.assertEqual(ticket.id, 123)
127
132
  self.assertEqual(ticket.number, "#123")
133
+
134
+ def test_files_to_attach(self):
135
+ service_data = Mock(spec=["order_id", "agent_data"])
136
+ customer_data = Mock()
137
+ service_data.order_id = 123
138
+ service_data.agent_data = [
139
+ {
140
+ "product": "product1",
141
+ "extension": "ext1",
142
+ "agent_name": "agent1",
143
+ "agent_email": "agent1@test.com",
144
+ },
145
+ {
146
+ "product": "product2",
147
+ "extension": "ext2",
148
+ "agent_name": "agent2",
149
+ "agent_email": "agent2@test.com",
150
+ },
151
+ {
152
+ "product": "product3",
153
+ "extension": "ext3",
154
+ "agent_name": "agent3",
155
+ "agent_email": "agent3@test.com",
156
+ },
157
+ ]
158
+
159
+ sb_header_ticket = SwitchboardHeaderTicket(
160
+ service_data, customer_data, self.responsible_data
161
+ )
162
+ files = sb_header_ticket._files_to_attach()
163
+
164
+ self.assertEqual(len(files), 1)
165
+ agent_data_file = files[0]
166
+ self.assertEqual(
167
+ agent_data_file["Filename"],
168
+ "importació_agents_operator_{}.txt".format(service_data.order_id),
169
+ )
170
+ self.assertIn("product1:\n", agent_data_file["Content"])
171
+ self.assertIn(
172
+ "ext1\tagent1\t2424\tagent1\tagent1@test.com\n", agent_data_file["Content"]
173
+ )
174
+ self.assertIn("product2:\n", agent_data_file["Content"])
175
+ self.assertIn(
176
+ "ext2\tagent2\t2424\tagent2\tagent2@test.com\n", agent_data_file["Content"]
177
+ )
178
+ self.assertIn("product3:\n", agent_data_file["Content"])
179
+ self.assertIn(
180
+ "ext3\tagent3\t2424\tagent3\tagent3@test.com\n", agent_data_file["Content"]
181
+ )
182
+
183
+ def test_format_lead_line_data(self):
184
+ service_data = Mock(spec=["order_id", "lead_line_data"])
185
+ customer_data = Mock()
186
+ service_data.order_id = 123
187
+ service_data.lead_line_data = {
188
+ "Prod": ["product1", "product2", "product3"],
189
+ "Ext": ["ext1", "ext2", "ext3"],
190
+ "Nom": ["agent1", "agent2", "agent3"],
191
+ "Telf": ["111", "222", "333"],
192
+ "Tipus": ["tipus1", "tipus2", "tipus3"],
193
+ }
194
+
195
+ sb_header_ticket = SwitchboardHeaderTicket(
196
+ service_data, customer_data, self.responsible_data
197
+ )
198
+ lead_line_table = sb_header_ticket._format_lead_line_data()
199
+
200
+ for header in service_data.lead_line_data.keys():
201
+ self.assertIn(header, lead_line_table)
202
+ self.assertEqual(
203
+ lead_line_table.count("\n"),
204
+ len(service_data.lead_line_data["Prod"]) + 1,
205
+ ) # headers + number of rows
@@ -12,7 +12,7 @@ class SwitchboardTicketTestCase(unittest.TestCase):
12
12
  def setUp(self):
13
13
  self.responsible_data = Mock(spec=["email"])
14
14
  self.service_data = Mock(
15
- spec=["order_id", "technology", "landline", "mobile_phone_number"]
15
+ spec=["order_id", "technology", "landline", "mobile_phone_number", "notes"]
16
16
  )
17
17
  self.service_data.order_id = 123
18
18
  self.customer_data = Mock(spec=["id"])
@@ -59,13 +59,14 @@ class SwitchboardTicketTestCase(unittest.TestCase):
59
59
  def test_build_article(self, MockProvisionArticle):
60
60
  mock_article = MockProvisionArticle.return_value
61
61
 
62
- SwitchboardTicket(
62
+ ticket = SwitchboardTicket(
63
63
  self.service_data, self.customer_data, self.responsible_data
64
- )._build_article()
64
+ )
65
+ ticket._build_article()
66
+
65
67
  MockProvisionArticle.assert_called_with(
66
- self.service_data.technology,
67
- self.service_data.order_id,
68
- "switchboard",
68
+ ticket._ticket_title(),
69
+ self.service_data.notes,
69
70
  )
70
71
  mock_article.call.assert_called_once()
71
72