Jump to content

[Projekts] Klons.Net (grāmatvedības programma)


camel
 Share

Recommended Posts

Varbūt kādam tomēr ir kāda paštaisīta noliktavas programma ķešā, ar ko papildināt manu bezmaksas grāmatvedības programmu komplektu. Riktīgam alfa programmētājam uztaisīt kautko tādu mazu būtu nieks, vai ne. Man pašdarbniekam reizēm rokas par īsu un pietrūkst atspēriena, it īpaši, kad publikas interese ir tuvu nullei (lejuplādes, atsauču daudzums).

 

Projekta koncepts - uztaisīt pieticīgu, bezmaksas atvērta koda grmāmatvedības komplektu - manuprāt nav slikts. Iespējams programma nebūs tik kruta kā horizon, bet kautkas labāks par draņķa jumi varbūt.

Link to comment
Share on other sites

Viss ir jauki līdz brīdim kad ir jāpieņem lēmums vai uzticēt TEV VID pretenzijas pret savu uzņēmumu. Kas TU ir, kas TU būsi pēc 5 gad, un ko TU garantē šai periodā. Te ir fiasko.

Nu kaut 3 gadu garantija, ticama garantija!

Labots - abi
Link to comment
Share on other sites

pirms 12 stundām , abi teica:

Kas TU ir, kas TU būsi pēc 5 gad, un ko TU garantē šai periodā. Te ir fiasko.

Tev taisnība, kas to lai zin kas es tāds, varbūt kautkāds slims dīvainis, vai zaļš rūķītis, vai ... Pieņemu, ka respektablāk izskatītos, ja programmas izstrādātājs būtu kautkāds SIA FakJū.

 

pirms 12 stundām , abi teica:

Nu kaut 3 gadu garantija, ticama garantija!

Vai tu esi lasijis savu programmu licences. Rekur citāts no Jmis licences:

 

Citēt

 

Lietotājs saņem Programmproduktu bez jebkāda tieša vai netieša pamatojuma, ieskaitot nepieciešamību un derīgumu konkrētiem mērķiem. Programmprodukta lietošana un tā piemērotība ir Lietotāja kompetencē.

Izstrādātājs negarantē, ka Programmprodukts atbilst Lietotāja prasībām, ka tas ir bez kļūdām un pasargāts no darbības pārtraukumiem.

Izstrādātājs neatbild par defektiem, kas radušies nepareizas ekspluatācijas dēļ, kā arī neuzņemas atbildību par zaudējumiem un jebkādu nodarīto kaitējumu, kas radies Programmprodukta ekspluatācijas dēļ.

 

 

Es tak nesaku, ka tev jālieto mana programma. Tu ir brīvs izvēlēties pēc saviem ieskatiem un preferencēm. Varbūt kādam netraucēs programmas izstrādātāja šaubīgā būtība un nākotnes perspektīvas un šīs programmas liksies noderīgas, lai lietotu grāmatveībā vai piedalītos to uzlabošanā ar ieteikumiem un komēntāriem. Programmu sākotnēji taisiju savām vajadzībām un kapēc gan man to neizlikt internetā, lai ņem, kas grib. Tā kā programma ir bezmaksas, man īpaši neuztrauc vai to kāds lieto vai nē. Mani vairāk iepriecina, ka kāds atraksta par atrastām kļūdām vai iesaka kautko uzlabot.

 

  • Patīk 1
Link to comment
Share on other sites

marrtins

Ir kāds tehnisks iemesls kāpēc ir trīs nodalītas programmas? Parasti jau tās jomas iet roku rokā...

Link to comment
Share on other sites

marrtins
pirms 2 stundām , Watdg Aabrar teica:

Tikai vāji progrogramētāji izmanto smadzense, stipri programētāji nokopē no citiem.

 

Mūsu VIDē ej nokopē kaut ko derīgu. Pie mums lietas tiek darītas pa savam.

Link to comment
Share on other sites

@camel, visu cieņu, par ņemšanos :)

Cik saprotu, arī progas kodu dod pa brīvu, tā teikt publiski pieejams kods... Iemet kodu piemēram Githubā(kurā pats pēc tam arī liec izmaiņas) un iedod arī attiecīgo URLi, no kura var kodu paņemt. Tas būtu tiešām labs un interesants variants...

Link to comment
Share on other sites

@camel, atvainojos, jau esi iekš git ielicis...

 

Tomēr nebūtu slikti to attiecīgo urli norādīt arī savā pirmajā postā ...

