def postPartMaster(ObjectList, Credential):
        try:
            part_master_list = []
            feed_remark = FeedLogWithRemark(
                len(ObjectList.PartMasterData), feed_type="Part Master Feed", action="Received", status=True
            )

            for part in ObjectList.PartMasterData:
                part_master_list.append(
                    {
                        "part_number": part.PART_NUMBER,
                        "part_model": part.PART_MODEL,
                        "part_type": part.PART_TYPE,
                        "category": part.CATEGORY,
                        "description": part.DESCRIPTION,
                        "segment": part.SEGMENT,
                        "supplier": part.SUPPLIER,
                    }
                )
        except Exception as ex:
            ex = "PartMasterService: {0}  Error on Validating {1}".format(part, ex)
            feed_remark.fail_remarks(ex)
            logger.error(ex)
        feed_remark = save_to_db(feed_type="part_master", data_source=part_master_list, feed_remark=feed_remark)

        feed_remark.save_to_feed_log()
        return get_response(feed_remark)
    def postECORelease(ObjectList, Credential):
        eco_list = []
        feed_remark = FeedLogWithRemark(len(ObjectList.ECOReleaseData), feed_type='ECO Release Feed', action='Received', status=True)

        for eco_obj in ObjectList.ECOReleaseData:
            eco_list.append({
                            'eco_number' :  eco_obj.ECO_NUMBER,
                            'eco_release_date' :  eco_obj.ECO_REL_DATE,
                            'eco_description' :  eco_obj.ECO_DESCRIP,
                            'action' :  eco_obj.ACTION,
                            'parent_part' :  eco_obj.PARENT_PART,
                            'add_part' :  eco_obj.ADD_PART,
                            'add_part_qty' :  eco_obj.ADD_PART_QTY,
                            'add_part_rev' :  eco_obj.ADD_PART_REV,
                            'add_part_loc_code' :  eco_obj.ADD_PART_LOC_CODE,
                            'del_part' :  eco_obj.DEL_PART,
                            'del_part_qty' :  eco_obj.DEL_PART_QTY,
                            'del_part_rev' :  eco_obj.DEL_PART_REV,
                            'del_part_loc_code' :  eco_obj.DEL_PART_LOC_CODE,
                            'models_applicable' :  eco_obj.MODELS_APPLICABLE,
                            'serviceability' :  eco_obj.SERVICEABILITY,
                            'interchangebility' :  eco_obj.INTERCHANGEABILITY,
                            'reason_for_change' :  eco_obj.REASON_FOR_CHANGE,
                            })

        feed_remark = save_to_db(feed_type='eco_release', data_source=eco_list, feed_remark=feed_remark)
        feed_remark.save_to_feed_log()
        return get_response(feed_remark)
    def postDistributor(ObjectList, Credential):
        distributor_list = []
        feed_remark = FeedLogWithRemark(
            len(ObjectList.DistributorData), feed_type="Distributor Feed", action="Received", status=True
        )
        for distributor in ObjectList.DistributorData:
            try:
                distributor_list.append(
                    {
                        "id": distributor.DISTRIBUTOR_ID.upper(),
                        "name": distributor.NAME.upper(),
                        "email": distributor.EMAIL,
                        "mobile": utils.mobile_format(distributor.PHONE_NUMBER),
                        "city": distributor.CITY.upper(),
                        "asm_id": distributor.ASM_ID,
                    }
                )
            except Exception as ex:
                ex = "DistributorService: {0}  Error on Validating {1}".format(distributor, ex)
                feed_remark.fail_remarks(ex)
                logger.error(ex)
        feed_remark = save_to_db(feed_type="distributor", data_source=distributor_list, feed_remark=feed_remark)

        feed_remark.save_to_feed_log()
        return get_response(feed_remark)
    def postProductPurchase(ObjectList, Credential):
        feed_remark = FeedLogWithRemark(len(ObjectList.ProductPurchaseData),
                                        feed_type='Purchase Feed',
                                        action='Received', status=True)
        product_purchase_list = []
        for product in ObjectList.ProductPurchaseData:
            try:
                product_purchase_list.append({
                    'vin': product.CHASSIS,
                    'sap_customer_id': product.CUSTOMER_ID,
                    'customer_phone_number': utils.mobile_format(product.CUST_MOBILE),
                    'customer_name': product.CUSTOMER_NAME,
                    'city': product.CITY,
                    'state': product.STATE,
                    'pin_no': product.PIN_NO,
                    'product_purchase_date': product.VEH_SL_DT,
                    'engine': product.ENGINE,
                    'veh_reg_no': product.VEH_REG_NO
                })
            except Exception as ex:
                ex = "ProductPurchaseService: {0}  Error on Validating {1}".format(product, ex)
                feed_remark.fail_remarks(ex)
                logger.error(ex)

        feed_remark = save_to_db(
            feed_type='purchase', data_source=product_purchase_list,
                                                 feed_remark=feed_remark)
        feed_remark.save_to_feed_log()
        return get_response(feed_remark)
    def postMechanic(ObjectList, Credential):
        mechanic_list = []
        feed_remark = FeedLogWithRemark(
            len(ObjectList.MechanicData), feed_type="Mechanic Feed", action="Received", status=True
        )
        for mechanic in ObjectList.MechanicData:
            try:
                mechanic_list.append(
                    {
                        "mechanic_id": mechanic.MECH_ID,
                        #                     'first_name': mechanic.FIRST_NAME,
                        #                     'last_name': mechanic.LAST_NAME,
                        #                     'mobile': utils.mobile_format(mechanic.PHONE_NUMBER),
                        #                     'shop_name': mechanic.SHOP_NAME,
                        #                     'dob': mechanic.DOB,
                        #                     'district': mechanic.DISTRICT,
                        #                     'state': mechanic.STATE,
                        #                     'pincode': mechanic.PINCODE,
                        #                     'dist_id': mechanic.DIST_ID,
                        "temp_id": mechanic.TEMP_MECH_ID,
                    }
                )
            except Exception as ex:
                ex = "MechanicService: {0}  Error on Validating {1}".format(mechanic, ex)
                feed_remark.fail_remarks(ex)
                logger.error(ex)
        feed_remark = save_to_db(feed_type="mechanic", data_source=mechanic_list, feed_remark=feed_remark)

        feed_remark.save_to_feed_log()
        return get_response(feed_remark)
    def upload_asc_data(self):
        '''Uplaod ASC data'''
        print "Started running function..."
        file_list = ['new_asc_list.csv']
        file = open("newfile.txt", "w")
        asc_list = []
        
        for i in range(0, 1):
            with open(settings.PROJECT_DIR + '/upload_data/' + file_list[i], 'r') as csvfile:
                spamreader = csv.reader(csvfile, delimiter=',')
                next(spamreader)
                for row_list in spamreader:
                    temp ={}
                    temp['asc_id'] = row_list[6].strip()
                    temp['name'] = (row_list[5].strip())[0:29]
                    temp['phone_number'] = ''
                    temp['address'] = str(row_list[8].strip()) + ", " +str(row_list[9].strip())
                    temp['email'] = row_list[7].strip()
                    temp['dealer_id'] = row_list[0].strip()                    
                    asc_list.append(temp)

        feed_remark = FeedLogWithRemark(len(asc_list),
                                        feed_type='ASC Feed',
                                        action='Received', status=True)

        feed_remark = self.save_to_db(feed_type='ASC', data_source=asc_list,
                              feed_remark=feed_remark)
        feed_remark.save_to_feed_log()
        file.write(self.get_response(feed_remark))
        file.close()
        for asc in asc_list:
            data = {'receiver': asc['email'], 'name': asc['name'], 'username': asc['asc_id'], 'password': asc['asc_id'] + '@123'}
            send_asc_registration_mail(data)
    def postProductDispatch(ObjectList, Credential):
        feed_remark = FeedLogWithRemark(len(ObjectList.ProductDispatchData),
                                        feed_type='Dispatch Feed',
                                        action='Received', status=True)
        product_dispatch_list = []
        for product in ObjectList.ProductDispatchData:
            try:
                product_dispatch_list.append({
                    'vin': product.CHASSIS,
                    'product_type': product.PRODUCT_TYPE,
                    'invoice_date': product.VEC_DIS_DT,
                    'dealer_id': product.KUNNR,
                    'unique_service_coupon': product.UCN_NO,
                    'valid_days': product.DAYS_LIMIT_TO,
                    'valid_kms': product.KMS_TO,
                    'service_type': product.SERVICE_TYPE,
                    'coupon_status': settings.DEFAULT_COUPON_STATUS,
#                     'sku_code':product.SKU_CODE
#                     'engine':product.ENGINE,
                })
            except Exception as ex:
                ex = "ProductDispatchService: {0}  Error on Validating {1}".format(product, ex)
                feed_remark.fail_remarks(ex)
                logger.error(ex)

        feed_remark = save_to_db(
            feed_type='dispatch', data_source=product_dispatch_list,
                                        feed_remark=feed_remark)
        feed_remark.save_to_feed_log()
        return get_response(feed_remark)
    def postDealer(ObjectList, Credential):
        dealer_list = []
        feed_remark = FeedLogWithRemark(len(ObjectList.DealerData),
                                        feed_type='Dealer Feed',
                                        action='Received', status=True)
        for dealer in ObjectList.DealerData:
            try:
                dealer_list.append({
                    'id': dealer.KUNNR,
                    'address': dealer.ADDRESS,
                    'service_advisor_id': dealer.SER_ADV_ID,
                    'name': dealer.SER_ADV_NAME,
                    'phone_number': utils.mobile_format(dealer.SER_ADV_MOBILE),
                    'status': dealer.ACTIVE_FLAG,
                    'cdms_flag':dealer.CDMS_FLAG
                })
            except Exception as ex:
                ex = "DealerService: {0}  Error on Validating {1}".format(dealer, ex)
                feed_remark.fail_remarks(ex)
                logger.error(ex)
        feed_remark = save_to_db(feed_type='dealer', data_source=dealer_list,
                              feed_remark=feed_remark)

        feed_remark.save_to_feed_log()
        return get_response(feed_remark)
    def postECOImplementation(ObjectList, Credential):
        eco_list = []
        feed_remark = FeedLogWithRemark(len(ObjectList.EcoImplementationData), feed_type='ECO Implementation Feed', action='Received', status=True)

        for eco_obj in ObjectList.EcoImplementationData:
            eco_list.append({
                            'change_no' :  eco_obj.CHANGE_NO,
                            'change_date' :  eco_obj.CHANGE_DATE,
                            'change_time' :  eco_obj.CHANGE_TIME,
                            'plant' :  eco_obj.PLANT,
                            'action' :  eco_obj.ACTION,
                            'parent_part' :  eco_obj.PARENT_PART,
                            'added_part' :  eco_obj.ADDED_PART,
                            'added_part_qty' :  eco_obj.ADDED_PART_QTY,
                            'deleted_part' :  eco_obj.DELETED_PART,
                            'deleted_part_qty' :  eco_obj.DELETED_PART_QTY,
                            'chassis_number' :  eco_obj.CHASSIS_NUMBER,
                            'engine_number' :  eco_obj.ENGINE_NUMBER,
                            'eco_number' :  eco_obj.ECO_NUMBER,
                            'reason_code' :  eco_obj.REASON_CODE,
                            'remarks' :  eco_obj.REMARKS,
                            })

        feed_remark = save_to_db(feed_type='eco_implementation', data_source=eco_list, feed_remark=feed_remark)
        feed_remark.save_to_feed_log()
        return get_response(feed_remark)
    def postPartPoint(ObjectList, Credential):
        part_upc_list = []
        feed_remark = FeedLogWithRemark(
            len(ObjectList.PartPointData), feed_type="Part points Feed", action="Received", status=True
        )
        for part in ObjectList.PartPointData:
            try:
                part_upc_list.append(
                    {
                        "part_number": part.PART_NUMBER,
                        "points": part.POINTS,
                        "price": part.PRICE,
                        "mrp": part.MRP,
                        "valid_from": part.VALID_FROM,
                        "valid_to": part.VALID_TILL,
                        "territory": part.TERRITORY,
                    }
                )
            except Exception as ex:
                ex = "PartPointService: {0}  Error on Validating {1}".format(part, ex)
                feed_remark.fail_remarks(ex)
                logger.error(ex)
        feed_remark = save_to_db(feed_type="part_point", data_source=part_upc_list, feed_remark=feed_remark)

        feed_remark.save_to_feed_log()
        return get_response(feed_remark)
    def postContainerTracker(ObjectList, Credential):
        tracker_list = []
        feed_remark = FeedLogWithRemark(len(ObjectList.ContainerTrackerData),
                                        feed_type='ContainerTracker Feed',
                                        action='Received', status=True)

        for tracker_obj in ObjectList.ContainerTrackerData:
            tracker_list.append({
                                'zib_indent_num' :  tracker_obj.ZIB_INDENT_NUM ,
                                'consignment_id' :  tracker_obj.CONSIGNMENT_ID ,
                                'truck_no' :  tracker_obj.TRUCK_NO,
                                'transporter_id' : tracker_obj.TRANSPORTER_ID,
                                'lr_number' :  tracker_obj.LR_NUMBER,
                                'lr_date' :  tracker_obj.LR_DATE,
                                'do_num' :  tracker_obj.DO_NUM,
                                'gatein_date' :  tracker_obj.GATEIN_DATE,
                                'gatein_time' :  tracker_obj.GATEIN_TIME,
                                'tranporter_name' : tracker_obj.TRANS_NAME,
                                'container_no' :  tracker_obj.CONTAINER_NO,
                                'seal_no' :  tracker_obj.SEAL_NO,
                                'shippingline_id' :  tracker_obj.SHIPPINGLINE_ID,
                                'ib_dispatch_dt' :  tracker_obj.IB_DISPATCH_DT,
                                'created_date' :  tracker_obj.CREATED_DATE,
                                'no_of_containers' :  tracker_obj.NO_OF_CONTAINERS,
                                'partner_name' : tracker_obj.PARTNER_NAME
                            })

        feed_remark = save_to_db(feed_type='container_tracker', data_source=tracker_list, feed_remark=feed_remark)
        feed_remark.save_to_feed_log()
        return get_response(feed_remark)
 def export_data(self, start_date=None, end_date=None):
     results = models.CouponData.objects.filter(sent_to_sap=0,
                         status=2).select_related('product_id')
     items = []
     total_failed = 0
     item_batch = {
         'TIMESTAMP': datetime.now().strftime("%Y-%m-%dT%H:%M:%S")}
     self.feed_remark = FeedLogWithRemark(len(results), feed_type='Coupon Redemption Feed', action='Send', status=True)
     for redeem in results:
         try:
             #added the condition only for the previous coupons with no servicing dealer details
             if redeem.service_advisor:
                 if redeem.service_advisor.dealer:
                     servicing_dealer = redeem.service_advisor.dealer.dealer_id
                 else:
                     servicing_dealer = redeem.service_advisor.asc.asc_id
             else:
                 servicing_dealer = redeem.product.dealer_id.dealer_id
             
             item = {
                     "CHASSIS": redeem.product.product_id,
                     "GCP_KMS": redeem.actual_kms,
                     "GCP_KUNNR": servicing_dealer,
                     "GCP_UCN_NO": redeem.unique_service_coupon,
                     "PRODUCT_TYPE": redeem.product.sku_code,
                     "SERVICE_TYPE": str(redeem.service_type),
                     "SER_AVL_DT": redeem.actual_service_date.date().strftime("%Y-%m-%d"),
                 }                        
             items.append(item)
         except Exception as ex:
             logger.error("[ExportCouponRedeemFeed]: error fetching from db {0}".format(ex))
             total_failed = total_failed + 1
             self.feed_remark.fail_remarks(ex)
     logger.info("[ExportCouponRedeemFeed]: processed coupon")
     return items, item_batch, total_failed
    def postPartUPC(ObjectList, Credential):
        part_point_list = []
        feed_remark = FeedLogWithRemark(
            len(ObjectList.PartUPCData), feed_type="Part UPC Feed", action="Received", status=True
        )
        for part in ObjectList.PartUPCData:
            try:
                part_point_list.append({"part_number": part.PART_NUMBER, "UPC": part.PART_UPC})
            except Exception as ex:
                ex = "PartUPCService: {0}  Error on Validating {1}".format(part, ex)
                feed_remark.fail_remarks(ex)
                logger.error(ex)
        feed_remark = save_to_db(feed_type="part_upc", data_source=part_point_list, feed_remark=feed_remark)

        feed_remark.save_to_feed_log()
        return get_response(feed_remark)
    def postManufactureData(ObjectList, Credential):
        data_list = []
        feed_remark = FeedLogWithRemark(len(ObjectList.ManufactureData), feed_type='Manufacture data Feed', action='Received', status=True)

        for data_obj in ObjectList.ManufactureData:
            data_list.append({
                            'product_id' : data_obj.CHASSIS,
                            'material_number' : data_obj.MATNR,
                            'plant' : data_obj.WERKS,
                            'engine' : data_obj.ENGINE,
                            'vehicle_off_line_date' : data_obj.VODATE
                            })

        feed_remark = save_to_db(feed_type='manufacture_data', data_source=data_list, feed_remark=feed_remark)
        feed_remark.save_to_feed_log()
        return get_response(feed_remark)
    def postNSM(ObjectList, Credential):
        nsm_list = []
        feed_remark = FeedLogWithRemark(len(ObjectList.NSMData), feed_type="NSM Feed", action="Received", status=True)
        for nsm in ObjectList.NSMData:
            try:
                nsm_list.append(
                    {
                        "name": nsm.NAME,
                        "email": nsm.EMAIL,
                        "phone_number": utils.mobile_format(nsm.PHONE_NUMBER),
                        "territory": nsm.TERRITORY,
                    }
                )
            except Exception as ex:
                ex = "NSMService: {0}  Error on Validating {1}".format(nsm, ex)
                feed_remark.fail_remarks(ex)
                logger.error(ex)
        feed_remark = save_to_db(feed_type="nsm", data_source=nsm_list, feed_remark=feed_remark)

        feed_remark.save_to_feed_log()
        return get_response(feed_remark)
    def postCreditNote(ObjectList, Credential):
        feed_remark = FeedLogWithRemark(len(ObjectList.CreditNoteData),
                                        feed_type='Credit Note Feed',
                                        action='Received', status=True)
        cdms_feed_remark = FeedLogWithRemark(len(ObjectList.CreditNoteData),
                                        feed_type='CDMS Feed',
                                        action='Received', status=True)
        credit_note_list = []
        for credit_note in ObjectList.CreditNoteData:
            try:
                credit_note_list.append({
                    'vin': credit_note.CHASSIS,
                    'dealer': credit_note.GCP_KUNNR,
                    'actual_kms': credit_note.GCP_KMS,
                    'unique_service_coupon': credit_note.GCP_UCN_NO,
                    'service_type': credit_note.SERVICE_TYPE,
                    'actual_service_date': credit_note.SER_AVL_DT,
                    'received_date': credit_note.GCPDATA_RECV_DT,
                    'credit_note': credit_note.CREDIT_NOTE,
                    'credit_date': credit_note.CREDIT_DATE,
                    'cdms_doc_number': credit_note.CDMS_DOC_NO,
                    'cdms_date': credit_note.CDMS_DT
#                    'closed_date': credit_note.CLOSED_DATE
                })

            except Exception as ex:
                ex = "CreditNoteService: {0} Error on Validating {1}".format(credit_note, ex)
                feed_remark.fail_remarks(ex)
                logger.error(ex)
        if credit_note.CDMS_DOC_NO:
            feed_remark = save_to_db(
                                    feed_type='credit_note', data_source=credit_note_list,
                                        feed_remark=cdms_feed_remark)
        else:
            feed_remark = save_to_db(
            feed_type='credit_note', data_source=credit_note_list,
                                        feed_remark=feed_remark)
        feed_remark.save_to_feed_log()
        return get_response(feed_remark)
 def postASC(ObjectList, Credential):
     asc_list = []
     feed_remark = FeedLogWithRemark(len(ObjectList.ASCData),
                                     feed_type='ASC Feed',
                                     action='Received', status=True)
     for asc_element in ObjectList.ASCData:
         try:
             asc_list.append({
                 'asc_id': asc_element.ASC_ID,
                 'name': asc_element.ASC_NAME,
                 'phone_number': utils.mobile_format(asc_element.ASC_MOBILE),
                 'address': asc_element.ASC_ADDRESS,
                 'email': asc_element.ASC_EMAIL,
                 'dealer_id': asc_element.KUNNAR
             })
         except Exception as ex:
             ex = "ASCService: {0}  Error on Validating {1}".format(asc_element, ex)
             feed_remark.fail_remarks(ex)
             logger.error(ex)
     feed_remark = save_to_db(feed_type='ASC', data_source=asc_list,
                           feed_remark=feed_remark)
     feed_remark.save_to_feed_log()
     return get_response(feed_remark)    
 def postOldFsc(ObjectList, Credential):
     feed_remark = FeedLogWithRemark(len(ObjectList.OldFSCData.GT_OLD_FSC),
                                     feed_type='Old Fsc Feed',
                                     action='Received', status=True)
     old_fsc_list = []
     for fsc in ObjectList.OldFSCData.GT_OLD_FSC:
         try:
             old_fsc_list.append({
                 'vin': fsc.CHASSIS,
                 'dealer': fsc.KUNNAR,
                 'material_number': fsc.MATNR,
                 'charge': fsc.CHARG,
                 'service': fsc.SERVICE
             })
           
         except Exception as ex:
             ex = "OldFscUpdateService: {0}  Error on Validating {1}".format(fsc, ex)
             feed_remark.fail_remarks(ex)
             logger.error(ex)
     feed_remark = save_to_db(
         feed_type='old_fsc', data_source=old_fsc_list,
                                              feed_remark=feed_remark)
     feed_remark.save_to_feed_log()
     return get_response(feed_remark)
    def export(self, data=None):
        data_source = []
        message="some error occurred, please try again later."
        logger.info(
            "[ExportUnsyncProductFeed]: Export {1}: Items:{0}"\
            .format(data, self.feed_type))
        client = self.get_client()

        logger.info("[ExportUnsyncProductFeed]: sending product details: {0}"\
                    .format(data['vin']))
        
        result = client.service.SI_GCPONL_Sync(
                DT_ONL=[{"CHASSIS": data['vin'],"DEALER": data['current_user'].username}])
        try:
            logger.info("[ExportUnsyncProductFeed]: Response from SAP: {0}".format(result))
            
            if len(result)>1:
                return_code = result[1][0]['RETURN_CODE']
                ucn_count = len(result[0])
            else:
                return_code = result[0][0]['RETURN_CODE']
                ucn_count=0
            
            if return_code:
                vin_sync_feed = models.VinSyncFeedLog(product_id = data['vin'], dealer_asc_id=data['current_user'].username,
                                                      status_code=return_code, ucn_count=ucn_count)
                vin_sync_feed.save()
                if return_code.upper() == 'S':
                    message='The Chassis was found in the main database. Please try after sometime.'
                    for results in result[0]:
                        try:
                            valid_dict = {
                                     1 : {
                                          "valid_days": 365,
                                          "valid_kms": 2000
                                             },
                                     2 : {
                                          "valid_days": 730,
                                          "valid_kms": 8000,
                                             },
                                     3 : {
                                          "valid_days": 730,
                                          "valid_kms": 15000,
                                             }
                                    }
                            
                            results['DAYS_LIMIT_TO'] = valid_dict[int(results['SERV_TYP'])]['valid_days']
                            results['KMS_TO'] = valid_dict[int(results['SERV_TYP'])]['valid_kms']
                            data_source.append(utils.create_dispatch_feed_data(results))
                            feed_remark = FeedLogWithRemark(len(data_source),
                                            feed_type='VIN sync Feed',
                                            action='Sent', status=True)
                        except Exception as ex:
                            ex = "[ExportUnsyncProductFeed]: ProductDispatchService: {0}  Error on Validating {1}".format(result, ex)
                            feed_remark.fail_remarks(ex)
                            logger.error(ex)
                    feed_remark = save_to_db(feed_type='dispatch', data_source=data_source,
                                        feed_remark=feed_remark)
                    feed_remark.save_to_feed_log()
                    if feed_remark.failed_feeds > 0:
                        remarks = feed_remark.remarks.elements()
                        for remark in remarks:
                            feed_failure_log(brand=settings.BRAND, feed_type='VIN sync Feed', reason=remark)
                            logger.info('[ExportUnsyncProductFeed]: ' + json.dumps(feed_remark.remarks))
                        raise ValueError('dispatch feed failed!')
                        logger.info('[ExportUnsyncProductFeed]: dispatch feed completed')
                        
                else:
                    message='This Chassis is not available in Main database, please type the correct chassis number'
        except Exception as ex:
            logger.error("[ExportUnsyncProductFeed]: Failed to send the details to sap")
            logger.error(ex)
        return message
