Billing Document Output

Billing Document Print Program

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
406:
407:
408:
409:
410:
411:
412:
413:
414:
415:
416:
417:
418:
419:
420:
421:
422:
423:
424:
425:
426:
427:
428:
429:
430:
431:
432:
433:
434:
435:
436:
437:
438:
439:
440:
441:
442:
443:
444:
445:
446:
447:
448:
449:
450:
451:
452:
453:
454:
455:
456:
457:
458:
459:
460:
461:
462:
463:
464:
465:
466:
467:
468:
469:
470:
471:
472:
473:
474:
475:
476:
477:
478:
479:
480:
481:
482:
483:
484:
485:
486:
487:
488:
489:
490:
491:
492:
493:
494:
495:
496:
497:
498:
499:
500:
501:
502:
503:
504:
505:
506:
507:
508:
509:
510:
511:
512:
513:
514:
515:
516:
517:
518:
519:
520:
521:
522:
523:
524:
525:
526:
527:
528:
529:
530:
531:
532:
533:
534:
535:
536:
537:
538:
539:
540:
541:
542:
543:
544:
545:
546:
547:
548:
549:
550:
551:
552:
553:
554:
555:
556:
557:
558:
559:
560:
561:
562:
563:
564:
565:
566:
567:
568:
569:
570:
571:
572:
573:
574:
575:
576:
577:
578:
579:
580:
581:
582:
583:
584:
585:
586:
587:
588:
589:
590:
591:
592:
593:
594:
595:
596:
597:
598:
599:
600:
601:
602:
603:
604:
605:
606:
607:
608:
609:
610:
611:
612:
613:
614:
615:
616:
617:
618:
619:
620:
621:
622:
623:
624:
625:
626:
627:
628:
629:
630:
631:
632:
633:
634:
635:
636:
637:
638:
639:
640:
641:
642:
643:
644:
645:
646:
647:
648:
649:
650:
651:
652:
653:
654:
655:
656:
657:
658:
659:
660:
661:
662:
663:
664:
665:
666:
667:
668:
669:
670:
671:
672:
673:
674:
675:
676:
677:
678:
679:
680:
681:
682:
683:
684:
685:
686:
687:
688:
689:
690:
691:
692:
693:
694:
695:
696:
697:
698:
699:
700:
701:
702:
703:
704:
705:
706:
707:
708:
709:
710:
711:
712:
713:
714:
715:
716:
717:
718:
719:
720:
721:
722:
723:
724:
725:
726:
727:
728:
729:
730:
731:
732:
733:
734:
735:
736:
737:
738:
739:
740:
741:
742:
743:
744:
745:
746:
747:
748:
749:
750:
751:
752:
753:
754:
755:
756:
757:
758:
759:
760:
761:
762:
763:
764:
765:
766:
767:
768:
769:
770:
771:
772:
773:
774:
775:
776:
777:
778:
779:
780:
781:
782:
783:
784:
785:
786:
787:
788:
789:
790:
791:
792:
793:
794:
795:
796:
797:
798:
799:
800:
801:
802:
803:
804:
805:
806:
807:
808:
809:
810:
811:
812:
813:
814:
815:
816:
817:
818:
819:
820:
821:
822:
823:
824:
825:
826:
827:
828:
829:
830:
831:
832:
833:
834:
835:
836:
837:
838:
839:
840:
841:
842:
843:
844:
845:
846:
847:
848:
849:
850:
851:
852:
853:
854:
855:
856:
857:
858:
859:
860:
861:
862:
863:
864:
865:
866:
867:
868:
869:
870:
871:
872:
873:
874:
875:
876:
877:
878:
879:
880:
881:
882:
883:
884:
885:
886:
887:
888:
889:
890:
891:
892:
893:
894:
895:
896:
897:
898:
899:
900:
901:
902:
903:
904:
905:
906:
907:
908:
909:
910:
911:
912:
913:
914:
915:
916:
917:
918:
919:
920:
921:
922:
923:
924:
925:
926:
927:
928:
929:
930:
931:
932:
933:
934:
935:
936:
937:
938:
939:
940:
941:
942:
943:
944:
945:
946:
947:
948:
949:
950:
951:
952:
953:
954:
955:
956:
957:
958:
959:
960:
961:
962:
963:
964:
965:
966:
967:
968:
969:
970:
971:
972:
973:
974:
975:
976:
977:
978:
979:
980:
981:
982:
983:
984:
985:
986:
987:
988:
989:
990:
991:
992:
993:
994:
995:
996:
997:
998:
999:
1000:
1001:
1002:
1003:
1004:
1005:
1006:
1007:
1008:
1009:
1010:
1011:
1012:
1013:
1014:
1015:
1016:
1017:
1018:
1019:
1020:
1021:
1022:
1023:
1024:
1025:
1026:
1027:
1028:
1029:
1030:
1031:
1032:
1033:
1034:
1035:
1036:
1037:
1038:
1039:
1040:
1041:
1042:
1043:
1044:
1045:
1046:
1047:
1048:
1049:
1050:
1051:
1052:
1053:
1054:
1055:
1056:
1057:
1058:
1059:
1060:
1061:
1062:
1063:
1064:
1065:
1066:
1067:
1068:
1069:
1070:
1071:
1072:
1073:
1074:
1075:
1076:
1077:
1078:
1079:
1080:
1081:
1082:
1083:
1084:
1085:
1086:
1087:
1088:
1089:
1090:
1091:
1092:
1093:
1094:
1095:
1096:
1097:
1098:
1099:
1100:
1101:
1102:
1103:
1104:
1105:
1106:
1107:
1108:
1109:
1110:
1111:
1112:
1113:
1114:
1115:
1116:
1117:
1118:
1119:
1120:
1121:
1122:
1123:
1124:
1125:
1126:
1127:
1128:
1129:
1130:
1131:
1132:
1133:
1134:
1135:
1136:
1137:
1138:
1139:
1140:
1141:
1142:
1143:
1144:
1145:
1146:
1147:
1148:
1149:
1150:
1151:
1152:
1153:
1154:
1155:
1156:
1157:
1158:
1159:
1160:
1161:
1162:
1163:
1164:
1165:
1166:
1167:
1168:
1169:
1170:
1171:
1172:
1173:
1174:
1175:
1176:
1177:
1178:
1179:
1180:
1181:
1182:
1183:
1184:
1185:
1186:
1187:
1188:
1189:
1190:
1191:
1192:
1193:
1194:
1195:
1196:
1197:
1198:
1199:
1200:
1201:
1202:
1203:
1204:
1205:
1206:
1207:
1208:
1209:
1210:
1211:
1212:
1213:
1214:
1215:
1216:
1217:
1218:
1219:
1220:
1221:
1222:
1223:
1224:
1225:
1226:
1227:
1228:
1229:
1230:
1231:
1232:
1233:
1234:
1235:
1236:
1237:
1238:
1239:
1240:
1241:
1242:
1243:
1244:
1245:
1246:
1247:
1248:
1249:
1250:
1251:
1252:
1253:
1254:
1255:
1256:
1257:
1258:
1259:
1260:
1261:
1262:
1263:
1264:
1265:
1266:
1267:
1268:
1269:
1270:
1271:
1272:
1273:
1274:
1275:
1276:
1277:
1278:
1279:
1280:
1281:
1282:
1283:
1284:
1285:
1286:
1287:
1288:
1289:
1290:
1291:
1292:
1293:
1294:
1295:
1296:
1297:
1298:
1299:
1300:
1301:
1302:
1303:
1304:
1305:
1306:
1307:
1308:
1309:
1310:
1311:
1312:
1313:
1314:
1315:
1316:
1317:
1318:
1319:
1320:
1321:
1322:
1323:
1324:
1325:
1326:
1327:
1328:
1329:
1330:
1331:
1332:
1333:
1334:
1335:
1336:
1337:
1338:
1339:
1340:
1341:
1342:
1343:
1344:
1345:
1346:
1347:
1348:
1349:
1350:
1351:
1352:
1353:
1354:
1355:
1356:
1357:
1358:
1359:
1360:
1361:
1362:
1363:
1364:
1365:
1366:
1367:
1368:
1369:
1370:
1371:
1372:
1373:
1374:
1375:
1376:
1377:
1378:
1379:
1380:
1381:
1382:
1383:
1384:
1385:
1386:
1387:
1388:
1389:
1390:
1391:
1392:
1393:
1394:
1395:
1396:
1397:
1398:
1399:
1400:
1401:
1402:
1403:
1404:
1405:
1406:
1407:
1408:
1409:
1410:
1411:
1412:
1413:
1414:
1415:
1416:
1417:
1418:
1419:
1420:
1421:
1422:
1423:
1424:
1425:
1426:
1427:
1428:
1429:
1430:
1431:
1432:
1433:
1434:
1435:
1436:
1437:
1438:
1439:
1440:
1441:
1442:
1443:
1444:
1445:
1446:
1447:
1448:
1449:
1450:
1451:
1452:
1453:
1454:
1455:
1456:
1457:
1458:
1459:
1460:
1461:
1462:
1463:
1464:
1465:
1466:
1467:
1468:
1469:
1470:
1471:
1472:
1473:
1474:
1475:
1476:
1477:
1478:
1479:
1480:
1481:
1482:
1483:
1484:
1485:
1486:
1487:
1488:
1489:
1490:
1491:
1492:
1493:
1494:
1495:
1496:
1497:
1498:
1499:
1500:
1501:
1502:
1503:
1504:
1505:
1506:
1507:
1508:
1509:
1510:
1511:
1512:
1513:
1514:
1515:
1516:
1517:
1518:
1519:
1520:
1521:
1522:
1523:
1524:
1525:
1526:
1527:
1528:
1529:
1530:
1531:
1532:
1533:
1534:
1535:
1536:
1537:
1538:
1539:
1540:
1541:
1542:
1543:
1544:
1545:
1546:
1547:
1548:
1549:
1550:
1551:
1552:
1553:
1554:
1555:
1556:
1557:
1558:
1559:
1560:
1561:
1562:
1563:
1564:
1565:
1566:
1567:
1568:
1569:
1570:
1571:
1572:
1573:
1574:
1575:
1576:
1577:
1578:
1579:
1580:
1581:
1582:
1583:
1584:
1585:
1586:
1587:
1588:
1589:
1590:
1591:
1592:
1593:
1594:
1595:
1596:
1597:
1598:
1599:
1600:
1601:
1602:
1603:
1604:
1605:
1606:
1607:
1608:
1609:
1610:
1611:
1612:
1613:
1614:
1615:
1616:
1617:
1618:
1619:
1620:
1621:
1622:
1623:
1624:
1625:
1626:
1627:
1628:
1629:
1630:
1631:
1632:
1633:
1634:
1635:
1636:
1637:
1638:
1639:
1640:
1641:
1642:
1643:
1644:
1645:
1646:
1647:
1648:
1649:
1650:
1651:
1652:
1653:
1654:
1655:
1656:
1657:
1658:
1659:
1660:
1661:
1662:
1663:
1664:
1665:
1666:
1667:
1668:
1669:
1670:
1671:
1672:
1673:
1674:
1675:
1676:
1677:
1678:
1679:
1680:
1681:
1682:
1683:
1684:
1685:
1686:
1687:
1688:
1689:
1690:
1691:
1692:
1693:
1694:
1695:
1696:
1697:
1698:
1699:
1700:
1701:
1702:
1703:
1704:
1705:
1706:
1707:
1708:
1709:
1710:
1711:
1712:
1713:
1714:
1715:
1716:
1717:
1718:
1719:
1720:
1721:
1722:
1723:
1724:
1725:
1726:
1727:
1728:
1729:
1730:
1731:
1732:
1733:
1734:
1735:
1736:
1737:
1738:
1739:
1740:
1741:
1742:
1743:
1744:
1745:
1746:
1747:
1748:
1749:
1750:
1751:
1752:
1753:
1754:
1755:
1756:
1757:
1758:
1759:
1760:
1761:
1762:
1763:
1764:
1765:
1766:
1767:
1768:
1769:
1770:
1771:
1772:
1773:
1774:
1775:
1776:
1777:
1778:
1779:
1780:
1781:
1782:
1783:
1784:
1785:
1786:
1787:
1788:
1789:
1790:
1791:
1792:
1793:
1794:
1795:
1796:
1797:
1798:
1799:
1800:
1801:
1802:
1803:
1804:
1805:
1806:
1807:
1808:
1809:
1810:
1811:
1812:
1813:
1814:
1815:
1816:
1817:
1818:
1819:
1820:
1821:
1822:
1823:
1824:
1825:
1826:
1827:
1828:
1829:
1830:
1831:
1832:
1833:
1834:
1835:
1836:
1837:
1838:
1839:
1840:
1841:
1842:
1843:
1844:
1845:
1846:
1847:
1848:
1849:
1850:
1851:
1852:
1853:
1854:
1855:
1856:
1857:
1858:
1859:
1860:
1861:
1862:
1863:
1864:
1865:
1866:
1867:
1868:
1869:
1870:
1871:
1872:
1873:
1874:
1875:
1876:
1877:
1878:
1879:
1880:
1881:
1882:
1883:
1884:
1885:
1886:
1887:
1888:
1889:
1890:
1891:
1892:
1893:
1894:
1895:
1896:
1897:
1898:
1899:
1900:
1901:
1902:
1903:
1904:
1905:
1906:
1907:
1908:
1909:
1910:
1911:
1912:
1913:
1914:
1915:
1916:
1917:
1918:
1919:
1920:
1921:
1922:
1923:
1924:
1925:
1926:
1927:
1928:
1929:
1930:
1931:
1932:
1933:
1934:
1935:
1936:
1937:
1938:
1939:
1940:
1941:
1942:
1943:
1944:
1945:
1946:
1947:
1948:
1949:
1950:
1951:
1952:
1953:
1954:
1955:
1956:
1957:
1958:
1959:
1960:
1961:
1962:
1963:
1964:
1965:
1966:
1967:
1968:
1969:
1970:
1971:
1972:
1973:
1974:
1975:
1976:
1977:
1978:
1979:
1980:
1981:
1982:
1983:
1984:
1985:
1986:
1987:
1988:
1989:
1990:
1991:
1992:
1993:
1994:
1995:
1996:
1997:
1998:
1999:
2000:
2001:
2002:
2003:
2004:
2005:
2006:
2007:
2008:
2009:
2010:
2011:
2012:
2013:
2014:
2015:
2016:
2017:
2018:
2019:
2020:
2021:
2022:
2023:
2024:
2025:
2026:
2027:
2028:
2029:
2030:
2031:
2032:
2033:
2034:
2035:
2036:
2037:
2038:
2039:
2040:
2041:
2042:
2043:
2044:
2045:
2046:
2047:
2048:
2049:
2050:
2051:
2052:
2053:
2054:
2055:
2056:
2057:
2058:
2059:
2060:
2061:
2062:
2063:
2064:
2065:
2066:
2067:
2068:
2069:
2070:
2071:
2072:
2073:
2074:
2075:
2076:
2077:
2078:
2079:
2080:
2081:
2082:
2083:
2084:
2085:
2086:
2087:
2088:
2089:
2090:
2091:
2092:
2093:
2094:
2095:
2096:
2097:
2098:
2099:
2100:
2101:
2102:
2103:
2104:
2105:
2106:
2107:
2108:
2109:
2110:
2111:
2112:
2113:
2114:
2115:
2116:
2117:
2118:
2119:
2120:
2121:
2122:
2123:
2124:
2125:
2126:
2127:
2128:
2129:
2130:
2131:
2132:
2133:
2134:
2135:
2136:
2137:
2138:
2139:
2140:
2141:
2142:
2143:
2144:
2145:
2146:
2147:
2148:
2149:
2150:
2151:
2152:
2153:
2154:
2155:
2156:
2157:
2158:
2159:
2160:
2161:
2162:
2163:
2164:
2165:
2166:
2167:
2168:
2169:
2170:
2171:
2172:
2173:
2174:
2175:
2176:
2177:
2178:
2179:
2180:
2181:
2182:
2183:
2184:
2185:
2186:
2187:
2188:
2189:
2190:
2191:
2192:
2193:
2194:
2195:
2196:
2197:
2198:
2199:
2200:
2201:
2202:
2203:
2204:
2205:
2206:
2207:
2208:
2209:
2210:
2211:
2212:
2213:
2214:
2215:
2216:
2217:
2218:
2219:
2220:
2221:
2222:
2223:
2224:
2225:
2226:
2227:
2228:
2229:
2230:
2231:
2232:
2233:
2234:
2235:
2236:
2237:
2238:
2239:
2240:
2241:
2242:
2243:
2244:
2245:
2246:
2247:
2248:
2249:
2250:
2251:
2252:
2253:
2254:
2255:
2256:
2257:
2258:
2259:
2260:
2261:
2262:
2263:
2264:
2265:
2266:
2267:
2268:
2269:
2270:
2271:
2272:
2273:
2274:
2275:
2276:
2277:
2278:
2279:
2280:
2281:
2282:
2283:
2284:
2285:
2286:
2287:
2288:
2289:
2290:
2291:
2292:
2293:
2294:
2295:
2296:
2297:
2298:
2299:
2300:
2301:
2302:
2303:
2304:
2305:
2306:
2307:
2308:
2309:
2310:
2311:
2312:
2313:
2314:
2315:
2316:
2317:
2318:
2319:
2320:
2321:
2322:
2323:
2324:
2325:
2326:
2327:
2328:
2329:
2330:
2331:
2332:
2333:
2334:
2335:
2336:
2337:
2338:
2339:
2340:
2341:
2342:
2343:
2344:
2345:
2346:
2347:
2348:
2349:
2350:
2351:
2352:
2353:
2354:
2355:
2356:
2357:
2358:
2359:
2360:
2361:
2362:
2363:
2364:
2365:
2366:
2367:
2368:
2369:
2370:
2371:
2372:
2373:
2374:
2375:
2376:
2377:
2378:
2379:
2380:
2381:
2382:
2383:
2384:
2385:
2386:
2387:
2388:
2389:
2390:
2391:
2392:
2393:
2394:
2395:
2396:
2397:
2398:
2399:
2400:
2401:
2402:
2403:
2404:
2405:
2406:
2407:
2408:
2409:
2410:
2411:
2412:
2413:
2414:
2415:
2416:
2417:
2418:
2419:
2420:
2421:
2422:
2423:
2424:
2425:
2426:
2427:
2428:
2429:
2430:
2431:
2432:
2433:
2434:
2435:
2436:
2437:
2438:
2439:
2440:
2441:
2442:
2443:
2444:
2445:
2446:
2447:
2448:
2449:
2450:
2451:
2452:
2453:
2454:
2455:
2456:
2457:
2458:
2459:
2460:
2461:
2462:
2463:
2464:
2465:
2466:
2467:
2468:
2469:
2470:
2471:
2472:
2473:
2474:
2475:
2476:
2477:
2478:
2479:
2480:
2481:
2482:
2483:
2484:
2485:
2486:
2487:
2488:
2489:
2490:
2491:
2492:
2493:
2494:
2495:
2496:
2497:
2498:
2499:
2500:
2501:
2502:
2503:
2504:
2505:
2506:
2507:
2508:
2509:
2510:
2511:
2512:
2513:
2514:
2515:
2516:
2517:
2518:
2519:
2520:
2521:
2522:
2523:
2524:
2525:
2526:
2527:
2528:
2529:
2530:
2531:
2532:
*&---------------------------------------------------------------------*
*& Report  ZSD_BILLINGDOC_FLOE - Copy of SD_INVOICE_PRINT01
*&
*&---------------------------------------------------------------------*
*&              Print Program for Billing Documents
*&
*&---------------------------------------------------------------------*

