-1

the function generirajFakturi is used to create some data in a table through sequelize, and after adding everything that it needs to add it should call the function that is at the end dodeliNagradi which is using data from the table that the first function needs to populate, but somehow the second function gets called before the first finishes and the table is empty thus the second function is not working properly, i tried using promises to wait for the first function to finish but it doesn't seem to work, i think i am making some mistake here but it also might be imposible to do it this way.

It would be great if someone could look at this and help me out i spend so much time stuck on this.

const generirajFakturi = async function(req, res){
    var godina = req.body.godina
    var mesec = req.body.mesec
    godina=2021
    mesec=3
    new Promise((resolve, reject)=>{
    
    Firma.findAll({
        //TODO: da raboti
    }).then((result)=>{
        result.map((firma)=>{
            var date = new Date()
            var rok = new Date()
            rok.setDate(date.getDate()+10)
            Faktura.findOne({where:{
                mesec:03,
                godina:2021,
                firmaId:firma.id
            }}).then((postoeckafaktura)=>{
                if((postoeckafaktura===null||true)){
                    
                    Faktura.create({
                        arhivskiBroj:"05-2021",
                        mesec:3,
                        godina:2021,
                        datumNaIzdavanje: formatDate(date),
                        rokZaNaplata: formatDate(rok),
                        firmaId:firma.id
                    }).then((faktura)=>{
                        if(mesec<10){
                           var tempmesec="0"+mesec
                        }
                        firma.getBroilo({
                            where:{
                                mesec:godina+"."+tempmesec+"-"+tempmesec
                            }
                        }).then((result)=>{
                            var kolicinaOdSiteBroila=0
                            var kolicinaZelenaEnergija=0
                            var promeni = {}
                            result.map((broilo)=>{
                                
                                BroiloStatus.update({fakturaId:faktura.id},{where:{id:broilo.id}})
                                MernaTocka.findOne({where:{
                                    tockaID:broilo.brojMernaTocka,
                                    tarifa:broilo.tarifa
                                }}).then((mernaTocka)=>{
                                    VkupnoPotrosena.findOne({where:{
                                        mesec,
                                        godina
                                    }}).then((vkupnoPotrosena)=>{
                                        kolicinaOdSiteBroila=parseFloat(kolicinaOdSiteBroila)+parseFloat(broilo.vkupnoKolicina)
                                        kolicinaZelenaEnergija=parseFloat(kolicinaZelenaEnergija) + parseFloat(broilo.potrosenaZelenaEnergija)
                                        faktura.addBroilo(broilo)
                                        
                                        promeni={
                                            elektricnaEnergija:parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija).toFixed(2),
                                            elektricnaEnergijaBezStorno:parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija).toFixed(2),
                                            obnovlivaEnergija:parseFloat(kolicinaZelenaEnergija).toFixed(2),
                                            dataOd:broilo.datumPocetok,
                                            dataDo:broilo.datumKraj,
                                            cenaKwhBezDDV:parseFloat(mernaTocka.cena).toFixed(2),
                                            vkupenIznosBezDDV:parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija) * parseFloat(mernaTocka.cena)).toFixed(2),
                                            cenaObnovlivaEnergija:parseFloat(vkupnoPotrosena.zelenaCena).toFixed(2),
                                            vkupnaObnovlivaEnergijaBezDDV:parseFloat(parseFloat(vkupnoPotrosena.zelenaCena)*parseFloat(kolicinaZelenaEnergija)).toFixed(2),
                                            nadomestZaOrganizacija:parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija)*parseFloat(vkupnoPotrosena.nadomestZaOrganizacija)).toFixed(2),
                                            vkupenIznosNaFakturaBezDDV:parseFloat(parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija) * parseFloat(mernaTocka.cena))+parseFloat(parseFloat(vkupnoPotrosena.zelenaCena)*parseFloat(kolicinaZelenaEnergija))+parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija)*parseFloat(vkupnoPotrosena.nadomestZaOrganizacija))).toFixed(2),
                                            DDV:parseFloat(parseFloat(vkupnoPotrosena.DDVProcent)/100.0*(parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija) * parseFloat(mernaTocka.cena))+parseFloat(parseFloat(vkupnoPotrosena.zelenaCena)*parseFloat(kolicinaZelenaEnergija))+parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija)*parseFloat(vkupnoPotrosena.nadomestZaOrganizacija)))).toFixed(2),
                                            vkupnaNaplata:parseFloat(parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija) * parseFloat(mernaTocka.cena))+parseFloat(parseFloat(vkupnoPotrosena.zelenaCena)*parseFloat(kolicinaZelenaEnergija))+parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija)*parseFloat(vkupnoPotrosena.nadomestZaOrganizacija))+parseFloat(parseFloat(vkupnoPotrosena.DDVProcent)/100.0*(parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija) * parseFloat(mernaTocka.cena))+parseFloat(parseFloat(vkupnoPotrosena.zelenaCena)*parseFloat(kolicinaZelenaEnergija))+parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija)*parseFloat(vkupnoPotrosena.nadomestZaOrganizacija))))).toFixed(2)
                                            
                                        }
                                        Faktura.update(promeni,{where:{
                                            id:faktura.id
                                        }}).then(()=>{
                                            
                                            Storno.findAll(
                                                {where: {firmaId:firma.id, tarifa: broilo.tarifa}
                                            }).then((stornoFirma) => {
                                                stornoFirma.map((stornoData)=>{
                                                    
                                                    
                                                    if(stornoData.vkupnoKolicina < promeni.elektricnaEnergija){
                                                        StornoDisplay.create({
                                                            tarifa: stornoData.tarifa,
                                                            datumNaPocetokNaMerenje: stornoData.datumNaPocetokNaMerenje,
                                                            datumNaZavrshuvanjeNaMerenje: stornoData.datumNaZavrshuvanjeNaMerenje,
                                                            vkupnoKolicina: stornoData.vkupnoKolicina,
                                                            brojNaBroilo: stornoData.brojNaBroilo,
                                                            fakturaId: faktura.id,
                                                            firmaId:faktura.firmaId
                                                        })
                                                        Faktura.update({elektricnaEnergija:promeni.elektricnaEnergija-stornoData.vkupnoKolicina},{where:{
                                                            id:faktura.id
                                                        }})
                                                        Storno.destroy({where:{id:stornoData.id}})
                                                    }
                                                    if(stornoData.vkupnoKolicina >= promeni.elektricnaEnergija){
                                                        Faktura.update({elektricnaEnergija:0},{where:{
                                                            id:faktura.id
                                                        }})
                                                        StornoDisplay.create({
                                                            tarifa: stornoData.tarifa,
                                                            datumNaPocetokNaMerenje: stornoData.datumNaPocetokNaMerenje,
                                                            datumNaZavrshuvanjeNaMerenje: stornoData.datumNaZavrshuvanjeNaMerenje,
                                                            vkupnoKolicina: promeni.elektricnaEnergija,
                                                            brojNaBroilo: stornoData.brojNaBroilo,
                                                            fakturaId: faktura.id,
                                                            firmaId:faktura.firmaId
                                                        })
                                                        Storno.update({
                                                            vkupnoKolicina:(parseFloat(stornoData.vkupnoKolicina)-parseFloat(promeni.elektricnaEnergija))*parseFloat(stornoData.multiplikator),
                                                            kolicina:(parseFloat(stornoData.vkupnoKolicina)-parseFloat(promeni.elektricnaEnergija))
                                                        },{where:{id:stornoData.id}})
                                                    }
                                                    
                                                
                                            })
                                        })
                                        })
                                        
                                        
                                    })
                                    
                                })
                                
                                
                            })
                        })
                    })
                }
            })
            
            })
            
    })
    resolve()
}).then(()=>{
    dodeliNagradi(mesec,godina)
})
    

    
    return 
}

