--- ResultDetailsDialog.cpp 2006/09/01 02:24:38 21 +++ ResultDetailsDialog.cpp 2006/09/12 10:15:12 55 @@ -1,11 +1,18 @@ -// ResultDetailsDialog.cpp : implementation file -// +/* + * Developed by Torben H. Nielsen + */ + #include "stdafx.h" #include "h6-udlånssystem.h" #include "ResultDetailsDialog.h" #include ".\resultdetailsdialog.h" #include "CommonStorage.h" +#include "DatabaseLayer.h" +#include "CheckoutDialog.h" +#include "SearchDialog.h" +#include "ResultDialog.h" +#include "MyTabCtrl.h" // ResultDetailsDialog dialog @@ -33,6 +40,10 @@ ON_EN_CHANGE(IDC_PLACEMENT, OnEnChangePlacement) ON_EN_CHANGE(IDC_STATUS, OnEnChangeStatus) ON_BN_CLICKED(IDC_CLOSE, OnBnClickedClose) + ON_BN_CLICKED(IDC_RETURN, OnBnClickedReturn) + ON_BN_CLICKED(IDC_CHECKOUT, OnBnClickedCheckout) + ON_BN_CLICKED(IDC_RESERVE, OnBnClickedReserve) + ON_BN_CLICKED(IDC_DELRES, OnBnClickedDelres) END_MESSAGE_MAP() @@ -43,13 +54,12 @@ if (m_loadingData == true) return; m_loadingData = true; - Equipment currentdata = CommonStorage::Instance()->getSearchResult()[m_resultIndex]; - GetDlgItem(IDC_BARCODE)->SetWindowText(currentdata.barcode); - GetDlgItem(IDC_NAME)->SetWindowText(currentdata.name); - GetDlgItem(IDC_DESCRIPTION)->SetWindowText(currentdata.description); - GetDlgItem(IDC_PLACEMENT)->SetWindowText(currentdata.placement); - GetDlgItem(IDC_STATUS)->SetWindowText(currentdata.status); + GetDlgItem(IDC_BARCODE)->SetWindowText(m_equipment.barcode); + GetDlgItem(IDC_NAME)->SetWindowText(m_equipment.name); + GetDlgItem(IDC_DESCRIPTION)->SetWindowText(m_equipment.description); + GetDlgItem(IDC_PLACEMENT)->SetWindowText(m_equipment.placement); + GetDlgItem(IDC_STATUS)->SetWindowText(m_equipment.status); m_loadingData = false; } @@ -57,20 +67,16 @@ void ResultDetailsDialog::LoadListControls(void) { if (CommonStorage::Instance()->getAdmin() ) { - Equipment currentdata = CommonStorage::Instance()->getSearchResult()[m_resultIndex]; //load Equipment::checkouts CListCtrl *checkouts = (CListCtrl*) GetDlgItem(IDC_CHECKOUTS); - checkouts->InsertColumn(0,"Inits"); - checkouts->InsertColumn(1,"Start date"); - checkouts->InsertColumn(2,"Return date"); - checkouts->InsertColumn(3,"Number of days"); + checkouts->DeleteAllItems(); - for (int i=0; iInsertItem(i,currentdata.checkouts[i].inits); - checkouts->SetItemText(nItem,1,currentdata.checkouts[i].startdate); - checkouts->SetItemText(nItem,2,currentdata.checkouts[i].enddate); - checkouts->SetItemText(nItem,3,currentdata.checkouts[i].numdays); + for (int i=0; iInsertItem(i, m_equipment.checkouts[i].inits); + checkouts->SetItemText(nItem,1, m_equipment.checkouts[i].startdate); + checkouts->SetItemText(nItem,2, m_equipment.checkouts[i].enddate); + checkouts->SetItemText(nItem,3, m_equipment.checkouts[i].numdays); } checkouts->SetColumnWidth(0,LVSCW_AUTOSIZE_USEHEADER); checkouts->SetColumnWidth(1,LVSCW_AUTOSIZE_USEHEADER); @@ -79,16 +85,22 @@ // load Equipment::reservations CListCtrl *reservations = (CListCtrl*) GetDlgItem(IDC_RESERVATIONS); - reservations->InsertColumn(0,"Inits"); - reservations->InsertColumn(1,"Start date"); - reservations->InsertColumn(2,"Number of days"); - - for (int i=0; iInsertItem(i, currentdata.reservations[i].inits); - reservations->SetItemText(nItem,1, currentdata.reservations[i].startdate); - reservations->SetItemText(nItem,2, currentdata.reservations[i].numdays); + reservations->DeleteAllItems(); + + + for (int i=0; iInsertItem(i, tmp); + reservations->SetItemText(nItem, 1, m_equipment.reservations[i].inits); + reservations->SetItemText(nItem, 2, m_equipment.reservations[i].startdate); + } + if (m_equipment.reservations.size() > 0) + GetDlgItem(IDC_DELRES)->EnableWindow(true); + + reservations->SetColumnWidth(0,LVSCW_AUTOSIZE_USEHEADER); reservations->SetColumnWidth(1,LVSCW_AUTOSIZE_USEHEADER); reservations->SetColumnWidth(2,LVSCW_AUTOSIZE_USEHEADER); @@ -105,26 +117,46 @@ { CDialog::OnInitDialog(); - + CListCtrl *checkouts = (CListCtrl*) GetDlgItem(IDC_CHECKOUTS); + checkouts->SetExtendedStyle( LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT ); + checkouts->InsertColumn(0,"Inits"); + checkouts->InsertColumn(1,"Start date"); + checkouts->InsertColumn(2,"Return date"); + checkouts->InsertColumn(3,"Number of days"); + checkouts->SetColumnWidth(0,LVSCW_AUTOSIZE_USEHEADER); + checkouts->SetColumnWidth(1,LVSCW_AUTOSIZE_USEHEADER); + checkouts->SetColumnWidth(2,LVSCW_AUTOSIZE_USEHEADER); + checkouts->SetColumnWidth(3,LVSCW_AUTOSIZE_USEHEADER); + + CListCtrl *reservations = (CListCtrl*) GetDlgItem(IDC_RESERVATIONS); + reservations->SetExtendedStyle( LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT ); + reservations->InsertColumn(0,"#"); + reservations->InsertColumn(1,"Inits"); + reservations->InsertColumn(2,"Reservation date"); + reservations->SetColumnWidth(0,LVSCW_AUTOSIZE_USEHEADER); + reservations->SetColumnWidth(1,LVSCW_AUTOSIZE_USEHEADER); + reservations->SetColumnWidth(2,LVSCW_AUTOSIZE_USEHEADER); + + + GetDlgItem(IDC_RESERVE)->EnableWindow(CommonStorage::Instance()->getAdmin()); GetDlgItem(IDC_CHECKOUT)->EnableWindow(CommonStorage::Instance()->getAdmin()); GetDlgItem(IDC_RETURN)->EnableWindow(CommonStorage::Instance()->getAdmin()); - CString status = CommonStorage::Instance()->getSearchResult()[m_resultIndex].status; - - if (status == "Ledig") - GetDlgItem(IDC_RETURN)->EnableWindow(false); - if (status == "Udlånt") - GetDlgItem(IDC_CHECKOUT)->EnableWindow(false); - if (status == "Reserveret") - GetDlgItem(IDC_RETURN)->EnableWindow(false); + m_equipment = CommonStorage::Instance()->getDBLayer()->GetEquipment(m_barcode); + + EnableControls(); LoadData(); LoadListControls(); return TRUE; } +///////////////////////////////////////////// +// a normal EditControl is prettier than a greyed out read-only +// So to simulate a read-only field, we reload the data every time the +// user tries to modify the data void ResultDetailsDialog::OnEnChangeBarcode() { LoadData(); @@ -145,15 +177,112 @@ LoadData(); } - - void ResultDetailsDialog::OnEnChangeStatus() { LoadData(); } - void ResultDetailsDialog::OnBnClickedClose() { OnOK(); } + +////////////////////////////////////////////////// + +void ResultDetailsDialog::OnBnClickedReturn() +{ + + DatabaseLayer *dblayer = CommonStorage::Instance()->getDBLayer(); + dblayer->ReturnEquipment(m_barcode); + this->ReloadData(); +} + +void ResultDetailsDialog::OnBnClickedCheckout() +{ + CheckoutDialog check; + + check.m_checkoutMode = true; + + Reservation topReservation; + if (m_equipment.statusid == StatusReserved) { + + topReservation = m_equipment.reservations[0]; + check.m_reservedTo = topReservation.inits; + } + + if (check.DoModal() == IDOK) + { + DatabaseLayer *dblayer = CommonStorage::Instance()->getDBLayer(); + Person p = dblayer->GetPerson(check.m_inits); + + Equipment eq; + GetDlgItem(IDC_BARCODE)->GetWindowText(eq.barcode); + + dblayer->CheckoutEquipment(p, eq, atoi(check.m_numdays) ); + + if (m_equipment.statusid == StatusReserved) { //if the equipment was reserved, we must delete the reservation + dblayer->DeleteReservation(eq.barcode, topReservation.reservationID); + } + this->ReloadData(); + } +} + +void ResultDetailsDialog::OnBnClickedReserve() +{ + CheckoutDialog check; + check.m_checkoutMode = false; + if (check.DoModal() == IDOK) + { + DatabaseLayer *dblayer = CommonStorage::Instance()->getDBLayer(); + Person p = dblayer->GetPerson(check.m_inits); + CString barcode; + GetDlgItem(IDC_BARCODE)->GetWindowText(barcode); + dblayer->EquipmentReservation(barcode,p); + + this->ReloadData(); + } +} + +void ResultDetailsDialog::OnBnClickedDelres() +{ + int sel = ((CListCtrl*)GetDlgItem(IDC_RESERVATIONS))->GetSelectionMark(); + if (sel != -1) { + CString reservationID = m_equipment.reservations[sel].reservationID; + CString barcode = m_equipment.barcode; + CommonStorage::Instance()->getDBLayer()->DeleteReservation(barcode, reservationID); + this->ReloadData(); + + } else { + MessageBox("No reservation is selected"); + } +} + +void ResultDetailsDialog::ReloadData(void) +{ + m_equipment = CommonStorage::Instance()->getDBLayer()->GetEquipment(m_barcode); + this->LoadData(); + this->LoadListControls(); + this->EnableControls(); + + ((SearchDialog*)CommonStorage::Instance()->getTabCtrl()->m_tabs[0])->OnBnClickedSearch(); + ((ResultDialog*)CommonStorage::Instance()->getTabCtrl()->m_tabs[1])->LoadResults(); +} + +void ResultDetailsDialog::EnableControls(void) +{ + if (CommonStorage::Instance()->getAdmin() ) { + if (m_equipment.statusid == StatusAvailable) { + GetDlgItem(IDC_CHECKOUT)->EnableWindow(true); + GetDlgItem(IDC_RETURN)->EnableWindow(false); + GetDlgItem(IDC_RESERVE)->EnableWindow(false); + } else if (m_equipment.statusid == StatusCheckedout) { + GetDlgItem(IDC_CHECKOUT)->EnableWindow(false); + GetDlgItem(IDC_RETURN)->EnableWindow(true); + GetDlgItem(IDC_RESERVE)->EnableWindow(true); + } else { //m_equipment.statusid == StatusReserved + GetDlgItem(IDC_CHECKOUT)->EnableWindow(true); + GetDlgItem(IDC_RETURN)->EnableWindow(false); + GetDlgItem(IDC_RESERVE)->EnableWindow(true); + } + } +}