REPORT  ZSD_BILLINGDOC_FLOE MESSAGE-ID vd_pdf.

TABLES: nast,
        tnapr,
        toa_dara,
        vbdkr,                                    "#EC NEEDED sapscript
        komk,                                     "#EC NEEDED sapscript
        tvko.                                     "#EC NEEDED sapscript

*--- SD-SEPA
INCLUDE item_topdata.
*--- SD-SEPA

TYPE-POOLS: szadr.

TYPES: BEGIN OF vbeln_posnr_s,
         vbeln TYPE vbeln,
         posnr TYPE posnr,
       END OF vbeln_posnr_s,
       vbeln_posnr_t TYPE TABLE OF vbeln_posnr_s.

DATA: gs_interface        TYPE invoice_s_prt_interface,
      gv_screen_display   TYPE char1,
      gv_price_print_mode TYPE char1,
      gt_komv             TYPE TABLE OF komv,
      gs_komk             TYPE komk,
      gt_vbtyp_fix_values TYPE TABLE OF dd07v,
      gv_language         TYPE sylangu,
      gv_dummy            TYPE char1,                       "#EC NEEDED
      gt_sdaccdpc_doc     TYPE vbeln_posnr_t,
      gt_sdaccdpc         TYPE sdaccdpc_t,
      gv_downpay_refresh  TYPE c,
      BEGIN OF gs_nast.
    INCLUDE STRUCTURE nast.
DATA: email_addr TYPE ad_smtpadr,
      END OF gs_nast.

DATA: gv_badi_filter             TYPE char30.
DATA: bd_sd_bil                  TYPE REF TO badi_sd_bil_print01.

FIELD-SYMBOLS:
  <gs_vbdkr>      TYPE vbdkr,
  <gv_returncode> TYPE sysubrc.

CONSTANTS:
  gc_pr_kappl TYPE char1 VALUE 'V',
  gc_true     TYPE char1 VALUE 'X',
  gc_false    TYPE char1 VALUE space,
  gc_english  TYPE char1 VALUE 'E',
  gc_pdf      TYPE char1 VALUE '2',
  gc_equal    TYPE char2 VALUE 'EQ',
  gc_include  TYPE char1 VALUE 'I',
  BEGIN OF gc_nacha,
    printer       TYPE na_nacha VALUE 1,
    fax           TYPE na_nacha VALUE 2,
    external_send TYPE na_nacha VALUE 5,
  END OF gc_nacha,
  BEGIN OF gc_device,
    printer    TYPE output_device VALUE 'P',
    fax        TYPE output_device VALUE 'F',
    email      TYPE output_device VALUE 'E',
    web_dynpro TYPE output_device VALUE 'W',
  END OF gc_device.

*----------------------------------------------------------------------*
* Varo declarations
*----------------------------------------------------------------------*
*
DATA: lv_pdf       TYPE xstring,
      lv_doc       TYPE text40,
      lv_ccode     TYPE /flm/cust_code,
      lv_ftype     TYPE /flm/ftype_code,
      lv_template  TYPE /flm/flang,
      lv_fver      TYPE /flm/fver,
      lv_fid       TYPE /flm/fid,
      lv_fidvar    TYPE /flm/id_var,
      ls_mess      TYPE bapiret2,
      lv_cms_doc   TYPE /flm/cms_doc,
      lt_variables TYPE /flm/vars_t,
      ls_variables TYPE /flm/vars_s.
*
* Ouput processing
DATA: lv_reprint TYPE flag,
      ls_nast    TYPE nast.
*
* Spool print
DATA: size       TYPE i,
      total_size TYPE i,
      spoolid    TYPE rspoid,
      copies     TYPE rspocopies,
      lifetime.
*----------------------------------------------------------------------*
* Floe declarations
*----------------------------------------------------------------------*
TYPES: BEGIN OF ty_floe_rec_email_s,
         email TYPE ad_smtpadr,
         type  TYPE char1,
       END OF ty_floe_rec_email_s.

TYPES: ty_floe_rec_email_t TYPE TABLE OF ty_floe_rec_email_s.

TYPES: BEGIN OF ty_floe_var_code_s,
         var_code       TYPE char30,
         value          TYPE string,
         row_num        TYPE numc3,
         parent_row_num TYPE numc3,
       END OF ty_floe_var_code_s.

TYPES: ty_floe_var_code_t TYPE TABLE OF ty_floe_var_code_s.

DATA: gt_rec_emails TYPE ty_floe_rec_email_t,
      gs_rec_email  TYPE ty_floe_rec_email_s,
      gt_vars       TYPE ty_floe_var_code_t,
      gs_vars       TYPE ty_floe_var_code_s,
      gv_subrc      TYPE sysubrc.

DATA: ls_attach TYPE /floe/att_s,
      lt_attach TYPE /floe/att_t,
      l_im_doc  TYPE /floe/doc_ref,
      gv_etype  TYPE /floe/etype_code,
      l_order   TYPE string.

DATA: lt_lines TYPE TABLE OF tline,
      ls_lines TYPE tline,
      l_text   TYPE string,
      l_tdname TYPE tdobname.

* >>>>> BUNDLING <<<<< *************************************************
INCLUDE check_bundling_print.
* >>>>> BUNDLING <<<<< *************************************************

*---------------------------------------------------------------------*
*       FORM ENTRY                                                    *
*---------------------------------------------------------------------*
FORM entry                                                  "#EC CALLED
  USING cv_returncode        TYPE sysubrc
        uv_screen            TYPE char1.

  TRY.
*     Get BAdI handle
      GET BADI bd_sd_bil
        FILTERS
          filter_billing = tnapr-sform.
    CATCH cx_badi_not_implemented.
*     This should not occur due to fallback class but to be save...
      CLEAR bd_sd_bil.
    CATCH cx_badi_multiply_implemented.
*     Several implementations exist for the filter 'form name'.
*     This appears to be very unlikely but to be save...
      CLEAR bd_sd_bil.
  ENDTRY.

* Assign RC
  ASSIGN cv_returncode TO <gv_returncode>.

* Refresh global data
  PERFORM initialize_data.

  gv_screen_display = uv_screen.
  gs_nast           = nast.

* start processing
  PERFORM processing.

ENDFORM.                    "entry

*---------------------------------------------------------------------*
*       FORM ENTRY_VARO                                                    *
*---------------------------------------------------------------------*
FORM entry_varo                                             "#EC CALLED
  USING cv_returncode        TYPE sysubrc
        uv_screen            TYPE char1.

  TRY.
*     Get BAdI handle
      GET BADI bd_sd_bil
        FILTERS
          filter_billing = tnapr-sform.
    CATCH cx_badi_not_implemented.
*     This should not occur due to fallback class but to be save...
      CLEAR bd_sd_bil.
    CATCH cx_badi_multiply_implemented.
*     Several implementations exist for the filter 'form name'.
*     This appears to be very unlikely but to be save...
      CLEAR bd_sd_bil.
  ENDTRY.

* Assign RC
  ASSIGN cv_returncode TO <gv_returncode>.

* Refresh global data
  PERFORM initialize_data.

  gv_screen_display = uv_screen.
  gs_nast           = nast.

* start processing
  PERFORM processing_varo.

ENDFORM.                    "entry_varo

*---------------------------------------------------------------------*
*       FORM ENTRY_FLOE                                                    *
*---------------------------------------------------------------------*
FORM entry_floe                                             "#EC CALLED
  USING cv_returncode        TYPE sysubrc
        uv_screen            TYPE char1.

  TRY.