here is the code of the second function but i don't think it is important

const dodeliNagradi = async function(mesec, godina){
    console.log("dodeluvam nagradi")
    console.log(mesec, godina)
    Faktura.findAll({
        where:{
            mesec, godina
        }
    }).then((fakturi)=>{
        console.log(fakturi)
        fakturi.map((faktura)=>{
            Firma.findOne({where:{id:faktura.firmaId}}).then((firma)=>{
                Nagradi.findOne({where:{
                    agent:firma.agent,
                    mesec,
                    godina,
                    firma:firma.name
                }}).then((postoecka)=>{
                    if(postoecka==null){
                        Nagradi.create({
                            agent:firma.agent,
                            mesec,
                            godina,
                            suma:parseInt(parseFloat(faktura.elektricnaEnergijaBezStorno).toFixed(2)*parseFloat(firma.nagrada)),
                            firma:firma.name
                        })
                    }
                })

            })
            
        })
    })
}

EDIT: Tried using async/await still getting the same result

const generiraj = async function (req, res){
       // 1. Pomini gi site firmi
    // 2. Proveri dali firmata ima broiloStatus za ovoj mesec
    // 3. Ako ima spoj gi i kreiraj red vo tabelata
    var godina = req.body.godina
    var mesec = req.body.mesec
    godina=2021
    mesec=3
    await Firma.findAll({
        //TODO: da raboti
    }).then((result)=>{
        result.map((firma)=>{
            var date = new Date()
            var rok = new Date()
            rok.setDate(date.getDate()+10)
            Faktura.findOne({where:{
                mesec:03,
                godina:2021,
                firmaId:firma.id
            }}).then((postoeckafaktura)=>{
                if((postoeckafaktura===null||true)){
                    
                    Faktura.create({
                        arhivskiBroj:"05-2021",
                        mesec:3,
                        godina:2021,
                        datumNaIzdavanje: formatDate(date),
                        rokZaNaplata: formatDate(rok),
                        firmaId:firma.id
                    }).then((faktura)=>{
                        if(mesec<10){
                           var tempmesec="0"+mesec
                        }
                        firma.getBroilo({
                            where:{
                                mesec:godina+"."+tempmesec+"-"+tempmesec
                            }
                        }).then((result)=>{
                            var kolicinaOdSiteBroila=0
                            var kolicinaZelenaEnergija=0
                            var promeni = {}
                            result.map((broilo)=>{
                                
                                BroiloStatus.update({fakturaId:faktura.id},{where:{id:broilo.id}})
                                MernaTocka.findOne({where:{
                                    tockaID:broilo.brojMernaTocka,
                                    tarifa:broilo.tarifa
                                }}).then((mernaTocka)=>{
                                    VkupnoPotrosena.findOne({where:{
                                        mesec,
                                        godina
                                    }}).then((vkupnoPotrosena)=>{
                                        kolicinaOdSiteBroila=parseFloat(kolicinaOdSiteBroila)+parseFloat(broilo.vkupnoKolicina)
                                        kolicinaZelenaEnergija=parseFloat(kolicinaZelenaEnergija) + parseFloat(broilo.potrosenaZelenaEnergija)
                                        faktura.addBroilo(broilo)
                                        
                                        promeni={
                                            elektricnaEnergija:parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija).toFixed(2),
                                            elektricnaEnergijaBezStorno:parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija).toFixed(2),
                                            obnovlivaEnergija:parseFloat(kolicinaZelenaEnergija).toFixed(2),
                                            dataOd:broilo.datumPocetok,
                                            dataDo:broilo.datumKraj,
                                            cenaKwhBezDDV:parseFloat(mernaTocka.cena).toFixed(2),
                                            vkupenIznosBezDDV:parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija) * parseFloat(mernaTocka.cena)).toFixed(2),
                                            cenaObnovlivaEnergija:parseFloat(vkupnoPotrosena.zelenaCena).toFixed(2),
                                            vkupnaObnovlivaEnergijaBezDDV:parseFloat(parseFloat(vkupnoPotrosena.zelenaCena)*parseFloat(kolicinaZelenaEnergija)).toFixed(2),
                                            nadomestZaOrganizacija:parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija)*parseFloat(vkupnoPotrosena.nadomestZaOrganizacija)).toFixed(2),
                                            vkupenIznosNaFakturaBezDDV:parseFloat(parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija) * parseFloat(mernaTocka.cena))+parseFloat(parseFloat(vkupnoPotrosena.zelenaCena)*parseFloat(kolicinaZelenaEnergija))+parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija)*parseFloat(vkupnoPotrosena.nadomestZaOrganizacija))).toFixed(2),
                                            DDV:parseFloat(parseFloat(vkupnoPotrosena.DDVProcent)/100.0*(parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija) * parseFloat(mernaTocka.cena))+parseFloat(parseFloat(vkupnoPotrosena.zelenaCena)*parseFloat(kolicinaZelenaEnergija))+parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija)*parseFloat(vkupnoPotrosena.nadomestZaOrganizacija)))).toFixed(2),
                                            vkupnaNaplata:parseFloat(parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija) * parseFloat(mernaTocka.cena))+parseFloat(parseFloat(vkupnoPotrosena.zelenaCena)*parseFloat(kolicinaZelenaEnergija))+parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija)*parseFloat(vkupnoPotrosena.nadomestZaOrganizacija))+parseFloat(parseFloat(vkupnoPotrosena.DDVProcent)/100.0*(parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija) * parseFloat(mernaTocka.cena))+parseFloat(parseFloat(vkupnoPotrosena.zelenaCena)*parseFloat(kolicinaZelenaEnergija))+parseFloat(parseFloat(kolicinaOdSiteBroila-kolicinaZelenaEnergija)*parseFloat(vkupnoPotrosena.nadomestZaOrganizacija))))).toFixed(2)
                                            
                                        }
                                        Faktura.update(promeni,{where:{
                                            id:faktura.id
                                        }}).then(()=>{
                                            
                                            Storno.findAll(
                                                {where: {firmaId:firma.id, tarifa: broilo.tarifa}
                                            }).then((stornoFirma) => {
                                                stornoFirma.map((stornoData)=>{
                                                    
                                                    
                                                    if(stornoData.vkupnoKolicina < promeni.elektricnaEnergija){
                                                        StornoDisplay.create({
                                                            tarifa: stornoData.tarifa,
                                                            datumNaPocetokNaMerenje: stornoData.datumNaPocetokNaMerenje,
                                                            datumNaZavrshuvanjeNaMerenje: stornoData.datumNaZavrshuvanjeNaMerenje,
                                                            vkupnoKolicina: stornoData.vkupnoKolicina,
                                                            brojNaBroilo: stornoData.brojNaBroilo,
                                                            fakturaId: faktura.id,
                                                            firmaId:faktura.firmaId
                                                        })
                                                        Faktura.update({elektricnaEnergija:promeni.elektricnaEnergija-stornoData.vkupnoKolicina},{where:{
                                                            id:faktura.id
                                                        }})
                                                        Storno.destroy({where:{id:stornoData.id}})
                                                    }
                                                    if(stornoData.vkupnoKolicina >= promeni.elektricnaEnergija){
                                                        Faktura.update({elektricnaEnergija:0},{where:{
                                                            id:faktura.id
                                                        }})
                                                        StornoDisplay.create({
                                                            tarifa: stornoData.tarifa,
                                                            datumNaPocetokNaMerenje: stornoData.datumNaPocetokNaMerenje,
                                                            datumNaZavrshuvanjeNaMerenje: stornoData.datumNaZavrshuvanjeNaMerenje,
                                                            vkupnoKolicina: promeni.elektricnaEnergija,
                                                            brojNaBroilo: stornoData.brojNaBroilo,
                                                            fakturaId: faktura.id,
                                                            firmaId:faktura.firmaId
                                                        })
                                                        Storno.update({
                                                            vkupnoKolicina:(parseFloat(stornoData.vkupnoKolicina)-parseFloat(promeni.elektricnaEnergija))*parseFloat(stornoData.multiplikator),
                                                            kolicina:(parseFloat(stornoData.vkupnoKolicina)-parseFloat(promeni.elektricnaEnergija))
                                                        },{where:{id:stornoData.id}})
                                                    }
                                                    
                                                
                                            })
                                        })
                                        })
                                        
                                        
                                    })
                                    
                                })
                                
                                
                            })
                        })
                    })
                }
            })
            
            })
            
            
            
    })
}


