Merge lp:~camptocamp/carriers-deliveries/7.0-add-delivery_carrier_label_postlogistics-yvr into lp:~stock-logistic-core-editors/carriers-deliveries/7.0

Proposed by Yannick Vaucher @ Camptocamp
Status: Merged
Merged at revision: 9
Proposed branch: lp:~camptocamp/carriers-deliveries/7.0-add-delivery_carrier_label_postlogistics-yvr
Merge into: lp:~stock-logistic-core-editors/carriers-deliveries/7.0
Prerequisite: lp:~camptocamp/carriers-deliveries/7.0-add-base_delivery_carrier_label-yvr
Diff against target: 4267 lines
To merge this branch: bzr merge lp:~camptocamp/carriers-deliveries/7.0-add-delivery_carrier_label_postlogistics-yvr
Reviewer Review Type Date Requested Status
Joël Grand-Guillaume @ camptocamp code review, no tests Approve
Guewen Baconnier @ Camptocamp code review Approve
Review via email: mp+196839@code.launchpad.net

This proposal supersedes a proposal from 2013-11-26.

Description of the change

This module implements Swiss PostLogics "Barcode" webservice to generate shipping labels.
http://www.poste.ch/post-barcode-cug.htm

* it connects to WebService using suds SOAP client
* it permits to retrieve all services provided by Postlogistics with translations in available languages with an update button in settings
* options are filtered in carrier in order to improve user experience

Depends on following MP:

https://code.launchpad.net/~camptocamp/carriers-deliveries/7.0-add-base_delivery_carrier_label-yvr/+merge/196753

To post a comment you must log in.
Revision history for this message
Guewen Baconnier @ Camptocamp (gbaconnier-c2c) wrote : Posted in a previous version of this proposal

On the name of the module: rename delivery_carrier_label_laposte to delivery_carrier_label_postlogistics: "laposte" has been used for "La Poste" (from France) for the delivery files.

Suds does not have an exception class for the authentication errors? I think that it should, seems to be suds.transport.TransportError

        try:
            res['value'] = request(**kwargs)
            res['success'] = True
        except WebFault, e:
            res['success'] = False
            res['errors'] = [e[0]]
        except Exception, e:

On a side note, the preferred notation now is "except Exception as e:

            # if authentification error
            if isinstance(e[0], tuple) and e[0][0] == 401:
                raise orm.except_orm(
                    _('Error 401'),
                    _('Authorization Required\n\n'
                    'Please verify postlogistics username and password in:\n'
                    'Configuration -> Postlogistics'))
            raise e

"raise e" is wrong, you will mess the traceback (it will start from the current line instead of the original one), to propagate correctly the current exception, the correct idiom is just "raise".

Regarding the comment below, the weight (and weight_net) field already exists on the picking.

        #XXX get weight or set it as an option on picking
        weight = 0

Revision history for this message
Yannick Vaucher @ Camptocamp (yvaucher-c2c) wrote :
Revision history for this message
Yannick Vaucher @ Camptocamp (yvaucher-c2c) wrote :

https://bitbucket.org/jurko/suds/src/627c4f4e2aed730aab9d0632fab9ac7383c74230/suds/client.py?at=default#cl-676

I'm receiving this kind of Exceptions from suds. I fear, it isn't fully implemented yet.

Revision history for this message
Guewen Baconnier @ Camptocamp (gbaconnier-c2c) wrote :

> https://bitbucket.org/jurko/suds/src/627c4f4e2aed730aab9d0632fab9ac7383c74230/
> suds/client.py?at=default#cl-676
>
> I'm receiving this kind of Exceptions from suds. I fear, it isn't fully
> implemented yet.

Arg. Ok, so :-)

Revision history for this message
Yannick Vaucher @ Camptocamp (yvaucher-c2c) wrote :
Revision history for this message
Guewen Baconnier @ Camptocamp (gbaconnier-c2c) wrote :

Thanks! LGTM

review: Approve (code review)
Revision history for this message
Joël Grand-Guillaume @ camptocamp (jgrandguillaume-c2c) wrote :

öLTM, thanks for the job !

review: Approve (code review, no tests)
Revision history for this message
Yannick Vaucher @ Camptocamp (yvaucher-c2c) wrote :
Revision history for this message
Yannick Vaucher @ Camptocamp (yvaucher-c2c) wrote :
Revision history for this message
Guewen Baconnier @ Camptocamp (gbaconnier-c2c) wrote :

Missing rights on postlogistics.service.group, fixed.

Revision history for this message
Yannick Vaucher @ Camptocamp (yvaucher-c2c) wrote :

Just did a little change to show all basic services of a service group to allow a multi selection

Revision history for this message
Guewen Baconnier @ Camptocamp (gbaconnier-c2c) wrote :