*     Get BAdI handle
      GET BADI bd_sd_bil
        FILTERS
          filter_billing = tnapr-sform.
    CATCH cx_badi_not_implemented.
*     This should not occur due to fallback class but to be save...
      CLEAR bd_sd_bil.
    CATCH cx_badi_multiply_implemented.
*     Several implementations exist for the filter 'form name'.
*     This appears to be very unlikely but to be save...
      CLEAR bd_sd_bil.
  ENDTRY.

* Assign RC
  ASSIGN cv_returncode TO <gv_returncode>.

* Refresh global data
  PERFORM initialize_data.

  gv_screen_display = uv_screen.
  gs_nast           = nast.

* start processing
  PERFORM processing_floe.

ENDFORM.                    "entry_floe

*&---------------------------------------------------------------------*
*&      Form  processing
*&---------------------------------------------------------------------*
FORM processing.

*--- Retrieve the data
  PERFORM get_data.
  CHECK <gv_returncode> IS INITIAL.

*--- Print, fax, send data
  PERFORM print_data.
  CHECK <gv_returncode> IS INITIAL.

ENDFORM.                    " processing

*&---------------------------------------------------------------------*
*&      Form  processing Varo
*&---------------------------------------------------------------------*
FORM processing_varo.

*--- Retrieve the data
  PERFORM get_data.
  CHECK <gv_returncode> IS INITIAL.

*--- Print, fax, send data
  PERFORM print_data_varo.
  CHECK <gv_returncode> IS INITIAL.

ENDFORM.                    " processing_varo

*&---------------------------------------------------------------------*
*&      Form  processing Floe
*&---------------------------------------------------------------------*
FORM processing_floe.

* Check email type
  gv_etype  = tnapr-fonam.
  CHECK gv_etype IS NOT INITIAL.

*--- Retrieve the data
  PERFORM get_data.
  CHECK <gv_returncode> IS INITIAL.

*--- Generate email
  PERFORM send_data_floe.
  CHECK <gv_returncode> IS INITIAL.

ENDFORM.                    " processing_floe

*&---------------------------------------------------------------------*
*&      Form  get_data
*&---------------------------------------------------------------------*
FORM get_data.

  DATA: ls_comwa TYPE vbco3,
        lt_vbdpr TYPE tbl_vbdpr.
  DATA: ls_druckprofil TYPE ledruckprofil, "IBGI
        ls_nast        TYPE nast.          "IBGI

  CALL FUNCTION 'RV_PRICE_PRINT_REFRESH'
    TABLES
      tkomv = gt_komv.

  ls_comwa-mandt = sy-mandt.
  ls_comwa-spras = gs_nast-spras.
  ls_comwa-kunde = gs_nast-parnr.
  ls_comwa-parvw = gs_nast-parvw.
  IF gs_nast-objky+10(6) NE space.
    ls_comwa-vbeln = gs_nast-objky+16(10).
  ELSE.
    ls_comwa-vbeln = gs_nast-objky.
  ENDIF.

*--- Call the famous print view
  CALL FUNCTION 'RV_BILLING_PRINT_VIEW'
    EXPORTING
      comwa                        = ls_comwa
    IMPORTING
      kopf                         = gs_interface-head_detail-vbdkr
    TABLES
      pos                          = lt_vbdpr
    EXCEPTIONS
      terms_of_payment_not_in_t052 = 1
      error_message                = 2
      OTHERS                       = 3.

  IF sy-subrc = 1.
    sy-msgty = 'I'.
    PERFORM protocol_update.
  ELSEIF sy-subrc <> 0.
    <gv_returncode> = sy-subrc.
    PERFORM protocol_update.
    RETURN.
  ENDIF.

*--- Assign a global pointer to the VBDKR
  ASSIGN gs_interface-head_detail-vbdkr TO <gs_vbdkr>.

*--- Set default language
  gv_language = gs_nast-spras.

*--- Set Country for display conversions e.g. WRITE TO
  SET COUNTRY <gs_vbdkr>-land1.

*--- Get the item details
  PERFORM get_item_details   USING lt_vbdpr.
  CHECK <gv_returncode> IS INITIAL.

*--- Get the header details
  PERFORM get_head_details.
  CHECK <gv_returncode> IS INITIAL.

*  ENHANCEMENT-POINT EHP3_GET_DATA_01 SPOTS ES_SD_INVOICE_PRINT01.


*---------------------------------------------------------------------*
* fill_floe_variables
*---------------------------------------------------------------------*

  DATA: lt_comp        TYPE abap_compdescr_tab,
        ls_comp_a      LIKE LINE OF lt_comp,
        ld_type        TYPE abap_typekind,
        ls_item_detail TYPE vbdpr,
        l_row_num      TYPE numc3,
        l_parent_num   TYPE numc3,
        l_item_num     TYPE numc3,
        l_schl_num     TYPE numc3,
        l_old_posnr    TYPE posnr.

  DATA:
    lo_struct TYPE REF TO cl_abap_structdescr,
    lo_table  TYPE REF TO cl_abap_tabledescr,
    ldo_data  TYPE REF TO data.

  FIELD-SYMBOLS:
    <lt_itab>  TYPE table,
    <lo_field>.
*---------------------------------------------------------------------*
* Convert data into floe variables.
*---------------------------------------------------------------------*
*
* Only for Floe
  CHECK gv_etype IS NOT INITIAL.
* Take header data from structure <gs_vbdka>.
  GET REFERENCE OF <gs_vbdkr> INTO ldo_data .
  lo_struct ?=  cl_abap_structdescr=>describe_by_data_ref( ldo_data ).
  lt_comp = lo_struct->components.
*
  LOOP AT lt_comp INTO ls_comp_a.
    ASSIGN COMPONENT ls_comp_a-name OF STRUCTURE <gs_vbdkr> TO <lo_field>.
    gs_vars-var_code = ls_comp_a-name.
    gs_vars-value = <lo_field>.
    APPEND gs_vars TO gt_vars.
  ENDLOOP.
*
* Take item data and schedule line data from table vbdpa.
  GET REFERENCE OF lt_vbdpr INTO ldo_data .
  ASSIGN ldo_data->* TO <lt_itab>.
  lo_table  ?= cl_abap_structdescr=>describe_by_data_ref( ldo_data ).
  lo_struct ?= lo_table->get_table_line_type( ).
  lt_comp = lo_struct->components.
*
*
  l_item_num = 0.

  LOOP AT lt_vbdpr INTO ls_item_detail.
*
    IF sy-tabix EQ 1 OR l_old_posnr NE ls_item_detail-posnr.
      l_schl_num = 0.
      l_parent_num = 0.
      l_item_num = l_item_num + 1.
      l_row_num = l_item_num.
      l_old_posnr = ls_item_detail-posnr..
    ELSE.
* New schedule line
      l_schl_num = l_schl_num + 1.
      l_parent_num = l_item_num.
      l_row_num = l_schl_num.
    ENDIF.
*
    LOOP AT lt_comp INTO ls_comp_a.
      ASSIGN COMPONENT ls_comp_a-name OF STRUCTURE ls_item_detail TO <lo_field>.
*
      gs_vars-var_code = ls_comp_a-name.
      gs_vars-value = <lo_field>.
      gs_vars-row_num = l_row_num.
      gs_vars-parent_row_num = l_parent_num.
      APPEND gs_vars TO gt_vars.
    ENDLOOP.
*
  ENDLOOP.
*---------------------------------------------------------------------*

ENDFORM.                    " get_data

*&---------------------------------------------------------------------*
*&      Form  protocol_update
*&---------------------------------------------------------------------*
FORM protocol_update .
  CHECK gv_screen_display = gc_false.
  CALL FUNCTION 'NAST_PROTOCOL_UPDATE'
    EXPORTING
      msg_arbgb = sy-msgid
      msg_nr    = sy-msgno
      msg_ty    = sy-msgty
      msg_v1    = sy-msgv1
      msg_v2    = sy-msgv2
      msg_v3    = sy-msgv3
      msg_v4    = sy-msgv4
    EXCEPTIONS
      OTHERS    = 0.
ENDFORM.                    " protocol_update

*&---------------------------------------------------------------------*
*&      Form  print_data
*&---------------------------------------------------------------------*
FORM print_data.

  DATA: ls_outputparams TYPE sfpoutputparams,
        ls_docparams    TYPE sfpdocparams,
        lv_form         TYPE tdsfname,
        lv_fm_name      TYPE rs38l_fnam,
        ls_pdf_file     TYPE fpformoutput,
        lv_device       TYPE output_device,
        lv_failed       TYPE boole_d,
        lv_anzal        TYPE nast-anzal.   "Number of outputs (Orig. + Cop.)

  lv_form = tnapr-sform.
  IF tnapr-formtype NE gc_pdf.
    <gv_returncode> = 1.
    MESSAGE e005 WITH <gs_vbdkr>-vbeln
                      tnapr-sform
                 INTO gv_dummy.
    PERFORM protocol_update.
    RETURN.
  ENDIF.

*--- Set output parameters
  PERFORM get_output_params CHANGING ls_outputparams
                                     ls_docparams
                                     lv_device.
  CHECK <gv_returncode> IS INITIAL.
  IF ls_outputparams-copies EQ 0.
    lv_anzal = 1.
  ELSE.
    lv_anzal = ls_outputparams-copies.
  ENDIF.
  ls_outputparams-copies = 1.

  IF cl_ops_switch_check=>sd_sfws_sc1( ) IS NOT INITIAL.
* >>>>> BUNDLING <<<<< *************************************************
* Check for bundling
* Import parameter from memory
    DATA:  bundling TYPE char1.
    CLEAR: bundling.
    IMPORT bundling FROM MEMORY ID 'BUNDLING'.
    IF sy-subrc NE 0 OR bundling NE 'X' OR
       nast-nacha NE '1'.
      CLEAR: bundling.
*   Open the spool job
      CALL FUNCTION 'FP_JOB_OPEN'
        CHANGING
          ie_outputparams = ls_outputparams
        EXCEPTIONS
          cancel          = 1
          usage_error     = 2
          system_error    = 3
          internal_error  = 4
          OTHERS          = 5.
      IF sy-subrc <> 0.
        <gv_returncode> = sy-subrc.
        PERFORM protocol_update.
        RETURN.
      ENDIF.
    ENDIF.
* >>>>> BUNDLING <<<<< *************************************************
  ELSE.
*--- Open the spool job
    CALL FUNCTION 'FP_JOB_OPEN'
      CHANGING
        ie_outputparams = ls_outputparams
      EXCEPTIONS
        cancel          = 1
        usage_error     = 2
        system_error    = 3
        internal_error  = 4
        OTHERS          = 5.

    IF sy-subrc <> 0.
      <gv_returncode> = sy-subrc.
      PERFORM protocol_update.
      RETURN.
    ENDIF.
  ENDIF.

*--- Get the name of the generated function module
  TRY.
      CALL FUNCTION 'FP_FUNCTION_MODULE_NAME'
        EXPORTING
          i_name     = lv_form
        IMPORTING
          e_funcname = lv_fm_name.

    CATCH cx_fp_api_repository
          cx_fp_api_usage
          cx_fp_api_internal.
      <gv_returncode> = 99.
      MESSAGE e000 WITH <gs_vbdkr>-vbeln
                   INTO gv_dummy.
      PERFORM protocol_update.
      RETURN.
  ENDTRY.

  IF bd_sd_bil IS BOUND.
    DO lv_anzal TIMES.
      IF sy-index NE 1 AND gs_interface-head_detail-repeat NE gc_true.
        gs_interface-head_detail-repeat = gc_true.
      ENDIF.
*   Call BAdI for printing
      CALL BADI bd_sd_bil->print_data
        EXPORTING
          iv_fm_name    = lv_fm_name
          is_interface  = gs_interface
          is_docparams  = ls_docparams
          is_nast       = nast
        IMPORTING
          es_formoutput = ls_pdf_file
        EXCEPTIONS
          error         = 1.
    ENDDO.
  ELSE.
*   No BAdI handle: Directly call the function module generated
*   from according PDF form
    DO lv_anzal TIMES.
      IF sy-index NE 1 AND gs_interface-head_detail-repeat NE gc_true.
        gs_interface-head_detail-repeat = gc_true.
      ENDIF.
      CALL FUNCTION lv_fm_name
        EXPORTING
          /1bcdwb/docparams  = ls_docparams
          bil_prt_com        = gs_interface
        IMPORTING
          /1bcdwb/formoutput = ls_pdf_file
        EXCEPTIONS
          usage_error        = 1
          system_error       = 2
          internal_error     = 3
          OTHERS             = 4.
    ENDDO.
  ENDIF.
  ls_outputparams-copies = lv_anzal.
  IF NOT sy-subrc IS INITIAL.
    <gv_returncode> = sy-subrc.
    PERFORM protocol_update.
    MESSAGE e000 WITH <gs_vbdkr>-vbeln
                 INTO gv_dummy.
    PERFORM protocol_update.
*   Do not directly return but only after closing the spool job
    lv_failed = abap_true.
  ENDIF.


  IF cl_ops_switch_check=>sd_sfws_sc1( ) IS NOT INITIAL.
* >>>>> BUNDLING <<<<< *************************************************
    IF bundling NE 'X'.