const generirajFakturi = async function(req, res){
    await generiraj(req,res)
    dodeliNagradi(3, 2021)
    return 
}

const dodeliNagradi = async function(mesec, godina){
    console.log("dodeluvam nagradi")
    console.log(mesec, godina)
    Faktura.findAll({
        where:{
            mesec, godina
        }
    }).then((fakturi)=>{
        console.log(fakturi)
        fakturi.map((faktura)=>{
            Firma.findOne({where:{id:faktura.firmaId}}).then((firma)=>{
                Nagradi.findOne({where:{
                    agent:firma.agent,
                    mesec,
                    godina,
                    firma:firma.name
                }}).then((postoecka)=>{
                    if(postoecka===null){
                        Nagradi.create({
                            agent:firma.agent,
                            mesec,
                            godina,
                            suma:parseInt(parseFloat(faktura.elektricnaEnergijaBezStorno).toFixed(2)*parseFloat(firma.nagrada)),
                            firma:firma.name
                        })
                    }
                })

            })
            
        })
    })
    
}
  • Your code is the reason why ````async/await```` was invented. –  Aug 14 '21 at 17:33
  • tried that too, still didn't work, my last attempt was with the promises but no luck as well – Darko Bundoski Aug 14 '21 at 17:34
  • 1
    You are using `async/await` wrong. As soon as your function is `async`, there should be exactly 0 `then`s in there, as all `then`s should become `await`s. – Wiktor Zychla Aug 14 '21 at 18:02
  • My recommendation is that you take every single one of your functions and make them their own function blocks with something like `const process = (faktura) => {};` then you can more easily work with changing your function flow. – Cody G Aug 14 '21 at 20:04

1 Answers1

1

To just answer your question:

const generirajFakturi = async function(req, res)

...

const callback = () = {} // create your callback

...

Storno.update({/**/}).then(() => callback()) // call your callback on the very last .then

However the reason why people will run away from your code is it's a mess, you really should be using async/await.

Your code should look something like this:

const method = async (request, response) => {
  const result1 = await method1()
  const result2 = await method2(result1)
  const result3 = await method3(result2)
  const result4 = await method4(result3)

  return result4
}

Without all the rabbit hole inception going on.