- távlati: dokumentum kezelés szétválasztása
- távlati: utalás előkészítése
- távlati: banki integráció
+- távlati: táblák exportja
+
+Számla import
+-------------
+Javításra váró számlák lista kezelése: az elvetett vagy meg nem érkezett számlákat egy külön listába kell tenni.
+
+Az import folyamat számlái és a tervezett számlák hogyan kapcsolódjanak össze?
+Projektszámok: 2023-0013
+
+
+Számla kiegyenlítés
+-------------
+teszt: 9090010764
+
+
+Összes számla
+-------------
+A kiegyenlítés hogyan kezelje a különböző devizákat?
+
+
+
+F: egy számlához több fájl csatolása
+*F: a számla assign esetén ki kell választani a tervezett számlát, ha van
+*BUG: a rendezés elromlik a lista megnyitásakor
+*F: "Összes számla" szűrőnél lehessen kiválasztani a dátum típusát
+*F: A számla listán a funkciók: szerkesztés, másik projekthez csatolás, kiegyenlítés
+*F: számla kiegyenlítés bal oldala legyen olvashatóbb
+*F: a számla kiegyenlítés a számla listában is jelenjen meg
+*F: a számla kiegyenlítés: csak a bruttó legyen, csak akkor oké ha egyenlő, ha nagyobb akkor szól
+*F: a parkolóból lehessen eldobni végleg
+
0.1.8
- A "Számla kiegyenlítés" számla sorszám alapú kereséssel indul, találat esetén megjelenik egy űrlap:
* mivel tartozhat egy sorszám több számlához is, ezt kezelni kell
- A "Szállítói követelés követés" funkció a számlák listáját mutatja szűrve, azokat tartalmazza amik még nincsenek kiegyenlítve (külön a bejövö külön a kimenő)
- munkalap hiba javítása
+- NAV számla lekérdezés folytatólagossága (meg kell jegyezni, mi volt az utolsó elem), a kezdő dátum (napok száma) konfigurálható legyen?
* projekt ID-t regexp-el ki kell szedni, ha több van egy listát feldobni
invoiceHead/invoiceDetail/additionalInvoiceData
invoiceHead/invoiceDetail/conventionalInvoiceInfo/orderNumbers
invoiceHead/invoiceDetail/conventionalInvoiceInfo/contractNumbers
invoiceHead/invoiceDetail/conventionalInvoiceInfo/customerCompanyCodes
invoiceHead/invoiceDetail/conventionalInvoiceInfo/projectNumbers
-- NAV számla lekérdezés folytatólagossága (meg kell jegyezni, mi volt az utolsó elem), a kezdő dátum (napok száma) konfigurálható legyen?
0.1.7
* A számla importhoz tartozó menüpontok jelezzék, ha van feladat
JSONAssert.assertEquals(json1, json2, JSONCompareMode.LENIENT);
} catch (Throwable e) {
result = true;
- log.error(e);
+ //log.error(e);
}
}
return result;
boolean canEditPartner;
@Init
+ @Override
public void init() {
super.init();
canEditPartner = Objects.isNull(getFormDocument().getPartner().getId());
&& Objects.nonNull(entity.getFile());
}
+ @Override
@AfterCompose
public void onAfterCompose(@ContextParam(ContextType.VIEW) Component view) {
getEntitySelectorRouter().configureSelector(Project.class, getFormDocument(), "project");
@Command
public void onEditPartner() {
Partner entity = partnersDataModel.clone(getFormDocument().getPartner());
- Editors.doEdit(Editors.PARTNER, entity, modifiedEntity -> {
- getFormDocument().setPartner(modifiedEntity);
- });
+ Editors.doEdit(Editors.PARTNER, entity, modifiedEntity -> getFormDocument().setPartner(modifiedEntity));
}
@Command
Events.postEvent(new Event("onClose", target, null));
return;
}
- ImmutableMap<String, Object> args = ImmutableMap.of("approved", save == 2, "modifiedEntity", getFormDocument());
if (save == 1) {
Events.postEvent(new Event("onClose", target,
ImmutableMap.of("approved", false)));
return;
}
-
if (isSaveEnabled()) {
Events.postEvent(new Event("onClose", target,
ImmutableMap.of("approved", true, "modifiedEntity", getFormDocument())));
package hu.user.lis.ui.editor;
+import com.google.common.collect.ImmutableMap;
import hu.user.lis.db.Invoice;
import hu.user.lis.db.Partner;
import hu.user.lis.db.Project;
import org.zkoss.bind.annotation.*;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
+import org.zkoss.zk.ui.event.Event;
+import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zk.ui.util.Notification;
+import org.zkoss.zul.Window;
import java.util.List;
import java.util.Objects;
getEntitySelectorRouter().configureSelector(Project.class, getFormDocument(), "project");
validate();
} else {
- Notification.show("Nincs projekt ezen a számon: " + humanId, true);
+ Notification.show("Nincs projekt ezen a számon: " + humanId, null, null, null, 3000, true);
}
}
+ @Command
+ public void onCloseApproveWindow(@BindingParam("target") Window target, @BindingParam("save") int save) {
+ if (save == 0) {
+ Events.postEvent(new Event("onClose", target, null));
+ return;
+ }
+ if (save == 1) {
+ Events.postEvent(new Event("onClose", target, ImmutableMap.of("invalid", true)));
+ return;
+ }
+ if (isSaveEnabled()) {
+ Events.postEvent(new Event("onClose", target, ImmutableMap.of("modifiedEntity", getFormDocument())));
+ }
+ }
+
+
}
@WireVariable
EntitySelectorRouter entitySelectorRouter;
+ @Getter
+ @Setter
private boolean readonlyForm;
@Command
Map<String, Object> results = (Map<String, Object>) e.getData();
boolean approved = (boolean) results.get("approved");
Invoice modifiedEntity = (Invoice) results.get("modifiedEntity");
- //TODO move entity persistance to BPMN
if (approved) {
Partner partner = modifiedEntity.getPartner();
if (Objects.isNull(partner.getId())) {
import hu.user.lis.ui.Constants;
import hu.user.lis.ui.data.AssignInvoicesDataModel;
import hu.user.lis.ui.data.common.CachedSpringDataModel;
-import hu.user.lis.ui.editor.common.EditCompleted;
import hu.user.lis.ui.editor.common.Editors;
import hu.user.lis.ui.event.EventBus;
import hu.user.lis.ui.event.ProcessEventRouter;
import org.zkoss.bind.annotation.Destroy;
import org.zkoss.bind.annotation.Init;
import org.zkoss.json.JSONObject;
+import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zkplus.spring.DelegatingVariableResolver;
+import org.zkoss.zul.Window;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
@Getter
@Log4j2
public void onHandleTask() {
Invoice entity = (Invoice) getSelectedEntity().get("invoiceEntity");
List<String> projectSuggestions = (List<String>) getSelectedEntity().get("projectSuggestions");
- Map<String, Object> arg = ImmutableMap.of("formDocument", entity, "projectSuggestions", projectSuggestions);
- Editors.doShowEdit(Editors.IMPORT_INVOICE_ASSIGN, arg, (EditCompleted<Invoice>) modifiedEntity -> {
- assignInvoicesDataModel.completeTask(getSelectedEntity(), ImmutableMap.of("invoiceEntity", modifiedEntity));
- onRefresh();
+ Map<String, Object> args = ImmutableMap.of("formDocument", entity, "projectSuggestions", projectSuggestions);
+// Editors.doShowEdit(Editors.IMPORT_INVOICE_ASSIGN, args, (EditCompleted<Invoice>) modifiedEntity -> {
+// assignInvoicesDataModel.completeTask(getSelectedEntity(), ImmutableMap.of("invoiceEntity", modifiedEntity));
+// onRefresh();
+// });
+
+ Window editorWindow = (Window) Executions.createComponents(Editors.IMPORT_INVOICE_ASSIGN, null, args);
+ editorWindow.addEventListener("onClose", e -> {
+ if (Objects.nonNull(e.getData())) {
+ Map<String, Object> results = (Map<String, Object>) e.getData();
+ boolean invalid = (boolean) results.get("invalid");
+ Invoice modifiedEntity = (Invoice) results.get("modifiedEntity");
+ if (invalid) {
+ assignInvoicesDataModel.completeTask(getSelectedEntity(), ImmutableMap.of("invalid", true));
+ } else {
+ assignInvoicesDataModel.completeTask(getSelectedEntity(), ImmutableMap.of("invoiceEntity", modifiedEntity));
+ }
+ onRefresh();
+ }
});
+ editorWindow.doModal();
+ editorWindow.setFocus(true);
+
}
@Override
@Setter
private boolean newPaymentDisabled;
+
@Init
@Override
public void init() {
@NotifyChange("partnerRequired")
public void search() {
log.info("Searching for invoice {}", invoiceNumber);
+ if (formDocument != null && !formDocument.getHumanId().equals(invoiceNumber)) {
+ filterPartner = null;
+ setPartnerRequired(false);
+ }
hideEditor();
if (Objects.isNull(filterPartner)) {
List<Invoice> invoices = invoiceRepository.findByHumanId(invoiceNumber);
package hu.user.lis.ui.view;
import com.google.common.collect.ImmutableMap;
-import hu.user.lis.db.Invoice;
-import hu.user.lis.db.Partner;
-import hu.user.lis.db.Project;
+import hu.user.lis.db.*;
import hu.user.lis.db.repository.filter.InvoiceFilter;
import hu.user.lis.ui.Constants;
+import hu.user.lis.ui.data.InvoiceDataModel;
import hu.user.lis.ui.data.InvoicesDataModel;
import hu.user.lis.ui.data.common.CachedSpringDataModel;
+import hu.user.lis.ui.editor.common.Editors;
import hu.user.lis.ui.editor.selector.EntitySelectorRouter;
import hu.user.lis.ui.event.EventBus;
import hu.user.lis.ui.view.common.EntityViewModel;
public class InvoicesViewModel extends EntityViewModel<Invoice> implements EventListener<Event> {
@Getter
private final InvoiceFilter invoiceFilter = InvoiceFilter.builder().incoming(true).build();
+
@WireVariable
private EventBus eventBus;
+
@Getter
@WireVariable
private EntitySelectorRouter entitySelectorRouter;
+
@Getter
@WireVariable
private InvoicesDataModel invoicesDataModel;
+ @WireVariable
+ private InvoiceDataModel invoiceDataModel;
+
@Init
@Override
public void init() {
super.init();
eventBus.register(this);
eventBus.registerForBinding(this);
- refresh();
addColumns(ImmutableMap.of(
"partner.humanId", NATURAL,
"partner.name", NATURAL,
"currency", NATURAL,
"incoming", NATURAL
));
+ refresh();
}
@Override
// (this.equals(propertyEvent.getBase()) && propertyEvent.getProperty().startsWith("invoiceFilter")))
if (invoiceFilter.equals(propertyEvent.getBase())) {
log.info("Refresh needed, {} changed", propertyEvent.getProperty());
+
refresh();
}
}
log.info("Destroy {}", getClass().getSimpleName());
eventBus.unregister(this);
}
+
+ @Command
+ public void onEdit() {
+ Invoice invoice = getSelectedEntity();
+ if (invoice.isIncoming()) {
+ onEditIncoming();
+ } else {
+ onEditOutgoing();
+ }
+ }
+
+ public void onEditIncoming() {
+ IncomingInvoice selectedIncomingInvoice = (IncomingInvoice) getSelectedEntity();
+ IncomingInvoice entity = invoiceDataModel.clone(selectedIncomingInvoice);
+ Editors.doEdit(Editors.INCOMING_INVOICE, entity, selectedIncomingInvoice, modifiedEntity -> {
+ invoiceDataModel.save(modifiedEntity);
+ refresh();
+ });
+ }
+
+ public void onEditOutgoing() {
+ OutgoingInvoice selectedOutgoingInvoice = (OutgoingInvoice) getSelectedEntity();
+ OutgoingInvoice entity = invoiceDataModel.clone((OutgoingInvoice) getSelectedEntity());
+ Editors.doEdit(Editors.OUTGOING_INVOICE, entity, selectedOutgoingInvoice, modifiedEntity -> {
+ invoiceDataModel.save(modifiedEntity);
+ refresh();
+ });
+ }
+
}
<south border="none" flex="true" style="text-align: right; padding: 10px;">
<hlayout>
<button id="cancel" label="Bezár"
- onClick="@command('onCloseWindow', target=invoiceAssignPopup, save=false)"/>
- <button id="submit" label="Mentés"
- onClick="@command('onCloseWindow', target=invoiceAssignPopup, save=true)"
+ onClick="@command('onCloseApproveWindow', target=invoiceAssignPopup, save=0)"/>
+ <button id="reject" label="Hibás" style="border-color: red"
+ onClick="@command('onCloseApproveWindow', target=invoiceAssignPopup, save=1)"/>
+ <button id="submit" label="Mentés" style="border-color: green"
+ onClick="@command('onCloseApproveWindow', target=invoiceAssignPopup, save=2)"
disabled="@bind(not vm.saveEnabled)"/>
</hlayout>
</south>
</hlayout>
<label value="Tervezett"/>
<checkbox mold="switch" checked="@bind(vm.formDocument.planned)" disabled="@bind(vm.readonlyForm)"/>
- <label value="Rendezve"/>
+ <label value="Fizetve"/>
<checkbox mold="switch" checked="@bind(vm.formDocument.paid)" disabled="@bind(vm.readonlyForm)"/>
</vlayout>
</tabpanel>
onClick="@command(vm.selectPage('~./invoices.zul'))"/>
<menuitem iconSclass="z-icon-credit-card" label="Számla kiegyenlítés"
onClick="@command(vm.selectPage('~./invoice-payment.zul'))"/>
- <menuitem iconSclass="z-icon-exchange" label="Követelés követés"
- onClick="@command('onInvoiceDues')"/>
+ <menu iconSclass="z-icon-exchange" label="Követelés követés">
+ <menupopup>
+ <menuitem label="Vevő"/>
+ <menuitem label="Szállító"/>
+ </menupopup>
+ </menu>
<menuseparator/>
<menu iconSclass="z-icon-tasks" label="Számla iktatás"
sclass="@bind(vm.importInvoiceMenuClassName)">
<toolbar>
<label value="Számla sorszáma"/>
<separator orient="vertical"/>
- <textbox value="@bind(vm.invoiceNumber)" onChange="@command('search')" onOK="@command('search')"/>
+ <textbox value="@bind(vm.invoiceNumber)"/>
<label value="Partner" visible="@bind(vm.partnerRequired)"/>
<separator orient="vertical" visible="@bind(vm.partnerRequired)"/>
<selectbox model="@bind(vm.partners)"
selectedIndex="@bind(vm.filterPartner) @converter(vm.partnerConverter)"
- onSelect="@command('search')"
visible="@bind(vm.partnerRequired)">
<template name="model">
${each.name}
</template>
</selectbox>
+
+ <button iconSclass="z-icon-search" onClick="@command('search')"/>
</toolbar>
</north>
<center border="none" hflex="true" vflex="true">