*   Close the spool job
      CALL FUNCTION 'FP_JOB_CLOSE'
        EXCEPTIONS
          usage_error    = 1
          system_error   = 2
          internal_error = 3
          OTHERS         = 4.
      IF sy-subrc <> 0.
        <gv_returncode> = sy-subrc.
        MESSAGE e000 WITH <gs_vbdkr>-vbeln
                     INTO gv_dummy.
        PERFORM protocol_update.
        RETURN.
      ENDIF.
    ENDIF.
* >>>>> BUNDLING <<<<< *************************************************
  ELSE.
*--- Close the spool job
    CALL FUNCTION 'FP_JOB_CLOSE'
      EXCEPTIONS
        usage_error    = 1
        system_error   = 2
        internal_error = 3
        OTHERS         = 4.

    IF sy-subrc <> 0.
      <gv_returncode> = sy-subrc.
      MESSAGE e000 WITH <gs_vbdkr>-vbeln
                   INTO gv_dummy.
      PERFORM protocol_update.
      RETURN.
    ENDIF.
  ENDIF.


  IF NOT lv_failed IS INITIAL.
*   Now, leave processing if printing did fail
    RETURN.
  ENDIF.

*--- Post processing
  CASE lv_device.
    WHEN gc_device-fax
      OR gc_device-email.
      PERFORM send_data USING lv_device
                              ls_pdf_file.
      IF ls_outputparams-arcmode <> '1'.
        CALL FUNCTION 'ARCHIV_CREATE_OUTGOINGDOC_MULT'
          EXPORTING
            documentclass            = 'PDF'
            document                 = ls_pdf_file-pdf
          TABLES
            arc_i_tab                = ls_docparams-daratab
          EXCEPTIONS
            error_archiv             = 1
            error_communicationtable = 2
            error_connectiontable    = 3
            error_kernel             = 4
            error_parameter          = 5
            error_format             = 6
            OTHERS                   = 7.
        IF sy-subrc <> 0.
          MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
                  WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
                  RAISING system_error.
        ENDIF.
      ENDIF.
    WHEN gc_device-web_dynpro.
      EXPORT lv_pdf_file = ls_pdf_file-pdf TO MEMORY ID 'PDF_FILE'.
  ENDCASE.
  CHECK <gv_returncode> IS INITIAL.

ENDFORM.                    " print_data


*&---------------------------------------------------------------------*
*&      Form  print_data_varo
*&---------------------------------------------------------------------*
FORM print_data_varo.

  DATA: ls_outputparams TYPE sfpoutputparams,
        ls_docparams    TYPE sfpdocparams,
        ls_pdf_file     TYPE fpformoutput,
        lv_device       TYPE output_device,
        lv_failed       TYPE boole_d,
        lv_invoice      TYPE char12,
        ls_fpe          TYPE /flm/fpe,
        lv_anzal        TYPE nast-anzal.   "Number of outputs (Orig. + Cop.)
*
*--- Set output parameters
  PERFORM get_output_params CHANGING ls_outputparams
                                     ls_docparams
                                     lv_device.
  CHECK <gv_returncode> IS INITIAL.

  IF ls_outputparams-copies EQ 0.
    lv_anzal = 1.
  ELSE.
    lv_anzal = ls_outputparams-copies.
  ENDIF.
  ls_outputparams-copies = 1.

* Set up defaults
  lv_ftype    = tnapr-sform.
  lv_template = nast-spras.
  lv_fver     = '00'.
  lv_doc      = nast-objky.
  lv_invoice  = nast-objky.
  CLEAR lv_reprint.
*----------------------------------------------------------------------*
* Check for Re-print
*----------------------------------------------------------------------*
  SELECT * INTO ls_nast FROM nast WHERE kappl = gs_nast-kappl
                                AND   objky = gs_nast-objky
                                AND   kschl = gs_nast-kschl
                                AND   spras = gs_nast-spras
                                AND   parnr = gs_nast-parnr
                                AND   parvw = gs_nast-parvw
                                AND   nacha BETWEEN '1' AND '4'
                                AND   vstat = '1'.
    IF gs_nast-aende IS INITIAL.
      lv_reprint = 'X'.
    ENDIF.
  ENDSELECT.
*
* Find previous output for reprint.
*
  IF lv_reprint = 'X'.
*
    SELECT * FROM /flm/fpe UP TO 1 ROWS  INTO ls_fpe WHERE ftype    = lv_ftype
                                                     AND   flang = lv_template
                                                     AND   document = lv_doc
                            ORDER BY id DESCENDING.
    ENDSELECT.
*
    IF sy-subrc EQ 0.
* Previous output found
*
      lv_ftype    = ls_fpe-ftype.
      lv_fver     = ls_fpe-fver.
      lv_template = ls_fpe-template.
      lv_fid      = ls_fpe-id.
      lv_doc      = ls_fpe-document.
    ELSE.
* No form found.
      CLEAR lv_reprint.
    ENDIF.
*
  ENDIF.
*----------------------------------------------------------------------*
* Fill variables
*----------------------------------------------------------------------*
  CLEAR ls_variables.
  ls_variables-var_code = 'REPRINT'.
  ls_variables-value = lv_reprint.
  APPEND ls_variables TO lt_variables.
  CLEAR ls_variables.
*
  ls_variables-var_code = 'KSCHL'.
  ls_variables-value = gs_nast-kschl.
  APPEND ls_variables TO lt_variables.
  CLEAR ls_variables.
*
  ls_variables-var_code = 'SPRAS'.
  ls_variables-value = gs_nast-spras.
  APPEND ls_variables TO lt_variables.
*
*
*----------------------------------------------------------------------*
* Handle output scenario
*----------------------------------------------------------------------*
  IF gv_screen_display NE gc_true.
*
    IF ls_outputparams-arcmode <> '2'.

      CALL FUNCTION '/FLM/PDF_PRINT'
        EXPORTING
          im_ftype        = lv_ftype
          im_outputparams = ls_outputparams
          im_toption      = lv_template
          im_fver         = lv_fver
          im_fid          = lv_fid
          im_document     = lv_doc
          im_variables    = lt_variables
        IMPORTING
          ex_pdf          = lv_pdf
          ex_subrc        = <gv_returncode>
          ex_mess         = ls_mess.

*update processing log:
      CALL FUNCTION 'NAST_PROTOCOL_UPDATE'
        EXPORTING
          msg_arbgb = ls_mess-id
          msg_nr    = ls_mess-number
          msg_ty    = ls_mess-type
          msg_v1    = ls_mess-message_v1
          msg_v2    = ls_mess-message_v2
          msg_v3    = ls_mess-message_v3
          msg_v4    = ls_mess-message_v4
        EXCEPTIONS
          OTHERS    = 0.

* Drop out if API has thrown an error
      IF <gv_returncode> <> 0.
        RETURN.
      ENDIF.

    ELSE. "Just return a PDF for archiving

      CALL FUNCTION '/FLM/OUTPUT_PDF_PDL_OUT'
        EXPORTING
          im_ftype     = lv_ftype
          im_fid       = lv_fid
          im_fver      = lv_fver
          im_toption   = lv_template
          im_document  = lv_doc
          im_variables = lt_variables
          im_no_print  = 'X'
*         IM_PDLTYPE   =
*         IM_XDCNAME   =
        IMPORTING
          ex_pdf       = lv_pdf
          ex_subrc     = <gv_returncode>
          ex_mess      = ls_mess.
*
      CALL FUNCTION 'NAST_PROTOCOL_UPDATE'
        EXPORTING
          msg_arbgb = ls_mess-id
          msg_nr    = ls_mess-number
          msg_ty    = ls_mess-type
          msg_v1    = ls_mess-message_v1
          msg_v2    = ls_mess-message_v2
          msg_v3    = ls_mess-message_v3
          msg_v4    = ls_mess-message_v4
        EXCEPTIONS
          OTHERS    = 0.

* Drop out if API has thrown an error
      IF <gv_returncode> <> 0.
        RETURN.
      ENDIF.

    ENDIF.

* Handle Archiving
    IF ls_outputparams-arcmode <> '1'.
      CALL FUNCTION 'ARCHIV_CREATE_OUTGOINGDOC_MULT'
        EXPORTING
          documentclass            = 'PDF'
          document                 = lv_pdf
        TABLES
          arc_i_tab                = ls_docparams-daratab
        EXCEPTIONS
          error_archiv             = 1
          error_communicationtable = 2
          error_connectiontable    = 3
          error_kernel             = 4
          error_parameter          = 5
          error_format             = 6
          OTHERS                   = 7.
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
                WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
                RAISING system_error.
      ELSE.
        CALL FUNCTION 'NAST_PROTOCOL_UPDATE'
          EXPORTING
            msg_arbgb = '/FLM/TFS'
            msg_nr    = '999'
            msg_ty    = 'I'
            msg_v1    = 'Document sent to archive'
            msg_v2    = ''
            msg_v3    = ''
            msg_v4    = ''
          EXCEPTIONS
            OTHERS    = 0.
      ENDIF.

    ENDIF.
*
  ELSE.
*----------------------------------------------------------------------*
* Call screen to preview PDF form
*----------------------------------------------------------------------*
    CALL FUNCTION '/FLM/PREVIEW_OUTPUT_PDF'
      EXPORTING
        im_ftype     = lv_ftype
        im_fid       = lv_fid
        im_fver      = lv_fver
        im_toption   = lv_template
        im_document  = lv_doc
        im_variables = lt_variables
*       IM_DNS_SUB   =
*       IM_HTTPS     =
      IMPORTING
        ex_subrc     = <gv_returncode>
        ex_mess      = ls_mess.
*
  ENDIF.
*
ENDFORM.                    " print_data_varo

*&---------------------------------------------------------------------*
*&      Form  send_data_floe
*&---------------------------------------------------------------------*
FORM send_data_floe.

  DATA:
    ls_outputparams TYPE sfpoutputparams,
    ls_docparams    TYPE sfpdocparams,
    lv_device       TYPE output_device,
    ls_fpe          TYPE /flm/fpe,
    lv_invoice      TYPE char12.

  DATA:
    lt_mess TYPE bapiret2_t,
    ls_mess TYPE bapiret2.

  DATA:
    ev_ebody         TYPE  string,
    et_rec_emails    TYPE  /floe/rec_email_t,
    et_attachments   TYPE  /floe/att_t,
    ev_esubject_long TYPE  /floe/esubject_long,
    lv_inupd         TYPE i,
    lv_no_commit     TYPE flag.

* Get output parameters
  PERFORM get_output_params CHANGING ls_outputparams
                                     ls_docparams
                                     lv_device.
  CHECK <gv_returncode> IS INITIAL.
*---------------------------------------------------------------------*
* Fill recipient
* Add additional recipients in recipient user-exit
*---------------------------------------------------------------------*
  gs_rec_email-email = gs_nast-email_addr.
  gs_rec_email-type = '1'.
  APPEND gs_rec_email TO gt_rec_emails.
*----------------------------------------------------------------------*
* Add variables
* Add additional variables in email data user-exit
*----------------------------------------------------------------------*
  CLEAR ls_variables.
  ls_variables-var_code = 'REPRINT'.
  ls_variables-value = lv_reprint.
  APPEND ls_variables TO lt_variables.  "Varo
  APPEND ls_variables TO gt_vars.       "Floe
*
  CLEAR ls_variables.
  ls_variables-var_code = 'KSCHL'.
  ls_variables-value = gs_nast-kschl.
  APPEND ls_variables TO lt_variables.  "Varo
  APPEND ls_variables TO gt_vars.       "Floe
*
  CLEAR ls_variables.
  ls_variables-var_code = 'SPRAS'.
  ls_variables-value = gs_nast-spras.
  APPEND ls_variables TO lt_variables.  "Varo
  APPEND ls_variables TO gt_vars.       "Floe
*
  IF gv_screen_display IS INITIAL.
    CLEAR ls_variables.
    ls_variables-var_code = 'FLOE_SEND'.
    ls_variables-value = 'X'.
    APPEND ls_variables TO gt_vars.       "Floe
  ENDIF.

*---------------------------------------------------------------------*
* Add attachment
* Add additional attachments in attachment user-exit
*---------------------------------------------------------------------*
  lv_ftype = tnapr-sform.
  IF lv_ftype IS NOT INITIAL.
* Generate PDF attachment with Varo, form type ftype.
*
* Set up defaults
    lv_ftype    = tnapr-sform.
    lv_template = nast-spras.
    lv_fver     = '00'.
    lv_doc      = nast-objky.
    lv_invoice  = nast-objky.
*----------------------------------------------------------------------*
* Check if this is a re-print and set form id
*----------------------------------------------------------------------*
* Check if this is a re-print and set form id
*
    SELECT * FROM /flm/fpe UP TO 1 ROWS  INTO ls_fpe WHERE ftype    = lv_ftype
                                                     AND   flang = lv_template
                                                     AND   document = lv_doc
                            ORDER BY id DESCENDING.
    ENDSELECT.
*
    IF sy-subrc EQ 0 AND gs_nast-aende IS INITIAL.
* Previous output found
*
      lv_ftype    = ls_fpe-ftype.
      lv_fver     = ls_fpe-fver.
      lv_template = ls_fpe-template.
      lv_fid      = ls_fpe-id.
      lv_doc      = ls_fpe-document.
      lv_reprint  = 'X'.
    ENDIF.

*
    IF gv_screen_display IS NOT INITIAL.   "+000
*----------------------------------------------------------------------*
* Preview the PDF

      CALL FUNCTION '/FLM/PREVIEW_OUTPUT_PDF'  "+000
        EXPORTING
          im_ftype     = lv_ftype
          im_fid       = lv_fid
          im_fver      = lv_fver
          im_toption   = lv_template
          im_document  = lv_doc
          im_variables = lt_variables
