getPreis.p 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. /* -------------------------------------------------- */
  2. /* Preisfindung */
  3. /* -------------------------------------------------- */
  4. DEF INPUT PARAMETER ipKnr AS INT NO-UNDO.
  5. DEF INPUT PARAMETER ipDatum AS DATE NO-UNDO.
  6. DEF INPUT PARAMETER ipAufze AS HANDLE NO-UNDO.
  7. DEF VAR hBuffer AS HANDLE NO-UNDO.
  8. DEF VAR Firma AS CHAR NO-UNDO.
  9. DEF VAR VPreis AS DEC DECIMALS 4 NO-UNDO.
  10. DEF VAR VRab_Betr AS DEC DECIMALS 4 NO-UNDO.
  11. DEF VAR VRab_Proz AS DEC DECIMALS 4 NO-UNDO.
  12. DEF VAR VZus_Betr AS DEC DECIMALS 4 NO-UNDO.
  13. DEF VAR VZus_Proz AS DEC DECIMALS 4 NO-UNDO.
  14. DEF VAR Rundbetr AS DEC DECIMALS 4 NO-UNDO.
  15. DEF VAR VAktion AS LOG NO-UNDO.
  16. DEF VAR VAktion_Text AS CHAR NO-UNDO.
  17. DEF VAR VP_Grp AS INT NO-UNDO.
  18. DEF VAR VGrp AS INT NO-UNDO.
  19. DEF VAR NettoRab AS INT NO-UNDO.
  20. DEF VAR Aktionen AS INT NO-UNDO.
  21. DEF VAR PosMenge AS INT NO-UNDO.
  22. DEF VAR FAbweich AS LOG NO-UNDO.
  23. DEF VAR KeineAkt AS LOG NO-UNDO.
  24. DEF VAR FSpezPreis AS INT NO-UNDO.
  25. /* 0 = Kein Spezialpreis */
  26. /* 1 = Spezialpreis auf Artikel */
  27. /* 2 = Spezialpreis auf Rabattgruppe */
  28. DEF VAR FwPreisGrp AS INT NO-UNDO.
  29. DEF TEMP-TABLE tAufze NO-UNDO LIKE Aufze.
  30. CREATE tAufze.
  31. hBuffer = TEMP-TABLE tAufze:DEFAULT-BUFFER-HANDLE.
  32. hBuffer:BUFFER-COPY(ipAufze).
  33. Firma = tAufze.Firma.
  34. FIND Steuer NO-LOCK
  35. WHERE Steuer.Firma = Firma NO-ERROR.
  36. ASSIGN FwPreisGrp = Steuer.Fwi14
  37. Aktionen = Steuer.Fwi20
  38. NettoRab = Steuer.Fwi15
  39. PosMenge = ABS(tAufze.MBest)
  40. .
  41. FIND Debst NO-LOCK
  42. WHERE Debst.Firma = Firma
  43. AND Debst.Knr = ipKnr NO-ERROR.
  44. IF NOT AVAILABLE Debst THEN RETURN.
  45. ASSIGN tAufze.Rab_Art = Debst.Zei_Rab_Art
  46. tAufze.Rab_Wert = Debst.Zei_Rab_Wert
  47. tAufze.Rab_Betr = 0
  48. tAufze.Zus_Art = Debst.Zuschl_Art
  49. tAufze.Zus_Wert = Debst.Zuschl_Wert
  50. tAufze.Zus_Betr = 0
  51. tAufze.Bru_Betr = 0
  52. tAufze.Net_Betr = 0.
  53. FIND Artst NO-LOCK
  54. WHERE Artst.Firma = Firma
  55. AND Artst.Artnr = tAufze.Artnr
  56. AND Artst.Inhalt = tAufze.Inhalt
  57. AND Artst.Jahr = tAufze.Jahr NO-ERROR.
  58. IF NOT AVAILABLE Artst THEN RETURN.
  59. FIND Wust NO-LOCK USE-INDEX Wust-k1
  60. WHERE Wust.CodeK = Debst.MWST
  61. AND Wust.CodeA = Artst.MWST NO-ERROR.
  62. tAufze.WuCd = Wust.WuCd.
  63. FIND FIRST Wust NO-LOCK USE-INDEX Wust-k2
  64. WHERE Wust.WuCd = tAufze.WuCd NO-ERROR.
  65. FIND LAST MWSTAns NO-LOCK USE-INDEX MWSTAns-k1
  66. WHERE MWSTAns.MWST_Cd = tAufze.WuCd
  67. AND MWSTAns.Datum <= ipDatum NO-ERROR.
  68. tAufze.MWST% = MWSTAns.Ansatz.
  69. tAufze.MWST_Inkl = Wust.Incl.
  70. VPreis = 0.
  71. VRab_Betr = 0.
  72. VRab_Proz = 0.
  73. VAktion = FALSE.
  74. VAktion_Text = ''.
  75. VP_Grp = 0.
  76. FAbweich = FALSE.
  77. PosMenge = ABS(tAufze.MBest).
  78. FIND AbwPrGrp USE-INDEX AbwPrGrp-k1
  79. WHERE AbwPrGrp.Firma = Firma
  80. AND AbwPrGrp.Knr = ipKnr
  81. AND AbwPrGrp.Wg_Grp = Artst.Wg_Grp NO-LOCK NO-ERROR.
  82. IF AVAILABLE AbwPrGrp THEN DO:
  83. VP_Grp = AbwPrGrp.Preis_Grp.
  84. FAbweich = TRUE.
  85. END.
  86. ELSE VP_Grp = Debst.Preis_Grp.
  87. IF Steuer.AktionsPreise = 0 THEN VGrp = VP_Grp.
  88. IF Steuer.AktionsPreise = 1 THEN VGrp = Debst.Ku_Grp.
  89. /* -------------------------------------------------------------- */
  90. /* Aktionspreise auf dieser Warengruppe möglich ? */
  91. /* -------------------------------------------------------------- */
  92. FIND AktKeine NO-LOCK USE-INDEX AktKeine-k1
  93. WHERE AktKeine.Firma = Firma
  94. AND AktKeine.Knr = ipKnr
  95. AND AktKeine.Wgr = Artst.Wg_Grp NO-ERROR.
  96. IF AVAILABLE AktKeine THEN KeineAkt = TRUE.
  97. ELSE KeineAkt = FALSE.
  98. DO WHILE TRUE:
  99. ASSIGN tAufze.Rab_Su_Grp = 0
  100. tAufze.Rab_Su_Art = 0.
  101. FIND RabTab NO-LOCK USE-INDEX RabTab-k1
  102. WHERE RabTab.Firma = Firma
  103. AND RabTab.Ku_Rab = Debst.Rab_Grp
  104. AND RabTab.Art_Rab = Artst.Rab_Grp NO-ERROR.
  105. IF NOT AVAILABLE RabTab THEN LEAVE.
  106. ASSIGN tAufze.Rab_Su_Grp = RabTab.Rab_Summ
  107. tAufze.Rab_Su_Art = RabTab.Add_Art.
  108. IF tAufze.Netto THEN LEAVE.
  109. IF RabTab.Wert = 0 THEN LEAVE.
  110. LEAVE.
  111. END.
  112. DO WHILE TRUE:
  113. IF tAufze.Rab_Art = 3 THEN DO:
  114. IF Artst.DEP <> 0 THEN VPreis = Artst.DEP.
  115. IF Artst.LEP <> 0 THEN VPreis = Artst.LEP.
  116. IF Artst.Listen_EP <> 0 THEN VPreis = Artst.Listen_EP.
  117. LEAVE.
  118. END.
  119. FIND LAST ArtPreis NO-LOCK USE-INDEX ArtPreis-k1
  120. WHERE ArtPreis.Firma = Firma
  121. AND ArtPreis.Artnr = tAufze.Artnr
  122. AND ArtPreis.Inhalt = tAufze.Inhalt
  123. AND ArtPreis.Jahr = tAufze.Jahr
  124. AND ArtPreis.Preis_Grp = VP_Grp
  125. AND ArtPreis.Aktion = FALSE
  126. AND ArtPreis.Ab_Datum <= ipDatum NO-ERROR.
  127. DO WHILE TRUE:
  128. IF AVAILABLE ArtPreis THEN LEAVE.
  129. IF FAbweich THEN DO:
  130. FIND LAST ArtPreis NO-LOCK USE-INDEX ArtPreis-k1
  131. WHERE ArtPreis.Firma = Firma
  132. AND ArtPreis.Artnr = tAufze.Artnr
  133. AND ArtPreis.Inhalt = tAufze.Inhalt
  134. AND ArtPreis.Jahr = tAufze.Jahr
  135. AND ArtPreis.Preis_Grp = Debst.Preis_Grp
  136. AND ArtPreis.Aktion = FALSE
  137. AND ArtPreis.Ab_Datum <= ipDatum NO-ERROR.
  138. IF AVAILABLE ArtPreis THEN LEAVE.
  139. END.
  140. FIND LAST ArtPreis NO-LOCK USE-INDEX ArtPreis-k1
  141. WHERE ArtPreis.Firma = Firma
  142. AND ArtPreis.Artnr = tAufze.Artnr
  143. AND ArtPreis.Inhalt = tAufze.Inhalt
  144. AND ArtPreis.Jahr = tAufze.Jahr
  145. AND ArtPreis.Preis_Grp = FwPreisGrp
  146. AND ArtPreis.Aktion = FALSE
  147. AND ArtPreis.Ab_Datum <= ipDatum NO-ERROR.
  148. IF AVAILABLE ArtPreis THEN LEAVE.
  149. FIND FIRST ArtPreis NO-LOCK USE-INDEX ArtPreis-k1
  150. WHERE ArtPreis.Firma = Firma
  151. AND ArtPreis.Artnr = tAufze.Artnr
  152. AND ArtPreis.Inhalt = tAufze.Inhalt
  153. AND ArtPreis.Jahr = tAufze.Jahr
  154. AND ArtPreis.Preis_Grp = VP_Grp
  155. AND ArtPreis.Aktion = FALSE
  156. AND ArtPreis.Ab_Datum >= ipDatum NO-ERROR.
  157. LEAVE.
  158. END.
  159. IF AVAILABLE ArtPreis THEN DO:
  160. FIND LAST ArtStaff NO-LOCK USE-INDEX ArtStaff-k1
  161. WHERE ArtStaff.Firma = ArtPreis.Firma
  162. AND ArtStaff.Artnr = ArtPreis.Artnr
  163. AND ArtStaff.Inhalt = ArtPreis.Inhalt
  164. AND ArtStaff.Jahr = ArtPreis.Jahr
  165. AND ArtStaff.Preis_Grp = ArtPreis.Preis_Grp
  166. AND ArtStaff.Ab_Datum = ArtPreis.Ab_Datum
  167. AND ArtStaff.Menge <= PosMenge NO-ERROR.
  168. IF AVAILABLE ArtStaff THEN DO:
  169. IF Wust.Incl THEN VPreis = ArtStaff.VK_Brutto.
  170. ELSE VPreis = ArtStaff.VK_Netto.
  171. END.
  172. ELSE DO.
  173. IF Wust.Incl THEN VPreis = ArtPreis.VK_Brutto.
  174. ELSE VPreis = ArtPreis.VK_Netto.
  175. END.
  176. END.
  177. FIND LAST SpezPrei NO-LOCK USE-INDEX SpezPrei-k1
  178. WHERE SpezPrei.Firma = Firma
  179. AND SpezPrei.Knr = ipKnr
  180. AND SpezPrei.Artnr = tAufze.Artnr
  181. AND SpezPrei.Inhalt = tAufze.Inhalt
  182. AND SpezPrei.Jahr = tAufze.Jahr
  183. AND SpezPrei.Menge <= PosMenge
  184. AND SpezPrei.Ab_Datum <= ipDatum
  185. AND SpezPrei.Bis_Datum >= ipDatum NO-ERROR.
  186. IF AVAILABLE SpezPrei THEN DO:
  187. IF SpezPrei.Proz_Betr THEN DO.
  188. VRab_Proz = SpezPrei.Wert.
  189. VRab_Betr = 0.
  190. END.
  191. ELSE DO:
  192. VPreis = SpezPrei.Wert.
  193. VRab_Betr = 0.
  194. VRab_Proz = 0.
  195. END.
  196. tAufze.Rab_Su_Grp = 0.
  197. tAufze.Rab_Su_Art = 0.
  198. FSpezPreis = 1.
  199. END.
  200. DO WHILE TRUE:
  201. tAufze.Auf_Sp_Proz_Betr = TRUE.
  202. tAufze.Auf_Sp_Wert = 0.
  203. tAufze.Auf_Sp_Rab = 0.
  204. tAufze.Auf_Sp_Grp = 0.
  205. IF FSpezPreis > 0 THEN LEAVE.
  206. FIND FIRST SpPrRab NO-LOCK USE-INDEX SpPrRab-k1
  207. WHERE SpPrRab.Firma = Firma
  208. AND SpPrRab.Knr = ipKnr
  209. AND SpPrRab.Rab_Grp = Artst.Rab_Grp
  210. AND SpPrRab.Ab_Datum <= ipDatum
  211. AND SpPrRab.Bis_Datum >= ipDatum NO-ERROR.
  212. IF AVAILABLE SpPrRab THEN DO:
  213. tAufze.Auf_Sp_Grp = SpPrRab.Rab_Grp.
  214. END.
  215. FIND LAST SpPrRab NO-LOCK USE-INDEX SpPrRab-k1
  216. WHERE SpPrRab.Firma = Firma
  217. AND SpPrRab.Knr = ipKnr
  218. AND SpPrRab.Rab_Grp = Artst.Rab_Grp
  219. AND SpPrRab.Menge <= PosMenge
  220. AND SpPrRab.Ab_Datum <= ipDatum
  221. AND SpPrRab.Bis_Datum >= ipDatum NO-ERROR.
  222. IF AVAILABLE SpPrRab THEN DO:
  223. IF SpPrRab.Wert <> 0 THEN DO:
  224. IF SpPrRab.Proz_Betr THEN DO.
  225. VRab_Proz = SpPrRab.Wert.
  226. VRab_Betr = 0.
  227. END.
  228. ELSE DO:
  229. VRab_Betr = SpPrRab.Wert.
  230. VRab_Proz = 0.
  231. END.
  232. IF tAufze.Netto = TRUE THEN DO:
  233. IF NettoRab = 1 THEN DO:
  234. VRab_Proz = 0.
  235. VRab_Betr = 0.
  236. END.
  237. END.
  238. tAufze.Rab_Su_Grp = 0.
  239. tAufze.Rab_Su_Art = 0.
  240. FSpezPreis = 2.
  241. END.
  242. END.
  243. LEAVE.
  244. END.
  245. DO WHILE TRUE:
  246. IF KeineAkt THEN LEAVE.
  247. IF FSpezpreis > 0 AND
  248. Aktionen = 0 THEN LEAVE.
  249. IF FSpezpreis = 1 THEN DO:
  250. IF Aktionen = 2 THEN LEAVE.
  251. END.
  252. IF FSpezpreis = 2 THEN DO:
  253. IF Aktionen = 1 THEN LEAVE.
  254. END.
  255. FIND LAST AktPreis NO-LOCK USE-INDEX AktPreis-k2
  256. WHERE AktPreis.Firma = Firma
  257. AND AktPreis.Artnr = tAufze.Artnr
  258. AND AktPreis.Inhalt = tAufze.Inhalt
  259. AND AktPreis.Jahr = tAufze.Jahr
  260. AND AktPreis.Grp = VGrp
  261. AND AktPreis.Ab_Datum <= ipDatum
  262. AND AktPreis.Bis_Datum >= ipDatum NO-ERROR.
  263. IF AVAILABLE AktPreis THEN DO:
  264. IF AktPreis.Art = 0 THEN VPreis = VPreis - AktPreis.Wert.
  265. IF AktPreis.Art = 1 THEN VPreis = VPreis * (100 - AktPreis.Wert) / 100.
  266. VAktion = TRUE.
  267. VAktion_Text = AktPreis.Bemerkung.
  268. LEAVE.
  269. END.
  270. IF NOT FAbweich THEN LEAVE.
  271. IF Steuer.AktionsPreise > 0 THEN LEAVE.
  272. FIND LAST AktPreis NO-LOCK USE-INDEX AktPreis-k2
  273. WHERE AktPreis.Firma = Firma
  274. AND AktPreis.Artnr = tAufze.Artnr
  275. AND AktPreis.Inhalt = tAufze.Inhalt
  276. AND AktPreis.Jahr = tAufze.Jahr
  277. AND AktPreis.Grp = Debst.Preis_Grp
  278. AND AktPreis.Ab_Datum <= ipDatum
  279. AND AktPreis.Bis_Datum >= ipDatum NO-ERROR.
  280. IF AVAILABLE AktPreis THEN DO:
  281. IF AktPreis.Art = 0 THEN VPreis = VPreis - AktPreis.Wert.
  282. IF AktPreis.Art = 1 THEN VPreis = VPreis * (100 - AktPreis.Wert) / 100.
  283. VAktion = TRUE.
  284. VAktion_Text = AktPreis.Bemerkung.
  285. LEAVE.
  286. END.
  287. LEAVE.
  288. END.
  289. IF tAufze.Netto THEN LEAVE.
  290. IF FSpezPreis > 0 THEN LEAVE.
  291. IF AVAILABLE RabTab THEN DO:
  292. IF RabTab.Wert = 0 THEN LEAVE.
  293. END.
  294. IF tAufze.Rab_Art > 0 THEN DO:
  295. IF tAufze.Rab_Art = 1 THEN DO:
  296. VRab_Proz = tAufze.Rab_Wert.
  297. VRab_Betr = 0.
  298. LEAVE.
  299. END.
  300. IF tAufze.Rab_Art = 2 THEN DO:
  301. VRab_Betr = tAufze.Rab_Wert.
  302. VRab_Proz = 0.
  303. LEAVE.
  304. END.
  305. END.
  306. IF AVAILABLE RabTab THEN DO:
  307. IF RabTab.Rab_Art = 0 THEN VRab_Betr = RabTab.Wert.
  308. IF RabTab.Rab_Art = 1 THEN VRab_Proz = RabTab.Wert.
  309. END.
  310. LEAVE.
  311. END.
  312. ASSIGN tAufze.Preis = VPreis
  313. tAufze.Aktion = VAktion
  314. tAufze.Aktion_Text = VAktion_Text.
  315. IF tAufze.Rab_Art <> 3 THEN DO:
  316. ASSIGN tAufze.Rab_Art = 0
  317. tAufze.Rab_Wert = 0.
  318. END.
  319. IF VRab_Proz <> 0 THEN DO:
  320. ASSIGN tAufze.Rab_Art = 1
  321. tAufze.Rab_Wert = VRab_Proz.
  322. END.
  323. IF VRab_Betr <> 0 THEN DO:
  324. ASSIGN tAufze.Rab_Art = 2
  325. tAufze.Rab_Wert = VRab_Betr.
  326. END.
  327. DO WHILE TRUE:
  328. IF tAufze.Rab_Art = 1 THEN DO:
  329. tAufze.Bru_Betr = tAufze.Preis * tAufze.MGeli.
  330. tAufze.Rab_Betr = tAufze.Rab_Wert * tAufze.Bru_Betr / 100.
  331. LEAVE.
  332. END.
  333. IF tAufze.Rab_Art = 2 THEN DO:
  334. tAufze.Bru_Betr = tAufze.Preis * tAufze.MGeli.
  335. tAufze.Rab_Betr = tAufze.Rab_Wert * tAufze.MGeli.
  336. LEAVE.
  337. END.
  338. IF tAufze.Rab_Art = 3 THEN DO:
  339. tAufze.Bru_Betr = tAufze.Preis * tAufze.MGeli.
  340. tAufze.Rab_Betr = tAufze.Rab_Wert * tAufze.MGeli * -1.
  341. LEAVE.
  342. END.
  343. tAufze.Bru_Betr = tAufze.Preis * tAufze.MGeli.
  344. tAufze.Rab_Betr = 0.
  345. tAufze.Rab_Art = 0.
  346. LEAVE.
  347. END.
  348. IF Wust.Incl THEN DO:
  349. Rundbetr = tAufze.Rab_Betr.
  350. RUN RUNDEN ( INPUT-OUTPUT Rundbetr ).
  351. tAufze.Rab_Betr = Rundbetr.
  352. END.
  353. tAufze.Zus_Betr = 0.
  354. IF tAufze.Zus_Art > 0 THEN DO:
  355. IF tAufze.Zus_Art = 1
  356. THEN tAufze.Zus_Betr = tAufze.Bru_Betr * tAufze.Zus_Wert / 100.
  357. IF tAufze.Zus_Art = 2
  358. THEN tAufze.Zus_Betr = tAufze.MGeli * tAufze.Zus_Wert.
  359. END.
  360. IF Wust.Incl THEN DO:
  361. Rundbetr = tAufze.Zus_Betr.
  362. RUN RUNDEN ( INPUT-OUTPUT Rundbetr ).
  363. tAufze.Zus_Betr = Rundbetr.
  364. END.
  365. tAufze.Net_Betr = tAufze.Bru_Betr - tAufze.Rab_Betr + tAufze.Zus_Betr.
  366. IF Wust.Incl THEN DO:
  367. Rundbetr = tAufze.Net_Betr.
  368. RUN RUNDEN ( INPUT-OUTPUT Rundbetr ).
  369. tAufze.Net_Betr = Rundbetr.
  370. END.
  371. DO WHILE tAufze.EP = 0:
  372. IF Artst.DEP <> 0 THEN DO:
  373. tAufze.EP = Artst.DEP.
  374. LEAVE.
  375. END.
  376. IF Artst.LEP <> 0 THEN DO:
  377. tAufze.EP = Artst.LEP.
  378. LEAVE.
  379. END.
  380. IF Artst.Listen_EP <> 0 THEN DO:
  381. tAufze.EP = Artst.Listen_EP.
  382. LEAVE.
  383. END.
  384. LEAVE.
  385. END.
  386. ipAufze:BUFFER-COPY(hBuffer).
  387. RETURN ''.
  388. PROCEDURE RUNDEN:
  389. DEF INPUT-OUTPUT PARAMETER ioBetrag AS DEC DECIMALS 4 NO-UNDO.
  390. DEF VAR VBetr AS DECIMAL FORMAT "99999999.9999-".
  391. DEF VAR VOp AS DECIMAL INIT 0.2.
  392. VBetr = ioBetrag.
  393. VBetr = ROUND((VBetr / 100 * VOp), 4) / VOp * 100.
  394. ioBetrag = VBetr.
  395. END PROCEDURE.