r648 - in trunk: faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities faxtomail-persistence/src/main/xmi faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service faxtomail-service/src/main/resources/pdf faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui
Author: kmorin Date: 2014-09-29 13:39:04 +0200 (Mon, 29 Sep 2014) New Revision: 648 Url: http://forge.codelutin.com/projects/faxtomail/repository/revisions/648 Log: ajout des infos manquantes lors de l'impression des ?\195?\169l?\195?\169ments Added: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailImpl.java Modified: trunk/faxtomail-persistence/src/main/xmi/faxtomail.zargo trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java trunk/faxtomail-service/src/main/resources/pdf/demande.mustache trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUI.css trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/ButtonEmailGroup.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/history/HistoryListUIHandler.java Added: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailImpl.java =================================================================== --- trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailImpl.java (rev 0) +++ trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailImpl.java 2014-09-29 11:39:04 UTC (rev 648) @@ -0,0 +1,177 @@ +package com.franciaflex.faxtomail.persistence.entities; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.collect.Collections2; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +/** + * @author Kevin Morin (Code Lutin) + */ +public class EmailImpl extends EmailAbstract { + + protected History firstOpeningHistory; + + protected History lastModificationHistory; + + protected History lastAttachmentOpeningInFolderHistory; + + public void findFirstOpeningHistory() { + History result = null; + Date date = null; + Collection<History> histories = getHistory(); + if (histories != null) { + for (History history : histories) { + if (HistoryType.OPENING.equals(history.getType())) { + if (date == null || date.after(history.getModificationDate())) { + date = history.getModificationDate(); + result = history; + } + } + } + } + firstOpeningHistory = result; + } + + public void findLastModificationHistory() { + History result = null; + Date date = null; + Collection<History> histories = getHistory(); + if (histories != null) { + for (History history : histories) { + if (history.getType().isConsideredAsModification()) { + if (date == null || date.before(history.getModificationDate())) { + date = history.getModificationDate(); + result = history; + } + } + } + } + lastModificationHistory = result; + } + + public void findLastAttachmentOpeningInFolderHistory() { + History result = null; + Collection<History> histories = getHistory(); + + if (histories != null) { + History transmissionHistory = null; + for (History history : histories) { + Date modificationDate = history.getModificationDate(); + if (HistoryType.ATTACHMENT_OPENING.equals(history.getType())) { + if ((transmissionHistory == null + || transmissionHistory.getModificationDate().before(modificationDate)) + && (result == null + || result.getModificationDate().before(modificationDate))) { + result = history; + } + + } else if (HistoryType.TRANSMISSION.equals(history.getType())) { + if (transmissionHistory == null + || transmissionHistory.getModificationDate().before(modificationDate)) { + + transmissionHistory = history; + if (result != null && result.getModificationDate().before(transmissionHistory.getModificationDate())) { + result = null; + } + } + } + } + } + lastAttachmentOpeningInFolderHistory = result; + } + + protected History getFirstOpeningHistory() { + if (firstOpeningHistory == null) { + findFirstOpeningHistory(); + } + return firstOpeningHistory; + } + + @Override + public FaxToMailUser getFirstOpeningUser() { + History history = getFirstOpeningHistory(); + return history != null ? history.getFaxToMailUser() : null; + } + + @Override + public Date getFirstOpeningDate() { + History history = getFirstOpeningHistory(); + return history != null ? history.getModificationDate() : null; + } + + protected History getLastModificationHistory() { + if (lastModificationHistory == null) { + findLastModificationHistory(); + } + return lastModificationHistory; + } + + @Override + public FaxToMailUser getLastModificationUser() { + History history = getLastModificationHistory(); + return history != null ? history.getFaxToMailUser() : null; + } + + @Override + public Date getLastModificationDate() { + History history = getLastModificationHistory(); + return history != null ? history.getModificationDate() : null; + } + + protected History getLastAttachmentOpeningInThisFolderHistory() { + if (lastAttachmentOpeningInFolderHistory == null) { + findLastAttachmentOpeningInFolderHistory(); + } + return lastAttachmentOpeningInFolderHistory; + } + + @Override + public FaxToMailUser getLastAttachmentOpeningInFolderUser() { + History history = getLastAttachmentOpeningInThisFolderHistory(); + return history != null ? history.getFaxToMailUser() : null; + } + + @Override + public Date getLastAttachmentOpeningInFolderDate() { + History history = getLastAttachmentOpeningInThisFolderHistory(); + return history != null ? history.getModificationDate() : null; + } + + @Override + public void setHistory(List<History> history) { + firstOpeningHistory = null; + lastModificationHistory = null; + lastAttachmentOpeningInFolderHistory = null; + super.setHistory(history); + } + + public String getReference() { + List<String> reference = new ArrayList<String>(); + if (StringUtils.isNotBlank(getCompanyReference())) { + reference.add(getCompanyReference()); + } + Collection<RangeRow> rangeRow = getRangeRow(); + if (rangeRow != null) { + Collection<String> commandNumbers = Collections2.transform(rangeRow, new Function<RangeRow, String>() { + @Override + public String apply(RangeRow input) { + return input != null ? input.getCommandNumber() : ""; + } + }); + Collections2.filter(commandNumbers, new Predicate<String>() { + @Override + public boolean apply(String input) { + return StringUtils.isNotBlank(input); + } + }); + reference.addAll(commandNumbers); + } + return StringUtils.join(reference, ", "); + } +} Modified: trunk/faxtomail-persistence/src/main/xmi/faxtomail.zargo =================================================================== (Binary files differ) Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java 2014-09-29 09:34:03 UTC (rev 647) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java 2014-09-29 11:39:04 UTC (rev 648) @@ -75,6 +75,7 @@ import org.hibernate.Hibernate; import org.nuiton.csv.Import; import org.nuiton.csv.ImportRuntimeException; +import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.application.ApplicationTechnicalException; import org.nuiton.topia.persistence.TopiaEntities; import org.nuiton.topia.persistence.support.TopiaSqlSupport; @@ -1332,20 +1333,49 @@ } protected String getEmailDetailAsHtml(Email email) { + Decorator<FaxToMailUser> userDecorator = getDecoratorService().getDecoratorByType(FaxToMailUser.class); + Map<String, Object> scopes = new HashMap<String, Object>(); - scopes.put("receivedDate", DateFormatUtils.format(email.getReceptionDate(), "dd/MM/yyyy")); + + String result = email.getObject(); + String ref = email.getReference(); + if (!ref.isEmpty()) { + result = ref + " - " + result; + } + + scopes.put("title", result); + scopes.put("receivedDate", DateFormatUtils.format(email.getReceptionDate(), "dd/MM/yyyy HH:mm")); scopes.put("sender", email.getSender()); scopes.put("object", email.getObject()); - scopes.put("clientCode", email.getClient() == null ? "" : email.getClient().getCode()); - scopes.put("demandType", email.getDemandType() == null ? "" : email.getDemandType().getLabel()); - scopes.put("priority", email.getPriority() == null ? "" : email.getPriority().getLabel()); + scopes.put("client", email.getClient()); + scopes.put("demandType", email.getDemandType()); + scopes.put("priority", email.getPriority()); scopes.put("projectReference", email.getProjectReference()); scopes.put("companyReference", email.getCompanyReference()); - scopes.put("waitingState", email.getWaitingState() == null ? "" : email.getWaitingState().getLabel()); - scopes.put("status", email.getDemandStatus() == null ? "" : email.getDemandStatus().getLabel()); - scopes.put("takenBy", email.getTakenBy() == null ? "" : (email.getTakenBy().getLogin() + " " + email.getTakenBy().getFirstName() + " " + email.getTakenBy().getLastName())); - scopes.put("date", DateFormatUtils.format(serviceContext.getNow(), "dd/MM/yyyy")); + scopes.put("waitingState", email.getWaitingState()); + scopes.put("status", email.getDemandStatus()); + scopes.put("takenBy", email.getTakenBy() == null ? "" : userDecorator.toString(email.getTakenBy())); + scopes.put("message", email.getComment()); + scopes.put("date", DateFormatUtils.format(serviceContext.getNow(), "dd/MM/yyyy HH:mm")); + scopes.put("firstOpeningUser", email.getFirstOpeningUser() == null ? + "" : userDecorator.toString(email.getFirstOpeningUser())); + scopes.put("firstOpeningDate", email.getFirstOpeningDate() == null ? + "" : DateFormatUtils.format(email.getFirstOpeningDate(), "dd/MM/yyyy HH:mm")); + + scopes.put("lastModificationUser", email.getLastModificationUser() == null ? + "" : userDecorator.toString(email.getLastModificationUser())); + scopes.put("lastModificationDate", email.getLastModificationDate() == null ? + "" : DateFormatUtils.format(email.getLastModificationDate(), "dd/MM/yyyy HH:mm")); + + scopes.put("lastAttachmentOpeningInFolderUser", email.getLastAttachmentOpeningInFolderUser() == null ? + "" : userDecorator.toString(email.getLastAttachmentOpeningInFolderUser())); + scopes.put("lastAttachmentOpeningInFolderDate", email.getLastAttachmentOpeningInFolderDate() == null ? + "" : DateFormatUtils.format(email.getLastAttachmentOpeningInFolderDate(), "dd/MM/yyyy HH:mm")); + + scopes.put("hasRangeRows", email.sizeRangeRow() > 0); + scopes.put("rangeRows", email.getRangeRow()); + // find template InputStream is = EmailServiceImpl.class.getResourceAsStream("/pdf/demande.mustache"); MustacheFactory mf = new DefaultMustacheFactory(); Modified: trunk/faxtomail-service/src/main/resources/pdf/demande.mustache =================================================================== --- trunk/faxtomail-service/src/main/resources/pdf/demande.mustache 2014-09-29 09:34:03 UTC (rev 647) +++ trunk/faxtomail-service/src/main/resources/pdf/demande.mustache 2014-09-29 11:39:04 UTC (rev 648) @@ -8,60 +8,111 @@ position: running(footer); font-size: small; } + table { + margin-bottom: 20px; + } @page { @bottom-center { content: element(footer) } } </style> </head> <body> - <h1 class="title">Détail de la demande</h1> + <h1 class="title">Détail de l'élément {{title}}</h1> <table> <tr> - <td>Objet :</td> - <td>{{object}}</td> + <td>Reçu le :</td> + <td colspan="3">{{receivedDate}}</td> </tr> <tr> - <td>Reçue le :</td> - <td>{{receivedDate}}</td> + <td>Emetteur :</td> + <td colspan="3">{{sender}}</td> </tr> <tr> - <td>Emetteur :</td> - <td>{{sender}}</td> + <td>Objet :</td> + <td colspan="3">{{object}}</td> </tr> <tr> <td>Client :</td> - <td>{{client}}</td> + <td colspan="3">{{#client}}{{client.code}} ({{client.brand}}){{/client}}</td> </tr> <tr> <td>Type :</td> - <td>{{demandType}}</td> + <td colspan="3">{{demandType.label}}</td> </tr> <tr> <td>Priorité :</td> - <td>{{priority}}</td> + <td colspan="3">{{priority.label}}</td> </tr> <tr> <td>Référence chantier :</td> - <td>{{projectReference}}</td> + <td colspan="3">{{projectReference}}</td> </tr> <tr> <td>Notre référence :</td> - <td>{{companyReference}}</td> + <td colspan="3">{{companyReference}}</td> </tr> <tr> <td>Etat d'attente :</td> - <td>{{waitingState}}</td> + <td colspan="3">{{waitingState.label}}</td> </tr> <tr> <td>Statut :</td> - <td>{{status}}</td> + <td colspan="3">{{status.label}}</td> </tr> <tr> <td>Pris par :</td> - <td>{{takenBy}}</td> + <td colspan="3">{{takenBy}}</td> </tr> + <tr> + <td>Première ouverture par :</td> + <td>{{firstOpeningUser}}</td> + <td>le :</td> + <td>{{firstOpeningDate}}</td> + </tr> + <tr> + <td>Dernière modification par :</td> + <td>{{lastModificationUser}}</td> + <td>le :</td> + <td>{{lastModificationDate}}</td> + </tr> + <tr> + <td>Dernière ouverture de pièce jointe par :</td> + <td>{{lastAttachmentOpeningInFolderUser}}</td> + <td>le :</td> + <td>{{lastAttachmentOpeningInFolderDate}}</td> + </tr> + <tr> + <td>Message :</td> + <td colspan="3">{{message}}</td> + </tr> </table> + + {{#hasRangeRows}} + <table> + <caption></caption> + <thead> + <tr> + <th>Gammes</th> + <th>N° commande/devis</th> + <th>Quantitié de devis</th> + <th>Quantitié de PF</th> + <th>Quantitié de SAV</th> + </tr> + </thead> + <tbody> + {{#rangeRows}} + <tr> + <td>{{range.label}}</td> + <td>{{commandNumber}}</td> + <td>{{quotationQuantity}}</td> + <td>{{productQuantity}}</td> + <td>{{savQuantity}}</td> + </tr> + {{/rangeRows}} + </tbody> + </table> + {{/hasRangeRows}} <div class="footer"> Date d'impression : {{date}} Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUI.css =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUI.css 2014-09-29 09:34:03 UTC (rev 647) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUI.css 2014-09-29 11:39:04 UTC (rev 648) @@ -254,7 +254,7 @@ } #lastAttachmentOpeningPanel { - visible: { model.getLastAttachmentOpeningInThisFolderUser() != null }; + visible: { model.getLastAttachmentOpeningInFolderUser() != null }; } #lastAttachmentOpeningLabel { @@ -266,7 +266,7 @@ } #lastAttachmentOpenedByField { - text: { handler.decorateUser(model.getLastAttachmentOpeningInThisFolderUser(), true) }; + text: { handler.decorateUser(model.getLastAttachmentOpeningInFolderUser(), true) }; } #lastAttachmentOpeningDateLabel { @@ -274,7 +274,7 @@ } #lastAttachmentOpeningDateField { - text: { handler.decorate(model.getLastAttachmentOpeningInThisFolderDate()) }; + text: { handler.decorate(model.getLastAttachmentOpeningInFolderDate()) }; } #leftVerticalSplitPanel { Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java 2014-09-29 09:34:03 UTC (rev 647) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java 2014-09-29 11:39:04 UTC (rev 648) @@ -107,12 +107,6 @@ protected final List<RangeRowModel> validRangeRowModels = new ArrayList<RangeRowModel>(); - protected History firstOpeningHistory; - - protected History lastModificationHistory; - - protected History lastAttachmentOpeningInThisFolderHistory; - protected int quotationNb; protected int pfNb; @@ -151,14 +145,14 @@ public DemandeUIModel() { super(fromBeanBinder, toBeanBinder); - addPropertyChangeListener(Email.PROPERTY_HISTORY, new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - findFirstOpeningHistory(); - findLastModificationHistory(); - findLastAttachmentOpeningInThisFolderHistory(); - } - }); +// addPropertyChangeListener(Email.PROPERTY_HISTORY, new PropertyChangeListener() { +// @Override +// public void propertyChange(PropertyChangeEvent evt) { +// findFirstOpeningHistory(); +// findLastModificationHistory(); +// findLastAttachmentOpeningInThisFolderHistory(); +// } +// }); addPropertyChangeListener(Email.PROPERTY_RANGE_ROW, new PropertyChangeListener() { @Override @@ -504,27 +498,7 @@ } public String getReference() { - List<String> reference = new ArrayList<String>(); - if (StringUtils.isNotBlank(getCompanyReference())) { - reference.add(getCompanyReference()); - } - Collection<RangeRow> rangeRow = getRangeRow(); - if (rangeRow != null) { - Collection<String> commandNumbers = Collections2.transform(rangeRow, new Function<RangeRow, String>() { - @Override - public String apply(RangeRow input) { - return input != null ? input.getCommandNumber() : ""; - } - }); - Collections2.filter(commandNumbers, new Predicate<String>() { - @Override - public boolean apply(String input) { - return StringUtils.isNotBlank(input); - } - }); - reference.addAll(commandNumbers); - } - return StringUtils.join(reference, ", "); + return editObject.getReference(); } public void setHistory(List<History> history) { @@ -540,103 +514,22 @@ return editObject.sizeHistory(); } - public void findFirstOpeningHistory() { - History result = null; - Date date = null; - Collection<History> histories = getHistory(); - if (histories != null) { - for (History history : histories) { - if (HistoryType.OPENING.equals(history.getType())) { - if (date == null || date.after(history.getModificationDate())) { - date = history.getModificationDate(); - result = history; - } - } - } - } - firstOpeningHistory = result; - } - - public void findLastModificationHistory() { - History result = null; - Date date = null; - Collection<History> histories = getHistory(); - if (histories != null) { - for (History history : histories) { - if (history.getType().isConsideredAsModification()) { - if (date == null || date.before(history.getModificationDate())) { - date = history.getModificationDate(); - result = history; - } - } - } - } - lastModificationHistory = result; - } - - public void findLastAttachmentOpeningInThisFolderHistory() { - History result = null; - Collection<History> histories = getHistory(); - - if (histories != null) { - History transmissionHistory = null; - for (History history : histories) { - Date modificationDate = history.getModificationDate(); - if (HistoryType.ATTACHMENT_OPENING.equals(history.getType())) { - if ((transmissionHistory == null - || transmissionHistory.getModificationDate().before(modificationDate)) - && (result == null - || result.getModificationDate().before(modificationDate))) { - result = history; - } - - } else if (HistoryType.TRANSMISSION.equals(history.getType())) { - if (transmissionHistory == null - || transmissionHistory.getModificationDate().before(modificationDate)) { - - transmissionHistory = history; - if (result != null && result.getModificationDate().before(transmissionHistory.getModificationDate())) { - result = null; - } - } - } - } - } - lastAttachmentOpeningInThisFolderHistory = result; - } - - public History getFirstOpeningHistory() { - return firstOpeningHistory; - } - public FaxToMailUser getFirstOpeningUser() { - History history = getFirstOpeningHistory(); - return history != null ? history.getFaxToMailUser() : null; + return editObject.getFirstOpeningUser(); } public Date getFirstOpeningDate() { - History history = getFirstOpeningHistory(); - return history != null ? history.getModificationDate() : null; + return editObject.getFirstOpeningDate(); } - public History getLastModificationHistory() { - return lastModificationHistory; - } - public FaxToMailUser getLastModificationUser() { - History history = getLastModificationHistory(); - return history != null ? history.getFaxToMailUser() : null; + return editObject.getLastModificationUser(); } public Date getLastModificationDate() { - History history = getLastModificationHistory(); - return history != null ? history.getModificationDate() : null; + return editObject.getLastModificationDate(); } - public History getLastAttachmentOpeningInThisFolderHistory() { - return lastAttachmentOpeningInThisFolderHistory; - } - /** * Utilisé depuis la liste des mails seulement pour des raisons de performances sans charger * l'historique. @@ -653,14 +546,12 @@ editObject.setLastAttachmentOpener(lastAttachmentOpener); } - public FaxToMailUser getLastAttachmentOpeningInThisFolderUser() { - History history = getLastAttachmentOpeningInThisFolderHistory(); - return history != null ? history.getFaxToMailUser() : null; + public FaxToMailUser getLastAttachmentOpeningInFolderUser() { + return editObject.getLastAttachmentOpeningInFolderUser(); } - public Date getLastAttachmentOpeningInThisFolderDate() { - History history = getLastAttachmentOpeningInThisFolderHistory(); - return history != null ? history.getModificationDate() : null; + public Date getLastAttachmentOpeningInFolderDate() { + return editObject.getLastAttachmentOpeningInFolderDate(); } @Override Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/ButtonEmailGroup.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/ButtonEmailGroup.java 2014-09-29 09:34:03 UTC (rev 647) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/ButtonEmailGroup.java 2014-09-29 11:39:04 UTC (rev 648) @@ -43,7 +43,7 @@ public ButtonEmailGroup() { setToolTipText(t("faxtomail.demandGroup.action.tip")); - int demandNb = popup.getModel().sizeGroupedDemandes() + 1; + int demandNb = popup.getModel().sizeGroupedDemandes(); setText(t("faxtomail.demandGroup.text", demandNb)); popup.getModel().addPropertyChangeListener(DemandeUIModel.PROPERTY_GROUPED_DEMANDES, new PropertyChangeListener() { @@ -52,7 +52,7 @@ Collection<DemandeUIModel> demands = (Collection<DemandeUIModel>) evt.getNewValue(); if (demands != null) { int size = demands.size(); - setText(t("faxtomail.demandGroup.text", size + 1)); + setText(t("faxtomail.demandGroup.text", size)); } } }); Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/history/HistoryListUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/history/HistoryListUIHandler.java 2014-09-29 09:34:03 UTC (rev 647) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/history/HistoryListUIHandler.java 2014-09-29 11:39:04 UTC (rev 648) @@ -62,7 +62,7 @@ static { n("faxtomail.demande.receptionDate.label"); - n("faxtomail.demande.ediCodeNumber.label"); + n("faxtomail.demande.ediError.label"); n("faxtomail.demande.projectReference.label"); n("faxtomail.demande.sender.label"); n("faxtomail.demande.fax.label");
participants (1)
-
kmorin@users.forge.codelutin.com