class ExportCouponRedeemFeed(BaseExportFeed):
    
    def export_data(self, start_date=None, end_date=None):
        results = models.CouponData.objects.filter(sent_to_sap=0,
                            status=2).select_related('product_id')
        items = []
        total_failed = 0
        item_batch = {
            'TIMESTAMP': datetime.now().strftime("%Y-%m-%dT%H:%M:%S")}
        self.feed_remark = FeedLogWithRemark(len(results), feed_type='Coupon Redemption Feed', action='Send', status=True)
        for redeem in results:
            try:
                #added the condition only for the previous coupons with no servicing dealer details
                if redeem.service_advisor:
                    if redeem.service_advisor.dealer:
                        servicing_dealer = redeem.service_advisor.dealer.dealer_id
                    else:
                        servicing_dealer = redeem.service_advisor.asc.asc_id
                else:
                    servicing_dealer = redeem.product.dealer_id.dealer_id
                
                item = {
                        "CHASSIS": redeem.product.product_id,
                        "GCP_KMS": redeem.actual_kms,
                        "GCP_KUNNR": servicing_dealer,
                        "GCP_UCN_NO": redeem.unique_service_coupon,
                        "PRODUCT_TYPE": redeem.product.sku_code,
                        "SERVICE_TYPE": str(redeem.service_type),
                        "SER_AVL_DT": redeem.actual_service_date.date().strftime("%Y-%m-%d"),
                    }                        
                items.append(item)
            except Exception as ex:
                logger.error("[ExportCouponRedeemFeed]: error fetching from db {0}".format(ex))
                total_failed = total_failed + 1
                self.feed_remark.fail_remarks(ex)
        logger.info("[ExportCouponRedeemFeed]: processed coupon")
        return items, item_batch, total_failed

    def export(self, brand, items=None, item_batch=None, total_failed_on_feed=0):
        logger.info(
            "[ExportCouponRedeemFeed]: Export {0}".format(self.feed_type))
        client = self.get_client()
        total_failed = total_failed_on_feed
        export_status = False
        for item in items:
            export_status = False
            logger.info("[ExportCouponRedeemFeed]: Sending coupon - {0}"\
                        .format(item))
            try:            
                result = client.service.MI_GCP_UCN_Sync(
                    ITEM=[item], ITEM_BATCH=item_batch)
                logger.info("[ExportCouponRedeemFeed]: Response from SAP: {0}".format(result))
                if result[1]['I_STATUS'] == 'SUCCESS':
                    try:
                        coupon = models.CouponData.objects.get(unique_service_coupon=item['GCP_UCN_NO'])
                        coupon.sent_to_sap = True
                        coupon.save()
                        export_status = True
                        logger.info("[ExportCouponRedeemFeed]: Sent coupon - {0}".format(item['GCP_UCN_NO']))
                    except Exception as ex:
                        total_failed = total_failed + 1
                        logger.error("[ExportCouponRedeemFeed]: Error:: {0} - {1}".format(item['GCP_UCN_NO'], ex))
                        self.feed_remark.fail_remarks(ex)
                else:
                    total_failed = total_failed + 1
                    logger.error("[ExportCouponRedeemFeed]: {0}:: Success not received from SAP".format(item['GCP_UCN_NO']))
            except Exception as ex:
                total_failed = total_failed + 1
                logger.error("[ExportCouponRedeemFeed]: Error:: {0} - {1}".format(item['GCP_UCN_NO'], ex))
                self.feed_remark.fail_remarks(ex)
        feed_log(brand, feed_type=self.feed_type, total_data_count=len(items)\
                 + total_failed_on_feed, failed_data_count=total_failed,\
                 success_data_count=len(items) + total_failed_on_feed - total_failed,\
                 action='Sent', status=export_status)