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