> Just did a little change to show all basic services of a service group to
> allow a multi selection
LGTM

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added directory 'delivery_carrier_label_postlogistics'
=== added file 'delivery_carrier_label_postlogistics/__init__.py'
--- delivery_carrier_label_postlogistics/__init__.py 1970-01-01 00:00:00 +0000
+++ delivery_carrier_label_postlogistics/__init__.py 2014-01-13 11:23:36 +0000
@@ -0,0 +1,25 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# Author: Yannick Vaucher
5# Copyright 2013 Camptocamp SA
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21from . import company
22from . import res_config
23from . import postlogistics
24from . import delivery
25from . import stock
026
=== added file 'delivery_carrier_label_postlogistics/__openerp__.py'
--- delivery_carrier_label_postlogistics/__openerp__.py 1970-01-01 00:00:00 +0000
+++ delivery_carrier_label_postlogistics/__openerp__.py 2014-01-13 11:23:36 +0000
@@ -0,0 +1,111 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# Author: Yannick Vaucher
5# Copyright 2013 Camptocamp SA
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21{'name': 'PostLogistics Labels WebService',
22 'version': '1.0',
23 'author': 'Camptocamp',
24 'maintainer': 'Camptocamp',
25 'category': 'version',
26 'complexity': 'normal',
27 'depends': ['base_delivery_carrier_label'],
28 'description': """
29PostLogistics Labels WebService
30===============================
31
32Description
33-----------
34
35This module uses `PostLogistics BarCodes WebService`_ to generate labels
36for your Delivery Orders.
37
38It adds a `Create label` button on Delivery Orders.
39A generated label will be an attachement of your Delivery Order.
40
41To see it, please install documents module.
42
43You can create multiple delivery method to match your diffent package types.
44
45
46Configuration
47-------------
48
49.. important::
50 A "Swiss Post Business customer" account is required to use this module.
51
52 See `Swiss Post E-logistics`_
53
54
55To configure:
56
57* Go to `Configurations -> Settings -> Postlogistics`
58* Set your login informations
59* launch the Update PostLogistics Services
60
61This will load available services and generate carrier options.
62
63Now you can create a carrier method for PostLogistics WebService:
64
65* First choose a Service group and save
66* Add a Mandatory Carrier option using a Basic Service
67* Save Carrier Method (this will update filters to show you only
68 compatible services)
69* Then add other `Optional as default` and `Optional` carrier option
70 from listed
71* Additional Service and Delivery instructions
72
73.. _PostLogistics BarCodes WebService: http://www.poste.ch/post-startseite/post-geschaeftskunden/post-logistik/post-e-log/post-e-log-webservices.htm
74.. _Swiss Post E-logistics: http://www.poste.ch/en/post-startseite/post-geschaeftskunden/post-logistik/post-e-log.htm
75
76Technical references
77--------------------
78
79`"Barcode" web service documentation`_
80
81.. _"Barcode" web service documentation: http://www.poste.ch/post-barcode-cug.htm
82
83Contributors
84------------
85
86* Yannick Vaucher <yannick.vaucher@camptocamp.com>
87
88----
89
90*TODO*:
91
92* *Add onchange to improve carrier method creation*
93* *Identify attachement as label*
94* *Better License management*
95""",
96 'website': 'http://www.camptocamp.com/',
97 'data': ['res_partner_data.xml',
98 'delivery_data.xml',
99 'delivery_view.xml',
100 'res_config_view.xml',
101 'security/ir.model.access.csv',
102 ],
103 'tests': [],
104 'installable': True,
105 'auto_install': False,
106 'license': 'AGPL-3',
107 'application': True,
108 'external_dependencies': {
109 'python': ['suds'],
110 }
111 }
0112
=== added file 'delivery_carrier_label_postlogistics/company.py'
--- delivery_carrier_label_postlogistics/company.py 1970-01-01 00:00:00 +0000
+++ delivery_carrier_label_postlogistics/company.py 2014-01-13 11:23:36 +0000
@@ -0,0 +1,54 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# Author: Yannick Vaucher
5# Copyright 2013 Camptocamp SA
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21from openerp.osv import orm, fields
22from openerp.tools import file_open
23
24
25class ResCompany(orm.Model):
26 _inherit = 'res.company'
27
28 def _get_wsdl_url(self, cr, uid, ids, field_name, arg, context=None):
29 wsdl_file, wsdl_path = file_open('delivery_carrier_label_postlogistics/data/barcode_v2_1.wsdl', pathinfo=True)
30 wsdl_url = 'file://' + wsdl_path
31 res = dict.fromkeys(ids, wsdl_url)
32 return res
33
34 _columns = {
35 'postlogistics_wsdl_url': fields.function(
36 _get_wsdl_url,
37 string='WSDL URL',
38 type='char'),
39 'postlogistics_username': fields.char('Username'),
40 'postlogistics_password': fields.char('Password'),
41 # XXX improve license management
42 'postlogistics_license_less_1kg': fields.char('License less than 1kg'),
43 'postlogistics_license_more_1kg': fields.char('License more than 1kg'),
44 'postlogistics_license_vinolog': fields.char('License VinoLog'),
45 'postlogistics_logo': fields.binary('Company logo for PostLogistics'),
46 'postlogistics_office': fields.char('Post office'),
47
48 'postlogistics_default_label_layout': fields.many2one(
49 'delivery.carrier.template.option', 'Default label layout'),
50 'postlogistics_default_output_format': fields.many2one(
51 'delivery.carrier.template.option', 'Default output format'),
52 'postlogistics_default_resolution': fields.many2one(
53 'delivery.carrier.template.option', 'Default resolution'),
54 }
055
=== added directory 'delivery_carrier_label_postlogistics/data'
=== added file 'delivery_carrier_label_postlogistics/data/barcode_v2_1.wsdl'
--- delivery_carrier_label_postlogistics/data/barcode_v2_1.wsdl 1970-01-01 00:00:00 +0000
+++ delivery_carrier_label_postlogistics/data/barcode_v2_1.wsdl 2014-01-13 11:23:36 +0000
@@ -0,0 +1,249 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<definitions name="Barcode"
3 targetNamespace="https://www.mypostbusiness.ch/wsbc/barcode/v2_1"
4 xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="https://www.mypostbusiness.ch/wsbc/barcode/v2_1"
5 xmlns:barcode="https://www.mypostbusiness.ch/wsbc/barcode/v2_1/types"
6 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
7 <types>
8 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
9 <xsd:import
10 namespace="https://www.mypostbusiness.ch/wsbc/barcode/v2_1/types"
11 schemaLocation="barcode_v2_1.xsd" />
12 </xsd:schema>
13 </types>
14
15 <message name="ValidateCombination">
16 <part name="body" element="barcode:ValidateCombination" />
17 </message>
18 <message name="ValidateCombinationResponse">
19 <part name="body" element="barcode:ValidateCombinationResponse" />
20 </message>
21
22 <message name="GenerateLabel">
23 <part name="body" element="barcode:GenerateLabel" />
24 </message>
25 <message name="GenerateLabelResponse">
26 <part name="body" element="barcode:GenerateLabelResponse" />
27 </message>
28
29 <message name="GenerateSingleBarcodes">
30 <part name="body" element="barcode:GenerateSingleBarcodes" />
31 </message>
32 <message name="GenerateSingleBarcodesResponse">
33 <part name="body" element="barcode:GenerateSingleBarcodesResponse" />
34 </message>
35
36 <message name="ReadServiceGroups">
37 <part name="body" element="barcode:ReadServiceGroups" />
38 </message>
39 <message name="ReadServiceGroupsResponse">
40 <part name="body" element="barcode:ReadServiceGroupsResponse" />
41 </message>
42
43 <message name="ReadBasicServices">
44 <part name="body" element="barcode:ReadBasicServices" />
45 </message>
46 <message name="ReadBasicServicesResponse">
47 <part name="body" element="barcode:ReadBasicServicesResponse" />
48 </message>
49
50 <message name="ReadAllowedServicesByFrankingLicense">
51 <part name="body" element="barcode:ReadAllowedServicesByFrankingLicense" />
52 </message>
53 <message name="ReadAllowedServicesByFrankingLicenseResponse">
54 <part name="body"
55 element="barcode:ReadAllowedServicesByFrankingLicenseResponse" />
56 </message>
57
58 <message name="ReadAdditionalServices">
59 <part name="body" element="barcode:ReadAdditionalServices" />
60 </message>
61 <message name="ReadAdditionalServicesResponse">
62 <part name="body" element="barcode:ReadAdditionalServicesResponse" />
63 </message>
64
65 <message name="ReadDeliveryInstructions">
66 <part name="body" element="barcode:ReadDeliveryInstructions" />
67 </message>
68 <message name="ReadDeliveryInstructionsResponse">
69 <part name="body" element="barcode:ReadDeliveryInstructionsResponse" />
70 </message>
71
72 <message name="ReadLabelLayouts">
73 <part name="body" element="barcode:ReadLabelLayouts" />
74 </message>
75 <message name="ReadLabelLayoutsResponse">
76 <part name="body" element="barcode:ReadLabelLayoutsResponse" />
77 </message>
78
79 <message name="GenerateBarcode">
80 <part name="body" element="barcode:GenerateBarcode" />
81 </message>
82 <message name="GenerateBarcodeResponse">
83 <part name="body" element="barcode:GenerateBarcodeResponse" />
84 </message>
85
86 <portType name="BarcodePortType">
87
88 <operation name="ValidateCombination">
89 <input message="tns:ValidateCombination" />
90 <output message="tns:ValidateCombinationResponse" />
91 </operation>
92
93 <operation name="GenerateLabel">
94 <input message="tns:GenerateLabel" />
95 <output message="tns:GenerateLabelResponse" />
96 </operation>
97
98 <operation name="GenerateSingleBarcodes">
99 <input message="tns:GenerateSingleBarcodes" />
100 <output message="tns:GenerateSingleBarcodesResponse" />
101 </operation>
102
103 <operation name="ReadServiceGroups">
104 <input message="tns:ReadServiceGroups" />
105 <output message="tns:ReadServiceGroupsResponse" />
106 </operation>
107
108 <operation name="ReadBasicServices">
109 <input message="tns:ReadBasicServices" />
110 <output message="tns:ReadBasicServicesResponse" />
111 </operation>
112
113 <operation name="ReadAllowedServicesByFrankingLicense">
114 <input message="tns:ReadAllowedServicesByFrankingLicense" />
115 <output message="tns:ReadAllowedServicesByFrankingLicenseResponse" />
116 </operation>
117
118 <operation name="ReadAdditionalServices">
119 <input message="tns:ReadAdditionalServices" />
120 <output message="tns:ReadAdditionalServicesResponse" />
121 </operation>
122
123 <operation name="ReadDeliveryInstructions">
124 <input message="tns:ReadDeliveryInstructions" />
125 <output message="tns:ReadDeliveryInstructionsResponse" />
126 </operation>
127
128 <operation name="ReadLabelLayouts">
129 <input message="tns:ReadLabelLayouts" />
130 <output message="tns:ReadLabelLayoutsResponse" />
131 </operation>
132
133 <operation name="GenerateBarcode">
134 <input message="tns:GenerateBarcode" />
135 <output message="tns:GenerateBarcodeResponse" />
136 </operation>
137
138 </portType>
139 <binding name="BarcodeSoapBinding" type="tns:BarcodePortType">
140 <soap:binding style="document"
141 transport="http://schemas.xmlsoap.org/soap/http" />
142
143 <operation name="ValidateCombination">
144 <soap:operation soapAction="ValidateCombination" />
145 <input>
146 <soap:body use="literal" />
147 </input>
148 <output>
149 <soap:body use="literal" />
150 </output>
151 </operation>
152
153 <operation name="GenerateLabel">
154 <soap:operation soapAction="GenerateLabel" />
155 <input>
156 <soap:body use="literal" />
157 </input>
158 <output>
159 <soap:body use="literal" />
160 </output>
161 </operation>
162
163 <operation name="GenerateSingleBarcodes">
164 <soap:operation soapAction="GenerateSingleBarcodes" />
165 <input>
166 <soap:body use="literal" />
167 </input>
168 <output>
169 <soap:body use="literal" />
170 </output>
171 </operation>
172
173 <operation name="ReadServiceGroups">
174 <soap:operation soapAction="ReadServiceGroups" />
175 <input>
176 <soap:body use="literal" />
177 </input>
178 <output>
179 <soap:body use="literal" />
180 </output>
181 </operation>
182
183 <operation name="ReadBasicServices">
184 <soap:operation soapAction="ReadBasicServices" />
185 <input>
186 <soap:body use="literal" />
187 </input>
188 <output>
189 <soap:body use="literal" />
190 </output>
191 </operation>
192
193 <operation name="ReadAllowedServicesByFrankingLicense">
194 <soap:operation soapAction="ReadAllowedServicesByFrankingLicense" />
195 <input>
196 <soap:body use="literal" />
197 </input>
198 <output>
199 <soap:body use="literal" />
200 </output>
201 </operation>
202
203 <operation name="ReadAdditionalServices">
204 <soap:operation soapAction="ReadAdditionalServices" />
205 <input>
206 <soap:body use="literal" />
207 </input>
208 <output>
209 <soap:body use="literal" />
210 </output>
211 </operation>
212
213 <operation name="ReadDeliveryInstructions">
214 <soap:operation soapAction="ReadDeliveryInstructions" />
215 <input>
216 <soap:body use="literal" />
217 </input>
218 <output>
219 <soap:body use="literal" />
220 </output>
221 </operation>
222
223 <operation name="ReadLabelLayouts">
224 <soap:operation soapAction="ReadLabelLayouts" />
225 <input>
226 <soap:body use="literal" />
227 </input>
228 <output>
229 <soap:body use="literal" />
230 </output>
231 </operation>
232
233 <operation name="GenerateBarcode">
234 <soap:operation soapAction="GenerateBarcode" />
235 <input>
236 <soap:body use="literal" />
237 </input>
238 <output>
239 <soap:body use="literal" />
240 </output>
241 </operation>
242
243 </binding>
244 <service name="BarcodeService">
245 <port name="BarcodePort" binding="tns:BarcodeSoapBinding">
246 <soap:address location="https://www.mypostbusiness.ch/wsbc/barcode/v2_1" />
247 </port>
248 </service>
249</definitions>
0\ No newline at end of file250\ No newline at end of file
1251
=== added file 'delivery_carrier_label_postlogistics/data/barcode_v2_1.xsd'
--- delivery_carrier_label_postlogistics/data/barcode_v2_1.xsd 1970-01-01 00:00:00 +0000
+++ delivery_carrier_label_postlogistics/data/barcode_v2_1.xsd 2014-01-13 11:23:36 +0000
@@ -0,0 +1,1198 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
3 xmlns="https://www.mypostbusiness.ch/wsbc/barcode/v2_1/types"
4 targetNamespace="https://www.mypostbusiness.ch/wsbc/barcode/v2_1/types"
5 elementFormDefault="qualified" attributeFormDefault="unqualified">
6
7 <!-- 5.4 Use Case Validiere Kombination (Seite 12) -->
8 <xs:element name="ValidateCombination">
9 <xs:complexType>
10 <xs:sequence>
11 <xs:element name="Language" type="Language" />
12 <xs:element name="Envelope">
13 <xs:complexType>
14 <xs:sequence>
15 <xs:element name="LabelDefinition" type="LabelDefinition" />
16 <xs:element name="Data">
17 <xs:complexType>
18 <xs:sequence>
19 <xs:element name="Provider">
20 <xs:complexType>
21 <xs:sequence>
22 <xs:element name="Sending">
23 <xs:complexType>
24 <xs:sequence>
25 <xs:element name="Item"
26 type="ValidateCombinationItem"
27 maxOccurs="unbounded" />
28 </xs:sequence>
29 </xs:complexType>
30 </xs:element>
31 </xs:sequence>
32 </xs:complexType>
33 </xs:element>
34 </xs:sequence>
35 </xs:complexType>
36 </xs:element>
37 </xs:sequence>
38 </xs:complexType>
39 </xs:element>
40 </xs:sequence>
41 </xs:complexType>
42 </xs:element>
43
44 <xs:complexType name="ValidateCombinationItem">
45 <xs:sequence>
46 <xs:element name="ItemID" type="ItemIDType" minOccurs="0" />
47 <xs:element name="Attributes" minOccurs="0">
48 <xs:complexType>
49 <xs:sequence>
50 <xs:element name="PRZL" type="PRZLType"
51 minOccurs="1" maxOccurs="unbounded" />
52 </xs:sequence>
53 </xs:complexType>
54 </xs:element>
55 <xs:element name="Country" type="CountryType"
56 minOccurs="0" />
57 </xs:sequence>
58 </xs:complexType>
59
60 <xs:element name="ValidateCombinationResponse">
61 <xs:complexType>
62 <xs:sequence>
63 <xs:element name="Envelope">
64 <xs:complexType>
65 <xs:sequence>
66 <xs:element name="LabelDefinition" type="LabelDefinition" />
67 <xs:element name="Data">
68 <xs:complexType>
69 <xs:sequence>
70 <xs:element name="Provider">
71 <xs:complexType>
72 <xs:sequence>
73 <xs:element name="Sending">
74 <xs:complexType>
75 <xs:sequence>
76 <xs:element name="Item"
77 type="ResponseItem" maxOccurs="unbounded" />
78 <xs:element name="Country"
79 type="CountryType" minOccurs="0" />
80 </xs:sequence>
81 </xs:complexType>
82 </xs:element>
83 </xs:sequence>
84 </xs:complexType>
85 </xs:element>
86 </xs:sequence>
87 </xs:complexType>
88 </xs:element>
89 </xs:sequence>
90 </xs:complexType>
91 </xs:element>
92 </xs:sequence>
93 </xs:complexType>
94 </xs:element>
95
96 <!-- 5.5 Use Case Generiere Adressträger (Seite 34) -->
97 <xs:element name="GenerateLabel">
98 <xs:complexType>
99 <xs:sequence>
100 <xs:element name="Language" type="Language" />
101 <xs:element name="Envelope">
102 <xs:complexType>
103 <xs:sequence>
104 <xs:element name="LabelDefinition" type="GenerateLabelDefinition" />
105 <xs:element name="FileInfos" type="GenerateLabelFileInfos" />
106 <xs:element name="Data" type="LabelData" />
107 </xs:sequence>
108 </xs:complexType>
109 </xs:element>
110 </xs:sequence>
111 </xs:complexType>
112 </xs:element>
113
114 <xs:complexType name="GenerateLabelDefinition">
115 <xs:complexContent>
116 <xs:extension base="LabelDefinition">
117 <xs:sequence>
118 <xs:element name="PrintAddresses" type="PrintAddressesType" />
119 <xs:element name="ImageFileType" type="ImageFileType" />
120 <xs:element name="ImageResolution" type="xs:int" />
121 <xs:element name="PrintPreview" type="xs:boolean" />
122 </xs:sequence>
123 </xs:extension>
124 </xs:complexContent>
125 </xs:complexType>
126
127 <xs:simpleType name="PrintAddressesType">
128 <xs:annotation>
129 <xs:documentation>Enumeration to indicated wheter addresses are
130 printet or not.</xs:documentation>
131 </xs:annotation>
132 <xs:restriction base="xs:string">
133 <xs:enumeration value="None">
134 <xs:annotation>
135 <xs:documentation>No Addresses are printed.</xs:documentation>
136 </xs:annotation>
137 </xs:enumeration>
138 <xs:enumeration value="OnlyRecipient">
139 <xs:annotation>
140 <xs:documentation>Only recipient's address is printed.
141 </xs:documentation>
142 </xs:annotation>
143 </xs:enumeration>
144 <xs:enumeration value="OnlyCustomer">
145 <xs:annotation>
146 <xs:documentation>Only customer's address is printed.
147 </xs:documentation>
148 </xs:annotation>
149 </xs:enumeration>
150 <xs:enumeration value="RecipientAndCustomer">
151 <xs:annotation>
152 <xs:documentation>Recipient and customer addresses are
153 printed.</xs:documentation>
154 </xs:annotation>
155 </xs:enumeration>
156 </xs:restriction>
157 </xs:simpleType>
158
159 <xs:complexType name="GenerateLabelFileInfos">
160 <xs:sequence>
161 <xs:element name="FrankingLicense" type="FrankingLicenseType" />
162 <xs:element name="PpFranking" type="xs:boolean"
163 default="false" />
164 <xs:element name="Customer" type="GenerateLabelCustomer" />
165 <xs:element name="CustomerSystem" type="CustomerSystemType"
166 minOccurs="0" />
167 </xs:sequence>
168 </xs:complexType>
169
170 <xs:complexType name="GenerateLabelCustomer">
171 <xs:sequence>
172 <xs:element name="Name1" type="CustomerAddressLineType" />
173 <xs:element name="Name2" minOccurs="0"
174 type="CustomerAddressLineType" />
175 <xs:element name="Street" type="CustomerAddressLineType" />
176 <xs:element name="POBox" type="CustomerAddressLineType"
177 minOccurs="0" />
178 <xs:element name="ZIP">
179 <xs:simpleType>
180 <xs:restriction base="xs:integer">
181 <xs:totalDigits value="6" />
182 </xs:restriction>
183 </xs:simpleType>
184 </xs:element>
185 <xs:element name="City" type="CustomerAddressLineType" />
186 <xs:element name="Country" type="CountryType"
187 minOccurs="0" />
188 <xs:element name="Logo" type="xs:base64Binary"
189 minOccurs="0" />
190 <xs:element name="LogoFormat" minOccurs="0">
191 <xs:simpleType>
192 <xs:restriction base="CommonPatternStringType">
193 <xs:maxLength value="3" />
194 </xs:restriction>
195 </xs:simpleType>
196 </xs:element>
197 <xs:element name="DomicilePostOffice" minOccurs="0">
198 <xs:simpleType>
199 <xs:restriction base="CommonPatternStringType">
200 <xs:maxLength value="35" />
201 </xs:restriction>
202 </xs:simpleType>
203 </xs:element>
204 </xs:sequence>
205 </xs:complexType>
206
207 <xs:element name="GenerateLabelResponse">
208 <xs:complexType>
209 <xs:sequence>
210 <xs:element name="Envelope">
211 <xs:complexType>
212 <xs:sequence>
213 <xs:element name="LabelDefinition"
214 type="GenerateLabelResponseDefinition" />
215 <xs:element name="Data">
216 <xs:complexType>
217 <xs:sequence>
218 <xs:element name="Provider">
219 <xs:complexType>
220 <xs:sequence>
221 <xs:element name="Sending">
222 <xs:complexType>
223 <xs:sequence>
224 <xs:element name="SendingID"
225 type="SendingIDType" minOccurs="0" />
226 <xs:element name="Item"
227 type="LabelResponseItem" maxOccurs="unbounded" />
228 </xs:sequence>
229 </xs:complexType>
230 </xs:element>
231 </xs:sequence>
232 </xs:complexType>
233 </xs:element>
234 </xs:sequence>
235 </xs:complexType>
236 </xs:element>
237 </xs:sequence>
238 </xs:complexType>
239 </xs:element>
240 </xs:sequence>
241 </xs:complexType>
242 </xs:element>
243
244 <xs:complexType name="GenerateLabelResponseDefinition">
245 <xs:complexContent>
246 <xs:extension base="GenerateLabelDefinition">
247 <xs:sequence>
248 <xs:element name="ColorPrintRequired" type="xs:boolean" />
249 </xs:sequence>
250 </xs:extension>
251 </xs:complexContent>
252 </xs:complexType>
253
254 <xs:complexType name="LabelResponseItem">
255 <xs:complexContent>
256 <xs:extension base="ResponseItem">
257 <xs:sequence>
258 <xs:element name="IdentCode" type="IdentCodeType"
259 minOccurs="0" />
260 <xs:element name="Label" type="xs:base64Binary"
261 minOccurs="0" />
262 </xs:sequence>
263 </xs:extension>
264 </xs:complexContent>
265 </xs:complexType>
266
267 <!-- WSBC 2.1 FaFo 14.1 Labellayout BC -->
268 <xs:element name="GenerateSingleBarcodes">
269 <xs:complexType>
270 <xs:sequence>
271 <xs:element name="Language" type="Language" />
272 <xs:element name="Envelope">
273 <xs:complexType>
274 <xs:sequence>
275 <xs:element name="BarcodeDefinition" type="SingleBarcodesDefinition" />
276 <xs:element name="FileInfos" type="SingleBarcodesFileInfos" />
277 <xs:element name="Data" type="LabelData" />
278 </xs:sequence>
279 </xs:complexType>
280 </xs:element>
281 </xs:sequence>
282 </xs:complexType>
283 </xs:element>
284
285 <xs:complexType name="SingleBarcodesDefinition">
286 <xs:sequence>
287 <xs:element name="ImageFileType" type="ImageFileType" />
288 <xs:element name="ImageResolution" type="xs:int" />
289 </xs:sequence>
290 </xs:complexType>
291
292 <xs:complexType name="SingleBarcodesFileInfos">
293 <xs:sequence>
294 <xs:element name="FrankingLicense" type="FrankingLicenseType" />
295 <xs:element name="PpFranking" type="xs:boolean"
296 default="false" />
297 <xs:element name="Customer" type="SingleBarcodesCustomer" />
298 <xs:element name="CustomerSystem" type="CustomerSystemType"
299 minOccurs="0" />
300 </xs:sequence>
301 </xs:complexType>
302
303 <xs:complexType name="SingleBarcodesCustomer">
304 <xs:sequence>
305 <xs:element name="Name1" type="CustomerAddressLineType" />
306 <xs:element name="Name2" minOccurs="0"
307 type="CustomerAddressLineType" />
308 <xs:element name="Street" type="CustomerAddressLineType" />
309 <xs:element name="POBox" type="CustomerAddressLineType"
310 minOccurs="0" />
311 <xs:element name="ZIP">
312 <xs:simpleType>
313 <xs:restriction base="xs:integer">
314 <xs:totalDigits value="6" />
315 </xs:restriction>
316 </xs:simpleType>
317 </xs:element>
318 <xs:element name="City" type="CustomerAddressLineType" />
319 <xs:element name="Country" type="CountryType"
320 minOccurs="0" />
321 <xs:element name="DomicilePostOffice" minOccurs="0">
322 <xs:simpleType>
323 <xs:restriction base="CommonPatternStringType">
324 <xs:maxLength value="35" />
325 </xs:restriction>
326 </xs:simpleType>
327 </xs:element>
328 </xs:sequence>
329 </xs:complexType>
330
331 <xs:element name="GenerateSingleBarcodesResponse">
332 <xs:complexType>
333 <xs:sequence>
334 <xs:element name="Envelope">
335 <xs:complexType>
336 <xs:sequence>
337 <xs:element name="BarcodeDefinition"
338 type="SingleBarcodesResponseDefinition" />
339 <xs:element name="Data">
340 <xs:complexType>
341 <xs:sequence>
342 <xs:element name="Provider">
343 <xs:complexType>
344 <xs:sequence>
345 <xs:element name="Sending">
346 <xs:complexType>
347 <xs:sequence>
348 <xs:element name="SendingID"
349 type="SendingIDType" minOccurs="0" />
350 <xs:element name="Item"
351 type="SingleBarcodesResponseItem"
352 maxOccurs="unbounded" />
353 </xs:sequence>
354 </xs:complexType>
355 </xs:element>
356 </xs:sequence>
357 </xs:complexType>
358 </xs:element>
359 </xs:sequence>
360 </xs:complexType>
361 </xs:element>
362 </xs:sequence>
363 </xs:complexType>
364 </xs:element>
365 </xs:sequence>
366 </xs:complexType>
367 </xs:element>
368
369 <xs:complexType name="SingleBarcodesResponseDefinition">
370 <xs:complexContent>
371 <xs:extension base="SingleBarcodesDefinition">
372 <xs:sequence>
373 <xs:element name="ColorPrintRequired" type="xs:boolean" />
374 </xs:sequence>
375 </xs:extension>
376 </xs:complexContent>
377 </xs:complexType>
378
379 <xs:complexType name="SingleBarcodesResponseItem">
380 <xs:complexContent>
381 <xs:extension base="ResponseItem">
382 <xs:sequence>
383 <xs:element name="IdentCode" type="IdentCodeType"
384 minOccurs="0" />
385 <xs:element name="Barcodes" minOccurs="0">
386 <xs:complexType>
387 <xs:sequence>
388 <xs:element name="Barcode" type="xs:base64Binary"
389 maxOccurs="unbounded" />
390 </xs:sequence>
391 </xs:complexType>
392 </xs:element>
393 </xs:sequence>
394 </xs:extension>
395 </xs:complexContent>
396 </xs:complexType>
397
398 <!-- Common datatypes for generate label and generate single barcodes -->
399 <xs:simpleType name="CustomerAddressLineType">
400 <xs:restriction base="CommonPatternStringType">
401 <xs:maxLength value="25" />
402 </xs:restriction>
403 </xs:simpleType>
404
405 <xs:complexType name="LabelData">
406 <xs:sequence>
407 <xs:element name="Provider">
408 <xs:complexType>
409 <xs:sequence>
410 <xs:element name="Sending">
411 <xs:complexType>
412 <xs:sequence>
413 <xs:element name="SendingID" type="SendingIDType"
414 minOccurs="0" />
415 <xs:element name="Item" type="Item"
416 maxOccurs="unbounded" />
417 </xs:sequence>
418 </xs:complexType>
419 </xs:element>
420 </xs:sequence>
421 </xs:complexType>
422 </xs:element>
423 </xs:sequence>
424 </xs:complexType>
425
426 <xs:simpleType name="SendingIDType">
427 <xs:restriction base="CommonPatternStringType">
428 <xs:maxLength value="50" />
429 </xs:restriction>
430 </xs:simpleType>
431
432 <xs:complexType name="Item">
433 <xs:sequence>
434 <xs:element name="ItemID" type="ItemIDType" minOccurs="0" />
435 <xs:element name="ItemNumber" type="ItemNumberType"
436 minOccurs="0" />
437 <xs:element name="IdentCode" type="IdentCodeType"
438 minOccurs="0" />
439 <xs:element name="Recipient" type="Recipient" />
440 <xs:element name="AdditionalINFOS" minOccurs="0">
441 <xs:annotation>
442 <xs:documentation>ehem. REC_Data bei V2.1 und 2.0
443 </xs:documentation>
444 </xs:annotation>
445 <xs:complexType>
446 <xs:sequence>
447 <xs:element name="AdditionalData" type="AdditionalData"
448 maxOccurs="50" />
449 </xs:sequence>
450 </xs:complexType>
451 </xs:element>
452 <xs:element name="Attributes" type="ServiceCodeAttributes"
453 minOccurs="0" />
454 <xs:element name="Notification" type="Notification"
455 minOccurs="0" maxOccurs="15">
456 <xs:annotation>
457 <xs:documentation>Zusatzinformationen für Dienstleistung
458 </xs:documentation>
459 </xs:annotation>
460 </xs:element>
461 </xs:sequence>
462 </xs:complexType>
463
464 <xs:simpleType name="ItemNumberType">
465 <xs:restriction base="xs:string">
466 <xs:pattern value="[0-9]{1,8}" />
467 </xs:restriction>
468 </xs:simpleType>
469
470 <xs:complexType name="Recipient">
471 <xs:sequence>
472 <xs:element name="PostIdent" minOccurs="0">
473 <xs:simpleType>
474 <xs:restriction base="CommonPatternStringType">
475 <xs:maxLength value="15" />
476 </xs:restriction>
477 </xs:simpleType>
478 </xs:element>
479 <xs:element name="Title" type="RecipientAddressType"
480 minOccurs="0" />
481 <xs:element name="PersonallyAddressed" type="xs:boolean"
482 minOccurs="0" />
483 <xs:element name="Name1" type="RecipientAddressType" />
484 <xs:element name="FirstName" type="RecipientAddressType"
485 minOccurs="0" />
486 <xs:element name="Name2" type="RecipientAddressType"
487 minOccurs="0" />
488 <xs:element name="Street" type="RecipientAddressType"
489 minOccurs="0" />
490 <xs:element name="HouseNo" minOccurs="0">
491 <xs:simpleType>
492 <xs:restriction base="CommonPatternStringType">
493 <xs:maxLength value="5" />
494 </xs:restriction>
495 </xs:simpleType>
496 </xs:element>
497 <xs:element name="POBox" type="RecipientAddressType"
498 minOccurs="0" />
499 <xs:element name="FloorNo" minOccurs="0">
500 <xs:simpleType>
501 <xs:restriction base="CommonPatternStringType">
502 <xs:maxLength value="5" />
503 </xs:restriction>
504 </xs:simpleType>
505 </xs:element>
506 <xs:element name="MailboxNo" minOccurs="0">
507 <xs:simpleType>
508 <xs:restriction base="xs:integer">
509 <xs:totalDigits value="10" />
510 </xs:restriction>
511 </xs:simpleType>
512 </xs:element>
513 <xs:element name="ZIP" minOccurs="1">
514 <xs:simpleType>
515 <xs:restriction base="CommonPatternStringType">
516 <xs:maxLength value="10" />
517 </xs:restriction>
518 </xs:simpleType>
519 </xs:element>
520 <xs:element name="City" type="RecipientAddressType" />
521 <xs:element name="Country" type="CountryType"
522 minOccurs="0" />
523 <xs:element name="Phone" type="PhoneNumberType"
524 minOccurs="0" />
525 <xs:element name="Mobile" type="PhoneNumberType"
526 minOccurs="0" />
527 <xs:element name="EMail" type="EMailAddressType"
528 minOccurs="0" />
529 <xs:element name="LabelAddress" type="LabelAddress"
530 minOccurs="0" />
531 </xs:sequence>
532 </xs:complexType>
533
534 <xs:complexType name="LabelAddress">
535 <xs:annotation>
536 <xs:documentation>optional, used to declare a specific address on
537 the label. if omitted, the address data of
538 the recipient is taken. Useful if the address data of the recipient
539 exceeds the length of the label.
540 </xs:documentation>
541 </xs:annotation>
542 <xs:sequence>
543 <xs:element name="NameLine" type="RecipientAddressType" />
544 <xs:element name="AddressLine" type="RecipientAddressType" />
545 </xs:sequence>
546 </xs:complexType>
547
548 <xs:simpleType name="RecipientAddressType">
549 <xs:restriction base="CommonPatternStringType">
550 <xs:maxLength value="35" />
551 </xs:restriction>
552 </xs:simpleType>
553
554 <xs:complexType name="AdditionalData">
555 <xs:sequence>
556 <xs:element name="Type">
557 <xs:simpleType>
558 <xs:restriction base="CommonPatternStringType">
559 <xs:maxLength value="35" />
560 </xs:restriction>
561 </xs:simpleType>
562 </xs:element>
563 <xs:element name="Value">
564 <xs:simpleType>
565 <xs:restriction base="CommonPatternStringType">
566 <xs:maxLength value="50" />
567 </xs:restriction>
568 </xs:simpleType>
569 </xs:element>
570 </xs:sequence>
571 </xs:complexType>
572
573 <xs:complexType name="ServiceCodeAttributes">
574 <xs:sequence>
575 <xs:element name="PRZL" type="PRZLType" minOccurs="1"
576 maxOccurs="unbounded" />
577 <xs:element name="Amount" type="AmountType" minOccurs="0" />
578 <xs:element name="FreeText" minOccurs="0">
579 <xs:simpleType>
580 <xs:restriction base="CommonPatternStringType">
581 <xs:maxLength value="34" />
582 </xs:restriction>
583 </xs:simpleType>
584 </xs:element>
585 <xs:element name="DeliveryDate" type="xs:date"
586 minOccurs="0" />
587 <xs:element name="ParcelNo" type="ParcelAmountType"
588 minOccurs="0" />
589 <xs:element name="ParcelTotal" type="ParcelAmountType"
590 minOccurs="0" />
591 <xs:element name="DeliveryPlace" minOccurs="0">
592 <xs:simpleType>
593 <xs:restriction base="CommonPatternStringType">
594 <xs:maxLength value="35" />
595 </xs:restriction>
596 </xs:simpleType>
597 </xs:element>
598 <xs:element name="ProClima" type="xs:boolean"
599 minOccurs="0" />
600 <xs:element name="Dimensions" type="Dimensions"
601 minOccurs="0" />
602 <xs:element name="UNNumbers" type="UNNumbers"
603 minOccurs="0" />
604 </xs:sequence>
605 </xs:complexType>
606
607 <xs:simpleType name="ParcelAmountType">
608 <xs:restriction base="xs:int">
609 <xs:minInclusive value="0" />
610 <xs:maxInclusive value="99" />
611 </xs:restriction>
612 </xs:simpleType>
613
614 <xs:complexType name="Dimensions">
615 <xs:annotation>
616 <xs:documentation>Represents the Dimensions attribute of the
617 DataTransfer.</xs:documentation>
618 </xs:annotation>
619 <xs:sequence>
620 <xs:element name="Weight">
621 <xs:annotation>
622 <xs:documentation>Weight in gramms.</xs:documentation>
623 </xs:annotation>
624 <xs:simpleType>
625 <xs:restriction base="xs:integer">
626 <xs:totalDigits value="5" />
627 </xs:restriction>
628 </xs:simpleType>
629 </xs:element>
630 </xs:sequence>
631 </xs:complexType>
632
633 <xs:complexType name="UNNumbers">
634 <xs:annotation>
635 <xs:documentation>Represents the UN Numbers for the additional
636 service LQ (limited quantities).
637 </xs:documentation>
638 </xs:annotation>
639 <xs:sequence>
640 <xs:element name="UNNumber" minOccurs="0" maxOccurs="unbounded">
641 <xs:simpleType>
642 <xs:restriction base="xs:integer">
643 <xs:totalDigits value="4" />
644 </xs:restriction>
645 </xs:simpleType>
646 </xs:element>
647 </xs:sequence>
648 </xs:complexType>
649
650 <xs:complexType name="Notification">
651 <xs:all>
652 <xs:element name="Communication" type="Communication" />
653 <xs:element name="Service">
654 <xs:annotation>
655 <xs:documentation>Avisierungs-Code, welcher die Avisierung
656 bezeichnet.</xs:documentation>
657 </xs:annotation>
658 <xs:simpleType>
659 <xs:restriction base="xs:integer">
660 <xs:totalDigits value="20" />
661 </xs:restriction>
662 </xs:simpleType>
663 </xs:element>
664 <xs:element name="FreeText1" minOccurs="0">
665 <xs:annotation>
666 <xs:documentation>Individueller Text 1 für Avisierung.
667 </xs:documentation>
668 </xs:annotation>
669 <xs:simpleType>
670 <xs:restriction base="CommonPatternStringType">
671 <xs:maxLength value="160" />
672 </xs:restriction>
673 </xs:simpleType>
674 </xs:element>
675 <xs:element name="FreeText2" minOccurs="0">
676 <xs:annotation>
677 <xs:documentation>Individueller Text 2 für Avisierung.
678 </xs:documentation>
679 </xs:annotation>
680 <xs:simpleType>
681 <xs:restriction base="CommonPatternStringType">
682 <xs:maxLength value="512" />
683 </xs:restriction>
684 </xs:simpleType>
685 </xs:element>
686 <xs:element name="Language" type="Language" />
687 </xs:all>
688 <xs:attribute name="Type" type="NotificationType" use="required">
689 <xs:annotation>
690 <xs:documentation>Angabe des Medium</xs:documentation>
691 </xs:annotation>
692 </xs:attribute>
693 </xs:complexType>
694
695 <xs:simpleType name="NotificationType">
696 <xs:restriction base="xs:string">
697 <xs:enumeration value="EMAIL" />
698 <xs:enumeration value="SMS" />
699 </xs:restriction>
700 </xs:simpleType>
701
702 <xs:complexType name="Communication">
703 <xs:choice>
704 <xs:element name="Email" type="EMailAddressType" />
705 <xs:element name="Mobile" type="PhoneNumberType" />
706 </xs:choice>
707 </xs:complexType>
708
709 <!-- 5.6 Use Case Lese Dienstleistungsgruppen -->
710 <xs:element name="ReadServiceGroups">
711 <xs:complexType>
712 <xs:choice>
713 <xs:element name="Language" type="Language" />
714 </xs:choice>
715 </xs:complexType>
716 </xs:element>
717
718 <xs:element name="ReadServiceGroupsResponse">
719 <xs:complexType>
720 <xs:choice>
721 <xs:element name="ServiceGroup" type="ServiceGroup"
722 minOccurs="0" maxOccurs="unbounded" />
723 <xs:element name="Errors" type="ErrorsType"
724 minOccurs="0" />
725 </xs:choice>
726 </xs:complexType>
727 </xs:element>
728
729 <!-- FAfo-10.1 FTA Page 65 Lese BL einer FRLZ -->
730 <xs:element name="ReadAllowedServicesByFrankingLicense">
731 <xs:complexType>
732 <xs:sequence>
733 <xs:element name="FrankingLicense" type="FrankingLicenseType"
734 minOccurs="1" />
735 <xs:element name="Language" type="Language" />
736 </xs:sequence>
737 </xs:complexType>
738 </xs:element>
739
740 <!-- FAfo-10.1 FTA Page 65 Lese BL einer FRLZ -->
741 <xs:element name="ReadAllowedServicesByFrankingLicenseResponse">
742 <xs:complexType>
743 <xs:choice>
744 <!-- DLGs -->
745 <xs:element name="ServiceGroups" type="ReadAllowedServicesServiceGroups"
746 minOccurs="0" maxOccurs="unbounded" />
747 <xs:element name="Errors" type="ErrorsType"
748 minOccurs="0" />
749 </xs:choice>
750 </xs:complexType>
751 </xs:element>
752
753 <xs:complexType name="ReadAllowedServicesServiceGroups">
754 <xs:sequence>
755 <xs:element name="ServiceGroup" type="ServiceGroup" />
756 <xs:element name="BasicService" type="BasicService"
757 maxOccurs="unbounded" />
758 </xs:sequence>
759 </xs:complexType>
760
761 <!-- 5.7 Use Case Lese Basisleistungen -->
762 <xs:element name="ReadBasicServices">
763 <xs:complexType>
764 <xs:sequence>
765 <xs:element name="Language" type="Language" />
766 <xs:element name="ServiceGroupID" type="xs:int" />
767 </xs:sequence>
768 </xs:complexType>
769 </xs:element>
770
771 <xs:element name="ReadBasicServicesResponse">
772 <xs:complexType>
773 <xs:choice>
774 <xs:element name="BasicService" type="BasicService"
775 minOccurs="0" maxOccurs="unbounded" />
776 <xs:element name="Errors" type="ErrorsType"
777 minOccurs="0" />
778 </xs:choice>
779 </xs:complexType>
780 </xs:element>
781
782 <!-- 5.8 Use Case Lese Zusatzleistungen -->
783 <xs:element name="ReadAdditionalServices">
784 <xs:complexType>
785 <xs:sequence>
786 <xs:element name="Language" type="Language" />
787 <xs:element name="PRZL" type="PRZLType" maxOccurs="unbounded" />
788 </xs:sequence>
789 </xs:complexType>
790 </xs:element>
791
792 <xs:element name="ReadAdditionalServicesResponse">
793 <xs:complexType>
794 <xs:choice>
795 <xs:element name="AdditionalService" type="ServiceCode"
796 minOccurs="0" maxOccurs="unbounded" />
797 <xs:element name="Errors" type="ErrorsType"
798 minOccurs="0" />
799 </xs:choice>
800 </xs:complexType>
801 </xs:element>
802
803 <!-- 5.9 Use Case Lese Zustellanweisungen -->
804 <xs:element name="ReadDeliveryInstructions">
805 <xs:complexType>
806 <xs:sequence>
807 <xs:element name="Language" type="Language" />
808 <xs:element name="PRZL" type="PRZLType" maxOccurs="unbounded" />
809 </xs:sequence>
810 </xs:complexType>
811 </xs:element>
812
813 <xs:element name="ReadDeliveryInstructionsResponse">
814 <xs:complexType>
815 <xs:choice>
816 <xs:element name="DeliveryInstructions" type="ServiceCode"
817 minOccurs="0" maxOccurs="unbounded" />
818 <xs:element name="Errors" type="ErrorsType"
819 minOccurs="0" />
820 </xs:choice>
821 </xs:complexType>
822 </xs:element>
823
824 <!-- 5.10 Use Case Lese Darstellungsarten -->
825 <xs:element name="ReadLabelLayouts">
826 <xs:complexType>
827 <xs:sequence>
828 <xs:element name="Language" type="Language" />
829 <xs:element name="PRZL" type="PRZLType" maxOccurs="unbounded" />
830 </xs:sequence>
831 </xs:complexType>
832 </xs:element>
833
834 <xs:element name="ReadLabelLayoutsResponse">
835 <xs:complexType>
836 <xs:choice>
837 <xs:element name="LabelLayout" type="LabelLayoutResponse"
838 minOccurs="0" maxOccurs="unbounded" />
839 <xs:element name="Errors" type="ErrorsType"
840 minOccurs="0" />
841 </xs:choice>
842 </xs:complexType>
843 </xs:element>
844
845 <xs:complexType name="LabelLayoutResponse">
846 <xs:sequence>
847 <xs:element name="LabelLayout" type="LabelLayoutType" />
848 <xs:element name="MaxServices" type="xs:int" />
849 <xs:element name="MaxDeliveryInstructions" type="xs:int" />
850 <xs:element name="FreeTextAllowed" type="xs:boolean" />
851 </xs:sequence>
852 </xs:complexType>
853
854 <xs:element name="GenerateBarcode">
855 <xs:complexType>
856 <xs:sequence>
857 <xs:element name="Language" type="Language" />
858 <xs:element name="BarcodeDefinition" type="BarcodeDefinition" />
859 </xs:sequence>
860 </xs:complexType>
861 </xs:element>
862
863 <xs:element name="GenerateBarcodeResponse">
864 <xs:complexType>
865 <xs:sequence>
866 <xs:element name="Data" type="BarcodeResponseData"
867 minOccurs="0" />
868 </xs:sequence>
869 </xs:complexType>
870 </xs:element>
871
872 <xs:complexType name="BarcodeResponseData">
873 <xs:sequence>
874 <xs:element name="Barcode" type="xs:base64Binary"
875 minOccurs="0" />
876 <xs:element name="DeliveryNoteRef" minOccurs="0">
877 <xs:annotation>
878 <xs:documentation>Lieferscheinnummer Barcodeliste BMZ (128-er
879 Klartext-Barcode)</xs:documentation>
880 </xs:annotation>
881 <xs:simpleType>
882 <xs:restriction base="xs:string">
883 <xs:maxLength value="50" />
884 </xs:restriction>
885 </xs:simpleType>
886 </xs:element>
887 <xs:element name="BarcodeDefinition" type="BarcodeDefinition" />
888 <xs:element name="ColorPrintRequired" type="xs:boolean" />
889 <xs:element name="Errors" type="ErrorsType" minOccurs="0" />
890 <xs:element name="Warnings" type="WarningsType"
891 minOccurs="0" />
892 </xs:sequence>
893 </xs:complexType>
894
895 <xs:complexType name="BarcodeDefinition">
896 <xs:annotation>
897 <xs:documentation>Represents a BarcodeDefinition for the
898 GenerateBarcode Service.</xs:documentation>
899 </xs:annotation>
900 <xs:sequence>
901 <xs:element name="BarcodeType" type="BarcodeType" />
902 <xs:element name="ImageFileType" type="ImageFileType" />
903 <xs:element name="ImageResolution" type="xs:int" />
904 </xs:sequence>
905 </xs:complexType>
906
907 <xs:simpleType name="BarcodeType">
908 <xs:annotation>
909 <xs:documentation>Enumeration of the different barcode types.
910 </xs:documentation>
911 </xs:annotation>
912 <xs:restriction base="xs:string">
913 <xs:enumeration value="LSO_1">
914 <xs:annotation>
915 <xs:documentation>LSO-1 barcode for delivery notes online.
916 </xs:documentation>
917 </xs:annotation>
918 </xs:enumeration>
919 <xs:enumeration value="LSO_2">
920 <xs:annotation>
921 <xs:documentation>LSO-2 barcode for delivery notes online.
922 </xs:documentation>
923 </xs:annotation>
924 </xs:enumeration>
925 <xs:enumeration value="LSO_3">
926 <xs:annotation>
927 <xs:documentation>LSO-3 barcode for delivery notes online.
928 </xs:documentation>
929 </xs:annotation>
930 </xs:enumeration>
931 </xs:restriction>
932 </xs:simpleType>
933
934 <!-- **************************** Gloabal used datastructures **************************** -->
935 <xs:complexType name="ServiceCode">
936 <xs:annotation>
937 <xs:documentation>Represents a service code.</xs:documentation>
938 </xs:annotation>
939 <xs:sequence>
940 <xs:element name="PRZL" type="PRZLType" />
941 <xs:element name="Description" type="DescriptionType" />
942 </xs:sequence>
943 </xs:complexType>
944
945 <xs:complexType name="BasicService">
946 <xs:annotation>
947 <xs:documentation>Represents a Basic Service.</xs:documentation>
948 </xs:annotation>
949 <xs:sequence>
950 <xs:element name="PRZL" type="PRZLType" minOccurs="0"
951 maxOccurs="unbounded" />
952 <xs:element name="Description" type="DescriptionType" />
953 </xs:sequence>
954 </xs:complexType>
955
956 <xs:complexType name="ServiceGroup">
957 <xs:annotation>
958 <xs:documentation>Represents a Service Group.</xs:documentation>
959 </xs:annotation>
960 <xs:sequence>
961 <xs:element name="ServiceGroupID" type="xs:int" />
962 <xs:element name="Description" type="DescriptionType" />
963 </xs:sequence>
964 </xs:complexType>
965
966 <xs:simpleType name="DescriptionType">
967 <xs:annotation>
968 <xs:documentation>A common type for descriptions.
969 </xs:documentation>
970 </xs:annotation>
971 <xs:restriction base="xs:string"> <!-- only used as response type -->
972 <xs:maxLength value="255" />
973 </xs:restriction>
974 </xs:simpleType>
975
976 <xs:complexType name="LabelDefinition">
977 <xs:sequence>
978 <xs:element name="LabelLayout" type="LabelLayoutType" />
979 </xs:sequence>
980 </xs:complexType>
981
982 <xs:complexType name="ResponseItem">
983 <xs:sequence>
984 <xs:element name="ItemID" type="ItemIDType" minOccurs="0" />
985 <xs:element name="Errors" type="ErrorsType" minOccurs="0" />
986 <xs:element name="Warnings" type="WarningsType"
987 minOccurs="0" />
988 </xs:sequence>
989 </xs:complexType>
990
991 <xs:complexType name="ErrorsType">
992 <xs:annotation>
993 <xs:documentation>Structure containing a list of occurred business
994 errors.</xs:documentation>
995 </xs:annotation>
996 <xs:sequence>
997 <xs:element name="Error" type="MessageType" maxOccurs="unbounded" />
998 </xs:sequence>
999 </xs:complexType>
1000
1001 <xs:complexType name="WarningsType">
1002 <xs:annotation>
1003 <xs:documentation>Structure containing a list of occurred business
1004 warnings.</xs:documentation>
1005 </xs:annotation>
1006 <xs:sequence>
1007 <xs:element name="Warning" type="MessageType"
1008 maxOccurs="unbounded" />
1009 </xs:sequence>
1010 </xs:complexType>
1011
1012 <xs:complexType name="MessageType">
1013 <xs:annotation>
1014 <xs:documentation>Represents a business error or warning. Does not
1015 include technical errors, those are
1016 handled by SOAP faults.
1017 </xs:documentation>
1018 </xs:annotation>
1019 <xs:sequence>
1020 <xs:element name="Code" type="MessageCodeType" />
1021 <xs:element name="Message" type="MessageTextType" />
1022 </xs:sequence>
1023 </xs:complexType>
1024
1025 <xs:simpleType name="MessageCodeType">
1026 <xs:annotation>
1027 <xs:documentation>Five digit error/warning code. Error codes
1028 starts with a "E" and warning codes
1029 with a "W".
1030 </xs:documentation>
1031 </xs:annotation>
1032 <xs:restriction base="xs:string">
1033 <xs:pattern value="[W,E]{1}[0-9]{4}" />
1034 </xs:restriction>
1035 </xs:simpleType>
1036
1037 <xs:simpleType name="MessageTextType">
1038 <xs:annotation>
1039 <xs:documentation>Descriptive text in user's language for the
1040 occurred business warning/error.
1041 </xs:documentation>
1042 </xs:annotation>
1043 <!-- only used as response type -->
1044 <xs:restriction base="xs:string">
1045 <xs:maxLength value="500" />
1046 </xs:restriction>
1047 </xs:simpleType>
1048
1049 <xs:simpleType name="Language">
1050 <xs:annotation>
1051 <xs:documentation>Represents the end-users language. The service
1052 returns all localized texts including
1053 error-messages in the selected language.
1054 </xs:documentation>
1055 </xs:annotation>
1056 <xs:restriction base="xs:string">
1057 <xs:enumeration value="de">
1058 <xs:annotation>
1059 <xs:documentation>German</xs:documentation>
1060 </xs:annotation>
1061 </xs:enumeration>
1062 <xs:enumeration value="fr">
1063 <xs:annotation>
1064 <xs:documentation>French</xs:documentation>
1065 </xs:annotation>
1066 </xs:enumeration>
1067 <xs:enumeration value="it">
1068 <xs:annotation>
1069 <xs:documentation>Italien</xs:documentation>
1070 </xs:annotation>
1071 </xs:enumeration>
1072 <xs:enumeration value="en">
1073 <xs:annotation>
1074 <xs:documentation>English</xs:documentation>
1075 </xs:annotation>
1076 </xs:enumeration>
1077 </xs:restriction>
1078 </xs:simpleType>
1079
1080 <xs:simpleType name="ItemIDType">
1081 <xs:annotation>
1082 <xs:documentation>Unique identifier for a specific item defined by
1083 the consumer.</xs:documentation>
1084 </xs:annotation>
1085 <xs:restriction base="CommonPatternStringType">
1086 <xs:maxLength value="200" />
1087 </xs:restriction>
1088 </xs:simpleType>
1089
1090 <xs:simpleType name="PRZLType">
1091 <xs:annotation>
1092 <xs:documentation>Identifies a PRZL.</xs:documentation>
1093 </xs:annotation>
1094 <xs:restriction base="xs:string">
1095 <xs:pattern value="[a-zA-Z,0-9]{1,7}" />
1096 </xs:restriction>
1097 </xs:simpleType>
1098
1099 <xs:simpleType name="PhoneNumberType">
1100 <xs:annotation>
1101 <xs:documentation>Defines a valid phone number.</xs:documentation>
1102 </xs:annotation>
1103 <xs:restriction base="CommonPatternStringType">
1104 <xs:maxLength value="20" />
1105 <xs:minLength value="9" />
1106 </xs:restriction>
1107 </xs:simpleType>
1108
1109 <xs:simpleType name="CountryType">
1110 <xs:annotation>
1111 <xs:documentation>The ISO country code.</xs:documentation>
1112 </xs:annotation>
1113 <xs:restriction base="xs:string">
1114 <xs:pattern value="[a-zA-Z]{2}" />
1115 </xs:restriction>
1116 </xs:simpleType>
1117
1118 <xs:simpleType name="AmountType">
1119 <xs:annotation>
1120 <xs:documentation>The amount for COD.</xs:documentation>
1121 </xs:annotation>
1122 <xs:restriction base="xs:float">
1123 <xs:minInclusive value="0.00" />
1124 <xs:maxInclusive value="99999.99" />
1125 </xs:restriction>
1126 </xs:simpleType>
1127
1128 <xs:simpleType name="EMailAddressType">
1129 <xs:annotation>
1130 <xs:documentation>The email address.</xs:documentation>
1131 </xs:annotation>
1132 <xs:restriction base="CommonPatternStringType">
1133 <xs:maxLength value="160" />
1134 </xs:restriction>
1135 </xs:simpleType>
1136
1137 <xs:simpleType name="LabelLayoutType">
1138 <xs:annotation>
1139 <xs:documentation>Defines valid layouts.</xs:documentation>
1140 </xs:annotation>
1141 <xs:restriction base="xs:string">
1142 <xs:pattern value="[a-zA-Z,0-9]{2}" />
1143 </xs:restriction>
1144 </xs:simpleType>
1145
1146 <xs:simpleType name="ImageFileType">
1147 <xs:annotation>
1148 <xs:documentation>Defines valid formats of images.
1149 </xs:documentation>
1150 </xs:annotation>
1151 <xs:restriction base="xs:string">
1152 <xs:pattern value="[a-zA-Z,0-9]{1,5}" />
1153 </xs:restriction>
1154 </xs:simpleType>
1155
1156 <xs:simpleType name="FrankingLicenseType">
1157 <xs:annotation>
1158 <xs:documentation>Defines a franking license.</xs:documentation>
1159 </xs:annotation>
1160 <xs:restriction base="xs:string">
1161 <xs:pattern value="[a-zA-Z,0-9]{4}" />
1162 <xs:pattern value="[0-9]{6}" />
1163 <xs:pattern value="[0-9]{8}" />
1164 </xs:restriction>
1165 </xs:simpleType>
1166
1167 <xs:simpleType name="CustomerSystemType">
1168 <xs:restriction base="CommonPatternStringType">
1169 <xs:pattern value="[a-zA-Z,0-9,\s]{1,255}" />
1170 </xs:restriction>
1171 </xs:simpleType>
1172
1173 <xs:simpleType name="IdentCodeType">
1174 <xs:annotation>
1175 <xs:documentation>IdentCode is only a valid input for
1176 Post-internal applications. For Post-external
1177 applications the IdentCode must not be set.
1178 </xs:documentation>
1179 </xs:annotation>
1180 <xs:restriction base="CommonPatternStringType">
1181 <xs:pattern value="[0-9]{18}" />
1182 <xs:pattern value="[0-9]{23}" />
1183 <xs:pattern value="[a-zA-Z,0-9]{13}" />
1184 </xs:restriction>
1185 </xs:simpleType>
1186
1187 <xs:simpleType name="CommonPatternStringType">
1188 <xs:annotation>
1189 <xs:documentation>Excludes unsupported characters.
1190 </xs:documentation>
1191 </xs:annotation>
1192 <xs:restriction base="xs:string">
1193 <xs:pattern value="([^\*|\\|\{|\}|\[|\]|=|&gt;|&lt;])*" />
1194 </xs:restriction>
1195 </xs:simpleType>
1196
1197
1198</xs:schema>
0\ No newline at end of file1199\ No newline at end of file
11200
=== added file 'delivery_carrier_label_postlogistics/data/post-barcode-handbuch.pdf'
2Binary files delivery_carrier_label_postlogistics/data/post-barcode-handbuch.pdf 1970-01-01 00:00:00 +0000 and delivery_carrier_label_postlogistics/data/post-barcode-handbuch.pdf 2014-01-13 11:23:36 +0000 differ1201Binary files delivery_carrier_label_postlogistics/data/post-barcode-handbuch.pdf 1970-01-01 00:00:00 +0000 and delivery_carrier_label_postlogistics/data/post-barcode-handbuch.pdf 2014-01-13 11:23:36 +0000 differ
=== added file 'delivery_carrier_label_postlogistics/delivery.py'
--- delivery_carrier_label_postlogistics/delivery.py 1970-01-01 00:00:00 +0000
+++ delivery_carrier_label_postlogistics/delivery.py 2014-01-13 11:23:36 +0000
@@ -0,0 +1,214 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# Author: Yannick Vaucher
5# Copyright 2013 Camptocamp SA
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21from openerp.osv import orm, fields
22
23
24class PostlogisticsServiceGroup(orm.Model):
25 _name = 'postlogistics.service.group'
26 _description = 'PostLogistics Service Group'
27
28 _columns = {
29 'name': fields.char('Description', translate=True, required=True),
30 'group_extid': fields.integer('Group ID', required=True),
31 }
32
33 _sql_constraints = [
34 ('group_extid_uniq', 'unique(group_extid)',
35 "A service group ID must be unique.")
36 ]
37
38
39POSTLOGISTIC_TYPES = [
40 ('label_layout', 'Label Layout'),
41 ('output_format', 'Output Format'),
42 ('resolution', 'Output Resolution'),
43 ('basic', 'Basic Service'),
44 ('additional', 'Additional Service'),
45 ('delivery', 'Delivery Instructions')
46]
47
48
49class DeliveryCarrierTemplateOption(orm.Model):
50 """ Set name translatable and add service group """
51 _inherit = 'delivery.carrier.template.option'
52
53 _columns = {
54 'name': fields.char('Name', size=64, translate=True),
55 'postlogistics_service_group_id': fields.many2one(
56 'postlogistics.service.group',
57 string='PostLogistics Service Group'),
58 'postlogistics_type': fields.selection(
59 POSTLOGISTIC_TYPES,
60 string="PostLogistics option type"),
61 # relation tables to manage compatiblity between basic services
62 # and other services
63 'postlogistics_basic_service_ids': fields.many2many(
64 'delivery.carrier.template.option',
65 'postlogistics_compatibility_service_rel',
66 'service_id', 'basic_service_id',
67 string="Basic Services",
68 domain=[('postlogistics_type', '=', 'basic')],
69 help="List of basic service for which this service is compatible"),
70 'postlogistics_additonial_service_ids': fields.many2many(
71 'delivery.carrier.template.option',
72 'postlogistics_compatibility_service_rel',
73 'basic_service_id', 'service_id',
74 string="Compatible Additional Services",
75 domain=[('postlogistics_type', '=', 'additional')]),
76 'postlogistics_delivery_instruction_ids': fields.many2many(
77 'delivery.carrier.template.option',
78 'postlogistics_compatibility_service_rel',
79 'basic_service_id', 'service_id',
80 string="Compatible Delivery Instructions",
81 domain=[('postlogistics_type', '=', 'delivery')]),
82 }
83
84 _defaults = {
85 'postlogistics_type': False,
86 }
87
88
89class DeliveryCarrierOption(orm.Model):
90 """ Set name translatable and add service group """
91 _inherit = 'delivery.carrier.option'
92
93 _columns = {
94 'name': fields.char('Name', size=64, translate=True),
95 # to repeat carrier allowed option ids to filter domain set by
96 # default from view
97 'allowed_option_ids': fields.related(
98 'carrier_id', 'allowed_option_ids', type='many2many',
99 relation='delivery.carrier.template.option',
100 string='Allowed and compatible options',
101 readonly=True),
102 }
103
104
105class DeliveryCarrier(orm.Model):
106 """ Add service group """
107 _inherit = 'delivery.carrier'
108
109 def _get_carrier_type_selection(self, cr, uid, context=None):
110 """ Add postlogistics carrier type """
111 res = super(DeliveryCarrier, self)._get_carrier_type_selection(cr, uid, context=context)
112 res.append(('postlogistics', 'Postlogistics'))
113 return res
114
115 def _get_basic_service_ids(self, cr, uid, ids, field_names, arg, context=None):
116 """ Search in all options for the PostLogistics basic services if set """
117 res = {}
118 for carrier_id in ids:
119 res[carrier_id] = []
120 ir_model_data_obj = self.pool.get('ir.model.data')
121
122 xmlid = 'delivery_carrier_label_postlogistics', 'postlogistics'
123 postlogistics_partner = ir_model_data_obj.get_object(
124 cr, uid, *xmlid, context=context)
125
126 for carrier in self.browse(cr, uid, ids, context=context):
127 if not carrier.partner_id.id == postlogistics_partner.id:
128 continue
129
130 option_ids = [opt.tmpl_option_id.id for opt
131 in carrier.available_option_ids
132 if opt.postlogistics_type == 'basic']
133 if not option_ids:
134 continue
135 res[carrier.id] = option_ids
136 return res
137
138 def _get_allowed_option_ids(self, cr, uid, ids, field_names, arg, context=None):
139 """ Return a list of possible options
140
141 A domain would be too complicated.
142
143 We do this to ensure the user first select a basic service. And
144 then he adds additional services.
145
146 :return: {carrier_id: [ids]}
147
148 """
149 res = dict.fromkeys(ids, [])
150 option_template_obj = self.pool.get('delivery.carrier.template.option')
151 ir_model_data_obj = self.pool.get('ir.model.data')
152
153 xmlid = 'delivery_carrier_label_postlogistics', 'postlogistics'
154 postlogistics_partner = ir_model_data_obj.get_object(
155 cr, uid, *xmlid, context=context)
156
157 for carrier in self.browse(cr, uid, ids, context=context):
158 allowed_ids = []
159 if not carrier.partner_id.id == postlogistics_partner.id:
160 continue
161 service_group_id = carrier.postlogistics_service_group_id.id
162 if service_group_id:
163 basic_service_ids = [s.id for s in carrier.postlogistics_basic_service_ids]
164 service_ids = option_template_obj.search(
165 cr, uid,
166 [('postlogistics_service_group_id' ,'=', service_group_id)],
167 context=context)
168 allowed_ids.extend(service_ids)
169 if basic_service_ids:
170 related_service_ids = option_template_obj.search(
171 cr, uid,
172 [('postlogistics_basic_service_ids' ,'in', basic_service_ids)],
173 context=context)
174 allowed_ids.extend(related_service_ids)
175
176 # Allows to set multiple optional single option in order to
177 # let the user select them
178 single_option_types = ['label_layout', 'output_format', 'resolution']
179 selected_single_options = [opt.tmpl_option_id.postlogistics_type
180 for opt in carrier.available_option_ids
181 if opt.postlogistics_type in single_option_types
182 and opt.state in ['mandatory']]
183 if selected_single_options != single_option_types:
184 service_ids = option_template_obj.search(
185 cr, uid,
186 [('postlogistics_type', 'in', single_option_types),
187 ('postlogistics_type', 'not in', selected_single_options)],
188 context=context)
189 allowed_ids.extend(service_ids)
190 res[carrier.id] = allowed_ids
191 return res
192
193 _columns = {
194 'type': fields.selection(
195 _get_carrier_type_selection, 'Type',
196 help="Carrier type (combines several delivery methods)"),
197 'postlogistics_service_group_id': fields.many2one(
198 'postlogistics.service.group',
199 string='PostLogistics Service Group',
200 help="Service group defines the available options for "
201 "this delivery method."),
202 'postlogistics_basic_service_ids': fields.function(
203 _get_basic_service_ids, type='one2many',
204 relation='delivery.carrier.template.option',
205 string='PostLogistics Service Group',
206 help="Basic Service defines the available "
207 "additional options for this delivery method",
208 readonly=True),
209 'allowed_option_ids': fields.function(
210 _get_allowed_option_ids, type="many2many",
211 relation='delivery.carrier.template.option',
212 string='Allowed options',
213 help="Compute allowed options according to selected options."),
214 }
0215
=== added file 'delivery_carrier_label_postlogistics/delivery_data.xml'
--- delivery_carrier_label_postlogistics/delivery_data.xml 1970-01-01 00:00:00 +0000
+++ delivery_carrier_label_postlogistics/delivery_data.xml 2014-01-13 11:23:36 +0000
@@ -0,0 +1,108 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data noupdate="1">
4
5 <!-- Label layouts -->
6 <record id="postlogistics_layout_option_a7" model="delivery.carrier.template.option">
7 <field name="name">Format A7</field>
8 <field name="code">A7</field>
9 <field name="postlogistics_type">label_layout</field>
10 <field name="partner_id" ref="postlogistics"></field>
11 </record>
12
13 <record id="postlogistics_layout_option_a6" model="delivery.carrier.template.option">
14 <field name="name">Format A6</field>
15 <field name="code">A6</field>
16 <field name="postlogistics_type">label_layout</field>
17 <field name="partner_id" ref="postlogistics"></field>
18 </record>
19
20 <record id="postlogistics_layout_option_a5" model="delivery.carrier.template.option">
21 <field name="name">Format A5</field>
22 <field name="code">A5</field>
23 <field name="postlogistics_type">label_layout</field>
24 <field name="partner_id" ref="postlogistics"></field>
25 </record>
26
27 <record id="postlogistics_layout_option_fe" model="delivery.carrier.template.option">
28 <field name="name">Format FE</field>
29 <field name="code">FE</field>
30 <field name="postlogistics_type">label_layout</field>
31 <field name="partner_id" ref="postlogistics"></field>
32 </record>
33
34
35 <!-- Output formats -->
36 <record id="postlogistics_output_format_option_eps" model="delivery.carrier.template.option">
37 <field name="name">EPS</field>
38 <field name="code">EPS</field>
39 <field name="postlogistics_type">output_format</field>
40 <field name="partner_id" ref="postlogistics"></field>
41 </record>
42
43 <record id="postlogistics_output_format_option_gif" model="delivery.carrier.template.option">
44 <field name="name">GIF</field>
45 <field name="code">GIF</field>
46 <field name="postlogistics_type">output_format</field>
47 <field name="partner_id" ref="postlogistics"></field>
48 </record>
49
50 <record id="postlogistics_output_format_option_jpg" model="delivery.carrier.template.option">
51 <field name="name">JPG</field>
52 <field name="code">JPG</field>
53 <field name="postlogistics_type">output_format</field>
54 <field name="partner_id" ref="postlogistics"></field>
55 </record>
56
57 <record id="postlogistics_output_format_option_png" model="delivery.carrier.template.option">
58 <field name="name">PNG</field>
59 <field name="code">PNG</field>
60 <field name="postlogistics_type">output_format</field>
61 <field name="partner_id" ref="postlogistics"></field>
62 </record>
63
64 <record id="postlogistics_output_format_option_pdf" model="delivery.carrier.template.option">
65 <field name="name">PDF</field>
66 <field name="code">PDF</field>
67 <field name="postlogistics_type">output_format</field>
68 <field name="partner_id" ref="postlogistics"></field>
69 </record>
70
71 <record id="postlogistics_output_format_option_spdf" model="delivery.carrier.template.option">
72 <field name="name">sPDF</field>
73 <field name="code">sPDF</field>
74 <field name="postlogistics_type">output_format</field>
75 <field name="partner_id" ref="postlogistics"></field>
76 </record>
77
78 <record id="postlogistics_output_format_option_zpl2" model="delivery.carrier.template.option">
79 <field name="name">ZPL2</field>
80 <field name="code">ZPL2</field>
81 <field name="postlogistics_type">output_format</field>
82 <field name="partner_id" ref="postlogistics"></field>
83 </record>
84
85
86 <!-- resolutions -->
87 <record id="postlogistics_output_resolution_option_200ppp" model="delivery.carrier.template.option">
88 <field name="name">200 ppp</field>
89 <field name="code">200</field>
90 <field name="postlogistics_type">resolution</field>
91 <field name="partner_id" ref="postlogistics"></field>
92 </record>
93
94 <record id="postlogistics_output_resolution_option_300ppp" model="delivery.carrier.template.option">
95 <field name="name">300 ppp</field>
96 <field name="code">300</field>
97 <field name="postlogistics_type">resolution</field>
98 <field name="partner_id" ref="postlogistics"></field>
99 </record>
100
101 <record id="postlogistics_output_resolution_option_600ppp" model="delivery.carrier.template.option">
102 <field name="name">600 ppp</field>
103 <field name="code">600</field>
104 <field name="postlogistics_type">resolution</field>
105 <field name="partner_id" ref="postlogistics"></field>
106 </record>
107 </data>
108</openerp>
0109
=== added file 'delivery_carrier_label_postlogistics/delivery_view.xml'
--- delivery_carrier_label_postlogistics/delivery_view.xml 1970-01-01 00:00:00 +0000
+++ delivery_carrier_label_postlogistics/delivery_view.xml 2014-01-13 11:23:36 +0000
@@ -0,0 +1,61 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<openerp>
3 <data>
4
5 <!-- INHERITED VIEW FOR THE OBJECT : delivery_carrier_template_option -->
6 <record id="delivery_carrier_template_option_view_form" model="ir.ui.view">
7 <field name="name">delivery_base.delivery_carrier_option.view_form</field>
8 <field name="model">delivery.carrier.template.option</field>
9 <field name="inherit_id" ref="base_delivery_carrier_label.delivery_carrier_template_option_view_form"/>
10 <field name="arch" type="xml">
11 <field name="name" position="after">
12 <field name="postlogistics_service_group_id"/>
13 </field>
14 </field>
15 </record>
16
17 <record id="delivery_carrier_template_option_view_tree" model="ir.ui.view">
18 <field name="name">delivery_base.delivery_carrier_template_option.view_tree</field>
19 <field name="model">delivery.carrier.template.option</field>
20 <field name="inherit_id" ref="base_delivery_carrier_label.delivery_carrier_template_option_view_tree"/>
21 <field name="arch" type="xml">
22 <field name="name" position="after">
23 <field name="postlogistics_service_group_id"/>
24 </field>
25 </field>
26 </record>
27
28 <!-- INHERITED VIEW FOR THE OBJECT : delivery_carrier_option -->
29 <record id="delivery_carrier_option_view_form" model="ir.ui.view">
30 <field name="name">delivery_base.delivery_carrier_option.view_form</field>
31 <field name="model">delivery.carrier.option</field>
32 <field name="inherit_id" ref="base_delivery_carrier_label.delivery_carrier_option_view_form" />
33 <field name="arch" type="xml">
34 <field name="tmpl_option_id" position="before">
35 <field name="carrier_id" invisible="1"/>
36 <field name="allowed_option_ids" invisible="1"/>
37 </field>
38 <field name="tmpl_option_id" position="attributes">
39 <attribute name="domain">['|', ('partner_id', '!=', %(delivery_carrier_label_postlogistics.postlogistics)d), ('id', 'in', allowed_option_ids[0][2])]</attribute>
40 </field>
41 </field>
42 </record>
43
44 <!-- INHERITED VIEW FOR THE OBJECT : delivery.carrier -->
45 <record id="view_delivery_carrier_form" model="ir.ui.view">
46 <field name="name">delivery_base.delivery.carrier.view_form</field>
47 <field name="model">delivery.carrier</field>
48 <field name="inherit_id" ref="base_delivery_carrier_label.view_delivery_carrier_form" />
49 <field name="arch" type="xml">
50 <field name="type" position="after">
51 <field name="postlogistics_service_group_id" attrs="{'invisible': [('type', '!=', 'postlogistics')], 'required': [('type', '=', 'postlogistics')]}"/>
52 <field name="allowed_option_ids" invisible="1"/>
53 </field>
54 <field name="available_option_ids" position="attributes">
55 <attribute name="context">{'default_carrier_id': active_id, 'default_allowed_option_ids': allowed_option_ids}</attribute>
56 </field>
57 </field>
58 </record>
59
60 </data>
61</openerp>
062
=== added directory 'delivery_carrier_label_postlogistics/i18n'
=== added file 'delivery_carrier_label_postlogistics/i18n/delivery_carrier_label_postlogistics.pot'
--- delivery_carrier_label_postlogistics/i18n/delivery_carrier_label_postlogistics.pot 1970-01-01 00:00:00 +0000
+++ delivery_carrier_label_postlogistics/i18n/delivery_carrier_label_postlogistics.pot 2014-01-13 11:23:36 +0000
@@ -0,0 +1,475 @@
1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:
3# * delivery_carrier_label_postlogistics
4#
5msgid ""
6msgstr ""
7"Project-Id-Version: OpenERP Server 7.0\n"
8"Report-Msgid-Bugs-To: \n"
9"POT-Creation-Date: 2013-12-06 13:12+0000\n"
10"PO-Revision-Date: 2013-12-06 13:12+0000\n"
11"Last-Translator: <>\n"
12"Language-Team: \n"
13"MIME-Version: 1.0\n"
14"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Transfer-Encoding: \n"
16"Plural-Forms: \n"
17
18#. module: delivery_carrier_label_postlogistics
19#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_format_option_spdf
20msgid "sPDF"
21msgstr ""
22
23#. module: delivery_carrier_label_postlogistics
24#: field:delivery.carrier.template.option,postlogistics_additonial_service_ids:0
25#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_template_option_postlogistics_additonial_service_ids
26msgid "Compatible Additional Services"
27msgstr ""
28
29#. module: delivery_carrier_label_postlogistics
30#: help:delivery.carrier.template.option,postlogistics_basic_service_ids:0
31msgid "List of basic service for which this service is compatible"
32msgstr ""
33
34#. module: delivery_carrier_label_postlogistics
35#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_default_resolution
36#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_default_resolution
37#: field:postlogistics.config.settings,default_resolution:0
38#: field:res.company,postlogistics_default_resolution:0
39msgid "Default resolution"
40msgstr ""
41
42#. module: delivery_carrier_label_postlogistics
43#: code:addons/delivery_carrier_label_postlogistics/res_config.py:342
44#, python-format
45msgid "Could not retrieve Postlogistics group services:\n"
46"%s"
47msgstr ""
48
49#. module: delivery_carrier_label_postlogistics
50#: view:postlogistics.config.settings:0
51msgid "Sender Informations"
52msgstr ""
53
54#. module: delivery_carrier_label_postlogistics
55#: field:delivery.carrier.template.option,postlogistics_delivery_instruction_ids:0
56#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_template_option_postlogistics_delivery_instruction_ids
57msgid "Compatible Delivery Instructions"
58msgstr ""
59
60#. module: delivery_carrier_label_postlogistics
61#: model:ir.model,name:delivery_carrier_label_postlogistics.model_postlogistics_config_settings
62msgid "postlogistics.config.settings"
63msgstr ""
64
65#. module: delivery_carrier_label_postlogistics
66#: view:delivery.carrier.option:0
67msgid "['|', ('partner_id', '!=', 5), ('id', 'in', allowed_option_ids[0][2])]"
68msgstr ""
69
70#. module: delivery_carrier_label_postlogistics
71#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_format_option_eps
72msgid "EPS"
73msgstr ""
74
75#. module: delivery_carrier_label_postlogistics
76#: code:addons/delivery_carrier_label_postlogistics/postlogistics/web_service.py:71
77#, python-format
78msgid "Error 401"
79msgstr ""
80
81#. module: delivery_carrier_label_postlogistics
82#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_license_more_1kg
83#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_license_more_1kg
84#: field:postlogistics.config.settings,license_more_1kg:0
85#: field:res.company,postlogistics_license_more_1kg:0
86msgid "License more than 1kg"
87msgstr ""
88
89#. module: delivery_carrier_label_postlogistics
90#: model:ir.model,name:delivery_carrier_label_postlogistics.model_delivery_carrier_option
91msgid "Delivery carrier option"
92msgstr ""
93
94#. module: delivery_carrier_label_postlogistics
95#: sql_constraint:postlogistics.service.group:0
96msgid "A service group ID must be unique."
97msgstr ""
98
99#. module: delivery_carrier_label_postlogistics
100#: view:postlogistics.config.settings:0
101msgid "Licenses"
102msgstr ""
103
104#. module: delivery_carrier_label_postlogistics
105#: field:delivery.carrier.option,allowed_option_ids:0
106#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_option_allowed_option_ids
107msgid "Allowed and compatible options"
108msgstr ""
109
110#. module: delivery_carrier_label_postlogistics
111#: model:ir.model,name:delivery_carrier_label_postlogistics.model_shipping_label
112msgid "Shipping Label"
113msgstr ""
114
115#. module: delivery_carrier_label_postlogistics
116#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_license_less_1kg
117#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_license_less_1kg
118#: field:postlogistics.config.settings,license_less_1kg:0
119#: field:res.company,postlogistics_license_less_1kg:0
120msgid "License less than 1kg"
121msgstr ""
122
123#. module: delivery_carrier_label_postlogistics
124#: selection:delivery.carrier.template.option,postlogistics_type:0
125msgid "Delivery Instructions"
126msgstr ""
127
128#. module: delivery_carrier_label_postlogistics
129#: help:delivery.carrier,allowed_option_ids:0
130msgid "Compute allowed options according to selected options."
131msgstr ""
132
133#. module: delivery_carrier_label_postlogistics
134#: selection:delivery.carrier.template.option,postlogistics_type:0
135msgid "Label Layout"
136msgstr ""
137
138#. module: delivery_carrier_label_postlogistics
139#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_layout_option_fe
140msgid "Format FE"
141msgstr ""
142
143#. module: delivery_carrier_label_postlogistics
144#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_layout_option_a5
145msgid "Format A5"
146msgstr ""
147
148#. module: delivery_carrier_label_postlogistics
149#: model:ir.actions.act_window,name:delivery_carrier_label_postlogistics.action_postlogistics_config
150#: view:postlogistics.config.settings:0
151msgid "Configure Postlogistics"
152msgstr ""
153
154#. module: delivery_carrier_label_postlogistics
155#: field:delivery.carrier,allowed_option_ids:0
156#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_allowed_option_ids
157msgid "Allowed options"
158msgstr ""
159
160#. module: delivery_carrier_label_postlogistics
161#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_layout_option_a7
162msgid "Format A7"
163msgstr ""
164
165#. module: delivery_carrier_label_postlogistics
166#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_layout_option_a6
167msgid "Format A6"
168msgstr ""
169
170#. module: delivery_carrier_label_postlogistics
171#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_company_id
172#: field:postlogistics.config.settings,company_id:0
173msgid "Company"
174msgstr ""
175
176#. module: delivery_carrier_label_postlogistics
177#: help:delivery.carrier,postlogistics_basic_service_id:0
178msgid "Basic Service defines the available additional options for this delivery method"
179msgstr ""
180
181#. module: delivery_carrier_label_postlogistics
182#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_service_group_group_extid
183#: field:postlogistics.service.group,group_extid:0
184msgid "Group ID"
185msgstr ""
186
187#. module: delivery_carrier_label_postlogistics
188#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_wsdl_url
189#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_wsdl_url
190#: field:postlogistics.config.settings,wsdl_url:0
191#: field:res.company,postlogistics_wsdl_url:0
192msgid "WSDL URL"
193msgstr ""
194
195#. module: delivery_carrier_label_postlogistics
196#: code:addons/delivery_carrier_label_postlogistics/res_config.py:147
197#, python-format
198msgid "Could not retrieve Postlogistics deliveryinstructions:\n"
199"%s"
200msgstr ""
201
202#. module: delivery_carrier_label_postlogistics
203#: field:delivery.carrier,postlogistics_basic_service_id:0
204#: field:delivery.carrier,postlogistics_service_group_id:0
205#: field:delivery.carrier.template.option,postlogistics_service_group_id:0
206#: model:ir.model,name:delivery_carrier_label_postlogistics.model_postlogistics_service_group
207#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_postlogistics_basic_service_id
208#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_postlogistics_service_group_id
209#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_template_option_postlogistics_service_group_id
210msgid "PostLogistics Service Group"
211msgstr ""
212
213#. module: delivery_carrier_label_postlogistics
214#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_resolution_option_600ppp
215msgid "600 ppp"
216msgstr ""
217
218#. module: delivery_carrier_label_postlogistics
219#: code:addons/delivery_carrier_label_postlogistics/postlogistics/web_service.py:72
220#, python-format
221msgid "Authorization Required\n"
222"\n"
223"Please verify postlogistics username and password in:\n"
224"Configuration -> Postlogistics"
225msgstr ""
226
227#. module: delivery_carrier_label_postlogistics
228#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_format_option_zpl2
229msgid "ZPL2"
230msgstr ""
231
232#. module: delivery_carrier_label_postlogistics
233#: selection:delivery.carrier.template.option,postlogistics_type:0
234msgid "Output Resolution"
235msgstr ""
236
237#. module: delivery_carrier_label_postlogistics
238#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_default_label_layout
239#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_default_label_layout
240#: field:postlogistics.config.settings,default_label_layout:0
241#: field:res.company,postlogistics_default_label_layout:0
242msgid "Default label layout"
243msgstr ""
244
245#. module: delivery_carrier_label_postlogistics
246#: help:postlogistics.config.settings,office:0
247msgid "Post office which will receive the shipped goods"
248msgstr ""
249
250#. module: delivery_carrier_label_postlogistics
251#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_password
252#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_password
253#: field:postlogistics.config.settings,password:0
254#: field:res.company,postlogistics_password:0
255msgid "Password"
256msgstr ""
257
258#. module: delivery_carrier_label_postlogistics
259#: view:postlogistics.config.settings:0
260msgid "Update PostLogistics Services"
261msgstr ""
262
263#. module: delivery_carrier_label_postlogistics
264#: view:delivery.carrier:0
265msgid "{'default_carrier_id': active_id, 'default_allowed_option_ids': allowed_option_ids}"
266msgstr ""
267
268#. module: delivery_carrier_label_postlogistics
269#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_username
270#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_username
271#: field:postlogistics.config.settings,username:0
272#: field:res.company,postlogistics_username:0
273msgid "Username"
274msgstr ""
275
276#. module: delivery_carrier_label_postlogistics
277#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_logo
278#: field:res.company,postlogistics_logo:0
279msgid "Company logo for PostLogistics"
280msgstr ""
281
282#. module: delivery_carrier_label_postlogistics
283#: field:delivery.carrier.template.option,postlogistics_type:0
284#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_template_option_postlogistics_type
285msgid "PostLogistics option type"
286msgstr ""
287
288#. module: delivery_carrier_label_postlogistics
289#: field:delivery.carrier.option,name:0
290#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_option_name
291msgid "Name"
292msgstr ""
293
294#. module: delivery_carrier_label_postlogistics
295#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_license_vinolog
296#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_license_vinolog
297#: field:postlogistics.config.settings,license_vinolog:0
298#: field:res.company,postlogistics_license_vinolog:0
299msgid "License VinoLog"
300msgstr ""
301
302#. module: delivery_carrier_label_postlogistics
303#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_resolution_option_300ppp
304msgid "300 ppp"
305msgstr ""
306
307#. module: delivery_carrier_label_postlogistics
308#: view:postlogistics.config.settings:0
309msgid "Select Company"
310msgstr ""
311
312#. module: delivery_carrier_label_postlogistics
313#: model:ir.model,name:delivery_carrier_label_postlogistics.model_res_company
314msgid "Companies"
315msgstr ""
316
317#. module: delivery_carrier_label_postlogistics
318#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_format_option_pdf
319msgid "PDF"
320msgstr ""
321
322#. module: delivery_carrier_label_postlogistics
323#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_format_option_gif
324msgid "GIF"
325msgstr ""
326
327#. module: delivery_carrier_label_postlogistics
328#: model:ir.model,name:delivery_carrier_label_postlogistics.model_delivery_carrier
329msgid "Carrier"
330msgstr ""
331
332#. module: delivery_carrier_label_postlogistics
333#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_resolution_option_200ppp
334msgid "200 ppp"
335msgstr ""
336
337#. module: delivery_carrier_label_postlogistics
338#: view:postlogistics.config.settings:0
339msgid "Default configs"
340msgstr ""
341
342#. module: delivery_carrier_label_postlogistics
343#: code:addons/delivery_carrier_label_postlogistics/res_config.py:149
344#: code:addons/delivery_carrier_label_postlogistics/res_config.py:208
345#: code:addons/delivery_carrier_label_postlogistics/res_config.py:280
346#: code:addons/delivery_carrier_label_postlogistics/res_config.py:344
347#, python-format
348msgid "Error"
349msgstr ""
350
351#. module: delivery_carrier_label_postlogistics
352#: help:postlogistics.config.settings,logo:0
353msgid "Optional company logo to show on label.\n"
354"If using an image / logo, please note the following:\n"
355"– Image width: 47 mm\n"
356"– Image height: 25 mm\n"
357"– File size: max. 30 kb\n"
358"– File format: GIF or PNG\n"
359"– Colour table: indexed colours, max. 200 colours\n"
360"– The logo will be printed rotated counter-clockwise by 90°\n"
361"We recommend using a black and white logo for printing in the\n"
362"ZPL2 format."
363msgstr ""
364
365#. module: delivery_carrier_label_postlogistics
366#: code:addons/delivery_carrier_label_postlogistics/res_config.py:206
367#: code:addons/delivery_carrier_label_postlogistics/res_config.py:278
368#, python-format
369msgid "Could not retrieve Postlogistics base services:\n"
370"%s"
371msgstr ""
372
373#. module: delivery_carrier_label_postlogistics
374#: selection:delivery.carrier.template.option,postlogistics_type:0
375msgid "Additional Service"
376msgstr ""
377
378#. module: delivery_carrier_label_postlogistics
379#: help:delivery.carrier,postlogistics_service_group_id:0
380msgid "Service group defines the available options for this delivery method."
381msgstr ""
382
383#. module: delivery_carrier_label_postlogistics
384#: view:postlogistics.config.settings:0
385msgid "Web Service Authentification"
386msgstr ""
387
388#. module: delivery_carrier_label_postlogistics
389#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_service_group_name
390#: field:postlogistics.service.group,name:0
391msgid "Description"
392msgstr ""
393
394#. module: delivery_carrier_label_postlogistics
395#: selection:delivery.carrier.template.option,postlogistics_type:0
396msgid "Output Format"
397msgstr ""
398
399#. module: delivery_carrier_label_postlogistics
400#: field:delivery.carrier.template.option,postlogistics_basic_service_ids:0
401#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_template_option_postlogistics_basic_service_ids
402msgid "Basic Services"
403msgstr ""
404
405#. module: delivery_carrier_label_postlogistics
406#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_logo
407#: field:postlogistics.config.settings,logo:0
408msgid "Company Logo on Post labels"
409msgstr ""
410
411#. module: delivery_carrier_label_postlogistics
412#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_office
413#: field:res.company,postlogistics_office:0
414msgid "Post office"
415msgstr ""
416
417#. module: delivery_carrier_label_postlogistics
418#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_office
419#: field:postlogistics.config.settings,office:0
420msgid "Domicile Post office"
421msgstr ""
422
423#. module: delivery_carrier_label_postlogistics
424#: model:ir.model,name:delivery_carrier_label_postlogistics.model_delivery_carrier_template_option
425msgid "Delivery carrier template option"
426msgstr ""
427
428#. module: delivery_carrier_label_postlogistics
429#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_format_option_jpg
430msgid "JPG"
431msgstr ""
432
433#. module: delivery_carrier_label_postlogistics
434#: view:postlogistics.config.settings:0
435msgid "or"
436msgstr ""
437
438#. module: delivery_carrier_label_postlogistics
439#: model:ir.ui.menu,name:delivery_carrier_label_postlogistics.menu_postlogistics_config
440msgid "Postlogistics"
441msgstr ""
442
443#. module: delivery_carrier_label_postlogistics
444#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_format_option_png
445msgid "PNG"
446msgstr ""
447
448#. module: delivery_carrier_label_postlogistics
449#: view:postlogistics.config.settings:0
450msgid "Cancel"
451msgstr ""
452
453#. module: delivery_carrier_label_postlogistics
454#: view:postlogistics.config.settings:0
455msgid "Apply"
456msgstr ""
457
458#. module: delivery_carrier_label_postlogistics
459#: model:ir.model,name:delivery_carrier_label_postlogistics.model_stock_picking_out
460msgid "Delivery Orders"
461msgstr ""
462
463#. module: delivery_carrier_label_postlogistics
464#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_default_output_format
465#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_default_output_format
466#: field:postlogistics.config.settings,default_output_format:0
467#: field:res.company,postlogistics_default_output_format:0
468msgid "Default output format"
469msgstr ""
470
471#. module: delivery_carrier_label_postlogistics
472#: selection:delivery.carrier.template.option,postlogistics_type:0
473msgid "Basic Service"
474msgstr ""
475
0476
=== added file 'delivery_carrier_label_postlogistics/i18n/fr.po'
--- delivery_carrier_label_postlogistics/i18n/fr.po 1970-01-01 00:00:00 +0000
+++ delivery_carrier_label_postlogistics/i18n/fr.po 2014-01-13 11:23:36 +0000
@@ -0,0 +1,498 @@
1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:
3# * delivery_carrier_label_postlogistics
4#
5msgid ""
6msgstr ""
7"Project-Id-Version: OpenERP Server 7.0\n"
8"Report-Msgid-Bugs-To: \n"
9"POT-Creation-Date: 2013-12-06 13:12+0000\n"
10"PO-Revision-Date: 2013-12-06 15:13+0100\n"
11"Last-Translator: Yannick Vaucher <yannick.vaucher@camptocamp.com>\n"
12"Language-Team: \n"
13"MIME-Version: 1.0\n"
14"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Transfer-Encoding: 8bit\n"
16"Plural-Forms: \n"
17
18#. module: delivery_carrier_label_postlogistics
19#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_format_option_spdf
20msgid "sPDF"
21msgstr "sPDF"
22
23#. module: delivery_carrier_label_postlogistics
24#: field:delivery.carrier.template.option,postlogistics_additonial_service_ids:0
25#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_template_option_postlogistics_additonial_service_ids
26msgid "Compatible Additional Services"
27msgstr "Prestations additionnelles compatibles"
28
29#. module: delivery_carrier_label_postlogistics
30#: help:delivery.carrier.template.option,postlogistics_basic_service_ids:0
31msgid "List of basic service for which this service is compatible"
32msgstr "Liste des prestations de base pour lesquels un service est compatible"
33
34#. module: delivery_carrier_label_postlogistics
35#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_default_resolution
36#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_default_resolution
37#: field:postlogistics.config.settings,default_resolution:0
38#: field:res.company,postlogistics_default_resolution:0
39msgid "Default resolution"
40msgstr "Résolution d'imprimante par défaut"
41
42#. module: delivery_carrier_label_postlogistics
43#: code:addons/delivery_carrier_label_postlogistics/res_config.py:342
44#, python-format
45msgid ""
46"Could not retrieve Postlogistics group services:\n"
47"%s"
48msgstr ""
49"Impossible de récupérer les groupes de prestations de PostLogistics:\n"
50"%s"
51
52#. module: delivery_carrier_label_postlogistics
53#: view:postlogistics.config.settings:0
54msgid "Sender Informations"
55msgstr "Informations de l'expéditeur"
56
57#. module: delivery_carrier_label_postlogistics
58#: field:delivery.carrier.template.option,postlogistics_delivery_instruction_ids:0
59#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_template_option_postlogistics_delivery_instruction_ids
60msgid "Compatible Delivery Instructions"
61msgstr "Instructions de distribution"
62
63#. module: delivery_carrier_label_postlogistics
64#: model:ir.model,name:delivery_carrier_label_postlogistics.model_postlogistics_config_settings
65msgid "postlogistics.config.settings"
66msgstr ""
67
68#. module: delivery_carrier_label_postlogistics
69#: view:delivery.carrier.option:0
70msgid "['|', ('partner_id', '!=', 5), ('id', 'in', allowed_option_ids[0][2])]"
71msgstr ""
72
73#. module: delivery_carrier_label_postlogistics
74#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_format_option_eps
75msgid "EPS"
76msgstr "EPS"
77
78#. module: delivery_carrier_label_postlogistics
79#: code:addons/delivery_carrier_label_postlogistics/postlogistics/web_service.py:71
80#, python-format
81msgid "Error 401"
82msgstr "Erreur 401"
83
84#. module: delivery_carrier_label_postlogistics
85#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_license_more_1kg
86#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_license_more_1kg
87#: field:postlogistics.config.settings,license_more_1kg:0
88#: field:res.company,postlogistics_license_more_1kg:0
89msgid "License more than 1kg"
90msgstr "License plus de 1kg"
91
92#. module: delivery_carrier_label_postlogistics
93#: model:ir.model,name:delivery_carrier_label_postlogistics.model_delivery_carrier_option
94msgid "Delivery carrier option"
95msgstr "Option de méthode de livraison"
96
97#. module: delivery_carrier_label_postlogistics
98#: sql_constraint:postlogistics.service.group:0
99msgid "A service group ID must be unique."
100msgstr "L'ID d'un groupe de service doit être unique"
101
102#. module: delivery_carrier_label_postlogistics
103#: view:postlogistics.config.settings:0
104msgid "Licenses"
105msgstr "Licenses"
106
107#. module: delivery_carrier_label_postlogistics
108#: field:delivery.carrier.option,allowed_option_ids:0
109#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_option_allowed_option_ids
110msgid "Allowed and compatible options"
111msgstr "Options permise et compatible"
112
113#. module: delivery_carrier_label_postlogistics
114#: model:ir.model,name:delivery_carrier_label_postlogistics.model_shipping_label
115msgid "Shipping Label"
116msgstr "Étiquette d'expédition"
117
118#. module: delivery_carrier_label_postlogistics
119#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_license_less_1kg
120#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_license_less_1kg
121#: field:postlogistics.config.settings,license_less_1kg:0
122#: field:res.company,postlogistics_license_less_1kg:0
123msgid "License less than 1kg"
124msgstr "Licence moins de 1kg"
125
126#. module: delivery_carrier_label_postlogistics
127#: selection:delivery.carrier.template.option,postlogistics_type:0
128msgid "Delivery Instructions"
129msgstr "Instruction de distribution"
130
131#. module: delivery_carrier_label_postlogistics
132#: help:delivery.carrier,allowed_option_ids:0
133msgid "Compute allowed options according to selected options."
134msgstr "Déterminer les options permise en fonction des options sélectionnées."
135
136#. module: delivery_carrier_label_postlogistics
137#: selection:delivery.carrier.template.option,postlogistics_type:0
138msgid "Label Layout"
139msgstr "Format d'étiquette"
140
141#. module: delivery_carrier_label_postlogistics
142#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_layout_option_fe
143msgid "Format FE"
144msgstr "Format FE"
145
146#. module: delivery_carrier_label_postlogistics
147#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_layout_option_a5
148msgid "Format A5"
149msgstr "Format A5"
150
151#. module: delivery_carrier_label_postlogistics
152#: model:ir.actions.act_window,name:delivery_carrier_label_postlogistics.action_postlogistics_config
153#: view:postlogistics.config.settings:0
154msgid "Configure Postlogistics"
155msgstr "Configurer PostLogistics"
156
157#. module: delivery_carrier_label_postlogistics
158#: field:delivery.carrier,allowed_option_ids:0
159#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_allowed_option_ids
160msgid "Allowed options"
161msgstr "Options compatibles"
162
163#. module: delivery_carrier_label_postlogistics
164#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_layout_option_a7
165msgid "Format A7"
166msgstr "Format A7"
167
168#. module: delivery_carrier_label_postlogistics
169#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_layout_option_a6
170msgid "Format A6"
171msgstr "Format A6"
172
173#. module: delivery_carrier_label_postlogistics
174#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_company_id
175#: field:postlogistics.config.settings,company_id:0
176msgid "Company"
177msgstr "Companie"
178
179#. module: delivery_carrier_label_postlogistics
180#: help:delivery.carrier,postlogistics_basic_service_id:0
181msgid "Basic Service defines the available additional options for this delivery method"
182msgstr "Le service de base défini les options disponibles pour cette méthode de livraison"
183
184#. module: delivery_carrier_label_postlogistics
185#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_service_group_group_extid
186#: field:postlogistics.service.group,group_extid:0
187msgid "Group ID"
188msgstr "ID de groupe"
189
190#. module: delivery_carrier_label_postlogistics
191#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_wsdl_url
192#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_wsdl_url
193#: field:postlogistics.config.settings,wsdl_url:0
194#: field:res.company,postlogistics_wsdl_url:0
195msgid "WSDL URL"
196msgstr "WSDL URL"
197
198#. module: delivery_carrier_label_postlogistics
199#: code:addons/delivery_carrier_label_postlogistics/res_config.py:147
200#, python-format
201msgid ""
202"Could not retrieve Postlogistics deliveryinstructions:\n"
203"%s"
204msgstr ""
205"Impossible de récupérer les instruction de distribution de PostLogistics:\n"
206"%s"
207
208#. module: delivery_carrier_label_postlogistics
209#: field:delivery.carrier,postlogistics_basic_service_id:0
210#: field:delivery.carrier,postlogistics_service_group_id:0
211#: field:delivery.carrier.template.option,postlogistics_service_group_id:0
212#: model:ir.model,name:delivery_carrier_label_postlogistics.model_postlogistics_service_group
213#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_postlogistics_basic_service_id
214#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_postlogistics_service_group_id
215#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_template_option_postlogistics_service_group_id
216msgid "PostLogistics Service Group"
217msgstr "Groupe de service PostLogistics"
218
219#. module: delivery_carrier_label_postlogistics
220#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_resolution_option_600ppp
221msgid "600 ppp"
222msgstr "600 ppp"
223
224#. module: delivery_carrier_label_postlogistics
225#: code:addons/delivery_carrier_label_postlogistics/postlogistics/web_service.py:72
226#, python-format
227msgid ""
228"Authorization Required\n"
229"\n"
230"Please verify postlogistics username and password in:\n"
231"Configuration -> Postlogistics"
232msgstr ""
233"Autorisation requise\n"
234"\n"
235"Veuillez vérifier vos nom d'utilisateur et mot de passe PostLogistics sous:\n"
236"Configuration -> PostLogistics"
237
238#. module: delivery_carrier_label_postlogistics
239#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_format_option_zpl2
240msgid "ZPL2"
241msgstr "ZPL2"
242
243#. module: delivery_carrier_label_postlogistics
244#: selection:delivery.carrier.template.option,postlogistics_type:0
245msgid "Output Resolution"
246msgstr "Résolution de l'imprimante (ppp)"
247
248#. module: delivery_carrier_label_postlogistics
249#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_default_label_layout
250#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_default_label_layout
251#: field:postlogistics.config.settings,default_label_layout:0
252#: field:res.company,postlogistics_default_label_layout:0
253msgid "Default label layout"
254msgstr "Format de sortie d'étiquette par défault"
255
256#. module: delivery_carrier_label_postlogistics
257#: help:postlogistics.config.settings,office:0
258msgid "Post office which will receive the shipped goods"
259msgstr "Office postale qui laquelle transiteront les produits"
260
261#. module: delivery_carrier_label_postlogistics
262#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_password
263#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_password
264#: field:postlogistics.config.settings,password:0
265#: field:res.company,postlogistics_password:0
266msgid "Password"
267msgstr "Mot de passe"
268
269#. module: delivery_carrier_label_postlogistics
270#: view:postlogistics.config.settings:0
271msgid "Update PostLogistics Services"
272msgstr "Mettre à jour les services PostLogistics"
273
274#. module: delivery_carrier_label_postlogistics
275#: view:delivery.carrier:0
276msgid "{'default_carrier_id': active_id, 'default_allowed_option_ids': allowed_option_ids}"
277msgstr ""
278
279#. module: delivery_carrier_label_postlogistics
280#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_username
281#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_username
282#: field:postlogistics.config.settings,username:0
283#: field:res.company,postlogistics_username:0
284msgid "Username"
285msgstr "Nom d'utilsateur"
286
287#. module: delivery_carrier_label_postlogistics
288#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_logo
289#: field:res.company,postlogistics_logo:0
290msgid "Company logo for PostLogistics"
291msgstr "Logo de compagnie pour PostLogistics"
292
293#. module: delivery_carrier_label_postlogistics
294#: field:delivery.carrier.template.option,postlogistics_type:0
295#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_template_option_postlogistics_type
296msgid "PostLogistics option type"
297msgstr "Type d'option PostLogistics"
298
299#. module: delivery_carrier_label_postlogistics
300#: field:delivery.carrier.option,name:0
301#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_option_name
302msgid "Name"
303msgstr "Name"
304
305#. module: delivery_carrier_label_postlogistics
306#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_license_vinolog
307#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_license_vinolog
308#: field:postlogistics.config.settings,license_vinolog:0
309#: field:res.company,postlogistics_license_vinolog:0
310msgid "License VinoLog"
311msgstr "License VinoLog"
312
313#. module: delivery_carrier_label_postlogistics
314#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_resolution_option_300ppp
315msgid "300 ppp"
316msgstr "300 ppp"
317
318#. module: delivery_carrier_label_postlogistics
319#: view:postlogistics.config.settings:0
320msgid "Select Company"
321msgstr "Sélectionner la compagnie"
322
323#. module: delivery_carrier_label_postlogistics
324#: model:ir.model,name:delivery_carrier_label_postlogistics.model_res_company
325msgid "Companies"
326msgstr "Compagnies"
327
328#. module: delivery_carrier_label_postlogistics
329#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_format_option_pdf
330msgid "PDF"
331msgstr "PDF"
332
333#. module: delivery_carrier_label_postlogistics
334#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_format_option_gif
335msgid "GIF"
336msgstr "GIF"
337
338#. module: delivery_carrier_label_postlogistics
339#: model:ir.model,name:delivery_carrier_label_postlogistics.model_delivery_carrier
340msgid "Carrier"
341msgstr "Transporteur"
342
343#. module: delivery_carrier_label_postlogistics
344#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_resolution_option_200ppp
345msgid "200 ppp"
346msgstr "200 ppp"
347
348#. module: delivery_carrier_label_postlogistics
349#: view:postlogistics.config.settings:0
350msgid "Default configs"
351msgstr "Configurations par défaut"
352
353#. module: delivery_carrier_label_postlogistics
354#: code:addons/delivery_carrier_label_postlogistics/res_config.py:149
355#: code:addons/delivery_carrier_label_postlogistics/res_config.py:208
356#: code:addons/delivery_carrier_label_postlogistics/res_config.py:280
357#: code:addons/delivery_carrier_label_postlogistics/res_config.py:344
358#, python-format
359msgid "Error"
360msgstr "Erreur"
361
362#. module: delivery_carrier_label_postlogistics
363#: help:postlogistics.config.settings,logo:0
364msgid ""
365"Optional company logo to show on label.\n"
366"If using an image / logo, please note the following:\n"
367"– Image width: 47 mm\n"
368"– Image height: 25 mm\n"
369"– File size: max. 30 kb\n"
370"– File format: GIF or PNG\n"
371"– Colour table: indexed colours, max. 200 colours\n"
372"– The logo will be printed rotated counter-clockwise by 90°\n"
373"We recommend using a black and white logo for printing in the\n"
374"ZPL2 format."
375msgstr ""
376"Logo optionnel à imprimer sur vos étiquettes.\n"
377"Veuillez tenir compte des indications suivantes lors de la création
0de votre image ou logo:\n"378de votre image ou logo:\n"
379"
1– Largeur de l’image: 47 mm\n"380– Largeur de l’image: 47 mm\n"
381"
2– Hauteur de l’image: 25 mmv382– Hauteur de l’image: 25 mmv
3– Taille du fichier: max. 30 ko\n"383– Taille du fichier: max. 30 ko\n"
384"
4– Format de fichier: GIF ou PNG\n"385– Format de fichier: GIF ou PNG\n"
386"
5– Table des couleurs: couleurs indicées, 200 au max.\n"387– Table des couleurs: couleurs indicées, 200 au max.\n"
388"
6– Le logo sera imprimé tourné de 90° dans le sens contraire des 389– Le logo sera imprimé tourné de 90° dans le sens contraire des
7aiguilles d’une montre \n"390aiguilles d’une montre \n"
391"
8Il est conseillé d’utiliser un logo noir et blanc pour l’impression 392Il est conseillé d’utiliser un logo noir et blanc pour l’impression
9en format ZPL2."393en format ZPL2."
394
395#. module: delivery_carrier_label_postlogistics
396#: code:addons/delivery_carrier_label_postlogistics/res_config.py:206
397#: code:addons/delivery_carrier_label_postlogistics/res_config.py:278
398#, python-format
399msgid ""
400"Could not retrieve Postlogistics base services:\n"
401"%s"
402msgstr ""
403"Impossible de récupérer les prestations de base de PostLogistics:\n"
404"%s"
405
406#. module: delivery_carrier_label_postlogistics
407#: selection:delivery.carrier.template.option,postlogistics_type:0
408msgid "Additional Service"
409msgstr "Prestations additionnelles"
410
411#. module: delivery_carrier_label_postlogistics
412#: help:delivery.carrier,postlogistics_service_group_id:0
413msgid "Service group defines the available options for this delivery method."
414msgstr "Un groupe service défini les options compatible avec cette méthode de transport"
415
416#. module: delivery_carrier_label_postlogistics
417#: view:postlogistics.config.settings:0
418msgid "Web Service Authentification"
419msgstr "Authentification pour le Web Service"
420
421#. module: delivery_carrier_label_postlogistics
422#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_service_group_name
423#: field:postlogistics.service.group,name:0
424msgid "Description"
425msgstr "Description"
426
427#. module: delivery_carrier_label_postlogistics
428#: selection:delivery.carrier.template.option,postlogistics_type:0
429msgid "Output Format"
430msgstr "Format de sortie"
431
432#. module: delivery_carrier_label_postlogistics
433#: field:delivery.carrier.template.option,postlogistics_basic_service_ids:0
434#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_delivery_carrier_template_option_postlogistics_basic_service_ids
435msgid "Basic Services"
436msgstr "Prestations de base"
437
438#. module: delivery_carrier_label_postlogistics
439#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_logo
440#: field:postlogistics.config.settings,logo:0
441msgid "Company Logo on Post labels"
442msgstr "Logo de compagnie sur les étiquettes postales"
443
444#. module: delivery_carrier_label_postlogistics
445#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_office
446#: field:res.company,postlogistics_office:0
447msgid "Post office"
448msgstr "Office de poste"
449
450#. module: delivery_carrier_label_postlogistics
451#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_office
452#: field:postlogistics.config.settings,office:0
453msgid "Domicile Post office"
454msgstr "Office de postal de domicile"
455
456#. module: delivery_carrier_label_postlogistics
457#: model:ir.model,name:delivery_carrier_label_postlogistics.model_delivery_carrier_template_option
458msgid "Delivery carrier template option"
459msgstr "Modèle d'option de méthode de livraison"
460
461#. module: delivery_carrier_label_postlogistics
462#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_format_option_jpg
463msgid "JPG"
464msgstr "JPG"
465
466#. module: delivery_carrier_label_postlogistics
467#: view:postlogistics.config.settings:0
468msgid "or"
469msgstr "ou"
470
471#. module: delivery_carrier_label_postlogistics
472#: model:ir.ui.menu,name:delivery_carrier_label_postlogistics.menu_postlogistics_config
473msgid "Postlogistics"
474msgstr "PostLogistics"
475
476#. module: delivery_carrier_label_postlogistics
477#: model:delivery.carrier.template.option,name:delivery_carrier_label_postlogistics.postlogistics_output_format_option_png
478msgid "PNG"
479msgstr "PNG"
480
481#. module: delivery_carrier_label_postlogistics
482#: view:postlogistics.config.settings:0
483msgid "Cancel"
484msgstr "Annuler"
485
486#. module: delivery_carrier_label_postlogistics
487#: view:postlogistics.config.settings:0
488msgid "Apply"
489msgstr "Appliquer"
490
491#. module: delivery_carrier_label_postlogistics
492#: model:ir.model,name:delivery_carrier_label_postlogistics.model_stock_picking_out
493msgid "Delivery Orders"
494msgstr "Bons de livraison"
495
496#. module: delivery_carrier_label_postlogistics
497#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_postlogistics_config_settings_default_output_format
498#: model:ir.model.fields,field_description:delivery_carrier_label_postlogistics.field_res_company_postlogistics_default_output_format
499#: field:postlogistics.config.settings,default_output_format:0
500#: field:res.company,postlogistics_default_output_format:0
501msgid "Default output format"
502msgstr "Option de format de sortie par défaut"
503
504#. module: delivery_carrier_label_postlogistics
505#: selection:delivery.carrier.template.option,postlogistics_type:0
506msgid "Basic Service"
507msgstr "Prestation de base"
508
10509
=== added directory 'delivery_carrier_label_postlogistics/postlogistics'
=== added file 'delivery_carrier_label_postlogistics/postlogistics/__init__.py'
--- delivery_carrier_label_postlogistics/postlogistics/__init__.py 1970-01-01 00:00:00 +0000
+++ delivery_carrier_label_postlogistics/postlogistics/__init__.py 2014-01-13 11:23:36 +0000
@@ -0,0 +1,21 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# Author: Yannick Vaucher
5# Copyright 2013 Camptocamp SA
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21from . import web_service
022
=== added file 'delivery_carrier_label_postlogistics/postlogistics/web_service.py'
--- delivery_carrier_label_postlogistics/postlogistics/web_service.py 1970-01-01 00:00:00 +0000
+++ delivery_carrier_label_postlogistics/postlogistics/web_service.py 2014-01-13 11:23:36 +0000
@@ -0,0 +1,374 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# Author: Yannick Vaucher
5# Copyright 2013 Camptocamp SA
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21import re
22from suds.client import Client, WebFault
23from suds.transport.http import HttpAuthenticated
24from PIL import Image
25from StringIO import StringIO
26
27from openerp.osv import orm
28from openerp.tools.translate import _
29
30_compile_itemid = re.compile('[^0-9A-Za-z+\-_]')
31
32
33class PostlogisticsWebService(object):
34 """ Connector with PostLogistics for labels using post.ch Web Services
35
36 Handbook available here: http://www.poste.ch/post-barcode-cug.htm
37
38 Allows to generate labels
39
40 """
41
42 def __init__(self, company):
43 self.init_connection(company)
44
45 def init_connection(self, company):
46 t = HttpAuthenticated(
47 username=company.postlogistics_username,
48 password=company.postlogistics_password)
49 self.client = Client(
50 company.postlogistics_wsdl_url,
51 transport=t)
52
53 def _send_request(self, request, **kwargs):
54 """ Wrapper for API requests
55
56 :param request: callback for API request
57 :param **kwargs: params forwarded to the callback
58
59 """
60 res = {}
61 try:
62 res['value'] = request(**kwargs)
63 res['success'] = True
64 except WebFault as e:
65 res['success'] = False
66 res['errors'] = [e[0]]
67 except Exception as e:
68 # if authentification error
69 if isinstance(e[0], tuple) and e[0][0] == 401:
70 raise orm.except_orm(
71 _('Error 401'),
72 _('Authorization Required\n\n'
73 'Please verify postlogistics username and password in:\n'
74 'Configuration -> Postlogistics'))
75 raise
76 return res
77
78 def _get_language(self, lang):
79 """ Return a language to iso format from openerp format.
80
81 `iso_code` field in res.lang is not mandatory thus not always set.
82 Use partner language if available, otherwise use english
83
84 :param partner: partner browse record
85 :return: language code to use.
86
87 """
88 available_languages = self.client.factory.create('ns0:Language')
89 lang_code = lang.split('_')[0]
90 if lang_code in available_languages:
91 return lang_code
92 return 'en'
93
94 def read_allowed_services_by_franking_license(self, license, company, lang=None):
95 """ Get a list of allowed service for a postlogistics licence """
96 if not lang:
97 lang = company.partner_id.lang
98 lang = self._get_language(lang)
99 request = self.client.service.ReadAllowedServicesByFrankingLicense
100 return self._send_request(request, License=license, Language=lang)
101
102 def read_service_groups(self, company, lang):
103 """ Get group of services """
104 if not lang:
105 lang = company.partner_id.lang
106 lang = self._get_language(lang)
107 request = self.client.service.ReadServiceGroups
108 return self._send_request(request, Language=lang)
109
110 def read_basic_services(self, company, service_group_id, lang):
111 """ Get basic services for a given service group """
112 if not lang:
113 lang = company.partner_id.lang
114 lang = self._get_language(lang)
115 request = self.client.service.ReadBasicServices
116 return self._send_request(request, Language=lang, ServiceGroupID=service_group_id)
117
118 def read_additional_services(self, company, service_code, lang):
119 """ Get additional services compatible with a basic services """
120 if not lang:
121 lang = company.partner_id.lang
122 lang = self._get_language(lang)
123 request = self.client.service.ReadAdditionalServices
124 return self._send_request(request, Language=lang, PRZL=service_code)
125
126 def read_delivery_instructions(self, company, service_code, lang):
127 """ Get delivery instruction 'ZAW' compatible with a base service """
128 if not lang:
129 lang = company.partner_id.lang
130 lang = self._get_language(lang)
131 request = self.client.service.ReadDeliveryInstructions
132 return self._send_request(request, Language=lang, PRZL=service_code)
133
134 def _prepare_recipient(self, picking):
135 """ Create a ns0:Recipient as a dict from a partner
136
137 :param partner: partner browse record
138 :return a dict containing data for ns0:Recipient
139
140 """
141 partner = picking.partner_id
142
143 recipient = {
144 'Name1': partner.name,
145 'Street': partner.street,
146 'ZIP': partner.zip,
147 'City': partner.city,
148 'Country': partner.country_id.code,
149 'EMail': partner.email or None,
150 }
151
152 if partner.parent_id:
153 recipient['Name2'] = partner.parent_id.name
154 recipient['PersonallyAddressed'] = False
155
156 # Phone and / or mobile should only be diplayed if instruction to
157 # Notify delivery by telephone is set
158 is_phone_required = [option for option in picking.option_ids
159 if option.code == 'ZAW3213']
160 if is_phone_required:
161 if partner.phone:
162 recipient['Phone'] = partner.phone
163
164 if partner.mobile:
165 recipient['Mobile'] = partner.mobile
166
167 return recipient
168
169 def _prepare_customer(self, picking):
170 """ Create a ns0:Customer as a dict from picking
171
172 This is the Postlogistic Customer, thus the sender
173
174 :param picking: picking browse record
175 :return a dict containing data for ns0:Customer
176
177 """
178 company = picking.company_id
179 partner = company.partner_id
180
181 customer = {
182 'Name1': partner.name,
183 'Street': partner.street,
184 'ZIP': partner.zip,
185 'City': partner.city,
186 'Country': partner.country_id.code,
187 'DomicilePostOffice': company.postlogistics_office,
188 }
189 logo_format = None
190 logo = company.postlogistics_logo
191 if logo:
192 logo_image = Image.open(StringIO(logo.decode('base64')))
193 logo_format = logo_image.format
194 customer['Logo'] = logo
195 customer['LogoFormat'] = logo_format
196 return customer
197
198 def _get_single_option(self, picking, option):
199 option = [opt.code for opt in picking.option_ids
200 if opt.postlogistics_type == option]
201 assert len(option) <= 1
202 return option and option[0]
203
204 def _get_label_layout(self, picking):
205 label_layout = self._get_single_option(picking, 'label_layout')
206 if not label_layout:
207 company = picking.company_id
208 label_layout = company.postlogistics_default_label_layout.code
209 return label_layout
210
211 def _get_output_format(self, picking):
212 output_format = self._get_single_option(picking, 'output_format')
213 if not output_format:
214 company = picking.company_id
215 output_format = company.postlogistics_default_output_format.code
216 return output_format
217
218 def _get_image_resolution(self, picking):
219 resolution = self._get_single_option(picking, 'resolution')
220 if not resolution:
221 company = picking.company_id
222 resolution = company.postlogistics_default_resolution.code
223 return resolution
224
225 def _get_license(self, picking):
226 """ Get the right license depending on weight """
227 company = picking.company_id
228 #XXX get weight or set it as an option on picking
229 weight = 0
230 if weight > 1.0:
231 return company.postlogistics_license_more_1kg
232 return company.postlogistics_license_less_1kg
233
234 def _prepare_attributes(self, picking):
235 services = [option.code.split(',') for option in picking.option_ids
236 if option.tmpl_option_id.postlogistics_type
237 in ('basic', 'additional', 'delivery')]
238
239 attributes = {
240 'PRZL': services,
241 }
242 return attributes
243
244 def _get_itemid(self, picking, pack_no):
245 """ Allowed characters are alphanumeric plus `+`, `-` and `_`
246 Last `+` separates picking name and package number (if any)
247
248 :return string: itemid
249
250 """
251 name = _compile_itemid.sub('', picking.name)
252 codes = [name, pack_no]
253 return "+".join(c for c in codes if c)
254
255 def _prepare_item_list(self, picking, recipient, attributes):
256 """ Return a list of item made from the pickings """
257 item_list = []
258 # A label will be generated per pack and if there is no pack only one
259 # label will be generated
260 packs = set([line.tracking_id.name for line in picking.move_lines])
261 for pack_no in packs:
262 itemid = self._get_itemid(picking, pack_no)
263 item = {
264 'ItemID': itemid,
265 'Recipient': recipient,
266 'Attributes': attributes,
267 }
268
269 item_list.append(item)
270
271 return item_list
272
273 def _prepare_data(self, item_list):
274 sending = {
275 'Item': item_list,
276 }
277 provider = {
278 'Sending': sending
279 }
280 data = {
281 'Provider': provider,
282 }
283 return data
284
285 def _prepare_envelope(self, picking, post_customer, data):
286 """ Define envelope for label request """
287 label_layout = self._get_label_layout(picking)
288 output_format = self._get_output_format(picking)
289 image_resolution = self._get_image_resolution(picking)
290
291 label_definitions = {
292 'LabelLayout': label_layout,
293 'PrintAddresses': 'RecipientAndCustomer',
294 'ImageFileType': output_format,
295 'ImageResolution': image_resolution,
296 'PrintPreview': False,
297 }
298 license = self._get_license(picking)
299 file_infos = {
300 'FrankingLicense': license,
301 'PpFranking': False,
302 'CustomerSystem': 'OpenERP',
303 'Customer': post_customer,
304 }
305
306 envelope = {
307 'LabelDefinition': label_definitions,
308 'FileInfos': file_infos,
309 'Data': data,
310 }
311 return envelope
312
313 def generate_label(self, picking, user_lang='en_US'):
314 """ Generate a label for a picking
315
316 :param picking: picking browse record
317 :param lang: OpenERP language code
318 :return: {
319 value: [{item_id: pack id
320 binary: file returned by API
321 tracking_number: id number for tracking
322 file_type: str of file type
323 }
324 ]
325 errors: list of error message if any
326 warnings: list of warning message if any
327 }
328
329 """
330 # get options
331 lang = self._get_language(user_lang)
332 post_customer = self._prepare_customer(picking)
333
334 attributes = self._prepare_attributes(picking)
335
336 recipient = self._prepare_recipient(picking)
337 item_list = self._prepare_item_list(picking, recipient, attributes)
338 data = self._prepare_data(item_list)
339
340 envelope = self._prepare_envelope(picking, post_customer, data)
341
342 output_format = self._get_output_format(picking).lower()
343
344 res = {'value': []}
345 request = self.client.service.GenerateLabel
346 response = self._send_request(request, Language=lang, Envelope=envelope)
347
348 if not response['success']:
349 return response
350 error_messages = []
351 warning_messages = []
352 for item in response['value'].Data.Provider.Sending.Item:
353 if hasattr(item, 'Errors') and item.Errors:
354 for error in item.Errors.Error:
355 message = '[%s] %s' % (error.Code, error.Message)
356 error_messages.append(message)
357 else:
358 res['value'].append({
359 'item_id': item.ItemID,
360 'binary': item.Label,
361 'tracking_number': item.IdentCode,
362 'file_type': output_format,
363 })
364
365 if hasattr(item, 'Warnings') and item.Warnings:
366 for warning in item.Warnings:
367 message = '[%s] %s' % (warning.Code, warning.Message)
368 warning_messages.append(message)
369
370 if error_messages:
371 res['errors'] = error_messages
372 if warning_messages:
373 res['warnings'] = warning_messages
374 return res
0375
=== added file 'delivery_carrier_label_postlogistics/res_config.py'
--- delivery_carrier_label_postlogistics/res_config.py 1970-01-01 00:00:00 +0000
+++ delivery_carrier_label_postlogistics/res_config.py 2014-01-13 11:23:36 +0000
@@ -0,0 +1,424 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# Author: Yannick Vaucher
5# Copyright 2013 Camptocamp SA
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21import logging
22
23from openerp.osv import orm, fields
24from openerp.tools.translate import _
25
26from postlogistics.web_service import PostlogisticsWebService
27
28_logger = logging.getLogger(__name__)
29
30
31class PostlogisticsConfigSettings(orm.TransientModel):
32 _name = 'postlogistics.config.settings'
33 _inherit = 'res.config.settings'
34
35 _columns = {
36 'company_id': fields.many2one('res.company', 'Company', required=True),
37 'wsdl_url': fields.related(
38 'company_id', 'postlogistics_wsdl_url',
39 string='WSDL URL', type='char'),
40 'username': fields.related(
41 'company_id', 'postlogistics_username',
42 string='Username', type='char'),
43 'password': fields.related(
44 'company_id', 'postlogistics_password',
45 string='Password', type='char'),
46 'license_less_1kg': fields.related(
47 'company_id', 'postlogistics_license_less_1kg',
48 string='License less than 1kg', type='char'),
49 'license_more_1kg': fields.related(
50 'company_id', 'postlogistics_license_more_1kg',
51 string='License more than 1kg', type='char'),
52 'license_vinolog': fields.related(
53 'company_id', 'postlogistics_license_vinolog',
54 string='License VinoLog', type='char'),
55 'logo': fields.related(
56 'company_id', 'postlogistics_logo',
57 string='Company Logo on Post labels', type='binary',
58 help="Optional company logo to show on label.\n"
59 "If using an image / logo, please note the following:\n"
60 "– Image width: 47 mm\n"
61 "– Image height: 25 mm\n"
62 "– File size: max. 30 kb\n"
63 "– File format: GIF or PNG\n"
64 "– Colour table: indexed colours, max. 200 colours\n"
65 "– The logo will be printed rotated counter-clockwise by 90°\n"
66 "We recommend using a black and white logo for printing in the\n"
67 "ZPL2 format."
68 ),
69 'office': fields.related(
70 'company_id', 'postlogistics_office',
71 string='Domicile Post office', type='char',
72 help="Post office which will receive the shipped goods"),
73
74 'default_label_layout': fields.related(
75 'company_id', 'postlogistics_default_label_layout',
76 string='Default label layout', type='many2one',
77 relation='delivery.carrier.template.option',
78 domain=[('postlogistics_type', '=', 'label_layout')]),
79 'default_output_format': fields.related(
80 'company_id', 'postlogistics_default_output_format',
81 string='Default output format', type='many2one',
82 relation='delivery.carrier.template.option',
83 domain=[('postlogistics_type', '=', 'output_format')]),
84 'default_resolution': fields.related(
85 'company_id', 'postlogistics_default_resolution',
86 string='Default resolution', type='many2one',
87 relation='delivery.carrier.template.option',
88 domain=[('postlogistics_type', '=', 'resolution')]),
89 }
90
91 def _default_company(self, cr, uid, context=None):
92 user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
93 return user.company_id.id
94
95 _defaults = {
96 'company_id': _default_company,
97 }
98
99 def create(self, cr, uid, values, context=None):
100 id = super(PostlogisticsConfigSettings, self
101 ).create(cr, uid, values, context=context)
102 # Hack: to avoid some nasty bug, related fields are not written
103 # upon record creation. Hence we write on those fields here.
104 vals = {}
105 for fname, field in self._columns.iteritems():
106 if isinstance(field, fields.related) and fname in values:
107 vals[fname] = values[fname]
108 self.write(cr, uid, [id], vals, context)
109 return id
110
111 def onchange_company_id(self, cr, uid, ids, company_id, context=None):
112 # update related fields
113 values = {}
114 values['currency_id'] = False
115 if not company_id:
116 return {'value': values}
117 company = self.pool.get('res.company'
118 ).browse(cr, uid, company_id, context=context)
119
120 label_layout = company.postlogistics_default_label_layout.id or False
121 output_format = company.postlogistics_default_output_format.id or False
122 resolution = company.postlogistics_default_resolution.id or False
123 values = {
124 'username': company.postlogistics_username,
125 'password': company.postlogistics_password,
126 'license_less_1kg': company.postlogistics_license_less_1kg,
127 'license_more_1kg': company.postlogistics_license_more_1kg,
128 'license_vinolog': company.postlogistics_license_vinolog,
129 'logo': company.postlogistics_logo,
130 'office': company.postlogistics_office,
131 'default_label_layout': label_layout,
132 'default_output_format': output_format,
133 'default_resolution': resolution,
134 }
135 return {'value': values}
136
137 def _get_delivery_instructions(self, cr, uid, ids, web_service,
138 company, service_code, context=None):
139 if context is None:
140 context = {}
141
142 lang = context.get('lang', 'en')
143 service_code_list = service_code.split(',')
144 res = web_service.read_delivery_instructions(company, service_code_list, lang)
145 if 'errors' in res:
146 errors = '\n'.join(res['errors'])
147 error_message = (_('Could not retrieve Postlogistics delivery'
148 'instructions:\n%s') % errors)
149 raise orm.except_orm(_('Error'), error_message)
150
151 if not res['value']:
152 return {}
153
154 if hasattr(res['value'], 'Errors') and res['value'].Errors:
155 for error in res['value'].Errors.Error:
156 message = '[%s] %s' % (error.Code, error.Message)
157 raise orm.except_orm('Error', message)
158
159 delivery_instructions = {}
160 for service in res['value'].DeliveryInstructions:
161 service_code = service.PRZL
162 delivery_instructions[service_code] = {'name': service.Description}
163
164 return delivery_instructions
165
166 def _update_delivery_instructions(self, cr, uid, ids, web_service,
167 additional_services, context=None):
168 if context is None:
169 context = {}
170 ir_model_data_obj = self.pool.get('ir.model.data')
171 carrier_option_obj = self.pool.get('delivery.carrier.template.option')
172
173 xmlid = 'delivery_carrier_label_postlogistics', 'postlogistics'
174 postlogistics_partner = ir_model_data_obj.get_object(
175 cr, uid, *xmlid, context=context)
176
177 for service_code, data in additional_services.iteritems():
178
179 option_ids = carrier_option_obj.search(
180 cr, uid,
181 [('code', '=', service_code),
182 ('postlogistics_type', '=', 'delivery')
183 ],
184 context=context)
185
186 if option_ids:
187 carrier_option_obj.write(cr, uid, option_ids, data, context=context)
188 else:
189 data.update(code=service_code,
190 postlogistics_type='delivery',
191 partner_id=postlogistics_partner.id)
192 carrier_option_obj.create(cr, uid, data, context=context)
193 lang = context.get('lang', 'en')
194 _logger.info("Updated delivery instrutions. [%s]" %(lang))
195
196 def _get_additional_services(self, cr, uid, ids, web_service,
197 company, service_code, context=None):
198 if context is None:
199 context = {}
200
201 lang = context.get('lang', 'en')
202 service_code_list = service_code.split(',')
203 res = web_service.read_additional_services(company, service_code_list, lang)
204 if 'errors' in res:
205 errors = '\n'.join(res['errors'])
206 error_message = (_('Could not retrieve Postlogistics base '
207 'services:\n%s') % errors)
208 raise orm.except_orm(_('Error'), error_message)
209
210 if not res['value']:
211 return {}
212
213 if hasattr(res['value'], 'Errors') and res['value'].Errors:
214 for error in res['value'].Errors.Error:
215 message = '[%s] %s' % (error.Code, error.Message)
216 raise orm.except_orm('Error', message)
217
218 additional_services = {}
219 for service in res['value'].AdditionalService:
220 service_code = service.PRZL
221 additional_services[service_code] = {'name': service.Description}
222
223 return additional_services
224
225 def _update_additional_services(self, cr, uid, ids, web_service,
226 additional_services, context=None):
227 if context is None:
228 context = {}
229 ir_model_data_obj = self.pool.get('ir.model.data')
230 carrier_option_obj = self.pool.get('delivery.carrier.template.option')
231
232 postlogistics_partner = ir_model_data_obj.get_object(
233 cr, uid, 'delivery_carrier_label_postlogistics', 'postlogistics', context=context)
234
235 for service_code, data in additional_services.iteritems():
236
237 option_ids = carrier_option_obj.search(cr, uid, [
238 ('code', '=', service_code),
239 ('postlogistics_type', '=', 'additional')
240 ], context=context)
241
242 if option_ids:
243 carrier_option_obj.write(cr, uid, option_ids, data, context=context)
244 else:
245 data.update(code=service_code,
246 postlogistics_type='additional',
247 partner_id=postlogistics_partner.id)
248 carrier_option_obj.create(cr, uid, data, context=context)
249 lang = context.get('lang', 'en')
250 _logger.info("Updated additional services [%s]" % (lang))
251
252 def _update_basic_services(self, cr, uid, ids, web_service, company, group_id, context=None):
253 """ Update of basic services
254
255 A basic service can be part only of one service group
256
257 :return: {additional_services: {<service_code>: service_data}
258 delivery_instructions: {<service_code>: service_data}
259 }
260
261 """
262 if context is None:
263 context = {}
264 ir_model_data_obj = self.pool.get('ir.model.data')
265 service_group_obj = self.pool.get('postlogistics.service.group')
266 carrier_option_obj = self.pool.get('delivery.carrier.template.option')
267
268 xmlid = 'delivery_carrier_label_postlogistics', 'postlogistics'
269 postlogistics_partner = ir_model_data_obj.get_object(
270 cr, uid, *xmlid, context=context)
271 lang = context.get('lang', 'en')
272
273 group = service_group_obj.browse(cr, uid, group_id, context=context)
274
275 res = web_service.read_basic_services(company, group.group_extid, lang)
276 if 'errors' in res:
277 errors = '\n'.join(res['errors'])
278 error_message = (_('Could not retrieve Postlogistics base '
279 'services:\n%s') % errors)
280 raise orm.except_orm(_('Error'), error_message)
281
282 additional_services = {}
283 delivery_instructions = {}
284 # Create or update basic service
285 for service in res['value'].BasicService:
286 service_code = ','.join(service.PRZL)
287 option_ids = carrier_option_obj.search(cr, uid, [
288 ('code', '=', service_code),
289 ('postlogistics_service_group_id', '=', group_id),
290 ('postlogistics_type', '=', 'basic')
291 ], context=context)
292 data = {'name': service.Description}
293 if option_ids:
294 carrier_option_obj.write(cr, uid, option_ids, data, context=context)
295 option_id = option_ids[0]
296 else:
297 data.update(code=service_code,
298 postlogistics_service_group_id=group_id,
299 partner_id=postlogistics_partner.id,
300 postlogistics_type='basic')
301 option_id = carrier_option_obj.create(cr, uid, data, context=context)
302
303 # Get related services
304 allowed_services = self._get_additional_services(
305 cr, uid, ids, web_service, company, service_code, context=context)
306 for key, value in additional_services.iteritems():
307 if key in allowed_services:
308 additional_services[key]['postlogistics_basic_service_ids'][0][2].append(option_id)
309 del allowed_services[key]
310 for key, value in allowed_services.iteritems():
311 additional_services[key] = value
312 additional_services[key]['postlogistics_basic_service_ids'] = [(6, 0, [option_id])]
313
314 allowed_services = self._get_delivery_instructions(
315 cr, uid, ids, web_service, company, service_code, context=context)
316 for key, value in delivery_instructions.iteritems():
317 if key in allowed_services:
318 delivery_instructions[key]['postlogistics_basic_service_ids'][0][2].append(option_id)
319 del allowed_services[key]
320 for key, value in allowed_services.iteritems():
321 delivery_instructions[key] = value
322 delivery_instructions[key]['postlogistics_basic_service_ids'] = [(6, 0, [option_id])]
323
324 _logger.info("Updated '%s' basic service [%s]." % (group.name, lang))
325 return {'additional_services': additional_services,
326 'delivery_instructions': delivery_instructions}
327
328 def _update_service_groups(self, cr, uid, ids, web_service, company, context=None):
329 """ Also updates additional services and delivery instructions
330 as they are shared between groups
331
332 """
333 if context is None:
334 context = {}
335 service_group_obj = self.pool.get('postlogistics.service.group')
336
337 lang = context.get('lang', 'en')
338
339 res = web_service.read_service_groups(company, lang)
340 if 'errors' in res:
341 errors = '\n'.join(res['errors'])
342 error_message = (_('Could not retrieve Postlogistics group '
343 'services:\n%s') % errors)
344 raise orm.except_orm(_('Error'), error_message)
345
346 additional_services = {}
347 delivery_instructions = {}
348
349 # Create or update groups
350 for group in res['value'].ServiceGroup:
351 group_extid = group.ServiceGroupID
352 group_ids = service_group_obj.search(
353 cr, uid, [('group_extid', '=', group_extid)], context=context)
354 data = {'name': group.Description}
355 if group_ids:
356 service_group_obj.write(cr, uid, group_ids, data, context=context)
357 group_id = group_ids[0]
358 else:
359 data['group_extid'] = group_extid
360 group_id = service_group_obj.create(cr, uid, data, context=context)
361
362 # Get related services for all basic services of this group
363 res = self._update_basic_services(cr, uid, ids, web_service,
364 company, group_id, context=context)
365
366 allowed_services = res.get('additional_services', {})
367 for key, value in additional_services.iteritems():
368 if key in allowed_services:
369 option_ids = allowed_services[key]['postlogistics_basic_service_ids'][0][2]
370 additional_services[key]['postlogistics_basic_service_ids'][0][2].extend(option_ids)
371 del allowed_services[key]
372 additional_services.update(allowed_services)
373
374 allowed_services = res.get('delivery_instructions', {})
375 for key, value in delivery_instructions.iteritems():
376 if key in allowed_services:
377 option_ids = allowed_services[key]['postlogistics_basic_service_ids'][0][2]
378 delivery_instructions[key]['postlogistics_basic_service_ids'][0][2].extend(option_ids)
379 del allowed_services[key]
380 delivery_instructions.update(allowed_services)
381
382 # Update related services
383 self._update_additional_services(cr, uid, ids, web_service,
384 additional_services, context=context)
385 self._update_delivery_instructions(cr, uid, ids, web_service,
386 delivery_instructions, context=context)
387
388 def update_postlogistics_options(self, cr, uid, ids, context=None):
389 """ This action will update all postlogistics option by
390 importing services from PostLogistics WebService API
391
392 The object we create are 'delivey.carrier.template.option'
393
394 """
395 if context is None:
396 context = {}
397 user_obj = self.pool.get('res.users')
398 for config in self.browse(cr, uid, ids, context=context):
399 company = config.company_id
400 web_service = PostlogisticsWebService(company)
401
402 # make sure we create source text in en_US
403 ctx = context.copy()
404 ctx['lang'] = 'en_US'
405 self._update_service_groups(cr, uid, ids, web_service, company, context=ctx)
406
407 language_obj = self.pool.get('res.lang')
408 language_ids = language_obj.search(cr, uid, [], context=context)
409
410 languages = language_obj.browse(cr, uid, language_ids, context=context)
411
412 # handle translations
413 # we call the same methode with a different language context
414 for lang_br in languages:
415 lang = lang_br.code
416 ctx = context.copy()
417 ctx['lang'] = lang_br.code
418 postlogistics_lang = web_service._get_language(lang)
419 # add translations only for languages that exists on postlogistics
420 # english source will be kept for other languages
421 if postlogistics_lang == 'en':
422 continue
423 self._update_service_groups(cr, uid, ids, web_service, company, context=ctx)
424 return True
0425
=== added file 'delivery_carrier_label_postlogistics/res_config_view.xml'
--- delivery_carrier_label_postlogistics/res_config_view.xml 1970-01-01 00:00:00 +0000
+++ delivery_carrier_label_postlogistics/res_config_view.xml 2014-01-13 11:23:36 +0000
@@ -0,0 +1,110 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4
5 <record id="view_postlogistics_config_settings" model="ir.ui.view">
6 <field name="name">postlogistics settings</field>
7 <field name="model">postlogistics.config.settings</field>
8 <field name="arch" type="xml">
9 <form string="Configure Postlogistics" version="7.0" class="oe_form_configuration">
10 <header>
11 <button string="Apply" type="object" name="execute" class="oe_highlight"/>
12 or
13 <button string="Cancel" type="object" name="cancel" class="oe_link"/>
14 </header>
15
16 <group groups="base.group_multi_company">
17 <div>
18 <div>
19 <label for="company_id" string="Select Company"/>
20 <field name="company_id"
21 widget="selection"
22 on_change="onchange_company_id(company_id, context)"
23 class="oe_inline"/>
24 </div>
25 </div>
26 </group>
27 <separator string="Web Service Authentification"/>
28 <group>
29 <div>
30 <div>
31 <label for="username"/>
32 <field name="username" class="oe_inline"/>
33 </div>
34 <div>
35 <label for="password"/>
36 <field name="password" class="oe_inline"/>
37 </div>
38 </div>
39 </group>
40 <separator string="Licenses"/>
41 <group>
42 <div>
43 <div>
44 <label for="license_less_1kg"/>
45 <field name="license_less_1kg" class="oe_inline"/>
46 </div>
47 <div>
48 <label for="license_more_1kg"/>
49 <field name="license_more_1kg" class="oe_inline"/>
50 </div>
51 <div>
52 <label for="license_vinolog"/>
53 <field name="license_vinolog" class="oe_inline"/>
54 </div>
55 </div>
56 </group>
57 <separator string="Sender Informations"/>
58 <group>
59 <div>
60 <div>
61 <label for="logo"/>
62 <field name="logo" widget="image"/>
63 </div>
64 <div>
65 <label for="office"/>
66 <field name="office" class="oe_inline"/>
67 </div>
68 </div>
69 </group>
70 <separator string="Default configs"/>
71 <group>
72 <div>
73 <div>
74 <label for="default_label_layout"/>
75 <field name="default_label_layout" class="oe_inline"/>
76 </div>
77 <div>
78 <label for="default_output_format"/>
79 <field name="default_output_format" class="oe_inline"/>
80 </div>
81 <div>
82 <label for="default_resolution"/>
83 <field name="default_resolution" class="oe_inline"/>
84 </div>
85 </div>
86 </group>
87 <group>
88 <div>
89 <div>
90 <button string="Update PostLogistics Services" type="object" name="update_postlogistics_options" class="oe_highlight"/>
91 </div>
92 </div>
93 </group>
94 </form>
95 </field>
96 </record>
97
98 <record id="action_postlogistics_config" model="ir.actions.act_window">
99 <field name="name">Configure Postlogistics</field>
100 <field name="type">ir.actions.act_window</field>
101 <field name="res_model">postlogistics.config.settings</field>
102 <field name="view_mode">form</field>
103 <field name="target">inline</field>
104 </record>
105
106 <menuitem id="menu_postlogistics_config" name="Postlogistics" parent="base.menu_config"
107 sequence="20" action="action_postlogistics_config"/>
108
109 </data>
110</openerp>
0111
=== added file 'delivery_carrier_label_postlogistics/res_partner_data.xml'
--- delivery_carrier_label_postlogistics/res_partner_data.xml 1970-01-01 00:00:00 +0000
+++ delivery_carrier_label_postlogistics/res_partner_data.xml 2014-01-13 11:23:36 +0000
@@ -0,0 +1,134 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data noupdate="1">
4 <record id="postlogistics" model="res.partner">
5 <field name="image">/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
6CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU
7FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCABkAMMDASIA
8AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
9AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
10ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
11p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
12AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
13BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK
14U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
15uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD69ooo
16r/No/YAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
175b4p+NW+Gvw38ReKRafbm0m0a6+yvLt83b/Du/hr5B0v/gp7CbmH+1fhzPb6ez7WuLTUN7f8B3Kq
18t/31X0r+1ASf2dfiN7aLPzXzR8Mb3wqn/BO3VY/EUun/AHNR+yxXDJ5v2rzW8ryv4t2/bX7Nwrle
19U18q+s47De2lKtGn7rkuVSXkfP42rWjX5KcuX3eY+zPA/jbSPiR4T0zxLoN39s0nUYvNgl27X/2k
20Zf4WVvlre9sc18AfAr4+yfs6/sZw6vNbLf6rqOuXUGi2lx91vkXc7f7CNu/4FU1n+1P8ffg/qWhe
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
127/9k=</field>
128 <field name="name">PostLogistics</field>
129 <field name="customer" eval="False"/>
130 <field name="supplier" eval="False"/>
131 <field name="email">webservice@post.ch</field>
132 </record>
133 </data>
134</openerp>
0135
=== added directory 'delivery_carrier_label_postlogistics/security'
=== added file 'delivery_carrier_label_postlogistics/security/ir.model.access.csv'
--- delivery_carrier_label_postlogistics/security/ir.model.access.csv 1970-01-01 00:00:00 +0000
+++ delivery_carrier_label_postlogistics/security/ir.model.access.csv 2014-01-13 11:23:36 +0000
@@ -0,0 +1,3 @@
1id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
2access_postlogistics_service_group_salesman,postlogistics.service.group.salesman,model_postlogistics_service_group,base.group_sale_salesman,1,0,0,0
3access_postlogistics_service_group_manager,postlogistics.service.group.manager,model_postlogistics_service_group,base.group_sale_manager,1,1,1,1
04
=== added file 'delivery_carrier_label_postlogistics/stock.py'
--- delivery_carrier_label_postlogistics/stock.py 1970-01-01 00:00:00 +0000
+++ delivery_carrier_label_postlogistics/stock.py 2014-01-13 11:23:36 +0000
@@ -0,0 +1,115 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# Author: Yannick Vaucher
5# Copyright 2013 Camptocamp SA
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21from openerp.osv import orm, fields
22
23from postlogistics.web_service import PostlogisticsWebService
24
25
26class stock_picking(orm.Model):
27 _inherit = 'stock.picking'
28
29 def _generate_postlogistics_label(self, cr, uid, picking,
30 webservice_class=None, context=None):
31 """ Generate labels and write tracking numbers received """
32 user_obj = self.pool.get('res.users')
33 user = user_obj.browse(cr, uid, uid, context=context)
34 company = user.company_id
35 if webservice_class is None:
36 webservice_class = PostlogisticsWebService
37
38 web_service = webservice_class(company)
39 res = web_service.generate_label(picking, user.lang)
40
41 if 'errors' in res:
42 raise orm.except_orm('Error', '\n'.join(res['errors']))
43
44 trackings = set([line.tracking_id for line in picking.move_lines])
45
46 labels = []
47 # if there are no pack defined, write tracking_number on picking
48 # otherwise, write it on serial field of each pack
49 for track in trackings:
50 if not track:
51 # ignore lines without tracking when there is tracking
52 # in a picking
53 if len(trackings) > 1:
54 continue
55 label = res['value'][0]
56 tracking_number = label['tracking_number']
57 self.write(cr, uid, picking.id,
58 {'carrier_tracking_ref': tracking_number},
59 context=context)
60 else:
61 label = None
62 for search_label in res['value']:
63 if track.name in search_label['item_id'].split('+')[-1]:
64 label = search_label
65 tracking_number = label['tracking_number']
66 track.write({'serial': tracking_number})
67 break
68 labels.append({'tracking_id': track and track.id or False,
69 'file': label['binary'].decode('base64'),
70 'file_type': label['file_type'],
71 'name': tracking_number,
72 })
73
74 return labels
75
76 def generate_shipping_labels(self, cr, uid, ids, context=None):
77 """ Add label generation for Postlogistics """
78 if isinstance(ids, (long, int)):
79 ids = [ids]
80 assert len(ids) == 1
81 picking = self.browse(cr, uid, ids[0], context=context)
82 if picking.carrier_id.type == 'postlogistics':
83 return self._generate_postlogistics_label(cr, uid, picking,
84 context=context)
85 return super(stock_picking, self
86 ).generate_shipping_labels(cr, uid, ids, context=context)
87
88
89class ShippingLabel(orm.Model):
90 """ Child class of ir attachment to identify which are labels """
91 _inherit = 'shipping.label'
92
93 def _get_file_type_selection(self, cr, uid, context=None):
94 """ Return a sorted list of extensions of label file format
95
96 :return: list of tuple (code, name)
97
98 """
99 file_types = super(ShippingLabel, self
100 )._get_file_type_selection(cr, uid, context=context)
101 new_types = [('eps', 'EPS'),
102 ('gif', 'GIF'),
103 ('jpg', 'JPG'),
104 ('png', 'PNG'),
105 ('pdf', 'PDF'),
106 ('spdf', 'sPDF'),
107 ('zpl2', 'ZPL2')]
108 add_types = [t for t in new_types if not t in file_types]
109 file_types.extend(add_types)
110 file_types.sort(key=lambda t: t[0])
111 return file_types
112
113 _columns = {
114 'file_type': fields.selection(_get_file_type_selection, 'File type')
115 }

Subscribers

People subscribed via source and target branches