-0.1.9
--banki integráció
--távlati: utalás előkészítése
+- távlati: autorizáció
+- távlati: dokumentum kezelés szétválasztása
+- távlati: utalás előkészítése
+- távlati: banki integráció
0.1.8
- A "Számla kiegyenlítés" számla sorszám alapú kereséssel indul, találat esetén megjelenik egy űrlap:
- számla részletek megejelenítése: határidő, összeg, devizanem
- - mekkora pénzmozgás volt, milyen devizanemben, illetve felvehető új néznmozgás
+ - mekkora pénzmozgás volt, milyen devizanemben, illetve felvehető új pénzmozgás
- az űrlapon a csatolt számlakép megjelenítése
- 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
-- projekt ID-t regexp-el ki kell szedni, ha több van egy listát feldobni
+* 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?
-- távlati: autorizáció
-- távlati: dokumentum kezelés szétválasztása
0.1.7
* A számla importhoz tartozó menüpontok jelezzék, ha van feladat
if (filter.isPaid()) {
predicates.add(cb.isTrue(root.get("paid")));
+ } else {
+ predicates.add(cb.isFalse(root.get("paid")));
}
if (Objects.nonNull(filter.getPaymentDeadLineFrom())) {
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
+import java.util.Optional;
public interface ProjectRepository extends JpaRepository<Project, Long>, ProjectRepositorySearch {
List<Project> findByHumanIdLikeOrderByHumanIdDesc(String yearSearch);
+ Optional<Project> findByHumanId(String humanId);
+
Project findFirstByHumanIdLikeOrderByHumanIdDesc(String yearSearch);
}
--- /dev/null
+package hu.user.lis.ui.converter;
+
+import org.apache.commons.lang3.StringUtils;
+import org.zkoss.bind.BindContext;
+import org.zkoss.bind.Converter;
+import org.zkoss.zul.Listcell;
+
+import java.util.List;
+
+public class ListStringToStringConverter implements Converter<String, List<String>, Listcell> {
+ @Override
+ public String coerceToUi(List<String> list, Listcell listCell, BindContext bindContext) {
+ return StringUtils.join(list, ", ");
+ }
+
+ @Override
+ public List<String> coerceToBean(String data, Listcell listCell, BindContext bindContext) {
+ return null;
+ }
+}
import hu.user.lis.db.Invoice;
import hu.user.lis.db.Partner;
import hu.user.lis.db.Project;
+import hu.user.lis.db.repository.ProjectRepository;
import hu.user.lis.ui.data.PartnersDataModel;
import hu.user.lis.ui.editor.common.Editors;
import lombok.Getter;
import lombok.extern.log4j.Log4j2;
import org.zkoss.bind.annotation.*;
import org.zkoss.zk.ui.Component;
+import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.select.annotation.WireVariable;
+import org.zkoss.zk.ui.util.Notification;
+import java.util.List;
import java.util.Objects;
+import java.util.Optional;
@Log4j2
public class ImportInvoiceAssignEditorModel extends InvoiceEditorModel {
@WireVariable
- PartnersDataModel partnersDataModel;
+ private PartnersDataModel partnersDataModel;
+
+ @WireVariable
+ private ProjectRepository projectRepository;
@Getter
@Setter
- boolean canEditPartner;
+ private boolean canEditPartner;
+
+ @Getter
+ private List<String> projectSuggestions;
@Init
@Override
public void init() {
super.init();
+ projectSuggestions = (List<String>) Executions.getCurrent().getArg().get("projectSuggestions");
canEditPartner = Objects.isNull(getFormDocument().getPartner().getId());
}
Partner entity = partnersDataModel.clone(getFormDocument().getPartner());
Editors.doEdit(Editors.PARTNER, entity, modifiedEntity -> getFormDocument().setPartner(modifiedEntity));
}
+
+ @Command
+ public void selectSuggestedProject(@BindingParam("humanId") String humanId) {
+ Optional<Project> opHumanId = projectRepository.findByHumanId(humanId);
+ if (opHumanId.isPresent()) {
+ getFormDocument().setProject(opHumanId.get());
+ getEntitySelectorRouter().configureSelector(Project.class, getFormDocument(), "project");
+ validate();
+ } else {
+ Notification.show("Nincs projekt ezen a számon: " + humanId, true);
+ }
+ }
+
}
}
public static <E> void doEdit(String page, E entity, E original, EditCompleted<E> editCompleted) {
- Map<String, E> arg;
+ Map<String, Object> arg;
if (Objects.isNull(entity)) {
//header double click
return;
} else {
arg = ImmutableMap.of("formDocument", entity, "origDocument", original);
}
+
+ doEdit(page, arg, editCompleted);
+ }
+
+ public static <E> void doEdit(String page, Map<String, Object> arg, EditCompleted<E> editCompleted) {
Window editorWindow = (Window) Executions.createComponents(page, null, arg);
editorWindow.addEventListener("onClose", e -> {
if (e.getData() != null) {
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.zk.ui.select.annotation.WireVariable;
import org.zkoss.zkplus.spring.DelegatingVariableResolver;
+import java.util.List;
+import java.util.Map;
+
@Getter
@Log4j2
@VariableResolver(DelegatingVariableResolver.class)
@Command
public void onHandleTask() {
Invoice entity = (Invoice) getSelectedEntity().get("invoiceEntity");
- Editors.doEdit(Editors.IMPORT_INVOICE_ASSIGN, entity, modifiedEntity -> {
+ List<String> projectSuggestions = (List<String>) getSelectedEntity().get("projectSuggestions");
+ Map<String, Object> arg = ImmutableMap.of("formDocument", entity, "projectSuggestions", projectSuggestions);
+ Editors.doEdit(Editors.IMPORT_INVOICE_ASSIGN, arg, (EditCompleted<Invoice>) modifiedEntity -> {
assignInvoicesDataModel.completeTask(getSelectedEntity(), ImmutableMap.of("invoiceEntity", modifiedEntity));
onRefresh();
});
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.select.annotation.WireVariable;
+import org.zkoss.zk.ui.util.Notification;
import org.zkoss.zul.ListModelList;
import java.util.List;
List<Invoice> invoices = invoiceRepository.findByHumanId(invoiceNumber);
if (invoices.isEmpty()) {
setPartnerRequired(false);
- //show message
+ Notification.show("Nem található számla: " + invoiceNumber, true);
} else {
if (invoices.size() == 1) {
setPartnerRequired(false);
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.select.annotation.WireVariable;
-import java.util.Objects;
+import java.util.Arrays;
+import java.util.List;
import static hu.user.lis.ui.data.common.CachedDataModel.ASCENDING;
import static hu.user.lis.ui.data.common.CachedDataModel.NATURAL;
public class InvoicesViewModel extends EntityViewModel<Invoice> implements EventListener<Event> {
@Getter
private final InvoiceFilter invoiceFilter = InvoiceFilter.builder().incoming(true).build();
+ List<String> refreshTriggerProperties = Arrays.asList("paymentDeadLineFrom", "paymentDeadLineTo", "paid", "incoming");
@WireVariable
private EventBus eventBus;
@Getter
eventBus.registerForBinding(this);
refresh();
addColumns(ImmutableMap.of(
- "partner.name", ASCENDING,
+ "partner.humanId", NATURAL,
+ "partner.name", NATURAL,
"partner.vatNr", NATURAL,
"project.name", NATURAL,
- "paymentDeadline", NATURAL,
+ "paymentDeadline", ASCENDING,
"grossAmount", NATURAL,
"currency", NATURAL,
"incoming", NATURAL
public void setIncoming(@BindingParam("incoming") boolean value) {
invoiceFilter.setIncoming(value);
BindUtils.postNotifyChange(null, null, invoiceFilter, "incoming");
- refresh();
}
@Command
public void onEvent(Event evt) throws Exception {
if (evt instanceof PropertyChangeEvent) {
PropertyChangeEvent propertyEvent = (PropertyChangeEvent) evt;
- if (Objects.nonNull(propertyEvent.getBase()) && propertyEvent.getBase().equals(this)) {
- if ("invoiceFilter.project".equals(propertyEvent.getProperty()) ||
- "invoiceFilter.partner".equals(propertyEvent.getProperty())) {
- refresh();
- }
+ if (invoiceFilter.equals(propertyEvent.getBase())) {
+ refresh();
}
}
<library-property>
<name>org.zkoss.theme.preferred</name>
<value>silvertail</value>
+ <!-- <value>sapphire</value>-->
+ <!-- <value>atlantic</value>-->
</library-property>
<library-property>
<name>org.zkoss.zul.grid.rod</name>
<hlayout>
<label value="Partner"/>
<entity-selector entity="Partner"/>
- <button label="Bezár" onClick="@command('onEditPartner')"
+ <button label="Szerkesztés" iconSclass="z-icon-edit"
+ onClick="@command('onEditPartner')"
disabled="@bind(not vm.canEditPartner)"/>
</hlayout>
<vlayout hflex="true">
<label value="Projekt"/>
<entity-selector entity="Project" hflex="true"/>
+ <div children="@load(vm.projectSuggestions)">
+ <template name="children">
+ <a label="@load(each)"
+ onClick="@command('selectSuggestedProject', humanId=each)"/>
+ </template>
+ </div>
<label value="Leírás"/>
<textbox hflex="true" instant="true"
<hlayout>
<label value="Partner"/>
<entity-selector entity="Partner"/>
- <button label="Bezár" onClick="@command('onEditPartner')"
+ <button label="Szerkesztés" iconSclass="z-icon-edit"
+ onClick="@command('onEditPartner')"
disabled="@bind(not vm.canEditPartner)"/>
</hlayout>
<listitem>
<listcell label="@load(each['invoiceEntity'].humanId)"/>
<listcell label="@load(each['invoiceEntity'].partner.name)"/>
- <listcell label="@load(each['projectSuggestions'])"/>
+ <listcell
+ label="@load(each['projectSuggestions']) @converter('hu.user.lis.ui.converter.ListStringToStringConverter')"/>
</listitem>
</template>
</listbox>
<label value="Fizetési határidő"/>
<separator orient="vertical"/>
<datebox instant="true" format="yyyy. MM. dd."
- value="@bind(vm.invoiceFilter.paymentDeadLineFrom)"
- onChange="@command('refresh')"/>
+ value="@bind(vm.invoiceFilter.paymentDeadLineFrom)"/>
<label value="-"/>
<datebox instant="true" format="yyyy. MM. dd."
- value="@bind(vm.invoiceFilter.paymentDeadLineTo)"
- onChange="@command('refresh')"/>
+ value="@bind(vm.invoiceFilter.paymentDeadLineTo)"/>
<space bar="true"/>
- <toolbarbutton mode="toggle" iconSclass="z-icon-credit-card" label="Teljesített fizetés"
- checked="@load(!vm.invoiceFilter.incoming)"
- onClick="@command('setIncoming', incoming=false)"/>
+ <toolbarbutton mode="toggle" iconSclass="z-icon-credit-card" label="Fizetve"
+ checked="@bind(vm.invoiceFilter.paid)"/>
<!-- <toolbarbutton iconSclass="z-icon-search" label="Szűrés"-->
<!-- onClick="@command('search')"/>-->
autopaging="true" mold="paging" pagingPosition="top" multiple="false"
onSelect="@command('onListSelection')" onDoubleClick="@command('onEdit')">
<listhead sizable="true">
+ <listheader label="Sorszám" sort="auto(partner.humanId)" align="left"
+ sortDirection="@load(vm.cols['partner.name'].sortDirection)"/>
<listheader label="Partner név" sort="auto(partner.name)" align="left"
sortDirection="@load(vm.cols['partner.name'].sortDirection)"/>
<listheader label="Partner adószám" sort="auto(partner.vatNr)" align="left"
<listheader label="Bruttó összeg" sort="auto(grossAmount)" align="right"
style="text-align: center"
sortDirection="@load(vm.cols['grossAmount'].sortDirection)"/>
- <listheader label="Bruttó összeg" sort="auto(currency)" align="left"
+ <listheader label="Pénznem" sort="auto(currency)" align="left"
sortDirection="@load(vm.cols['currency'].sortDirection)"/>
<listheader label="Költség/Bevétel" sort="auto(incoming)" align="left"
sortDirection="@load(vm.cols['incoming'].sortDirection)"/>
</listhead>
<template name="model">
<listitem>
+ <listcell label="@load(each.humanId)"/>
<listcell label="@load(each.partner.name)"/>
<listcell label="@load(each.partner.vatNr)"/>
<listcell label="@load(each.project.name)"/>
+.z-notification-content {
+ font-size: 20px;
+ width: auto;
+ min-height: 100px;
+ padding-top: 30px;
+}
+
.z-grid-emptybody td {
/* font-size: 2em;*/
font-style: normal;
import hu.user.lis.service.nav.TaxOfficeInvoiceService;
import hu.user.lis.service.nav.TaxOfficeXmlConverter;
import hu.user.lis.workflow.properties.WorkflowProperties;
+import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.RandomUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.stream.Collectors;
import java.util.stream.Stream;
+@Log4j2
@Service
public class IncomingInvoiceFetcherService {
private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
public List<String> searchProjectId(String invoiceXML) {
List<String> result = new ArrayList<>();
- Pattern compiledPattern = Pattern.compile(workflowProperties.getImportInvoice().getProjectIdPattern());
- Matcher m = compiledPattern.matcher(invoiceXML);
- while (m.find()) {
- result.add(m.group());
+ try {
+ Pattern compiledPattern = Pattern.compile(workflowProperties.getImportInvoice().getProjectIdPattern());
+ Matcher m = compiledPattern.matcher(invoiceXML);
+ while (m.find()) {
+ result.add(m.group());
+ }
+ } catch (Exception e) {
+ log.error(e.getMessage());
}
return result;
}