*         IM_DNS_SUB   =
*         IM_HTTPS     =
        IMPORTING
          ex_subrc     = <gv_returncode>
          ex_mess      = ls_mess.
      RETURN.
*
    ELSE.   "+000
* Call Varo to generate the PDF
*
      CALL FUNCTION '/FLM/OUTPUT_PDF_PDL_OUT'
        EXPORTING
          im_ftype     = lv_ftype
          im_fid       = lv_fid
          im_fver      = lv_fver
          im_toption   = lv_template
          im_document  = lv_doc
          im_variables = lt_variables
          im_no_print  = 'X'
*         IM_PDLTYPE   =
*         IM_XDCNAME   =
        IMPORTING
          ex_pdf       = lv_pdf
*         EX_PDL       =
*         EX_PAGECOUNT =
*         EX_JOB_ID    =
          ex_subrc     = <gv_returncode>
          ex_mess      = ls_mess.
*
*      IF <gv_returncode> <> 0.  "-000
      CALL FUNCTION 'NAST_PROTOCOL_UPDATE'
        EXPORTING
          msg_arbgb = ls_mess-id
          msg_nr    = ls_mess-number
          msg_ty    = ls_mess-type
          msg_v1    = ls_mess-message_v1
          msg_v2    = ls_mess-message_v2
          msg_v3    = ls_mess-message_v3
          msg_v4    = ls_mess-message_v4
        EXCEPTIONS
          OTHERS    = 0.
*        RETURN.  "-000
*      ENDIF. "-000

* Get new form id etc.
      lv_cms_doc = ls_mess-parameter.
*
      CALL METHOD /flm/core=>split_xdp_cms_doc
        EXPORTING
          im_cms_doc = lv_cms_doc
        IMPORTING
          ex_ccode   = lv_ccode
          ex_ftype   = lv_ftype
          ex_fver    = lv_fver
          ex_flang   = lv_template
          ex_fid     = lv_fid
          ex_fid_var = lv_fidvar.
*
*-------------------------------------------------------------------
* Fill attachment
*
      CONCATENATE 'Invoice_' lv_invoice '.pdf' INTO ls_attach-att_filename.
      ls_attach-att_description = 'Order_output'.
      ls_attach-att_data = lv_pdf.
      APPEND ls_attach TO lt_attach.
    ENDIF.
  ENDIF.
*-------------------------------------------------------------------
* Determine whether this is run as update task
*
  CLEAR: lv_inupd, lv_no_commit.
  CALL METHOD cl_system_transaction_state=>get_in_update_task
    RECEIVING
      in_update_task = lv_inupd.
*
  IF lv_inupd = 1.
    lv_no_commit = 'X'.
  ENDIF.
*
*----------------------------------------------------------------------*
* Call Floe API
*----------------------------------------------------------------------*
  CLEAR ev_ebody.
*
  l_im_doc = lv_invoice.
*
  CALL FUNCTION '/FLOE/EMAIL_OUT'
    EXPORTING
      im_etype            = gv_etype
      im_elang            = gv_language
      im_document         = l_im_doc
      im_rec_emails       = gt_rec_emails
      im_variables        = gt_vars
      im_send_immediately = 'X'
      im_attachments      = lt_attach
      im_preview          = gv_screen_display
      im_no_commit        = lv_no_commit
    IMPORTING
      ex_subrc            = <gv_returncode>
      ex_ebody            = ev_ebody
      ex_mess             = lt_mess
      ex_rec_emails       = et_rec_emails
      ex_attachments      = et_attachments
      ex_esubject_long    = ev_esubject_long.

  LOOP AT lt_mess INTO ls_mess.
    CALL FUNCTION 'NAST_PROTOCOL_UPDATE'
      EXPORTING
        msg_arbgb = ls_mess-id
        msg_nr    = ls_mess-number
        msg_ty    = ls_mess-type
        msg_v1    = ls_mess-message_v1
        msg_v2    = ls_mess-message_v2
        msg_v3    = ls_mess-message_v3
        msg_v4    = ls_mess-message_v4
      EXCEPTIONS
        OTHERS    = 0.
  ENDLOOP.
*
* Drop out if API has thrown an error
  IF <gv_returncode> NE 0.
    RETURN.
  ENDIF.
*
*----------------------------------------------------------------------*
* Preview Email if required.
*----------------------------------------------------------------------*
  IF NOT gv_screen_display IS INITIAL.

    CALL FUNCTION '/FLOE/EMAIL_VIEWER'  
      EXPORTING
        im_preview     = 'X'
*       IM_ETYPE       =
*       IM_EID         =
        im_esubject    = 'FLOE Preview'
        im_ebody       = ev_ebody
        im_rec_emails  = et_rec_emails
        im_attachments = et_attachments
      IMPORTING
        ex_subrc       = <gv_returncode>.

  ENDIF.

ENDFORM.                    " send_data_floe

*&---------------------------------------------------------------------*
*&      Form  get_item_details
*&---------------------------------------------------------------------*
FORM get_item_details
  USING ut_vbdpr              TYPE tbl_vbdpr.

  DATA: ls_dd07v       TYPE dd07v,
        ls_text        TYPE tline,
        ls_item_detail TYPE invoice_s_prt_item_detail.

  FIELD-SYMBOLS:
    <ls_vbdpr>       TYPE vbdpr,
    <ls_item_detail> TYPE invoice_s_prt_item_detail.

  CALL FUNCTION 'DD_DOMVALUES_GET'
    EXPORTING
      domname        = 'VBTYPL'
      text           = gc_true
      langu          = gv_language
    TABLES
      dd07v_tab      = gt_vbtyp_fix_values
    EXCEPTIONS
      wrong_textflag = 1
      OTHERS         = 2.

  IF sy-subrc <> 0.
    <gv_returncode> = sy-subrc.
    MESSAGE e000 WITH <gs_vbdkr>-vbeln
                 INTO gv_dummy.
    PERFORM protocol_update.
    RETURN.
  ENDIF.

  LOOP AT ut_vbdpr ASSIGNING <ls_vbdpr>.

    CLEAR ls_item_detail.

*   Clearing items (Verrechnungspositionen) will be printed only in
*   down payment requests
    IF ( <gs_vbdkr>-fktyp EQ 'P'  )
    OR    ( <gs_vbdkr>-fktyp NE 'P'
    AND     <ls_vbdpr>-fareg NA '45' ).

*--- Fill the VBDPR structure
      ls_item_detail-vbdpr = <ls_vbdpr>.

*--- Get the type text of the reference document
      IF NOT ls_item_detail-vbdpr-vbeln_vg2 IS INITIAL.
        READ TABLE gt_vbtyp_fix_values  INTO ls_dd07v
                  WITH KEY domvalue_l = ls_item_detail-vbdpr-vgtyp.

        IF sy-subrc IS INITIAL.
          ls_item_detail-vgtyp_text = ls_dd07v-ddtext.
        ENDIF.
      ENDIF.

*--- Get the item prices
      PERFORM get_item_prices              CHANGING ls_item_detail.
      IF <gv_returncode> <> 0.
        RETURN.
      ENDIF.

*--- Get configurations
      PERFORM get_item_characteristics     CHANGING ls_item_detail.
      IF <gv_returncode> <> 0.
        RETURN.
      ENDIF.

      IF bd_sd_bil IS BOUND.
*       Call BAdI concerning item details
        CALL BADI bd_sd_bil->get_item_details
          EXPORTING
            is_vbdkr       = <gs_vbdkr>
            is_nast        = nast
            iv_language    = gv_language
          CHANGING
            cs_item_detail = ls_item_detail.
      ENDIF.
      APPEND ls_item_detail TO gs_interface-item_detail.

    ELSEIF ( <gs_vbdkr>-fktyp NE 'P'
    AND      <ls_vbdpr>-fareg CA '45' ).
*--- Get downpayment data
      PERFORM get_item_downpayment         USING <ls_vbdpr>.
      IF <gv_returncode> <> 0.
        RETURN.
      ENDIF.
    ENDIF.

  ENDLOOP.

ENDFORM.                    " get_item_details
*&---------------------------------------------------------------------*
*&      Form  get_item_prices
*&---------------------------------------------------------------------*
FORM get_item_prices
  CHANGING
        cs_item_detail  TYPE invoice_s_prt_item_detail.

  DATA: ls_komp  TYPE komp,
        ls_komvd TYPE komvd,
        lv_lines TYPE i.

  DATA: ro_print     TYPE REF TO cl_tm_invoice,
        lv_sim_flag  TYPE boolean,
        lt_tax_items TYPE komvd_t,
        ls_tax_items TYPE komvd.

*--- Fill the communication structure
  IF gs_komk-knumv NE <gs_vbdkr>-knumv OR
     gs_komk-knumv IS INITIAL.
    CLEAR gs_komk.
    gs_komk-mandt     = sy-mandt.
    gs_komk-fkart     = <gs_vbdkr>-fkart.
    gs_komk-kalsm     = <gs_vbdkr>-kalsm.
    gs_komk-kappl     = gc_pr_kappl.
    gs_komk-waerk     = <gs_vbdkr>-waerk.
    gs_komk-knumv     = <gs_vbdkr>-knumv.
    gs_komk-knuma     = <gs_vbdkr>-knuma.
    gs_komk-vbtyp     = <gs_vbdkr>-vbtyp.
    gs_komk-land1     = <gs_vbdkr>-land1.
    gs_komk-vkorg     = <gs_vbdkr>-vkorg.
    gs_komk-vtweg     = <gs_vbdkr>-vtweg.
    gs_komk-spart     = <gs_vbdkr>-spart.
    gs_komk-bukrs     = <gs_vbdkr>-bukrs.
    gs_komk-hwaer     = <gs_vbdkr>-waers.
    gs_komk-prsdt     = <gs_vbdkr>-erdat.
    gs_komk-kurst     = <gs_vbdkr>-kurst.
    gs_komk-kurrf     = <gs_vbdkr>-kurrf.
    gs_komk-kurrf_dat = <gs_vbdkr>-kurrf_dat.
  ENDIF.
  ls_komp-kposn     = cs_item_detail-vbdpr-posnr.
  ls_komp-kursk     = cs_item_detail-vbdpr-kursk.
  ls_komp-kursk_dat = cs_item_detail-vbdpr-kursk_dat.
  IF cl_sd_doc_category_util=>is_any_retour( <gs_vbdkr>-vbtyp ).
    IF cs_item_detail-vbdpr-shkzg CA ' A'.
      ls_komp-shkzg = gc_true.
    ENDIF.
  ELSE.
    IF cs_item_detail-vbdpr-shkzg CA 'BX'.
      ls_komp-shkzg = gc_true.
    ENDIF.
  ENDIF.
  IF bd_sd_bil IS BOUND.
* BAdI
    CALL BADI bd_sd_bil->prepare_item_prices
      EXPORTING
        is_vbdkr       = <gs_vbdkr>
        iv_language    = gv_language
        is_item_detail = cs_item_detail
        is_nast        = nast
      CHANGING
        cs_komp        = ls_komp
        cs_komk        = gs_komk.
  ENDIF.

*--- Get the item prices
* ERP TM Integration
  IF cl_ops_switch_check=>aci_sfws_sc_erptms_ii( ) EQ abap_true.
    ro_print = cl_tm_invoice=>get_instance( ).
    lv_sim_flag = ro_print->get_simulation_flag( ).
    IF lv_sim_flag IS INITIAL.
      IF gv_price_print_mode EQ 'A'.
        CALL FUNCTION 'RV_PRICE_PRINT_ITEM'
          EXPORTING
            comm_head_i = gs_komk
            comm_item_i = ls_komp
            language    = gv_language
          IMPORTING
            comm_head_e = gs_komk
            comm_item_e = ls_komp
          TABLES
            tkomv       = gt_komv
            tkomvd      = cs_item_detail-conditions.
      ELSE.
        CALL FUNCTION 'RV_PRICE_PRINT_ITEM_BUFFER'
          EXPORTING
            comm_head_i = gs_komk
            comm_item_i = ls_komp
            language    = gv_language
          IMPORTING
            comm_head_e = gs_komk
            comm_item_e = ls_komp
          TABLES
            tkomv       = gt_komv
            tkomvd      = cs_item_detail-conditions.
      ENDIF.
      DELETE cs_item_detail-conditions WHERE kbetr IS INITIAL.
    ELSE.
      lt_tax_items = cl_tm_invoice=>gt_tax_items.
      LOOP AT lt_tax_items INTO ls_tax_items WHERE kposn = cs_item_detail-vbdpr-posnr.
        APPEND ls_tax_items TO cs_item_detail-conditions.
      ENDLOOP.
      IF NOT cs_item_detail-conditions IS INITIAL.
        cs_item_detail-ex_conditions = gc_true.
      ENDIF.
    ENDIF.
  ELSE.
    IF gv_price_print_mode EQ 'A'.
      CALL FUNCTION 'RV_PRICE_PRINT_ITEM'
        EXPORTING
          comm_head_i = gs_komk
          comm_item_i = ls_komp
          language    = gv_language
        IMPORTING
          comm_head_e = gs_komk
          comm_item_e = ls_komp
        TABLES
          tkomv       = gt_komv
          tkomvd      = cs_item_detail-conditions.
    ELSE.
      CALL FUNCTION 'RV_PRICE_PRINT_ITEM_BUFFER'
        EXPORTING
          comm_head_i = gs_komk
          comm_item_i = ls_komp
          language    = gv_language
        IMPORTING
          comm_head_e = gs_komk
          comm_item_e = ls_komp
        TABLES
          tkomv       = gt_komv
          tkomvd      = cs_item_detail-conditions.
    ENDIF.
  ENDIF.

  IF NOT cs_item_detail-conditions IS INITIAL.
