mojaSymfonia FORUM https://forum.mix-soft.pl/ |
|
Kaucja do paragonu https://forum.mix-soft.pl/viewtopic.php?f=15&t=3633 |
Strona 1 z 1 |
Autor: | Khavert [ 2012-01-13, 10:10 ] |
Tytuł: | Kaucja do paragonu |
Witam, Mam taki mały problem, otóż firma w której pracuje chce wprowadzić kaucje za pobrane opakowania zwrotne od klientów incydentalnych(Paragony). Założyłem nowy towar nie podlegający vat (NP) i drukarka fiskalna bez problemów nalicza mi dodatkową opłatę. Problem pojawia się w przypadku gdy klient zwraca mi opakowanie i muszę zwrócić mu pieniądzem nie mam zielonego pojęcia jak powiązać to z konkretnym dokumentem i jaki wystawić. Jednocześnie zaznaczam, iż nie interesuje mnie od kogo i dla kogo została naliczona kaucja oraz nie zamierzam robić pełnej obsługi jak to było proponowane w wątkach "Opakowania zwrotne". Proszę o pomoc, jakieś pomysły cokolwiek ( najlepiej gdyby było to bez ingerencji w raporty ) Pozdrawiam |
Autor: | rafal [ 2012-01-13, 12:38 ] |
Tytuł: | Re: Kaucja do paragonu |
A dlaczego wzbraniasz się tak przed raportem? Bez raportu to powinieneś odnaleść jakiś paragon na którym wydałeś opakowanie i go skorygować. |
Autor: | Khavert [ 2012-01-14, 12:07 ] |
Tytuł: | Re: Kaucja do paragonu |
Witam, Z raportami to mam już: 1. Przerobione wszystkie wydruki - w tym szczególnie FVS, FVZ, FRR 2. Dodatkową bazę do obsługi skupu zwierząt rzeźnych (Oryginalnie Symfonia czegoś takiego nie obsługuje) 3. Dodatkowe raporty pieniężne 4. Dodane w bazie zewnętrznej - zapis modyfikacji dokumentów przez użytkowników 5. Obsługa pobierania zaliczek oraz rozliczanie paragonów wystawianych przez pracowników(tak o sobie szef wymyślił) I jak mam jeszcze dorobić obsługę opakowań zwrotnych a nie daj Bóg będę musiał zainstalować uaktualnienie to ... Jednak jeżeli nie da rady to trudno. Odnośnie wyszukiwania konkretnych paragonów to w zasadzie nie ma większego problemu tylko jak? -Korekta paragonu? -Zafiskalizuje mi takie cudo? Pozdrawiam |
Autor: | rafal [ 2012-01-16, 15:19 ] |
Tytuł: | Re: Kaucja do paragonu |
Raport o tyle by ułatwił, że mógłby wyszukać pierwszy nieskorygowany jeszcze paragon i automatycznie wystawić korektę. Przy korekcie paragonu nic nie wychodzi z drukarki. |
Autor: | Khavert [ 2012-01-18, 12:51 ] |
Tytuł: | Re: Kaucja do paragonu |
OK dzięki wielkie, pewnie trzeba się zabrać za pisanie raportu. Pozdrawiam |
Autor: | rafal [ 2012-01-18, 12:52 ] |
Tytuł: | Re: Kaucja do paragonu |
Daj znać jak Ci się uda coś napisać. |
Autor: | Khavert [ 2012-01-23, 14:12 ] |
Tytuł: | Re: Kaucja do paragonu |
Witam, Trochę pogrzebałem i: Drukarka fiskalna ma opcję obsługi kaucji więc: 1. Na paragonie nie musi być kaucja można coś takiego dodać jako zewnętrzny raport dodający Opakowanie zwrotne 2. Tak samo przy zwrocie kaucji wysyłamy do drukarki fiskalnej info o zwrocie kaucji Poniżej to co udało mi się ustalić na drukarce Wiking - Optimus - IC (Później będę testował na pozostałych) Kod: dispatch Fp //od Fiscal Printer czy jakoś tak :) Fp.Create("OICFiscalPrinterLib.OICFiscalPrinter") //Dorwałem kontrolkę na stronie Novitus //Inicjacja Drukarki fp.PrinterDriver = "Wiking PL 3.0" //Sterownik drukarki - z dokumentacji Fp.PortName = "COMx" // gdzie x to numer com'a Fp.PortConfigString = "Speed=9600;DataBits=8;StopBits=1;Parity=N;FlowControl=X;Timeout=10000" //Ustawienie parametrów COM Fp.Open //Otwarcie portu Fp.Beep //Bzyczek Drukarki - tak dla potwierdzenia komunikacji Fp.Close //Kończymy prace W dokumentacji jest pełno funkcji napisanych w Object Pascale...można zaadoptować. Gdy zrobię coś więcej to napiszę Prośba do Admina o podwieszenie tematu na Programowaniu AMHM |
Autor: | Khavert [ 2012-02-03, 11:25 ] |
Tytuł: | Re: Kaucja do paragonu |
A więc...w procedurach wywoływanych z okien na początku Kod: Float IDHANDLOWY float IDMAGAZYNOWY #include "DrukarkaFisk" #include "Automatyczne wystawianie KP i KW" ...... int Sub OnDokumentSprzedazyAlt8(long lIdDk, int bBufor, long lIdPoz) if bBufor == 0 then IDHANDLOWY = lIddk dk.GetRecById(IDHANDLOWY) FormularzOpakowan(dk.GetField("kod")) if Blad != 0 then OknoKasy(lIddk, bBufor, KWOTAPOJEMNIKOW) mg.getrecbyid(IDMAGAZYNOWY) dk.GetRecById(IDHANDLOWY) dk.SetField("znaczniki",65963) dk.PutRec() endif endif endsub Raport DrukarkaFisk Kod: #include "Automatyczne wystawianie WZ jako opakowania" dispatch Fp dispatch ReceiptS Dispatch Depozyt String sCOM String sterowanie float KWOTAPOJEMNIKOW int sub DrukarkaFisk() Int PlikKonf = Open KatalogWin () + "fiscprn.ini" For Input string pozycja int i input #plikKonf, sterowanie input #plikKonf, sterowanie input #plikKonf, sterowanie while i < len(sterowanie) pozycja = mid(sterowanie,i,1) if pozycja == "," then sterowanie = mid(sterowanie, 11, i-11) exit endif i += 1 wend //Tutaj według opisów na stanowiskach kasowych dla drukarek fiskalnych - lokalnych select case sterowanie case "Wiking" sterowanie = "WIKING PL 1.0" Case "Optimus ViVo" sterowanie = "VIVO PL 2.0" case "Novitus DELIOprime" sterowanie = "DELIO E PL 1.0" endselect i = 0 for i = 0 to i > 12 input #plikKonf, sCom next i sCOM = mid(scom, 6,4) endsub int sub Opakowania(Long kaucja, int ilosc, int rodzaj, string Dokument) Fp.Create("OICFiscalPrinterLib.OICFiscalPrinter") ReceiptS.Create("OICFiscalPrinterLib.OICFPReceiptSummary") DrukarkaFisk() //Rodzaj 1 - zwrot 0 - pobranie PopUp(1, "Fiskalizowanie Opakowań Zwrotnych") PopUP(2, "Proszę czekać...") FP.PrinterDriver = sterowanie FP.PortName = scom FP.PortConfigString = "Speed=9600;DataBits=8;StopBits=1;Parity=N;FlowControl=X;Timeout=10000" Fp.Open Blad = Fp.OpenReceipt //okazało się że drukarki inaczej liczą kaucji wg poniższej instrukcji Select case Sterowanie case "DELIO E PL 1.0" KWOTAPOJEMNIKOW = kaucja case "VIVO PL 2.0" KWOTAPOJEMNIKOW = kaucja*ilosc case else KWOTAPOJEMNIKOW = kaucja*ilosc endselect if rodzaj == 0 then WystawOpakowanie("",ilosc,dokument) if rodzaj == 1 then WystawOpakowanie("",-ilosc,dokument) if blad == 0 then message "Fiskalizacja niepowiodła się" fp.CloseReceipt(0, 0, 0, 0) exit endif if rodzaj == 0 then FP.DepositItem(0, "1", kaucja, ilosc, "", KWOTAPOJEMNIKOW) if rodzaj == 1 then FP.DepositItem(1, "1", kaucja, ilosc, "", KWOTAPOJEMNIKOW) ReceiptS = fp.createReceiptSummary ReceiptS.SystemNumber = "Do: " + Dokument FP.CloseReceiptEx2(ReceiptS) FP.close if rodzaj == 0 then KWOTAPOJEMNIKOW = ilosc*kaucja else KWOTAPOJEMNIKOW = ilosc*kaucja*-1 endif endsub int sub FormularzOpakowan(string sDokNR) Long PLNszt int Szt int Rodz String sDok Int odp String tablica_pozycji_pk (2) = "Wydanie","Zwrot" String pozycja_pk form "Opakowania zwrotne", 235,130 edit "Opakowań", szt, 100,0,100,20 Edit "Kwota za szt.", PLNszt, 100,21,100,20 CmbBox "Rodzaj operacji", tablica_pozycji_pk, pozycja_pk, 100,42, 100, 90 button "&OK", 5,80,100,25,2 button "&Anuluj", 130,80,100,25,-1 odp = execform if odp == 2 then if pozycja_pk == "Wydanie" then rodz = 0 if pozycja_pk == "Zwrot" then rodz = 1 Opakowania(plnszt,szt,rodz,sDokNR) endif endsub Raport "Automatyczne wystawianie WZ jako opakowania" Utworzony magazyn w systemie specjalnie dla opakowań Kod: int Blad basedk dk int errormg INT SUB WystawOpakowanie(string kodKH, int ilosc, string Opis) //Procedura wystawiajacego dokument w magazynie Opakowań WZ oraz WZK danego WZ float i //jeżeli ilość jest ujemna wtedy korekta string sIlosc = using "%L", ilosc IoRec Mag date DataRozl string IDDK float IleWParagonie String sIleWParagonie //Ustawienie rekordu w bazie DK, zczytanie pola id i zapisanie jako STRING dk.GetRecByID(IDHANDLOWY) iddk = using "%0.0f", dk.GetField("id") //Termin ważności WZ to 90 dni DataRozl.FromStr(data()) DataRozl.AddDays(90) //Czyszczenie IOREC Mag.Clear() //W bazie dk odebrane znajduje się licznik pobranch pojemników na paragon if dk.GetField("odebrane") == "" then IleWParagonie = 0 else IleWParagonie = val(dk.GetField("odebrane")) endif if ilosc < 0 then //Usunięcie łącznika między dokumentami magazynowymi a Handlowymi nie wystawi korekty jeżeli będzie skojarzony!! //Dopuszcza się tylko jeden dokument Wydania Opakowań, stąd zapis jeżeli znajdzie idhandl i seria będzie "sOP" to kasuj mg.setkey("idhandl") mg.SetKeySeg("idhandl",IDHANDLOWY) errormg = mg.GetRec(GE) while !errormg if mg.GetField("seria") == "sOP" then mg.SetField("idhandl",0) mg.putrec() exit endif errormg = mg.GetRec(NX) wend //Jeżeli chcemy przyjąć więcej jak wydano! if ilewparagonie < ilosc*(-1) then message "Pojemników do wydania " + dk.GetFIeld("odebrane") blad = 0 exit else ilewparagonie = ilewparagonie +ilosc silewparagonie = using "%d", ilewparagonie dk.setfield("odebrane",silewparagonie) dk.putrec() endif else //Jeżeli chcemy po raz drugi wydać pojemniki na ten sam paragon if ilewparagonie != 0 then message "Na ten paragon wydano już pojemniki" blad = 0 exit else ilewparagonie = ilosc + ilewparagonie sIleWParagonie = using "%d", ilewparagonie dk.SetField("odebrane", sIleWParagonie) dk.putrec() endif endif //Ustawianie pól IOREC w zależności czy zwrot czy nie if ilosc < 0 then mag.SetField("typ_dokumentu","WZK") mag.SetField("seria","sOPK") else mag.SetField("typ_dokumentu","WZ") mag.SetField("seria","sOP") endif mag.SetField("data_wystawienia",Data()) mag.SetField("data_operacji",data()) if ilosc < 0 then mag.SetField("KodDokKoryg",mg.GetFIeld("kod")) else mag.SetField("rezerwacja","0") mag.SetField("termin",DataRozl.tostr()) iddk = using "%0.0f", IDHANDLOWY mag.SetField("idhandl",iddk) endif mag.SetField("kodmag","MZwrotne") mag.SetField("khkod",kodKH) mag.SetField("rejestr_vat","RWM") mag.SetField("nazwarodzaju","POJEMNIKI") mag.SetField("schematKs","WZ") mag.SetField("Opis",opis) //mag.endsection() mag.beginSection("Pozycja dokumentu") if ilosc < 0 then mag.SetField("Lp","1") mag.SetField("schematks","Wzk") mag.SetField("czyPoKorekcie","0") else mag.SetField("schematks","Wz") endif mag.SetField("kod","pojemnik") mag.SetField("Ilosc",silosc) mag.SetField("cena","20") mag.endsection() i = mag.ImportMG() IDMAGAZYNOWY = WystawDokumentMagazynowy(i,1) if ilosc > 0 then //Jeżeli wydajemy pojemniki to automatycznie utwórz dowiązanie w WZ z dok sprzedaży mg.SetKey("id") mg.SetKeySeg("id",IDMAGAZYNOWY) mg.GetRec(EQ) mg.SetField("idhandl",IDHANDLOWY)//TODO: id dokumentu handlowego mg.putrec() endif if ilosc < 0 && ilewparagonie > 0 then //Jezeli zwrócono mniej niż wydano to dowiąz ponownie idhandl mg.GETRECBYID(IDMAGAZYNOWY) //Tutaj dokument magazynowy to korekta - przypisano przy wystawianiu //ustaw na korekcie i sprawdź id dokumentu korygowanego mg.getrecbyid(mg.getfield("iddokkoryg")) mg.setfield("idhandl",IDHANDLOWY) mg.PUTREC() endif if IDMAGAZYNOWY == 0 then message "Nie wystawiono dokumentu Wz/WZK" blad == 0 endif endsub Automatyczne wystawianie KP i KW Kod: int ok=0 float brutto,lIdDk string data_plat = data() string wyb_kasa String kodktr string khnazwa string kodDok int rejestr int BuforBaza basedp dp basebd bd basepn pn int sub WystawPlatnosc(float IdRekord, string sKasa, String typ, int Baza, float KwotaK) //IdRekord rekord dokumentu handlowego - w procedurach iIddk //kasa - rodzaj kasy //typ - "Wpłata", "Wypłata" //kasa - "Kasa1", "Kasa2" if Baza == 0 then dk.getrecbyid(idRekord) kodktr = dk.GetField("khkod") khnazwa = dk.GetField("khnazwa") brutto = dk.GetField("netto") + dk.GetField("vat") Koddok = dk.GetField("kod") else bd.getrecbyid(idRekord) kodktr = bd.GetField("khkod") khnazwa = bd.GetField("khnazwa") brutto = bd.GetField("netto") + bd.GetField("vat") Koddok = dk.GetField("kod") endif if KwotaK != 0 then brutto = kwotak IoRec Dok dok.clear() dok.SetField("Rejestr",skasa) if brutto > 0 then dok.SetField("Typ_dk", "KP") dok.SetField("Seria","sKP") dok.setfield("schematKs", "WPL") dok.SetField("Rodzaj_platnosci","wpłata") endif if brutto < 0 then dok.Setfield("Typ_dk","KW") dok.SetField("Seria","sKW") dok.setfield("schematKs", "WYPL") dok.SetField("Rodzaj_platnosci","wypłata") endif if brutto < 0 then brutto = brutto * -1 dok.SetField("numerWSerii","0") dok.SetField("khkod",kodktr) dok.SetField("kwota",using "%f", brutto) dok.SetField("Data_platnosci", data_plat) dok.SetField("Khtyp","Kontrahent") dok.setfield("Termin_platnosci", "0") Dok.SetField("opis", "Kaucja za pojemnik do: " + kodDok + " " + khnazwa) ok = 0 ok= WystawDokumentPlatnosci(Dok,1) endsub int sub OknoKasy(long idDokumentu, int BazaBufor, Float PLN) string kasa(2) = "KASA 1" , "KASA 2" string wyb_kasa, ktr, kod string data_plat = data() if bazabufor == 0 then dk.getrecbyid(idDokumentu) kod = dk.GetFIeld("kod") ktr = dk.GetField("khnazwa") else bd.getrecbyid(iddokumentu) kod = bd.GetFIeld("kod") ktr = bd.GetField("khnazwa") endif form "Wybierz Rejestr Kasowy dla:", 235,160 text "Kontrahent: "+ktr +"\nNumer Dokumentu: "+ kod, 0,5,280,50 cmbbox "Rejestr ", kasa, wyb_kasa ,100,40,100,100 datedit "Data Płatności", Data_plat, 100, 60, 100,20 button "&OK", 5,110,100,25,2 button "&Anuluj", 140,110,100,25,-1 ok = execform if ok == -1 then exit if ok == 2 then WystawPlatnosc(idDokumentu, wyb_kasa, "Wpłata", BazaBufor, PLN) endif endsub To mniej więcej tak....u mnie działa kod jeszcze nie został zoptymalizowany pod względem zmiennych. Uwagi mile widziane, pozdrawiam |
Strona 1 z 1 | Strefa czasowa UTC+1godz. [letni] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |