+0.1.9
+-banki integráció
+-távlati: utalás előkészítése
+
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
+ - 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
-- ömlesztve: kimenő számlák: mi nem lett kifizetve, partner
-- számla ki lett e fizetve (bejövő, kimenő)
-
- 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
-- 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?
-- autorizáció
-- dokumentum kezelés szétválasztá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?
+- 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
DOCKER
-docker run -itd --name lis --privileged=true -p 50000:50000 -e LICENSE=accept -e DB2INSTANCE=db2admin -e DB2INST1_PASSWORD=password -e DBNAME=lis -e PERSISTENT_HOME=false -v /Docker:/database ibmcom/db2
+docker pull ibmcom/db2
+docker run -itd --name ibmdb2 --privileged=true -p 50000:50000 -e LICENSE=accept -e DB2INSTANCE=db2admin -e DB2INST1_PASSWORD=password -e DBNAME=lis -e PERSISTENT_HOME=false -v /docker/ibmdb2:/database ibmcom/db2
docker logs -f lis
docker exec -it lis bash
docker stop lis
Move data
----------
-https://community.ibm.com/community/user/datamanagement/discussion/db2-docker-persistent-volume
\ No newline at end of file
+https://community.ibm.com/community/user/datamanagement/discussion/db2-docker-persistent-volume
+
+DB2 SQL
+ALTER TABLE "tableName" ALTER COLUMN "columnName" RESTART WITH <new index value>
(id, name, vat_nr, active)
VALUES
(1, 'NYÍRŐ', '00000000-00-0', 1),
- (2, 'KOLOS', '00000000-00-0', 1);
+ (2, 'KOLOS', '00000001-00-0', 1);
INSERT INTO PROJECT_STATUS
-- // add partner for invoice import test
-- Migration SQL that makes the change goes here.
-INSERT INTO PARTNER(name, vat_nr, address, active)
-VALUES('Értékesítő Kft', '99999999-2-41', '1234 Budapest, Hármas utca 1', 1);
+INSERT INTO PARTNER(id, name, vat_nr, address, active)
+VALUES(3, 'Értékesítő Kft', '99999999-2-41', '1234 Budapest, Hármas utca 1', 1);
-- //@UNDO
-- SQL to undo the change goes here.
import hu.user.lis.db.Invoice;
import org.springframework.data.jpa.repository.JpaRepository;
-public interface InvoiceRepository extends JpaRepository<Invoice, Long> {
+public interface InvoiceRepository extends JpaRepository<Invoice, Long>, InvoiceRepositorySearch {
}
--- /dev/null
+package hu.user.lis.db.repository;
+
+import hu.user.lis.db.Invoice;
+import hu.user.lis.db.repository.filter.InvoiceFilter;
+
+import java.util.List;
+
+public interface InvoiceRepositorySearch {
+ List<Invoice> search(InvoiceFilter filter);
+
+ long count(InvoiceFilter filter);
+}
--- /dev/null
+package hu.user.lis.db.repository;
+
+import hu.user.lis.db.Invoice;
+import hu.user.lis.db.repository.filter.InvoiceFilter;
+import org.springframework.data.jpa.repository.query.QueryUtils;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.TypedQuery;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+@Repository
+public class InvoiceRepositorySearchImpl implements InvoiceRepositorySearch {
+ @PersistenceContext
+ EntityManager entityManager;
+
+ Predicate[] getPredicates(CriteriaBuilder cb, Root<Invoice> root, InvoiceFilter filter) {
+ List<Predicate> predicates = new ArrayList<>();
+
+
+ if (Objects.nonNull(filter.getPartner())) {
+ predicates.add(cb.equal(root.get("partner"), filter.getPartner()));
+ }
+
+ if (Objects.nonNull(filter.getProject())) {
+ predicates.add(cb.equal(root.get("project"), filter.getProject()));
+ }
+
+ if (filter.isIncoming()) {
+ predicates.add(cb.isTrue(root.get("incoming")));
+ }
+
+ if (filter.isSettled()) {
+ //TODO add field
+ predicates.add(cb.isTrue(root.get("settled")));
+ }
+
+ if (Objects.nonNull(filter.getPaymentDeadLineFrom()) || Objects.nonNull(filter.getPaymentDeadLineTo())) {
+ //TODO check
+ predicates.add(cb.between(root.get("deadline"), filter.getPaymentDeadLineFrom(), filter.getPaymentDeadLineTo()));
+ }
+
+ return predicates.toArray(new Predicate[]{});
+ }
+
+ @Override
+ public List<Invoice> search(InvoiceFilter filter) {
+ CriteriaBuilder cb = entityManager.getCriteriaBuilder();
+ CriteriaQuery<Invoice> cq = cb.createQuery(Invoice.class);
+ Root<Invoice> root = cq.from(Invoice.class);
+
+ cq.where(getPredicates(cb, root, filter));
+ cq.orderBy(QueryUtils.toOrders(filter.getPageable().getSort(), root, cb));
+ TypedQuery<Invoice> query = entityManager.createQuery(cq);
+ query.setMaxResults(filter.getPageable().getPageSize());
+ query.setFirstResult(filter.getPageable().getPageSize() * filter.getPageable().getPageNumber());
+ return query.getResultList();
+ }
+
+ @Override
+ public long count(InvoiceFilter filter) {
+ CriteriaBuilder cb = entityManager.getCriteriaBuilder();
+ CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+ Root<Invoice> root = cq.from(Invoice.class);
+
+ cq.select(cb.count(root));
+ cq.where(getPredicates(cb, root, filter));
+ return entityManager.createQuery(cq).getSingleResult();
+ }
+}
--- /dev/null
+package hu.user.lis.db.repository.filter;
+
+import hu.user.lis.db.Partner;
+import hu.user.lis.db.Project;
+import lombok.*;
+
+import java.util.Date;
+
+@Getter
+@Setter
+@Builder
+@NoArgsConstructor
+@ToString
+public class InvoiceFilter extends PageableFilter {
+
+ private Partner partner;
+
+ private Project project;
+
+ private boolean isIncoming;
+
+ private boolean isSettled;
+
+ private Date paymentDeadLineFrom;
+
+ private Date paymentDeadLineTo;
+
+}
--- /dev/null
+package hu.user.lis.db.repository.filter;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.data.domain.Pageable;
+
+@Getter
+@Setter
+public class PageableFilter {
+ private Pageable pageable;
+}
public static final String SET_PROJECTS_LIST_DATA = "SET_PROJECTS_LIST_DATA";
public static final String REFRESH_INVOICE_IMPORT_TASKS = "REFRESH_INVOICE_IMPORT_TASKS";
public static final String NAV_PARTNERS = "/partners";
+ public static final String NAV_INVOICES = "/invoices";
+
+ public static final String NAV_INVOICE_SETTLE = "/invoice-settle";
public static final String NAV_PROJECTS = "/projects";
public static final String NAV_PROJECT = "/project";
public static final String NAV_PROJECT_WILD_CARD = "/project/**";
Constants.NAV_SERVICE_RECORDS,
Constants.NAV_IMPORT_INVOICES_ASSIGN,
Constants.NAV_IMPORT_INVOICES_APPROVE,
+ Constants.NAV_INVOICES,
+ Constants.NAV_INVOICE_SETTLE,
Constants.NAV_SETTINGS,
Constants.NAV_PROJECT_WILD_CARD
})
--- /dev/null
+package hu.user.lis.ui.data;
+
+import hu.user.lis.db.Invoice;
+import hu.user.lis.db.repository.InvoiceRepository;
+import hu.user.lis.db.repository.filter.InvoiceFilter;
+import hu.user.lis.ui.data.common.CachedSpringDataModel;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Component;
+import org.zkoss.zul.FieldComparator;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
+@Component
+@Log4j2
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class InvoicesDataModel extends CachedSpringDataModel<Invoice> {
+ @Autowired
+ InvoiceRepository invoiceRepository;
+
+ private InvoiceFilter filter;
+
+ @Override
+ public List<Invoice> getResultSet(int page, int pageSize, FieldComparator sortComparator) {
+ Pageable pageable = createPageable(page, pageSize, sortComparator);
+ Optional.ofNullable(filter).ifPresent(f -> f.setPageable(pageable));
+ return Objects.isNull(filter) ? invoiceRepository.findAll(pageable).getContent() : invoiceRepository.search(filter);
+ }
+
+ @Override
+ public int getResultSetCount() {
+ long result = Objects.isNull(filter) ? invoiceRepository.count() : invoiceRepository.count(filter);
+ return (int) result;
+ }
+
+ public void search(InvoiceFilter filter) {
+ log.info("Searching invoices using filter: {}", filter);
+ this.filter = filter;
+ super.reset();
+ }
+
+ public void listAll() {
+ log.info("List all invoices");
+ this.filter = null;
+ super.reset();
+ }
+}
public void onCancelImportInvoiceProcess() {
workflowManagerService.cancelInvoiceImportProcess();
}
+
+ @Command
+ public void onInvoiceDues() {
+
+ }
}
--- /dev/null
+package hu.user.lis.ui.view;
+
+import com.google.common.collect.ImmutableMap;
+import hu.user.lis.db.Invoice;
+import hu.user.lis.ui.Constants;
+import hu.user.lis.ui.data.InvoicesDataModel;
+import hu.user.lis.ui.data.common.CachedSpringDataModel;
+import hu.user.lis.ui.view.common.EntityViewModel;
+import lombok.Getter;
+import lombok.extern.log4j.Log4j2;
+import org.zkoss.bind.annotation.Init;
+import org.zkoss.zk.ui.select.annotation.WireVariable;
+
+import static hu.user.lis.ui.data.common.CachedDataModel.ASCENDING;
+import static hu.user.lis.ui.data.common.CachedDataModel.NATURAL;
+
+@Log4j2
+public class InvoicesViewModel extends EntityViewModel<Invoice> {
+ @Getter
+ @WireVariable
+ InvoicesDataModel invoicesDataModel;
+
+ @Override
+ protected CachedSpringDataModel<Invoice> getDataModel() {
+ return invoicesDataModel;
+ }
+
+ @Override
+ protected String getNavigation() {
+ return Constants.NAV_INVOICES;
+ }
+
+ @Init
+ public void init() {
+ super.init();
+ addColumns(ImmutableMap.of(
+ "partner.name", ASCENDING,
+ "partner.vatNr", NATURAL,
+ "project.name", NATURAL,
+ "dueDate", NATURAL,
+ "paymentDate", NATURAL,
+ "grossAmount", NATURAL,
+ "currency", NATURAL,
+ "income", NATURAL
+ ));
+ }
+
+ protected void refresh() {
+ invoicesDataModel.clearSelection();
+ invoicesDataModel.listAll();
+ }
+
+}
<menu iconSclass="z-icon-euro" label="Számlák"
sclass="@bind(vm.importInvoiceMenuClassName)">
<menupopup>
+ <menuitem iconSclass="z-icon-money" label="Összes számla"
+ onClick="@command(vm.selectPage('~./invoices.zul'))"/>
+ <menuitem iconSclass="z-icon-credit-card" label="Számla kiegyenlítés"
+ onClick="@command(vm.selectPage('~./invoice-settle.zul'))"/>
+ <menuitem iconSclass="z-icon-exchange" label="Követelés követés"
+ onClick="@command('onInvoiceDues')"/>
+ <menuseparator/>
<menu iconSclass="z-icon-tasks" label="Számla iktatás"
sclass="@bind(vm.importInvoiceMenuClassName)">
<menupopup>
--- /dev/null
+<zk>
+ <window vflex="true" viewModel="@id('vm') @init('hu.user.lis.ui.view.InvoicesViewModel')">
+ <caption label="Számla kiegyenlítés"/>
+ <borderlayout>
+ <north flex="true">
+ <toolbar>
+ <toolbarbutton label="Hozzáadás" iconSclass="z-icon-plus" onClick="@command('onAdd')"/>
+ <toolbarbutton label="Szerkesztés" iconSclass="z-icon-edit" onClick="@command('onEdit')"
+ disabled="@load(empty vm.selectedEntity)"/>
+ <toolbarbutton label="Törlés" iconSclass="z-icon-remove" onClick="@command('onDelete')"
+ disabled="@load(empty vm.selectedEntity)"/>
+ <separator orient="vertical"/>
+ <toolbarbutton mode="toggle" iconSclass="z-icon-check" label="Aktív"
+ checked="@bind(vm.filterShowActive)"/>
+ <toolbarbutton mode="toggle" iconSclass="z-icon-ban" label="Inaktív"
+ checked="@bind(vm.filterShowInActive)"/>
+ <toolbarbutton mode="toggle" iconSclass="z-icon-adjust" label="Mind"
+ checked="@bind(vm.filterShowBoth)"/>
+ </toolbar>
+ </north>
+ <center border="none" flex="true">
+ <listbox id="partnersList" vflex="true" model="@load(vm.partnersDataModel)"
+ autopaging="true" mold="paging" pagingPosition="top" multiple="false"
+ onSelect="@command('onListSelection')" onDoubleClick="@command('onEdit')">
+ <listhead sizable="true">
+ <listheader label="Név" sort="auto(name)" align="left"
+ sortDirection="@load(vm.cols['name'].sortDirection)"/>
+ <listheader label="Adószám" sort="auto(vatNr)" align="left"
+ sortDirection="@load(vm.cols['vatNr'].sortDirection)"/>
+ <listheader label="Cím" sort="auto(address)" align="left"
+ sortDirection="@load(vm.cols['address'].sortDirection)"/>
+ <listheader label="Aktív" sort="auto(active)" align="left"
+ sortDirection="@load(vm.cols['active'].sortDirection)"/>
+
+ </listhead>
+ <template name="model">
+ <listitem>
+ <listcell label="@load(each.name)"/>
+ <listcell label="@load(each.vatNr)"/>
+ <listcell label="@load(each.address)"/>
+ <listcell>
+ <a iconSclass="z-icon-check" visible="@load(each.active)"/>
+ <a iconSclass="z-icon-ban" visible="@load(!each.active)"/>
+ </listcell>
+ </listitem>
+ </template>
+ </listbox>
+ </center>
+ </borderlayout>
+ </window>
+</zk>
\ No newline at end of file
--- /dev/null
+<zk>
+ <window vflex="true" viewModel="@id('vm') @init('hu.user.lis.ui.view.InvoicesViewModel')">
+ <caption label="Számlák"/>
+ <borderlayout>
+ <north flex="true">
+ <toolbar>
+ <toolbarbutton label="Hozzáadás" iconSclass="z-icon-plus" onClick="@command('onAdd')"/>
+ <toolbarbutton label="Szerkesztés" iconSclass="z-icon-edit" onClick="@command('onEdit')"
+ disabled="@load(empty vm.selectedEntity)"/>
+ <toolbarbutton label="Törlés" iconSclass="z-icon-remove" onClick="@command('onDelete')"
+ disabled="@load(empty vm.selectedEntity)"/>
+ <separator orient="vertical"/>
+ <toolbarbutton mode="toggle" iconSclass="z-icon-check" label="Aktív"
+ checked="@bind(vm.filterShowActive)"/>
+ <toolbarbutton mode="toggle" iconSclass="z-icon-ban" label="Inaktív"
+ checked="@bind(vm.filterShowInActive)"/>
+ <toolbarbutton mode="toggle" iconSclass="z-icon-adjust" label="Mind"
+ checked="@bind(vm.filterShowBoth)"/>
+ </toolbar>
+ </north>
+ <center border="none" flex="true">
+ <listbox id="partnersList" vflex="true" model="@load(vm.partnersDataModel)"
+ autopaging="true" mold="paging" pagingPosition="top" multiple="false"
+ onSelect="@command('onListSelection')" onDoubleClick="@command('onEdit')">
+ <listhead sizable="true">
+ <listheader label="Név" sort="auto(name)" align="left"
+ sortDirection="@load(vm.cols['name'].sortDirection)"/>
+ <listheader label="Adószám" sort="auto(vatNr)" align="left"
+ sortDirection="@load(vm.cols['vatNr'].sortDirection)"/>
+ <listheader label="Cím" sort="auto(address)" align="left"
+ sortDirection="@load(vm.cols['address'].sortDirection)"/>
+ <listheader label="Aktív" sort="auto(active)" align="left"
+ sortDirection="@load(vm.cols['active'].sortDirection)"/>
+
+ </listhead>
+ <template name="model">
+ <listitem>
+ <listcell label="@load(each.name)"/>
+ <listcell label="@load(each.vatNr)"/>
+ <listcell label="@load(each.address)"/>
+ <listcell>
+ <a iconSclass="z-icon-check" visible="@load(each.active)"/>
+ <a iconSclass="z-icon-ban" visible="@load(!each.active)"/>
+ </listcell>
+ </listitem>
+ </template>
+ </listbox>
+ </center>
+ </borderlayout>
+ </window>
+</zk>
\ No newline at end of file