def process_deals(user: Operator): params = { 'filter': {DEAL_FLORIST_NEW_ALIAS: user.bitrix_user_id, DEAL_STAGE_ALIAS: DEAL_FLORIST_STATUS_ID}, 'select': [DEAL_ID_ALIAS, DEAL_SUPPLY_METHOD_ALIAS, DEAL_ORDER_ALIAS, DEAL_ORDER_COMMENT_ALIAS, DEAL_POSTCARD_TEXT_ALIAS, DEAL_TOTAL_SUM_ALIAS, DEAL_DATE_ALIAS, DEAL_TIME_ALIAS, DEAL_ORDER_RESERVE_ALIAS, DEAL_ORDER_RESERVE_DESC_ALIAS, DEAL_HAS_POSTCARD_ALIAS] } deals = BW.send_request('crm.deal.list', params, handle_next=True) for d in deals: deal = DealData() deal.deal_id = Utils.prepare_external_field(d, DEAL_ID_ALIAS) deal.supply_type = Utils.prepare_deal_supply_method(d, DEAL_SUPPLY_METHOD_ALIAS) deal.order = Utils.prepare_external_field(d, DEAL_ORDER_ALIAS) deal.order_comment = Utils.prepare_external_field(d, DEAL_ORDER_COMMENT_ALIAS) has_postcard = Utils.prepare_external_field(d, DEAL_HAS_POSTCARD_ALIAS) if has_postcard == DEAL_HAS_POSTCARD_YES: deal.has_postcard = True deal.postcard_text = Utils.prepare_external_field(d, DEAL_POSTCARD_TEXT_ALIAS) deal.sum = Utils.prepare_external_field(d, DEAL_TOTAL_SUM_ALIAS) deal.date = Utils.prepare_deal_date(d, DEAL_DATE_ALIAS) deal.time = Utils.prepare_deal_time(d, DEAL_TIME_ALIAS) deal.order_reserve = [el['downloadUrl'] for el in d.get(DEAL_ORDER_RESERVE_ALIAS)] # only links list for now deal.reserve_desc = Utils.prepare_external_field(d, DEAL_ORDER_RESERVE_DESC_ALIAS) user.florist_order.add_deal(deal)
def stat_unprocessed(): # TODO: move to batch queries to prevent overload sleep_interval = 1 with BW.FESTIVE_DATES_LOCK: params = { 'select': ['ID'], 'filter': { BFA.FESTIVE_APPROVEMENT_ALIAS: BFM.FESTIVE_APPROVEMENT_NOT_SELECTED, BFA.DEAL_DATE_ALIAS: BW.FESTIVE_DATES } } unprocessed = BW.send_request('crm.deal.list', params, obtain_total=True) subdivs = {} with BW.SUBDIVISIONS_LOCK, BW.FESTIVE_DATES_LOCK: for s_id, s_name in BW.SUBDIVISIONS.items(): params = { 'select': ['ID'], 'filter': { BFA.FESTIVE_APPROVEMENT_ALIAS: BFM.FESTIVE_APPROVEMENT_NO, BFA.DEAL_DATE_ALIAS: BW.FESTIVE_DATES, BFA.DEAL_SUBDIVISION_ALIAS: s_id } } declined = BW.send_request('crm.deal.list', params, obtain_total=True) if declined: subdivs[s_name] = declined time.sleep(sleep_interval) return unprocessed, subdivs
def process_deals(user): user.data.clear_deals() deals_type = user.data.deals_type stages = None dt = None is_late = None if deals_type == DealsType.DELIVERS_TODAY: stages = [BFM.DEAL_IS_IN_DELIVERY_STATUS_ID] dt = datetime.now(tz=cfg.TIMEZONE).strftime('%Y-%m-%d') elif deals_type == DealsType.DELIVERS_TOMORROW: stages = [BFM.DEAL_IS_IN_DELIVERY_STATUS_ID] dt = (datetime.now(tz=cfg.TIMEZONE) + timedelta(days=1)).strftime('%Y-%m-%d') elif deals_type == DealsType.IN_ADVANCE: stages = [ BFM.DEAL_NEW_STATUS_ID, BFM.DEAL_IN_PROCESS_STATUS_ID, BFM.DEAL_PAID_PREPAID_STATUS_ID, BFM.DEAL_PROCESSED_WAITING_FOR_SUPPLY_STATUS_ID, BFM.DEAL_PROCESSED_ON_HOLD_STATUS_ID, BFM.DEAL_PRINTED_STATUS_ID, BFM.DEAL_FLORIST_STATUS_ID, BFM.DEAL_PROCESSED_1C_STATUS_ID, BFM.DEAL_IS_EQUIPPED_STATUS_ID, BFM.DEAL_UNAPPROVED_STATUS_ID, BFM.DEAL_APPROVED_STATUS_ID ] elif deals_type == DealsType.FINISHED_IN_TIME: stages = [BFM.DEAL_SUCCESSFUL_STATUS_ID, BFM.DEAL_LOSE_STATUS_ID] dt = user.data.deals_date.isoformat() is_late = False elif deals_type == DealsType.FINISHED_LATE: stages = [BFM.DEAL_SUCCESSFUL_STATUS_ID, BFM.DEAL_LOSE_STATUS_ID] dt = user.data.deals_date.isoformat() is_late = True flt = { DEAL_COURIER_NEW_ALIAS: user.bitrix_user_id, DEAL_STAGE_ALIAS: stages } if dt: flt[DEAL_DATE_ALIAS] = dt if is_late is not None: flt[DEAL_IS_LATE_ALIAS] = BFM.DEAL_IS_LATE_YES if is_late else BFM.DEAL_IS_LATE_NO params = { 'filter': flt, 'select': [ DEAL_ID_ALIAS, DEAL_DATE_ALIAS, DEAL_TIME_ALIAS, DEAL_ADDRESS_ALIAS, DEAL_FLAT_ALIAS, DEAL_RECIPIENT_NAME_ALIAS, DEAL_RECIPIENT_PHONE_ALIAS, DEAL_DISTRICT_ALIAS, DEAL_DELIVERY_COMMENT_ALIAS, DEAL_INCOGNITO_ALIAS, DEAL_TERMINAL_CHANGE_ALIAS, DEAL_CHANGE_SUM_ALIAS, DEAL_TO_PAY_ALIAS, DEAL_BIG_PHOTO_ALIAS, DEAL_SUBDIVISION_ALIAS, DEAL_SENDER_ID_ALIAS, DEAL_SOURCE_ID_ALIAS, DEAL_ORDER_ALIAS, DEAL_CONTACT_ALIAS ], 'order': { DEAL_TIME_ALIAS: 'ASC' } } deals = BW.send_request('crm.deal.list', params, handle_next=True) for d in deals: deal = DealData() deal.deal_id = Utils.prepare_external_field(d, DEAL_ID_ALIAS) deal.date = Utils.prepare_deal_date(d, DEAL_DATE_ALIAS) deal.time = Utils.prepare_deal_time(d, DEAL_TIME_ALIAS) address, location = Utils.prepare_deal_address(d, DEAL_ADDRESS_ALIAS) deal.address = address deal.flat = Utils.prepare_external_field(d, DEAL_FLAT_ALIAS) deal.recipient_name = Utils.prepare_external_field( d, DEAL_RECIPIENT_NAME_ALIAS) deal.recipient_phone = Utils.prepare_external_field( d, DEAL_RECIPIENT_PHONE_ALIAS) district_id = Utils.prepare_external_field(d, DEAL_DISTRICT_ALIAS) deal.district = Utils.prepare_external_field(BW.DISTRICTS, district_id, BW.DISTRICTS_LOCK) deal.delivery_comment = Utils.prepare_external_field( d, DEAL_DELIVERY_COMMENT_ALIAS) deal.incognito = Utils.prepare_deal_incognito_bot_view( d, DEAL_INCOGNITO_ALIAS) terminal_change = Utils.prepare_external_field( d, DEAL_TERMINAL_CHANGE_ALIAS) if terminal_change == BFM.DEAL_NEED_TERMINAL: deal.terminal_needed = True elif terminal_change == BFM.DEAL_NEED_CHANGE: deal.change_sum = Utils.prepare_external_field( d, DEAL_CHANGE_SUM_ALIAS) to_pay = Utils.prepare_external_field(d, DEAL_TO_PAY_ALIAS) if to_pay != '0': deal.to_pay = to_pay # only URLs for now deal.order_big_photos = [ el['downloadUrl'] for el in d.get(DEAL_BIG_PHOTO_ALIAS) ] subdivision_id = Utils.prepare_external_field(d, DEAL_SUBDIVISION_ALIAS) deal.subdivision = Utils.prepare_external_field( BW.SUBDIVISIONS, subdivision_id, BW.SUBDIVISIONS_LOCK) sender_id = Utils.prepare_external_field(d, DEAL_SENDER_ID_ALIAS) deal.sender = Utils.prepare_str(BW.get_user_name(sender_id)) source_id = Utils.prepare_external_field(d, DEAL_SOURCE_ID_ALIAS) deal.source = Utils.prepare_external_field(BW.SOURCES, source_id, BW.SOURCES_LOCK) deal.order = Utils.prepare_external_field(d, DEAL_ORDER_ALIAS) contact_id = Utils.prepare_external_field(d, DEAL_CONTACT_ALIAS) contact_data = BW.get_contact_data(contact_id) deal.contact_phone = contact_data.get(CONTACT_PHONE_ALIAS) user.data.add_deal(deal)