; DDT pokladní doklad - paragon ; verze z 22.3.2017 ; Autor: WinDUO Team ;dodělat, ať se při tisku detailu nepoužívá STRNATIVE ale tisk pravostranných nul podle nastavení ;upraveno tak, ze pro souctovou tabulku DPH bere udaje z toho, co se tiskne, a ne ze skladu ;upraveno pro neplatce ; 26.11.2004 upraveno pro tisk skladoveho cisla, kodu, cisla skladu a druhu dle nastaveni paragonu ; 26.11.2004 pridany informace o poskytnute sleve ; 13.10.2005 pridana podpora fiskalniho modulu ; 2. 6.2006 pridan tisku souctu v cizi mene ; 31.12.2014 pridana snizena sazba DPH 2 ; 7. 2.2017 pridano EET ; 12. 3.2017 pridan graficky tisk prostrednictvim ovladace tiskarny Name('Pokladní doklad - paragon') Designed('Pokladna','PokladnaS','PokladnaR') Author('Milan Slíva','EMail: sliva@fi.cz','http://www.fi.cz') Descr('Pokladní doklad - paragon','včetně skladových pohybů.','(Určeno pro tiskárny paragonů','- tiskárnu nutno mít zapnutou a nastavenou)') Procedure Output(OutStr:String) if(OutMode=0) begin WriteLn(Tiskarna,TreatString(OutStr,Znaku)) end else begin OutStr=TransESC(OutStr) LStr=TreatString(ToChar(#9,OutStr)) OutStr=FromChar(#9,OutStr) MStr=TreatString(ToChar(#9,OutStr)) RStr=TreatString(FromChar(#9,OutStr)) if(Length(LStr)<>0) XText(PMargin,,PWidth,TA_LINE|TA_LEFT,LStr) if(Length(MStr)<>0) XText(PMargin+(PWidth/2),,PWidth,TA_LINE|TA_CENTER,MStr) if(Length(RStr)<>0) XText(PMargin+PWidth,,PWidth,TA_LINE|TA_RIGHT,RStr) NextLine() end; end Procedure OutDivider(DivChar:Char) if(OutMode=0) begin WriteLn(Tiskarna,DupChar(DivChar,Znaku)); end else begin Divider(PMargin,PWidth,DivChar); NextLine(); end; end Procedure TiskniSN(PohybCislo:LongInt) if(SN) begin LocStr1:String LocStr2:String LocBool:Boolean VetaPSC:LongInt VetaSN:LongInt RozRadku:LongInt KeyPohybSeriovehoCisla3.Length=4 KeyPohybSeriovehoCisla3.CisloPH=SwapL(Pohyb.Cislo) LocBool=FindKey(KeyPohybSeriovehoCisla3,VetaPSC) While((LocBool)and(KeyPohybSeriovehoCisla3.CisloPH=SwapL(Pohyb.Cislo))) begin ReadRec(PohybSeriovehoCisla,VetaPSC) KeySerioveCislo1.Length=4 KeySerioveCislo1.Cislo=SwapL(PohybSeriovehoCisla.CisloSN) if(FindKey(KeySerioveCislo1,VetaSN)) begin ReadRec(SerioveCislo,VetaSN) LocStr1=GetString(7899) LocStr2=Copy(LocStr1,Sklad.Vymezeni+1,1) LocStr1=GetString(7900+Sklad.Vymezeni) if(Priznaky&2<>0) begin if((PohybSeriovehoCisla.Mnozstvi<>1)or(Sklad.Flags2&$02<>0)) begin ObsahRadku='*** '+Sklad.SNDescr+' '+SerioveCislo.Number+' '+StrQuantity(PohybSeriovehoCisla.Mnozstvi)+' '+Sklad.MJ end else begin ObsahRadku='*** '+Sklad.SNDescr+' '+SerioveCislo.Number; end; Output(ObsahRadku) end; if(Priznaky&2<>0) begin if(CompareStr(LocStr2,'O')) ObsahRadku='*** '+LocStr1+' '+Str(SerioveCislo.VymezLimit) else if(CompareStr(LocStr2,'D')) ObsahRadku='*** '+LocStr1+' '+StrDate(SerioveCislo.VymezDate) else if(Length(LocStr1)>0) ObsahRadku='*** '+LocStr1 else ObsahRadku='' if(Length(ObsahRadku)<>0) Output(ObsahRadku) end; Inc(RozRadku); end LocBool=NextKey(KeyPohybSeriovehoCisla3,VetaPSC) end if(Priznaky&6<>0)and(RozRadku<>0) Output('') end end DeclareRec('Program') if(Program.FiscalModule) begin CallDDT('ParagFM.DDT'); Exit; end; DeclareRec('Pokladna') GetBindRec(Pokladna); SetID('Paragon '+Pokladna.Doklad); if(Program.Sklady) begin DeclareRec('Sklad'); DeclareRec('KeySklad10'); DeclareRec('Pohyb'); end; ; ******* Deklarace pozdeji použitých proměnných ******* IsEET:Boolean=IsPKP(Pokladna.PKP) SazbaDPHNizsi:Byte=SazbaDPH(dph_Snizena,Pokladna.Datum_ZP) SazbaDPHVyssi:Byte=SazbaDPH(dph_Zakladni,Pokladna.Datum_ZP) SazbaDPHSnizena:Byte=SazbaDPH(dph_Snizena2,Pokladna.Datum_ZP) VyssiDPHZaklad:Double NizsiDPHZaklad:Double SnizenaDPHZaklad:Double VyssiDPHDan:Double NizsiDPHDan:Double SnizenaDPHDan:Double CastkaSDPH:Double BezDPH:Double Celkem:Double CelkemBezDPH:Double LocL:LongInt SumaNula:Double SumaNizsi:Double SumaVyssi:Double SumaSnizena:Double CelkemNezaokr:Double ZaokrRozdil:Double LStr:String MStr:String RStr:String Pohybu:Word if(Program.Sklady) begin Pohybu=GetCountBindRec(Pohyb) end; ; ******* Otevření portu tiskárny ******* IniSoubor:String=DataPath+'PARAGON.INI' Port:String=ToChar(':',Trim(GetIni('PARAGON','Port'))); Znaku:Integer=Val(GetFromIni('PARAM','Chars',IniSoubor)); Priznaky:Word=Val(GetFromIni('PARAM','Flags',IniSoubor)); if((Length(Port)=0) or (Znaku<=0)) begin Message('Nejdříve proveďte nastavení paragonu v hlavním menu / Nastavení / Nastavení paragonu',mb_IconStop); Exit; end; LocStr:String=GetFromIni('PARAGON','PortSet','DUO.INI'); OutMode:Byte=0 if(CompareStr(UpCase(Port),'PRINTER'))) begin WNSType(0); FileName('Paragon.WNS'); PName:String=GetIni('PARAGON','Printer'); FastMode(true,PName); FName:String=GetIni('PARAGON','FontName'); FStyle:Byte=Val(GetIni('PARAGON','FontStyle')); FSize:Double=Val(GetIni('PARAGON','FontSize')); Font(FName,FSize,FStyle,,ff_Modern); PWidth:Double=Val(GetIni('PARAGON','Width')); PMargin:Double=Val(GetIni('PARAGON','Margin')); if(Znaku<>0) begin GetFontIndex(PWidth,DupChar('W',Znaku)); FontIndex(); end; Logo:String=GetIni('PARAGON','Logo'); LogoX:Double=Val(GetIni('PARAGON','LogoLeft'))+PMargin; LogoY:Double=Val(GetIni('PARAGON','LogoTop')); LogoW:Double=Val(GetIni('PARAGON','LogoWidth')); LogoH:Double=Val(GetIni('PARAGON','LogoHeight')); if(Length(Logo)<>0) begin PaintMetaFile(LogoX,LogoY,LogoW,LogoH,Logo); end; Pen(ps_Solid,0.25); MoveTo(PMargin,LogoY+LogoH); NextLine(); OutMode=1 end else if(CompareStr(UpCase(Port),'FILE')) begin Tiskarna:TextFile; FName:String=GetFromIni('PARAGON','file'); Rewrite(Tiskarna,FName,True); WNSType(-1); end else if(Val(ToChar(',',LocStr))>0) begin Tiskarna:Port; LocStr=FromChar(',',LocStr); StrCom('Open(Tiskarna,'''+Port+''','+LocStr+')'); WNSType(-1); end else begin Tiskarna:TextFile; Rewrite(Tiskarna,Port,True); WNSType(-1); end; Diakritika:Word=Val(GetFromIni('PARAM','Diakritika',IniSoubor)); LocStr:String=UpCase(NTrim(GetFromIni('PARAM','Exchange',IniSoubor))) if(Length(LocStr)<>0) begin Exchange:Integer=CCCToNum(LocStr); end else begin Exchange:Integer end; LoadTranslateTab(Diakritika); if(OutMode=0) SetTranslate(Tiskarna,True); if(Program.RezimDPH<>0) begin if(Pohybu<>0) begin Output('Daňový doklad č.\t\t'+Pokladna.Doklad) end else if(IsEET) begin Output('Číslo účtenky\t\t'+Pokladna.idCis) Output('\tnení daňovým dokladem') end; end; else begin Output('P A R A G O N č.\t\t'+Pokladna.Doklad) Output('\tDoklad od neplátce DPH\t') end; OutDivider('-') Datum:Word if(Program.RezimDPH<>0) begin if(Pohybu<>0) begin Datum=Pokladna.Datum_ZP Output('Datum zdanitelného plnění\t\t'+StrDate(Datum)) end; end else begin if(not IsEET) begin Datum=Pokladna.Datum Output('Datum\t\t'+StrDate(Datum)) end; end; Output('') ; ******* Vytištění hlavičky ******* ObsahRadku:String; RozsireniRadku:String; Radku:Word=Val(GetFromIni('HEADER','Lines',IniSoubor)) Radek:Word=0 While(Radek=Program.HideICOLess) begin OutDivider('-') Output('Odběratel:') ObsahRadku='IČ: '+Pokladna.ICO if(Length(Pokladna.DIC)<>0) ObsahRadku=ObsahRadku+'\t\tDIČ: '+Pokladna.DIC Output(ObsahRadku); if(Length(Pokladna.Firma)<>0) Output(Pokladna.Firma); if(Length(Pokladna.Rozsireni)<>0) Output(Pokladna.Rozsireni); if(Length(Pokladna.Ulice)<>0) Output(Pokladna.Ulice); if(Length(Pokladna.Mesto)<>0) Output(Pokladna.Mesto); end; OutDivider('=') if(IsEET) begin Output('Provozovna: '+Str(Pokladna.idProvoz)+'\t\t'+'Pokladna: '+Pokladna.idPokl); Output('Datum: '+StrUTCDate(Pokladna.ReceiptTime,true)+'\t\tčas: '+StrUTCTime(Pokladna.ReceiptTime,true,true)); OutDivider('-') end; ; ******* vytištění položek paragonu ******* Output('\t\t'+Program.Mena+' ') SN:Boolean=Program.Strediska; if(Program.Sklady) begin if(SN) begin DeclareRec('PohybSeriovehoCisla') DeclareRec('KeyPohybSeriovehoCisla3') DeclareRec('SerioveCislo') DeclareRec('KeySerioveCislo1') end Radek=0 While(Radek0) begin CastkaSDPH=RoundFloat(Pohyb.Castka*(1+Pohyb.DPH/100),-2) CelkemNezaokr=CelkemNezaokr+CastkaSDPH if(Pohyb.DPH=0) begin BezDPH=BezDPH+Pohyb.Castka end else if(Pohyb.DPH=SazbaDPHVyssi) begin VyssiDPHZaklad=VyssiDPHZaklad+Pohyb.Castka VyssiDPHDan=VyssiDPHDan+(CastkaSDPH-Pohyb.Castka) end else if(Pohyb.DPH=SazbaDPHNizsi) begin NizsiDPHZaklad=NizsiDPHZaklad+Pohyb.Castka NizsiDPHDan=NizsiDPHDan+(CastkaSDPH-Pohyb.Castka) end else if(Pohyb.DPH=SazbaDPHSnizena) begin SnizenaDPHZaklad=SnizenaDPHZaklad+Pohyb.Castka SnizenaDPHDan=SnizenaDPHDan+(CastkaSDPH-Pohyb.Castka) end else begin if(Pohyb.DPH<17) begin if(SazbaDPHNizsi<>0) begin Chyba: Error('Chyba !!! Více sazeb DPH v jedné daňové kategorii',mb_IconStop) end SazbaDPHNizsi=Pohyb.DPH NizsiDPHZaklad=Pohyb.Castka NizsiDPHDan=CastkaSDPH-Pohyb.Castka end else begin if(SazbaDPHVyssi<>0) begin GoTo(Chyba) end SazbaDPHVyssi=Pohyb.DPH VyssiDPHZaklad=Pohyb.Castka VyssiDPHDan=CastkaSDPH-Pohyb.Castka end end end else begin Celkem=Celkem+Pohyb.Castka CastkaSDPH=Pohyb.Castka end KeySklad10.Length=4 KeySklad10.Cislo=SwapL(Pohyb.CisloMat) if(FindKey(KeySklad10,LocL)) begin ReadRec(Sklad,LocL) end else begin ClearRec(Sklad) end; if(Priznaky&1=0) ObsahRadku=Sklad.Nazev else begin ObsahRadku=Sklad.DisplayText if(Length(ObsahRadku)=0) ObsahRadku=Sklad.Nazev end; RozsireniRadku=''; if(Priznaky&$8<>0) RozsireniRadku=RozsireniRadku+Sklad.Material; if(Priznaky&$10<>0) begin if(Length(RozsireniRadku)<>0) RozsireniRadku=RozsireniRadku+' '; RozsireniRadku=RozsireniRadku+Sklad.Kod; end; if(Priznaky&$20<>0) begin if(Length(RozsireniRadku)<>0) RozsireniRadku=RozsireniRadku+' '; RozsireniRadku=RozsireniRadku+Str(Sklad.Sklad); end; if(Priznaky&$40<>0) begin if(Length(RozsireniRadku)<>0) RozsireniRadku=RozsireniRadku+' '; RozsireniRadku=RozsireniRadku+Str(Sklad.Druh); end; if(Pohyb.Mnozstvi<>1) begin if(Length(RozsireniRadku)<>0) then begin if(Length(RozsireniRadku)+Length(ObsahRadku)0) begin ;ObsahRadku=' '+StrNative(Pohyb.Mnozstvi,3)+' x '+Str(RoundFloat(Pohyb.JednCena*(1+Pohyb.DPH/100),-2),,Program.FCenaDecSize); ObsahRadku=' '+StrNative(Pohyb.Mnozstvi,3)+' x '+StrPrice(Pohyb.JednCena*(1+Pohyb.DPH/100)); end else begin ;ObsahRadku=' '+StrNative(Pohyb.Mnozstvi,3)+' x '+Str(RoundFloat(Pohyb.JednCena,-2),,2); toto tady bylo ObsahRadku=' '+StrNative(Pohyb.Mnozstvi,3)+' x '+StrPrice(RoundFloat(Pohyb.JednCena,-2)); end end ObsahRadku=ObsahRadku+'\t\t'+Str(CastkaSDPH,,2)+' '; if(Pohyb.DPH=0) begin ObsahRadku=ObsahRadku+'C' SumaNula=SumaNula+(Pohyb.Mnozstvi*(RoundFloat(Pohyb.JednCena,-2))) end else if(Pohyb.DPH=SazbaDPHNizsi) begin ObsahRadku=ObsahRadku+'B' SumaNizsi=SumaNizsi+(Pohyb.Mnozstvi*(RoundFloat(Pohyb.JednCena*(1+Pohyb.DPH/100),-2))) end else if(Pohyb.DPH=SazbaDPHVyssi) begin ObsahRadku=ObsahRadku+'A' SumaVyssi=SumaVyssi+(Pohyb.Mnozstvi*(RoundFloat(Pohyb.JednCena*(1+Pohyb.DPH/100),-2))) end else if(Pohyb.DPH=SazbaDPHSnizena) begin ObsahRadku=ObsahRadku+'D' SumaSnizena=SumaSnizena+(Pohyb.Mnozstvi*(RoundFloat(Pohyb.JednCena*(1+Pohyb.DPH/100),-2))) end else begin if(Program.RezimDPH<>0) ObsahRadku=ObsahRadku+'?' else ObsahRadku=ObsahRadku+' ' end if(Length(RozsireniRadku)<>0) then begin if(Length(RozsireniRadku)+Length(ObsahRadku)0) begin if(IsEET) begin VyssiDPHZaklad=Pokladna.Amounts[eet_zakl_dan1]; VyssiDPHDan=Pokladna.Amounts[eet_dan1]; NizsiDPHZaklad=Pokladna.Amounts[eet_zakl_dan2]; NizsiDPHDan=Pokladna.Amounts[eet_dan2]; SnizenaDPHZaklad=Pokladna.Amounts[eet_zakl_dan3]; SnizenaDPHDan=Pokladna.Amounts[eet_dan3]; BezDPH=Pokladna.Amounts[eet_zakl_nepodl_dph]; end else if(Pokladna.ZaokrDPH) begin NizsiDPHDan=RoundFloat(Int((NizsiDPHDan+0.09)*10)/10,-2) VyssiDPHDan=RoundFloat(Int((VyssiDPHDan+0.09)*10)/10,-2) SnizenaDPHDan=RoundFloat(Int((SnizenaDPHDan+0.09)*10)/10,-2) end; CelkemBezDPH=VyssiDPHZaklad+NizsiDPHZaklad+SnizenaDPHZaklad+BezDPH Celkem=CelkemBezDPH+VyssiDPHDan+NizsiDPHDan+SnizenaDPHDan end else begin CelkemNezaokr=Celkem end; Output('\t\t'+DupChar('=',14)); ZaokrRozdil=RoundFloat(RoundFloat(Pokladna.Castka,-2)-RoundFloat(Celkem,-2),-2) if(ZaokrRozdil<>0) begin Output('Zaokrouhlení\t\t'+Str(Pokladna.Castka-CelkemNezaokr,0,2)+' ') end; if(Pokladna.Typ=0) Output('C E L K E M\t\t'+Str(Pokladna.Castka,,2)+' ') else Output('Platba kartou\t\t'+Str(Pokladna.Castka,,2)+' ') if((Pokladna.Mena<0)and(Pokladna.CastkaM<>0)) begin MenaStr:String=NumToCCC(Pokladna.Mena) Kurz:Real=GetExchange(MenaStr,Datum,kurz_PokladnaPrijem); if(Kurz<>0) begin if(RoundCurrency(Pokladna.Castka/Kurz,MenaStr)<>RoundCurrency(Pokladna.CastkaM)) Kurz=0; end; if(Kurz=0) Kurz=RoundFloat(Pokladna.Castka/Pokladna.CastkaM,-4); Output(''); Output('Celkem v '+MenaStr+' (kurz '+Str(Kurz,,2)+')\t\t'+StrCurrency(Pokladna.CastkaM,MenaStr)+' '+MenaStr); end else begin MenaStr:String=NumToCCC(ExChange) if((Exchange<0) and (ExistExchange(MenaStr,Datum,kurz_PokladnaPrijem))) then begin Kurz:Real=GetExchange(MenaStr,Datum,kurz_PokladnaPrijem); if(Kurz<>0) begin LocR:Real=RoundCurrency(Pokladna.Castka/Kurz,MenaStr) Output(''); Output('Celkem v '+MenaStr+' (kurz '+Str(Kurz,,2)+')\t\t'+StrCurrency(LocR,MenaStr)+' '+MenaStr); end; end; end; if(Program.RezimDPH<>0) begin Output('') if(Znaku>=40) begin Output('\tRekapitulace DPH v '+Program.Mena) Output('Sazba základ DPH\t\tCelkem ') if(BezDPH<>0) begin ObsahRadku=' 0%'+Str(BezDPH,12,2)+'\t\t'+Str(BezDPH,,2)+' C'; Output(ObsahRadku) end; if(SnizenaDPHDan<>0) begin ObsahRadku=FillStrL(Str(SazbaDPH(dph_Snizena2,Pokladna.Datum_ZP))+'%',3)+Str(SnizenaDPHZaklad,12,2)+Str(SnizenaDPHDan,10,2)+'\t\t'+Str(SnizenaDPHZaklad+SnizenaDPHDan,,2)+' D'; Output(ObsahRadku) end; if(NizsiDPHDan<>0) begin ObsahRadku=FillStrL(Str(SazbaDPH(dph_Snizena,Pokladna.Datum_ZP))+'%',3)+Str(NizsiDPHZaklad,12,2)+Str(NizsiDPHDan,10,2)+'\t\t'+Str(NizsiDPHZaklad+NizsiDPHDan,,2)+' B'; Output(ObsahRadku) end; if(VyssiDPHDan<>0) begin ObsahRadku=FillStrL(Str(SazbaDPH(dph_Zakladni,Pokladna.Datum_ZP))+'%',3)+Str(VyssiDPHZaklad,12,2)+Str(VyssiDPHDan,10,2)+'\t\t'+Str(VyssiDPHZaklad+VyssiDPHDan,,2)+' A'; Output(ObsahRadku) end; end else begin Output('\tRekapitulace DPH v '+Program.Mena) Output('Sazba DPH\t\tCelkem ') if(BezDPH<>0) begin ObsahRadku=' 0%'+FillStrL('',12)+'\t\t'+Str(BezDPH,,2)+' C'; Output(ObsahRadku) end; if(SnizenaDPHDan<>0) begin ObsahRadku=FillStrL(Str(SazbaDPH(dph_Snizena2,Pokladna.Datum_ZP))+'%',3)+FillStrL(Str(SnizenaDPHDan,,2),12)+'\t\t'+Str(SnizenaDPHZaklad+SnizenaDPHDan,,2)+' D'; Output(ObsahRadku) end; if(NizsiDPHDan<>0) begin ObsahRadku=FillStrL(Str(SazbaDPH(dph_Snizena,Pokladna.Datum_ZP))+'%',3)+FillStrL(Str(NizsiDPHDan,,2),12)+'\t\t'+Str(NizsiDPHZaklad+NizsiDPHDan,,2)+' B'; Output(ObsahRadku) end; if(VyssiDPHDan<>0) begin ObsahRadku=FillStrL(Str(SazbaDPH(dph_Zakladni,Pokladna.Datum_ZP))+'%',3)+FillStrL(Str(VyssiDPHDan,,2),12)+'\t\t'+Str(VyssiDPHZaklad+VyssiDPHDan,,2)+' A'; Output(ObsahRadku) end; end; end; if(Pokladna.Sleva<>0) begin Output('') Output('Na dokladu byla uplatněna sleva\t\t'+StrNative(Pokladna.Sleva,2)+'%') Output('') end; OutDivider('-') if(IsEET) begin RezimStr:String='běžný'; if(Program.EETRezim=1) RezimStr='zjednodušený'; Output('Režim tržby:\t\t'+RezimStr); Output(''); TistenyFIK:Boolean=False; if((IsFIK(Pokladna.FIK))and(Program.EETRezim<>1)) begin Output('\tFIK\t'); Output('\t'+GetFIK(Pokladna.FIK)+'\t'); Output(''); TistenyFIK=True; end; Output('\tBKP\t'); BKPStr:String=GetBKP(Pokladna.BKP); if(Length(BKPStr)<=Znaku) begin Output('\t'+BKPStr+'\t'); end else begin Output('\t'+Copy(BKPStr,1,27)+'\t'); Output('\t'+Copy(BKPStr,28)+'\t'); end; Output(''); if(not TistenyFIK) begin Output('\tPKP\t'); PKPSegment:Byte; PKPSegmentStr:String=GetPKPSegmentStr(Pokladna.PKP,Znaku,PKPSegment); While(Length(PKPSegmentStr)<>0) do begin Output('\t'+PKPSegmentStr+'\t'); Inc(PKPSegment); PKPSegmentStr=GetPKPSegmentStr(Pokladna.PKP,Znaku,PKPSegment); end; end; OutDivider('-') end; ; ******* Vytištění patičky ******* Output('') Radku=Val(GetFromIni('FOOTER','Lines',IniSoubor)) Radek=0 While(Radek