Link to comment
Share on other sites

  • 4 years later...

Paturpināšu šo veco tēmu.

 

Sāku taisīt programmu noliktavas uzskaitei. Lai gan līdz pabeigšanai vēl tālu, izdomāju padalīties ar WIP rezultātu. Kas zin, varbūt kāds pieteiksies palīdzēt, kaut vismaz ar padomu. Pieņemu ka tur kautkur ir daudz tādu programmētāju, kas šādas programmas taisa piecas dienā un zin kā tas pareizi darāms.

 

Šoreiz netaisiju kā atsevišķu programmu, bet kā papildinājumu finanšu grāmatvedības programmai. Plāns ir kautkad visu sabāzt vienā programmā. Un jāpāriet uz .net 7 un EF7 - šaubos, ka tas būs viegli. Cik esmu skatijies pārejot uz .net 7 un EF7, nāksies atteikties no kautkādas funkcionalitēs, jo tur vienkārši tām nav atbalsta.

Ua doto brīdi programma kautcik darbojas, nekas īpaši sarežģīts tur nav. Vairāki jautājumi vēl jāizdomā līdz galam.

 

Pašlaik process ir apstājies pie tā, ka ir jāpārtaisa pilna pārrēķina SP (SP_M_RECALCITEM_01A), jo nedarbojas kā vajag pircēja atgriezto preču pārrēķins. Sākotnēji pilno pārrēķinu taisiju, palaižot atsevišķu SP katram dokumentam - ļoti lēna padarīšana. Tad pārrakstiju visu ar kursoriem, kur viss dokumentu saraksts tiek uzstaigāts vienā SP - daudz ātrāks risinājums. Bet problēma ir ar pircēja atgriezto preci, jo tiek mainīti dati saistīti ar dokumentiem, kurus kursors ir jau izstaigājis.

 

Githubā projekts ir KlonsFM mapē: https://github.com/Camel-RD/Klons/tree/master/KlonsFM
Testa programmu var paņemt te: https://failiem.lv/u/jndtm3cfg

Link to comment
Share on other sites

Yay, izštukoju kā tas SP pārrakstāms. Pāris stundas bakstijos šurpu turpu - trial and error koda rakstīšanas process. Jāizdomā kā to kārtīgi notestēt, ja darbosies, būs kā vinnests loterijā (vai kas tamlīdzīgs). It kā nekas sarežģīts, bet super svarīgs - ja šitais nedarbojas tad viss pasākums apstājas.

 

Te tas SP sql kods, ja nu kādam interesē par ko ir runa:

 

ALTER PROCEDURE SP_M_RECALCITEM_01A (
    PSTARTDATE DATE,
    PPROGRESSTEP INTEGER)
RETURNS (
    RET INTEGER)
AS
    declare vret damount;


    declare vcuriditem integer;

    declare vidrow1 integer;
    declare viditem1 integer;
    declare vtam1 damount;
    declare vdt1 date;
    declare vprice1 dpricex;
    declare vtp1 integer;

    declare vidrow2 integer;
    declare viditem2 integer;
    declare vtam2 damount;
    declare vdt2 date;
    declare vprice2 dpricex;

    declare vidrow3 integer;
    declare vtam3 damount;

    declare avidrow1 integer;
    declare avidrow2 integer;
    declare vdoctp integer;

    declare vamused damount;
    declare vamleft1 damount;
    declare vamleft2 damount;
    declare vtotalprice dpricex;

    declare vprogress integer;
    declare veventmessage varchar(20);

    declare CUR1 cursor for
    (
        select
            R1.id,
            R1.iditem,
            R1.amount as amountotal,
            D1.dt,
            R1.buyprice,
            D1.tp
        from m_rows as R1
        join m_docs as D1 on
            D1.id = R1.iddoc and
            D1.state in (2, 3)
        join m_doctypes on D1.tp = m_doctypes.id and
            (m_doctypes.optype = 1 or
            D1.tp in (5, 7))
        join m_items on m_items.id = R1.iditem and
            m_items.isservice = 0

        order by R1.iditem, D1.dt, R1.idseq, R1.id
    );

    declare CUR2 cursor for
    (
        select
            R1.id,
            R1.iditem,
            D1.dt, 
            D1.tp,
            R1.amount as amountotal
        from m_rows as R1
        join m_docs as D1 on
            D1.id = R1.iddoc and
            D1.state in (2, 3) and
            ((:pstartdate is null) or (D1.dt >= :pstartdate))
        join m_doctypes on D1.tp = m_doctypes.id and
            (m_doctypes.optype = 2 or
               D1.tp in (5, 7))
        join m_items on m_items.id = R1.iditem and
            m_items.isservice = 0
        order by R1.iditem, dt, R1.idseq, R1.id
    );

    declare CUR3 cursor for
    (
        select
            R1.id,
            R1.iditem,
            R1.amount as amountotal,
            -L1.amount as amountreturned,
            D1.dt,
            R1.buyprice,
            D1.tp
        from m_links as L1
        join m_rows as R1 on
            L1.id2 = :vidrow3 and
            --L1.amount < 0 and -- we have links with amount > 0 to original sale doc
                                -- or rely on optype = 1
            R1.id = L1.id1
        join m_docs as D1 on
            D1.id = R1.iddoc and
            D1.state in (2, 3)
        join m_doctypes on D1.tp = m_doctypes.id and
            m_doctypes.optype = 1
        join m_items on m_items.id = R1.iditem and
            m_items.isservice = 0

        order by R1.iditem, D1.dt, R1.idseq, R1.id
    );
begin
    veventmessage = 'Progress_' || current_connection;
    vprogress = 0;

    execute procedure sp_m_recalcamounts_1
    returning_values ret;

    if (pprogresstep > 0) then
        IN AUTONOMOUS TRANSACTION DO
            post_event veventmessage;

    if (pstartdate is null) then
    begin
        delete from m_links;
    end else
    begin
        for select m_links.id1, m_links.id2
        from m_links
        join m_rows as R2
            on R2.id = m_links.id2
        join m_docs as D2
            on D2.id = R2.iddoc and
                D2.dt >= :pstartdate
        into :vidrow1, :vidrow2
        do begin
            delete from m_links
            where id1 = :vidrow1 and id2 = :vidrow2;
        end
    end

    if (pprogresstep > 0) then
        IN AUTONOMOUS TRANSACTION DO
            post_event veventmessage;

    merge into m_rows
    using (
        select m_docs.id
        from m_docs
        join m_doctypes on m_doctypes.id = m_docs.tp and
            m_doctypes.optype = 1
        ) as T1
    on T1.id = m_rows.iddoc and
        (buyprice <> price or
        tbuyprice <> tprice)
    when matched then
    update set buyprice = price, tbuyprice = tprice;

    vamleft1 = 0;
    vamleft2 = 0;
    vtotalprice = 0;

    vcuriditem = null;

    open cur1;
    open cur2;

    vidrow1 = null;
    vidrow3 = null;

    while(1=1) do
    begin
        if (vamleft2 = 0) then
        begin
            while(1=1) do
            begin
                vprogress = vprogress + 1;
                if ((pprogresstep > 0) and (vprogress >= pprogresstep)) then
                begin
                    IN AUTONOMOUS TRANSACTION DO
                        post_event veventmessage;
                    vprogress = 0;
                end

                fetch cur2
                into :vidrow2, :viditem2, :vdt2, :vdoctp, :vtam2;
                if (row_count = 0) then leave;
                
                if ((vcuriditem is null) or (vcuriditem < viditem2)) then
                begin
                    vcuriditem = viditem2;
                    vamleft1 = 0;
                end

                vtotalprice = 0;
                vamleft2 = 0;
                vret = 0;
                if (vdoctp in (3, 10)) then
                begin
                    vamleft2 = vtam2;
                    leave;
                end
                else if (vdoctp = 4) then
                    execute procedure sp_m_recalcitem_04 (:vidrow2, :vidrow1)
                    returning_values :vret;
                else if (vdoctp = 5) then
                    execute procedure sp_m_recalcitem_05 (:vidrow2, :vidrow1)
                    returning_values :vret;
                else if (vdoctp = 6) then
                    execute procedure sp_m_recalcitem_06 (:vidrow2, :vidrow1)
                    returning_values :vret;
                else if (vdoctp = 7) then
                    execute procedure sp_m_recalcitem_07 (:vidrow2, :vidrow1)
                    returning_values :vret;

                if (vidrow1 is not null) then
                    vamleft1 = vamleft1 - vret;
            end
            if (row_count = 0) then leave;
        end

        if (vamleft1 = 0) then
        begin
            while(1=1) do
            begin
                vprogress = vprogress + 1;
                if ((pprogresstep > 0) and (vprogress >= pprogresstep)) then
                begin
                    IN AUTONOMOUS TRANSACTION DO
                        post_event veventmessage;
                    vprogress = 0;
                end
                
                if (vidrow3 is null) then
                begin

                    fetch cur1
                    into :vidrow1, :viditem1, :vtam1, :vdt1, :vprice1, :vtp1;

                    if ((row_count = 0) or (viditem1 > vcuriditem)) then leave;
    
                    if (vtp1 in (5,7)) then
                    begin

                        vidrow3 = vidrow1;
                        open cur3;

                    end else
                    begin

                        if (viditem1 = vcuriditem) then
                        begin
                            select sum(m_links.amount) as amountused
                            from m_links
                            where m_links.id1 = :vidrow1
                                --and m_links.amount > 0
                            into :vamused;
                            vamused = coalesce(vamused, 0);
            
                            vamleft1 = vtam1 - vamused;
                            if (vamleft1 > 0) then leave;
                        end

                    end

                end else
                begin

                    fetch cur3
                    into :vidrow1, :viditem1, :vtam1, :vtam3, :vdt1, :vprice1, :vtp1;

                    if (row_count = 0) then
                    begin

                        vidrow3 = null;
                        close cur3;

                    end else
                    begin

                        select sum(m_links.amount) as amountused
                        from m_links
                        where m_links.id1 = :vidrow1
                        into :vamused;
                        vamused = coalesce(vamused, 0);
        
                        if (vamused < vtam1) then
                        begin
                            vamleft1 = vtam1 - vamused;

                            -- maybe cant give more then vtam3, or we loose some row1
                            -- a bit incorrect, but we cant do it right anyway
                            -- vamleft1 = minvalue(vtam1 - vamused, vtam3);
                            leave;
                        end
                    end

                end

            end

            if ((row_count = 0) or (vdt1 > vdt2) or
                (viditem1 > vcuriditem)) then
            begin
                close cur1;
                close cur2;
                if (vidrow3 is not null) then
                    close cur3;
                exception ex_failure 'Not enough amount in stock '
                    || 'item:[' || :vcuriditem || ']';
            end

        end
        
        if (vamleft1 < 0) then
            exception ex_failure 'Bad code: vamleft1 < 0';

        vamused = minvalue(vamleft1, vamleft2);

        if (vamused > 0) then
        begin
            vamleft1 = vamleft1 - vamused;
            vamleft2 = vamleft2 - vamused;

            vtotalprice = vtotalprice + vamused * vprice1;

            if ((avidrow1 = vidrow1) and (avidrow2 = vidrow2)) then
            begin
                close cur1;
                close cur2;
                exception ex_failure 'Bad code';
            end
    
            insert into m_links (id1, id2, iditem, amount)
            values (:vidrow1, :vidrow2, :vcuriditem, :vamused);

            if (vidrow3 is not null) then
            begin

                update m_links as L1
                set L1.amount = L1.amount + :vamused
                where L1.id1 = :vidrow3 and L1.id2 = :vidrow2;

                if (row_count = 0) then
                    insert into m_links (id1, id2, iditem, amount)
                    values (:vidrow3, :vidrow2, :vcuriditem, :vamused);

            end

            avidrow1 = vidrow1;
            avidrow2 = vidrow2;

            if (vamleft2 = 0) then
            begin
                vtotalprice = round(vtotalprice, 2);
                vprice2 = round(vtotalprice / vtam2, 4);

                update m_rows
                set buyprice = :vprice2,
                    tbuyprice = :vtotalprice
                    --idseq = gen_id(gen_m_docseq, 1)
                where id = :vidrow2 and
                    (buyprice <> :vprice2 or
                    tbuyprice <> :vtotalprice);
            end

        end

    end
    close cur1;
    close cur2;

    execute procedure SP_M_RECALC_ROWSISGONE_1
    returning_values ret;

    ret = 1;
    suspend;
end

 

 

 

  • Patīk 1
Link to comment
Share on other sites

  • 4 months later...

Programmai jauna versija. Šajā versijā visi moduļi (finanses, algas, panatlīdzekļi, noliktava) apvienoti vienā programmā, vienā DB. Pie reizes ir pāriets uz Firebird4.

 

https://github.com/Camel-RD/Klons2

 

Nav gluži gala versija, un kas to lai zin vai tāda kādreiz būs. Šitā vismaz, ja izliek publiskai paņemšanai, kaut vai nepabeigtu, varbūt kāds paņems, notestēs un dos ziņu, ja kas nedarbojas vai ir jāpapildina. Savā nodabā čubināties dažreiz paliek garlaicīgi.

  • Patīk 2
Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...