package com.refresh.pos.ui.sale; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Map; import android.app.DatePickerDialog; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.DatePicker; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Spinner; import android.widget.TextView; import com.refresh.pos.R; import com.refresh.pos.domain.DateTimeStrategy; import com.refresh.pos.domain.sale.Sale; import com.refresh.pos.domain.sale.SaleLedger; import com.refresh.pos.techicalservices.NoDaoSetException; import com.refresh.pos.ui.component.UpdatableFragment; /** * UI for showing sale's record. * @author Refresh Team * */ public class ReportFragment extends UpdatableFragment { private SaleLedger saleLedger; List<Map<String, String>> saleList; private ListView saleLedgerListView; private TextView totalBox; private Spinner spinner; private Button previousButton; private Button nextButton; private TextView currentBox; private Calendar currentTime; private DatePickerDialog datePicker; public static final int DAILY = 0; public static final int WEEKLY = 1; public static final int MONTHLY = 2; public static final int YEARLY = 3; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { try { saleLedger = SaleLedger.getInstance(); } catch (NoDaoSetException e) { e.printStackTrace(); } View view = inflater.inflate(R.layout.layout_report, container, false); previousButton = (Button) view.findViewById(R.id.previousButton); nextButton = (Button) view.findViewById(R.id.nextButton); currentBox = (TextView) view.findViewById(R.id.currentBox); saleLedgerListView = (ListView) view.findViewById(R.id.saleListView); totalBox = (TextView) view.findViewById(R.id.totalBox); spinner = (Spinner) view.findViewById(R.id.spinner1); initUI(); return view; } /** * Initiate this UI. */ private void initUI() { currentTime = Calendar.getInstance(); datePicker = new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int y, int m, int d) { currentTime.set(Calendar.YEAR, y); currentTime.set(Calendar.MONTH, m); currentTime.set(Calendar.DAY_OF_MONTH, d); update(); } }, currentTime.get(Calendar.YEAR), currentTime.get(Calendar.MONTH), currentTime.get(Calendar.DAY_OF_MONTH)); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity().getBaseContext(), R.array.period, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); spinner.setSelection(0); spinner.setOnItemSelectedListener(new OnItemSelectedListener(){ @Override public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { update(); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); currentBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { datePicker.show(); } }); previousButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { addDate(-1); } }); nextButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { addDate(1); } }); saleLedgerListView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> myAdapter, View myView, int position, long mylng) { String id = saleList.get(position).get("id").toString(); Intent newActivity = new Intent(getActivity().getBaseContext(), SaleDetailActivity.class); newActivity.putExtra("id", id); startActivity(newActivity); } }); } /** * Show list. * @param list */ private void showList(List<Sale> list) { saleList = new ArrayList<Map<String, String>>(); for (Sale sale : list) { saleList.add(sale.toMap()); } SimpleAdapter sAdap = new SimpleAdapter(getActivity().getBaseContext() , saleList, R.layout.listview_report, new String[] { "id", "startTime", "total"}, new int[] { R.id.sid, R.id.startTime , R.id.total}); saleLedgerListView.setAdapter(sAdap); } @Override public void update() { int period = spinner.getSelectedItemPosition(); List<Sale> list = null; Calendar cTime = (Calendar) currentTime.clone(); Calendar eTime = (Calendar) currentTime.clone(); if(period == DAILY){ currentBox.setText(" [" + DateTimeStrategy.getSQLDateFormat(currentTime) + "] "); currentBox.setTextSize(16); } else if (period == WEEKLY){ while(cTime.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY){ cTime.add(Calendar.DATE, -1); } String toShow = " [" + DateTimeStrategy.getSQLDateFormat(cTime) + "] ~ ["; eTime = (Calendar) cTime.clone(); eTime.add(Calendar.DATE, 7); toShow += DateTimeStrategy.getSQLDateFormat(eTime) + "] "; currentBox.setTextSize(16); currentBox.setText(toShow); } else if (period == MONTHLY){ cTime.set(Calendar.DATE, 1); eTime = (Calendar) cTime.clone(); eTime.add(Calendar.MONTH, 1); eTime.add(Calendar.DATE, -1); currentBox.setTextSize(18); currentBox.setText(" [" + currentTime.get(Calendar.YEAR) + "-" + (currentTime.get(Calendar.MONTH)+1) + "] "); } else if (period == YEARLY){ cTime.set(Calendar.DATE, 1); cTime.set(Calendar.MONTH, 0); eTime = (Calendar) cTime.clone(); eTime.add(Calendar.YEAR, 1); eTime.add(Calendar.DATE, -1); currentBox.setTextSize(20); currentBox.setText(" [" + currentTime.get(Calendar.YEAR) + "] "); } currentTime = cTime; list = saleLedger.getAllSaleDuring(cTime, eTime); double total = 0; for (Sale sale : list) total += sale.getTotal(); totalBox.setText(total + ""); showList(list); } @Override public void onResume() { super.onResume(); // update(); // it shouldn't call update() anymore. Because super.onResume() // already fired the action of spinner.onItemSelected() } /** * Add date. * @param increment */ private void addDate(int increment) { int period = spinner.getSelectedItemPosition(); if (period == DAILY){ currentTime.add(Calendar.DATE, 1 * increment); } else if (period == WEEKLY){ currentTime.add(Calendar.DATE, 7 * increment); } else if (period == MONTHLY){ currentTime.add(Calendar.MONTH, 1 * increment); } else if (period == YEARLY){ currentTime.add(Calendar.YEAR, 1 * increment); } update(); } }