*   The conditions have always one initial line
    DESCRIBE TABLE cs_item_detail-conditions LINES lv_lines.
    IF lv_lines EQ 1.
      READ TABLE cs_item_detail-conditions INTO ls_komvd
                                           INDEX 1.
      IF NOT ls_komvd IS INITIAL.
        cs_item_detail-ex_conditions = gc_true.
      ENDIF.
    ELSE.
      cs_item_detail-ex_conditions = gc_true.
    ENDIF.
  ENDIF.

*--- Fill the tax code
  CALL FUNCTION 'SD_TAX_CODE_MAINTAIN'
    EXPORTING
      key_knumv           = gs_komk-knumv
      key_kposn           = ls_komp-kposn
      i_application       = ' '
      i_pricing_procedure = gs_komk-kalsm
    TABLES
      xkomv               = gt_komv.

ENDFORM.                    " get_item_prices
*&---------------------------------------------------------------------*
*&      Form  get_head_details
*&---------------------------------------------------------------------*
FORM get_head_details.

*--- Get Sales Org detail
  PERFORM get_head_tvko.
  CHECK <gv_returncode> IS INITIAL.

*--- Get Campany Code texts in case of cross company
  PERFORM get_head_comp_code_texts.
  CHECK <gv_returncode> IS INITIAL.

*--- Get header prices
  PERFORM get_head_prices.
  CHECK <gv_returncode> IS INITIAL.

*--- Get dynamic texts
  PERFORM get_head_text.
  CHECK <gv_returncode> IS INITIAL.

*--- Get sending country
  PERFORM get_head_sending_country.
  CHECK <gv_returncode> IS INITIAL.

*--- Check repeat printout
  PERFORM get_head_repeat_flag.
  CHECK <gv_returncode> IS INITIAL.

*--- Get Payment_split
  PERFORM get_payment_split.
  CHECK <gv_returncode> IS INITIAL.

*--- Get Downpayment
  PERFORM get_head_downpayment.
  CHECK <gv_returncode> IS INITIAL.

*--- Get Payment Cards
  PERFORM get_head_paymentcards.
  CHECK <gv_returncode> IS INITIAL.

*--- SD SEPA: Get Mandate details
  INCLUDE sd_sepa_faktura_004_pdf.
*--- SD SEPA

  IF bd_sd_bil IS BOUND.
* BAdI
    CALL BADI bd_sd_bil->get_head_details
      EXPORTING
        iv_language  = gv_language
        is_nast      = nast
      CHANGING
        cs_interface = gs_interface.
  ENDIF.
ENDFORM.                    " get_head_details
*&---------------------------------------------------------------------*
*&      Form  get_head_repeat_flag
*&---------------------------------------------------------------------*
FORM get_head_repeat_flag.

  DATA: lv_nast TYPE nast.

  SELECT SINGLE * INTO lv_nast FROM nast
                                WHERE kappl = gs_nast-kappl "#EC *
                                AND   objky = gs_nast-objky
                                AND   kschl = gs_nast-kschl
                                AND   spras = gs_nast-spras
                                AND   parnr = gs_nast-parnr
                                AND   parvw = gs_nast-parvw
                                AND   nacha BETWEEN '1' AND '5'
                                AND   vstat = '1'.
  IF sy-subrc IS INITIAL.
    gs_interface-head_detail-repeat = gc_true.
  ENDIF.

ENDFORM.                    " get_head_repeat_flag
*&---------------------------------------------------------------------*
*&      Form  get_head_sending_country
*&---------------------------------------------------------------------*
FORM get_head_sending_country.

  DATA: ls_address    TYPE sdpartner_address.

  CHECK <gs_vbdkr>-sland IS INITIAL.

  CALL FUNCTION 'SD_ADDRESS_GET'
    EXPORTING
      fif_address_number      = gs_interface-head_detail-tvko-adrnr
      fif_address_type        = '1'
    IMPORTING
      fes_sdpartner_address   = ls_address
    EXCEPTIONS
      address_not_found       = 1
      address_type_not_exists = 2
      no_person_number        = 3
      OTHERS                  = 4.

  IF sy-subrc IS INITIAL.
    <gs_vbdkr>-sland = ls_address-country.
  ELSE.
    <gv_returncode> = sy-subrc.
    MESSAGE e004 WITH <gs_vbdkr>-vbeln
                      gs_interface-head_detail-tvko-vkorg
                 INTO gv_dummy.
    PERFORM protocol_update.
    RETURN.
  ENDIF.

ENDFORM.                    " get_head_sending_country

*&---------------------------------------------------------------------*
*&      Form  get_head_text
*&---------------------------------------------------------------------*
FORM get_head_text.

  DATA: ls_dd07v       TYPE dd07v.

*--- VBDKR-VBTYP
  READ TABLE gt_vbtyp_fix_values  INTO ls_dd07v
             WITH KEY domvalue_l = <gs_vbdkr>-vbtyp
 .

  IF sy-subrc IS INITIAL.
    gs_interface-head_detail-vbtyp_text = ls_dd07v-ddtext.
  ENDIF.

*--- VBDKR-VGTYP
  IF NOT <gs_vbdkr>-vbeln_vg2 IS INITIAL.
    READ TABLE gt_vbtyp_fix_values  INTO ls_dd07v
        WITH KEY domvalue_l = <gs_vbdkr>-vgtyp.

    IF sy-subrc IS INITIAL.
      gs_interface-head_detail-vgtyp_text = ls_dd07v-ddtext.
    ENDIF.
  ENDIF.

*--- Header and Footer Text
  IF gs_interface-head_detail-vbdkr-vbtyp = if_sd_doc_category=>intercompany_invoice OR
     gs_interface-head_detail-vbdkr-vbtyp = if_sd_doc_category=>intercompany_credit_memo.
    gs_interface-head_detail-head_tdname   =
              gs_interface-head_detail-t001g-txtko.
    gs_interface-head_detail-head_tdobject = 'TEXT'.
    gs_interface-head_detail-head_tdid     = 'ADRS'.

    gs_interface-head_detail-foot_tdname   =
              gs_interface-head_detail-t001g-txtfu.
    gs_interface-head_detail-foot_tdobject = 'TEXT'.
    gs_interface-head_detail-foot_tdid     = 'ADRS'.
  ELSE.
    gs_interface-head_detail-head_tdname   =
              gs_interface-head_detail-tvko-txnam_kop.
    gs_interface-head_detail-head_tdobject = 'TEXT'.
    gs_interface-head_detail-head_tdid     = 'ADRS'.

    gs_interface-head_detail-foot_tdname   =
              gs_interface-head_detail-tvko-txnam_fus.
    gs_interface-head_detail-foot_tdobject = 'TEXT'.
    gs_interface-head_detail-foot_tdid     = 'ADRS'.
  ENDIF.

ENDFORM.                    " get_head_text
*&---------------------------------------------------------------------*
*&      Form  get_item_characteristics
*&---------------------------------------------------------------------*
FORM get_item_characteristics
  CHANGING
        cs_item_detail TYPE invoice_s_prt_item_detail.

  DATA: lt_conf TYPE TABLE OF conf_out,
        ls_conf TYPE conf_out,
        lt_cabn TYPE TABLE OF cabn,
        ls_cabn TYPE cabn.

  RANGES: lr_cabn FOR ls_cabn-atinn.

* Check appropriate config exists
  CHECK NOT cs_item_detail-vbdpr-cuobj IS INITIAL AND
            cs_item_detail-vbdpr-attyp NE '02'.

  CALL FUNCTION 'VC_I_GET_CONFIGURATION'
    EXPORTING
      instance      = cs_item_detail-vbdpr-cuobj
      language      = gv_language
      print_sales   = gc_true
    TABLES
      configuration = lt_conf
    EXCEPTIONS
      OTHERS        = 4.

  IF sy-subrc <> 0.
    <gv_returncode> = sy-subrc.
    MESSAGE e001 WITH <gs_vbdkr>-vbeln
                 INTO gv_dummy.
    PERFORM protocol_update.
    RETURN.
  ENDIF.

  IF NOT lt_conf IS INITIAL.
    LOOP AT lt_conf INTO ls_conf.
      lr_cabn-option = gc_equal.
      lr_cabn-sign   = gc_include.
      lr_cabn-low    = ls_conf-atinn.
      COLLECT lr_cabn.
    ENDLOOP.

    CALL FUNCTION 'CLSE_SELECT_CABN'
      TABLES
        in_cabn        = lr_cabn
        t_cabn         = lt_cabn
      EXCEPTIONS
        no_entry_found = 1
        OTHERS         = 2.

    IF sy-subrc <> 0.
      <gv_returncode> = sy-subrc.
      MESSAGE e001 WITH <gs_vbdkr>-vbeln
                   INTO gv_dummy.
      PERFORM protocol_update.
      RETURN.
    ENDIF.

    SORT lt_cabn BY atinn.
    LOOP AT lt_conf INTO ls_conf.
      READ TABLE lt_cabn INTO ls_cabn
                         WITH KEY atinn = ls_conf-atinn
                         BINARY SEARCH.
      IF sy-subrc <> 0 OR
         ( ls_cabn-attab = 'SDCOM' AND ls_cabn-atfel = 'VKOND' )
         OR  ls_cabn-attab = 'VCSD_UPDATE'.
        DELETE lt_conf.
      ENDIF.
    ENDLOOP.

    cs_item_detail-configuration = lt_conf.

    IF NOT cs_item_detail-configuration IS INITIAL.
      cs_item_detail-ex_configuration = gc_true.
    ENDIF.
  ENDIF.

ENDFORM.                    " get_item_characteristics
*&---------------------------------------------------------------------*
*&      Form  GET_head_PRICES
*&---------------------------------------------------------------------*
FORM get_head_prices.

  DATA: ro_print      TYPE REF TO cl_tm_invoice,
        lv_sim_flag   TYPE boolean,
        lt_tax_header TYPE komvd_t.

* BAdI
  IF bd_sd_bil IS BOUND.
    CALL BADI bd_sd_bil->prepare_head_prices
      EXPORTING
        is_interface = gs_interface
        iv_language  = gv_language
        is_nast      = nast
      CHANGING
        cs_komk      = gs_komk.
  ENDIF.

* ERP TM Integration
  IF cl_ops_switch_check=>aci_sfws_sc_erptms_ii( ) EQ abap_true.
    ro_print = cl_tm_invoice=>get_instance( ).
    lv_sim_flag = ro_print->get_simulation_flag( ).
    IF lv_sim_flag IS INITIAL.
      IF gv_price_print_mode EQ 'A'.
        CALL FUNCTION 'RV_PRICE_PRINT_HEAD'
          EXPORTING
            comm_head_i = gs_komk
            language    = gv_language
          IMPORTING
            comm_head_e = gs_komk
          TABLES
            tkomv       = gt_komv
            tkomvd      = gs_interface-head_detail-conditions.
      ELSE.
        CALL FUNCTION 'RV_PRICE_PRINT_HEAD_BUFFER'
          EXPORTING
            comm_head_i = gs_komk
            language    = gv_language
          IMPORTING
            comm_head_e = gs_komk
          TABLES
            tkomv       = gt_komv
            tkomvd      = gs_interface-head_detail-conditions.
      ENDIF.
    ELSE.
      lt_tax_header = cl_tm_invoice=>gt_tax_header.
      IF lt_tax_header IS NOT INITIAL.
        gs_interface-head_detail-conditions = lt_tax_header.
      ENDIF.
      gs_interface-head_detail-gross_value =  cl_tm_invoice=>gv_total_amount.
    ENDIF.
  ELSE.
    IF gv_price_print_mode EQ 'A'.
      CALL FUNCTION 'RV_PRICE_PRINT_HEAD'
        EXPORTING
          comm_head_i = gs_komk
          language    = gv_language
        IMPORTING
          comm_head_e = gs_komk
        TABLES
          tkomv       = gt_komv
          tkomvd      = gs_interface-head_detail-conditions.
    ELSE.
      CALL FUNCTION 'RV_PRICE_PRINT_HEAD_BUFFER'
        EXPORTING
          comm_head_i = gs_komk
          language    = gv_language
        IMPORTING
          comm_head_e = gs_komk
        TABLES
          tkomv       = gt_komv
          tkomvd      = gs_interface-head_detail-conditions.
    ENDIF.
  ENDIF.

* Fill gross value
  gs_interface-head_detail-doc_currency = gs_komk-waerk.
  IF gs_interface-head_detail-gross_value IS INITIAL.
    gs_interface-head_detail-gross_value  = gs_komk-fkwrt.
  ENDIF.
  IF gs_interface-head_detail-supos IS INITIAL.
    gs_interface-head_detail-supos  = gs_komk-supos.
  ENDIF.
  IF NOT gs_interface-head_detail-conditions IS INITIAL.
    gs_interface-head_detail-ex_conditions = gc_true.
  ENDIF.

ENDFORM.                    " GET_head_PRICES
*&---------------------------------------------------------------------*
*&      Form  get_head_tvko
*&---------------------------------------------------------------------*
FORM get_head_tvko.

  CALL FUNCTION 'TVKO_SINGLE_READ'
    EXPORTING
      vkorg     = <gs_vbdkr>-vkorg
    IMPORTING
      wtvko     = gs_interface-head_detail-tvko
    EXCEPTIONS
      not_found = 1
      OTHERS    = 2.

  IF sy-subrc <> 0.
    <gv_returncode> = sy-subrc.
    MESSAGE e003 WITH <gs_vbdkr>-vbeln
                      <gs_vbdkr>-vkorg
                 INTO gv_dummy.
    PERFORM protocol_update.
    RETURN.
  ENDIF.

