Subversion Repositories SmartDukaan

Rev

Rev 20823 | Rev 21099 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
20718 kshitij.so 1
from suds.client import Client
2
from shop2020.clients.TransactionClient import TransactionClient
3
from datetime import datetime, time, timedelta
4
import traceback
20724 kshitij.so 5
import re
20718 kshitij.so 6
 
7
raclient = None
8
user_profile = None
20820 kshitij.so 9
shipperMap = {}
20718 kshitij.so 10
 
11
DEBUG=True
12
 
13
acc_url="http://netconnect.bluedart.com/Ver1.7/Demo/ShippingAPI/WayBill/WayBillGeneration.svc?wsdl"
14
LOGIN_ID ="FA316326"
15
LICENCE_KEY="5f1740fdfb8196e7980faea7fe52dd0d"
16
API_VERSION="1.7"
17
API_TYPE="S"
18
AREA="ALL"
19
 
20768 kshitij.so 20
xstr = lambda s: s or ""
21
 
20745 kshitij.so 22
class __BluedartAWBResponse:
23
    def __init__(self, awbNo, destArea, destLocation):
24
        self.awbNo = awbNo
25
        self.destArea = destArea
26
        self.destLocation = destLocation
27
 
20718 kshitij.so 28
def get_client():
29
    global raclient
30
    if raclient is None:
31
        raclient = Client(acc_url, timeout=70)
32
        return raclient
33
    else:
34
        return raclient
35
 
36
def get_profile():
37
    global user_profile
38
    if user_profile is None:
39
        profile = get_client().factory.create('ns0:UserProfile')
40
        profile.Api_type = API_TYPE
41
        profile.Area = AREA 
42
        profile.LicenceKey = LICENCE_KEY
43
        profile.LoginID = LOGIN_ID
44
        profile.Version = API_VERSION
45
        user_profile = profile
46
    return user_profile
47
 
20820 kshitij.so 48
def get_shipper_object(warehouse_id):
49
    global shipperMap
50
    if shipperMap.has_key(warehouse_id):
51
        return shipperMap.get(warehouse_id)
52
    else:
53
        tc = TransactionClient().get_client()
54
        info = tc.getBuyerByWarehouse(warehouse_id)
55
        if info is None:
56
            raise RuntimeError("Buyer address mapping is None")
20718 kshitij.so 57
        ship = get_client().factory.create('ns2:Shipper')
20820 kshitij.so 58
        ship.CustomerAddress1 = info.buyerAddress.address[:30]
59
        ship.CustomerAddress2 = info.buyerAddress.address[30:60]
60
        ship.CustomerAddress3 = info.buyerAddress.address[60:90]
20718 kshitij.so 61
        ship.CustomerCode = "316326"
20820 kshitij.so 62
        ship.CustomerMobile = info.buyerAddress.contact_number
20718 kshitij.so 63
        ship.VendorCode="AMPFAR"
64
        ship.OriginArea = "FAR"
20820 kshitij.so 65
        ship.CustomerPincode = info.buyerAddress.pin
20823 kshitij.so 66
        info.organisationName = info.organisationName+" "
67
        temp_org = info.organisationName.split(" ")
20822 kshitij.so 68
        ship.Sender = (xstr(temp_org[0])+" "+xstr(temp_org[1])).strip()
20824 kshitij.so 69
        ship.CustomerName = ship.Sender
20820 kshitij.so 70
        ship.CustomerTelephone= info.buyerAddress.contact_number 
71
        shipperMap[warehouse_id] = ship
72
    return shipperMap.get(warehouse_id)
20718 kshitij.so 73
 
20809 kshitij.so 74
def create_commodity_obj(orders_list, cd, ser):
75
    SpecialInstruction = ""
20817 kshitij.so 76
    it=0
20809 kshitij.so 77
    for order in orders_list:
20817 kshitij.so 78
        it+=1
20809 kshitij.so 79
        temp = xstr(order.lineitems[0].brand)+" "+xstr(order.lineitems[0].model_name)+" "+xstr(order.lineitems[0].model_number)+" "+xstr(order.lineitems[0].color)+"-"+str(order.lineitems[0].quantity)
20817 kshitij.so 80
        SpecialInstruction+=temp
81
        if len(orders_list) == it:
82
            pass
83
        else:
84
            SpecialInstruction+=","
85
 
20809 kshitij.so 86
    SpecialInstruction = re.sub(' +',' ',SpecialInstruction)
20817 kshitij.so 87
    ser.SpecialInstruction = SpecialInstruction[:50]
20809 kshitij.so 88
    cd.CommodityDetail1 = SpecialInstruction[:30]
89
    cd.CommodityDetail2 = SpecialInstruction[30:60]
20817 kshitij.so 90
    cd.CommodityDetail3 = SpecialInstruction[60:90]
20816 kshitij.so 91
    ser.Commodity = cd
20809 kshitij.so 92
    return ser
93
 
20768 kshitij.so 94
def clean_address(order, consignee):
95
    address_string = xstr(order.customer_address1)+" "+xstr(order.customer_address2)
96
    address_string = re.sub(",",' ',address_string)
97
    add_string = re.sub(' +',' ',address_string)
98
    c_1, idx = sub_address(address_string, 0, 30)
99
    c_2, idx = sub_address(address_string, idx, idx+30)
100
    c_3, idx = sub_address(address_string, idx, len(add_string))
