You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

745 lines
24 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. package controller;
  2. import Common;
  3. import haxe.Utf8;
  4. import sugoi.form.Form;
  5. import sugoi.form.elements.Selectbox;
  6. import sugoi.form.validators.EmailValidator;
  7. import sugoi.tools.Utils;
  8. class Member extends Controller {
  9. public function new() {
  10. super();
  11. if (!app.user.canAccessMembership())
  12. throw Redirect("/");
  13. }
  14. @logged
  15. @tpl('member/default.mtt')
  16. function doDefault(?args:{?search:String, ?select:String}) {
  17. checkToken();
  18. var browse:Int->Int->List<Dynamic>;
  19. var uids = db.UserAmap.manager.search($amap == app.user.getAmap(), false);
  20. var uids = Lambda.map(uids, function(ua) return ua.user.id);
  21. if (args != null && args.search != null) {
  22. // SEARCH
  23. browse = function(index:Int, limit:Int) {
  24. var search = "%" + StringTools.trim(args.search) + "%";
  25. return db.User.manager.search(($lastName.like(search) || $lastName2.like(search) || $address1.like(search) || $address2.like(search)
  26. || $firstName.like(search) || $firstName2.like(search))
  27. && $id in uids,
  28. {
  29. orderBy: -id
  30. }, false);
  31. }
  32. view.search = args.search;
  33. } else if (args != null && args.select != null) {
  34. // SELECTION
  35. switch (args.select) {
  36. case "nocontract":
  37. if (app.params.exists("csv")) {
  38. sugoi.tools.Csv.printCsvDataFromObjects(Lambda.array(db.User.getUsers_NoContracts()), ["firstName", "lastName", "email"],
  39. t._("Without contracts"));
  40. return;
  41. } else {
  42. browse = function(index:Int, limit:Int) {
  43. return db.User.getUsers_NoContracts(index, limit);
  44. }
  45. }
  46. case "contract":
  47. if (app.params.exists("csv")) {
  48. sugoi.tools.Csv.printCsvDataFromObjects(Lambda.array(db.User.getUsers_Contracts()), ["firstName", "lastName", "email"],
  49. t._("With orders"));
  50. return;
  51. } else {
  52. browse = function(index:Int, limit:Int) {
  53. return db.User.getUsers_Contracts(index, limit);
  54. }
  55. }
  56. case "nomembership":
  57. if (app.params.exists("csv")) {
  58. sugoi.tools.Csv.printCsvDataFromObjects(Lambda.array(db.User.getUsers_NoMembership()), ["firstName", "lastName", "email"],
  59. t._("Memberships to be renewed"));
  60. return;
  61. } else {
  62. browse = function(index:Int, limit:Int) {
  63. return db.User.getUsers_NoMembership(index, limit);
  64. }
  65. }
  66. case "newusers":
  67. if (app.params.exists("csv")) {
  68. sugoi.tools.Csv.printCsvDataFromObjects(Lambda.array(db.User.getUsers_NewUsers()), ["firstName", "lastName", "email"],
  69. t._("Never connected"));
  70. return;
  71. } else {
  72. browse = function(index:Int, limit:Int) {
  73. return db.User.getUsers_NewUsers(index, limit);
  74. }
  75. }
  76. default:
  77. throw t._("Unknown selection");
  78. }
  79. view.select = args.select;
  80. } else {
  81. if (app.params.exists("csv")) {
  82. var headers = [
  83. "firstName", "lastName", "email", "phone", "firstName2", "lastName2", "email2", "phone2", "address1", "address2", "zipCode", "city"
  84. ];
  85. sugoi.tools.Csv.printCsvDataFromObjects(Lambda.array(db.User.manager.search($id in uids, {orderBy: lastName}, false)), headers,
  86. t._("Members"));
  87. return;
  88. } else {
  89. // default display
  90. browse = function(index:Int, limit:Int) {
  91. return db.User.manager.search($id in uids, {limit: [index, limit], orderBy: lastName}, false);
  92. }
  93. }
  94. }
  95. var count = uids.length;
  96. var rb = new sugoi.tools.ResultsBrowser(count, (args.select != null || args.search != null) ? 1000 : 10, browse);
  97. view.members = rb;
  98. if (args.select == null || args.select != "newusers") {
  99. // count new users
  100. view.newUsers = db.User.getUsers_NewUsers().length;
  101. }
  102. view.waitingList = db.WaitingList.manager.count($group == app.user.amap);
  103. }
  104. /**
  105. * Move to waiting list
  106. */
  107. function doMovetowl(u:db.User) {
  108. var ua = db.UserAmap.get(u, app.user.amap, true);
  109. ua.delete();
  110. var wl = new db.WaitingList();
  111. wl.user = u;
  112. wl.group = app.user.amap;
  113. wl.insert();
  114. throw Ok("/member", u.getName() + " " + t._("is now on waiting list."));
  115. }
  116. /**
  117. * Display waiting list
  118. */
  119. @tpl('member/waiting.mtt')
  120. function doWaiting(?args:{?add:db.User, ?remove:db.User}) {
  121. if (args != null) {
  122. if (args.add != null) {
  123. service.WaitingListService.approveRequest(args.add, app.user.amap);
  124. throw Ok("/member/waiting", t._("Membership request accepted"));
  125. } else if (args.remove != null) {
  126. service.WaitingListService.cancelRequest(args.remove, app.user.amap);
  127. throw Ok("/member/waiting", t._("Membership request refused"));
  128. }
  129. }
  130. view.waitingList = db.WaitingList.manager.search($group == app.user.amap, {orderBy: -date});
  131. }
  132. /**
  133. * Send an invitation to a new member
  134. */
  135. function doInviteMember(u:db.User) {
  136. if (checkToken()) {
  137. u.sendInvitation(app.user.amap);
  138. throw Ok('/member/view/' + u.id, t._("Invitation sent."));
  139. }
  140. }
  141. /**
  142. * Invite 'never logged' users
  143. */
  144. function doInvite() {
  145. if (checkToken()) {
  146. var users = db.User.getUsers_NewUsers();
  147. try {
  148. for (u in users) {
  149. u.sendInvitation(app.user.amap);
  150. Sys.sleep(0.2);
  151. }
  152. } catch (e:String) {
  153. if (e.indexOf("curl") > -1) {
  154. App.current.logError(e, haxe.CallStack.toString(haxe.CallStack.exceptionStack()));
  155. throw Error("/member", t._("An error occurred while sending emails, please retry"));
  156. }
  157. }
  158. throw Ok('/member', t._("Congratulations, you just sent <b>::userLength::</b> invitations", {userLength: users.length}));
  159. }
  160. }
  161. @tpl("member/view.mtt")
  162. function doView(member:db.User) {
  163. view.member = member;
  164. var userAmap = db.UserAmap.get(member, app.user.amap);
  165. if (userAmap == null)
  166. throw Error("/member", t._("This person does not belong to your group"));
  167. view.userAmap = userAmap;
  168. view.canLoginAs = (db.UserAmap.manager.count($userId == member.id) == 1 && app.user.isAmapManager()) || app.user.isAdmin();
  169. // orders
  170. var row = {constOrders: new Array<UserOrder>(), varOrders: new Map<String, Array<UserOrder>>()};
  171. // commandes fixes
  172. var contracts = db.Contract.manager.search($type == db.Contract.TYPE_CONSTORDERS
  173. && $amap == app.user.amap
  174. && $endDate > DateTools.delta(Date.now(), -1000.0 * 60 * 60 * 24 * 30), false);
  175. var orders = member.getOrdersFromContracts(contracts);
  176. row.constOrders = service.OrderService.prepare(orders);
  177. // commandes variables groupées par date de distrib
  178. var contracts = db.Contract.manager.search($type == db.Contract.TYPE_VARORDER
  179. && $amap == app.user.amap
  180. && $endDate > DateTools.delta(Date.now(), -1000.0 * 60 * 60 * 24 * 30), false);
  181. var distribs = new Map<String, List<db.UserContract>>();
  182. for (c in contracts) {
  183. var ds = c.getDistribs();
  184. for (d in ds) {
  185. var k = d.date.toString().substr(0, 10);
  186. var orders = member.getOrdersFromDistrib(d);
  187. if (orders.length > 0) {
  188. if (!distribs.exists(k)) {
  189. distribs.set(k, orders);
  190. } else {
  191. var v = distribs.get(k);
  192. for (o in orders)
  193. v.add(o);
  194. distribs.set(k, v);
  195. }
  196. }
  197. }
  198. }
  199. for (k in distribs.keys()) {
  200. var d = distribs.get(k);
  201. var d2 = service.OrderService.prepare(d);
  202. row.varOrders.set(k, d2);
  203. }
  204. view.userContracts = row;
  205. checkToken(); // to insert a token in tpl
  206. }
  207. /**
  208. * Admin : Log in as this user for debugging purpose
  209. * @param user
  210. * @param amap
  211. */
  212. function doLoginas(member:db.User, amap:db.Amap) {
  213. if (!app.user.isAdmin()) {
  214. if (!app.user.isAmapManager())
  215. return;
  216. if (member.isAdmin())
  217. return;
  218. if (db.UserAmap.manager.count($userId == member.id) > 1)
  219. return;
  220. }
  221. App.current.session.setUser(member);
  222. App.current.session.data.amapId = amap.id;
  223. throw Redirect("/member/view/" + member.id);
  224. }
  225. @tpl('member/lastMessages.mtt')
  226. function doLastMessages(member:db.User) {
  227. var out = new Array<{
  228. date:Date,
  229. subject:String,
  230. success:String,
  231. failure:String
  232. }>();
  233. var threeMonth = DateTools.delta(Date.now(), -1000.0 * 60 * 60 * 24 * 30.5 * 3);
  234. for (m in sugoi.db.BufferedMail.manager.search($remoteId == app.user.amap.id && $cdate > threeMonth, {limit: 10, orderBy: -cdate})) {
  235. var status:sugoi.mail.IMailer.MailerResult = m.status;
  236. if (status != null && status.get(member.email) != null) {
  237. var r = m.getMailerResultMessage(member.email);
  238. out.push({
  239. date: m.cdate,
  240. subject: m.title,
  241. success: r.success,
  242. failure: r.failure
  243. });
  244. }
  245. }
  246. view.emails = out;
  247. }
  248. /**
  249. * Edit a Member
  250. */
  251. @tpl('form.mtt')
  252. function doEdit(member:db.User) {
  253. if (member.isAdmin() && !app.user.isAdmin())
  254. throw Error("/", t._("You cannot modify the account of an administrator"));
  255. var form = sugoi.form.Form.fromSpod(member);
  256. // cleaning
  257. form.removeElement(form.getElement("rights"));
  258. form.removeElement(form.getElement("lang"));
  259. form.removeElement(form.getElement("ldate"));
  260. form.removeElement(form.getElement("apiKey"));
  261. var isReg = member.isFullyRegistred();
  262. var groupNum = db.UserAmap.manager.count($userId == member.id);
  263. // an administrator can modify a user's email only if he's not member elsewhere
  264. if (groupNum > 1) {
  265. form.removeElementByName("email");
  266. form.removeElementByName("email2");
  267. app.session.addMessage(t._("For security reasons, you cannot modify the e-mail of this person because this person is a member of more than 1 group."));
  268. }
  269. // an administrator can modify a user's pass only if he's a not registred user.
  270. if (!isReg) {
  271. app.session.addMessage(t._("This person did not define yet a password. You are exceptionaly authorized to do it. Please don't forget to tell this person."));
  272. form.getElement("pass").required = false;
  273. } else {
  274. form.removeElement(form.getElement("pass"));
  275. }
  276. if (form.checkToken()) {
  277. if (app.user.amap.flags.has(db.Amap.AmapFlags.PhoneRequired) && form.getValueOf("phone") == null) {
  278. throw Error("/member/edit/" + member.id, t._("Phone number is required in this group."));
  279. }
  280. form.toSpod(member);
  281. // check that the given emails are not already used elsewhere
  282. var sim = db.User.getSameEmail(member.email, member.email2);
  283. for (s in sim) {
  284. if (s.id == member.id)
  285. sim.remove(s);
  286. }
  287. if (sim.length > 0) {
  288. // Let's merge the 2 users if it has no orders.
  289. var id = sim.first().id;
  290. if (db.UserContract.manager.search($userId == id || $userId2 == id, false).length == 0) {
  291. // merge
  292. member.merge(sim.first());
  293. app.session.addMessage(t._("This e-mail was used by another user account. As this user account was not used, it has been merged into the current user account."));
  294. } else {
  295. var str = t._("Warning, this e-mail or this name already exists for another account : ");
  296. str += Lambda.map(sim, function(u) return "<a href='/member/view/" + u.id + "'>" + u.getCoupleName() + "</a>").join(",");
  297. str += " " + t._("These accounts can't be merged because the second account has orders");
  298. throw Error("/member/edit/" + member.id, str);
  299. }
  300. }
  301. if (!isReg)
  302. member.setPass(form.getValueOf("pass"));
  303. member.update();
  304. if (!App.config.DEBUG && groupNum == 1) {
  305. // warn the user that his email has been updated
  306. if (form.getValueOf("email") != member.email) {
  307. var m = new sugoi.mail.Mail();
  308. m.setSender(App.config.get("default_email"), t._("Cagette.net"));
  309. m.addRecipient(member.email);
  310. m.setSubject(t._("Change your e-mail in your account Cagette.net"));
  311. m.setHtmlBody(app.processTemplate("mail/message.mtt",
  312. {text: app.user.getName()
  313. + t._(" just modified your e-mail in your account Cagette.net.<br/>Your e-mail is now:")
  314. + form.getValueOf("email")}));
  315. App.sendMail(m);
  316. }
  317. if (form.getValueOf("email2") != member.email2 && member.email2 != null) {
  318. var m = new sugoi.mail.Mail();
  319. m.setSender(App.config.get("default_email"), t._("Cagette.net"));
  320. m.addRecipient(member.email2);
  321. m.setSubject(t._("Change the e-mail of your account Cagette.net"));
  322. m.setHtmlBody(app.processTemplate("mail/message.mtt",
  323. {text: app.user.getName()
  324. + t._(" just modified your e-mail in your account Cagette.net.<br/>Your e-mail is now:")
  325. + form.getValueOf("email2")}));
  326. App.sendMail(m);
  327. }
  328. }
  329. throw Ok('/member/view/' + member.id, t._("This member has beed updated"));
  330. }
  331. view.form = form;
  332. }
  333. /**
  334. * Remove a user from this group
  335. */
  336. function doDelete(user:db.User, ?args:{confirm:Bool, token:String}) {
  337. if (checkToken()) {
  338. if (!app.user.canAccessMembership())
  339. throw t._("You cannot do that.");
  340. if (user.id == app.user.id)
  341. throw Error("/member/view/" + user.id, t._("You cannot delete yourself."));
  342. if (Lambda.count(user.getOrders(app.user.amap), function(x) return x.quantity > 0) > 0 && !args.confirm) {
  343. throw Error("/member/view/" + user.id,
  344. t._("Warning, this account has orders. <a class='btn btn-default btn-xs' href='/member/delete/::userid::?token=::argstoken::&confirm=1'>Remove anyway</a>",
  345. {
  346. userid: user.id,
  347. argstoken: args.token
  348. }));
  349. }
  350. var ua = db.UserAmap.get(user, app.user.amap, true);
  351. if (ua != null) {
  352. ua.delete();
  353. throw Ok("/member", t._("::user:: has been removed from your group", {user: user.getName()}));
  354. } else {
  355. throw Error("/member", t._("This person does not belong to \"::amapname::\"", {amapname: app.user.amap.name}));
  356. }
  357. } else {
  358. throw Redirect("/member/view/" + user.id);
  359. }
  360. }
  361. @tpl('form.mtt')
  362. function doMerge(user:db.User) {
  363. if (!app.user.canAccessMembership())
  364. throw Error("/", "Action interdite");
  365. view.title = t._("Merge an account with another one");
  366. view.text = t._("This action allows you to merge two accounts (when you have duplicates in the database for example).<br/>Contracts of account 2 will be moved to account 1, and account 2 will be deleted. Warning, it is not possible to cancel this action.");
  367. var form = new Form("merge");
  368. var members = app.user.amap.getMembers();
  369. var members = Lambda.array(Lambda.map(members, function(x) return {key: Std.string(x.id), value: x.getName()}));
  370. var mlist = new Selectbox("member1", t._("Account 1"), members, Std.string(user.id));
  371. form.addElement(mlist);
  372. var mlist = new Selectbox("member2", t._("Account 2"), members);
  373. form.addElement(mlist);
  374. if (form.checkToken()) {
  375. var m1 = Std.parseInt(form.getElement("member1").value);
  376. var m2 = Std.parseInt(form.getElement("member2").value);
  377. var m1 = db.User.manager.get(m1, true);
  378. var m2 = db.User.manager.get(m2, true);
  379. // if (m1.amapId != m2.amapId) throw "ils ne sont pas de la même amap !";
  380. // on prend tout à m2 pour donner à m1
  381. // change usercontracts
  382. var contracts = db.UserContract.manager.search($user == m2 || $user2 == m2, true);
  383. for (c in contracts) {
  384. if (c.user.id == m2.id)
  385. c.user = m1;
  386. if (c.user2 != null && c.user2.id == m2.id)
  387. c.user2 = m1;
  388. c.update();
  389. }
  390. // group memberships
  391. var adh = db.UserAmap.manager.search($user == m2, true);
  392. for (a in adh) {
  393. a.user = m1;
  394. a.update();
  395. }
  396. // change contacts
  397. var contacts = db.Contract.manager.search($contact == m2, true);
  398. for (c in contacts) {
  399. c.contact = m1;
  400. c.update();
  401. }
  402. // if (m2.amap.contact == m2) {
  403. // m1.amap.lock();
  404. // m1.amap.contact = m1;
  405. // m1.amap.update();
  406. // }
  407. m2.delete();
  408. throw Ok("/member/view/" + m1.id, t._("Both accounts have been merged"));
  409. }
  410. view.form = form;
  411. }
  412. @tpl('member/import.mtt')
  413. function doImport(?args:{confirm:Bool}) {
  414. var step = 1;
  415. var request = Utils.getMultipart(1024 * 1024 * 4); // 4mb
  416. // on recupere le contenu de l'upload
  417. var data = request.get("file");
  418. if (data != null) {
  419. var csv = new sugoi.tools.Csv();
  420. csv.setHeaders([
  421. t._("Firstname"), t._("Lastname"), t._("E-mail"), t._("Mobile phone"), t._("Partner's firstname"), t._("Partner's lastname"),
  422. t._("Partner's e-mail"), t._("Partner's Mobile phone"), t._("Address 1"), t._("Address 2"), t._("Post code"), t._("City")]);
  423. // utf8 encode if needed
  424. try {
  425. if (!haxe.Utf8.validate(data)) {
  426. data = haxe.Utf8.encode(data);
  427. }
  428. } catch (e:Dynamic) {}
  429. var unregistred = csv.importDatas(data);
  430. /*var checkEmail = function(email){
  431. if ( !sugoi.form.validators.EmailValidator.check(email) ) {
  432. throw Error("/member", t._("The email <b>::email::</b> is invalid, please update your CSV file",{email:email}) );
  433. }
  434. }*/
  435. // cleaning
  436. for (user in unregistred.copy()) {
  437. // check nom+prenom
  438. if (user[0] == null || user[1] == null) {
  439. throw Error("/member/import", t._("You must fill the name and the firstname of the person. This line is incomplete: ") + user);
  440. }
  441. if (user[2] == null) {
  442. throw Error("/member/import",
  443. t._("Each person must have an e-mail to be able to log in. ::user0:: ::user1:: don't have one. ",
  444. {user0: user[0], user1: user[1]}) + user);
  445. }
  446. // uppercase du nom
  447. if (user[1] != null)
  448. user[1] = user[1].toUpperCase();
  449. if (user[5] != null)
  450. user[5] = user[5].toUpperCase();
  451. // lowercase email
  452. if (user[2] != null) {
  453. user[2] = user[2].toLowerCase();
  454. // checkEmail(user[2]);
  455. }
  456. if (user[6] != null) {
  457. user[6] = user[6].toLowerCase();
  458. // checkEmail(user[6]);
  459. }
  460. }
  461. // utf-8 check
  462. for (row in unregistred.copy()) {
  463. for (i in 0...row.length) {
  464. var t = row[i];
  465. if (t != "" && t != null) {
  466. try {
  467. if (!Utf8.validate(t)) {
  468. t = Utf8.encode(t);
  469. }
  470. } catch (e:Dynamic) {}
  471. row[i] = t;
  472. }
  473. }
  474. }
  475. // put already registered people in another list
  476. var registred = [];
  477. for (r in unregistred.copy()) {
  478. // var firstName = r[0];
  479. // var lastName = r[1];
  480. var email = r[2];
  481. // var firstName2 = r[4];
  482. // var lastName2 = r[5];
  483. var email2 = r[6];
  484. var us = db.User.getSameEmail(email, email2);
  485. if (us.length > 0) {
  486. unregistred.remove(r);
  487. registred.push(r);
  488. }
  489. }
  490. app.session.data.csvUnregistered = unregistred;
  491. app.session.data.csvRegistered = registred;
  492. view.data = unregistred;
  493. view.data2 = registred;
  494. step = 2;
  495. }
  496. if (args != null && args.confirm) {
  497. // import unregistered members
  498. var i:Iterable<Dynamic> = cast app.session.data.csvUnregistered;
  499. for (u in i) {
  500. if (u[0] == null || u[0] == "null" || u[0] == "")
  501. continue;
  502. var user = new db.User();
  503. user.firstName = u[0];
  504. user.lastName = u[1];
  505. user.email = u[2];
  506. if (user.email != null && user.email != "null" && !EmailValidator.check(user.email)) {
  507. throw t._("The E-mail ::useremail:: is invalid, please modify your file", {useremail: user.email});
  508. }
  509. user.phone = u[3];
  510. user.firstName2 = u[4];
  511. user.lastName2 = u[5];
  512. user.email2 = u[6];
  513. if (user.email2 != null && user.email2 != "null" && !EmailValidator.check(user.email2)) {
  514. App.log(u);
  515. throw t._("The E-mail of the partner of ::userFirstName:: ::userLastName:: '::userEmail::' is invalid, please check your file",
  516. {userFirstName: user.firstName, userLastName: user.lastName, userEmail: user.email2});
  517. }
  518. user.phone2 = u[7];
  519. user.address1 = u[8];
  520. user.address2 = u[9];
  521. user.zipCode = u[10];
  522. user.city = u[11];
  523. user.insert();
  524. var ua = new db.UserAmap();
  525. ua.user = user;
  526. ua.amap = app.user.amap;
  527. ua.insert();
  528. }
  529. // import registered members
  530. var i:Iterable<Array<String>> = cast app.session.data.csvRegistered;
  531. for (u in i) {
  532. var email = u[2];
  533. var email2 = u[6];
  534. var us = db.User.getSameEmail(email, email2);
  535. var userAmaps = db.UserAmap.manager.search($amap == app.user.amap
  536. && $userId in Lambda.map(us, function(u) return u.id), false);
  537. // member exists but is not member of this group.
  538. if (userAmaps.length == 0) {
  539. var ua = new db.UserAmap();
  540. ua.user = us.first();
  541. ua.amap = app.user.amap;
  542. ua.insert();
  543. }
  544. }
  545. view.numImported = app.session.data.csvUnregistered.length + app.session.data.csvRegistered.length;
  546. app.session.data.csvUnregistered = null;
  547. app.session.data.csvRegistered = null;
  548. step = 3;
  549. }
  550. if (step == 1) {
  551. // reset import when back to import page
  552. app.session.data.csvUnregistered = null;
  553. app.session.data.csvRegistered = null;
  554. }
  555. view.step = step;
  556. }
  557. @tpl("user/insert.mtt")
  558. public function doInsert() {
  559. if (!app.user.canAccessMembership())
  560. throw Error("/", t._("Forbidden action"));
  561. var m = new db.User();
  562. var form = sugoi.form.Form.fromSpod(m);
  563. form.removeElement(form.getElement("lang"));
  564. form.removeElement(form.getElement("rights"));
  565. form.removeElement(form.getElement("pass"));
  566. form.removeElement(form.getElement("ldate"));
  567. form.removeElement(form.getElement("apiKey"));
  568. form.addElement(new sugoi.form.elements.Checkbox("warnAmapManager", t._("Send an E-mail to the person in charge of the group"), true));
  569. form.getElement("email").addValidator(new EmailValidator());
  570. form.getElement("email2").addValidator(new EmailValidator());
  571. if (form.isValid()) {
  572. // check doublon de User et de UserAmap
  573. var userSims = db.User.getSameEmail(form.getValueOf("email"), form.getValueOf("email2"));
  574. view.userSims = userSims;
  575. var userAmaps = db.UserAmap.manager.search($amap == app.user.amap
  576. && $userId in Lambda.map(userSims, function(u) return u.id), false);
  577. view.userAmaps = userAmaps;
  578. if (userAmaps.length > 0) {
  579. // user deja enregistré dans cette amap
  580. throw Error('/member/view/' + userAmaps.first().user.id, t._("This person is already member of this group"));
  581. } else if (userSims.length > 0) {
  582. // des users existent avec ce nom ,
  583. // if (userSims.length == 1) {
  584. // si yen a qu'un on l'inserte
  585. var ua = new db.UserAmap();
  586. ua.user = userSims.first();
  587. ua.amap = app.user.amap;
  588. ua.insert();
  589. throw Ok('/member/', t._("This person already had an account on Cagette.net, and is now member of your group."));
  590. /*}else {
  591. //demander validation avant d'inserer le userAmap
  592. //TODO
  593. throw Error('/member', t._("Not possible to add this person because there are already some people in the database having the same firstname and name. Please contact the administrator.")+userSims);
  594. }*/
  595. return;
  596. } else {
  597. if (app.user.amap.flags.has(db.Amap.AmapFlags.PhoneRequired) && form.getValueOf("phone") == null) {
  598. throw Error("/member/insert", t._("Phone number is required in this group."));
  599. }
  600. // insert user
  601. var u = new db.User();
  602. form.toSpod(u);
  603. u.lang = app.user.lang;
  604. u.insert();
  605. // insert userAmap
  606. var ua = new db.UserAmap();
  607. ua.user = u;
  608. ua.amap = app.user.getAmap();
  609. ua.insert();
  610. if (form.getValueOf("warnAmapManager") == "1") {
  611. var url = "http://" + App.config.HOST + "/member/view/" + u.id;
  612. var text = t._("::admin:: just keyed-in contact details of a new member: <br/><strong>::newMember::</strong><br/> <a href='::url::'>See contact details</a>",
  613. {
  614. admin: app.user.getName(),
  615. newMember: u.getCoupleName(),
  616. url: url
  617. });
  618. App.quickMail(app.user.getAmap().contact.email, app.user.amap.name + " - " + t._("New member") + " : " + u.getCoupleName(),
  619. app.processTemplate("mail/message.mtt", {
  620. text: text
  621. }));
  622. }
  623. throw Ok('/member/', t._("This person is now member of the group"));
  624. }
  625. }
  626. view.form = form;
  627. }
  628. /**
  629. * user payments history
  630. */
  631. @tpl('member/payments.mtt')
  632. function doPayments(m:db.User) {
  633. service.PaymentService.updateUserBalance(m, app.user.amap);
  634. var browse:Int->Int->List<Dynamic>;
  635. // default display
  636. browse = function(index:Int, limit:Int) {
  637. return db.Operation.getOperationsWithIndex(m, app.user.amap, index, limit, true);
  638. }
  639. var count = db.Operation.countOperations(m, app.user.amap);
  640. var rb = new sugoi.tools.ResultsBrowser(count, 10, browse);
  641. view.rb = rb;
  642. view.member = m;
  643. view.balance = db.UserAmap.get(m, app.user.amap).balance;
  644. checkToken();
  645. }
  646. @tpl('member/balance.mtt')
  647. function doBalance() {
  648. view.balanced = db.UserAmap.manager.search($amap == app.user.amap && $balance == 0.0, false);
  649. view.credit = db.UserAmap.manager.search($amap == app.user.amap && $balance > 0, false);
  650. view.debt = db.UserAmap.manager.search($amap == app.user.amap && $balance < 0, false);
  651. }
  652. }