ENDFORM.                    " get_tvko
*&---------------------------------------------------------------------*
*&      Form  get_head_comp_code_texts
*&---------------------------------------------------------------------*
FORM get_head_comp_code_texts.

  STATICS ss_t001g        TYPE t001g.

  CHECK <gs_vbdkr>-vbtyp = if_sd_doc_category=>intercompany_invoice OR
        <gs_vbdkr>-vbtyp = if_sd_doc_category=>intercompany_credit_memo.

  IF ss_t001g-bukrs NE <gs_vbdkr>-bukrs.
    SELECT SINGLE * FROM t001g INTO ss_t001g
                                 WHERE bukrs EQ <gs_vbdkr>-bukrs
                                 AND   programm EQ sy-repid
                                 AND   txtid EQ 'SD'.
    IF sy-subrc <> 0.
      <gv_returncode> = sy-subrc.
      MESSAGE e000 WITH <gs_vbdkr>-vbeln
                   INTO gv_dummy.
      PERFORM protocol_update.
      RETURN.
    ENDIF.
  ENDIF.

  gs_interface-head_detail-t001g = ss_t001g.

ENDFORM.                                                    " get_t001g
*&---------------------------------------------------------------------*
*&      Form  send_data
*&---------------------------------------------------------------------*
FORM send_data
  USING uv_device           TYPE output_device
        us_pdf_file         TYPE fpformoutput.

  DATA: lv_date(14)       TYPE c,
        lv_mail_subject   TYPE so_obj_des,
        lt_mail_text      TYPE bcsy_text,
        lv_send_to_all    TYPE os_boolean,
        lt_adsmtp         TYPE TABLE OF adsmtp,
        ls_adsmtp         TYPE adsmtp,
        lt_adfax          TYPE TABLE OF adfax,
        ls_adfax          TYPE adfax,
        ls_address        TYPE sdprt_addr_s,
        lv_vbeln          TYPE vbeln,

*output control badi change

        ls_enh_flag       TYPE char1,
        ls_email_rcp      TYPE smtp_sd_sls_addr_s,
        ls_email_sendr    TYPE smtp_sd_sls_addr_s,
        lo_cl_bcs         TYPE REF TO cl_bcs,
        ls_file_attribs   TYPE file_attributes_s,
        lo_badi_mapper    TYPE REF TO badi_sd_obj_mapper,
        lt_email_addr     TYPE adr6_tt,
        lo_badi_sls_email TYPE REF TO badi_sd_sls_email.

  CHECK gv_screen_display NE gc_true.

*--- Determine the subject text
  lv_mail_subject = gs_nast-tdcovtitle.
  IF lv_mail_subject = space.
    WRITE <gs_vbdkr>-fkdat TO lv_date.
    WRITE <gs_vbdkr>-vbeln TO lv_vbeln NO-ZERO.
* Type, number, date
    CONCATENATE gs_interface-head_detail-vbtyp_text
                lv_vbeln
                lv_date
           INTO lv_mail_subject
           SEPARATED BY space.
  ENDIF.

  CASE uv_device.

    WHEN gc_device-email.
*o/p contrl badi enhancement
      TRY.

          GET BADI lo_badi_sls_email
            FILTERS
              sd_email_progs = if_sd_email_process_constant=>invoice_print01.

          IF lo_badi_sls_email IS BOUND.

            IF lo_badi_sls_email->imps IS NOT INITIAL.

              ls_enh_flag = abap_true.

            ENDIF.
          ENDIF.
*Catch not implemented exception or multiple implementation
        CATCH cx_badi_not_implemented.
          ls_enh_flag = abap_false.
          CLEAR lo_badi_sls_email.
      ENDTRY.
*end of o/p contrl badi enhancement


*--- Get the e-mail-text
      PERFORM get_mail_body CHANGING lt_mail_text.
      CHECK <gv_returncode> IS INITIAL.

*--- Get the e-mail address of the recipient
      ls_address-recip_email_addr = gs_nast-email_addr.

*--- Get the e-mail address of the sender
*     Try to get the e-mail of the sales org.
*     Otherwise takes the user's e-mail
      CALL FUNCTION 'ADDR_COMM_GET'
        EXPORTING
          address_number    = gs_interface-head_detail-tvko-adrnr
          language          = gv_language
          table_type        = 'ADSMTP'
        TABLES
          comm_table        = lt_adsmtp
        EXCEPTIONS
          parameter_error   = 1
          address_not_exist = 2
          internal_error    = 3
          OTHERS            = 4.

      IF sy-subrc <> 0.
        <gv_returncode> = sy-subrc.
        PERFORM protocol_update.
        RETURN.
      ENDIF.

      READ TABLE lt_adsmtp INTO ls_adsmtp
           WITH KEY flgdefault = gc_true.

      IF sy-subrc IS INITIAL.
        ls_address-sender_email_addr = ls_adsmtp-smtp_addr.
      ENDIF.

    WHEN gc_device-fax.

*--- Get the e-mail address of the recipient
      ls_address-recip_fax_country = gs_nast-tland.
      ls_address-recip_fax_number = gs_nast-telfx(30).

*--- Get the fax address of the sender
*     Try to get the fax address of the sales org.
*     Otherwise takes the user's
      CALL FUNCTION 'ADDR_COMM_GET'
        EXPORTING
          address_number    = gs_interface-head_detail-tvko-adrnr
          language          = gv_language
          table_type        = 'ADFAX'
        TABLES
          comm_table        = lt_adfax
        EXCEPTIONS
          parameter_error   = 1
          address_not_exist = 2
          internal_error    = 3
          OTHERS            = 4.

      IF sy-subrc <> 0.
        <gv_returncode> = sy-subrc.
        PERFORM protocol_update.
        RETURN.
      ENDIF.

      READ TABLE lt_adfax INTO ls_adfax
           WITH KEY flgdefault = gc_true.

      IF sy-subrc IS INITIAL.
        ls_address-sender_fax_country = ls_adfax-country.
        ls_address-sender_fax_number  = ls_adfax-fax_number.
      ENDIF.

  ENDCASE.

*   o/p control badi call

  IF ls_enh_flag EQ abap_true.

    IF lo_badi_sls_email IS BOUND.

      TRY.

*   get Badi handle for obj mapper
*   filters  any filters implement here
          GET BADI lo_badi_mapper
            FILTERS
              sd_process_filter = if_sd_email_process_constant=>invoice_print01.

*  Catch not implemented exception or multiple implementation
        CATCH cx_badi_not_implemented.
          CLEAR lo_badi_mapper.
      ENDTRY.

      IF lo_badi_mapper IS BOUND.

        IF lo_badi_mapper->imps IS NOT INITIAL.

          CALL BADI lo_badi_mapper->set_sd_inv_to_generic
            EXPORTING
              is_inv_details = gs_interface.

*    Call BAdI for modify email details
          CALL BADI lo_badi_sls_email->set_mapper
            EXPORTING
              io_mapper = lo_badi_mapper->imp.

          IF sy-subrc <> 0.
            RETURN.
          ENDIF.
        ENDIF.
      ENDIF.
      ls_email_sendr-email_addr = ls_address-sender_email_addr.
*  move default rcp address to badi impl
      ls_email_rcp-email_addr = ls_address-recip_email_addr.
      INCLUDE send_data_remove_default IF FOUND.
      CALL BADI lo_badi_sls_email->modify_email
        EXPORTING
          iv_language      = gv_language
          is_email_rcp     = ls_email_rcp
          is_email_sendr   = ls_email_sendr
        CHANGING
          io_cl_bcs        = lo_cl_bcs
        EXCEPTIONS
          exc_send_req_bcs = 1
          exc_address_bcs  = 2
          OTHERS           = 3.
      IF sy-subrc <> 0.
        MESSAGE e000 WITH <gs_vbdkr>-vbeln
                   INTO gv_dummy.
        PERFORM protocol_update.
        <gv_returncode> = 99.
        RETURN.
      ENDIF.
      INCLUDE send_data_add_email_badi IF FOUND.
*   add Exceptions for process document method and check response.
      ls_file_attribs-pdf_file = us_pdf_file.
      CALL BADI lo_badi_sls_email->process_document
        EXPORTING
          iv_language      = gv_language
          iv_text          = lt_mail_text
          iv_subject       = lv_mail_subject
          is_file_attribs  = ls_file_attribs
        CHANGING
          io_cl_bcs        = lo_cl_bcs
        EXCEPTIONS
          exc_send_req_bcs = 1
          exc_document_bcs = 2
          OTHERS           = 3.

      IF sy-subrc <> 0.
        MESSAGE e000 WITH <gs_vbdkr>-vbeln
                   INTO gv_dummy.
        PERFORM protocol_update.
        <gv_returncode> = 99.
        RETURN.

      ENDIF.

*   Send Document
      CALL BADI lo_badi_sls_email->send_document
        EXPORTING
          io_cl_bcs        = lo_cl_bcs
        CHANGING
          ev_send_to_all   = lv_send_to_all
        EXCEPTIONS
          exc_send_req_bcs = 1
          OTHERS           = 2.

      IF sy-subrc <> 0.
        MESSAGE e000 WITH <gs_vbdkr>-vbeln
                      INTO gv_dummy.
        PERFORM protocol_update.
        <gv_returncode> = 99.
        RETURN.
      ENDIF.

      IF lv_send_to_all = gc_true.
*     Write success message into log
        MESSAGE i022(so)
                INTO gv_dummy.
        PERFORM protocol_update.
      ELSE.
*     Write fail message into log
        MESSAGE i023(so)
                WITH <gs_vbdkr>-vbeln
                INTO gv_dummy.
        PERFORM protocol_update.
      ENDIF.
    ENDIF.

*  end of o/p contrl badi call. continue old way in else.
  ELSE.

    CALL FUNCTION 'SD_PDF_SEND_DATA'
      EXPORTING
        iv_device        = uv_device
        iv_email_subject = lv_mail_subject
        it_email_text    = lt_mail_text
        is_main_data     = us_pdf_file
        iv_language      = gv_language
        is_address       = ls_address
        iv_nast          = nast
      IMPORTING
        ev_send_to_all   = lv_send_to_all
      EXCEPTIONS
        exc_document     = 1
        exc_send_request = 2
        exc_address      = 3
        OTHERS           = 4.

    IF sy-subrc <> 0.
      MESSAGE e000 WITH <gs_vbdkr>-vbeln
                   INTO gv_dummy.
      PERFORM protocol_update.
      <gv_returncode> = 99.
      RETURN.
    ENDIF.

    IF lv_send_to_all = gc_true.
      MESSAGE i022(so) INTO gv_dummy.
      PERFORM protocol_update.
    ELSE.
      MESSAGE i023(so) WITH <gs_vbdkr>-vbeln
              INTO gv_dummy.
      PERFORM protocol_update.
    ENDIF.
  ENDIF.
ENDFORM.                    " send_data
*&---------------------------------------------------------------------*
*&      Form  get_output_params
*&---------------------------------------------------------------------*
FORM get_output_params
   CHANGING
        cs_outputparams  TYPE sfpoutputparams
        cs_docparams     TYPE sfpdocparams
        cv_device        TYPE output_device.

  DATA: lv_comm_type   TYPE ad_comm,
        ls_comm_values TYPE szadr_comm_values.

  CASE gs_nast-nacha.
    WHEN gc_nacha-external_send.

      IF NOT gs_nast-tcode IS INITIAL.
        CALL FUNCTION 'ADDR_GET_NEXT_COMM_TYPE'
          EXPORTING
            strategy           = gs_nast-tcode
            address_type       = <gs_vbdkr>-address_type
            address_number     = <gs_vbdkr>-adrnr
            person_number      = <gs_vbdkr>-adrnp
          IMPORTING
            comm_type          = lv_comm_type
            comm_values        = ls_comm_values
          EXCEPTIONS
            address_not_exist  = 1
            person_not_exist   = 2
            no_comm_type_found = 3
            internal_error     = 4
            parameter_error    = 5
            OTHERS             = 6.

        IF sy-subrc <> 0.
          <gv_returncode> = sy-subrc.
          PERFORM protocol_update.
          RETURN.
        ENDIF.

        CASE lv_comm_type.
          WHEN 'INT'.  "e-mail
            cs_outputparams-getpdf = gc_true.
            cv_device              = gc_device-email.
            gs_nast-email_addr     = ls_comm_values-adsmtp-smtp_addr.
          WHEN 'FAX'.
            cs_outputparams-getpdf = gc_true.
            cv_device              = gc_device-fax.
            gs_nast-telfx          = ls_comm_values-adfax-fax_number.
            gs_nast-tland          = ls_comm_values-adfax-country.
          WHEN 'LET'.   "Printer
            cv_device              = gc_device-printer.
        ENDCASE.
      ELSE.
        cv_device              = gc_device-printer.
      ENDIF.

    WHEN gc_nacha-printer.
      cv_device              = gc_device-printer.
    WHEN gc_nacha-fax.
      cs_outputparams-getpdf = gc_true.
      cv_device              = gc_device-fax.
  ENDCASE.