20772 kshitij.so 101
    consignee.ConsigneeAddress1 = c_1.strip()
102
    consignee.ConsigneeAddress2 = c_2.strip()
103
    consignee.ConsigneeAddress3 = (c_3 +" "+order.customer_city).strip()
20768 kshitij.so 104
    return consignee
105
 
106
def sub_address(add_str, previous_loc, final_loc):
107
    sub = add_str[previous_loc:final_loc]
108
    max_idx = sub.rfind(" ")
109
    if max_idx==-1:
110
        return sub, len(sub)
111
    if max_idx == (final_loc-1):
112
        return sub
113
    return sub[: max_idx], max_idx+previous_loc
20808 kshitij.so 114
 
115
def get_shipment_details(logisticsTxnId):
116
    tc = TransactionClient().get_client()
117
    shipment_cost_detail = tc.getCostDetailForLogisticsTxnId(logisticsTxnId)
118
    return shipment_cost_detail
20768 kshitij.so 119
 
120
 
20718 kshitij.so 121
def generate_awb(orders_list):
122
    try:
123
        if not isinstance(orders_list, list) or not orders_list:
20724 kshitij.so 124
            raise ValueError("Expecting list of orders")
20718 kshitij.so 125
        consignee = get_client().factory.create('ns2:Consignee')
20768 kshitij.so 126
        consignee = clean_address(orders_list[0], consignee)
20718 kshitij.so 127
        consignee.ConsigneeAttention = orders_list[0].customer_name
128
        consignee.ConsigneeMobile = orders_list[0].customer_mobilenumber
129
        consignee.ConsigneeName = orders_list[0].customer_name
130
        consignee.ConsigneePincode = orders_list[0].customer_pincode
131
        consignee.ConsigneeTelephone = orders_list[0].customer_mobilenumber
132
        ser = get_client().factory.create('ns2:Services')
133
        productType = get_client().factory.create('ns1:ProductType')
134
        actual_weight = 0.0
135
        collectable_amount = 0.0
136
        declared_value = 0.0
137
        isCod = orders_list[0].cod
138
        for order in orders_list:
139
            line_item = order.lineitems[0]
140
            actual_weight += line_item.total_weight
141
            collectable_amount += order.total_amount + order.shippingCost
142
            declared_value += order.total_amount
143
        ser.ActualWeight = actual_weight
144
        ser.CreditReferenceNo = orders_list[0].logisticsTransactionId
145
        ser.DeclaredValue = declared_value 
146
        ser.ProductCode = "A"
147
        ser.ProductType = productType.Dutiables
20726 kshitij.so 148
        ser.PieceCount = 1
20718 kshitij.so 149
        now_time = datetime.now().time()
150
        if now_time <= time(19,00):
151
            ser.PickupDate = datetime.today().strftime('%Y-%m-%d')
152
        else:
153
            ser.PickupDate = (datetime.now()+timedelta(days=1)).strftime('%Y-%m-%d')
154
        ser.PickupTime="1900"
155
        ser.IsReversePickup = False
156
        ser.PDFOutputNotRequired = True
157
        ser.RegisterPickup = False
158
        if isCod:
159
            ser.CollectableAmount = collectable_amount 
160
            ser.SubProductCode = "C"
161
        wbg = get_client().factory.create('ns2:WayBillGenerationRequest')
162
 
163
        d= get_client().factory.create('ns2:Dimension')
20808 kshitij.so 164
        shipment_cost = get_shipment_details(orders_list[0].logisticsTransactionId)
165
        if shipment_cost is None or shipment_cost.packageDimensions is None:
166
            raise RuntimeError("Package dim. is none")
167
        t_dimensions = shipment_cost.packageDimensions.split("X")
20815 kshitij.so 168
        if len(t_dimensions)!=3:
20808 kshitij.so 169
            raise RuntimeError("Package dim. is not valid")
170
        d.Count=1
20809 kshitij.so 171
        d.Length = float(t_dimensions[0].strip())
172
        d.Breadth = float(t_dimensions[1].strip())
173
        d.Height = float(t_dimensions[2].strip())
20820 kshitij.so 174
        ser.Dimensions.Dimension=[d]
20809 kshitij.so 175
 
20816 kshitij.so 176
        cd = get_client().factory.create('ns2:Commodity')
20809 kshitij.so 177
 
178
        ser = create_commodity_obj(orders_list, cd, ser)
179
 
180
        wbg.Consignee = consignee
181
        wbg.Services = ser
20820 kshitij.so 182
        wbg.Shipper = get_shipper_object(orders_list[0].warehouse_id)
20809 kshitij.so 183
 
20724 kshitij.so 184
        response = get_client().service.GenerateWayBill(wbg, get_profile())
185
        if response.AWBNo is None:
20745 kshitij.so 186
            raise RuntimeError("AWB generated is empty")
20724 kshitij.so 187
        else:
20745 kshitij.so 188
            bluedartResponse = __BluedartAWBResponse(str(response.AWBNo),str(response.DestinationArea),str(response.DestinationLocation))
189
            return bluedartResponse
20718 kshitij.so 190
    finally:
191
        if DEBUG:
192
            print get_client().last_sent()
193
            print get_client().last_received()
194
 
195
def main():
20724 kshitij.so 196
    print generate_awb([])
20718 kshitij.so 197
 
198
 
199
 
200
if __name__ == '__main__':
201
    main()