/**
* Odoo, Open Source Management Solution
* Copyright (C) 2012-today Odoo SA (<http:www.odoo.com>)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http:www.gnu.org/licenses/>
*
* Created on 9/1/15 10:34 AM
*/
package com.odoo.addons.calendar;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SwipeRefreshLayout;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.odoo.R;
import com.odoo.addons.calendar.models.CalendarEvent;
import com.odoo.addons.calendar.utils.CalendarUtils;
import com.odoo.addons.calendar.utils.TodayIcon;
import com.odoo.addons.crm.CRMDetail;
import com.odoo.addons.crm.CRMLeads;
import com.odoo.addons.crm.ConvertToQuotation;
import com.odoo.addons.crm.models.CRMLead;
import com.odoo.addons.phonecall.PhoneCallDetail;
import com.odoo.addons.phonecall.models.CRMPhoneCalls;
import com.odoo.addons.sale.models.SaleOrder;
import com.odoo.base.addons.res.ResCurrency;
import com.odoo.base.addons.res.ResPartner;
import com.odoo.libs.calendar.SysCal;
import com.odoo.libs.calendar.view.OdooCalendar;
import com.odoo.core.orm.ODataRow;
import com.odoo.core.orm.OValues;
import com.odoo.core.orm.fields.OColumn;
import com.odoo.core.support.addons.fragment.BaseFragment;
import com.odoo.core.support.addons.fragment.IOnSearchViewChangeListener;
import com.odoo.core.support.addons.fragment.ISyncStatusObserverListener;
import com.odoo.core.support.drawer.ODrawerItem;
import com.odoo.core.support.list.IOnItemClickListener;
import com.odoo.core.support.list.OCursorListAdapter;
import com.odoo.core.support.list.OListAdapter;
import com.odoo.core.support.sync.SyncUtils;
import com.odoo.core.utils.IntentUtils;
import com.odoo.core.utils.OControls;
import com.odoo.core.utils.OCursorUtils;
import com.odoo.core.utils.ODateUtils;
import com.odoo.core.utils.OResource;
import com.odoo.core.utils.StringUtils;
import com.odoo.core.utils.dialog.OChoiceDialog;
import com.odoo.core.utils.sys.IOnActivityResultListener;
import com.odoo.core.utils.sys.IOnBackPressListener;
import com.odoo.widgets.bottomsheet.BottomSheet;
import com.odoo.widgets.bottomsheet.BottomSheetListeners;
import com.odoo.widgets.snackbar.SnackBar;
import com.odoo.widgets.snackbar.SnackbarBuilder;
import com.odoo.widgets.snackbar.listeners.EventListener;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class CalendarDashboard extends BaseFragment implements View.OnClickListener,
BottomSheetListeners.OnSheetItemClickListener, IOnBackPressListener,
OdooCalendar.OdooCalendarDateSelectListener, LoaderManager.LoaderCallbacks<Cursor>,
OCursorListAdapter.OnViewBindListener, SwipeRefreshLayout.OnRefreshListener,
ISyncStatusObserverListener, BottomSheetListeners.OnSheetActionClickListener,
BottomSheetListeners.OnSheetMenuCreateListener, EventListener,
IOnSearchViewChangeListener, IOnItemClickListener, OCursorListAdapter.OnViewCreateListener,
AdapterView.OnItemSelectedListener, IOnActivityResultListener, OCursorListAdapter.BeforeBindUpdateData {
public static final String TAG = CalendarDashboard.class.getSimpleName();
public static final String KEY = "key_calendar_dashboard";
public static final String KEY_DATE = "key_date";
public static final int REQUEST_CONVERT_TO_QUOTATION_WIZARD = 229;
private BottomSheet mSheet = null;
private OdooCalendar odooCalendar;
private View calendarView = null;
private ListView dashboardListView;
private View mView;
private String mFilterDate;
private OCursorListAdapter mAdapter;
private boolean syncRequested = false;
private String mFilter = null;
private String wonLost = "won";
private CRMLead crmLead;
private ODataRow convertRequestRecord;
private Spinner navSpinner;
private OListAdapter navSpinnerAdapter;
private FilterType mFilterType = FilterType.All;
private enum SheetType {
Event, PhoneCall, Opportunity
}
private enum FilterType {
All(R.string.label_all), Meetings(R.string.label_meetings),
Opportunities(R.string.label_opportunity), PhoneCalls(R.string.label_phone_calls);
int str_id = 0;
FilterType(int type) {
str_id = type;
}
public String getString(Context context) {
return OResource.string(context, str_id);
}
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
setHasOptionsMenu(true);
return inflater.inflate(R.layout.calendar_dashboard, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mView = view;
setHasFloatingButton(view, R.id.fabButton, null, this);
parent().setOnBackPressListener(this);
parent().setHasActionBarSpinner(true);
parent().setOnActivityResultListener(this);
navSpinner = parent().getActionBarSpinner();
initActionSpinner();
odooCalendar = (OdooCalendar) view.findViewById(R.id.dashboard_calendar);
crmLead = new CRMLead(getActivity(), null);
odooCalendar.setOdooCalendarDateSelectListener(this);
}
private void initActionSpinner() {
List<Object> spinnerItems = new ArrayList<>();
ODataRow row = new ODataRow();
row.put("key", FilterType.All.toString());
row.put("name", FilterType.All.getString(getActivity()));
spinnerItems.add(row);
row = new ODataRow();
row.put("key", FilterType.Meetings.toString());
row.put("name", FilterType.Meetings.getString(getActivity()));
spinnerItems.add(row);
row = new ODataRow();
row.put("key", FilterType.Opportunities.toString());
row.put("name", FilterType.Opportunities.getString(getActivity()));
spinnerItems.add(row);
row = new ODataRow();
row.put("key", FilterType.PhoneCalls.toString());
row.put("name", FilterType.PhoneCalls.getString(getActivity()));
spinnerItems.add(row);
navSpinnerAdapter = new OListAdapter(getActivity(), R.layout.base_simple_list_item_1, spinnerItems) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getActivity()).inflate(R.layout.base_simple_list_item_1_selected
, parent, false);
}
return getSpinnerView(getItem(position), position, convertView, parent);
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getActivity()).inflate(getResource(), parent, false);
}
return getSpinnerView(getItem(position), position, convertView, parent);
}
};
navSpinner.setAdapter(navSpinnerAdapter);
navSpinner.setOnItemSelectedListener(this);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
ODataRow row = (ODataRow) navSpinnerAdapter.getItem(position);
mFilterType = FilterType.valueOf(row.getString("key"));
if (mFilterDate != null && getActivity() != null)
getLoaderManager().restartLoader(0, null, this);
}
private View getSpinnerView(Object row, int pos, View view, ViewGroup parent) {
ODataRow r = (ODataRow) row;
OControls.setText(view, android.R.id.text1, r.getString("name"));
return view;
}
@Override
public List<OdooCalendar.DateDataObject> weekDataInfo(
List<SysCal.DateInfo> week_dates) {
List<OdooCalendar.DateDataObject> items = new ArrayList<>();
CalendarEvent event = (CalendarEvent) db();
CRMPhoneCalls calls = new CRMPhoneCalls(getActivity(), event.getUser());
CRMLead lead = new CRMLead(getActivity(), event.getUser());
for (SysCal.DateInfo date : week_dates) {
String date_str = date.getDateString();
int total = 0;
switch (mFilterType) {
case All:
case Meetings:
// Checking for events
total += event.countGroupBy("date_start", "date(date_start)"
, "(date(date_start) <= ? and date(date_end) >= ? )",
new String[]{date_str, date_str}).getInt("total");
if (mFilterType != FilterType.All)
break;
case PhoneCalls:
// Checking for phone calls
total += calls.countGroupBy("date", "date(date)",
"date(date) >= ? and date(date) <= ? and (state = ? or state = ?)",
new String[]{date_str, date_str, "open", "pending"})
.getInt("total");
if (mFilterType != FilterType.All)
break;
case Opportunities:
// Leads
total += lead.countGroupBy("date_deadline", "date(date_deadline)",
"(date(date_deadline) >= ? and date(date_deadline) <= ? or " +
"date(date_action) >= ? and date(date_action) <= ?) and type = ?",
new String[]{date_str, date_str, date_str, date_str, "opportunity"}).getInt("total");
if (mFilterType != FilterType.All)
break;
}
items.add(new OdooCalendar.DateDataObject(date_str, (total > 0)));
}
return items;
}
@Override
public View getEventsView(ViewGroup parent, SysCal.DateInfo date) {
calendarView = LayoutInflater.from(getActivity()).inflate(
R.layout.calendar_dashboard_items, parent, false);
calendarView.findViewById(R.id.dashboard_no_item_view)
.setOnClickListener(this);
dashboardListView = (ListView) calendarView
.findViewById(R.id.items_container);
setHasFloatingButton(mView, R.id.fabButton, dashboardListView, this);
initAdapter();
mFilterDate = date.getDateString();
if (getActivity() != null) {
getLoaderManager().restartLoader(0, null, CalendarDashboard.this);
}
return calendarView;
}
private void initAdapter() {
mAdapter = new OCursorListAdapter(getActivity(), null,
R.layout.calendar_dashboard_item_view);
mAdapter.setBeforeBindUpdateData(this);
mAdapter.setOnViewBindListener(this);
mAdapter.setOnViewCreateListener(this);
dashboardListView.setAdapter(mAdapter);
mAdapter.changeCursor(null);
mAdapter.handleItemClickListener(dashboardListView, this);
setHasSyncStatusObserver(KEY, this, db());
}
@Override
public void onItemDoubleClick(View view, int position) {
ODataRow row = OCursorUtils.toDatarow((Cursor) mAdapter.getItem(position));
String type = row.getString("data_type");
Class<?> cls = EventDetail.class;
if (type.equals("phone_call")) {
cls = PhoneCallDetail.class;
}
if (type.equals("opportunity")) {
cls = CRMDetail.class;
}
IntentUtils.startActivity(getActivity(), cls, row.getPrimaryBundleData());
}
@Override
public void onItemClick(View view, int position) {
Cursor cr = (Cursor) mAdapter.getItem(position);
String data_type = cr.getString(cr.getColumnIndex("data_type"));
if (data_type.equals("event")) {
showSheet(SheetType.Event, cr);
}
if (data_type.equals("phone_call")) {
showSheet(SheetType.PhoneCall, cr);
}
if (data_type.equals("opportunity")) {
showSheet(SheetType.Opportunity, cr);
}
}
private void showSheet(SheetType type, Cursor data) {
if (mSheet != null) {
mSheet.dismiss();
}
BottomSheet.Builder builder = new BottomSheet.Builder(getActivity());
builder.listener(this);
builder.setIconColor(_c(R.color.body_text_2));
builder.setTextColor(_c(R.color.body_text_1));
builder.setData(data);
builder.actionListener(this);
builder.setActionIcon(R.drawable.ic_action_edit);
builder.title(data.getString(data.getColumnIndex("name")));
builder.setOnSheetMenuCreateListener(this);
switch (type) {
case Event:
builder.setOnSheetMenuCreateListener(this);
builder.menu(R.menu.menu_dashboard_events);
break;
case PhoneCall:
builder.menu(R.menu.menu_dashboard_phonecalls);
break;
case Opportunity:
builder.menu(R.menu.menu_dashboard_opportunity);
break;
}
mSheet = builder.create();
mSheet.show();
}
@Override
public void onSheetActionClick(BottomSheet sheet, final Object extras) {
sheet.dismiss();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Cursor cr = (Cursor) extras;
String data_type = cr.getString(cr.getColumnIndex("data_type"));
int record_id = cr.getInt(cr.getColumnIndex(OColumn.ROW_ID));
if (data_type.equals("phone_call")) {
Bundle extra = new Bundle();
extra.putInt(OColumn.ROW_ID, record_id);
IntentUtils.startActivity(getActivity(), PhoneCallDetail.class, extra);
}
if (data_type.equals("event")) {
Bundle extra = new Bundle();
extra.putInt(OColumn.ROW_ID, record_id);
IntentUtils.startActivity(getActivity(), EventDetail.class, extra);
}
if (data_type.equals("opportunity")) {
Bundle bundle = new Bundle();
bundle.putInt(OColumn.ROW_ID, record_id);
IntentUtils.startActivity(getActivity(), CRMDetail.class, bundle);
}
}
}, 250);
}
@Override
public void onSheetMenuCreate(Menu menu, Object extras) {
Cursor cr = (Cursor) extras;
String type = cr.getString(cr.getColumnIndex("data_type"));
String is_done = cr.getString(cr.getColumnIndex("is_done"));
if (type.equals("event")) {
ODataRow row = OCursorUtils.toDatarow(cr);
if (row.getString("location").equals("false")) {
menu.findItem(R.id.menu_events_location).setVisible(false);
}
if (is_done.equals("1")) {
menu.findItem(R.id.menu_events_all_done).setVisible(false);
}
}
}
@Override
public View onViewCreated(Context context, ViewGroup view, Cursor cr, int position) {
String data_type = cr.getString(cr.getColumnIndex("data_type"));
if (data_type.equals("separator")) {
return LayoutInflater.from(getActivity()).inflate(
R.layout.calendar_dashboard_item_separator, view, false);
}
return LayoutInflater.from(getActivity()).inflate(
R.layout.calendar_dashboard_item_view, view, false);
}
@Override
public ODataRow updateDataRow(Cursor cr) {
ODataRow row = OCursorUtils.toDatarow(cr);
String type = row.getString("data_type");
ODataRow record = new ODataRow();
if (type.equals("opportunity")) {
record.put("stage_id",
crmLead.browse(new String[]{"stage_id"}, row.getInt(OColumn.ROW_ID)).get("stage_id"));
}
return record;
}
@Override
public void onViewBind(View view, Cursor cursor, ODataRow row) {
String type = row.getString("data_type");
GradientDrawable shape = (GradientDrawable) getActivity().getResources()
.getDrawable(R.drawable.circle_mask_secondary);
int icon = -1;
ImageView iconView = (ImageView) view.findViewById(R.id.event_icon);
if (type.equals("separator")) {
OControls.setText(view, R.id.list_separator, row.getString("name"));
} else {
String colorCode = CalendarUtils.getColorData(row.getInt("color_index")).
getString("code");
shape.setColor(Color.parseColor(colorCode));
String date = "false";
String desc = null;
if (row.getString("description").equals("false")) {
row.put("description", "");
}
if (type.equals("event")) {
desc = row.getString("description");
icon = R.drawable.ic_action_event;
if (row.getString("allday").equals("false")) {
date = row.getString("date_start");
view.findViewById(R.id.allDay).setVisibility(View.GONE);
} else {
TextView allDayTag = (TextView) view.findViewById(R.id.allDay);
allDayTag.setTextColor(Color.parseColor(colorCode));
allDayTag.setVisibility(View.VISIBLE);
}
}
if (type.equals("phone_call")) {
icon = R.drawable.ic_action_phone;
date = row.getString("date");
desc = row.getString("description");
}
if (type.equals("opportunity")) {
icon = R.drawable.ic_action_opportunities;
ODataRow stage_id = row.getM2ORecord("stage_id").browse();
float probability = -1;
if (stage_id != null && !stage_id.getString("probability").equals("false")
&& (stage_id.getString("type").equals("opportunity") ||
stage_id.getString("type").equals("both"))) {
if (!stage_id.getString("name").equals("New"))
probability = stage_id.getFloat("probability");
}
if (probability == 0) {
// Lost
icon = R.drawable.ic_action_mark_lost;
} else if (probability >= 100) {
// Won
icon = R.drawable.ic_action_mark_won;
}
desc = row.getString("planned_revenue") + " "
+ ResCurrency.getSymbol(getActivity(), row.getInt("company_currency")) +
" at " + row.getString("probability") + " %";
if (!row.getString("title_action").equals("false")) {
desc += "\n" + row.getString("title_action");
}
OControls.setText(view, R.id.event_description, desc);
}
if (!date.equals("false")) {
Date dateNow = new Date();
Date eventDate = ODateUtils.createDateObject(date, ODateUtils.DEFAULT_FORMAT, false);
date = ODateUtils.convertToDefault(date, ODateUtils.DEFAULT_FORMAT, "hh:mm a");
OControls.setText(view, R.id.event_time, date);
if (dateNow.after(eventDate) && !row.getBoolean("is_done")) {
colorCode = "#cc0000";
}
}
OControls.setText(view, R.id.event_description, desc);
Boolean is_done = row.getString("is_done").equals("1");
OControls.setImage(view, R.id.event_icon, icon);
iconView.setBackgroundDrawable(shape);
int title_color = (is_done) ? Color.LTGRAY : Color.parseColor("#414141");
int time_color = (is_done) ? Color.LTGRAY : Color.parseColor(colorCode);
int desc_color = (is_done) ? Color.LTGRAY : _c(R.color.body_text_2);
int allDay_color = (is_done) ? Color.LTGRAY : Color.parseColor(colorCode);
OControls.setTextColor(view, R.id.event_name, title_color);
OControls.setTextColor(view, R.id.event_time, time_color);
OControls.setTextColor(view, R.id.event_description, desc_color);
OControls.setTextColor(view, R.id.allDay, allDay_color);
if (is_done) {
view.findViewById(R.id.event_icon).setBackgroundResource(
R.drawable.circle_mask_gray);
OControls.setTextViewStrikeThrough(view, R.id.event_name);
OControls.setTextViewStrikeThrough(view, R.id.event_time);
OControls.setTextViewStrikeThrough(view, R.id.event_description);
OControls.setTextViewStrikeThrough(view, R.id.allDay);
}
OControls.setText(view, R.id.event_name, row.getString("name"));
}
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle data) {
List<String> args = new ArrayList<>();
String where = "";
args.add(mFilterDate);
CalendarEvent event = (CalendarEvent) db();
Uri uri = event.agendaUri();
switch (mFilterType) {
case PhoneCalls:
CRMPhoneCalls phoneCalls = new CRMPhoneCalls(getActivity(), db().getUser());
uri = phoneCalls.uri();
where = "date(date) >= ? and date(date) <= ? and (state = ? or state = ?)";
args.add(mFilterDate);
args.add("open");
args.add("pending");
if (mFilter != null) {
where += " and (name like ? or description like ?)";
args.add("%" + mFilter + "%");
}
break;
case Opportunities:
CRMLead leads = new CRMLead(getActivity(), db().getUser());
uri = leads.uri();
where = "(date(date_deadline) >= ? and date(date_deadline) <= ? or " +
"date(date_action) >= ? and date(date_action) <= ?) and type = ?";
args.add(mFilterDate);
args.add(mFilterDate);
args.add(mFilterDate);
args.add("opportunity");
if (mFilter != null) {
where += " and (name like ? or description like ?)";
args.add("%" + mFilter + "%");
}
break;
case Meetings:
uri = db().uri();
where = "(date(date_start) <= ? and date(date_end) >= ? )";
args.add(mFilterDate);
if (mFilter != null) {
where += " and name like ?";
}
break;
}
if (mFilter != null) {
args.add("%" + mFilter + "%");
}
return new CursorLoader(getActivity(), uri,
null, where, args.toArray(new String[args.size()]), null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, final Cursor cr) {
mAdapter.changeCursor(cr);
if (cr != null) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (cr.getCount() > 0) {
OControls.setGone(calendarView, R.id.dashboard_progress);
OControls.setVisible(calendarView, R.id.items_container);
OControls.setGone(calendarView, R.id.dashboard_no_items);
setHasSwipeRefreshView(calendarView, R.id.swipe_container,
CalendarDashboard.this);
} else {
setHasSwipeRefreshView(calendarView,
R.id.dashboard_no_items, CalendarDashboard.this);
OControls.setGone(calendarView, R.id.dashboard_progress);
OControls.setVisible(calendarView, R.id.dashboard_no_items);
}
}
}, 300);
}
if (db().isEmptyTable() && !syncRequested) {
syncRequested = true;
parent().sync().requestSync(CalendarEvent.AUTHORITY);
setSwipeRefreshing(true);
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.changeCursor(null);
}
@Override
public List<ODrawerItem> drawerMenus(Context context) {
List<ODrawerItem> menu = new ArrayList<>();
menu.add(new ODrawerItem(KEY).setTitle("Calendar")
.setInstance(new CalendarDashboard())
.setIcon(R.drawable.ic_action_dashboard));
return menu;
}
@Override
public Class<CalendarEvent> database() {
return CalendarEvent.class;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.fabButton:
case R.id.dashboard_no_item_view:
createEvent();
break;
}
}
@Override
public void onItemClick(BottomSheet sheet, MenuItem menu, Object extras) {
dismissSheet(sheet);
actionEvent(menu, (Cursor) extras);
}
private void actionEvent(MenuItem menu, Cursor cr) {
String is_done = cr.getString(cr.getColumnIndex("is_done"));
final OValues values = new OValues();
values.put("_is_dirty", "false"); // to ignore update on server
final int row_id = cr.getInt(cr.getColumnIndex(OColumn.ROW_ID));
values.put("is_done", (is_done.equals("0")) ? 1 : 0);
String done_label = (is_done.equals("0")) ? "done" : "undone";
final ODataRow row = OCursorUtils.toDatarow(cr);
convertRequestRecord = row;
Bundle data = row.getPrimaryBundleData();
switch (menu.getItemId()) {
// Event menus
case R.id.menu_events_location:
String location = cr.getString(cr.getColumnIndex("location"));
if (location.equals("false")) {
Toast.makeText(getActivity(), _s(R.string.label_no_location_found),
Toast.LENGTH_LONG).show();
} else {
IntentUtils.redirectToMap(getActivity(), location);
}
break;
case R.id.menu_events_reschedule:
IntentUtils.startActivity(getActivity(), EventDetail.class, data);
break;
// Opportunity menus
case R.id.menu_opp_customer_location:
String address = cr.getString(cr.getColumnIndex("street")) + " ";
address += cr.getString(cr.getColumnIndex("street2")) + " ";
address += cr.getString(cr.getColumnIndex("city")) + " ";
address += cr.getString(cr.getColumnIndex("zip"));
address = address.replaceAll("false", "");
if (TextUtils.isEmpty(address.trim())) {
Toast.makeText(getActivity(), _s(R.string.label_no_location_found),
Toast.LENGTH_LONG).show();
} else {
IntentUtils.redirectToMap(getActivity(), address);
}
break;
case R.id.menu_opp_call_customer:
case R.id.menu_phonecall_call:
int partner_id = cr.getInt(cr.getColumnIndex("partner_id"));
if (partner_id != 0) {
String contact = ResPartner.getContact(getActivity(), partner_id);
if (contact != null && !contact.equals("false")) {
IntentUtils.requestCall(getActivity(), contact);
} else {
Toast.makeText(getActivity(), _s(R.string.label_no_contact_found),
Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(getActivity(), _s(R.string.label_no_contact_found),
Toast.LENGTH_LONG).show();
}
break;
case R.id.menu_opp_lost:
if (inNetwork()) {
wonLost = "lost";
crmLead.markWonLost(wonLost, row, markDoneListener);
} else {
Toast.makeText(getActivity(), _s(R.string.toast_network_required),
Toast.LENGTH_LONG).show();
}
break;
case R.id.menu_opp_won:
if (inNetwork()) {
wonLost = "won";
crmLead.markWonLost(wonLost, row, markDoneListener);
} else {
Toast.makeText(getActivity(), _s(R.string.toast_network_required),
Toast.LENGTH_LONG).show();
}
break;
case R.id.menu_opp_reschedule:
List<String> choices = new ArrayList<>();
choices.add(OResource.string(getActivity(), R.string.label_opt_schedule_log_call));
choices.add(OResource.string(getActivity(), R.string.label_opt_schedule_meeting));
OChoiceDialog.get(getActivity()).withOptions(choices, -1)
.show(new OChoiceDialog.OnChoiceSelectListener() {
@Override
public void choiceSelected(int position, String value) {
int opp_id = row.getInt(OColumn.ROW_ID);
switch (position) {
case 0:
Bundle extra = new Bundle();
extra.putInt("opp_id", opp_id);
IntentUtils.startActivity(getActivity(), PhoneCallDetail.class, extra);
break;
case 1: // Schedule meeting
Bundle data = new Bundle();
data.putString(KEY_DATE, mFilterDate);
data.putInt("opp_id", opp_id);
IntentUtils.startActivity(getActivity(), EventDetail.class, data);
break;
}
}
});
break;
case R.id.menu_phonecall_reschedule:
choices = new ArrayList<>();
choices.add("Re-Schedule call");
choices.add("Schedule other call");
OChoiceDialog.get(getActivity()).withOptions(choices, -1)
.show(new OChoiceDialog.OnChoiceSelectListener() {
@Override
public void choiceSelected(int position, String value) {
switch (position) {
case 0: // Re-Schedule
IntentUtils.startActivity(getActivity(), PhoneCallDetail.class,
row.getPrimaryBundleData());
break;
case 1: // Schedule other call
Bundle extra = row.getPrimaryBundleData();
extra.putInt("call_id", row.getInt(OColumn.ROW_ID));
IntentUtils.startActivity(getActivity(), PhoneCallDetail.class,
extra);
break;
}
}
});
break;
// All done menu
case R.id.menu_phonecall_all_done:
final CRMPhoneCalls phone_call = new CRMPhoneCalls(getActivity(), null);
values.put("state", "done");
phone_call.update(row_id, values);
getLoaderManager().restartLoader(0, null, this);
SnackBar.get(getActivity()).text(_s(R.string.toast_phone_call_marked_done) + " " + done_label)
.duration(SnackbarBuilder.SnackbarDuration.LENGTH_LONG)
.withEventListener(this).show();
break;
case R.id.menu_events_all_done:
db().update(row_id, values);
getLoaderManager().restartLoader(0, null, this);
SnackBar.get(getActivity()).text(_s(R.string.label_event_marked) + " " + done_label)
.duration(SnackbarBuilder.SnackbarDuration.LENGTH_LONG)
.withEventListener(this).show();
break;
case R.id.menu_lead_convert_to_quotation:
if (inNetwork()) {
Intent intent = new Intent(getActivity(), ConvertToQuotation.class);
intent.putExtras(row.getPrimaryBundleData());
parent().startActivityForResult(intent, REQUEST_CONVERT_TO_QUOTATION_WIZARD);
} else {
Toast.makeText(getActivity(), R.string.toast_network_required,
Toast.LENGTH_LONG).show();
}
break;
}
}
CRMLead.OnOperationSuccessListener markDoneListener = new CRMLead.OnOperationSuccessListener() {
@Override
public void OnSuccess() {
Toast.makeText(getActivity(), StringUtils.capitalizeString(convertRequestRecord.getString("type"))
+ " " + _s(R.string.toast_marked) + " " + wonLost, Toast.LENGTH_LONG).show();
}
@Override
public void OnCancelled() {
}
};
private void dismissSheet(final BottomSheet sheet) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
sheet.dismiss();
}
}, 100);
}
@Override
public boolean onBackPressed() {
if (mSheet != null && mSheet.isShowing()) {
mSheet.dismiss();
return false;
}
return true;
}
@Override
public void onRefresh() {
if (inNetwork()) {
parent().sync().requestSync(CalendarEvent.AUTHORITY);
// Syncing phone calls and sales order
SyncUtils.get(getActivity(), db().getUser()).requestSync(CRMPhoneCalls.AUTHORITY);
// Syncing only Opportunity from agenda
Bundle syncData = new Bundle();
syncData.putBoolean(CRMLeads.KEY_IS_LEAD, false);
SyncUtils.get(getActivity(), db().getUser()).requestSync(CRMLead.AUTHORITY, syncData);
setSwipeRefreshing(true);
} else {
hideRefreshingProgress();
Toast.makeText(getActivity(),
_s(R.string.toast_network_required), Toast.LENGTH_LONG).show();
}
}
@Override
public void onStatusChange(Boolean refreshing) {
getLoaderManager().restartLoader(0, null, this);
setSwipeRefreshing(refreshing);
}
@Override
public void onShow(int height) {
hideFab();
}
@Override
public void onDismiss(int height) {
showFab();
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.menu_calendar_dashboard, menu);
if (getActivity() != null) {
MenuItem today = menu.findItem(R.id.menu_dashboard_goto_today);
today.setIcon(TodayIcon.get(getActivity()).getIcon());
}
setHasSearchView(this, menu, R.id.menu_search);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_dashboard_goto_today:
odooCalendar.goToToday();
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onSearchViewTextChange(String newFilter) {
mFilter = newFilter;
getLoaderManager().restartLoader(0, null, this);
return true;
}
@Override
public void onSearchViewClose() {
// Nothing to do
}
private void createEvent() {
Bundle data = new Bundle();
data.putString(KEY_DATE, mFilterDate);
IntentUtils.startActivity(getActivity(), EventDetail.class, data);
}
@Override
public void onOdooActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CONVERT_TO_QUOTATION_WIZARD &&
resultCode == Activity.RESULT_OK) {
crmLead.createQuotation(convertRequestRecord, data.getStringExtra("partner_id"),
data.getBooleanExtra("mark_won", false), createQuotationListener);
}
}
CRMLead.OnOperationSuccessListener createQuotationListener = new CRMLead.
OnOperationSuccessListener() {
@Override
public void OnSuccess() {
Toast.makeText(getActivity(), _s(R.string.label_quotation_created) + " " +
convertRequestRecord.getString("name"), Toast.LENGTH_LONG).show();
parent().sync().requestSync(SaleOrder.AUTHORITY);
}
@Override
public void OnCancelled() {
}
};
}