001 package market;
002
003 import java.awt.Rectangle;
004
005 import market.stdform.ButtonIDs;
006 import market.stdform.FSCheckable;
007 import market.stdform.FSEditPersonData;
008 import market.stdform.FSEmpty;
009 import sale.Action;
010 import sale.FormSheet;
011 import sale.Gate;
012 import sale.GateChangeTransition;
013 import sale.SaleProcess;
014 import sale.SalesPoint;
015 import sale.Shop;
016 import sale.Transition;
017 import sale.UIGate;
018 import sale.stdforms.MsgForm;
019 import users.User;
020
021 /**
022 * SaleProcess that handles the new registration of a customer or
023 * the editing of personal data of an existing customer.
024 */
025 public class SProcessCustomerEditProfile extends SProcessMarket{
026
027 /**
028 * Gate for editing profile.
029 */
030 private UIGate uig_editProfile = new UIGate(null, null);
031
032 /**
033 * Gate for displaying the successful change of data.
034 */
035 private UIGate uig_confirmation = new UIGate(null, null);
036
037 /**
038 * Gate for displaying the change of data was unsuccessful.
039 */
040 private UIGate uig_passwordFailed = new UIGate(null, null);
041
042 /**
043 * The customer who interacts with this SaleProcess.
044 */
045 private UCustomer customer;
046
047 private FSCheckable fsc_profile;
048
049 /**
050 * Shows whether it is the first registration
051 * or only the correction of existing data.
052 */
053 private boolean firstRegistration;
054
055 /**
056 * @param user the UCustomer who interacts with this process.
057 */
058 public SProcessCustomerEditProfile(User user){
059 super("Edit-Profile");
060 customer = (UCustomer)user;
061 if(user == null) firstRegistration = true;
062 else firstRegistration = false;
063 }
064
065
066 // ################################## Gates ##########################################################
067
068 /**
069 * Attaches {@link FSEditPersonData}, its actions and the menu to {@link #uig_editProfile}.
070 * @return the set up {@link #uig_editProfile}.
071 */
072 protected Gate getInitialGate() {
073 fsc_profile = FSEditPersonData.getCustomerProfileForCustomer(customer);
074 setAction(fsc_profile, new sale.Action(){
075 public void doAction(SaleProcess p, SalesPoint sp) throws Throwable {
076 if(fsc_profile.checkTextFields(FSCheckable.ALL_ERRORMESSAGES_AT_ONCE, true)){
077 User usr = null;
078 if (customer == null) {
079 String userID = fsc_profile.getEntry(FSEditPersonData.JTFC_LOGIN);
080 usr = UMUserBase.getGlobalBase().getUser(userID);
081 }
082 if (usr != null) {
083 JDDShowMessage.showMessageDialog(fsc_profile, "Dieses Login wurde bereits " +
084 "vergeben, wählen sie bitte ein anderes.", "Doppeltes Login!");
085 }
086 else {
087 uig_editProfile.setNextTransition(commitEdits());
088 }
089 }
090 }
091 }, ButtonIDs.BTN_ACCEPT);
092 setAction(fsc_profile, new sale.Action(){
093 public void doAction(SaleProcess p, SalesPoint sp) throws Throwable {
094 uig_editProfile.setNextTransition(GateChangeTransition.CHANGE_TO_STOP_GATE);
095 if(firstRegistration){
096 if(sp.getCurrentProcess()!=null) sp.processFinished(sp.getCurrentProcess());
097 SMarket.getTheMarket().removeSalesPoint(sp);
098 }
099 }
100 }, ButtonIDs.BTN_BACK);
101 uig_editProfile.setFormSheet(fsc_profile);
102 return uig_editProfile;
103 }
104
105 /**
106 * Attaches a {@link MsgForm} and its OK-action to {@link #uig_confirmation}.
107 * @return the set up {@link #uig_confirmation}.
108 */
109 private Gate getConfirmationGate(){
110 FormSheet fs = new MsgForm("Daten gespeichert", "Ihre Daten wurden erfolgreich geändert!");
111 setAction(fs, new sale.Action(){
112 public void doAction(SaleProcess p, SalesPoint sp) throws Throwable {
113 uig_confirmation.setNextTransition(GateChangeTransition.CHANGE_TO_STOP_GATE);
114 if(firstRegistration){
115 if(sp.getCurrentProcess()!=null) sp.processFinished(sp.getCurrentProcess());
116 SMarket.getTheMarket().removeSalesPoint(sp);
117 }
118 }
119 }, FormSheet.BTNID_OK);
120 uig_confirmation.setFormSheet(fs);
121 return uig_confirmation;
122 }
123
124 /**
125 * Attaches a {@link MsgForm} and its OK-action to {@link #uig_passwordFailed}.
126 * @return the set up {@link #uig_passwordFailed}.
127 */
128 private Gate getPasswordFailedGate(){
129 FormSheet fs = new MsgForm("Passwort überprüfen", "Sie haben entweder kein Passwort eingegeben\n"+
130 "oder die Passwörter stimmen nicht überein");
131 setTransition(fs, new GateChangeTransition(uig_editProfile), FormSheet.BTNID_OK);
132 uig_passwordFailed.setFormSheet(fs);
133 return uig_passwordFailed;
134 }
135
136
137 // ############################ Transitions ###########################################################
138
139 /**
140 * @return a transition that changes to the {@link #getConfirmationGate()} if all new passwords are equal,
141 * otherwise to the {@link #getPasswordFailedGate()}.
142 */
143 private Transition commitEdits(){
144 return new Transition(){
145 public Gate perform(SaleProcess pOwner, User usr) {
146 FSEditPersonData fs = ((FSEditPersonData)fsc_profile.getFormSheet());
147 if(fs.passwordsEqual()){
148 if(firstRegistration){
149 if(fs.getPassword()==null) return getPasswordFailedGate();
150 String userID = fsc_profile.getEntry(FSEditPersonData.JTFC_LOGIN);
151 customer = (UCustomer)UMUserBase.createUser(userID, UMUserBase.CUSTOMER, null);
152 }
153 customer.setSalutation(fs.getSalutation());
154 customer.setFirstName(fsc_profile.getEntry(FSEditPersonData.JTFC_FIRSTNAME));
155 customer.setSurname(fsc_profile.getEntry(FSEditPersonData.JTFC_NAME));
156 customer.setTelephone(fsc_profile.getEntry(FSEditPersonData.JTFC_TELEPHONE));
157 customer.setStreet(fsc_profile.getEntry(FSEditPersonData.JTFC_STREET));
158 customer.setPostcode(Integer.parseInt(fsc_profile.getEntry(FSEditPersonData.JTFC_POSTCODE)));
159 customer.setCity(fsc_profile.getEntry(FSEditPersonData.JTFC_CITY));
160 customer.setCompany(fsc_profile.getEntry(FSEditPersonData.JTFC_COMPANY));
161 if(fs.getPassword()!=null) customer.setPassWd(User.garblePassWD(fs.getPassword()));
162 return getConfirmationGate();
163 }
164 return getPasswordFailedGate();
165 }
166 };
167 }
168
169
170 //################################### public methods #######################################################
171
172 /**
173 *@return an action that creates a new {@link SPListenable} and runs a new SProcessCustomerEditProfile on it
174 */
175 public static Action create(){
176 return new sale.Action(){
177 public void doAction(SaleProcess p, SalesPoint sp) throws Throwable {
178 SPListenable point = new SPListenable("Sohn&Sohn"){
179 protected FormSheet getDefaultFormSheet() {
180 return new FSEmpty();
181 }
182 // Quit the SalesPoint without any question
183 /*protected boolean onCanQuit(){
184 return getCurrentProcess() == null;
185 }*/
186 };
187 point.setSalesPointFrameBounds(new Rectangle(0,0,640,540));
188 Shop.getTheShop().addSalesPoint(point);
189 point.runProcess(new SProcessCustomerEditProfile(null));
190 }
191 };
192 }
193 }