* The original document should be printed only once
  IF NOT gv_screen_display IS INITIAL
  AND gs_interface-head_detail-repeat EQ gc_false.
    cs_outputparams-noprint   = gc_true.
    cs_outputparams-nopributt = gc_true.
    cs_outputparams-noarchive = gc_true.
  ENDIF.
  IF gv_screen_display     = 'X'.
    cs_outputparams-getpdf  = gc_false.
    cs_outputparams-preview = gc_true.
  ELSEIF gv_screen_display = 'W'. "Web dynpro
    cs_outputparams-getpdf  = gc_true.
    cv_device               = gc_device-web_dynpro.
  ENDIF.
  cs_outputparams-nodialog  = gc_true.
  cs_outputparams-dest      = gs_nast-ldest.
  cs_outputparams-copies    = gs_nast-anzal.
  cs_outputparams-dataset   = gs_nast-dsnam.
  cs_outputparams-suffix1   = gs_nast-dsuf1.
  cs_outputparams-suffix2   = gs_nast-dsuf2.
  cs_outputparams-cover     = gs_nast-tdocover.
  cs_outputparams-covtitle  = gs_nast-tdcovtitle.
  cs_outputparams-authority = gs_nast-tdautority.
  cs_outputparams-receiver  = gs_nast-tdreceiver.
  cs_outputparams-division  = gs_nast-tddivision.
  cs_outputparams-arcmode   = gs_nast-tdarmod.
  cs_outputparams-reqimm    = gs_nast-dimme.
  cs_outputparams-reqdel    = gs_nast-delet.
  cs_outputparams-senddate  = gs_nast-vsdat.
  cs_outputparams-sendtime  = gs_nast-vsura.

*--- Set language and default language
  cs_docparams-langu     = gv_language.
  cs_docparams-replangu1 = <gs_vbdkr>-spras_vko.
  cs_docparams-replangu2 = gc_english.
  cs_docparams-country   = <gs_vbdkr>-land1.

* Archiving
  APPEND toa_dara TO cs_docparams-daratab.

ENDFORM.                    " get_output_params
*&---------------------------------------------------------------------*
*&      Form  get_mail_body
*&---------------------------------------------------------------------*
FORM get_mail_body
  CHANGING
        ct_mail_text    TYPE bcsy_text.

  DATA: ls_options TYPE itcpo,
        lt_lines   TYPE TABLE OF tline,
        lt_otfdata TYPE TABLE OF itcoo.

  CHECK NOT tnapr-fonam IS INITIAL.

  ls_options-tdgetotf = gc_true.
  ls_options-tddest   = gs_nast-ldest.
  ls_options-tdprogram = tnapr-pgnam.

  vbdkr = <gs_vbdkr>.
  komk  = gs_komk.
  tvko  = gs_interface-head_detail-tvko.

  CALL FUNCTION 'OPEN_FORM'
    EXPORTING
      dialog                      = ' '
      form                        = tnapr-fonam
      language                    = gv_language
      options                     = ls_options
    EXCEPTIONS
      canceled                    = 1
      device                      = 2
      form                        = 3
      options                     = 4
      unclosed                    = 5
      mail_options                = 6
      archive_error               = 7
      invalid_fax_number          = 8
      more_params_needed_in_batch = 9
      spool_error                 = 10
      codepage                    = 11
      OTHERS                      = 12.

  IF sy-subrc <> 0.
    <gv_returncode> = sy-subrc.
    PERFORM protocol_update.
    RETURN.
  ENDIF.

  CALL FUNCTION 'WRITE_FORM'
    EXPORTING
      element                  = 'MAIL_BODY'
    EXCEPTIONS
      element                  = 1
      function                 = 2
      type                     = 3
      unopened                 = 4
      unstarted                = 5
      window                   = 6
      bad_pageformat_for_print = 7
      spool_error              = 8
      codepage                 = 9
      OTHERS                   = 10.

  IF sy-subrc <> 0.
    <gv_returncode> = sy-subrc.
    PERFORM protocol_update.
    RETURN.
  ENDIF.

  CALL FUNCTION 'CLOSE_FORM'
    TABLES
      otfdata                  = lt_otfdata
    EXCEPTIONS
      unopened                 = 1
      bad_pageformat_for_print = 2
      send_error               = 3
      spool_error              = 4
      codepage                 = 5
      OTHERS                   = 6.

  IF sy-subrc <> 0.
    <gv_returncode> = sy-subrc.
    PERFORM protocol_update.
    RETURN.
  ENDIF.

  CALL FUNCTION 'CONVERT_OTF'
    TABLES
      otf                   = lt_otfdata
      lines                 = lt_lines
    EXCEPTIONS
      err_max_linewidth     = 1
      err_format            = 2
      err_conv_not_possible = 3
      err_bad_otf           = 4
      OTHERS                = 5.

  IF sy-subrc <> 0.
    <gv_returncode> = sy-subrc.
    PERFORM protocol_update.
    RETURN.
  ENDIF.

  CALL FUNCTION 'CONVERT_ITF_TO_STREAM_TEXT'
    EXPORTING
      language    = gv_language
    TABLES
      itf_text    = lt_lines
      text_stream = ct_mail_text.

ENDFORM.                    " get_mail_body
*&---------------------------------------------------------------------*
*&      Form  get_item_downpayment
*&---------------------------------------------------------------------*
FORM get_item_downpayment
  USING us_vbdpr        TYPE vbdpr.

  DATA: lv_xfilkd       TYPE xfilkd_vf,
        ls_sdaccdpc_doc TYPE vbeln_posnr_s.

  CHECK <gs_vbdkr>-fktyp NE 'P'.
  CHECK us_vbdpr-fareg CA '45'.

* Can there be a head office?
  CASE <gs_vbdkr>-xfilkd.
*   Ordering party
    WHEN 'A'.
      IF <gs_vbdkr>-knkli IS INITIAL OR
         <gs_vbdkr>-knkli EQ <gs_vbdkr>-kunag.
        lv_xfilkd = <gs_vbdkr>-xfilkd.
      ENDIF.
*   Payer
    WHEN 'B'.
      lv_xfilkd = <gs_vbdkr>-xfilkd.
  ENDCASE.

* Remember the headno and itemno
  IF NOT us_vbdpr-vbelv IS INITIAL.
    ls_sdaccdpc_doc-vbeln = us_vbdpr-vbelv.
    ls_sdaccdpc_doc-posnr = us_vbdpr-posnv.
  ELSE.
    ls_sdaccdpc_doc-vbeln = us_vbdpr-vbeln_vauf.
    ls_sdaccdpc_doc-posnr = us_vbdpr-posnr_vauf.
  ENDIF.
  APPEND ls_sdaccdpc_doc TO gt_sdaccdpc_doc.


  CALL FUNCTION 'SD_DOWNPAYMENT_READ'
    EXPORTING
      i_waerk           = <gs_vbdkr>-waerk
      i_bukrs           = <gs_vbdkr>-bukrs
      i_kunnr           = <gs_vbdkr>-kunrg
      i_vbel2           = ls_sdaccdpc_doc-vbeln
      i_vbeln           = <gs_vbdkr>-vbeln
      i_sfakn           = <gs_vbdkr>-sfakn
      i_xfilkd          = lv_xfilkd
      i_gesanz          = gc_true
    TABLES
      t_sdaccdpc        = gt_sdaccdpc
    CHANGING
      c_downpay_refresh = gv_downpay_refresh
    EXCEPTIONS
      no_downpayments   = 1
      in_downpayments   = 2
      OTHERS            = 3.

ENDFORM.                    " get_item_downpayment
*&---------------------------------------------------------------------*
*&      Form  get_head_downpayment
*&---------------------------------------------------------------------*
FORM get_head_downpayment .

  DATA: ls_sdaccdpc TYPE sdaccdpc.

  SORT gt_sdaccdpc_doc BY vbeln posnr.
  DELETE ADJACENT DUPLICATES FROM gt_sdaccdpc_doc.

  LOOP AT gt_sdaccdpc INTO ls_sdaccdpc.
    READ TABLE gt_sdaccdpc_doc WITH KEY vbeln = ls_sdaccdpc-vgbel
                                        posnr = ls_sdaccdpc-vgpos
                                        BINARY SEARCH
                                        TRANSPORTING NO FIELDS.
    IF NOT sy-subrc IS INITIAL.
      DELETE gt_sdaccdpc.
    ENDIF.

  ENDLOOP.

  IF NOT <gs_vbdkr>-dpval IS INITIAL.
    <gs_vbdkr>-dpend = gs_interface-head_detail-gross_value.
    SUBTRACT <gs_vbdkr>-dpval FROM <gs_vbdkr>-dpend.
    <gs_vbdkr>-dpmws_end = <gs_vbdkr>-mwsbk - <gs_vbdkr>-dpmws.
  ENDIF.

  gs_interface-head_detail-down_payments = gt_sdaccdpc.

  IF NOT gs_interface-head_detail-down_payments IS INITIAL.
    gs_interface-head_detail-ex_down_payments = gc_true.
  ENDIF.

ENDFORM.                    " get_head_downpayment
*&---------------------------------------------------------------------*
*&      Form  initialize_data
*&---------------------------------------------------------------------*
FORM initialize_data .

  CLEAR: gs_interface,
         gv_screen_display,
         gv_price_print_mode,
         gt_komv,
         gs_komk,
         gt_vbtyp_fix_values,
         gv_language,
         gv_dummy,
         gt_sdaccdpc_doc,
         gt_sdaccdpc,
         gs_nast,
         gv_downpay_refresh,
         <gv_returncode>.

* BAdI
  IF bd_sd_bil IS BOUND.
    CALL BADI bd_sd_bil->initialize_data.
  ENDIF.
ENDFORM.                    " initialize_data
*&---------------------------------------------------------------------*
*&      Form  get_head_paymentcards
*&---------------------------------------------------------------------*
FORM get_head_paymentcards.

  DATA: lt_fplt          TYPE TABLE OF fpltvb,
        ls_fplt          TYPE fpltvb,
        ls_payment_cards TYPE bil_s_prt_payment_cards.

  STATICS:
        ss_tvcint        TYPE tvcint.

  CHECK NOT <gs_vbdkr>-rplnr IS INITIAL.
* Read from the Database
  CALL FUNCTION 'BILLING_SCHEDULE_READ'
    EXPORTING
      fplnr         = <gs_vbdkr>-rplnr
    TABLES
      zfplt         = lt_fplt
    EXCEPTIONS
      error_message = 0
      OTHERS        = 0.

* Loop at Cards
  LOOP AT lt_fplt INTO ls_fplt.
    ls_payment_cards = ls_fplt.
*   Get text
    IF ls_fplt-ccins NE ss_tvcint-ccins.
      SELECT SINGLE * FROM tvcint INTO ss_tvcint
             WHERE spras = gv_language
             AND   ccins = ls_fplt-ccins.
      IF sy-subrc =  0.
        ls_payment_cards-description = ss_tvcint-vtext.
      ELSE.
        ls_payment_cards-description = ls_fplt-ccins.
      ENDIF.
    ELSE.
      ls_payment_cards-description = ss_tvcint-vtext.
    ENDIF.
    APPEND ls_payment_cards TO gs_interface-head_detail-payment_cards.

    ADD ls_fplt-fakwr TO <gs_vbdkr>-ccval.
  ENDLOOP.

  IF NOT gs_interface-head_detail-payment_cards IS INITIAL.
    gs_interface-head_detail-ex_payment_cards = gc_true.
  ENDIF.

ENDFORM.                    " get_paymentcards
*&---------------------------------------------------------------------*
*&      Form  GET_PAYMENT_SPLIT
*&---------------------------------------------------------------------*
FORM get_payment_split .

  DATA: h_skfbt LIKE acccr-skfbt.
  DATA: h_fkdat LIKE <gs_vbdkr>-fkdat.
  DATA: h_fkwrt LIKE acccr-wrbtr.
  DATA : BEGIN OF payment_split OCCURS 3.
      INCLUDE STRUCTURE vtopis.
  DATA : END OF payment_split.
  DATA ls_payment_split TYPE bil_s_prt_payment_split.

  CHECK <gs_vbdkr>-zterm NE space.

  h_skfbt = <gs_vbdkr>-skfbk.
  h_fkwrt = gs_komk-fkwrt.
  h_fkdat = <gs_vbdkr>-fkdat.
  IF <gs_vbdkr>-valdt NE 0.
    h_fkdat = <gs_vbdkr>-valdt.
  ENDIF.
  IF <gs_vbdkr>-valtg NE 0.
    h_fkdat = <gs_vbdkr>-fkdat + <gs_vbdkr>-valtg.
  ENDIF.
  CALL FUNCTION 'SD_PRINT_TERMS_OF_PAYMENT_SPLI'
    EXPORTING
      i_country                     = <gs_vbdkr>-land1
      bldat                         = h_fkdat
      budat                         = h_fkdat
      cpudt                         = h_fkdat
      language                      = gv_language
      terms_of_payment              = <gs_vbdkr>-zterm
      wert                          = h_fkwrt  "Warenwert + Tax
      waerk                         = <gs_vbdkr>-waerk
      fkdat                         = <gs_vbdkr>-fkdat
      skfbt                         = h_skfbt
      i_company_code                = <gs_vbdkr>-bukrs
    TABLES
      top_text_split                = payment_split
    EXCEPTIONS
      terms_of_payment_not_in_t052  = 01
      terms_of_payment_not_in_t052s = 02.

  LOOP AT payment_split.

    MOVE payment_split-line  TO ls_payment_split-line.
    APPEND ls_payment_split TO gs_interface-head_detail-payment_split.

  ENDLOOP.

  IF NOT gs_interface-head_detail-payment_split IS INITIAL.
    gs_interface-head_detail-ex_payment_split = gc_true.
  ENDIF.

ENDFORM.                    "PAYMENT_SPLIT